diff options
| -rw-r--r-- | bot.pl | 119 |
1 files changed, 119 insertions, 0 deletions
| @@ -0,0 +1,119 @@ | |||
| 1 | #!/usr/bin/perl | ||
| 2 | # | ||
| 3 | # ircbot.pl written by detour@metalshell.com | ||
| 4 | # | ||
| 5 | # This irc bot will handle and print the motd, users on a channel | ||
| 6 | # joins, parts, quits, nick changes, and public msgs's. | ||
| 7 | # | ||
| 8 | # You can bind a sub to any numeric reply by using irc_<num>. | ||
| 9 | # For example 376 is the RPL_ENDOFMOTD, so to catch this response | ||
| 10 | # you add irc_376 => \&your_sub to your session. | ||
| 11 | # | ||
| 12 | # This requires that you have POE and POE::Component::IRC | ||
| 13 | # installed. A simple way to do this is using the cpan module. | ||
| 14 | # perl -MCPAN -eshell | ||
| 15 | # cpan> install POE | ||
| 16 | # cpan> install POE::Component::IRC | ||
| 17 | # | ||
| 18 | # http://www.metalshell.com | ||
| 19 | |||
| 20 | |||
| 21 | use strict; | ||
| 22 | |||
| 23 | use POE; | ||
| 24 | use POE::Component::IRC; | ||
| 25 | |||
| 26 | POE::Component::IRC->new("irc_client"); | ||
| 27 | |||
| 28 | POE::Session->new ( _start => \&irc_start, | ||
| 29 | irc_join => \&irc_join, | ||
| 30 | irc_part => \&irc_part, | ||
| 31 | irc_nick => \&irc_nick, | ||
| 32 | irc_quit => \&irc_quit, | ||
| 33 | irc_376 => \&irc_connect, #end of motd | ||
| 34 | irc_372 => \&irc_motd, | ||
| 35 | irc_353 => \&irc_names, | ||
| 36 | irc_public => \&irc_pub_msg, ); | ||
| 37 | |||
| 38 | sub irc_start { | ||
| 39 | # KERNEL, HEAP, and SESSION are constants exported by POE | ||
| 40 | my $kernel = $_[KERNEL]; | ||
| 41 | my $heap = $_[HEAP]; | ||
| 42 | my $session = $_[SESSION]; | ||
| 43 | |||
| 44 | $kernel->refcount_increment( $session->ID(), "my bot"); | ||
| 45 | $kernel->post(irc_client=> register=> "all"); | ||
| 46 | |||
| 47 | $kernel->post(irc_client=>connect=> { Nick => 'francoise', | ||
| 48 | Username => 'francoise', | ||
| 49 | Ircname => 'francoise', | ||
| 50 | Server => 'irc.kiffer.de', | ||
| 51 | Port => '6667', | ||
| 52 | } | ||
| 53 | ); | ||
| 54 | } | ||
| 55 | |||
| 56 | sub irc_connect { | ||
| 57 | my $kernel = $_[KERNEL]; | ||
| 58 | |||
| 59 | $kernel->post(irc_client=>join=>'#kiffer.de'); | ||
| 60 | } | ||
| 61 | |||
| 62 | sub irc_motd { | ||
| 63 | my $msg = $_[ARG1]; | ||
| 64 | |||
| 65 | print "MOTD: $msg\n"; | ||
| 66 | } | ||
| 67 | |||
| 68 | sub irc_names { | ||
| 69 | my $names = (split /:/, $_[ARG1])[1]; | ||
| 70 | my $channel = (split /:/, $_[ARG1])[0]; | ||
| 71 | |||
| 72 | $channel =~ s/[@|=] (.*?) /$1/; | ||
| 73 | |||
| 74 | print "#-> Users on $channel [ $names ]\n"; | ||
| 75 | } | ||
| 76 | |||
| 77 | #nick change | ||
| 78 | sub irc_nick { | ||
| 79 | my $oldnick = (split /!/, $_[ARG0])[0]; | ||
| 80 | my $newnick = $_[ARG1]; | ||
| 81 | |||
| 82 | print "#-> $oldnick is now known as $newnick\n"; | ||
| 83 | } | ||
| 84 | |||
| 85 | #user parted | ||
| 86 | sub irc_part { | ||
| 87 | my $nick = (split /!/, $_[ARG0])[0]; | ||
| 88 | my $channel = $_[ARG1]; | ||
| 89 | |||
| 90 | print "#-> $nick has parted $channel\n"; | ||
| 91 | } | ||
| 92 | |||
| 93 | #user joined | ||
| 94 | sub irc_join { | ||
| 95 | my $nick = (split /!/, $_[ARG0])[0]; | ||
| 96 | my $channel = $_[ARG1]; | ||
| 97 | |||
| 98 | print "#-> $nick has joined $channel\n"; | ||
| 99 | } | ||
| 100 | |||
| 101 | #user quit | ||
| 102 | sub irc_quit { | ||
| 103 | my $nick = $_[ARG0]; | ||
| 104 | my $reason = $_[ARG1]; | ||
| 105 | |||
| 106 | print "#-> $nick has quit ($reason)\n"; | ||
| 107 | } | ||
| 108 | |||
| 109 | sub irc_pub_msg{ | ||
| 110 | my $kernel = $_[KERNEL]; | ||
| 111 | my $nick = (split /!/, $_[ARG0])[0]; | ||
| 112 | my $channel = $_[ARG1]->[0]; | ||
| 113 | my $msg = $_[ARG2]; | ||
| 114 | |||
| 115 | print "$channel: <$nick> $msg\n"; | ||
| 116 | } | ||
| 117 | |||
| 118 | #start everything | ||
| 119 | $poe_kernel->run(); | ||
