Fix behaviour on privmsg and add tests for privmsg
[poe-component-irc-plugin-seen.git] / lib / POE / Component / IRC / Plugin / Seen.pm
CommitLineData
566f7a16
MG
1package POE::Component::IRC::Plugin::Seen;
2
d37b05fc 3our $VERSION = 0.001001;
566f7a16
MG
4
5use v5.14;
6use strict;
7use warnings;
8
9use DB_File;
10
11use IRC::Utils qw/lc_irc parse_user/;
12use POE::Component::IRC::Plugin qw/PCI_EAT_NONE PCI_EAT_PLUGIN/;
13
14##################################################
15
16sub new{
f45fe0ce
MG
17 my $class = shift;
18 my $self = { @_ };
566f7a16 19
f45fe0ce
MG
20 $self->{dbobj} = tie my %db, DB_File => $self->{filename};
21 $self->{db} = \%db;
22 bless $self, $class
566f7a16
MG
23}
24
25sub log_event {
f45fe0ce
MG
26 my ($self, $nick, $event) = @_;
27 my $time = localtime;
28 $self->{db}->{$nick} = "$time $event";
29 $self->{dbobj}->sync;
30 PCI_EAT_NONE
566f7a16
MG
31}
32
33sub seen {
f45fe0ce
MG
34 my ($self, $irc, $nick, $to, $from) = @_;
35 if (exists $self->{db}->{$nick}) {
36 $irc->yield(privmsg => $to => "I last saw $nick $self->{db}->{$nick}")
37 } else {
38 $irc->yield(privmsg => $to => "I haven't seen $nick")
39 }
40 PCI_EAT_PLUGIN
566f7a16
MG
41}
42
43sub PCI_register {
f45fe0ce
MG
44 my ($self, $irc) = @_;
45 $irc->plugin_register($self, SERVER => qw/ctcp_action join part public msg/);
46 1
566f7a16
MG
47}
48
49sub PCI_unregister { 1 }
50
51sub S_ctcp_action {
f45fe0ce
MG
52 my ($self, $irc, $rfullname, $rchannels, $rmessage) = @_;
53 my $nick = parse_user $$rfullname;
566f7a16 54
f45fe0ce 55 log_event $self, $nick => "on $$rchannels->[0] doing: * $$rmessage"
566f7a16
MG
56}
57
58sub S_public {
f45fe0ce
MG
59 my ($self, $irc, $rfullname, $rchannels, $rmessage) = @_;
60 my $nick = parse_user $$rfullname;
61 my $mynick = $irc->nick_name;
566f7a16 62
3b40dfa4 63 seen $self, $irc, $1, $$rchannels->[0], $nick if $$rmessage =~ /^(?:$mynick [,:])?\s*!?seen\s+([^ ]+)/x;
f45fe0ce 64 log_event $self, $nick => "on $$rchannels->[0] saying $$rmessage"
566f7a16
MG
65}
66
67sub S_join {
f45fe0ce
MG
68 my ($self, $irc, $rfullname, $rchannel) = @_;
69 my $nick = parse_user $$rfullname;
566f7a16 70
f45fe0ce 71 log_event $self, $nick => "joining $$rchannel"
566f7a16
MG
72}
73
74sub S_part {
f45fe0ce
MG
75 my ($self, $irc, $rfullname, $rchannel, $rmessage) = @_;
76 my $nick = parse_user $$rfullname;
77 my $msg = $$rmessage ? " with message '$$rmessage'" : '';
566f7a16 78
f45fe0ce 79 log_event $self, $nick => "parting $$rchannel$msg"
566f7a16
MG
80}
81
82sub S_msg {
f45fe0ce
MG
83 my ($self, $irc, $rfullname, $rtargets, $rmessage) = @_;
84 my $nick = parse_user $$rfullname;
566f7a16 85
b9ec22f5 86 seen $self, $irc, $1, $$rtargets->[0], $nick if $$rmessage =~ /^\s*!?seen\s+([^ ]+)/
566f7a16
MG
87}
88
891;
90__END__
91
92=head1 NAME
93
94POE::Component::IRC::Plugin::Seen - PoCo-IRC plugin that remembers seeing people
95
96=head1 SYNOPSIS
97
98 use POE::Component::IRC::Plugin::Seen;
99
100 my $irc = POE::Component::IRC->spawn;
101 $irc->plugin_add(Seen => POE::Component::IRC::Plugin::Seen->new(filename => 'mycache.db'));
102
103=head1 DESCRIPTION
104
105POE::Component::IRC::Plugin::Seen is a PoCo-IRC plugin that remembers what each person around it did last.
106
107When somebody sends him a private message of the form 'seen NICKNAME' or somebody says 'botnick: seen NICKNAME' in a channel with the bot, the plugin answers with the last action NICKNAME did.
108
109=head1 METHODS
110
111=over
112
113=item B<new>([I<filename> => value])
114
115Creates a new plugin object suitable for L<POE::Component::IRC>'s C<plugin_add> method.
116
117Takes one optional argument, C<filename>, the name of the file to store the plugin's state in. If C<undef> or not given, it keeps the state in memory.
118
119=back
120
121=head1 SEE ALSO
122
123L<POE::Component::IRC::Plugin>
124
125=head1 AUTHOR
126
127Marius Gavrilescu C<< <marius@ieval.ro> >>
128
129=head1 COPYRIGHT AND LICENSE
130
d37b05fc 131Copyright (C) 2013,2014 by Marius Gavrilescu
566f7a16
MG
132
133This library is free software; you can redistribute it and/or modify
134it under the same terms as Perl itself, either Perl version 5.14.2 or,
135at your option, any later version of Perl 5 you may have available.
136
137
138=cut
This page took 0.020543 seconds and 4 git commands to generate.