diff options
| -rw-r--r-- | bot.pl | 116 |
1 files changed, 48 insertions, 68 deletions
| @@ -3,7 +3,6 @@ | |||
| 3 | use strict; | 3 | use strict; |
| 4 | use DBI; | 4 | use DBI; |
| 5 | 5 | ||
| 6 | |||
| 7 | # IRC Server stuff | 6 | # IRC Server stuff |
| 8 | use POE; | 7 | use POE; |
| 9 | use POE::Component::IRC; | 8 | use POE::Component::IRC; |
| @@ -11,8 +10,7 @@ use POE::Component::IRC; | |||
| 11 | my $current_nick = "francoise"; | 10 | my $current_nick = "francoise"; |
| 12 | my $channel = '#test'; | 11 | my $channel = '#test'; |
| 13 | 12 | ||
| 14 | POE::Component::IRC->new("irc_client"); | 13 | POE::Component::IRC->new("francoise"); |
| 15 | |||
| 16 | POE::Session->new ( _start => \&irc_start, | 14 | POE::Session->new ( _start => \&irc_start, |
| 17 | irc_join => \&irc_join, | 15 | irc_join => \&irc_join, |
| 18 | irc_part => \&irc_part, | 16 | irc_part => \&irc_part, |
| @@ -25,12 +23,12 @@ POE::Session->new ( _start => \&irc_start, | |||
| 25 | irc_public => \&irc_pub_msg, | 23 | irc_public => \&irc_pub_msg, |
| 26 | irc_msg => \&irc_priv_msg, | 24 | irc_msg => \&irc_priv_msg, |
| 27 | irc_ctcp_action => \&irc_action, | 25 | irc_ctcp_action => \&irc_action, |
| 28 | _default => \&_default, | 26 | # _default => \&_default, |
| 29 | ); | 27 | ); |
| 30 | 28 | ||
| 31 | sub _default { | 29 | sub _default { |
| 32 | if ( $_[ARG0] =~ /^irc_(.*)$/ ) { | 30 | if ( $_[ARG0] =~ /^irc_(.*)$/ ) { |
| 33 | # print "IRC $1 received\n"; | 31 | print "IRC $1 received\n"; |
| 34 | } | 32 | } |
| 35 | } | 33 | } |
| 36 | 34 | ||
| @@ -54,60 +52,53 @@ my $dbh = DBI->connect("DBI:Pg:dbname='francoise'", 'francoise', 'kiffer') | |||
| 54 | or die "ohoh, datenbank b0rken: $!"; | 52 | or die "ohoh, datenbank b0rken: $!"; |
| 55 | 53 | ||
| 56 | sub irc_start { | 54 | sub irc_start { |
| 57 | # KERNEL, HEAP, and SESSION are constants exported by POE | 55 | my ( $kernel, $heap, $session ) = @_[KERNEL, HEAP, SESSION ]; |
| 58 | my $kernel = $_[KERNEL]; | ||
| 59 | my $heap = $_[HEAP]; | ||
| 60 | my $session = $_[SESSION]; | ||
| 61 | 56 | ||
| 62 | $kernel->refcount_increment( $session->ID(), "my bot"); | 57 | $kernel->refcount_increment( $session->ID(), "my bot"); |
| 63 | $kernel->post(irc_client=> register=> "all"); | 58 | $kernel->post(francoise=> register=> "all"); |
| 64 | 59 | ||
| 65 | $kernel->post(irc_client=>connect=> { Nick => $current_nick, | 60 | $kernel->post(francoise=>connect=> { Nick => $current_nick, |
| 66 | Username => 'francoise', | 61 | Username => 'francoise', |
| 67 | Ircname => 'francoise', | 62 | Ircname => 'francoise', |
| 68 | Server => 'irc.kiffer.de', | 63 | Server => 'irc.kiffer.de', |
| 69 | Port => '6667', | 64 | Port => '6667', |
| 70 | } | 65 | } |
| 71 | ); | 66 | ); |
| 72 | } | 67 | } |
| 73 | 68 | ||
| 74 | sub irc_connect { | 69 | sub irc_connect { |
| 75 | my $kernel = $_[KERNEL]; | 70 | my $kernel = $_[KERNEL]; |
| 76 | 71 | $kernel->post(francoise=>join=>$channel); | |
| 77 | $kernel->post(irc_client=>join=>$channel); | ||
| 78 | } | 72 | } |
| 79 | 73 | ||
| 80 | sub irc_motd { | 74 | sub irc_motd { |
| 81 | my $msg = $_[ARG1]; | 75 | my $msg = $_[ARG1]; |
| 82 | |||
| 83 | print "MOTD: $msg\n"; | 76 | print "MOTD: $msg\n"; |
| 84 | } | 77 | } |
| 85 | 78 | ||
| 86 | sub irc_names { | 79 | sub irc_names { |
| 87 | my $kernel = $_[KERNEL]; | 80 | my $kernel = $_[KERNEL]; |
| 88 | my $names = (split /:/, $_[ARG1])[1]; | 81 | my ( $channel, $names ) = (split /:/, $_[ARG1]); |
| 89 | my $channel = (split /:/, $_[ARG1])[0]; | ||
| 90 | 82 | ||
| 91 | $channel =~ s/[@|=] (.*?) /$1/; | 83 | $channel =~ s/[@|=] (.*?) /$1/; |
| 92 | |||
| 93 | print "#-> Users on $channel [ $names ]\n"; | 84 | print "#-> Users on $channel [ $names ]\n"; |
| 94 | 85 | ||
| 95 | for my $user (split / /, $names) { | 86 | for my $user (split / /, $names) { |
| 96 | $user =~ s/^[@%+]//; | 87 | $user =~ s/^[@%+]//; |
| 97 | $kernel->post( 'irc_client', 'whois', $user); | 88 | $kernel->post( 'francoise', 'whois', $user); |
| 98 | } | 89 | } |
| 99 | } | 90 | } |
| 100 | 91 | ||
| 101 | #nick change | 92 | #nick change |
| 102 | sub irc_nick { | 93 | sub irc_nick { |
| 94 | my ( $kernel, $newnick_ ) = @_[ KERNEL, ARG1 ]; | ||
| 103 | my $oldnick_ = (split /!/, $_[ARG0])[0]; | 95 | my $oldnick_ = (split /!/, $_[ARG0])[0]; |
| 104 | my $newnick_ = $_[ARG1]; | ||
| 105 | 96 | ||
| 106 | my $oldnick = francoise_getbasenick( $oldnick_ ); | 97 | my $oldnick = francoise_getbasenick( $oldnick_ ); |
| 107 | my $newnick = francoise_getbasenick( $newnick_ ); | 98 | my $newnick = francoise_getbasenick( $newnick_ ); |
| 108 | 99 | ||
| 109 | if( $newnick_ ne $current_nick && $newnick ne $oldnick ) { | 100 | if( $newnick_ ne $current_nick && $newnick ne $oldnick ) { |
| 110 | francoise_verifyuser( $newnick_, '', 0 ); | 101 | francoise_verifyuser( $newnick_, '', 0, $kernel ); |
| 111 | } | 102 | } |
| 112 | 103 | ||
| 113 | print "#-> $oldnick_ is now known as $newnick_\n"; | 104 | print "#-> $oldnick_ is now known as $newnick_\n"; |
| @@ -117,19 +108,17 @@ sub irc_nick { | |||
| 117 | sub irc_part { | 108 | sub irc_part { |
| 118 | my $nick = (split /!/, $_[ARG0])[0]; | 109 | my $nick = (split /!/, $_[ARG0])[0]; |
| 119 | my $channel = $_[ARG1]; | 110 | my $channel = $_[ARG1]; |
| 120 | |||
| 121 | print "#-> $nick has parted $channel\n"; | 111 | print "#-> $nick has parted $channel\n"; |
| 122 | } | 112 | } |
| 123 | 113 | ||
| 124 | #user joined | 114 | #user joined |
| 125 | sub irc_join { | 115 | sub irc_join { |
| 126 | my $kernel = $_[KERNEL]; | 116 | my ( $kernel, $channel ) = @_[KERNEL, ARG1]; |
| 127 | my $nick = (split /!/, $_[ARG0])[0]; | 117 | my $nick = (split /!/, $_[ARG0])[0]; |
| 128 | my $channel = $_[ARG1]; | ||
| 129 | my $host = (split /@/, $_[ARG0])[1]; | 118 | my $host = (split /@/, $_[ARG0])[1]; |
| 130 | 119 | ||
| 131 | if( $nick eq $current_nick ) { | 120 | if( $nick eq $current_nick ) { |
| 132 | $kernel->post( 'irc_client', 'privmsg', $channel, 'Hier bin ich!'); | 121 | $kernel->post( 'francoise', 'privmsg', $channel, 'Hier bin ich!'); |
| 133 | } else { | 122 | } else { |
| 134 | francoise_verifyuser( $nick, $host, 1 ); | 123 | francoise_verifyuser( $nick, $host, 1 ); |
| 135 | } | 124 | } |
| @@ -141,15 +130,13 @@ sub irc_join { | |||
| 141 | sub irc_quit { | 130 | sub irc_quit { |
| 142 | my $nick = $_[ARG0]; | 131 | my $nick = $_[ARG0]; |
| 143 | my $reason = $_[ARG1]; | 132 | my $reason = $_[ARG1]; |
| 144 | |||
| 145 | print "#-> $nick has quit ($reason)\n"; | 133 | print "#-> $nick has quit ($reason)\n"; |
| 146 | } | 134 | } |
| 147 | 135 | ||
| 148 | sub irc_pub_msg{ | 136 | sub irc_pub_msg{ |
| 149 | my $kernel = $_[KERNEL]; | 137 | my ( $kernel, $msg ) = @_[KERNEL, ARG2]; |
| 150 | my $nick_ = (split /!/, $_[ARG0])[0]; | ||
| 151 | my $channel = $_[ARG1]->[0]; | 138 | my $channel = $_[ARG1]->[0]; |
| 152 | my $msg = $_[ARG2]; | 139 | my $nick_ = (split /!/, $_[ARG0])[0]; |
| 153 | my @words = (split / /, $msg); | 140 | my @words = (split / /, $msg); |
| 154 | my $numwords = $#words; | 141 | my $numwords = $#words; |
| 155 | 142 | ||
| @@ -162,12 +149,12 @@ sub irc_pub_msg{ | |||
| 162 | if( $msg =~ /^wo ist (\S+)\??$/i ) { | 149 | if( $msg =~ /^wo ist (\S+)\??$/i ) { |
| 163 | my $wois_ = $1; | 150 | my $wois_ = $1; |
| 164 | my $wois = francoise_getbasenick( $1 ); | 151 | my $wois = francoise_getbasenick( $1 ); |
| 165 | my $sth = $dbh->prepare( "SELECT awaymsg FROM users WHERE nick = '$wois' AND isaway = 'true'"); | 152 | my $sth = $dbh->prepare( "SELECT awaymsg FROM users WHERE nick = ? AND isaway = 'true'"); |
| 166 | $sth->execute(); | 153 | $sth->execute( $wois ); |
| 167 | if ( my @awaymsg = $sth->fetchrow_array ) { | 154 | if ( my @awaymsg = $sth->fetchrow_array ) { |
| 168 | $kernel->post( 'irc_client', 'privmsg', $channel, "$wois_ ist $awaymsg[0]" ); | 155 | $kernel->post( 'francoise', 'privmsg', $channel, "$wois_ ist $awaymsg[0]" ); |
| 169 | } else { | 156 | } else { |
| 170 | $kernel->post( 'irc_client', 'privmsg', $channel, "Ich weiss nicht, wo $wois_ ist." ); | 157 | $kernel->post( 'francoise', 'privmsg', $channel, "Ich weiss nicht, wo $wois_ ist." ); |
| 171 | } | 158 | } |
| 172 | } elsif( $msg =~ /(.+?) ($hv) (.*)$/i ) { | 159 | } elsif( $msg =~ /(.+?) ($hv) (.*)$/i ) { |
| 173 | my $trigger = $1; | 160 | my $trigger = $1; |
| @@ -181,15 +168,16 @@ sub irc_pub_msg{ | |||
| 181 | $sth->execute( $msg ); | 168 | $sth->execute( $msg ); |
| 182 | if( my ($trigger, $hilfsverb, $reply) = $sth->fetchrow_array ) { | 169 | if( my ($trigger, $hilfsverb, $reply) = $sth->fetchrow_array ) { |
| 183 | if( $reply =~ /^<reply>(.*)$/ ) { | 170 | if( $reply =~ /^<reply>(.*)$/ ) { |
| 184 | $kernel->post( 'irc_client', 'privmsg', $channel, "$1"); | 171 | $kernel->post( 'francoise', 'privmsg', $channel, "$1"); |
| 185 | } else { | 172 | } else { |
| 186 | $kernel->post( 'irc_client', 'privmsg', $channel, "$trigger $hilfsverb $reply"); | 173 | $kernel->post( 'francoise', 'privmsg', $channel, "$trigger $hilfsverb $reply"); |
| 187 | } | 174 | } |
| 188 | } | 175 | } |
| 189 | } | 176 | } |
| 190 | 177 | ||
| 191 | if( $nick ne $current_nick ) { | 178 | if( $nick ne $current_nick ) { |
| 192 | $dbh->do( "UPDATE users SET lines = lines + 1, words = words + $numwords + 1, isaway = false WHERE nick = '$nick'" ); | 179 | my $sth = $dbh->do( "UPDATE users SET lines = lines + 1, words = words + $numwords + 1, isaway = false WHERE nick = ?" ); |
| 180 | $sth->execute( $nick ); | ||
| 193 | } | 181 | } |
| 194 | 182 | ||
| 195 | print "$channel: <$nick> $msg\n"; | 183 | print "$channel: <$nick> $msg\n"; |
| @@ -203,8 +191,8 @@ sub irc_action{ | |||
| 203 | 191 | ||
| 204 | if( $msg =~ /^ist (.+)$/ ) { | 192 | if( $msg =~ /^ist (.+)$/ ) { |
| 205 | my $awaymsg = $1; | 193 | my $awaymsg = $1; |
| 206 | my $sth = $dbh->prepare( "UPDATE users SET isaway = true, awaymsg = ? WHERE nick = '$nick'"); | 194 | my $sth = $dbh->prepare( "UPDATE users SET isaway = true, awaymsg = ? WHERE nick = ?"); |
| 207 | $sth->execute( $awaymsg ); | 195 | $sth->execute( $awaymsg, $nick ); |
| 208 | } | 196 | } |
| 209 | } | 197 | } |
| 210 | 198 | ||
| @@ -217,14 +205,13 @@ sub irc_priv_msg{ | |||
| 217 | } | 205 | } |
| 218 | 206 | ||
| 219 | if( $msg =~ /^!say (.*)$/ ) { | 207 | if( $msg =~ /^!say (.*)$/ ) { |
| 220 | $kernel->post( 'irc_client', 'privmsg', $channel, $1); } | 208 | $kernel->post( 'francoise', 'privmsg', $channel, $1); } |
| 221 | 209 | ||
| 222 | print "PRIV: [$nick] $msg\n"; | 210 | print "PRIV: [$nick] $msg\n"; |
| 223 | } | 211 | } |
| 224 | 212 | ||
| 225 | sub irc_whois{ | 213 | sub irc_whois{ |
| 226 | my $nick = (split / /, $_[ARG1])[0]; | 214 | my ( $nick, $host ) = (split / /, $_[ARG1])[0,2]; |
| 227 | my $host = (split / /, $_[ARG1])[2]; | ||
| 228 | 215 | ||
| 229 | if( $nick ne $current_nick ) { | 216 | if( $nick ne $current_nick ) { |
| 230 | francoise_verifyuser( $nick, $host, 0 ); | 217 | francoise_verifyuser( $nick, $host, 0 ); |
| @@ -234,12 +221,11 @@ sub irc_whois{ | |||
| 234 | sub francoise_getbasenick{ | 221 | sub francoise_getbasenick{ |
| 235 | my $nick = $_[0]; | 222 | my $nick = $_[0]; |
| 236 | 223 | ||
| 237 | |||
| 238 | $nick = ( split /_/, $nick )[0] || $nick; | 224 | $nick = ( split /_/, $nick )[0] || $nick; |
| 239 | $nick = ( split /\|/, $nick )[0] || $nick; | 225 | $nick = ( split /\|/, $nick )[0] || $nick; |
| 240 | 226 | ||
| 241 | my $sth = $dbh->prepare( "SELECT nick FROM aliases WHERE alias = '$nick'" ); | 227 | my $sth = $dbh->prepare( "SELECT nick FROM aliases WHERE alias = ?" ); |
| 242 | $sth->execute(); | 228 | $sth->execute($nick); |
| 243 | if( my @row = $sth->fetchrow_array ) { | 229 | if( my @row = $sth->fetchrow_array ) { |
| 244 | $nick = $row[0]; | 230 | $nick = $row[0]; |
| 245 | } | 231 | } |
| @@ -248,11 +234,7 @@ sub francoise_getbasenick{ | |||
| 248 | } | 234 | } |
| 249 | 235 | ||
| 250 | sub francoise_verifyuser { | 236 | sub francoise_verifyuser { |
| 251 | my $nick_ = $_[0]; | 237 | my ( $nick_, $host, $updtime, $kernel ) = @_; |
| 252 | my $host = $_[1]; | ||
| 253 | my $updtime = $_[2]; | ||
| 254 | my $kernel = $_[3]; | ||
| 255 | |||
| 256 | my $nick = francoise_getbasenick( $nick_ ); | 238 | my $nick = francoise_getbasenick( $nick_ ); |
| 257 | 239 | ||
| 258 | if( $host ) { | 240 | if( $host ) { |
| @@ -263,23 +245,22 @@ sub francoise_verifyuser { | |||
| 263 | $dbh->do( "UPDATE users SET lasthost = '$host'" . ( $updtime ? ", lastlogin = now()" : "" ) . " WHERE nick = '$nick'" ); | 245 | $dbh->do( "UPDATE users SET lasthost = '$host'" . ( $updtime ? ", lastlogin = now()" : "" ) . " WHERE nick = '$nick'" ); |
| 264 | } | 246 | } |
| 265 | } else { | 247 | } else { |
| 266 | $kernel->post( 'irc_client', 'whois', $nick_); | 248 | $kernel->post( 'francoise', 'whois', $nick_); |
| 267 | } | 249 | } |
| 268 | 250 | ||
| 269 | return $nick; | 251 | return $nick; |
| 270 | } | 252 | } |
| 271 | 253 | ||
| 272 | sub francoise_help { | 254 | sub francoise_help { |
| 273 | my $kernel = $_[0]; | 255 | my ( $kernel, $dest ) = @_; |
| 274 | my $dest = $_[1]; | 256 | |
| 275 | 257 | $kernel->post( 'francoise', 'privmsg', $dest, 'Hallo, ich bin Francoise, der freundliche Kifferchat-Bot.'); | |
| 276 | $kernel->post( 'irc_client', 'privmsg', $dest, 'Hallo, ich bin Francoise, der freundliche Kifferchat-Bot.'); | 258 | $kernel->post( 'francoise', 'privmsg', $dest, 'Ich kann folgende Kommandos ausfuehren:'); |
| 277 | $kernel->post( 'irc_client', 'privmsg', $dest, 'Ich kann folgende Kommandos ausfuehren:'); | 259 | $kernel->post( 'francoise', 'privmsg', $dest, '!help Diese Hilfe anzeigen'); |
| 278 | $kernel->post( 'irc_client', 'privmsg', $dest, '!help Diese Hilfe anzeigen'); | 260 | $kernel->post( 'francoise', 'privmsg', $dest, '!stat Informationen ueber mich ausgeben'); |
| 279 | $kernel->post( 'irc_client', 'privmsg', $dest, '!stat Informationen ueber mich ausgeben'); | 261 | $kernel->post( 'francoise', 'privmsg', $dest, '!topten Die aktivsten Chatter anzeigen'); |
| 280 | $kernel->post( 'irc_client', 'privmsg', $dest, '!topten Die aktivsten Chatter anzeigen'); | 262 | $kernel->post( 'francoise', 'privmsg', $dest, '!topten0r Die 13370rsten Chatter anzeigen'); |
| 281 | $kernel->post( 'irc_client', 'privmsg', $dest, '!topten0r Die 13370rsten Chatter anzeigen'); | 263 | $kernel->post( 'francoise', 'privmsg', $dest, '!forget Einen Trigger vergessen'); |
| 282 | $kernel->post( 'irc_client', 'privmsg', $dest, '!forget Einen Trigger vergessen'); | ||
| 283 | } | 264 | } |
| 284 | 265 | ||
| 285 | sub francoise_stat { | 266 | sub francoise_stat { |
| @@ -287,13 +268,12 @@ sub francoise_stat { | |||
| 287 | } | 268 | } |
| 288 | 269 | ||
| 289 | sub francoise_topten { | 270 | sub francoise_topten { |
| 290 | my $kernel = $_[0]; | 271 | my ($kernel, $dest ) = @_; |
| 291 | my $dest = $_[1]; | ||
| 292 | 272 | ||
| 293 | my $sth = $dbh->prepare( "SELECT words, nick FROM users ORDER BY words DESC LIMIT 10" ); | 273 | my $sth = $dbh->prepare( "SELECT words, nick FROM users ORDER BY words DESC LIMIT 10" ); |
| 294 | $sth->execute(); | 274 | $sth->execute(); |
| 295 | while ( my @row = $sth->fetchrow_array ) { | 275 | while ( my @row = $sth->fetchrow_array ) { |
| 296 | $kernel->post( 'irc_client', 'privmsg', $dest, "$row[0] $row[1]" ); | 276 | $kernel->post( 'francoise', 'privmsg', $dest, "$row[0] $row[1]" ); |
| 297 | } | 277 | } |
| 298 | } | 278 | } |
| 299 | 279 | ||
