From 5d4dd5ffef163d270f0244c24731561ff4f69936 Mon Sep 17 00:00:00 2001 From: Michael Andreen Date: Sun, 31 May 2009 23:40:55 +0200 Subject: [PATCH] Sms send and status commands --- Commands/SMS.pm | 90 ++++++++++++++++++++++++++++++++++++++++++++++ database/roles.sql | 8 +++++ ndawn.pl | 2 +- 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 Commands/SMS.pm diff --git a/Commands/SMS.pm b/Commands/SMS.pm new file mode 100644 index 0000000..1b28dc7 --- /dev/null +++ b/Commands/SMS.pm @@ -0,0 +1,90 @@ +#************************************************************************** +# Copyright (C) 2009 by Michael Andreen * +# * +# This program is free software; you can redistribute it and/or modify * +# it under the terms of the GNU General Public License as published by * +# the Free Software Foundation; either version 2 of the License, or * +# (at your option) any later version. * +# * +# This program is distributed in the hope that it will be useful, * +# but WITHOUT ANY WARRANTY; without even the implied warranty of * +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# GNU General Public License for more details. * +# * +# You should have received a copy of the GNU General Public License * +# along with this program; if not, write to the * +# Free Software Foundation, Inc., * +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * +#**************************************************************************/ + +package NDIRC::Commands::SMS; + +use strict; +use warnings; +use feature ':5.10'; + +use Moose; +use MooseX::MethodAttributes; + + +sub sendsms + : Help(.sendsms message | number has to be an international number, like +44234234562 for a uk number or +1234528234 for a north american number) + : ACL(irc_sendsms) + : Type(member) +{ + my ($self,$c,$msg) = @_; + my ($number,$message) = $msg =~ /^(\S+) (.+)$/ or die 'ARGS'; + my $dbh = $c->model; + + if (length $message > 140){ + $c->reply("Message is too long"); + return; + } + if ($number =~ /^\+([1-9]\d+)$/){ + $number = $1; + }else{ + my ($sms) = $dbh->selectrow_array(q{SELECT sms FROM users WHERE username ilike $1} + ,undef,$number); + $sms //= 'No number, or invalid user'; + if ($sms =~ /^\+([1-9]\d+)$/){ + $number = $1; + }else{ + $c->reply("User $number has number '$sms' which is not a valid international number"); + return; + } + } + my $sms = $dbh->prepare(q{ +INSERT INTO sms (uid,number,message) +VALUES((SELECT uid FROM users WHERE hostmask ilike $1),$2,$3) +RETURNING id + }); + $sms->execute($c->host,$number,$message); + my ($id) = $sms->fetchrow_array; + $c->reply("Message added to queue, you can see the status with: .smsstatus $id"); +} + +sub smsstatus + : Help(.smsstatus smsid | Gives information about a given sms) + : ACL(irc_smsstatus) + : Type(member) +{ + my ($self,$c,$msg) = @_; + my ($id) = $msg =~ /(\d+)/ or die 'ARGS'; + my $dbh = $c->model; + + my $sms = $dbh->selectrow_hashref(q{ +SELECT s.id, u.username, s.number, s.status, s.cost + ,s.time AT TIME ZONE 'GMT' AS time +FROM sms s + JOIN users u USING (uid) +WHERE id = $1 + }, undef, $id); + + if($sms->{id}){ + $c->reply("SMS $sms->{id} was sent by $sms->{username} to $sms->{number} cost: $sms->{cost}. Last status at $sms->{time}: $sms->{status}"); + }else{ + $c->reply("Could not find any sms with id: $id"); + } +} + +1; diff --git a/database/roles.sql b/database/roles.sql index 7526723..eafc00d 100644 --- a/database/roles.sql +++ b/database/roles.sql @@ -34,6 +34,8 @@ INSERT INTO roles VALUES('irc_settype'); INSERT INTO roles VALUES('irc_calltake'); INSERT INTO roles VALUES('irc_setcalc'); INSERT INTO roles VALUES('irc_getcalc'); +INSERT INTO roles VALUES('irc_sendsms'); +INSERT INTO roles VALUES('irc_smsstatus'); INSERT INTO group_roles (gid,role) VALUES(1,'irc_p_nick'); INSERT INTO group_roles (gid,role) VALUES(1,'irc_p_intel'); @@ -69,6 +71,8 @@ INSERT INTO group_roles (gid,role) VALUES(1,'irc_settype'); INSERT INTO group_roles (gid,role) VALUES(1,'irc_calltake'); INSERT INTO group_roles (gid,role) VALUES(1,'irc_setcalc'); INSERT INTO group_roles (gid,role) VALUES(1,'irc_getcalc'); +INSERT INTO group_roles (gid,role) VALUES(1,'irc_sendsms'); +INSERT INTO group_roles (gid,role) VALUES(1,'irc_smsstatus'); INSERT INTO group_roles (gid,role) VALUES(2,'irc_gs'); INSERT INTO group_roles (gid,role) VALUES(2,'irc_scan'); @@ -106,6 +110,8 @@ INSERT INTO group_roles (gid,role) VALUES(3,'irc_settype'); INSERT INTO group_roles (gid,role) VALUES(3,'irc_calltake'); INSERT INTO group_roles (gid,role) VALUES(3,'irc_setcalc'); INSERT INTO group_roles (gid,role) VALUES(3,'irc_getcalc'); +INSERT INTO group_roles (gid,role) VALUES(3,'irc_sendsms'); +INSERT INTO group_roles (gid,role) VALUES(3,'irc_smsstatus'); INSERT INTO group_roles (gid,role) VALUES(4,'irc_points_others'); INSERT INTO group_roles (gid,role) VALUES(4,'irc_a'); @@ -130,6 +136,8 @@ INSERT INTO group_roles (gid,role) VALUES(6,'irc_settype'); INSERT INTO group_roles (gid,role) VALUES(6,'irc_calltake'); INSERT INTO group_roles (gid,role) VALUES(6,'irc_setcalc'); INSERT INTO group_roles (gid,role) VALUES(6,'irc_getcalc'); +INSERT INTO group_roles (gid,role) VALUES(6,'irc_sendsms'); +INSERT INTO group_roles (gid,role) VALUES(6,'irc_smsstatus'); INSERT INTO group_roles (gid,role) VALUES(8,'irc_scanreqs'); INSERT INTO group_roles (gid,role) VALUES(8,'irc_anonscan'); diff --git a/ndawn.pl b/ndawn.pl index 7923e2a..b8d35bb 100644 --- a/ndawn.pl +++ b/ndawn.pl @@ -55,7 +55,7 @@ my $TICK = $DBH->selectrow_array('SELECT tick()'); my $disp = new NDIRC::Dispatcher; -$disp->load('Basic','PA','Channel','Quotes','Members','Usermgm','Intel','Scans'); +$disp->load('Basic','SMS'); $ND::scanchan = '#testarmer'; $ND::defchan = '#testarlite'; -- 2.39.2