/usr/share/perl5/POE/Component/IRC/Cookbook/Seen.pod is in libpoe-component-irc-perl 6.88+dfsg-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | =encoding utf8
=head1 NAME
POE::Component::IRC::Cookbook::Seen - Implement the 'seen' command
=head1 SYNOPSIS
This little bot tracks the whereabouts of users and allows you to retrieve
that information on command.
19:59:51 * seen_bot (n=hinrik@pool-71-164-43-32.chrlwv.east.verizon.net) has joined #test_channel1
19:59:55 <foo> bar
20:00:16 * seen_bot has quit (Remote closed the connection)
20:00:27 * seen_bot (n=hinrik@pool-71-164-43-32.chrlwv.east.verizon.net) has joined #test_channel1
20:00:29 <literal> seen_bot: seen seen_bot
20:00:29 <seen_bot> literal: I last saw seen_bot at Mon Sep 22 20:00:27 2008 joining #test_channel1
20:00:34 <literal> seen_bot: seen foo
20:00:40 <seen_bot> literal: I last saw foo at Mon Sep 22 19:59:56 2008 on #test_channel1 saying: bar
20:00:45 <literal> seen_bot: seen baz
20:00:48 <seen_bot> literal: I haven't seen baz
=head1 DESCRIPTION
#!/usr/bin/env perl
use strict;
use warnings;
use IRC::Utils qw(parse_user lc_irc);
use POE;
use POE::Component::IRC::State;
use POE::Component::IRC::Plugin::AutoJoin;
use POE::Component::IRC::Plugin::BotCommand;
use Storable;
use constant {
USER_DATE => 0,
USER_MSG => 1,
DATA_FILE => 'seen',
SAVE_INTERVAL => 20 * 60, # save state every 20 mins
};
my $seen = { };
$seen = retrieve(DATA_FILE) if -s DATA_FILE;
POE::Session->create(
package_states => [
main => [ qw(
_start
irc_botcmd_seen
irc_ctcp_action
irc_join
irc_part
irc_public
irc_quit
save
)]
],
);
$poe_kernel->run();
sub _start {
my ($kernel, $heap) = @_[KERNEL, HEAP];
my $irc = POE::Component::IRC::State->spawn(
Nick => 'seen_bot',
Server => 'irc.freenode.net',
);
$heap->{irc} = $irc;
$irc->plugin_add('AutoJoin', POE::Component::IRC::Plugin::AutoJoin->new(
Channels => [ '#test_channel1', '#test_channel2' ]
));
$irc->plugin_add('BotCommand', POE::Component::IRC::Plugin::BotCommand->new(
Commands => {
seen => 'Usage: seen <nick>'
}
));
$irc->yield(register => qw(ctcp_action join part public quit botcmd_seen));
$irc->yield('connect');
$kernel->delay_set('save', SAVE_INTERVAL);
return;
}
sub save {
my $kernel = $_[KERNEL];
warn "storing\n";
store($seen, DATA_FILE) or die "Can't save state";
$kernel->delay_set('save', SAVE_INTERVAL);
}
sub irc_ctcp_action {
my $nick = parse_user($_[ARG0]);
my $chan = $_[ARG1]->[0];
my $text = $_[ARG2];
add_nick($nick, "on $chan doing: * $nick $text");
}
sub irc_join {
my $nick = parse_user($_[ARG0]);
my $chan = $_[ARG1];
add_nick($nick, "joining $chan");
}
sub irc_part {
my $nick = parse_user($_[ARG0]);
my $chan = $_[ARG1];
my $text = $_[ARG2];
my $msg = 'parting $chan';
$msg .= " with message '$text'" if defined $text;
add_nick($nick, $msg);
}
sub irc_public {
my $nick = parse_user($_[ARG0]);
my $chan = $_[ARG1]->[0];
my $text = $_[ARG2];
add_nick($nick, "on $chan saying: $text");
}
sub irc_quit {
my $nick = parse_user($_[ARG0]);
my $text = $_[ARG1];
my $msg = 'quitting';
$msg .= " with message '$text'" if defined $text;
add_nick($nick, $msg);
}
sub add_nick {
my ($nick, $msg) = @_;
$seen->{lc_irc($nick)} = [time, $msg];
}
sub irc_botcmd_seen {
my ($heap, $nick, $channel, $target) = @_[HEAP, ARG0..$#_];
$nick = parse_user($nick);
my $irc = $heap->{irc};
if ($seen->{lc_irc($target)}) {
my $date = localtime $seen->{lc_irc($target)}->[USER_DATE];
my $msg = $seen->{lc_irc($target)}->[USER_MSG];
$irc->yield(privmsg => $channel, "$nick: I last saw $target at $date $msg");
}
else {
$irc->yield(privmsg => $channel, "$nick: I haven't seen $target");
}
}
=head1 AUTHOR
Hinrik E<Ouml>rn SigurE<eth>sson, hinrik.sig@gmail.com
|