]> ruin.nu Git - ndwebbie.git/blob - scripts/sms.pl
Use new race infrastructure for members stats
[ndwebbie.git] / scripts / sms.pl
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5 use feature ':5.10';
6
7 no if $] >= 5.018, warnings => "experimental::smartmatch";
8
9 use local::lib;
10
11 use Encode;
12
13 use LWP::UserAgent;
14 use URI::Escape qw(uri_escape);
15 use HTTP::Request::Common;
16
17 use DBI;
18 use DBD::Pg qw(:pg_types);
19
20 use FindBin;
21 use lib "$FindBin::Bin/../lib";
22
23 use ND::DB;
24 my $dbh = ND::DB::DB();
25
26 my $ua = LWP::UserAgent->new(agent => 'NDWebbie' );
27
28 my $click = $dbh->selectrow_hashref(q{
29 SELECT api_id,username,password FROM clickatell LIMIT 1
30 });
31
32 my %tags = (
33         api_id => $click->{api_id},
34         user => $click->{username},
35         password => $click->{password},
36         callback => 3,
37 );
38
39 $dbh->begin_work;
40 my $sms = $dbh->prepare(q{
41 SELECT * FROM sms WHERE msgid IS NULL AND status = 'Waiting' FOR UPDATE
42 });
43
44 my $update = $dbh->prepare(q{
45 UPDATE sms SET msgid = $2, status = $3, time = NOW() WHERE id = $1
46 });
47
48 $sms->execute;
49 eval{
50         $dbh->pg_savepoint('sms') or die "Couldn't save";
51         while(my $msg = $sms->fetchrow_hashref){
52                 $dbh->pg_release('sms') or die "Couldn't save";
53                 $dbh->pg_savepoint('sms') or die "Couldn't save";
54
55                 my %tags = (%tags,
56                         to => $msg->{number},
57                         text => encode("latin1",$msg->{message}),
58                 );
59
60                 my $res = $ua->request(
61                         POST 'http://api.clickatell.com/http/sendmsg',
62                         Content_Type  => 'application/x-www-form-urlencoded',
63                         Content       => [ %tags ]
64                 );
65
66                 given ($res->content){
67                         when(/^ID: (\S+)/){
68                                 $update->execute($msg->{id},$1,'Sent');
69                         }
70                         when(/^ERR: (?:301|302|128|114|113|105),(.*)/){
71                                 $update->execute($msg->{id},undef,$1);
72                         }
73                         default {
74                                 die $_;
75                         }
76                 }
77         }
78 };
79
80 if ($@){
81         warn $@;
82         $dbh->pg_rollback_to('sms') or die "rollback didn't work";
83 }
84
85 $dbh->commit;