9 use base 'Bot::BasicBot';
15 my $mu_re = qr/^([^ ]+) (https?:\/\/[^ ]+) (.+)$/i;
19 my $fb = Facebook::Graph->new(app_id => $me->{cfg}->{fb_app_id},
20 secret => $me->{cfg}->{fb_app_secret},
21 postback => $me->{cfg}->{fb_postback_url});
23 my $res_token = $fb->request_access_token($me->{cfg}->{fb_access_code});
24 die 'token get error' if (!defined $res_token || !$res_token->response->is_success);
26 my $acts = $fb->fetch('me/accounts');
27 die 'can not get account list' if(!defined $acts || !$acts);
29 my $page_access_token = '';
30 foreach my $d (@{$acts->{data}}) {
31 if ($d->{id} eq $me->{cfg}->{fb_page_id}) {
32 $page_access_token = $d->{'access_token'};
35 die 'can not get access tokenfor page_id=' . $me->{cfg}->{fb_page_id} if ($page_access_token eq '');
37 return $me->{fbo} = Facebook::Graph->new(access_token => $page_access_token);
42 $me->{dbh} = DBI->connect('dbi:SQLite:dbname='.$me->{cfg}->{database}) || die $DBI::errstr;
46 my ($me, $text, $uri) = @_;
48 return $me->{fbo}->add_post($me->{cfg}->{fb_page_id})
68 my ($me, $args, $msg) = @_;
70 $me->say(channel => $args->{channel},
77 my ($resp, $resp_msg);
79 if ($args->{body} =~ /$mu_re/) {
80 my $text = $args->{who} . '曰く、' . $1 . ' ' . $3;
83 eval{$resp = $me->publish($text, $uri)};
86 eval{$resp = $me->publish($text, $uri)};
91 my (undef, $post_id) = split(/_/, $resp->{id});
92 $resp_msg = 'うい: ' . $me->{cfg}->{fb_page_url} . 'posts/' . $post_id .' で登録';
94 $resp_msg = 'can not post to facebook';
103 my ($me, $args) = @_;
109 my ($me, $args) = @_;
131 my ($me, $args) = @_;
134 if ($args->{body} =~ /$mu_re/) {
135 $resp_msg = $me->_add($args) unless ($1 eq 'deb');
136 } elsif ($args->{body} =~ /^ふみくん (.+)/) {
138 if ($cmd eq 'いまのなし') {
139 $resp_msg = $me->_delete_prev($args);
140 } elsif ($cmd =~ /削除 ([0-9]+)$/) {
141 $resp_msg = $me->_delete($args, $1);
142 } elsif ($cmd =~ /\?$/) {
143 $resp_msg = $me->_search($args);
144 } elsif ($cmd =~ /つぎ/) {
145 $resp_msg = $me->_search_next($args);
149 $me->_response($args, $resp_msg) if ($resp_msg);
159 my $config_name = $ARGV[0] || 'not_found';
162 my $config_path = ('/etc/mubot4fb/', $ENV{HOME} . '/.mubot4fb/', $ENV{PWD} . '/mubot4fb_');
163 foreach my $c ($config_path) {
164 my $config = $c . $config_name . '.conf';
165 Config::Simple->import_from($config, \%cfg) if (-e $config);
167 die 'missing config file' unless (keys %cfg);
169 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)'
170 if (!defined $cfg{'irc_server'}
171 || !defined $cfg{'fb_app_id'}
172 || !defined $cfg{'fb_app_secret'}
173 || !defined $cfg{'fb_access_code'}
174 || !defined $cfg{'fb_page_id'}
175 || !defined $cfg{'fb_postback_url'}
178 $cfg{irc_port} ||= 6667;
179 $cfg{irc_channels} ||= ['#mubot4fb'];
180 $cfg{irc_nick} ||= 'mubot4fb';
181 $cfg{irc_name}||= $cfg{irc_nick};
182 $cfg{irc_charset} ||= 'utf-8';
183 $cfg{database} ||= $ENV{HOME} . '/.mubot4fb/data/' . $config_name . '.sqlite';
185 my $bot = Mubot4FB->new(server => $cfg{'irc_server'},
186 port => $cfg{'irc_port'},
187 channels => $cfg{'irc_channels'},
188 nick => $cfg{'irc_nick'},
189 username => $cfg{'irc_name'},
190 name => $cfg{'irc_name'},
191 charset => $cfg{'irc_charset'},
192 cfg => \%cfg)->run();