9 use base 'Bot::BasicBot';
16 my $mu_re = qr/^([^ ]+) (https?:\/\/[^ ]+) (.+)$/i;
20 my $fb = Facebook::Graph->new(app_id => $me->{cfg}->{fb_app_id},
21 secret => $me->{cfg}->{fb_app_secret},
22 postback => $me->{cfg}->{fb_postback_url});
24 my $res_token = $fb->request_access_token($me->{cfg}->{fb_access_code});
25 die 'token get error' if (!defined $res_token || !$res_token->response->is_success);
27 my $acts = $fb->fetch('me/accounts');
28 die 'can not get account list' if(!defined $acts || !$acts);
30 my $page_access_token = '';
31 foreach my $d (@{$acts->{data}}) {
32 if ($d->{id} eq $me->{cfg}->{fb_page_id}) {
33 $page_access_token = $d->{'access_token'};
36 die 'can not get access tokenfor page_id=' . $me->{cfg}->{fb_page_id} if ($page_access_token eq '');
38 return $me->{fbo} = Facebook::Graph->new(access_token => $page_access_token);
43 $me->{dbh} = DBI->connect('dbi:SQLite:dbname='.$me->{cfg}->{database}) || die $DBI::errstr;
47 my ($me, $text, $uri) = @_;
49 return $me->{fbo}->add_post($me->{cfg}->{fb_page_id})
63 my ($me, $args, $uri) = @_;
67 my $sth = $me->{dbh}->prepare('select * from posts where uri = ? order by post_time desc limit 1');
68 my $rv = $sth->execute($uri);
69 my $res = $sth->fetchrow_hashref;
71 if ($res->{post_time} < time() - 7 * 24 * 60 * 60) {
72 $me->_response($args, 'だいぶ前に'.decode('utf-8', $res->{nick}).'が「'.decode('utf-8' $res->{prefix}).','.decode('utf-8', $res->{suffix}).'」とかいってたにゃー '.$me->{cfg}->{fb_page_url}.'posts/'.$res->{fb_post_id});
74 $me->_response($args, '既に'.decode('utf-8', $res->{nick}).'が「'.decode('utf-8', $res->{prefix}).','.decode('utf-8', $res->{suffix}).'」と'.strftime('%Y-%m-%d %H:%M:%S', localtime($res->{post_time})).'に言ってますよ? '.$me->{cfg}->{fb_page_url}.'posts/'.$res->{fb_post_id});
84 my ($me, $db_args) = @_;
86 my $sth = $me->{dbh}->prepare("insert into posts (id, nick, fb_post_id, uri, prefix, suffix, post_time) values (null, ?, ?, ?, ?, ?, ?)");
87 my $rv = $sth->execute($db_args->{nick}, $db_args->{fb_post_id}, $db_args->{uri}, $db_args->{prefix}, $db_args->{suffix}, time);
94 my ($me, $args, $msg) = @_;
96 $me->say(channel => $args->{channel},
103 my ($resp, $resp_msg);
105 if ($args->{body} =~ /$mu_re/) {
109 my $text = $args->{who} . '曰く、'.$prefix.' '.$suffix;
111 return 0 if ($me->_check_dup($args, $uri));
113 eval{$resp = $me->publish($text, $uri)};
116 eval{$resp = $me->publish($text, $uri)};
117 $post_ok = 0 if ($@);
121 my (undef, $post_id) = split(/_/, $resp->{id});
122 $me->_db_insert({nick => $args->{who},
123 fb_post_id => $post_id,
127 $resp_msg = 'うい: ' . $me->{cfg}->{fb_page_url} . 'posts/' . $post_id .' で登録';
129 $resp_msg = 'can not post to facebook';
138 my ($me, $args) = @_;
143 sub _delete_post_id {
144 my ($me, $args) = @_;
166 my ($me, $args) = @_;
169 if ($args->{body} =~ /$mu_re/) {
170 $resp_msg = $me->_add($args) unless ($1 eq 'deb');
171 } elsif ($args->{body} =~ /^ふみくん (.+)/) {
173 if ($cmd eq 'いまのなし') {
174 $resp_msg = $me->_delete_prev($args);
175 } elsif ($cmd =~ /削除 ([0-9]+)$/) {
176 $resp_msg = $me->_delete($args, $1);
177 } elsif ($cmd =~ /\?$/) {
178 $resp_msg = $me->_search($args);
179 } elsif ($cmd =~ /つぎ/) {
180 $resp_msg = $me->_search_next($args);
184 $me->_response($args, $resp_msg) if ($resp_msg);
194 my $config_name = $ARGV[0] || 'not_found';
197 my $config_path = ('/etc/mubot4fb/', $ENV{HOME} . '/.mubot4fb/', $ENV{PWD} . '/mubot4fb_');
198 foreach my $c ($config_path) {
199 my $config = $c . $config_name . '.conf';
200 Config::Simple->import_from($config, \%cfg) if (-e $config);
202 die 'missing config file' unless (keys %cfg);
204 die 'missing some config parameters should be defined (irc_server, fb_app_id, fb_app_secret, fb_access_code, fb_page_id fb_postback_url)'
205 if (!defined $cfg{'irc_server'}
206 || !defined $cfg{'fb_app_id'}
207 || !defined $cfg{'fb_app_secret'}
208 || !defined $cfg{'fb_access_code'}
209 || !defined $cfg{'fb_page_id'}
210 || !defined $cfg{'fb_postback_url'}
213 $cfg{irc_port} ||= 6667;
214 $cfg{irc_channels} ||= ['#mubot4fb'];
215 $cfg{irc_nick} ||= 'mubot4fb';
216 $cfg{irc_name}||= $cfg{irc_nick};
217 $cfg{irc_charset} ||= 'utf-8';
218 $cfg{database} ||= $ENV{HOME} . '/.mubot4fb/data/' . $config_name . '.sqlite';
220 my $bot = Mubot4FB->new(server => $cfg{'irc_server'},
221 port => $cfg{'irc_port'},
222 channels => $cfg{'irc_channels'},
223 nick => $cfg{'irc_nick'},
224 username => $cfg{'irc_name'},
225 name => $cfg{'irc_name'},
226 charset => $cfg{'irc_charset'},
227 cfg => \%cfg)->run();