}
my $tweets = {};
-my $tweet;
-
-$tweet = or_search($bot, $conf->{hashtag}, $stat->{search});
-if ($tweet) {
- %$tweets = (%$tweets, %$tweet);
-}
-
-$tweet = mentions_ids($bot, $stat->{mention});
-if ($tweet) {
- %$tweets = (%$tweets, %$tweet);
-}
+%$tweets = (
+ %$tweets,
+ %{ or_search($bot, $conf->{hashtag}, $stat->{search}) }
+);
+%$tweets = (
+ %$tweets,
+ %{ mentions_ids($bot, $stat->{mention}) }
+);
foreach my $id (sort keys %$tweets) {
# $tweets->{$id}{type} eq 'search' => found by search API
$stat->{$tweets->{$id}{type}} = $id;
}
+foreach my $word (keys %{$conf->{response}}) {
+ # reply to follower's tweets containing keywords
+ $tweets = follower_search($bot, $word);
+ foreach my $id (sort keys %$tweets) {
+ if ($tweets->{$id}{type} eq 'retweet') {
+ next;
+ }
+ DEBUG or sleep($conf->{sleep});
+
+ my $text = '@' . $tweets->{$id}{screen_name}
+ . " " . $conf->{response}{$word};
+ my $res;
+ eval {
+ DEBUG or $res = $bot->update(
+ {
+ in_reply_to_status_id => $id,
+ status => $text,
+ }
+ );
+ DEBUG and warn "update(", $text, ") => ",
+ Dumper($tweets->{$id});
+ };
+ if ($@) {
+ evalrescue($@);
+ }
+ }
+}
+
if ($tweets) {
# save last status to yaml file
DEBUG or YAML::Tiny::DumpFile("$Bin/status.yml", $stat);
return $ids;
}
+sub follower_search {
+ # search follower's tweets containing keywords
+ # param => Net::Twitter::Lite object, keyword string, since_id
+ # ret => HashRef of status_id (timeline order is destroyed)
+ # or undef (none is found)
+
+ my $bot = shift @_;
+ my $keyword = shift @_;
+ my $since_id = shift @_ || 1;
+
+ my $tweets = or_search($bot, [ $keyword ], $since_id);
+ if (! $tweets) {
+ return {};
+ }
+
+ my $followers;
+ eval {
+ $followers = $bot->followers_ids();
+ VERBOSE and warn Dumper($followers);
+ };
+ if ($@) {
+ evalrescue($@);
+ }
+
+ my $ids = {};
+ foreach my $status_id (keys %$tweets) {
+ foreach my $user_id (@$followers) {
+ if ($tweets->{$status_id}{user_id} == $user_id) {
+ $ids->{$status_id} = $tweets->{$status_id};
+ last;
+ }
+ }
+ }
+
+ DEBUG and warn "search result in followers => ", Dumper($ids);
+ return $ids;
+}
+
sub evalrescue {
# output error message at eval error