mark: A photo of Mark kneeling on top of the Taal Volcano in the Philippines. It was a long hike. (Default)
Mark Smith ([staff profile] mark) wrote in [site community profile] changelog2009-09-30 06:32 am

[dw-free] Add text messaging setup to Manage Settings

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

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

Add configuration option for setting your text messaging settings on the
profile page, instead of its own separate page.

Patch by [personal profile] kareila.

Files modified:
  • bin/upgrading/en.dat
  • cgi-bin/DW/Setting/TxtMsgSetup.pm
  • htdocs/manage/settings/index.bml
--------------------------------------------------------------------------------
diff -r 422d252c7618 -r 5f21b4ae3f7b bin/upgrading/en.dat
--- a/bin/upgrading/en.dat	Wed Sep 30 06:22:21 2009 +0000
+++ b/bin/upgrading/en.dat	Wed Sep 30 06:32:35 2009 +0000
@@ -2815,6 +2815,24 @@ setting.synlevel.option.select.summary=B
 
 setting.synlevel.option.select.title=Title Only
 
+setting.txtmsgsetup.details=(<a [[aopts]]>details</a>)
+
+setting.txtmsgsetup.error.notsecured=Information will not be saved if you don't allow anyone to send you messages.
+
+setting.txtmsgsetup.error.number=Phone number is missing or invalid.
+
+setting.txtmsgsetup.error.provider=Missing or invalid service provider.
+
+setting.txtmsgsetup.error.security=Invalid text message security setting.
+
+setting.txtmsgsetup.label=Text Messaging
+
+setting.txtmsgsetup.phone=Phone Number:
+
+setting.txtmsgsetup.select.provider=-- Select Carrier --
+
+setting.txtmsgsetup.vis=Who can send you text messages?
+
 setting.timezone.error.invalid=Invalid time zone.
 
 setting.timezone.label=Time Zone
@@ -2973,6 +2991,8 @@ settings.usermessaging.error.invalid=Inv
 
 settings.usermessaging.helper=Only registered [[sitename]] users can send you messages. You also have options to receive messages only from users on your access list.
 
+settings.usermessaging.opt.a=Everyone
+
 settings.usermessaging.opt.f=Access Only
 
 settings.usermessaging.opt.m=Only Mutual Access
diff -r 422d252c7618 -r 5f21b4ae3f7b cgi-bin/DW/Setting/TxtMsgSetup.pm
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cgi-bin/DW/Setting/TxtMsgSetup.pm	Wed Sep 30 06:32:35 2009 +0000
@@ -0,0 +1,174 @@
+#!/usr/bin/perl
+#
+# DW::Setting::TxtMsgSetup
+#
+# LJ::Setting module for specifying a cell provider and phone number
+# that allows people to send a user text messages via the site.
+# Refactored and repackaged from /manage/profile.
+#
+# Authors:
+#      Jen Griffin <kareila@livejournal.com>
+#
+# Copyright (c) 2009 by Dreamwidth Studios, LLC.
+#
+# This program is free software; you may redistribute it and/or modify it under
+# the same terms as Perl itself.  For a copy of the license, please reference
+# 'perldoc perlartistic' or 'perldoc perlgpl'.
+#
+
+package DW::Setting::TxtMsgSetup;
+use base 'LJ::Setting';
+use strict;
+use warnings;
+
+sub should_render {
+    my ( $class, $u ) = @_;
+    return $u && $u->get_cap( 'textmessaging' ) ? 1 : 0;
+}
+
+sub label {
+    my $class = shift;
+    return $class->ml( 'setting.txtmsgsetup.label' );
+}
+
+sub option {
+    my ( $class, $u, $errs, $args ) = @_;
+    my $key = $class->pkgkey;
+
+    my $tminfo = LJ::TextMessage->tm_info( $u, remap_result => 1 );
+    LJ::text_out( \$_ ) foreach values %$tminfo;
+
+    my $ret = '';
+
+    unless ( $args && $args->{vis_only} ) {
+        unless ( $args && $args->{info_only} ) {
+            $ret .= " <label for='${key}txtmsg_number'>";
+            $ret .= $class->ml( 'setting.txtmsgsetup.phone' );
+            $ret .= "</label>";
+        }
+
+        my $number = $class->get_arg( $args, "txtmsg_number" ) || $tminfo->{number};
+
+        $ret .= LJ::html_text( { name => "${key}txtmsg_number",
+                                 id   => "${key}txtmsg_number",
+                                 value => $number,
+                                 size => 15, maxlength => 40 } );
+
+        my $provider = $class->get_arg( $args, "txtmsg_provider" ) || $tminfo->{provider};
+        my @opts = ( "", $class->ml( 'setting.txtmsgsetup.select.provider' ) );
+        foreach my $p ( LJ::TextMessage::providers() ) {
+            my $info = LJ::TextMessage::provider_info( $p );
+            push @opts, ( $p, $info->{name} );
+        }
+
+        $ret .= LJ::html_select( { name => "${key}txtmsg_provider",
+                                   id   => "${key}txtmsg_provider",
+                                   style => 'width: 25em; margin: 0 0.5em;',
+                                   selected => $provider },
+                                 @opts );
+
+        $ret .= " <label for='${key}txtmsg_provider'>";
+        $ret .= $class->ml( 'setting.txtmsgsetup.details', { aopts => "href='$LJ::SITEROOT/tools/textmessage?mode=details'" } );
+        $ret .= "</label>";
+
+        my $n_errs = $class->errdiv( $errs, "txtmsg_number" );
+        $ret .= "<br />$n_errs" if $n_errs;
+        my $p_errs = $class->errdiv( $errs, "txtmsg_provider" );
+        $ret .= "<br />$p_errs" if $p_errs;
+        $ret .= "<br />";
+    }
+    return $ret if $args && $args->{info_only};
+
+    $tminfo->{security} = 'none'
+        if $u->{'txtmsg_status'} =~ /^(?:off|none)$/;
+    my $security = $class->get_arg( $args, "txtmsg_security" ) || $tminfo->{security};
+
+    my @opts = (
+        all => $class->ml( "settings.usermessaging.opt.a" ),
+        reg => $class->ml( "settings.usermessaging.opt.y" ),
+        friends => $class->ml( "settings.usermessaging.opt.f" ),
+        none    => $class->ml( "settings.usermessaging.opt.n" ),
+    );
+
+    $ret .= "<label for='${key}txtmsg_security'>";
+    $ret .= $class->ml( 'setting.txtmsgsetup.vis' );
+    $ret .= "</label> ";
+
+    $ret .= LJ::html_select( { name => "${key}txtmsg_security",
+                               id   => "${key}txtmsg_security",
+                               selected => $security },
+                             @opts );
+
+    my $errdiv = $class->errdiv( $errs, "txtmsg_security" );
+    $ret .= "<br />$errdiv" if $errdiv;
+
+    return $ret;
+}
+
+sub error_check {
+    my ( $class, $u, $args ) = @_;
+
+    # validate security setting
+    my $security = $class->get_arg( $args, "txtmsg_security" );
+    $class->errors( txtmsg_security => $class->ml( 'setting.txtmsgsetup.error.security' ) )
+        if $security && $security !~ /^(?:all|reg|friends|none)$/;
+
+    # only validate info if security is enforced
+    my $number = $class->get_arg( $args, "txtmsg_number" );
+    my $provider = $class->get_arg( $args, "txtmsg_provider" );
+    if ( $security && $security ne 'none' ) {
+        # check for something that looks like a phone number
+        $class->errors( txtmsg_number => $class->ml( 'setting.txtmsgsetup.error.number' ) )
+            unless $number && $number =~ /^[-+0-9]{9,}$/;
+        # check for valid provider
+        my %valid = map { $_ => 1 } LJ::TextMessage::providers();
+        $class->errors( txtmsg_provider => $class->ml( 'setting.txtmsgsetup.error.provider' ) )
+            unless $provider && $valid{$provider};
+    } else {  # warn them that new info won't be saved
+        my $tminfo = LJ::TextMessage->tm_info( $u, remap_result => 1 );
+        $class->errors( txtmsg_number => $class->ml( 'setting.txtmsgsetup.error.notsecured' ) )
+            if $number && $number ne $tminfo->{number};
+        $class->errors( txtmsg_provider => $class->ml( 'setting.txtmsgsetup.error.notsecured' ) )
+            if $provider && $provider ne $tminfo->{provider};
+    }
+
+    return 1;
+}
+
+sub save {
+    my ( $class, $u, $args ) = @_;
+    $class->error_check( $u, $args );
+
+    my $number = $class->get_arg( $args, "txtmsg_number" );
+    my $provider = $class->get_arg( $args, "txtmsg_provider" );
+    my $security = $class->get_arg( $args, "txtmsg_security" );
+
+    my $tminfo = LJ::TextMessage->tm_info( $u, remap_result => 1 );
+    my $cleared = ( $tminfo->{provider} && ! $provider ) ||
+                  ( $tminfo->{number} && ! $number );
+
+    my $txtmsg_status = $cleared || ( $security && $security eq 'none' )
+                        ? "off" : "on";
+
+    LJ::update_user( $u, { 'txtmsg_status' => $txtmsg_status } );
+
+    my $dbh = LJ::get_db_writer();
+
+    if ( $cleared ) {
+        # clear out existing info
+        $dbh->do( "DELETE FROM txtmsg WHERE userid=?", undef, $u->userid );
+
+    } elsif ( $txtmsg_status eq "on" ) {
+        $dbh->do( "REPLACE INTO txtmsg (userid, provider, number, security)"
+                . " VALUES (?, ?, ?, ?)", undef,
+                  $u->userid, $provider, $number, $security );
+    }
+
+    # clear text message security caches
+    delete $u->{_txtmsgsecurity};
+    $u->memc_delete( "txtmsgsecurity" );
+
+    return 1;
+}
+
+1;
diff -r 422d252c7618 -r 5f21b4ae3f7b htdocs/manage/settings/index.bml
--- a/htdocs/manage/settings/index.bml	Wed Sep 30 06:22:21 2009 +0000
+++ b/htdocs/manage/settings/index.bml	Wed Sep 30 06:32:35 2009 +0000
@@ -93,6 +93,7 @@ body<=
             desc => $ML{'.cat.mobile.desc'},
             settings => [qw(
                 LJ::Setting::EmailPosting
+                DW::Setting::TxtMsgSetup
                 LJ::Setting::Display::MobileApps
             )],
         },
--------------------------------------------------------------------------------