afuna: Cat under a blanket. Text: "Cats are just little people with Fur and Fangs" (Default)
afuna ([personal profile] afuna) wrote in [site community profile] changelog2009-08-03 03:29 pm

[dw-free] Remove TxtLJ backend

[commit: http://hg.dwscoalition.org/dw-free/rev/fd9f9a2a1ed4]

http://bugs.dwscoalition.org/show_bug.cgi?id=199

Remove modules, tests, references to

Patch by [staff profile] denise.

Files modified:
  • bin/dev/inject_sms.pl
  • bin/moveucluster.pl
  • bin/upgrading/en.dat
  • bin/upgrading/proplists.dat
  • bin/worker/process-sms
  • cgi-bin/LJ/Entry.pm
  • cgi-bin/LJ/Event.pm
  • cgi-bin/LJ/Event/CommunityInvite.pm
  • cgi-bin/LJ/Event/CommunityJoinRequest.pm
  • cgi-bin/LJ/Event/InvitedFriendJoins.pm
  • cgi-bin/LJ/Event/JournalNewComment.pm
  • cgi-bin/LJ/Event/JournalNewEntry.pm
  • cgi-bin/LJ/Event/NewUserpic.pm
  • cgi-bin/LJ/Event/OfficialPost.pm
  • cgi-bin/LJ/Event/UserMessageRecvd.pm
  • cgi-bin/LJ/Event/UserNewEntry.pm
  • cgi-bin/LJ/NotificationItem.pm
  • cgi-bin/LJ/NotificationMethod.pm
  • cgi-bin/LJ/NotificationMethod/SMS.pm
  • cgi-bin/LJ/SMS.pm
  • cgi-bin/LJ/SMS/Message.pm
  • cgi-bin/LJ/SMS/MessageAck.pm
  • cgi-bin/LJ/SMS/MessageHandler.pm
  • cgi-bin/LJ/SMS/MessageHandler/Add.pm
  • cgi-bin/LJ/SMS/MessageHandler/Echo.pm
  • cgi-bin/LJ/SMS/MessageHandler/Friends.pm
  • cgi-bin/LJ/SMS/MessageHandler/Help.pm
  • cgi-bin/LJ/SMS/MessageHandler/ILike.pm
  • cgi-bin/LJ/SMS/MessageHandler/Menu.pm
  • cgi-bin/LJ/SMS/MessageHandler/Post.pm
  • cgi-bin/LJ/SMS/MessageHandler/PostComm.pm
  • cgi-bin/LJ/SMS/MessageHandler/Read.pm
  • cgi-bin/LJ/SMS/MessageHandler/Stop.pm
  • cgi-bin/LJ/Setting/Display/SMSHistory.pm
  • cgi-bin/LJ/Test.pm
  • cgi-bin/LJ/User.pm
  • cgi-bin/ljdb.pl
  • cgi-bin/ljdefaults.pl
  • cgi-bin/ljlib.pl
  • doc/raw/build/ljconfig/ljconfig2db.pl
  • doc/raw/lj.book/install/ljconfig.disabled.xml
  • doc/raw/lj.book/install/ljconfig.helpurls.xml
  • doc/raw/lj.book/install/workers_setup.xml
  • t/esn-findsubscription.t
  • t/esn-journalnewentry.t
  • t/notificationmethod-sms.t
  • t/sms-handler-postcomm.t
  • t/sms-handler-read.t
--------------------------------------------------------------------------------
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 bin/dev/inject_sms.pl
--- a/bin/dev/inject_sms.pl	Mon Aug 03 15:16:25 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use lib "$ENV{LJHOME}/cgi-bin";
-
-use LJ::SMS::Message;
-
-require "ljlib.pl";
-
-my ($user, $msg) = @ARGV[0,1];
-
-my $u = LJ::load_user($user);
-
-my $ljmsg = LJ::SMS::Message->new
-    ( owner     => $u,
-      from      => $u, 
-      type      => 'incoming',
-      body_text => $msg,
-      );
-
-warn LJ::D($ljmsg);
-
-warn "Enqueue\n";
-LJ::SMS->enqueue_as_incoming($ljmsg);
-
-
-
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 bin/moveucluster.pl
--- a/bin/moveucluster.pl	Mon Aug 03 15:16:25 2009 +0000
+++ b/bin/moveucluster.pl	Mon Aug 03 15:24:55 2009 +0000
@@ -517,7 +517,6 @@ sub moveUser {
             $dbh->do("DELETE FROM syndicated WHERE userid = ?", undef, $u->id);
             $dbh->do("DELETE FROM supportnotify WHERE userid = ?", undef, $u->id);
             $dbh->do("DELETE FROM reluser WHERE userid = ?", undef, $u->id);
-            $dbh->do("DELETE FROM smsusermap WHERE userid = ?", undef, $u->id);
             $dbh->do("DELETE FROM friends WHERE userid = ?", undef, $u->id);
             $dbh->do("DELETE FROM phonepostlogin WHERE userid = ?", undef, $u->id);
 
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 bin/upgrading/en.dat
--- a/bin/upgrading/en.dat	Mon Aug 03 15:16:25 2009 +0000
+++ b/bin/upgrading/en.dat	Mon Aug 03 15:24:55 2009 +0000
@@ -1700,8 +1700,6 @@ esn.officialpost.html=There is <a href="
 esn.officialpost.html=There is <a href="[[url]]">a new announcement</a> in [[username]]
 
 esn.officialpost.nosubject=[[sitenameshort]] Announcement: New [[username]] announcement
-
-esn.officialpost.sms=There is a new [[sitename]] announcement in [[username]] Reply with READ [[username]] to read it. Standard rates apply.
 
 esn.officialpost.string=There is a new announcement in [[username]] at [[url]]
 
@@ -1809,8 +1807,6 @@ esn.supofficialpost.html=There is <a hre
 
 esn.supofficialpost.nosubject=[[sitenameshort]] Announcement: New [[username]] announcement
 
-esn.supofficialpost.sms=There is a new [[sitename]] announcement in [[username]] Reply with READ [[username]] to read it. Standard rates apply.
-
 esn.supofficialpost.string=There is a new announcement in [[username]] at [[url]]
 
 esn.supofficialpost.subject=[[sitenameshort]] Announcement: [[subject]]
@@ -2224,8 +2220,6 @@ notification_method.im.title=IM
 notification_method.im.title=IM
 
 notification_method.inbox.title=Inbox
-
-notification_method.sms.title=TxtLJ
 
 number.million=[[number]] million
 
@@ -2637,10 +2631,6 @@ setting.display.secretquestion.actionlin
 
 setting.display.secretquestion.label=Secret Question
 
-setting.display.smshistory.label=Text Messages
-
-setting.display.smshistory.option=View [[sms_title]] history
-
 setting.display.username.actionlink=Rename
 
 setting.display.username.label=Username
@@ -2826,28 +2816,6 @@ setting.sitescheme.error.invalid=Invalid
 setting.sitescheme.error.invalid=Invalid site scheme.
 
 setting.sitescheme.label=Site Scheme
-
-setting.sms.error.carrier.invalid=Invalid carrier selection.
-
-setting.sms.error.carrier.none=You must select a carrier in order to register.
-
-setting.sms.error.phone.failed=The number [[number]] could not be registered.
-
-setting.sms.error.phone.inuse=That number is currently in use by another user.
-
-setting.sms.error.phone.invalid=You must enter a valid U.S. 10-digit phone number.
-
-setting.sms.error.phone.ratelimit=You have tried to register a number too many times in one day. Please wait and try again.
-
-setting.sms.option=Receive updates and interact with LiveJournal by text message.
-
-setting.sms.option.advanced=advanced setup options
-
-setting.sms.option.carrier=Mobile Carrier:
-
-setting.sms.option.carrier.selectone=(Select Carrier)
-
-setting.sms.option.phone=Mobile Number:
 
 setting.stylealwaysmine.label=Other Journals
 
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 bin/upgrading/proplists.dat
--- a/bin/upgrading/proplists.dat	Mon Aug 03 15:16:25 2009 +0000
+++ b/bin/upgrading/proplists.dat	Mon Aug 03 15:24:55 2009 +0000
@@ -974,62 +974,6 @@ userproplist.skype:
   multihomed: 1
   prettyname: Skype ID
 
-userproplist.sms_carrier:
-  cldversion: 4
-  datatype: char
-  des: SMS carrier
-  indexed: 0
-  multihomed: 0
-  prettyname: SMS carrier
-
-userproplist.sms_enabled:
-  cldversion: 4
-  datatype: char
-  des: If the user has activated and confirmed their SMS settings
-  indexed: 0
-  multihomed: 0
-  prettyname: SMS enabled status
-
-userproplist.sms_friend_group:
-  cldversion: 4
-  datatype: char
-  des: Default SMS friends page display
-  indexed: 0
-  multihomed: 0
-  prettyname: SMS friends page group
-
-userproplist.sms_perday_notif_limit:
-  cldversion: 4
-  datatype: num
-  des: Notification limit per day by SMS
-  indexed: 0
-  multihomed: 0
-  prettyname: SMS notification limit per day
-
-userproplist.sms_perpost_notif_limit:
-  cldversion: 4
-  datatype: num
-  des: Notification limit per post per day by SMS
-  indexed: 0
-  multihomed: 0
-  prettyname: SMS notification limit per post per day
-
-userproplist.sms_post_notify:
-  cldversion: 4
-  datatype: char
-  des: Does the user want notification of replies to posts made via SMS
-  indexed: 0
-  multihomed: 0
-  prettyname: Auto-subscribe to comments posted via SMS
-
-userproplist.sms_yes_means:
-  cldversion: 4
-  datatype: char
-  des: What a "yes" SMS message from the user means
-  indexed: 0
-  multihomed: 0
-  prettyname: What "yes" SMS message means
-
 userproplist.state:
   cldversion: 4
   datatype: char
@@ -1310,13 +1254,6 @@ logproplist.revtime:
   sortorder: 99
   ownership: system
 
-logproplist.sms_msgid:
-  datatype: num
-  des: SMS Message ID of the message which led to this journal entry
-  prettyname: SMS Message ID
-  sortorder: 99
-  ownership: user
-
 logproplist.statusvis:
   datatype: char
   des: 'V' or undef for visible, 'S' for suspended
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 bin/worker/process-sms
--- a/bin/worker/process-sms	Mon Aug 03 15:16:25 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-#!/usr/bin/perl
-use strict;
-use lib "$ENV{LJHOME}/cgi-bin";
-require 'ljlib.pl';
-require 'ljprotocol.pl';
-require 'ljlang.pl';
-use LJ::Worker::TheSchwartz;
-use LJ::SMS;
-
-foreach my $classname (LJ::SMS->schwartz_capabilities) {
-    schwartz_decl($classname);
-}
-
-schwartz_work();
-
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/Entry.pm
--- a/cgi-bin/LJ/Entry.pm	Mon Aug 03 15:16:25 2009 +0000
+++ b/cgi-bin/LJ/Entry.pm	Mon Aug 03 15:24:55 2009 +0000
@@ -589,123 +589,6 @@ sub as_atom
     $xml =~ s!^<\?xml.+?>\s*!!s;
     return $xml;
 }
-
-sub as_sms {
-    my $self = shift;
-    my %opts = @_;
-    my $for_u  = delete $opts{for_u};
-    croak "invalid for_u arg to as_sms"
-        unless LJ::isu($for_u);
-    my $maxlen = delete $opts{maxlen} || 160;
-    croak "invalid parameters: " . join(",", keys %opts)
-        if %opts;
-
-    my $ret = "";
-
-    # is this a community or journal post?
-    if ($self->journalid != $self->posterid) {
-        $ret .= "(" . $self->journal->display_name . ") ";
-    }
-
-    # add in poster's username
-    $ret .= $self->poster->display_name . ":\n";
-
-    # now for the first $maxlen characters of the subject,
-    # falling back to the first $maxlen characters of the post
-    foreach my $meth (qw(subject_text event_text)) {
-        my $text = LJ::strip_html($self->$meth) or next;
-        $ret .= $for_u->max_sms_substr
-            ($text, maxlen => $maxlen, suffix => "...");
-        last;
-    }
-
-    return $ret;
-}
-
-sub as_paged_sms {
-    my $self = shift;
-    my %opts = @_;
-    my $for_u = delete $opts{for_u};
-    my $page  = delete $opts{page} || 1;
-    $page = 1 if $page > 99;
-    croak "invalid parameters: " . join(",", keys %opts)
-        if %opts;
-
-    my $full_text;
-    {
-        my $subj_text = $self->subject_text;
-        my $body_text = $self->event_text;
-
-        if ($subj_text) {
-            $full_text = "[$subj_text] " . $body_text;
-        } else {
-            $full_text = "$body_text";
-        }
-
-        # full text should be devoid of html tags, with the
-        # exception of lj (user|comm) which just become a
-        # username
-        $full_text = LJ::strip_html($full_text);
-    }
-
-    my $header = "";
-
-    # is this a community or journal post?
-    if ($self->journalid != $self->posterid) {
-        $header .= "(" . $self->journal->display_name . ") ";
-    }
-
-    # add in poster's username
-    $header .= $self->poster->display_name;
-
-    my %pageret = ();
-    my $maxpage = 1;
-
-    { # lexical scope for 'use bytes' ...
-        use bytes;
-
-      PAGE:
-        foreach my $currpage (1..99) {
-
-            # Note:  This is acknowledged to be ghetto.  We set '99' for the max page
-            #        number while we still build the list so that at the end once there
-            #        is a real max number we can replace it.  So the character capacity
-            #        of a single '9' is lost when the total number of pages is single-digit
-            my $page_head   = "${header} ($currpage of 99)\n";
-            my $page_suffix = "...";
-
-            # if the length of this bit of text is greater than our page window,
-            # then append whatever fits and move onto the next page
-            # - note that max_sms_substr works on utf-8 character boundaries, so
-            #   doing a subsequent length($to_append) is utf-8-safe
-            my $new_page   = $for_u->max_sms_substr($page_head . $full_text, suffix => $page_suffix);
-            my $offset     = length($new_page) - (length($page_head) + length($page_suffix));
-            $full_text     = substr($full_text, $offset);
-
-            # remember this created page
-            $pageret{$currpage} = $new_page;
-
-            # stop creating new pages once $full_text is drained
-            unless (length $full_text) {
-
-                # strip "..." off of this page since it's the last
-                $pageret{$currpage} =~ s/$page_suffix$//;
-
-                $maxpage = $currpage;
-                last PAGE;
-            }
-        }
-    }
-
-    # did the user request an out-of-bounds page?
-    $page = 1 unless exists $pageret{$page};
-
-    # we reserved '99' for length checking above, now replace that with the real max number of pages
-    $pageret{$page} =~ s/\($page of 99\)/\($page of $maxpage\)/;
-
-    return $pageret{$page};
-}
-
 
 # raw utf8 text, with no HTML cleaning
 sub subject_raw {
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/Event.pm
--- a/cgi-bin/LJ/Event.pm	Mon Aug 03 15:16:25 2009 +0000
+++ b/cgi-bin/LJ/Event.pm	Mon Aug 03 15:24:55 2009 +0000
@@ -189,13 +189,6 @@ sub subscription_as_html {
     return $class . " arg1: $arg1 arg2: $arg2 user: $user";
 }
 
-sub as_sms {
-    my $self = shift;
-    my $str = $self->as_string;
-    return $str if length $str <= 160;
-    return substr($str, 0, 157) . "...";
-}
-
 # override in subclasses
 sub subscription_applicable {
     my ($class, $subscr) = @_;
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/Event/CommunityInvite.pm
--- a/cgi-bin/LJ/Event/CommunityInvite.pm	Mon Aug 03 15:16:25 2009 +0000
+++ b/cgi-bin/LJ/Event/CommunityInvite.pm	Mon Aug 03 15:24:55 2009 +0000
@@ -125,14 +125,6 @@ sub as_string {
                    $self->comm->display_username);
 }
 
-sub as_sms {
-    my $self = shift;
-
-    return sprintf("%s sent you an invitation to join the community %s. Visit the invitation page to accept",
-                   $self->inviter->display_username,
-                   $self->comm->display_username);
-}
-
 sub subscription_as_html {
     my ($class, $subscr) = @_;
     return BML::ml('event.comm_invite'); # "I receive an invitation to join a community";
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/Event/CommunityJoinRequest.pm
--- a/cgi-bin/LJ/Event/CommunityJoinRequest.pm	Mon Aug 03 15:16:25 2009 +0000
+++ b/cgi-bin/LJ/Event/CommunityJoinRequest.pm	Mon Aug 03 15:24:55 2009 +0000
@@ -133,14 +133,6 @@ sub as_email_html {
     return _as_email($self, $u, 1);
 }
 
-sub as_sms {
-    my $self = shift;
-
-    return sprintf("%s requests membership in %s. Visit community settings to approve.",
-                   $self->requestor->display_username,
-                   $self->comm->display_username);
-}
-
 sub subscription_as_html {
     my ($class, $subscr) = @_;
     return BML::ml('event.community_join_requst'); # Someone requests membership in a community I maintain';
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/Event/InvitedFriendJoins.pm
--- a/cgi-bin/LJ/Event/InvitedFriendJoins.pm	Mon Aug 03 15:16:25 2009 +0000
+++ b/cgi-bin/LJ/Event/InvitedFriendJoins.pm	Mon Aug 03 15:24:55 2009 +0000
@@ -109,11 +109,6 @@ sub as_string {
     return sprintf "A friend you invited has created the journal %s.", $self->friend->user;
 }
 
-sub as_sms {
-    my $self = shift;
-    return $self->as_string;
-}
-
 sub friend {
     my $self = shift;
     return LJ::load_userid($self->arg1);
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/Event/JournalNewComment.pm
--- a/cgi-bin/LJ/Event/JournalNewComment.pm	Mon Aug 03 15:16:25 2009 +0000
+++ b/cgi-bin/LJ/Event/JournalNewComment.pm	Mon Aug 03 15:24:55 2009 +0000
@@ -158,31 +158,6 @@ sub as_string {
     } else {
         return "$poster has posted a new comment in $journal at " . $comment->url;
     }
-}
-
-sub as_sms {
-    my ($self, $u) = @_;
-
-    my $user = $self->comment->poster ? $self->comment->poster->display_username : '(Anonymous user)';
-    my $edited = $self->comment->is_edited;
-
-    my $msg;
-
-    if ($self->comment->parent) {
-        if ($edited) {
-            $msg = LJ::u_equals($self->comment->parent->poster, $u) ? "$user edited a reply to your comment: " : "$user edited a reply to a comment: ";
-        } else {
-            $msg = LJ::u_equals($self->comment->parent->poster, $u) ? "$user replied to your comment: " : "$user replied to a comment: ";
-        }
-    } else {
-        if ($edited) {
-            $msg = LJ::u_equals($self->comment->entry->poster, $u) ? "$user edited a reply to your post: " : "$user edited a reply to a post: ";
-        } else {
-            $msg = LJ::u_equals($self->comment->entry->poster, $u) ? "$user replied to your post: " : "$user replied to a post: ";
-        }
-    }
-
-    return $msg . $self->comment->body_text;
 }
 
 sub _can_view_content {
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/Event/JournalNewEntry.pm
--- a/cgi-bin/LJ/Event/JournalNewEntry.pm	Mon Aug 03 15:16:25 2009 +0000
+++ b/cgi-bin/LJ/Event/JournalNewEntry.pm	Mon Aug 03 15:24:55 2009 +0000
@@ -96,14 +96,6 @@ sub as_string {
         if $entry->journal->is_person;
 
     return "$poster has posted a new entry$about in $journal at " . $entry->url;
-}
-
-sub as_sms {
-    my $self = shift;
-
-    my $incomm = $self->entry->journal->is_comm ? " in " . $self->entry->journal->user : '';
-    sprintf("%s has posted with a new entry$incomm. To view, send READ %s to read it. Standard rates apply.",
-            $self->entry->poster->user, $self->entry->journal->user);
 }
 
 sub as_html {
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/Event/NewUserpic.pm
--- a/cgi-bin/LJ/Event/NewUserpic.pm	Mon Aug 03 15:16:25 2009 +0000
+++ b/cgi-bin/LJ/Event/NewUserpic.pm	Mon Aug 03 15:24:55 2009 +0000
@@ -23,13 +23,6 @@ sub as_html {
     return "(Deleted userpic)" unless $up && $up->valid;
 
     return $self->event_journal->ljuser_display . " has uploaded a new <a href='" . $up->url . "'>userpic</a>.";
-}
-
-sub as_sms {
-    my $self = shift;
-
-    return $self->event_journal->display_username . " has uploaded a new userpic. You can view it at: " .
-        $self->userpic->url;
 }
 
 sub as_email_string {
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/Event/OfficialPost.pm
--- a/cgi-bin/LJ/Event/OfficialPost.pm	Mon Aug 03 15:16:25 2009 +0000
+++ b/cgi-bin/LJ/Event/OfficialPost.pm	Mon Aug 03 15:24:55 2009 +0000
@@ -130,14 +130,6 @@ sub as_string {
         });
 }
 
-sub as_sms {
-    my $self = shift;
-    my $entry = $self->entry or return "(Invalid entry)";
-    return sprintf("There is a new $LJ::SITENAMEABBREV announcement in %s. " .
-                   "Reply with READ %s to read it. Standard rates apply.",
-                   $entry->journal->display_username, $entry->journal->display_username);
-}
-
 sub subscription_as_html {
     my ($class, $subscr) = @_;
     return BML::ml('event.officialpost', { sitename => $LJ::SITENAME }); # $LJ::SITENAME makes a new announcement
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/Event/UserMessageRecvd.pm
--- a/cgi-bin/LJ/Event/UserMessageRecvd.pm	Mon Aug 03 15:16:25 2009 +0000
+++ b/cgi-bin/LJ/Event/UserMessageRecvd.pm	Mon Aug 03 15:24:55 2009 +0000
@@ -130,15 +130,6 @@ sub as_string {
     return $ret;
 }
 
-sub as_sms {
-    my $self = shift;
-
-    my $subject = $self->load_message->subject;
-    my $other_u = $self->load_message->other_u;
-    return sprintf("You've received a new message \"%s\" from %s",
-                   $subject, $other_u->user);
-}
-
 sub subscription_as_html {
     my ($class, $subscr) = @_;
     my $journal = $subscr->journal or croak "No user";
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/Event/UserNewEntry.pm
--- a/cgi-bin/LJ/Event/UserNewEntry.pm	Mon Aug 03 15:16:25 2009 +0000
+++ b/cgi-bin/LJ/Event/UserNewEntry.pm	Mon Aug 03 15:24:55 2009 +0000
@@ -99,19 +99,6 @@ sub as_string {
                    $self->poster->{name});
 }
 
-sub as_sms {
-    my $self = shift;
-
-    my $entry = $self->entry;
-    my $where = "in their journal";
-    unless ($entry->posterid == $entry->journalid) {
-        $where = "in '" . $entry->journal->{user} . "'";
-    }
-
-    return sprintf("User '%s' posted $where", $self->poster->{user});
-
-}
-
 sub as_html {
     my $self = shift;
 
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/NotificationItem.pm
--- a/cgi-bin/LJ/NotificationItem.pm	Mon Aug 03 15:16:25 2009 +0000
+++ b/cgi-bin/LJ/NotificationItem.pm	Mon Aug 03 15:24:55 2009 +0000
@@ -72,8 +72,6 @@ sub title {
         return eval { $self->event->as_html($self->u) } || $@;
     } elsif ($mode eq "im") {
         return eval { $self->event->as_im($self->u) } || $@;
-    } elsif ($mode eq "sms") {
-        return eval { $self->event->as_sms($self->u) } || $@;
     }
 }
 
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/NotificationMethod.pm
--- a/cgi-bin/LJ/NotificationMethod.pm	Mon Aug 03 15:16:25 2009 +0000
+++ b/cgi-bin/LJ/NotificationMethod.pm	Mon Aug 03 15:24:55 2009 +0000
@@ -4,13 +4,12 @@ use Carp qw/ croak /;
 
 use Class::Autouse qw (LJ::Typemap
                        LJ::NotificationMethod::Email
-                       LJ::NotificationMethod::SMS
                        LJ::NotificationMethod::Inbox
                        LJ::NotificationMethod::IM
                        LJ::NotificationMethod::DebugLog
                        );
 
-# this mofo is basically just an interface
+# this is basically just an interface
 # Mischa's contribution:  "straight up"
 sub new    { croak "can't instantiate base LJ::NotificationMethod" }
 sub notify { croak "can't call notification on LJ::NotificationMethod base class" }
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/NotificationMethod/SMS.pm
--- a/cgi-bin/LJ/NotificationMethod/SMS.pm	Mon Aug 03 15:16:25 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-package LJ::NotificationMethod::SMS;
-
-use strict;
-use Carp qw/ croak /;
-use base 'LJ::NotificationMethod';
-use Class::Autouse qw(
-                      LJ::SMS
-                      LJ::SMS::Message
-                      );
-
-sub can_digest { 0 };
-
-sub new {
-    my $class = shift;
-    my $u = shift;
-    croak "invalid user object passed"
-        unless LJ::isu($u);
-
-    my $self = { u => $u };
-
-    return bless $self, $class;
-}
-
-sub title { BML::ml('notification_method.sms.title') }
-
-sub help_url { "sms_about" }
-
-sub new_from_subscription {
-    my $class = shift;
-    my $subs = shift;
-
-    return $class->new($subs->owner);
-}
-
-sub u {
-    my $self = shift;
-    croak "'u' is an object method"
-        unless ref $self eq __PACKAGE__;
-
-    if (my $u = shift) {
-        croak "invalid 'u' passed to setter"
-            unless LJ::isu($u);
-
-        $self->{u} = $u;
-    }
-    croak "superfluous extra parameters"
-        if @_;
-
-    return $self->{u};
-}
-
-# notify a single event
-sub notify {
-    my $self = shift;
-    croak "'notify' is an object method"
-        unless ref $self eq __PACKAGE__;
-
-    my $u = $self->u;
-
-    croak "'notify' requires an event"
-        unless @_;
-
-    my @events = @_;
-
-    foreach my $ev (@events) {
-        croak "invalid event passed" unless ref $ev;
-        my $msg_txt = $ev->as_sms($u);
-
-        last if $u->prop('sms_perday_notif_limit') &&
-            $u->sms_sent_message_count(max_age => 86400, class_key_like => 'Notif%') >= $u->prop('sms_perday_notif_limit');
-
-        my $event_name = $ev->class;
-        $event_name =~ s/LJ::Event:://;
-
-        my $msg = LJ::SMS::Message->new(
-                                        owner     => $u,
-                                        to        => $u,
-                                        body_text => $msg_txt,
-                                        class_key => 'Notif-' . $event_name,
-                                        );
-
-        $u->send_sms($msg);
-    }
-
-    return 1;
-}
-
-sub configured {
-    my $class = shift;
-
-    # FIXME: should probably have more checks
-    return LJ::SMS->configured ? 1 : 0;
-}
-
-sub configured_for_user {
-    my $class = shift;
-    my $u = shift;
-
-    return LJ::SMS->configured_for_user($u) ? 1 : 0;
-}
-
-sub disabled_url { "$LJ::SITEROOT/manage/sms/" }
-
-1;
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/SMS.pm
--- a/cgi-bin/LJ/SMS.pm	Mon Aug 03 15:16:25 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,469 +0,0 @@
-package LJ::SMS;
-
-# LJ::SMS object
-#
-# wrangles LJ::SMS::Messages and the app logic associated
-# with them...
-#
-# also contains LJ::Worker class for incoming SMS
-#
-
-use strict;
-use Carp qw(croak);
-
-sub schwartz_capabilities {
-    return qw(LJ::Worker::IncomingSMS);
-}
-
-sub load_mapping {
-    my $class = shift;
-    my %opts = @_;
-    my $uid          = delete $opts{uid};
-    my $num          = delete $opts{num};
-    my $force_master = delete $opts{force_master};
-    croak "invalid options passed to load_mapping: " . join(",", keys %opts)
-        if %opts;
-    croak "can't pass both uid and num to load_mapping"
-        if defined $uid && defined $num;
-    croak "invalid userid: $uid"
-        if defined $uid && $uid !~ /^\d+$/;
-    croak "invalid number: $num"
-        if defined $num && $num !~ /^\+?\d+$/;
-    croak "no userid or number passed to load_mapping: uid=$uid, num=$num"
-        unless $uid || $num;
-
-    my $force = $LJ::_PRAGMA_FORCE_MASTER || $force_master;
-
-    my $db = $force ? LJ::get_db_writer() : LJ::get_db_reader()
-        or die "unable to contact db reader";
-
-    # load by userid if that's what was specified
-    if ($uid) {
-        my $row = $LJ::SMS::REQ_CACHE_MAP_UID{$uid};
-        undef $row if $force;
-
-        unless (ref $row) {
-            $row = $db->selectrow_hashref
-                ("SELECT number, userid, verified, instime " .
-                 "FROM smsusermap WHERE userid=?", undef, $uid) || {};
-            die $db->errstr if $db->err;
-
-            # set whichever cache bits we can
-            $LJ::SMS::REQ_CACHE_MAP_UID{$uid} = $row;
-            $LJ::SMS::REQ_CACHE_MAP_NUM{$row->{number}} = $row if $row->{number};
-        }
-
-        # return row hashref
-        return $row;
-    }
-
-    # load by msisdn 'num'
-    if ($num) {
-        my $row = $LJ::SMS::REQ_CACHE_MAP_NUM{$num};
-        undef $row if $force;
-
-        unless (ref $row) {
-            $row = $db->selectrow_hashref
-                ("SELECT number, userid, verified, instime " .
-                 "FROM smsusermap WHERE number=?", undef, $num) || {};
-            die $db->errstr if $db->err;
-
-            # set whichever cache bits we can
-            $LJ::SMS::REQ_CACHE_MAP_NUM{$num} = $row;
-            $LJ::SMS::REQ_CACHE_MAP_UID{$row->{userid}} = $row if $row->{userid};
-        }
-
-        return $row;
-    }
-
-    return undef;
-}
-
-sub replace_mapping {
-    my ($class, $uid, $num, $verified) = @_;
-    $uid = LJ::want_userid($uid);
-    $verified = uc($verified);
-    croak "invalid userid" unless int($uid) > 0;
-    if ($num) {
-        croak "invalid number" unless $num =~ /^\+\d+$/;
-        croak "invalid verified flag" unless $verified =~ /^[YN]$/;
-    }
-
-    my $dbh = LJ::get_db_writer();
-
-    # need to get currently mapped number so we can invalidate the reverse number lookup cache
-    my $num_row = $LJ::SMS::REQ_CACHE_MAP_UID{$uid};
-    my $old_num = $num_row ? $num_row->{number} : undef;
-    delete $LJ::SMS::REQ_CACHE_MAP_NUM{$old_num} if $old_num;
-
-    # invalidate user -> num cache
-    delete $LJ::SMS::REQ_CACHE_MAP_UID{$uid};
-
-    if ($num) {
-        $dbh->do("REPLACE INTO smsusermap SET number=?, userid=?, verified=?, instime=UNIX_TIMESTAMP()",
-                 undef, $num, $uid, $verified);
-
-        die $dbh->errstr if $dbh->err;
-
-        # now update request cache with definitive data from global master
-        LJ::SMS->load_mapping(uid => $uid, force_master => 1);
-
-    } else {
-        return $dbh->do("DELETE FROM smsusermap WHERE userid=?", undef, $uid);
-    }
-}
-
-# get the userid of a given number from smsusermap
-sub num_to_uid {
-    my $class = shift;
-    my $num   = shift;
-    my %opts  = @_;
-    my $verified_only = delete $opts{verified_only};
-    $verified_only = defined $verified_only ? $verified_only : 1;
-
-    my $row = LJ::SMS->load_mapping( num => $num, %opts );
-
-    if ($verified_only) {
-        return $row->{verified} eq 'Y' ? $row->{userid} : undef;
-    }
-
-    return $row->{userid};
-}
-
-sub uid_to_num {
-    my $class = shift;
-    my $uid  = LJ::want_userid(shift);
-    my %opts  = @_;
-    my $verified_only = delete $opts{verified_only};
-    $verified_only = defined $verified_only ? $verified_only : 1;
-
-    my $row = LJ::SMS->load_mapping( uid => $uid, %opts );
-
-    if ($verified_only) {
-        return $row->{verified} eq 'Y' ? $row->{number} : undef;
-    }
-
-    return $row->{number};
-}
-
-sub sent_message_count {
-    my $class = shift;
-    my $u = shift;
-    croak "invalid user object for message count"
-        unless LJ::isu($u);
-
-    my %opts = @_;
-
-    return $class->message_count($u, status => 'success', type => 'outgoing', %opts);
-}
-
-sub message_count {
-    my $class = shift;
-    my $u = shift;
-    croak "invalid user object for message count"
-        unless LJ::isu($u);
-
-    my %opts  = @_;
-
-    my $status = delete $opts{status};
-    croak "invalid status: $status"
-        if $status && $status !~ /^(success|error|unknown)$/;
-
-    my $type = delete $opts{type};
-    croak "invalid message type: $type"
-        if $type && $type !~ /^(incoming|outgoing|unknown)$/;
-
-    my $class_key       = delete $opts{class_key};
-    my $class_key_like  = delete $opts{class_key_like};
-    my $max_age         = delete $opts{max_age};
-
-    croak "must pass class_key OR class_key_like" if ($class_key || $class_key_like) &&
-         ! ($class_key xor $class_key_like);
-
-    croak "invalid parameters: " . join(",", keys %opts)
-        if %opts;
-
-    my @where_sql = ();
-    my @where_vals = ();
-    if ($status) {
-        push @where_sql, "status=?";
-        push @where_vals, $status;
-    }
-    if ($type) {
-        push @where_sql, "type=?";
-        push @where_vals, $type;
-    }
-    if ($class_key) {
-        push @where_sql, "class_key=?";
-        push @where_vals, $class_key;
-    }
-    if ($class_key_like) {
-        $class_key_like = $u->quote($class_key_like);
-        push @where_sql, "class_key LIKE $class_key_like";
-    }
-    if ($max_age) {
-        my $q_max_age = int($max_age);
-        my $timestamp = $LJ::_T_SMS_NOTIF_LIMIT_TIME_OVERRIDE ? time() : 'UNIX_TIMESTAMP()';
-        push @where_sql, "timecreate>($timestamp-$q_max_age)";
-        # don't push @where_vals
-    }
-    my $where_sql = @where_sql ? " AND " . join(" AND ", @where_sql) : "";
-
-    my ($ct) = $u->selectrow_array
-        ("SELECT COUNT(*) FROM sms_msg WHERE userid=?$where_sql",
-         undef, $u->id, @where_vals);
-    die $u->errstr if $u->err;
-
-    return $ct+0;
-}
-
-# given a number of $u object, returns whether there is a verified mapping
-sub num_is_verified {
-    my $class = shift;
-    my $num   = shift;
-
-    # load smsusermap row via API, then see if the number was verified
-    my $row = LJ::SMS->load_mapping(num => $num);
-
-    return 1 if $row && $row->{verified} eq 'Y';
-    return 0;
-}
-
-sub num_is_pending {
-   my $class = shift;
-   my $num   = shift;
-   return LJ::SMS->num_is_verified($num) ? 0 : 1;
-}
-
-# get the time a number was inserted
-sub num_instime {
-    my $class = shift;
-    my $num  = shift;
-
-    # load smsusermap row via API, then see if the number was verified
-    my $row = LJ::SMS->load_mapping(num => $num);
-
-    # select the most recently inserted time
-    return $row->{instime};
-}
-
-# return how much time a user has left to register their number
-# returns false if no time left
-sub num_register_time_remaining {
-    my $class = shift;
-    my $u = shift;
-
-    return 1 unless $LJ::SMS_REGISTER_TIME_LIMIT;
-
-    my $instime = $u->sms_num_instime;
-    my $register_time = $LJ::SMS_REGISTER_TIME_LIMIT;
-    if ($instime && $instime + $register_time > time()) {
-        return ($instime + $register_time) - time();
-    }
-
-    return 0;
-}
-
-sub set_number_verified {
-    my ($class, $uid, $verified) = @_;
-
-    $uid = LJ::want_userid($uid);
-    $verified = uc($verified);
-    croak "invalid userid" unless int($uid) > 0;
-    croak "invalid verified flag" unless $verified =~ /^[YN]$/;
-
-    # need to find their currently mapped number to replace
-    # mapping given only $uid
-    my $num = LJ::SMS->uid_to_num($uid, verified_only => 0, force_master => 1);
-    die "no currently mapped number" unless $num;
-
-    # replace mapping using API which will do proper caching/invalidation/etc
-    return $class->replace_mapping($uid, $num, $verified);
-}
-
-# enqueue an incoming SMS for processing
-sub enqueue_as_incoming {
-    my $class = shift;
-    croak "enqueue_as_incoming is a class method"
-        unless $class eq __PACKAGE__;
-
-    my $msg = shift;
-    die "invalid msg argument"
-        unless $msg && $msg->isa("LJ::SMS::Message");
-
-    return unless $msg->should_enqueue;
-
-    my $sclient = LJ::theschwartz();
-    die "Unable to contact TheSchwartz!"
-        unless $sclient;
-
-    my $shandle = $sclient->insert("LJ::Worker::IncomingSMS", $msg);
-    return $shandle ? 1 : 0;
-}
-
-# can this user use SMS?
-# -- $u can be undef, passed opaquely to coderef if sms_ui is coderef
-sub can_use_sms {
-    my ($class, $u) = @_;
-    return 0 unless LJ::is_enabled('sms');
-    return LJ::is_enabled('sms_ui', $u);
-}
-
-# is sms sending configured?
-sub configured {
-    my $class = shift;
-
-    return %LJ::SMS_GATEWAY_CONFIG && LJ::sms_gateway() ? 1 : 0;
-}
-
-sub configured_for_user {
-    my $class = shift;
-    my $u = shift;
-
-    # active if the user has a verified sms number
-    return $u->sms_active_number ? 1 : 0;
-}
-
-sub pending_for_user {
-    my $class = shift;
-    my $u = shift;
-
-    # pending if the user has a number but it is unverified
-    return $u->sms_pending_number ? 1 : 0;
-}
-
-sub sms_quota_remaining {
-    my ($class, $u, $type) = @_;
-
-    return LJ::run_hook("sms_quota_remaining", $u, $type) || 0;
-}
-
-sub add_sms_quota {
-    my ($class, $u, $qty, $type) = @_;
-
-    return LJ::run_hook("modify_sms_quota", $u, delta => $qty, type => $type);
-}
-
-sub max_sms_bytes {
-    my ($class, $u) = @_;
-
-    # for now the max length for all users is 160, but
-    # in the future we'll need to modify this to look
-    # at their carrier cap and return a max from there
-    return '160';
-}
-
-sub max_sms_substr {
-    my $class = shift;
-    my ($u, $text, %opts) = @_;
-
-    my $suffix = delete $opts{suffix} || "";
-    my $maxlen = delete $opts{maxlen} || undef;
-    croak "invalid parameters to max_sms_substr: " . join(",", keys %opts)
-        if %opts;
-
-    $maxlen ||= $u->max_sms_bytes;
-
-    my $gw = LJ::sms_gateway()
-        or die "unable to load SMS gateway object";
-
-    # use bytes in here for length/etc
-    use bytes;
-
-    # greedily find the largest bit of text that doesn't
-    # violate the final byte length of $maxlen, stopping
-    # when $maxlen == 2 and --$maxlen == 1 is tried as
-    # a length
-    my $currlen = $maxlen;
-    while ($currlen > 1 && $gw->final_byte_length($text . $suffix) > $maxlen) {
-        $text = LJ::text_trim($text, --$currlen);
-    }
-
-    return $text . $suffix;
-}
-
-sub can_append {
-    my $class = shift;
-    my ($u, $curr, $append) = @_;
-    croak "invalid user object" unless LJ::isu($u);
-
-    my $maxlen = $u->max_sms_bytes;
-
-    my $gw = LJ::sms_gateway()
-        or die "unable to load SMS gateway object";
-
-    return $gw->final_byte_length($curr . $append) <= $maxlen;
-}
-
-sub subtract_sms_quota {
-    my ($class, $u, $qty, $type) = @_;
-
-    return LJ::run_hook("modify_sms_quota", $u, delta => -$qty, type => $type);
-}
-
-sub set_sms_quota {
-    my ($class, $u, $qty, $type) = @_;
-
-    return LJ::run_hook("modify_sms_quota", $u, amount => $qty, type => $type);
-}
-
-# Handle a request from a phone number that is not mapped ot a user
-# Only respond to HELP requests, send an SMS with instructions
-sub handle_unmapped {
-    my ($class, $dsms_msg) = @_;
-
-    # shared test gateway requires prefix of "lj " before
-    # any message to ensure it is delivered to us
-    my $body_text = $dsms_msg->body_text || '';
-    $body_text =~ s/^lj\s+//i if $LJ::IS_DEV_SERVER;
-
-    # if it is a HELP request
-    if ($body_text  =~ /^\s*help/i) {
-        my $help_text = "To use $LJ::SMS_TITLE go to $LJ::SITEROOT/sms/. For help contact support\@livejournal.com or 415-294-5054. Std msg chrgs apply. To cancel reply STOP.";
-        my $gw =  LJ::sms_gateway()
-            or die "unable to instantiate SMS gateway object";
-
-        my $dmsg = DSMS::Message->new
-            (
-             to         => LJ::SMS::Message->normalize_num($dsms_msg->from),
-             from       => LJ::SMS::Message->normalize_num($dsms_msg->to),
-             type       => "outgoing",
-             body_text  => $help_text,
-            ) or die "unable to construct DSMS::Message to send";
-        $gw->send_msg($dmsg);
-        return 1;
-    }
-
-    return 0;
-}
-
-# Schwartz worker for responding to incoming SMS messages
-package LJ::Worker::IncomingSMS;
-use base 'TheSchwartz::Worker';
-
-use Class::Autouse qw(LJ::SMS::MessageHandler);
-
-sub work {
-    my ($class, $job) = @_;
-
-    my $msg = $job->arg;
-
-    unless ($msg) {
-        $job->failed;
-        return;
-    }
-
-    LJ::SMS::MessageHandler->handle($msg);
-
-    return $job->completed;
-}
-
-sub keep_exit_status_for { 0 }
-sub grab_for { 300 }
-sub max_retries { 5 }
-sub retry_delay {
-    my ($class, $fails) = @_;
-    return (10, 30, 60, 300, 600)[$fails];
-}
-
-1;
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/SMS/Message.pm
--- a/cgi-bin/LJ/SMS/Message.pm	Mon Aug 03 15:16:25 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,940 +0,0 @@
-package LJ::SMS::Message;
-
-use strict;
-use Carp qw(croak);
-
-use Class::Autouse qw(
-                      IO::Socket::INET
-                      LJ::Typemap
-                      DSMS::Message
-                      DateTime
-                      LJ::SMS::MessageAck
-                      );
-
-# LJ::SMS::Message object
-#
-# internal fields:
-#
-# FIXME: optional msgid arg if in db?
-#
-#    owner_uid:  userid of the 'owner' of this SMS
-#                -- the user object who is sending
-#                   or receiving this message
-#    from_uid:   userid of the sender
-#    from_num:   phone number of sender
-#    to_uid:     userid of the recipient
-#    to_num:     phone number of recipient
-#    msgid:      optional message id if saved to DB
-#    timecreate: timestamp when message was created
-#    class_key:  key identifier for the type of this message
-#    type:       'incoming' or 'outgoing' from LJ's perspective
-#    status:     'success', 'error', or 'unknown' depending on msg status
-#    error:      error string associated with this message, if any
-#    body_text:  decoded text body of message
-#    body_raw:   raw text body of message
-#    meta:       hashref of metadata key/value pairs
-#    acks:       array of SMS::MessageAck objects loaded from DB
-#                -- note that these are read-only
-#
-# synopsis:
-#
-#    my $sms = LJ::SMS->new(owner     => $owneru,
-#                           class_key => 'msg-type-123',
-#                           type      => 'outgoing',
-#                           status    => 'unknown',
-#                           from      => $num_or_u,
-#                           to        => $num_or_u,
-#                           body_text => $utf8_text,
-#                           meta      => { k => $v },
-#                           );
-#
-#    my $sms = LJ::SMS->new_from_dsms($dsms_msg);
-#
-# accessors:
-#
-#    $msg->owner_u;
-#    $msg->to_num;
-#    $msg->from_num;
-#    $msg->to_u;
-#    $msg->from_u;
-#    $msg->class_key;
-#    $msg->type;
-#    $msg->status;
-#    $msg->error;
-#    $msg->msgid;
-#    $msg->body_text;
-#    $msg->raw_text;
-#    $msg->timecreate;
-#    $msg->meta;
-#    $msg->meta($k);
-#    $msg->gateway_obj;
-#    $msg->acks;
-#
-# FIXME: singletons + lazy loading for queries
-#
-
-sub new {
-    my ($class, %opts) = @_;
-    croak "new is a class method"
-        unless $class eq __PACKAGE__;
-
-    my $self = bless {}, $class;
-
-    # from/to can each be passed as either number or $u object
-    # in any case $self will end up with the _num and _uid fields
-    # specified for each valid from/to arg
-    foreach my $k (qw(from to)) {
-        my $val = delete $opts{$k};
-        next unless $val;
-
-        # extract fields from $u object
-        if (LJ::isu($val)) {
-            my $u = $val;
-            $self->{"${k}_uid"} = $u->{userid};
-            $self->{"${k}_num"} = $u->sms_mapped_number
-                or croak "'$k' user has no mapped number";
-            next;
-        }
-
-        # normalize the number before validating...
-        $val = $self->normalize_num($val);
-
-        if ($val =~ /^\+?\d+$/) {
-            # right now, we're trying to verify what a user has sent to us,
-            # and if they haven't been verified yet then we need to send
-            # verified_only = 0 until we mark them as verified.
-            $self->{"${k}_uid"} = LJ::SMS->num_to_uid($val, verified_only => 0);
-            $self->{"${k}_num"} = $val;
-            next;
-        }
-
-        croak "invalid numeric argument '$k': $val";
-    }
-
-    # type: incoming/outgoing.  attempt to infer if none is specified
-    $self->{type} = lc(delete $opts{type});
-    unless ($self->{type}) {
-        if ($self->{from_uid} && $self->{to_uid}) {
-            croak "cannot send user-to-user messages";
-        } elsif ($self->{from_uid}) {
-            $self->{type} = 'incoming';
-        } elsif ($self->{to_uid}) {
-            $self->{type} = 'outgoing';
-        }
-    }
-
-    # allow class_key to be set
-    $self->{class_key} = delete $opts{class_key} || 'unknown';
-
-    # now validate an explict or inferred type
-    croak "type must be one of 'incoming' or 'outgoing', from the server's perspective"
-        unless $self->{type} =~ /^(?:incoming|outgoing)$/;
-
-    # from there, fill in the from/to num defaulted to $LJ::SMS_SHORTCODE
-    if ($self->{type} eq 'outgoing') {
-        croak "need valid 'to' argument to construct outgoing message"
-            unless $self->{"to_num"};
-        $self->{from_num} ||= $LJ::SMS_SHORTCODE;
-    } else {
-        croak "need valid 'from' argument to construct incoming message"
-            unless $self->{"from_num"};
-        $self->{to_num} ||= $LJ::SMS_SHORTCODE;
-    }
-
-    { # owner argument
-        my $owner_arg = delete $opts{owner};
-        croak "owner argument must be a valid user object"
-            unless LJ::isu($owner_arg);
-
-        $self->{owner_uid} = $owner_arg->{userid};
-    }
-
-    # omg we need text eh?
-    $self->{body_text} = delete $opts{body_text};
-    $self->{body_raw}  = exists $opts{body_raw} ? delete $opts{body_raw} : $self->{body_text};
-
-    { # any metadata the user would like to pass through
-        $self->{meta} = delete $opts{meta};
-        croak "invalid 'meta' argument"
-            if $self->{meta} && ref $self->{meta} ne 'HASH';
-
-        $self->{meta} ||= {};
-    }
-
-    { # any message acks received for this message
-        $self->{acks} = delete $opts{acks} || [];
-        unless (ref $self->{acks} eq 'ARRAY' &&
-                ! grep { ! ref $_ && ! $_->isa("LJ::SMS::MessageAck") } @{$self->{acks}})
-        {
-            croak "invalid 'acks' argument";
-        }
-    }
-
-    # set timecreate stamp for this object
-    $self->{timecreate} = delete $opts{timecreate} || time();
-    croak "invalid 'timecreate' parameter: $self->{timecreate}"
-        unless int($self->{timecreate}) > 0;
-
-    # by default set status to 'unknown'
-    $self->{status} = lc(delete $opts{status}) || 'unknown';
-    croak "invalid msg status: $self->{status}"
-        unless $self->{status} =~ /^(?:success|ack_wait|error|unknown)$/;
-
-    # set msgid if a non-zero one was specified
-    $self->{msgid} = delete $opts{msgid};
-    croak "invalid msgid: $self->{msgid}"
-        if $self->{msgid} && int($self->{msgid}) <= 0;
-
-    # probably no error string specified here
-    $self->{error} = delete $opts{error} || undef;
-
-    # able to pass in a gateway object, but default works too
-    $self->{gateway} = delete $opts{gateway} || LJ::sms_gateway();
-    croak "invalid gateway object: $self->{gateway}"
-        unless $self->{gateway} && $self->{gateway}->isa("DSMS::Gateway");
-
-    die "invalid arguments: " . join(", ", keys %opts)
-        if %opts;
-
-    return $self;
-}
-
-sub new_from_dsms {
-    my ($class, $dsms_msg) = @_;
-    croak "new_from_dsms is a class method"
-        unless $class eq __PACKAGE__;
-
-    croak "invalid dsms_msg argument: $dsms_msg"
-        unless ref $dsms_msg eq 'DSMS::Message';
-
-    my $owneru = undef;
-    {
-        my $owner_num = $dsms_msg->is_incoming ?
-            $dsms_msg->from : $dsms_msg->to;
-
-        $owner_num = $class->normalize_num($owner_num);
-
-        my $uid = LJ::SMS->num_to_uid($owner_num, verified_only => 0);
-        unless ($uid) {
-            return 0 if (LJ::SMS->handle_unmapped($dsms_msg));
-            croak "invalid owner id from number: $owner_num";
-        }
-
-        $owneru = LJ::load_userid($uid);
-        croak "invalid owner u from number: $owner_num"
-            unless LJ::isu($owneru);
-    }
-
-    # LJ needs utf8 flag off for all fields, we'll do that
-    # here now that we're officially in LJ land.
-    $dsms_msg->encode_utf8;
-
-    # construct a new LJ::SMS::Message object
-    my $msg = $class->new
-        ( owner     => $owneru,
-          from      => $class->normalize_num($dsms_msg->from),
-          to        => $class->normalize_num($dsms_msg->to),
-          type      => $dsms_msg->type,
-          body_text => $dsms_msg->body_text,
-          body_raw  => $dsms_msg->body_raw,
-          meta      => $dsms_msg->meta,
-          );
-
-    # class_key is still unknown here, to be set later
-
-    return $msg;
-}
-
-sub load {
-    my $class = shift;
-    croak "load is a class method"
-        unless $class eq __PACKAGE__;
-
-    my $owner_u = shift;
-    croak "invalid owner_u: $owner_u"
-        unless LJ::isu($owner_u);
-
-    my $uid      = $owner_u->{userid};
-    my @msgids   = ();
-    my $msg_rows = {};
-    my $bind     = "";
-
-    # remaining args can be key/value pairs of options, or a list of msgids
-    if ($_[0] =~ /\D/) {
-        my %opts = @_;
-
-        # loading msgids by month and year
-        if (exists $opts{month} || exists $opts{year}) {
-            my $month = delete $opts{month};
-            croak "invalid month: $month"
-                unless $month =~ /^\d\d?$/ && $month > 0 && $month <= 12;
-
-            my $year  = delete $opts{year};
-            croak "invalid year: $year"
-                unless $year =~ /^\d{4}$/;
-
-            croak "invalid options for year/month load: " . join(",", keys %opts) if %opts;
-
-            my $dt = DateTime->new(year => $year, month => $month);
-            my $start_time = $dt->epoch;
-            my $end_time   = $dt->add(months => 1)->epoch;
-
-            $msg_rows = $owner_u->selectall_hashref
-                ("SELECT msgid, class_key, type, status, to_number, from_number, timecreate " .
-                 "FROM sms_msg WHERE userid=? AND timecreate>=? AND timecreate<?",
-                 'msgid', undef, $uid, $start_time, $end_time) || {};
-            die $owner_u->errstr if $owner_u->err;
-
-        # not sure what args they're giving
-        } else {
-            croak "invalid parameters: " . join(",", keys %opts)
-                if %opts;
-        }
-
-        # which messageids matched the above constraint?
-        @msgids = sort {$a <=> $b} keys %$msg_rows;
-
-    } else {
-        @msgids = @_;
-        croak "invalid msgid: $_"
-            if grep { ! $_ || int($_) <= 0 } @msgids;
-
-        $bind = join(",", map { "?" } @msgids);
-        $msg_rows = $owner_u->selectall_hashref
-            ("SELECT msgid, class_key, type, status, to_number, from_number, timecreate " .
-             "FROM sms_msg WHERE userid=? AND msgid IN ($bind)",
-             'msgid', undef, $uid, @msgids) || {};
-        die $owner_u->errstr if $owner_u->err;
-
-        @msgids = grep { exists $msg_rows->{$_} } @msgids;
-    }
-
-    return wantarray ? () : undef unless scalar @msgids;
-
-    # now update $bind to be consistent with the @msgids value found above
-    $bind = join(",", map { "?" } @msgids);
-
-    my $text_rows = $owner_u->selectall_hashref
-        ("SELECT msgid, msg_raw, msg_decoded FROM sms_msgtext WHERE userid=? AND msgid IN ($bind)",
-         'msgid', undef, $uid, @msgids) || {};
-    die $owner_u->errstr if $owner_u->err;
-
-    my $error_rows = $owner_u->selectall_hashref
-        ("SELECT msgid, error FROM sms_msgerror WHERE userid=? AND msgid IN ($bind)",
-         'msgid', undef, $uid, @msgids) || {};
-    die $owner_u->errstr if $owner_u->err;
-
-    my $tm = $class->typemap;
-
-    my $prop_rows = {};
-    my $sth = $owner_u->prepare
-        ("SELECT msgid, propid, propval FROM sms_msgprop WHERE userid=? AND msgid IN ($bind)");
-    $sth->execute($uid, @msgids);
-    while (my ($msgid, $propid, $propval) = $sth->fetchrow_array) {
-        my $propname = $tm->typeid_to_class($propid)
-            or die "no propname for propid: $propid";
-
-        $prop_rows->{$msgid}->{$propname} = $propval;
-    }
-
-    # load message acks for all messages
-    my @acks = LJ::SMS::MessageAck->load($owner_u, @msgids);
-    my %acks_by_msgid = ();
-    foreach my $ack (@acks) {
-        push @{$acks_by_msgid{$ack->msgid}}, $ack;
-    }
-
-    my @ret_msgs = ();
-    foreach my $msgid (@msgids) {
-        my $msg_row   = $msg_rows->{$msgid};
-        my $text_row  = $text_rows->{$msgid};
-        my $error_row = $error_rows->{$msgid};
-        my $props     = $prop_rows->{$msgid};
-
-        push @ret_msgs, $class->new
-            ( owner      => $owner_u,
-              msgid      => $msgid,
-              error      => $error_row->{error},
-              meta       => $props,
-              acks       => $acks_by_msgid{$msgid},
-              from       => $msg_row->{from_number},
-              to         => $msg_row->{to_number},
-              class_key  => $msg_row->{class_key},
-              type       => $msg_row->{type},
-              status     => $msg_row->{status},
-              timecreate => $msg_row->{timecreate},
-              body_text  => $text_row->{msg_decoded},
-              body_raw   => $text_row->{msg_raw},
-              );
-    }
-
-    return wantarray() ? @ret_msgs : $ret_msgs[0];
-}
-
-sub load_by_uniq {
-    my $class = shift;
-    croak "load is a class method"
-        unless $class eq __PACKAGE__;
-
-    my $msg_uniq = shift;
-    croak "invalid msg_uniq: must not be empty"
-        unless length $msg_uniq;
-
-    my $dbh = LJ::get_db_writer()
-        or die "unable to contact global db master";
-
-    my ($userid, $msgid) = $dbh->selectrow_array
-        ("SELECT userid, msgid FROM smsuniqmap WHERE msg_uniq=?",
-         undef, $msg_uniq);
-    die $dbh->errstr if $dbh->err;
-
-    my $owner_u = LJ::load_userid($userid)
-        or die "invalid owner for uniq: $msg_uniq";
-
-    return $class->load($owner_u, $msgid);
-}
-
-sub register_uniq {
-    my $self     = shift;
-    my $msg_uniq = shift;
-
-    my $dbh = LJ::get_db_writer()
-        or die "unable to contact global db master";
-
-    my $owner_u = $self->owner_u;
-
-    my $rv = $dbh->do("REPLACE INTO smsuniqmap SET msg_uniq=?, userid=?, msgid=?",
-                      undef, $msg_uniq, $owner_u->id, $self->msgid);
-    die $dbh->errstr if $dbh->err;
-
-    return $rv;
-}
-
-sub recv_ack {
-    my $self = shift;
-    my $ack  = shift;
-    my $meta = shift;
-    croak "invalid ack for recv_ack: $ack"
-        unless $ack && $ack->isa("LJ::SMS::MessageAck");
-    croak "invalid meta arg: $meta"
-        if $meta && ref $meta ne 'HASH';
-
-    # warn if we receive an ack for a message which is no longer awaiting acks
-    unless ($self->is_awaiting_ack) {
-        my $userid = $self->owner_u->id;
-        my $msgid  = $self->msgid;
-        warn "message not awaiting ack: uid=$userid, msgid=$msgid";
-    }
-
-    # save this ack to the db if it hasn't been done already
-    $ack->save_to_db;
-
-    # take metadata from DSMS ack and append it to the message's 'meta' fieldset
-    if ($meta) {
-        my %to_append = ();
-        while (my ($k, $v) = each %{$meta||{}}) {
-            next unless $v;
-            $to_append{uc(join("_", "ACK", $ack->type, $k))} = $v;
-        }
-
-        $self->meta(%to_append);
-    }
-
-    # gateway ack's don't indicate final success,
-    # return early unless the ack is from the smsc
-    return 1 unless $ack->type eq 'smsc';
-
-    # our status flag is now that of the ack which was
-    # received:  success, error, unknown
-    if ($ack->status_flag eq 'error') {
-        $self->status('error' => $ack->status_text);
-    } else {
-        $self->status($ack->status_flag);
-    }
-
-    return LJ::run_hook("sms_recv_ack", $self, $ack);
-
-    return 1;
-}
-
-sub gateway {
-    my $self = shift;
-
-    if (@_) {
-        my $gw = shift;
-        croak "invalid gateway param"
-            unless $gw;
-
-        # setting a gateway object
-        if (ref $gw) {
-            croak "invalid gateway object: $gw"
-                unless $gw->isa("DSMS::Gateway");
-
-            return $self->{gateway} = $gw;
-
-        # setting a new object via gw key
-        } else {
-            return $self->{gateway} = LJ::sms_gateway($gw);
-        }
-    }
-
-    return $self->{gateway};
-}
-
-sub typemap {
-    my $class = shift;
-
-    return LJ::Typemap->new
-        ( table      => 'sms_msgproplist',
-          classfield => 'name',
-          idfield    => 'propid',
-          );
-}
-
-sub normalize_num {
-    my $class = shift;
-    my $arg = shift;
-    $arg = ref $arg ? $arg->[0] : $arg;
-
-    # add +1 if it's a US number
-    $arg = "+1$arg" if $arg =~ /^\d{10}$/;
-
-    return $arg;
-}
-
-sub meta {
-    my $self = shift;
-    my $key  = shift;
-    my $val  = shift;
-
-    my $meta = $self->{meta} || {};
-
-    # if a value was specified for a set, handle that here
-    if ($key && $val) {
-
-        my %to_set = ($key => $val, @_);
-
-        # if saved to the db, go ahead and write out now
-        if ($self->msgid) {
-
-            my $tm    = $self->typemap;
-            my $u     = $self->owner_u;
-            my $uid   = $u->id;
-            my $msgid = $self->id;
-
-            my @vals = ();
-            while (my ($k, $v) = each %to_set) {
-                next if $v eq $meta->{$k};
-
-                my $propid = $tm->class_to_typeid($k);
-                push @vals, ($uid, $msgid, $propid, $v);
-            }
-
-            if (@vals) {
-                my $bind = join(",", map { "(?,?,?,?)" } (1..@vals/4));
-
-                $u->do("REPLACE INTO sms_msgprop (userid, msgid, propid, propval) VALUES $bind",
-                       undef, @vals);
-                die $u->errstr if $u->err;
-            }
-        }
-
-        # update elements in memory
-        while (my ($k, $v) = each %to_set) {
-            $meta->{$k} = $v;
-        }
-
-        # return new set value of the first element passed
-        return $meta->{$key};
-    }
-
-    # if a specific key was specified, return that element
-    # ... otherwise return a hashref of all k/v pairs
-    return $key ? $meta->{$key} : $meta;
-}
-
-sub owner_u {
-    my $self = shift;
-
-    # load user obj if valid uid and return
-    my $uid = $self->{owner_uid};
-    return $uid ? LJ::load_userid($uid) : undef;
-}
-
-sub to_num {
-    my $self = shift;
-    return $self->{to_num};
-}
-
-sub to_u {
-    my $self = shift;
-
-    # load userid from db unless the cache key exists
-    $self->{to_uid} = LJ::SMS->num_to_uid($self->{to_num}, verified_only => 0)
-        unless exists $self->{to_uid};
-
-    # load user obj if valid uid and return
-    my $uid = $self->{to_uid};
-    return $uid ? LJ::load_userid($uid) : undef;
-}
-
-sub from_num {
-    my $self = shift;
-    return $self->{from_num};
-}
-
-sub from_u {
-    my $self = shift;
-
-    # load userid from db unless the cache key exists
-    $self->{_from_uid} = LJ::SMS->num_to_uid($self->{from_num}, verified_only => 0)
-        unless exists $self->{_from_uid};
-
-    # load user obj if valid uid and return
-    my $uid = $self->{_from_uid};
-    return $uid ? LJ::load_userid($uid) : undef;
-}
-
-sub class_key {
-    my $self = shift;
-
-    if (@_) {
-        my $val = shift;
-        croak "invalid value for 'class_key': $val"
-            unless length $val;
-
-        if ($self->msgid && $val ne $self->{class_key}) {
-            my $owner_u = $self->owner_u;
-            $owner_u->do("UPDATE sms_msg SET class_key=? WHERE userid=? AND msgid=?",
-                         undef, $val, $owner_u->{userid}, $self->msgid);
-            die $owner_u->errstr if $owner_u->err;
-        }
-
-        return $self->{class_key} = $val;
-    }
-
-    return $self->{class_key};
-}
-
-sub type {
-    my $self = shift;
-
-    if (@_) {
-        my $val = shift;
-        croak "invalid value for 'status': $val"
-            unless $val =~ /^(?:incoming|outgoing)$/;
-
-        if ($self->msgid && $val ne $self->{type}) {
-            my $owner_u = $self->owner_u;
-            $owner_u->do("UPDATE sms_msg SET type=? WHERE userid=? AND msgid=?",
-                         undef, $val, $owner_u->{userid}, $self->msgid);
-            die $owner_u->errstr if $owner_u->err;
-        }
-
-        return $self->{type} = $val;
-    }
-
-    return $self->{type};
-}
-
-sub timecreate {
-    my $self = shift;
-    return $self->{timecreate};
-}
-
-sub msgid {
-    my $self = shift;
-    return $self->{msgid};
-}
-*id = \&msgid;
-
-sub status {
-    my $self = shift;
-
-    if (@_) {
-        my $val = shift;
-        croak "invalid value for 'status': $val"
-            unless $val =~ /^(?:success|ack_wait|error|unknown)$/;
-
-        if ($self->msgid && $val ne $self->{status}) {
-            my $owner_u = $self->owner_u;
-            $owner_u->do("UPDATE sms_msg SET status=? WHERE userid=? AND msgid=?",
-                         undef, $val, $owner_u->{userid}, $self->msgid);
-            die $owner_u->errstr if $owner_u->err;
-        }
-
-        # third argument to call as $self->('error' => $err_str);
-        if (@_ && $val eq 'error') {
-            my $val_arg = shift;
-            $self->error($val_arg);
-        }
-
-        return $self->{status} = $val;
-    }
-
-    return $self->{status};
-}
-
-sub error {
-    my $self = shift;
-
-    if (@_) {
-        my $errstr = shift;
-
-        # changing an errstr on an object that lives in the db?
-        if ($self->msgid && $errstr ne $self->{error}) {
-            my $owner_u = $self->owner_u;
-            $owner_u->do("REPLACE INTO sms_msgerror SET userid=?, msgid=?, error=?",
-                         undef, $owner_u->{userid}, $self->msgid, $errstr);
-            die $owner_u->errstr if $owner_u->err;
-        }
-
-        return $self->{error} = $errstr;
-    }
-
-    return $self->{error};
-}
-
-sub is_success {
-    my $self = shift;
-    return $self->status eq 'success' ? 1 : 0;
-}
-
-sub is_error {
-    my $self = shift;
-    return $self->status eq 'error' ? 1 : 0;
-}
-
-sub is_awaiting_ack {
-    my $self = shift;
-    return $self->status eq 'ack_wait' ? 1 : 0;
-}
-
-sub body_text {
-    my $self = shift;
-
-    return $self->{body_text} unless $LJ::IS_DEV_SERVER;
-
-    # shared test gateway requires prefix of "lj " before
-    # any message to ensure it is delivered to us
-    my $body_text = $self->{body_text} || '';
-    $body_text =~ s/^lj\s+//i;
-    return $body_text;
-}
-
-sub body_raw {
-    my $self = shift;
-    return $self->{body_raw};
-}
-
-sub save_to_db {
-    my $self = shift;
-
-    # do nothing if already saved to db
-    return 1 if $self->{msgid};
-
-    my $u = $self->owner_u
-        or die "no owner object found";
-    my $uid = $u->{userid};
-
-    # allocate a user counter id for this messaGe
-    my $msgid = LJ::alloc_user_counter($u, "G")
-        or die "Unable to allocate msgid for user: " . $self->owner_u->{user};
-
-    # insert main sms_msg row
-    my $timestamp = $LJ::_T_SMS_NOTIF_LIMIT_TIME_OVERRIDE ? time() : 'UNIX_TIMESTAMP()';
-    $u->do("INSERT INTO sms_msg SET userid=?, msgid=?, class_key=?, type=?, " .
-           "status=?, to_number=?, from_number=?, timecreate=$timestamp",
-           undef, $uid, $msgid, $self->class_key, $self->type, $self->status,
-           $self->to_num, $self->from_num);
-    die $u->errstr if $u->err;
-
-    # save blob parts to their table
-    $u->do("INSERT INTO sms_msgtext SET userid=?, msgid=?, msg_raw=?, msg_decoded=?",
-           undef, $uid, $msgid, $self->body_raw, $self->body_text);
-    die $u->errstr if $u->err;
-
-    # save error string if any
-    if ($self->error) {
-        $u->do("INSERT INTO sms_msgerror SET userid=?, msgid=?, error=?",
-               undef, $u->{userid}, $msgid, $self->error);
-        die $u->errstr if $u->err;
-    }
-
-    # save msgid into this object
-    $self->{msgid} = $msgid;
-
-    # write props out to db...
-    $self->save_props_to_db;
-
-    # acks are read-only, inserted elsewhere
-
-    return 1;
-}
-
-sub save_props_to_db {
-    my $self    = shift;
-
-    my $tm = $self->typemap;
-
-    my $u     = $self->owner_u;
-    my $uid   = $u->id;
-    my $msgid = $self->id;
-
-    my @vals = ();
-    while (my ($propname, $propval) = each %{$self->meta}) {
-        my $propid = $tm->class_to_typeid($propname);
-        push @vals => $uid, $msgid, $propid, $propval;
-    }
-
-    if (@vals) {
-        my $bind = join(",", map { "(?,?,?,?)" } (1..@vals/4));
-
-        $u->do("REPLACE INTO sms_msgprop (userid, msgid, propid, propval) VALUES $bind",
-               undef, @vals);
-        die $u->errstr if $u->err;
-    }
-
-    return 1;
-}
-
-sub respond {
-    my $self = shift;
-    my $body_text = shift;
-    my %opts = @_;
-
-    my $resp = LJ::SMS::Message->new
-        ( owner     => $self->owner_u,
-          from      => $self->to_num,
-          to        => $self->from_num,
-          body_text => $body_text );
-
-    # set class key if one was specified via opts or
-    # one can be inferred via the message we're responding to
-    {
-        my $class_key = delete $opts{class_key};
-
-        # explicit class_key
-        my $explicit = 1 if $class_key;
-
-        # fall back to other means
-        $class_key ||=
-            $self->class_key             || # class_key set on $self
-            $self->meta('handler_type');    # handler_type meta set by incoming MessageHandler
-
-        if ($class_key) {
-            if ($explicit) {
-                $resp->class_key($class_key);
-            } else {
-                # inferred class_key could have been "Request", we'll strip that and tack on "Response"
-                $class_key =~ s/\-Request$//i;
-                $resp->class_key($class_key . "-Response");
-            }
-        }
-    }
-
-    # send response message
-    $resp->send(%opts);
-
-    return $resp;
-}
-
-sub send {
-    my $self = shift;
-    my %opts = @_;
-
-    my $err = sub {
-        my $errmsg = shift;
-        $self->status('error' => $errmsg);
-        $self->save_to_db;
-        return undef;
-    };
-
-    # is SMS disabled?
-    return $err->("SMS is disabled") unless LJ::is_enabled('sms');
-
-    # verify type of this message
-    $self->type('outgoing');
-
-    # need a destination $u in order to send a message
-    my $to_u = $self->to_u;
-    return $err->("no user to for message send")
-        unless $to_u;
-
-    # do not send a message to a user with no quota remaining
-    return $err->("no quota remaining")
-        unless ! LJ::is_enabled('sms_quota_check') || $opts{no_quota} || $to_u->sms_quota_remaining || $LJ::_T_NO_SMS_QUOTA;
-
-    # do not send message to this user unless they are confirmed and active
-    return $err->("sms not active for user: $to_u->{user}")
-        unless $opts{force} || $to_u->sms_active;
-
-    if (my $cv = $LJ::_T_SMS_SEND) {
-
-        # whenever a message is sent, we'll give an opportunity
-        # for local hooks to catch the event and act accordingly
-        LJ::run_hook('sms_deduct_quota', $self, %opts);
-
-        # pretend this was successful.
-        $self->status('success');
-        $self->save_to_db;
-
-        return $cv->($self);
-    }
-
-    # find where quota is being deducted from
-    my $quota_type = LJ::run_hook('sms_deduct_quota', $self, %opts);
-
-    # set gateway if quota-type was returned, otherwise () to call as getter
-    my $gw = $self->gateway($quota_type || ())
-        or die "unable to instantiate SMS gateway object";
-
-    my $dsms_msg = DSMS::Message->new
-        (
-         to        => $self->to_num,
-         from      => $self->from_num,
-         type      => "outgoing",
-         body_text => $self->body_text,
-         meta      => $self->meta,
-         ) or die "unable to construct DSMS::Message to send";
-
-    my $rv = eval {
-        my @verify_delivery = $opts{verify_delivery} ? ( verify_delivery => 1 ) : ();
-        $gw->send_msg($dsms_msg, @verify_delivery);
-    };
-
-    # mark error status if there was a problem sending
-    if ($@) {
-        $self->status('error' => $@);
-
-    # mark 'success' if status was previously 'unknown', but
-    # not if it was ack_wait, in which case we'll have to
-    # wait for a final ack from the gateway before setting
-    # the final message status
-    } elsif ($self->status eq 'unknown') {
-        $self->status('success');
-    }
-
-    # absorb metadata from DSMS message which is now sent
-    my $dsms_meta = $dsms_msg->meta || {};
-    $self->meta(%$dsms_meta);
-
-    # this message has been sent, log it to the db
-    $self->save_to_db;
-
-    # message is created, register it in the global smsuniqmap table
-    if ($dsms_msg->uniq_key) {
-        $self->register_uniq($dsms_msg->uniq_key);
-    }
-
-    return 1;
-}
-
-sub should_enqueue { 1 }
-
-sub as_string {
-    my $self = shift;
-    return "from=$self->{from}, text=$self->{body_text}\n";
-}
-
-1;
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/SMS/MessageAck.pm
--- a/cgi-bin/LJ/SMS/MessageAck.pm	Mon Aug 03 15:16:25 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,195 +0,0 @@
-#!/usr/bin/perl
-
-package LJ::SMS::MessageAck;
-
-use strict;
-use Carp qw(croak);
-
-# LJ::SMS::MessageAck object
-#
-# internal fields:
-#
-#    owner_uid     userid to which this ack belongs
-#    msgid         msgid to which this ack is a response
-#    type          ack type: gateway, smsc, handset, unknown
-#    timerecv      unixtime when ack was received
-#    status_flag   status flag indicating message success
-#    status_code   optional status code given for ack
-#    status_text   full status string as received
-
-sub new {
-    my ($class, %opts) = @_;
-    croak "new is a class method"
-        unless $class eq __PACKAGE__;
-
-    my $self = bless {}, $class;
-
-    { # owner argument
-        my $owner_arg = delete $opts{owner};
-        croak "owner argument must be a valid user object"
-            unless LJ::isu($owner_arg);
-
-        $self->{owner_uid} = $owner_arg->id;
-    }
-
-    # set msgid if a non-zero one was specified
-    $self->{msgid} = delete $opts{msgid};
-    croak "invalid msgid: $self->{msgid}"
-        if $self->{msgid} && int($self->{msgid}) <= 0;
-
-    # what type of ack is this?  gateway?  handset?
-    $self->{type} = delete $opts{type};
-    croak "type must be one of 'gateway', 'smsc', 'handset', or 'unknown'"
-        unless $self->{type} =~ /^(?:gateway|smsc|handset|unknown)$/;
-
-    # when was this message received?
-    $self->{timerecv} = delete $opts{timerecv} || time();
-    croak "invalid timerecv: $self->{timerecv}"
-        if $self->{timerecv} && int($self->{timerecv}) <= 0;
-
-    # what is the status indicated by this ack?
-    $self->{status_flag} = delete $opts{status_flag};
-    croak "status_flag must be one of 'success', 'error', or 'unknown'"
-        unless $self->{status_flag} =~ /^(?:success|error|unknown)$/;
-
-    # status code is opaque and optional
-    $self->{status_code} = delete $opts{status_code};
-    croak "invalid status code: $self->{status_code}"
-        if $self->{status_code} && length $self->{status_code};
-
-    # what status text was given for this message?
-    $self->{status_text} = delete $opts{status_text};
-    croak "invalid status text has no length"
-        unless length $self->{status_text};
-
-    croak "invalid parameters: " . join(",", keys %opts) 
-        if %opts;
-
-    return $self;
-}
-
-sub new_from_dsms {
-    my ($class, $ack) = @_;
-    croak "new_from_dsms is a class method"
-        unless $class eq __PACKAGE__;
-    croak "invalid ack arg: $ack"
-        unless $ack && $ack->isa("DSMS::MessageAck");
-
-    # get msg_uniq from DSMS::MessageAck
-    my $msg_uniq = $ack->msg_uniq
-        or die "unable to construct LJ::SMS::MessageAck from missing msg_uniq";
-
-    my $msg = LJ::SMS::Message->load_by_uniq($msg_uniq)
-        or die "unable to load message by msg_uniq: $msg_uniq";
-
-    return $class->new
-        ( owner       => $msg->owner_u,
-          msgid       => $msg->msgid,
-          type        => $ack->type,
-          timerecv    => $ack->timestamp,
-          status_flag => $ack->status_flag,
-          status_code => $ack->status_code,
-          status_text => $ack->status_text, );
-}
-
-sub load {
-    my $class = shift;
-    croak "load is a class method"
-        unless $class eq __PACKAGE__;
-
-    my $owner_u = shift;
-    croak "invalid owner_u: $owner_u" 
-        unless LJ::isu($owner_u);
-
-    my @msgids = @_;
-    foreach (@msgids) {
-        croak "invalid msgid: $_"
-            unless $_ && int($_) > 0;
-    }
-
-    my @ret_acks = ();
-
-    my $bind = join(",", map { "?" } @msgids);
-    my $sth = $owner_u->prepare
-        ("SELECT msgid, type, timerecv, status_flag, status_code, status_text " .
-         "FROM sms_msgack WHERE userid=? AND msgid IN ($bind)");
-    $sth->execute($owner_u->id, @msgids);
-
-    while (my $row = $sth->fetchrow_hashref) {
-        push @ret_acks, LJ::SMS::MessageAck->new
-            ( owner => $owner_u,
-
-              map { $_ => $row->{$_} } 
-              qw(msgid type timerecv status_flag status_code status_text)
-              );              
-    }
-
-    return @ret_acks;
-}
-
-sub save_to_db {
-    my $self = shift;
-
-    # do nothing if already saved to db
-    return 1 if $self->{_saved_to_db}++;
-
-    my $owner_u = $self->owner_u;
-
-    my $rv = $owner_u->do
-        ("INSERT INTO sms_msgack SET userid=?, msgid=?, type=?, " . 
-         "timerecv=?, status_flag=?, status_code=?, status_text=?",
-         undef, $owner_u->id, $self->msgid, $self->type,
-         $self->timerecv, $self->status_flag, $self->status_code, $self->status_text);
-    die $owner_u->errstr if $owner_u->err;
-
-    return $rv;
-}
-
-sub apply_to_msg {
-    my $self = shift;
-    my $msg  = shift;
-
-    # load message automatically unless a specific one
-    # is passed in by the caller
-    $msg ||= $self->msg;
-    die "no msg found for ack application"
-        unless $msg && $msg->isa("LJ::SMS::Message");
-
-    # update message status to reflect this ack's receipt
-    return $msg->recv_ack($self);
-}
-
-sub owner_u {
-    my $self = shift;
-
-    # load user obj if valid uid and return
-    my $uid = $self->{owner_uid};
-    return $uid ? LJ::load_userid($uid) : undef;
-}
-
-sub msg {
-    my $self = shift;
-
-    return LJ::SMS::Message->load($self->owner_u, $self->msgid);
-}
-
-sub _get {
-    my $self  = shift;
-    my $field = shift;
-    croak "unknown field: $field"
-        unless exists $self->{$field};
-
-    return $self->{$field};
-}
-
-# FIXME: this needs to be done via the message perspective
-
-sub msgid       { _get($_[0], 'msgid'      ) }
-sub type        { _get($_[0], 'type'       ) }
-sub timerecv    { _get($_[0], 'timerecv'   ) }
-sub status_flag { _get($_[0], 'status_flag') }
-sub status_code { _get($_[0], 'status_code') }
-sub status_text { _get($_[0], 'status_text') }
-*id = \&msgid;
-
-1;
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/SMS/MessageHandler.pm
--- a/cgi-bin/LJ/SMS/MessageHandler.pm	Mon Aug 03 15:16:25 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,97 +0,0 @@
-package LJ::SMS::MessageHandler;
-
-# LJ::SMS::MessageHandler object
-#  - Base class for all LJ::SMS Message Handlers
-#
-
-use strict;
-use Carp qw(croak);
-
-use LJ::ModuleLoader;
-
-my @HANDLERS = LJ::ModuleLoader->module_subclasses("LJ::SMS::MessageHandler");
-foreach my $handler (@HANDLERS) {
-    eval "use $handler";
-    die "Error loading MessageHandler '$handler': $@" if $@;
-}
-
-sub handle {
-    my ($class, $msg) = @_;
-    croak "msg argument must be a valid LJ::SMS::Message object"
-        unless $msg && $msg->isa("LJ::SMS::Message");
-
-    # this is the master switch, not a code ref... if it's set we
-    # won't even attempt to save/process SMS messages
-    die "SMS globally disabled\n" unless LJ::is_enabled('sms');
-
-    # save msg to the db
-    $msg->save_to_db
-        or die "unable to save message to db";
-
-    my $handler;
-    foreach my $class (@HANDLERS) {
-        $handler = $class if $class->owns($msg);
-    }
-
-    # default to posting, if no handlers own this message
-    $handler ||= "LJ::SMS::MessageHandler::Post";
-
-    # note the handler type for this message
-    my $htype = (split('::', $handler))[-1];
-    $msg->meta(handler_type => $htype);
-
-    # also store as the message's class_type
-    $msg->class_key("${htype}-Request");
-
-    # get the user that this message is destined for
-    my $u = $msg->from_u;
-    unless ($u) {
-        $msg->status('error' => "No destination user");
-        return 1;
-    }
-
-    # don't handle the message if the user is unverified
-    # UNLESS the handler accepts unverified users
-    if ($u->sms_pending_number) {
-        # user is awaiting verification.
-        unless ($handler->unverified_user_ok($u)) {
-            $msg->status('error' => "Message from unverified user");
-            return 1;
-        }
-    }
-
-    # handle the message
-    if ($u->is_visible) {
-        eval { $handler->handle($msg) };
-        if ($@) {
-            $msg->status('error' => $@);
-            warn "Error handling message with handler $handler: $@" if $LJ::IS_DEV_SERVER;
-        }
-    } else {
-        # suspended account
-        $msg->status('error' => "Incoming SMS from inactive user");
-    }
-
-    # message handler should update the status to one
-    # of 'success' or 'error' ...
-    croak "after handling, msg status: " . $msg->status . ", should be set?"
-        if ! $msg->status || $msg->status eq 'unknown';
-
-    return 1;
-}
-
-sub owns {
-    my ($class, $msg) = @_;
-
-    warn "STUB: LJ::SMS::MessageHandler->owns";
-    return 0;
-}
-
-# does this handler accept messages from unverified users?
-sub unverified_user_ok {
-    my ($class, $u) = @_;
-
-    return 0;
-}
-
-1;
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/SMS/MessageHandler/Add.pm
--- a/cgi-bin/LJ/SMS/MessageHandler/Add.pm	Mon Aug 03 15:16:25 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-package LJ::SMS::MessageHandler::Add;
-
-use base qw(LJ::SMS::MessageHandler);
-
-use strict;
-use Carp qw(croak);
-
-sub handle {
-    my ($class, $msg) = @_;
-
-    my $u = $msg->from_u
-        or die "no from_u for Add message";
-
-    my ($fgroup, $text) = $msg->body_text
-        =~ /^\s*a(?:dd)?(?:\.(\w+))?\s+(\S+)\s*/i;
-
-    my $fr_user = LJ::canonical_username($text)
-        or die "Invalid format for username: $text";
-
-    my $fr_u = LJ::load_user($fr_user)
-        or die "Invalid user: $fr_user";
-
-    my $groupmask = 1;
-
-    if ($fgroup) {
-        my $group = LJ::get_friend_group($u->id, { name => $fgroup })
-            or die "Invalid friend group: $fgroup";
-
-        my $grp = $group ? $group->{groupnum}+0 : 0;
-        $groupmask |= (1 << $grp) if $grp;
-    }
-
-    my $err;
-    unless ($u->is_friend($fr_u) || $u->can_add_friends(\$err, {friend => $fr_u})) {
-        die "Unable to add friend: $err";
-    }
-
-    $u->add_friend($fr_u, { groupmask => $groupmask })
-        or die "Unable to add friend for 'Add' request";
-
-    # mark the requesting (source) message as processed
-    # -- we'd die before now if there was an error
-    $msg->status('success');
-}
-
-sub owns {
-    my ($class, $msg) = @_;
-    croak "invalid message passed to MessageHandler"
-        unless $msg && $msg->isa("LJ::SMS::Message");
-
-    return $msg->body_text =~ /^\s*a(?:dd)?(\.(\w+))?\s+\S+\s*$/i ? 1 : 0;
-}
-
-1;
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/SMS/MessageHandler/Echo.pm
--- a/cgi-bin/LJ/SMS/MessageHandler/Echo.pm	Mon Aug 03 15:16:25 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-package LJ::SMS::MessageHandler::Echo;
-
-use base qw(LJ::SMS::MessageHandler);
-
-use strict;
-use Carp qw(croak);
-
-sub handle {
-    my ($class, $msg) = @_;
-
-    my $echo_text = $msg->body_text;
-    $echo_text =~ s/^\s*echo\s+//i;
-    my $resp = eval { $msg->respond($echo_text) };
-
-    # mark the requesting (source) message as processed
-    $msg->status($@ ? ('error' => $@) : 'success');
-}
-
-sub owns {
-    my ($class, $msg) = @_;
-    croak "invalid message passed to MessageHandler"
-        unless $msg && $msg->isa("LJ::SMS::Message");
-
-    return $msg->body_text =~ /^\s*echo/i ? 1 : 0;
-}
-
-1;
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/SMS/MessageHandler/Friends.pm
--- a/cgi-bin/LJ/SMS/MessageHandler/Friends.pm	Mon Aug 03 15:16:25 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,122 +0,0 @@
-package LJ::SMS::MessageHandler::Friends;
-
-use base qw(LJ::SMS::MessageHandler);
-
-use strict;
-use Carp qw(croak);
-
-sub handle {
-    my ($class, $msg) = @_;
-
-    my $text   = $msg->body_text;
-    my $u      = $msg->from_u;
-    my $maxlen = $u->max_sms_bytes;
-
-    my ($group) = $text =~ /
-        ^\s*
-        f(?:riends)?              # post full or short
-
-        (?:\.                     # optional friends group setting
-         (
-          (?:\"|\').+?(?:\"|\')   # single or double quoted friends group
-          |
-          \S+)                    # single word friends group
-         )?
-
-         \s*$/ix;
-
-    # for quoted strings, the 'group' segment will still have single or double quotes
-    if ($group) {
-        $group =~ s/^(?:\"|\')//;
-        $group =~ s/(?:\"|\')$//;
-    }
-
-    # if no group specified, see if they have a default friend group prop set
-    $group ||= $u->prop('sms_friend_group');
-
-    # try to find the requested friends group and construct a filter mask
-    my $filter;
-    if ($group) {
-        my $groups = LJ::get_friend_group($u);
-        while (my ($bit, $grp) = each %$groups) {
-            next unless $grp->{groupname} =~ /^$group$/i;
-
-            # found the security group the user is asking for
-            $filter = 1 << $grp->{groupnum};
-
-            last;
-        }
-    } else {
-        # we should return the default view friends group
-        my $grp = LJ::get_friend_group($u, { 'name'=> 'Default View' });
-        my $bit = $grp ? $grp->{'groupnum'} : 0;
-        $filter = $bit ? (1 << $bit) : undef;
-    }
-
-    my @entries = LJ::get_friend_items({
-        remoteid   => $u->id,
-        itemshow   => 5,
-        skip       => 0,
-        showtypes  => 'PYC',
-        u          => $u,
-        userid     => $u->id,
-        filter     => $filter,
-    });
-
-    my $resp = "";
-
-    foreach my $item (@entries) {
-
-        # each $item is just a magical hashref.  from that we'll
-        # need to construct actual LJ::Entry objects to process
-        # and eventually return via SMS
-
-        my $entry = LJ::Entry->new_from_item_hash($item)
-            or die "unable to construct entry object";
-
-        my $seg = $entry->as_sms(for_u => $u, maxlen => 20);
-
-        # could we append this segment without violating the
-        # SMS message length boundary?
-        last unless LJ::SMS->can_append($u, $resp, $seg);
-
-        # still more buffer room, append another
-        $resp .= $seg;
-
-        # now try to append "\n\n" if that won't throw us over the limit
-        # -- if successful, loop again to try to add a new message, 
-        #    the finally strip off any \n\n ... 
-        last unless LJ::SMS->can_append($u, $resp, "\n");
-
-        $resp .= "\n";
-    }
-
-    # trim trailing newlines
-    $resp =~ s/\n+$//;
-
-    # ... but what if there actually were no entries?
-    unless ($resp) {
-        $resp = "Sorry, you currently have no friends page entries";
-        $resp .= " for group '$group'" if $group;
-        $resp .= ")";
-    }
-
-    my $resp_msg = eval { $msg->respond($resp) };
-
-    # FIXME: do we set error status on $resp?
-
-    # mark the requesting (source) message as processed
-    $msg->status($@ ? ('error' => $@) : 'success');
-
-    return 1;
-}
-
-sub owns {
-    my ($class, $msg) = @_;
-    croak "invalid message passed to MessageHandler"
-        unless $msg && $msg->isa("LJ::SMS::Message");
-
-    return $msg->body_text =~ /^\s*f(?:riends)?\.?\s*$/i ? 1 : 0;
-}
-
-1;
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/SMS/MessageHandler/Help.pm
--- a/cgi-bin/LJ/SMS/MessageHandler/Help.pm	Mon Aug 03 15:16:25 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-package LJ::SMS::MessageHandler::Help;
-
-use base qw(LJ::SMS::MessageHandler);
-
-use strict;
-use Carp qw(croak);
-
-# handle messages from unverified users
-sub unverified_user_ok {
-    my ($class, $u) = @_;
-
-    return 1;
-}
-
-sub handle {
-    my ($class, $msg) = @_;
-
-    my $body_text = 
-        LJ::run_hook("smscmd_help_text", $msg) ||
-        "This is the $LJ::SITENAME SMS Gateway!  Baaaaaaaah.";
-
-    my $resp = eval { $msg->respond($body_text, no_quota => 1) };
-
-    # mark the requesting (source) message as processed
-    $msg->status($@ ? ('error' => $@) : 'success');
-}
-
-sub owns {
-    my ($class, $msg) = @_;
-    croak "invalid message passed to MessageHandler"
-        unless $msg && $msg->isa("LJ::SMS::Message");
-
-    return $msg->body_text =~ /^\s*help(?!\S)/i ? 1 : 0;
-}
-
-1;
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/SMS/MessageHandler/ILike.pm
--- a/cgi-bin/LJ/SMS/MessageHandler/ILike.pm	Mon Aug 03 15:16:25 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-package LJ::SMS::MessageHandler::ILike;
-
-use base qw(LJ::SMS::MessageHandler);
-
-use strict;
-use Carp qw(croak);
-
-sub handle {
-    my ($class, $msg) = @_;
-
-    my $u = $msg->from_u
-        or die "no from_u for ILike message";
-
-    my $text = $msg->body_text;
-    $text =~ s/^\s*i\s+like\s+//i;
-
-    # now all that's left are interests
-    my @ints_to_add = LJ::interest_string_to_list($text);
-
-    # in the case where the original body text is >= 160 characters,
-    # we assume that they've bumped up against the edge of SMS's
-    # length capability and most likely the last interest has been 
-    # cut off... in this case, we'll pop from @ints_to_add
-
-    # FIXME: don't hardcode 160
-    if (length $msg->body_text >= 160 && $msg->body_text =~ /$ints_to_add[-1]$/i) {
-        warn "truncating message: {" . length($msg->body_text) . "} " . $msg->body_text . "\n";
-        pop @ints_to_add;
-    }
-
-    # load interests
-    my %ints_old = (map { $_->[1] => $_->[0] } 
-                    @{ LJ::get_interests($u, { forceids => 1 }) || []});
-
-    my @ints_new = keys %ints_old;
-    push @ints_new, @ints_to_add;
-
-    LJ::set_interests($u, \%ints_old, \@ints_new)
-        or die "Unable to set interests: " . join(",", @ints_new);
-
-    # mark the requesting (source) message as processed
-    # -- we'd die before now if there was an error
-    $msg->status('success');
-}
-
-sub owns {
-    my ($class, $msg) = @_;
-    croak "invalid message passed to MessageHandler"
-        unless $msg && $msg->isa("LJ::SMS::Message");
-
-    return $msg->body_text =~ /^\s*i\s+like\s+/i ? 1 : 0;
-}
-
-1;
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/SMS/MessageHandler/Menu.pm
--- a/cgi-bin/LJ/SMS/MessageHandler/Menu.pm	Mon Aug 03 15:16:25 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-package LJ::SMS::MessageHandler::Menu;
-
-use base qw(LJ::SMS::MessageHandler);
-
-use strict;
-use Carp qw(croak);
-
-sub handle {
-    my ($class, $msg) = @_;
-
-    my $resp = eval { $msg->respond
-                          ("Avail.cmnds: (P)OST, (F)RIENDS, (R)EAD, (A)DD, I LIKE, HELP. " .
-                           "E.g. to read username frank send \"READ frank\". STOP2stop, " .
-                           "HELP4help. Std msg chrgs apply.");
-                      };
-
-    # FIXME: do we set error status on $resp?
-
-    # mark the requesting (source) message as processed
-    $msg->status($@ ? ('error' => $@) : 'success');
-}
-
-sub owns {
-    my ($class, $msg) = @_;
-    croak "invalid message passed to MessageHandler"
-        unless $msg && $msg->isa("LJ::SMS::Message");
-
-    return $msg->body_text =~ /^\s*m(?:enu)?\s*$/i ? 1 : 0;
-}
-
-1;
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/SMS/MessageHandler/Post.pm
--- a/cgi-bin/LJ/SMS/MessageHandler/Post.pm	Mon Aug 03 15:16:25 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,132 +0,0 @@
-package LJ::SMS::MessageHandler::Post;
-
-use base qw(LJ::SMS::MessageHandler);
-
-use strict;
-use Carp qw(croak);
-
-sub handle {
-    my ($class, $msg) = @_;
-
-    my $text = $msg->body_text;
-
-    my ($sec, $subject, $body) = $text =~ /
-        ^\s*
-        (?:                       # the "post" portion is optional
-         p(?:ost)?                # post full or short
-
-        (?:\.                     # optional security setting
-         (
-          (?:\"|\').+?(?:\"|\')   # single or double quoted security
-          |
-          \S+)                    # single word security
-         )?
-
-         \s+
-         )?
-
-         (?:                      # optional subject
-          (?:\[|\()(.+?)(?:\]|\)) # [...] or (...) subject
-          )?
-
-         \s*
-
-         (.+)                     # teh paylod!
-
-         \s*$/isx;
-
-    # for quoted strings, the 'sec' segment will still have single or double quotes
-    if ($sec) {
-        $sec =~ s/^(?:\"|\')//;
-        $sec =~ s/(?:\"|\')$//;
-    }
-
-    my $u = $msg->from_u;
-    my $secmask = 0;
-
-    if ($sec) {
-        if ($sec =~ /^pu/i) {
-            $sec = 'public';
-        } elsif ($sec =~ /^fr/i) {
-            $sec = 'usemask';
-            $secmask = 1;
-        } elsif ($sec =~ /^pr/i) {
-            $sec = 'private';
-        } else {
-            my $groups = LJ::get_friend_group($u);
-
-            my $found = 0;
-            while (my ($bit, $grp) = each %$groups) {
-                next unless $grp->{groupname} =~ /^\Q$sec\E$/i;
-
-                # found the security group the user is asking for
-                $sec = 'usemask';
-                $secmask = 1 << $bit;
-
-                $found++;
-                last;
-            }
-
-            # if the given security arg was an invalid friends group,
-            # post the entry as private
-            $sec = 'private' unless $found;
-        }
-    }
-
-    # initiate a protocol request to post this message
-    my $err;
-    my $default_subject = "Posted using <a href='$LJ::SITEROOT/manage/sms/'>$LJ::SMS_TITLE</a>";
-    my $res = LJ::Protocol::do_request
-        ("postevent",
-         { 
-             ver        => 1,
-             username   => $u->{user},
-             lineendings => 'unix',
-             subject     => $subject || $default_subject,
-             event       => $body,
-             props       => { 
-                 sms_msgid => $msg->id,
-                 useragent => 'sms',
-             },
-             security    => $sec,
-             allowmask   => $secmask,
-             tz          => 'guess' 
-         },
-         \$err, { 'noauth' => 1 }
-         );
-
-    # set metadata on this sms message indicating the 
-    # type of handler used and the jitemid of the resultant
-    # journal post
-    $msg->meta
-        ( post_jitemid => $res->{itemid},
-          post_error   => $err,
-          );
-
-    # if we got a jitemid and the user wants to be automatically notified
-    # of new comments on this post via SMS, add a subscription to it
-    my $post_notify = $u->prop('sms_post_notify');
-    if ($res->{itemid} && $post_notify eq 'SMS') {
-
-        # get an entry object to subscribe to
-        my $entry = LJ::Entry->new($u, jitemid => $res->{itemid})
-            or die "Could not load entry object";
-
-        $u->subscribe_entry_comments_via_sms($entry);
-    }
-
-    $msg->status($err ? 
-                 ('error' => "Error posting to journal: $err") : 'success');
-
-    return 1;
-}
-
-sub owns {
-    my ($class, $msg) = @_;
-    croak "invalid message passed to MessageHandler"
-        unless $msg && $msg->isa("LJ::SMS::Message");
-
-    return $msg->body_text =~ /^\s*p(?:ost)?[\.\s]/i ? 1 : 0;
-}
-
-1;
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/SMS/MessageHandler/PostComm.pm
--- a/cgi-bin/LJ/SMS/MessageHandler/PostComm.pm	Mon Aug 03 15:16:25 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,113 +0,0 @@
-package LJ::SMS::MessageHandler::PostComm;
-
-use base qw(LJ::SMS::MessageHandler);
-
-use strict;
-use Carp qw(croak);
-
-sub handle {
-    my ($class, $msg) = @_;
-
-    my $text = $msg->body_text;
-
-    my ($commname, $sec, $subject, $body) = $text =~ /
-        ^\s*
-        p(?:ost)?c(?:omm)?        # post full or short
-
-        (?:\.([^\s\.]+))          # community username
-
-        (?:\.                     # optional security setting
-         (
-          (?:\"|\').+?(?:\"|\')   # single or double quoted security
-          |
-          \S+
-          )                       # single word security
-         )?
-
-         \s+
-
-         (?:                      # optional subject
-          (?:\[|\()(.+?)(?:\]|\)) # [...] or (...) subject
-          )?
-
-         \s*
-
-         (.+)                     # teh paylod!
-
-         \s*$/isx; 
-
-    # for quoted strings, the 'sec' segment will still have single or double quotes
-    if ($sec) {
-        $sec =~ s/^(?:\"|\')//;
-        $sec =~ s/(?:\"|\')$//;
-    }
-
-    my $u = $msg->from_u;
-    my $secmask = 0;
-
-    if ($sec) {
-        if ($sec =~ /^pu/i) {
-            $sec = 'public';
-        } elsif ($sec =~ /^(fr|me)/i) { #friends or members
-            $sec = 'usemask';
-            $secmask = 1;
-        } else {
-            # fall back to posting members-only if we can't identify it
-            $sec = 'usemask';
-            $secmask = 1;
-        }
-    }
-
-    # initiate a protocol request to post this message
-    my $err;
-    my $default_subject = "Posted using <a href='$LJ::SITEROOT/manage/sms/'>$LJ::SMS_TITLE</a>";
-    my $res = LJ::Protocol::do_request
-        ("postevent",
-         { 
-             ver         => 1,
-             username    => $u->{user},
-             usejournal  => $commname,
-             lineendings => 'unix',
-             subject     => $subject || $default_subject,
-             event       => $body,
-             props       => {
-                 sms_msgid => $msg->id,
-                 useragent => 'sms',
-             },
-             security    => $sec,
-             allowmask   => $secmask,
-             tz          => 'guess' 
-         },
-         \$err, { 'noauth' => 1 }
-         );
-
-    # try to load the community object so that we can add the
-    # postcomm_journalid prop below if it was actually a valid
-    # community... otherwise the prop will not be set and 
-    # we'll error with whatever the protocol returned.
-    my $commu = LJ::load_user($commname);
-
-    # set metadata on this sms message indicating the 
-    # type of handler used and the jitemid of the resultant
-    # journal post
-    $msg->meta
-        ( postcomm_journalid => ($commu ? $commu->id : undef),
-          postcomm_jitemid   => $res->{itemid},
-          postcomm_error     => $err,
-          );
-
-    $msg->status($err ? 
-                 ('error' => "Error posting to community: $err") : 'success');
-
-    return 1;
-}
-
-sub owns {
-    my ($class, $msg) = @_;
-    croak "invalid message passed to MessageHandler"
-        unless $msg && $msg->isa("LJ::SMS::Message");
-
-    return $msg->body_text =~ /^\s*p(?:ost)?c/i ? 1 : 0;
-}
-
-1;
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/SMS/MessageHandler/Read.pm
--- a/cgi-bin/LJ/SMS/MessageHandler/Read.pm	Mon Aug 03 15:16:25 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
-package LJ::SMS::MessageHandler::Read;
-
-use base qw(LJ::SMS::MessageHandler);
-
-use strict;
-use Carp qw(croak);
-
-sub handle {
-    my ($class, $msg) = @_;
-
-    my $text   = $msg->body_text;
-    my $remote = $msg->from_u;
-    my $maxlen = $remote->max_sms_bytes;
-
-    my ($page, $user) = $text =~ /
-        ^\s*
-        r(?:ead)?                 # read full or short
-
-        (?:\.                     # optional page number
-         (\d+)                    # numeric page to retrieve
-         )?
-
-        \s+
-
-        (\S{1,15})                # optional friends group setting
-
-         \s*$/ix;
-
-    $page ||= 1;
-    $page = 1 if $page > 100;
-
-    my $u = LJ::load_user($user)
-        or die "nonexistant user: $user";
-
-    my $err;
-    my ($item) = $u->recent_items(
-        clusterid     => $u->{clusterid},
-        clustersource => 'slave',
-        remote        => $remote,
-        itemshow      => 1,
-        order         => 'logtime',
-        err           => \$err,
-    );
-
-    my $resp = "";
-
-    # no entries for this user?
-    unless ($item) {
-        $resp = "Sorry, user '$user' has posted no entries";
-        # now fall through to sending phase
-    }
-
-    # have an entry, try to process it
-    if ($item) {
-        my $entry = LJ::Entry->new_from_item_hash($u, $item)
-            or die "unable to construct entry object";
-
-        # $item is just a magical hashref.  from that we'll need to 
-        # construct an actual LJ::Entry object to process and 
-        # eventually return via SMS
-
-        $resp = $entry->as_paged_sms(for_u => $remote, page => $page);
-
-        # trim trailing newlines
-        $resp =~ s/\n+$//;
-    }
-
-    my $resp_msg = eval { $msg->respond($resp) };
-
-    # FIXME: do we set error status on $resp?
-
-    # mark the requesting (source) message as processed
-    $msg->status($@ ? ('error' => $@) : 'success');
-
-    return 1;
-}
-
-sub owns {
-    my ($class, $msg) = @_;
-    croak "invalid message passed to MessageHandler"
-        unless $msg && $msg->isa("LJ::SMS::Message");
-
-    return $msg->body_text =~ /^\s*r(?:ead)(?!\S)/i ? 1 : 0;
-}
-
-1;
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/SMS/MessageHandler/Stop.pm
--- a/cgi-bin/LJ/SMS/MessageHandler/Stop.pm	Mon Aug 03 15:16:25 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-package LJ::SMS::MessageHandler::Stop;
-
-use base qw(LJ::SMS::MessageHandler);
-
-use strict;
-use Carp qw(croak);
-
-sub handle {
-    my ($class, $msg) = @_;
-
-    my $u = $msg->from_u or croak "No user in message";
-
-    if ($msg->body_text =~ /stop all/i || $u->prop('sms_yes_means') eq 'stop') {
-        LJ::SMS::stop_all($u, $msg);
-      } else {
-
-          $msg->respond("$LJ::SMS_TITLE: Disable $LJ::SMS_TITLE? ".
-                        "Send YES to confirm. Std msg chrgs apply.", no_quota => 1);
-
-          $u->set_prop('sms_yes_means', 'stop');
-      }
-
-    # mark the requesting (source) message as processed
-    $msg->status($@ ? ('error' => $@) : 'success');
-}
-
-sub owns {
-    my ($class, $msg) = @_;
-    croak "invalid message passed to MessageHandler"
-        unless $msg && $msg->isa("LJ::SMS::Message");
-
-    my @synonyms = qw (
-                       stop
-                       end
-                       cancel
-                       unsub
-                       unsubscribe
-                       quit
-                       );
-
-    foreach my $syn (@synonyms) {
-        return 1 if $msg->body_text =~ /^\s*$syn(?!\S)/i;
-    }
-
-    return 0;
-}
-
-1;
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/Setting/Display/SMSHistory.pm
--- a/cgi-bin/LJ/Setting/Display/SMSHistory.pm	Mon Aug 03 15:16:25 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-package LJ::Setting::Display::SMSHistory;
-use base 'LJ::Setting';
-use strict;
-use warnings;
-
-sub should_render {
-    my ($class, $u) = @_;
-
-    return $u && !$u->is_community ? 1 : 0;
-}
-
-sub label {
-    my $class = shift;
-
-    return $class->ml('setting.display.smshistory.label');
-}
-
-sub option {
-    my ($class, $u, $errs, $args) = @_;
-
-    return "<a href='$LJ::SITEROOT/manage/sms/status.bml'>" . $class->ml('setting.display.smshistory.option', { sms_title => $LJ::SMS_TITLE }) . "</a>";
-}
-
-1;
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/Test.pm
--- a/cgi-bin/LJ/Test.pm	Mon Aug 03 15:16:25 2009 +0000
+++ b/cgi-bin/LJ/Test.pm	Mon Aug 03 15:24:55 2009 +0000
@@ -16,7 +16,7 @@ use Class::Autouse qw(
                       LJ::ModuleCheck
                       );
 @ISA = qw(Exporter);
-@EXPORT = qw(memcache_stress with_fake_memcache temp_user temp_comm temp_feed alloc_sms_num fake_apache);
+@EXPORT = qw(memcache_stress with_fake_memcache temp_user temp_comm temp_feed fake_apache);
 
 my @temp_userids;  # to be destroyed later
 END {
@@ -181,18 +181,6 @@ sub memcache_stress (&) {
     LJ::MemCache::set_memcache($pre_mem);
 }
 
-sub alloc_sms_num {
-    my $sms_num;
-
-    for (1..100) {
-        $sms_num = '+1';
-        $sms_num .= int(rand(10)) foreach (1..10);
-        return $sms_num unless LJ::SMS->num_to_uid($sms_num);
-    }
-
-    die "Unable to allocate SMS number after 100 tries";
-}
-
 package LJ::Test::FakeMemCache;
 # duck-typing at its finest!
 # this is a fake Cache::Memcached object which implements the
@@ -287,28 +275,6 @@ sub forget_dead_hosts {}
 
 
 package LJ::User;
-
-# set the user up for sms
-sub t_activate_sms {
-    my ($u) = @_;
-    $u->set_sms_number(
-                       LJ::Test::alloc_sms_num(),
-                       verified => 'Y'
-                       );
-}
-
-# pretend the user sent us an SMS
-sub t_receive_sms {
-    my ($u, $message) = @_;
-
-    my $msg = LJ::SMS::Message->new(
-                                    owner => $u,
-                                    from => $u,
-                                    body_text => $message,
-                                    );
-
-    LJ::SMS::MessageHandler->handle($msg);
-}
 
 # post a fake entry in a community journal
 sub t_post_fake_comm_entry {
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/LJ/User.pm
--- a/cgi-bin/LJ/User.pm	Mon Aug 03 15:16:25 2009 +0000
+++ b/cgi-bin/LJ/User.pm	Mon Aug 03 15:24:55 2009 +0000
@@ -28,8 +28,6 @@ use DW::Logic::ProfilePage;
 
 use Class::Autouse qw(
                       LJ::Subscription
-                      LJ::SMS
-                      LJ::SMS::Message
                       LJ::Identity
                       LJ::Auth
                       LJ::Jabber::Presence
@@ -68,7 +66,6 @@ use Class::Autouse qw(
 ###  20. Page Notices Functions
 ###  21. Password Functions
 ###  22. Priv-Related Functions
-###  23. SMS-Related Functions
 ###  24. Styles and S2-Related Functions
 ###  25. Subscription, Notifiction, and Messaging Functions
 ###  26. Syndication-Related Functions
@@ -4371,184 +4368,6 @@ sub revoke_priv_all {
 
 
 ########################################################################
-###  23. SMS-Related Functions
-###   FIXME: Determine which of these are TxtLJ backend (bug 199). All?
-
-
-sub add_sms_quota {
-    my ($u, $qty, $type) = @_;
-
-    return LJ::SMS->add_sms_quota($u, $qty, $type);
-}
-
-
-sub can_use_sms {
-    my $u = shift;
-    return LJ::SMS->can_use_sms($u);
-}
-
-
-sub delete_sms_number {
-    my $u = shift;
-    return LJ::SMS->replace_mapping($u, undef);
-}
-
-
-sub max_sms_bytes {
-    return LJ::SMS->max_sms_bytes( @_ );
-}
-
-
-sub max_sms_substr {
-    return LJ::SMS->max_sms_substr( @_ );
-}
-
-
-# opts:
-#   no_quota = don't check user quota or deduct from their quota for sending a message
-sub send_sms {
-    my ($u, $msg, %opts) = @_;
-
-    return 0 unless $u;
-
-    croak "invalid user object for object method"
-        unless LJ::isu($u);
-    croak "invalid LJ::SMS::Message object to send"
-        unless $msg && $msg->isa("LJ::SMS::Message");
-
-    my $ret = $msg->send(%opts);
-
-    return $ret;
-}
-
-
-sub send_sms_text {
-    my ($u, $msgtext, %opts) = @_;
-
-    my $msg = LJ::SMS::Message->new(
-                                    owner => $u,
-                                    to    => $u,
-                                    type  => 'outgoing',
-                                    body_text => $msgtext,
-                                    );
-
-    # if user specified a class_key for send, set it on
-    # the msg object
-    if ($opts{class_key}) {
-        $msg->class_key($opts{class_key});
-    }
-
-    $msg->send(%opts);
-}
-
-
-sub set_sms_number {
-    my ($u, $num, %opts) = @_;
-    my $verified = delete $opts{verified};
-
-    # these two are only checked if $num, because it's possible
-    # to just pass ($u, undef, undef) to delete the mapping
-    if ($num) {
-        croak "invalid number" unless $num =~ /^\+\d+$/;
-        croak "invalid verified flag" unless $verified =~ /^[YN]$/;
-    }
-
-    return LJ::SMS->replace_mapping($u, $num, $verified);
-}
-
-
-sub set_sms_number_verified {
-    my ($u, $verified) = @_;
-
-    return LJ::SMS->set_number_verified($u, $verified);
-}
-
-
-sub set_sms_quota {
-    my ($u, $qty, $type) = @_;
-
-    return LJ::SMS->set_sms_quota($u, $qty, $type);
-}
-
-
-sub sms_active {
-    my $u = shift;
-
-    # active if the user has a verified sms number
-    return LJ::SMS->configured_for_user($u);
-}
-
-
-sub sms_active_number {
-    my $u = shift;
-    return LJ::SMS->uid_to_num($u, verified_only => 1);
-}
-
-
-# this method returns any mapped number for the user,
-# regardless of its verification status
-sub sms_mapped_number {
-    my $u = shift;
-    return LJ::SMS->uid_to_num($u, verified_only => 0);
-}
-
-
-sub sms_message_count {
-    my $u = shift;
-    return LJ::SMS->message_count($u, @_);
-}
-
-
-sub sms_num_instime {
-    my $u = shift;
-
-    return LJ::SMS->num_instime($u->sms_mapped_number);
-}
-
-
-sub sms_pending {
-    my $u = shift;
-
-    # pending if user has an unverified number
-    return LJ::SMS->pending_for_user($u);
-}
-
-
-sub sms_pending_number {
-    my $u = shift;
-    my $num = LJ::SMS->uid_to_num($u, verified_only => 0);
-    return undef unless $num;
-    return $num if LJ::SMS->num_is_pending($num);
-    return undef;
-}
-
-
-sub sms_quota_remaining {
-    return LJ::SMS->sms_quota_remaining( @_ );
-}
-
-
-sub sms_register_time_remaining {
-    my $u = shift;
-
-    return LJ::SMS->num_register_time_remaining($u);
-}
-
-
-sub sms_sent_message_count {
-    my $u = shift;
-    return LJ::SMS->sent_message_count($u, @_);
-}
-
-
-sub subtract_sms_quota {
-    my ($u, $qty, $type) = @_;
-
-    return LJ::SMS->subtract_sms_quota($u, $qty, $type);
-}
-
-
-########################################################################
 ###  24. Styles and S2-Related Functions
 
 
@@ -5310,33 +5129,6 @@ sub opt_getting_started {
     my $prop = $u->raw_prop('opt_getting_started') || 'Y';
 
     return $prop;
-}
-
-
-# FIXME: We're not using TxtLJ, so this can probably go.
-# Came from section 25.
-sub subscribe_entry_comments_via_sms {
-    my ($u, $entry) = @_;
-    croak "Invalid LJ::Entry passed"
-        unless $entry && $entry->isa("LJ::Entry");
-
-    # don't subscribe if user is over subscription limit
-    return unless $u->can_add_inbox_subscription;
-
-    my %sub_args =
-        ( event   => "LJ::Event::JournalNewComment",
-          journal => $u,
-          arg1    => $entry->ditemid, );
-
-    $u->subscribe
-        ( method  => "LJ::NotificationMethod::SMS",
-          %sub_args, );
-
-    $u->subscribe
-        ( method  => "LJ::NotificationMethod::Inbox",
-          %sub_args, );
-
-    return 1;
 }
 
 
@@ -6129,7 +5921,7 @@ sub unset_remote
 #       'R' == memory (remembrance), 'K' == keyword id,
 #       'P' == phone post, 'C' == pending comment
 #       'O' == pOrtal box id, 'V' == 'vgift', 'E' == ESN subscription id
-#       'Q' == Notification Inbox, 'G' == 'SMS messaGe'
+#       'Q' == Notification Inbox, 
 #       'D' == 'moDule embed contents', 'I' == Import data block
 #       'Z' == import status item, 'X' == eXternal account
 #
@@ -6250,9 +6042,6 @@ sub alloc_user_counter
                                       undef, $uid);
     } elsif ($dom eq "Q") {
         $newmax = $u->selectrow_array("SELECT MAX(qid) FROM notifyqueue WHERE userid=?",
-                                      undef, $uid);
-    } elsif ($dom eq "G") {
-        $newmax = $u->selectrow_array("SELECT MAX(msgid) FROM sms_msg WHERE userid=?",
                                       undef, $uid);
     } elsif ($dom eq "D") {
         $newmax = $u->selectrow_array("SELECT MAX(moduleid) FROM embedcontent WHERE userid=?",
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/ljdb.pl
--- a/cgi-bin/ljdb.pl	Mon Aug 03 15:16:25 2009 +0000
+++ b/cgi-bin/ljdb.pl	Mon Aug 03 15:24:55 2009 +0000
@@ -212,7 +212,7 @@ package LJ;
 
 use Carp qw(croak);
 
-# when calling a supported function (currently: LJ::load_user() or LJ::load_userid*), LJ::SMS::load_mapping()
+# when calling a supported function (currently: LJ::load_user() or LJ::load_userid*)
 # ignores in-process request cache, memcache, and selects directly
 # from the global master
 #
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/ljdefaults.pl
--- a/cgi-bin/ljdefaults.pl	Mon Aug 03 15:16:25 2009 +0000
+++ b/cgi-bin/ljdefaults.pl	Mon Aug 03 15:24:55 2009 +0000
@@ -350,10 +350,6 @@
         }
     }
 
-    # sms defaults
-    $LJ::SMS_DOMAIN ||= $LJ::DOMAIN;
-    $LJ::SMS_TITLE  ||= "$LJ::SITENAMESHORT SMS";
-
     # random user defaults to a week
     $RANDOM_USER_PERIOD = 7;
 
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 cgi-bin/ljlib.pl
--- a/cgi-bin/ljlib.pl	Mon Aug 03 15:16:25 2009 +0000
+++ b/cgi-bin/ljlib.pl	Mon Aug 03 15:24:55 2009 +0000
@@ -93,8 +93,6 @@ sub END { LJ::end_request(); }
                     "user_schools", "portal_config", "portal_box_prop",
                     "loginlog", "active_user", "userblobcache",
                     "notifyqueue", "cprod", "urimap",
-                    "sms_msg", "sms_msgprop", "sms_msgack",
-                    "sms_msgtext", "sms_msgerror",
                     "jabroster", "jablastseen", "random_user_set",
                     "poll2", "pollquestion2", "pollitem2",
                     "pollresult2", "pollsubmission2",
@@ -335,26 +333,6 @@ sub theschwartz {
     $LJ::SchwartzClient{$role} = TheSchwartz->new(databases => \@dbs);
 
     return $LJ::SchwartzClient{$role};
-}
-
-sub sms_gateway {
-    my $conf_key = shift;
-
-    # effective config key is 'default' if one wasn't specified or nonexistent
-    # config was specified, meaning fall back to default
-    unless ($conf_key && $LJ::SMS_GATEWAY_CONFIG{$conf_key}) {
-        $conf_key = 'default';
-    }
-
-    return $LJ::SMS_GATEWAY{$conf_key} ||= do {
-        my $class = "DSMS::Gateway" .
-            ($LJ::SMS_GATEWAY_TYPE ? "::$LJ::SMS_GATEWAY_TYPE" : "");
-
-        eval "use $class";
-        die "unable to use $class: $@" if $@;
-
-        $class->new(config => $LJ::SMS_GATEWAY_CONFIG{$conf_key});
-    };
 }
 
 sub gtop {
@@ -1317,8 +1295,6 @@ sub start_request
     %LJ::REQ_CACHE_USER_ID = ();      # users by id
     %LJ::REQ_CACHE_REL = ();          # relations from LJ::check_rel()
     %LJ::REQ_LANGDATFILE = ();        # caches language files
-    %LJ::SMS::REQ_CACHE_MAP_UID = (); # cached calls to LJ::SMS::num_to_uid()
-    %LJ::SMS::REQ_CACHE_MAP_NUM = (); # cached calls to LJ::SMS::uid_to_num()
     %LJ::S2::REQ_CACHE_STYLE_ID = (); # styleid -> hashref of s2 layers for style
     %LJ::S2::REQ_CACHE_LAYER_ID = (); # layerid -> hashref of s2 layer info (from LJ::S2::load_layer)
     %LJ::S2::REQ_CACHE_LAYER_INFO = (); # layerid -> hashref of s2 layer info (from LJ::S2::load_layer_info)
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 doc/raw/build/ljconfig/ljconfig2db.pl
--- a/doc/raw/build/ljconfig/ljconfig2db.pl	Mon Aug 03 15:16:25 2009 +0000
+++ b/doc/raw/build/ljconfig/ljconfig2db.pl	Mon Aug 03 15:24:55 2009 +0000
@@ -560,22 +560,6 @@ Please see &lt;a href='http://status.exa
             },
             'server_totally_down' => {
                     'desc' => "The site is globally marked as 'down' and users get an error message, as defined by \$SERVER_DOWN_MESSAGE and \$SERVER_DOWN_SUBJECT.  But compared to \$SERVER_DOWN, this error message is done incredibly early before any dispatch to different modules. See also [ljconfig[server_down]].",
-            },
-        },
-
-        'messaging_related' => {
-            'name' => "Messaging Related",
-            'sms_domain' => {
-                    'desc' => "Base domain for SMS service. Defaults to value of [ljconfig[domain]]. You might use this in message footers you send to users.",
-            },
-            'sms_shortcode' => {
-                    'desc' => "Number of your SMS service for users to send to and receive from.",
-                    'example' => "55512",
-            },
-            'sms_title' => {
-                    'desc' => "The name of your <acronym>SMS</acronym> service. Used on <acronym>SMS</acronym> communications and site pages.",
-                    'default' => '$SITENAMESHORT SMS',
-                    'example' => 'TXT$SITENAMEABBREV',
             },
         },
 
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 doc/raw/lj.book/install/ljconfig.disabled.xml
--- a/doc/raw/lj.book/install/ljconfig.disabled.xml	Mon Aug 03 15:16:25 2009 +0000
+++ b/doc/raw/lj.book/install/ljconfig.disabled.xml	Mon Aug 03 15:24:55 2009 +0000
@@ -283,22 +283,6 @@
       <listitem><simpara>Allow QuickReply to be built in to S2 layers.</simpara></listitem>
     </varlistentry>
    <varlistentry>
-      <term>sms</term>
-      <listitem><simpara>Global flag to enable the <acronym>SMS</acronym> messaging feature (and its user-interface) for users.</simpara></listitem>
-    </varlistentry>
-   <varlistentry>
-      <term>sms_post_auto_subscribe</term>
-      <listitem><simpara>Show the <quote>Subscribe me to my <acronym>SMS</acronym> posts via <acronym>SMS</acronym></quote> button to users.</simpara></listitem>
-    </varlistentry>
-   <varlistentry>
-      <term>sms_quota_check</term>
-      <listitem><simpara>Enable checking for how many <acronym>SMS</acronym> messages a user has sent out of their quota.</simpara></listitem>
-    </varlistentry>
-   <varlistentry>
-      <term>sms_ui</term>
-      <listitem><simpara>Enable <acronym>SMS</acronym> user-interface for users. This enables links and management pages.</simpara></listitem>
-    </varlistentry>
-   <varlistentry>
       <term>syncitems</term>
       <listitem><simpara>Enable the <literal>syncitems</literal> client protocol mode, without restarting &apache;.</simpara></listitem>
     </varlistentry>
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 doc/raw/lj.book/install/ljconfig.helpurls.xml
--- a/doc/raw/lj.book/install/ljconfig.helpurls.xml	Mon Aug 03 15:16:25 2009 +0000
+++ b/doc/raw/lj.book/install/ljconfig.helpurls.xml	Mon Aug 03 15:24:55 2009 +0000
@@ -44,10 +44,6 @@
       <listitem><simpara>Explains how to choose a secure password</simpara></listitem>
     </varlistentry>
     <varlistentry>
-      <term>sms_about</term>
-      <listitem><simpara>Explains what the <acronym>SMS</acronym> feature is and how it works</simpara></listitem>
-    </varlistentry>
-    <varlistentry>
       <term>userpic_inactive</term>
       <listitem><simpara>Explains why a userpic might become inactive, and how to make the userpic active again</simpara></listitem>
     </varlistentry>
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 doc/raw/lj.book/install/workers_setup.xml
--- a/doc/raw/lj.book/install/workers_setup.xml	Mon Aug 03 15:16:25 2009 +0000
+++ b/doc/raw/lj.book/install/workers_setup.xml	Mon Aug 03 15:24:55 2009 +0000
@@ -125,7 +125,6 @@ For example:
 For example:
 <informalexample>
 <programlisting>localhost / process-esn = 1
-localhost / process-sms = 1
 localhost / send-email  = 1</programlisting></informalexample></para>
         
 <para>You need to configure <systemitem class="daemon">gearmand</systemitem> servers in <filename>ljconfig.pl</filename>,
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 t/esn-findsubscription.t
--- a/t/esn-findsubscription.t	Mon Aug 03 15:16:25 2009 +0000
+++ b/t/esn-findsubscription.t	Mon Aug 03 15:24:55 2009 +0000
@@ -69,13 +69,6 @@ test_subscription(sub {
                                           journal => $u2,
                                           );
         ok(!$foundsubs, "Couldn't find bogus subscription");
-        $foundsubs = $u1->has_subscription(
-                                          event   => "JournalNewComment",
-                                          method  => "SMS",
-                                          journal => $u2,
-                                          );
-        ok(!$foundsubs, "Couldn't find bogus subscription");
-    }
 
     # look for more general matches
     {
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 t/esn-journalnewentry.t
--- a/t/esn-journalnewentry.t	Mon Aug 03 15:16:25 2009 +0000
+++ b/t/esn-journalnewentry.t	Mon Aug 03 15:24:55 2009 +0000
@@ -113,10 +113,6 @@ sub test_post {
         ok($u2e1, "made a post$suffix");
         is($@, "", "no errors");
 
-        # make sure we got notification
-        $email = $got_notified->($u1);
-        ok($email, "got the sms $state");
-
         # S1 failing case:
         # post an entry on $u1, where nobody's subscribed
         my $u1e1 = eval { $u1->t_post_fake_entry(%opts) };
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 t/notificationmethod-sms.t
--- a/t/notificationmethod-sms.t	Mon Aug 03 15:16:25 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,115 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use Test::More 'no_plan';
-use lib "$ENV{LJHOME}/cgi-bin";
-require 'ljlib.pl';
-
-use LJ::Test qw(temp_user memcache_stress);
-
-use Class::Autouse qw(
-                      LJ::Event::Befriended
-                      LJ::NotificationMethod::SMS
-                      );
-
-local $LJ::_T_NO_SMS_QUOTA = 1;
-
-my $u;
-my $valid_u = sub {
-    return $u = temp_user();
-};
-
-# less duplication of this so we can revalidate
-my $meth;
-my $valid_meth = sub {
-    $meth = eval { LJ::NotificationMethod::SMS->new($u) };
-    ok(ref $meth && ! $@, "valid SMS method instantiated");
-    return $meth;
-};
-
-sub run_tests{
-    {
-        # constructor tests
-        $valid_u->();
-        $valid_meth->();
-
-        $meth = eval { LJ::NotificationMethod::SMS->new() };
-        like($@, qr/invalid user/, "no args passed to constructor");
-
-        $meth = eval { LJ::NotificationMethod::SMS->new({user => 'ugly'}) };
-        like($@, qr/invalid user/, "non-user passed to constructor");
-
-        # test valid case
-        $valid_meth->();
-    }
-
-    # accessor/setter tests
-    {
-        my $mu;
-
-        $valid_u->();
-        $valid_meth->();
-
-        # now we have valid from prev test
-        $mu = eval { $meth->{u} };
-        is($mu, $u, "member u is constructed u");
-
-        $mu = eval { $meth->u };
-        is_deeply($mu, $u, "gotten u is constructed u");
-
-        $mu = eval { $meth->u('foo') };
-        like($@, qr/invalid 'u'/, "setting non-ref");
-
-        $mu = eval { $meth->u($u, 'bar') };
-        like($@, qr/superfluous/, "superfluous args");
-
-        # clear out $u
-        %$u = ();
-        LJ::start_request();
-        $mu = eval { $meth->u };
-        ok(! %$u, "cleared 'u'");
-
-        $valid_u->();
-
-        $mu = eval { $meth->u($u) };
-        is_deeply($mu, $u, "set new 'u' in object");
-    }
-
-    # notify
-    {
-        $valid_u->();
-        $u->set_sms_number("+12345", verified => 'Y');
-        $valid_meth->();
-
-        my $ev;
-
-        my $fromu = $u; # yeah, you can friend yourself
-        $ev = LJ::Event::Befriended->new($u, $fromu);
-        ok(ref $ev && ! $@, "created LJ::Event::Befriended object");
-
-        # failures
-        eval { LJ::NotificationMethod::SMS::notify() };
-        like($@, qr/'notify'.+?object method/, "notify class method");
-
-        eval { $meth->notify };
-        like($@, qr/requires an event/, "notify no events");
-
-        eval { $meth->notify(undef) };
-        like($@, qr/invalid event/, "notify undef event");
-
-        my $str = $ev->as_string;
-
-        my $got_sms = 0;
-        local $LJ::_T_SMS_SEND = sub {
-            my $sms = shift;
-            $got_sms = $sms;
-        };
-
-        $meth->notify($ev);
-        ok($got_sms, "got sms");
-    }
-}
-
-memcache_stress {
-    run_tests;
-}
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 t/sms-handler-postcomm.t
--- a/t/sms-handler-postcomm.t	Mon Aug 03 15:16:25 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use Test::More 'no_plan';
-use lib "$ENV{LJHOME}/cgi-bin";
-
-require "ljlib.pl";
-require "ljprotocol.pl";
-require "communitylib.pl";
-
-use LJ::Entry;
-use LJ::SMS;
-use LJ::SMS::MessageHandler::PostComm;
-use LJ::Test qw(memcache_stress temp_user temp_comm);
-
-run_tests();
-
-sub run_tests {
-
-    # ->owns
-    {
-        # set up test accounts
-        my $u = temp_user();
-        my $user = $u->{user};
-
-        my $c = temp_comm();
-        my $comm = $c->{user};
-
-        # set up account settings
-        $u->set_sms_number('+15555551212', verified => 'Y');
-        LJ::join_community($u, $c, 0, 1);
-        LJ::update_user($u, { status => 'A' });
-
-        foreach my $prefix 
-            ( "postcomm.$comm",
-              "PostComm.$comm",
-              "postc.$comm",
-              "pcomm.$comm",
-              "pc.$comm",
-              "PC.$comm" )
-        {
-            foreach my $sec
-                ("",
-                 ".public",
-                 ".pu",
-                 ".PuBliC",
-                 ".pU",
-                 ".friends",
-                 ".fr",
-                 ".fRieNDS",
-                 ".FR",
-                 # can't use custom/private security on comms
-                 )
-            {
-                foreach my $subj
-                    (map { $_ ? "$_ " : "" }
-                     "",
-                     "[TestSubject]",
-                     "(TestSubject)")
-                {
-                    my $text = "$prefix$sec ${subj}foo";
-
-                    my $msg = LJ::SMS::Message->new
-                        (
-                         owner => $u,
-                         type  => 'incoming',
-                         from  => $u,
-                         body_text => $text
-                         );
-
-                    my $rv = LJ::SMS::MessageHandler::PostComm->owns($msg);
-                    ok($rv, "owns: $text");
-
-                    $rv = eval { LJ::SMS::MessageHandler->handle($msg) };
-                    my $ok = $rv && ! $@ && $msg && $msg->is_success && ! $msg->error;
-                    die $msg->error if $msg->error;
-                    ok($ok, "handle: $text");
-                    warn "rv: $rv, \$@: $@, msg: " . LJ::D($msg) unless $ok;
-
-
-                    my $jitemid = $msg->meta("postcomm_jitemid");
-                    ok($jitemid, "postcomm_jitemid set");
-                    ok($msg->meta("handler_type") eq "PostComm", "handler_type prop set");
-
-                    my $entry = eval { LJ::Entry->new($c, jitemid => $jitemid) };
-                    ok($entry && ! $@, "entry in db");
-                    ok($entry && $entry->event_text eq "foo", "event text matches");
-                    ok($entry && $entry->prop("sms_msgid") eq $msg->id, "event sms_msgid prop matches");
-                }
-            }
-        }
-    }
-
-    # protocol failure
-
-    # protocol success
-
-
-}
diff -r cdcc2fdcdaf2 -r fd9f9a2a1ed4 t/sms-handler-read.t
--- a/t/sms-handler-read.t	Mon Aug 03 15:16:25 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,118 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use Test::More 'no_plan';
-use lib "$ENV{LJHOME}/cgi-bin";
-
-require "ljlib.pl";
-require "ljprotocol.pl";
-require "communitylib.pl";
-
-use LJ::Entry;
-use LJ::SMS;
-use LJ::SMS::MessageHandler::Read;
-use LJ::Test qw(memcache_stress temp_user);
-
-# save the sent message in a global so we can check it
-my $SENT_MSG = undef;
-$LJ::_T_SMS_SEND = sub { $SENT_MSG = shift };
-
-sub run_tests {
-
-    # ->owns
-    {
-        # set up test accounts
-        my $u = temp_user();
-        my $user = $u->{user};
-
-        # set up account settings
-        $u->set_sms_number('+15555551212', verified => 'Y');
-
-        $LJ::DISABLED{sms_quota_check} = 1;
-        LJ::update_user($u, { status => 'A' });
-
-        # post an entry to this user account
-        my $entry = $u->t_post_fake_entry
-            (
-             subject => "This is a test subject",
-             body    => LJ::rand_chars(160*8)
-             );
-
-        # special case, $page0 should be equal to $page1 exactly
-        my $page0_ret;
-        my @pages_ret;
-
-        foreach my $cmd (qw(read ReAd r R)) {
-
-            # common header for each message page
-            # -- declared here and modified throughout test
-            my $header;
-
-          PAGE:
-            foreach my $page (0..25) {
-                my $psuf = $page ? ".$page" : "";
-                my $text = "$cmd$psuf $user";
-
-                # replace {\d} with page number for matching
-                $header =~ s/\(\d+([^\)]*)\)/\($page$1\)/;
-
-                my $msg = LJ::SMS::Message->new
-                    (
-                     owner => $u,
-                     type  => 'incoming',
-                     from  => $u,
-                     to    => '12345',
-                     body_text => $text
-                     );
-
-                my $rv = LJ::SMS::MessageHandler::Read->owns($msg);
-                ok($rv, "owns: $text");
-                $rv = eval { LJ::SMS::MessageHandler->handle($msg) };
-                my $ok = $rv && ! $@ && $msg && $msg->is_success && ! $msg->error;
-                ok($ok && ref $SENT_MSG, "handle: $text");
-
-                {
-                    my $sent = $SENT_MSG;
-                    my $sent_text = $sent->body_text;
-
-                    # special case, page 0 (no page specified) should equal page 1
-                    if ($page == 0) {
-                        $page0_ret = $sent_text;
-                        
-                        # now find the header out of here
-                        my $idx = index($page0_ret, "[" . $entry->subject_orig);
-                        $header = substr($page0_ret, 0, $idx);
-                    }
-                    if ($page == 1) {
-                        ok($page0_ret = $sent_text, "page 0 matches page 1: $text")
-                    }
-                    if ($page > 0) {
-                        last PAGE if $page > 1 && $sent_text eq $page0_ret;
-
-                        my $idx = do { use bytes; length($header) };
-                        $sent_text = substr($sent_text, $idx);
-                        $sent_text =~ s/\.\.\.$//;
-                        push @pages_ret, $sent_text;
-                    }
-                }
-
-                ok($msg->meta("handler_type") eq "Read", "handler_type prop set: $text");
-            }
-
-            {
-                my $subj = $entry->subject_orig;
-                my $body = $entry->event_orig;
-                ok(join("", @pages_ret) =~ /^.+?$subj.+?$body\.*$/, "paging adds up: $cmd");
-            }
-        }
-    }
-
-    # protocol failure
-
-    # protocol success
-
-
-}
-
-run_tests();
-
--------------------------------------------------------------------------------

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org