[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
kareila.
Files modified:
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]](https://www.dreamwidth.org/img/silk/identity/user.png)
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 )], }, --------------------------------------------------------------------------------