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
|
#!/usr/bin/perl
#
# ircbot.pl written by detour@metalshell.com
#
# This irc bot will handle and print the motd, users on a channel
# joins, parts, quits, nick changes, and public msgs's.
#
# You can bind a sub to any numeric reply by using irc_<num>.
# For example 376 is the RPL_ENDOFMOTD, so to catch this response
# you add irc_376 => \&your_sub to your session.
#
# This requires that you have POE and POE::Component::IRC
# installed. A simple way to do this is using the cpan module.
# perl -MCPAN -eshell
# cpan> install POE
# cpan> install POE::Component::IRC
#
# http://www.metalshell.com
use strict;
use POE;
use POE::Component::IRC;
POE::Component::IRC->new("irc_client");
POE::Session->new ( _start => \&irc_start,
irc_join => \&irc_join,
irc_part => \&irc_part,
irc_nick => \&irc_nick,
irc_quit => \&irc_quit,
irc_376 => \&irc_connect, #end of motd
irc_372 => \&irc_motd,
irc_353 => \&irc_names,
irc_public => \&irc_pub_msg, );
sub irc_start {
# KERNEL, HEAP, and SESSION are constants exported by POE
my $kernel = $_[KERNEL];
my $heap = $_[HEAP];
my $session = $_[SESSION];
$kernel->refcount_increment( $session->ID(), "my bot");
$kernel->post(irc_client=> register=> "all");
$kernel->post(irc_client=>connect=> { Nick => 'francoise',
Username => 'francoise',
Ircname => 'francoise',
Server => 'irc.kiffer.de',
Port => '6667',
}
);
}
sub irc_connect {
my $kernel = $_[KERNEL];
$kernel->post(irc_client=>join=>'#kiffer.de');
}
sub irc_motd {
my $msg = $_[ARG1];
print "MOTD: $msg\n";
}
sub irc_names {
my $names = (split /:/, $_[ARG1])[1];
my $channel = (split /:/, $_[ARG1])[0];
$channel =~ s/[@|=] (.*?) /$1/;
print "#-> Users on $channel [ $names ]\n";
}
#nick change
sub irc_nick {
my $oldnick = (split /!/, $_[ARG0])[0];
my $newnick = $_[ARG1];
print "#-> $oldnick is now known as $newnick\n";
}
#user parted
sub irc_part {
my $nick = (split /!/, $_[ARG0])[0];
my $channel = $_[ARG1];
print "#-> $nick has parted $channel\n";
}
#user joined
sub irc_join {
my $nick = (split /!/, $_[ARG0])[0];
my $channel = $_[ARG1];
print "#-> $nick has joined $channel\n";
}
#user quit
sub irc_quit {
my $nick = $_[ARG0];
my $reason = $_[ARG1];
print "#-> $nick has quit ($reason)\n";
}
sub irc_pub_msg{
my $kernel = $_[KERNEL];
my $nick = (split /!/, $_[ARG0])[0];
my $channel = $_[ARG1]->[0];
my $msg = $_[ARG2];
print "$channel: <$nick> $msg\n";
}
#start everything
$poe_kernel->run();
|