6 our $VERSION = 0.001003;
9 use POE
::Component
::IRC
::State
;
10 use POE
::Component
::IRC
::Plugin
::AutoJoin
;
11 use POE
::Component
::IRC
::Plugin
::NickServID
;
13 use File
::Slurp qw
/append_file/;
14 use IRC
::Utils qw
/parse_user/;
17 use POSIX qw
/strftime/;
18 use Regexp
::Common qw
/net/;
20 ##################################################
24 my $server='irc.oftc.net';
35 "password=s" => \
$password,
36 "server=s" => \
$server,
39 "channel=s" => \
@channels,
41 "store-files!" => \
$store_files,
48 my ($channel, $nick)=@_;
49 return '~' if $irc->is_channel_owner($channel, $nick);
50 return '&' if $irc->is_channel_admin($channel, $nick);
51 return '@' if $irc->is_channel_operator($channel, $nick);
52 return '%' if $irc->is_channel_halfop($channel, $nick);
53 return '+' if $irc->has_channel_voice($channel, $nick);
59 my ($channel, @strings) = @_;
60 my $file=strftime
'%F', localtime;
62 mkdir "logs/$channel";
63 append_file
"logs/$channel/$file.txt", strftime
('%T ', localtime), @strings, "\n";
67 $irc->plugin_add (NickServID
=> POE
::Component
::IRC
::Plugin
::NickServID
->new(Password
=> $password)) if defined $password;
68 $irc->plugin_add (AutoJoin
=> POE
::Component
::IRC
::Plugin
::AutoJoin
->new(
69 Channels
=> \
@channels,
72 Retry_when_banned
=> 60,
75 if ($server =~ /^($RE{net}{domain})$/) {
78 if ($port =~ /^([0-9]+)$/) {
82 $irc->yield(register
=> "all");
87 Ircname
=> "devbot $VERSION",
96 my ($fulluser, $channels, $message)=@_[ARG0
, ARG1
, ARG2
];
97 my $nick=parse_user
$fulluser;
100 my $mode_char=mode_char
$_, $nick;
101 log_event
$_, "<$mode_char$nick> $message";
106 my ($fulluser, $channels, $message)=@_[ARG0
, ARG1
, ARG2
];
107 my $nick=parse_user
$fulluser;
109 log_event
$_, "* $nick $message" for @
$channels;
113 my ($fulluser, $channel)=@_[ARG0
, ARG1
];
114 my ($nick, $user, $host)=parse_user
$fulluser;
116 log_event
$channel, "-!- $nick [$user\@$host] has joined $channel";
120 my ($fulluser, $channel, $message)=@_[ARG0
, ARG1
, ARG2
];
121 my ($nick, $user, $host)=parse_user
$fulluser;
123 log_event
$channel, "-!- $nick [$user\@$host] has left $channel [$message]";
127 my ($fulluser, $channel, $target, $message)=@_[ARG0
, ARG1
, ARG2
, ARG3
];
128 my $nick=parse_user
$fulluser;
130 log_event
$channel, "-!- $target was kicked from $channel by $nick [$message]";
134 my ($fulluser, $channel, @args)=@_[ARG0
.. $#_];
135 my $nick=parse_user
$fulluser;
136 my $mode=join ' ', @args;
138 log_event
$channel, "-!- mode/$channel [$mode] by $nick";
142 my ($fulluser, $channel, $topic)=@_[ARG0
, ARG1
, ARG2
];
143 my $nick=parse_user
$fulluser;
145 log_event
$channel, "-!- $nick changed the topic of $channel to: $topic" if $topic;
146 log_event
$channel, "-!- Topic unset by $nick on $channel" unless $topic;
150 my ($fulluser, $nick, $channels)=@_[ARG0
, ARG1
, ARG2
];
151 my $oldnick=parse_user
$fulluser;
153 log_event
$_, "-!- $oldnick is now known as $nick" for @
$channels;
157 my ($fulluser, $message, $channels)=@_[ARG0
, ARG1
, ARG2
];
158 my ($nick, $user, $host)=parse_user
$fulluser;
160 log_event
$_, "-!- $nick [$user\@$host] has quit [$message]" for @
$channels;
164 return unless $store_files;
165 my ($fulluser, $type, $cookie, $name)=@_[ARG0
, ARG1
, ARG3
, ARG4
];
166 my $nick=parse_user
$fulluser;
167 return unless $type eq 'SEND';
168 return unless $irc->nick_channels($nick);
169 return if $name =~ m
,/,;
172 $irc->yield(dcc_accept
=> $cookie, "files/$name");
176 $irc=POE
::Component
::IRC
::State
->spawn();
178 POE
::Session
->create(
180 _start
=> \
&bot_start
,
181 irc_public
=> \
&on_public
,
182 irc_ctcp_action
=> \
&on_ctcp_action
,
183 irc_join
=> \
&on_join
,
184 irc_part
=> \
&on_part
,
185 irc_kick
=> \
&on_kick
,
186 irc_mode
=> \
&on_mode
,
187 irc_topic
=> \
&on_topic
,
188 irc_nick
=> \
&on_nick
,
189 irc_quit
=> \
&on_quit
,
190 irc_dcc_request
=> \
&on_dcc_request
206 App::Devbot - IRC bot which helps development
215 App::Devbot is an IRC bot which helps developers collaborate.
217 Right now, it only does channel logging and file storage. It might do more in the future.
223 =item B<--nick> I<nickname>
225 The nickname of devbot. Defaults to devbot.
227 =item B<--password> I<password>
229 If supplied, identify to NickServ with this password
231 =item B<--server> I<hostname>
233 The server to connect to. Defaults to irc.oftc.net.
235 =item B<--port> I<port>
237 The port to connect to. Defaults to 6697.
239 =item B<--ssl>, B<--no-ssl>
241 B<--ssl> enables connecting to the server with SSL, B<--no-ssl> disables this. Defaults to B<--ssl>.
243 =item B<--channel> I<channel>
245 Makes devbot connect to I<channel>. Can be supplied multiple times for multiple channels. Has no default value.
247 =item B<--log>, B<--no-log>
249 B<--log> enables logging events to 'logs/I<CHANNEL>/I<DATE>.txt'. B<--no-log> disables logging. Defaults to B<--log>.
251 =item B<--store-files>, B<--no-store-files>
253 B<--store-files> enables storing files received via DCC to 'files/I<FILENAME>'. Files are only accepted if the sender and devbot share a channel. B<Only use when all channel users are trusted>. B<--no-store-files> disables storing files. Defaults to <--no-store-files>.
255 =item B<--trace>, B<--no-trace>
257 B<--trace> enables POE::Component::IRC::State tracing. Useful for debugging. B<--no-trace> disables tracing. Defaults to B<--no-trace>.
263 As stated above, the B<--store-files> option should only be used on private channels where every user is trusted.
267 Marius Gavrilescu, E<lt>marius@ieval.roE<gt>
269 =head1 COPYRIGHT AND LICENSE
271 Copyright (C) 2013 by Marius Gavrilescu
273 This library is free software; you can redistribute it and/or modify
274 it under the same terms as Perl itself, either Perl version 5.14.2 or,
275 at your option, any later version of Perl 5 you may have available.
This page took 0.035774 seconds and 4 git commands to generate.