X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=mubot4fb.pl;h=d0e95c49a22ea80f405ce37b861626bf3c279681;hb=90974ac3f547d08b6daf3f96cfd82c41afe017e0;hp=87528b27789391044d6ad6b008dd82cb5a818e12;hpb=20955fef23e80e857d340589ef41e83dccffb6e3;p=mubot4fb%2Fmubot4fb.git diff --git a/mubot4fb.pl b/mubot4fb.pl index 87528b2..d0e95c4 100755 --- a/mubot4fb.pl +++ b/mubot4fb.pl @@ -80,38 +80,31 @@ sub remove { } 1; -package Mubot4FB; +package Mubot4FB::FB; use strict; use utf8; -use base 'Bot::BasicBot'; use DBI qw/:sql_types/; -use POSIX 'strftime'; use Data::Dumper; -my $mu_re = qr/^([^\s]+)\s+((?:https?|ftps?):\/\/[^\s]+)\s+(.+)$/i; -my $irc_type = 1; - -sub db_init { - my ($me) = @_; - $me->{dbh} = DBI->connect('DBI:mysql:'.$me->{cfg}->{database}, $me->{cfg}->{db_user}, $me->{cfg}->{db_pass},{mysql_enable_utf8 => 1}) || die $DBI::errstr; -} - -sub misc_init { - my ($me) = @_; +sub new { + my $proto = shift; + my $class = ref $proto || $proto; + my $self = {cfg => shift}; + bless $self, $class; - $me->{last_search} = {}; + $self->init(); + return $self; } sub init { my ($me) = @_; - $me->{fb} = Mubot4FB::FB->new($me->{cfg}); - $me->db_init(); + return $me->{dbh} = DBI->connect('DBI:mysql:'.$me->{cfg}->{database}, $me->{cfg}->{db_user}, $me->{cfg}->{db_pass},{mysql_enable_utf8 => 1}) || die $DBI::errstr; } -sub _db_check_dup { +sub check_dup { my ($me, $db_args) = @_; my $sth = $me->{dbh}->prepare('select * from posts where uri = ? order by post_time desc limit 1'); my $rv = $sth->execute($db_args->{uri}); @@ -121,7 +114,7 @@ sub _db_check_dup { return $ret; } -sub _db_insert { +sub add { my ($me, $db_args) = @_; my ($scheme, $path) = split(/:\/\//, $db_args->{uri}); @@ -140,7 +133,7 @@ sub _db_insert { return $rv; } -sub _db_delete { +sub remove { my ($me, $db_args) = @_; $db_args->{submitter_type} ||= 1; @@ -157,7 +150,7 @@ sub _db_delete { return $ret; } -sub _db_search { +sub search_by_word { my ($me, $db_args) = @_; my $column = $db_args->{word} =~ /:\/\// ? 'uri' : 'path'; @@ -174,7 +167,7 @@ sub _db_search { return $ret; } -sub _db_search_lastpost { +sub search_lastpost_by_submitter { my ($me, $db_args) = @_; my $sth = $me->{dbh}->prepare('select * from posts where submitter = ? order by post_time desc limit 1'); @@ -187,6 +180,33 @@ sub _db_search_lastpost { return $ret; } +1; +package Mubot4FB; + +use strict; +use utf8; + +use base 'Bot::BasicBot'; +use DBI qw/:sql_types/; +use POSIX 'strftime'; + +use Data::Dumper; + +my $mu_re = qr/^([^\s]+)\s+((?:https?|ftps?):\/\/[^\s]+)\s+(.+)$/i; +my $irc_type = 1; + +sub misc_init { + my ($me) = @_; + + $me->{last_search} = {}; +} + +sub init { + my ($me) = @_; + $me->{fb} = Mubot4FB::FB->new($me->{cfg}); + $me->{db} = Mubot4FB::DB->new($me->{cfg}); +} + sub _format_submit { my ($me, $e) = @_; @@ -210,7 +230,7 @@ sub _add { my $comment = $3; my $text = $args->{who} . '曰く、'.$prefix.' '.$comment; - if (my $res = $me->_db_check_dup({uri =>$uri})) { + if (my $res = $me->{db}->check_dup({uri =>$uri})) { if ($res->{post_time} < time() - 7 * 24 * 60 * 60) { $resp_msg = 'だいぶ前 '.$me->_format_submit($res).'にいってたにゃー '.$me->{fb}->post_uri($res->{fb_post_id}); } else { @@ -220,18 +240,18 @@ sub _add { my $post_ok = 1; eval{$resp = $me->{fb}->publish($text, $uri)}; if ($@) { - $me->fb_init(); + $me->{fb}->init(); eval{$resp = $me->{fb}->publish($text, $uri)}; $post_ok = 0 if ($@); } if ($post_ok) { my (undef, $post_id) = split(/_/, $resp->{id}); - $me->_db_insert({submitter => $args->{who}, - fb_post_id => $post_id, - uri => $uri, - prefix => $prefix, - comment => $comment}); + $me->{db}->add({submitter => $args->{who}, + fb_post_id => $post_id, + uri => $uri, + prefix => $prefix, + comment => $comment}); $resp_msg = $args->{who} . ': うい '.$me->{fb}->post_uri($post_id).' で登録'; } else { $resp_msg = 'can not post to facebook'; @@ -242,26 +262,26 @@ sub _add { return 0; } -sub _delete_prev { +sub _remove_prev { my ($me, $args) = @_; - my $last_post = $me->_db_search_lastpost({who => $args->{who}}); + my $last_post = $me->{db}->search_lastpost_by_submitter({who => $args->{who}}); if (!defined $last_post) { return $args->{who}.': いまのっていつの? というか ないし'; } elsif ($last_post->{post_time} < time() - 3600) { return $args->{who}.': いまのっていつの? 最後のはこれだけど古いんだにゃ ' . $me->{fb}->post_uri($last_post->{fb_post_id}); } else { - return $me->_delete($args, $last_post->{'fb_post_id'}); + return $me->_remove($args, $last_post->{'fb_post_id'}); } } -sub _delete { +sub _remove { my ($me, $args, $post_id) =@_; my ($resp_msg, $resp); $me->{dbh}->begin_work; - if ($resp = $me->_db_delete({fb_post_id => $post_id, submitter => $args->{who}})) { + if ($resp = $me->{db}->remove({fb_post_id => $post_id, submitter => $args->{who}})) { # fb 側のエントリを削除しないといけない if ($me->{fb}->remove($post_id)) { $me->{dbh}->commit; @@ -282,7 +302,7 @@ sub _search_start { if ($args->{body} =~ /^ふみくん\s+(.+)\?\s*$/) { $me->{last_search}->{$args->{who}} = undef; - $me->{last_search}->{$args->{who}} = $me->_db_search({word => $1}); + $me->{last_search}->{$args->{who}} = $me->{db}->search_by_word({word => $1}); return $me->_search_next($args); } } @@ -316,9 +336,9 @@ sub said { } elsif ($args->{body} =~ /^ふみくん\s+(.+)\s*$/) { my $cmd = $1; if ($cmd eq 'いまのなし') { - $resp_msg = $me->_delete_prev($args); + $resp_msg = $me->_remove_prev($args); } elsif ($cmd =~ /削除\s+(?:$me->{cfg}->{fb_page_url}posts\/)?([0-9]+)$/) { - $resp_msg = $me->_delete($args, $1); + $resp_msg = $me->_remove($args, $1); } elsif ($cmd =~ /\?$/) { $resp_msg = $me->_search_start($args); } elsif ($cmd =~ /つぎ/) {