diff options
| -rw-r--r-- | bot.pl | 279 | ||||
| -rw-r--r-- | tables.sql | 1 |
2 files changed, 113 insertions, 167 deletions
| @@ -7,8 +7,8 @@ use DBI; | |||
| 7 | use POE; | 7 | use POE; |
| 8 | use POE::Component::IRC; | 8 | use POE::Component::IRC; |
| 9 | 9 | ||
| 10 | my $current_nick = 'francoise'; | 10 | my $current_nick = 'francoise_'; |
| 11 | my $channel = '#kiffer.de'; | 11 | my $channel = '#test'; |
| 12 | 12 | ||
| 13 | POE::Component::IRC->new("francoise"); | 13 | POE::Component::IRC->new("francoise"); |
| 14 | POE::Session->new ( _start => \&irc_start, | 14 | POE::Session->new ( _start => \&irc_start, |
| @@ -23,14 +23,9 @@ POE::Session->new ( _start => \&irc_start, | |||
| 23 | irc_public => \&irc_pub_msg, | 23 | irc_public => \&irc_pub_msg, |
| 24 | irc_msg => \&irc_priv_msg, | 24 | irc_msg => \&irc_priv_msg, |
| 25 | irc_ctcp_action => \&irc_action, | 25 | irc_ctcp_action => \&irc_action, |
| 26 | # _default => \&_default, | 26 | # _default => \&irc_default, |
| 27 | ); | 27 | ); |
| 28 | 28 | ||
| 29 | sub _default { | ||
| 30 | if ( $_[ARG0] =~ /^irc_(.*)$/ ) { | ||
| 31 | print "IRC $1 received\n"; | ||
| 32 | } | ||
| 33 | } | ||
| 34 | 29 | ||
| 35 | my %commands = ( 'help' => \&francoise_help, | 30 | my %commands = ( 'help' => \&francoise_help, |
| 36 | 'stat' => \&francoise_stat, | 31 | 'stat' => \&francoise_stat, |
| @@ -75,27 +70,25 @@ sub irc_start { | |||
| 75 | ); | 70 | ); |
| 76 | } | 71 | } |
| 77 | 72 | ||
| 78 | sub irc_connect { | 73 | # minifunctions, console output only |
| 79 | my $kernel = $_[KERNEL]; | 74 | sub irc_connect { $_[KERNEL]->post(francoise=>join=>$channel); } |
| 80 | $kernel->post(francoise=>join=>$channel); | 75 | sub irc_motd { my $msg = $_[ARG1]; print "MOTD: $msg\n"; } |
| 81 | } | 76 | sub irc_part { my $channel = $_[ARG1]; my $nick = (split /!/, $_[ARG0])[0]; print "#-> $nick has parted $channel\n"; } |
| 82 | 77 | sub irc_quit { my $nick = $_[ARG0]; my $reason = $_[ARG1]; print "#-> $nick has quit ($reason)\n"; } | |
| 83 | sub irc_motd { | 78 | sub irc_default { print "IRC $1 received\n" if ( $_[ARG0] =~ /^irc_(.*)$/ ); } |
| 84 | my $msg = $_[ARG1]; | ||
| 85 | print "MOTD: $msg\n"; | ||
| 86 | } | ||
| 87 | 79 | ||
| 80 | #names list on join, check all users | ||
| 88 | sub irc_names { | 81 | sub irc_names { |
| 89 | my $kernel = $_[KERNEL]; | 82 | my $kernel = $_[KERNEL]; |
| 90 | my ( $channel, $names ) = (split /:/, $_[ARG1]); | 83 | my ( $channel, $names ) = (split /:/, $_[ARG1]); |
| 91 | 84 | ||
| 92 | $channel =~ s/[@|=] (.*?) /$1/; | 85 | for my $user ( split ' ', $names ) { |
| 93 | print "#-> Users on $channel [ $names ]\n"; | ||
| 94 | |||
| 95 | for my $user (split / /, $names) { | ||
| 96 | $user =~ s/^[@%+]//; | 86 | $user =~ s/^[@%+]//; |
| 97 | $kernel->post( 'francoise', 'whois', $user); | 87 | $kernel->post( 'francoise', 'whois', $user); |
| 98 | } | 88 | } |
| 89 | |||
| 90 | $channel =~ s/[@|=] (.*?) /$1/; | ||
| 91 | print "#-> Users on $channel [ $names ]\n"; | ||
| 99 | } | 92 | } |
| 100 | 93 | ||
| 101 | #nick change | 94 | #nick change |
| @@ -106,144 +99,112 @@ sub irc_nick { | |||
| 106 | my $oldnick = francoise_getbasenick( $oldnick_ ); | 99 | my $oldnick = francoise_getbasenick( $oldnick_ ); |
| 107 | my $newnick = francoise_getbasenick( $newnick_ ); | 100 | my $newnick = francoise_getbasenick( $newnick_ ); |
| 108 | 101 | ||
| 109 | if( $newnick_ ne $current_nick && $newnick ne $oldnick ) { | 102 | francoise_verifyuser( $newnick_, '', 0, $kernel ) |
| 110 | francoise_verifyuser( $newnick_, '', 0, $kernel ); | 103 | if $newnick_ ne $current_nick && $newnick ne $oldnick; |
| 111 | } | ||
| 112 | 104 | ||
| 113 | print "#-> $oldnick_ is now known as $newnick_\n"; | 105 | print "#-> $oldnick_ is now known as $newnick_\n"; |
| 114 | } | 106 | } |
| 115 | 107 | ||
| 116 | #user parted | ||
| 117 | sub irc_part { | ||
| 118 | my $channel = $_[ARG1]; | ||
| 119 | if ( $_[ARG0] =~ /(.+)!~(.+)@(.+)/ ) { | ||
| 120 | my $nick = $1; my $user = $2; my $host = $3; | ||
| 121 | print "#-> $nick has parted $channel\n"; | ||
| 122 | } | ||
| 123 | } | ||
| 124 | |||
| 125 | #user joined | 108 | #user joined |
| 126 | sub irc_join { | 109 | sub irc_join { |
| 127 | my ( $kernel, $channel ) = @_[KERNEL, ARG1]; | 110 | my ( $kernel, $channel ) = @_[KERNEL, ARG1]; |
| 128 | 111 | ||
| 129 | if ( $_[ARG0] =~ /(.+)!~(.+)@(.+)/ ) { | 112 | $_[ARG0] =~ /(.+)!~(.+)@(.+)/ or return; |
| 130 | my $nick = $1; my $user = $2; my $host = $3; | 113 | my ( $nick, $user, $host ) = ($1,$2,$3); |
| 131 | 114 | ||
| 132 | if( $nick eq $current_nick ) { | 115 | $kernel->post( 'francoise', 'privmsg', $channel, 'Hier bin ich!'), return |
| 133 | $kernel->post( 'francoise', 'privmsg', $channel, 'Hier bin ich!'); | 116 | if $nick eq $current_nick; |
| 134 | } else { | ||
| 135 | if( $host eq 'jamaica.kiffer.de' ) { | ||
| 136 | if( $jamaica{$user} && time() - $jamaicat{$user} < $jamaicatimeout ) { | ||
| 137 | $kernel->post( 'francoise', 'privmsg', $channel, "Ich glaub ja, $jamaica{$user} und $nick kennen sich." ) | ||
| 138 | } | ||
| 139 | $jamaica{$user} = $nick; $jamaicat{$user} = time(); | ||
| 140 | } | ||
| 141 | 117 | ||
| 142 | francoise_verifyuser( $nick, $host, 1 ); | 118 | francoise_verifyuser( $nick, $host, 1 ); |
| 143 | } | 119 | return unless $host eq 'jamaica.kiffer.de'; |
| 144 | 120 | ||
| 145 | print "#-> $nick has joined $channel\n"; | 121 | $kernel->post( 'francoise', 'privmsg', $channel, "Ich glaub ja, $jamaica{$user} und $nick kennen sich.") |
| 146 | } | 122 | if $jamaica{$user} && $nick ne $jamaica{$user} && time() - $jamaicat{$user} < $jamaicatimeout; |
| 147 | } | 123 | $jamaica{$user} = $nick; $jamaicat{$user} = time(); |
| 148 | 124 | ||
| 149 | #user quit | 125 | print "#-> $nick has joined $channel\n"; |
| 150 | sub irc_quit { | ||
| 151 | my $nick = $_[ARG0]; | ||
| 152 | my $reason = $_[ARG1]; | ||
| 153 | print "#-> $nick has quit ($reason)\n"; | ||
| 154 | } | 126 | } |
| 155 | 127 | ||
| 128 | |||
| 156 | sub irc_pub_msg{ | 129 | sub irc_pub_msg{ |
| 157 | my ( $kernel, $msg ) = @_[KERNEL, ARG2]; | 130 | my ( $kernel, $msg ) = @_[KERNEL, ARG2]; |
| 158 | my $channel = $_[ARG1]->[0]; | 131 | my $channel = $_[ARG1]->[0]; |
| 159 | my $nick_ = (split /!/, $_[ARG0])[0]; | 132 | my $nick_ = (split /!/, $_[ARG0])[0]; |
| 160 | my @words = (split / /, $msg); | 133 | my @words = (split / /, $msg); |
| 161 | my $numwords = $#words; | 134 | my $w0rds = 0; |
| 162 | 135 | ||
| 136 | #tidy nick and tidy msg from dest nick | ||
| 163 | my $nick = francoise_verifyuser( $nick_, "", 0, $kernel ); | 137 | my $nick = francoise_verifyuser( $nick_, "", 0, $kernel ); |
| 138 | $msg =~ s/^\S+: +//; | ||
| 164 | 139 | ||
| 165 | if( $msg =~ /^!(\S+) *(.*)$/ ) { | 140 | #execute commands |
| 166 | &{$commands{ $1 } || \&francoise_donothing } ( $kernel, $channel, $2 ); | 141 | &{$commands{ $1 } || \&francoise_donothing } ( $kernel, $channel, $2 ) |
| 167 | } | 142 | if $msg =~ /^!(\S+) *(.*)$/; |
| 143 | |||
| 144 | #update dictionary | ||
| 145 | my $sth_lookup = $dbh->prepare( "SELECT COUNT(*) FROM words WHERE word = ?"); | ||
| 146 | my $sth_insert = $dbh->prepare( "INSERT INTO words ( word, is_0r, is_action ) VALUES ( ?, ?, ? )"); | ||
| 168 | 147 | ||
| 169 | for my $word ( @words ) { | 148 | for my $word ( @words ) { |
| 170 | my $is0r = 'false'; my $isact = 'false'; | 149 | my $is0r = 'false'; my $isact = 'false'; |
| 171 | my $sth = $dbh->prepare( "SELECT COUNT(*) FROM words WHERE word = ?"); | 150 | $sth_lookup->execute( $word ); |
| 172 | $sth->execute( $word ); | 151 | $is0r = 'true', $w0rds++ if $word =~ /0r/; |
| 173 | next if (($sth->fetchrow_array)) > 0; | 152 | $isact = 'true' if $word =~ /^\*.*\*$/; |
| 174 | $is0r = 'true' if $word =~ /0r/; | 153 | $sth_insert->execute( $word, $is0r, $isact ) |
| 175 | $isact = 'true' if $word =~ /^\*.*\*$/; | 154 | unless ($sth_lookup->fetchrow_array)[0]; |
| 176 | $sth = $dbh->prepare("INSERT INTO words ( word, is_0r, is_action ) VALUES ( ?, ?, ? )"); | ||
| 177 | $sth->execute( $word, $is0r, $isact ); | ||
| 178 | } | 155 | } |
| 179 | 156 | ||
| 157 | #reply to whereis requests | ||
| 180 | if ( $msg =~ /^wo ist (\S+?)\??$/i ) { | 158 | if ( $msg =~ /^wo ist (\S+?)\??$/i ) { |
| 181 | my $wois_ = $1; | 159 | my $wois_ = $1; |
| 182 | my $wois = francoise_getbasenick( $1 ); | 160 | my $wois = francoise_getbasenick( $1 ); |
| 183 | my $sth = $dbh->prepare( "SELECT awaymsg FROM users WHERE nick = ? AND isaway = 'true'"); | 161 | my ($awaymsg) = $dbh->selectrow_array( "SELECT awaymsg FROM users WHERE nick = ? AND isaway = 'true'", undef, $wois); |
| 184 | $sth->execute( $wois ); | 162 | |
| 185 | if ( my @awaymsg = $sth->fetchrow_array ) { | 163 | $kernel->post( 'francoise', 'privmsg', $channel, $awaymsg ? "$wois_ ist $awaymsg" : "Ich weiss nicht, wo $wois_ ist." ); |
| 186 | $kernel->post( 'francoise', 'privmsg', $channel, "$wois_ ist $awaymsg[0]" ); | 164 | |
| 187 | } else { | 165 | } elsif( $msg =~ /^(.+?)\s+($hv)\s+(.*)$/i ) { |
| 188 | $kernel->post( 'francoise', 'privmsg', $channel, "Ich weiss nicht, wo $wois_ ist." ); | 166 | #learn some new knowledge |
| 189 | } | 167 | my ( $trigger, $hilfsverb, $reply ) = ($1,$2,$3); |
| 190 | } elsif( $msg =~ /^(?:\S+: )?(.+?)\s+($hv)\s+(.*)$/i ) { | 168 | |
| 191 | my $trigger = $1; | 169 | $dbh->do( "INSERT INTO knowledge ( trigger, hilfsverb, reply ) VALUES ( ?, ?, ?) ", undef, $trigger, $hilfsverb, $reply ) |
| 192 | my $hilfsverb = $2; | 170 | unless ($dbh->selectrow_array( |
| 193 | my $reply = $3; | 171 | "SELECT COUNT(*) FROM knowledge WHERE trigger = ? AND hilfsverb = ? AND reply = ?", undef, $trigger, $hilfsverb, $reply |
| 194 | 172 | ))[0]; | |
| 195 | my $sth = $dbh->prepare( "SELECT COUNT(*) FROM knowledge WHERE trigger = ? AND hilfsverb = ? AND reply = ?;" ); | 173 | |
| 196 | $sth->execute( $trigger, $hilfsverb, $reply ); | ||
| 197 | my ($cnt) = $sth->fetchrow_array; | ||
| 198 | print "$cnt \n"; | ||
| 199 | |||
| 200 | if( $cnt == 0 ) { | ||
| 201 | $sth = $dbh->prepare( "INSERT INTO knowledge ( trigger, hilfsverb, reply ) VALUES ( ?, ?, ?) " ); | ||
| 202 | $sth->execute( $trigger, $hilfsverb, $reply ); | ||
| 203 | } | ||
| 204 | } else { | 174 | } else { |
| 205 | my $sth = $dbh->prepare( "SELECT trigger, hilfsverb, reply FROM knowledge WHERE trigger = ? ORDER BY RANDOM() LIMIT 1"); | 175 | #search in our knowledge |
| 206 | $sth->execute( $msg ); | 176 | my $thr = join ' ', $dbh->selectrow_array( |
| 207 | if( my ($trigger, $hilfsverb, $reply) = $sth->fetchrow_array ) { | 177 | "SELECT trigger, hilfsverb, reply FROM knowledge WHERE trigger = ? ORDER BY RANDOM() LIMIT 1", undef, $msg ); |
| 208 | if( $reply =~ /^<reply>(.*)$/ ) { | 178 | $thr =~ s/^.*?(?:<reply> )(.*)$/$1/; |
| 209 | $kernel->post( 'francoise', 'privmsg', $channel, "$1"); | 179 | $kernel->post( 'francoise', 'privmsg', $channel, $thr ) if $thr; |
| 210 | } else { | ||
| 211 | $kernel->post( 'francoise', 'privmsg', $channel, "$trigger $hilfsverb $reply"); | ||
| 212 | } | ||
| 213 | } | ||
| 214 | } | 180 | } |
| 215 | 181 | ||
| 216 | if( $nick ne $current_nick ) { | 182 | #credit word and line count to user |
| 217 | my $sth = $dbh->prepare( "UPDATE users SET lines = lines + 1, words = words + $numwords + 1, isaway = false WHERE nick = ?" ); | 183 | $dbh->do( "UPDATE users SET lines = lines + 1, words = words + ?, w0rds = w0rds + ?, isaway = false WHERE nick = ?", |
| 218 | $sth->execute( $nick ); | 184 | undef, $#words + 1, $w0rds, $nick ) if $nick ne $current_nick; |
| 219 | } | ||
| 220 | 185 | ||
| 221 | print "$channel: <$nick> $msg\n"; | 186 | print "$channel: <$nick> $msg\n"; |
| 222 | } | 187 | } |
| 223 | 188 | ||
| 224 | sub irc_action{ | 189 | sub irc_action{ |
| 225 | my ( $who, $msg ) = @_[ ARG0, ARG2 ]; | 190 | my ( $who, $msg ) = @_[ ARG0, ARG2 ]; |
| 226 | my $nick_ = ( split /!/, $who )[0]; | 191 | my $nick = francoise_getbasenick( ( split /!/, $who )[0] ); |
| 227 | |||
| 228 | my $nick = francoise_getbasenick( $nick_ ); | ||
| 229 | 192 | ||
| 230 | if( $msg =~ /^ist (.+)$/ ) { | 193 | #note whereis information |
| 231 | my $awaymsg = $1; | 194 | $dbh->do( "UPDATE users SET isaway = true, awaymsg = ? WHERE nick = ?", undef, $1, $nick ) |
| 232 | my $sth = $dbh->prepare( "UPDATE users SET isaway = true, awaymsg = ? WHERE nick = ?"); | 195 | if( $msg =~ /^ist (.+)$/ ); |
| 233 | $sth->execute( $awaymsg, $nick ); | ||
| 234 | } | ||
| 235 | } | 196 | } |
| 236 | 197 | ||
| 237 | sub irc_priv_msg{ | 198 | sub irc_priv_msg{ |
| 238 | my ( $kernel, $msg ) = @_[KERNEL, ARG2]; | 199 | my ( $kernel, $msg ) = @_[KERNEL, ARG2]; |
| 239 | my $nick = (split /!/, $_[ARG0])[0]; | 200 | my $nick = (split /!/, $_[ARG0])[0]; |
| 240 | 201 | ||
| 241 | if( $msg =~ /^!(\S+) *(.*)$/ ) { | 202 | &{$commands{ $1 } || \&francoise_donothing } ( $kernel, $nick, $2 ) |
| 242 | &{$commands{ $1 } || \&francoise_donothing } ( $kernel, $nick, $2 ); | 203 | if( $msg =~ /^!(\S+) *(.*)$/ ); |
| 243 | } | ||
| 244 | 204 | ||
| 245 | if( $msg =~ /^!say (.*)$/ ) { | 205 | #todo: hide that better, the lady is no puppet on a string |
| 246 | $kernel->post( 'francoise', 'privmsg', $channel, $1); } | 206 | $kernel->post( 'francoise', 'privmsg', $channel, $1) |
| 207 | if( $msg =~ /^!say (.*)$/ ); | ||
| 247 | 208 | ||
| 248 | print "PRIV: [$nick] $msg\n"; | 209 | print "PRIV: [$nick] $msg\n"; |
| 249 | } | 210 | } |
| @@ -251,38 +212,28 @@ sub irc_priv_msg{ | |||
| 251 | sub irc_whois{ | 212 | sub irc_whois{ |
| 252 | my ( $nick, $host ) = (split / /, $_[ARG1])[0,2]; | 213 | my ( $nick, $host ) = (split / /, $_[ARG1])[0,2]; |
| 253 | 214 | ||
| 254 | if( $nick ne $current_nick ) { | 215 | francoise_verifyuser( $nick, $host, 0 ) |
| 255 | francoise_verifyuser( $nick, $host, 0 ); | 216 | if( $nick ne $current_nick ); |
| 256 | } | ||
| 257 | } | 217 | } |
| 258 | 218 | ||
| 259 | sub francoise_getbasenick{ | 219 | sub francoise_getbasenick{ |
| 260 | my $nick = $_[0]; | 220 | my $nick = $_[0]; $nick =~ s/^(.+?)[_|^-].*/$1/; |
| 261 | $nick =~ s/^(.+)[_|^-].*/$1/; | 221 | return ($dbh->selectrow_array( "SELECT nick FROM aliases WHERE alias = ?", undef, $nick ))[0] || $nick; |
| 262 | |||
| 263 | my $sth = $dbh->prepare( "SELECT nick FROM aliases WHERE alias = ?" ); | ||
| 264 | $sth->execute($nick); | ||
| 265 | if( my @row = $sth->fetchrow_array ) { | ||
| 266 | $nick = $row[0]; | ||
| 267 | } | ||
| 268 | |||
| 269 | return $nick; | ||
| 270 | } | 222 | } |
| 271 | 223 | ||
| 272 | sub francoise_verifyuser { | 224 | sub francoise_verifyuser { |
| 273 | my ( $nick_, $host, $updtime, $kernel ) = @_; | 225 | my ( $nick_, $host, $updtime, $kernel ) = @_; |
| 274 | my $nick = francoise_getbasenick( $nick_ ); | 226 | my $nick = francoise_getbasenick( $nick_ ); |
| 275 | 227 | ||
| 276 | if( $host ) { | 228 | $kernel->post( 'francoise', 'whois', $nick_), return $nick |
| 277 | my ($cnt) = $dbh->selectrow_array( "SELECT COUNT(*) FROM users WHERE nick='$nick'" ); | 229 | unless $host; |
| 278 | if ( $cnt == 0 ) { | 230 | |
| 279 | $dbh->do( "INSERT INTO users(id, nick, words, lines, lastlogin, lasthost) VALUES ( '', '$nick', 0, 0, now(), '$host' )"); | 231 | my ($cnt) = $dbh->selectrow_array( "SELECT COUNT(*) FROM users WHERE nick=?", undef, $nick ); |
| 280 | } else { | 232 | |
| 281 | $dbh->do( "UPDATE users SET lasthost = '$host'" . ( $updtime ? ", lastlogin = now()" : "" ) . " WHERE nick = '$nick'" ); | 233 | $dbh->do( "INSERT INTO users(id, nick, words, lines, lastlogin, lasthost) VALUES ( '', ?, 0, 0, now(), ? )", undef, $nick, $host) |
| 282 | } | 234 | unless $cnt; |
| 283 | } else { | 235 | $dbh->do( "UPDATE users SET lasthost = ?" . ( $updtime ? ", lastlogin = now()" : "" ) . " WHERE nick = ?", undef, $host, $nick ) |
| 284 | $kernel->post( 'francoise', 'whois', $nick_); | 236 | if $cnt; |
| 285 | } | ||
| 286 | 237 | ||
| 287 | return $nick; | 238 | return $nick; |
| 288 | } | 239 | } |
| @@ -304,7 +255,7 @@ sub francoise_stat { | |||
| 304 | my $age = time() - $starttime; | 255 | my $age = time() - $starttime; |
| 305 | my $secs = $age % 60; | 256 | my $secs = $age % 60; |
| 306 | my $mins = ( $age / 60 ) % 3600; | 257 | my $mins = ( $age / 60 ) % 3600; |
| 307 | my $hours = ( $age / 3660 ) % 86400; | 258 | my $hours = ( $age / 3600 ) % 86400; |
| 308 | my $days = $age / 86400; | 259 | my $days = $age / 86400; |
| 309 | 260 | ||
| 310 | my $agestring; | 261 | my $agestring; |
| @@ -327,55 +278,49 @@ sub francoise_stat { | |||
| 327 | sub francoise_topten{ | 278 | sub francoise_topten{ |
| 328 | my ($kernel, $dest ) = @_; | 279 | my ($kernel, $dest ) = @_; |
| 329 | 280 | ||
| 330 | my $sth = $dbh->prepare( "SELECT words, nick FROM users ORDER BY words DESC LIMIT 10" ); | 281 | my $sth = $dbh->prepare( "SELECT words, nick FROM users WHERE words > 0 ORDER BY words DESC LIMIT 10" ); |
| 331 | $sth->execute(); | 282 | $sth->execute(); |
| 332 | while ( my @row = $sth->fetchrow_array ) { | 283 | while ( my ($words, $nick) = $sth->fetchrow_array ) { |
| 333 | $kernel->post( 'francoise', 'privmsg', $dest, "$row[0] $row[1]" ); | 284 | $kernel->post( 'francoise', 'privmsg', $dest, "$words $nick" ); |
| 334 | } | 285 | } |
| 335 | } | 286 | } |
| 336 | 287 | ||
| 337 | sub francoise_alias{ | 288 | sub francoise_topten0r { |
| 338 | my ($kernel, $dest, $msg ) = @_; | 289 | my ($kernel, $dest ) = @_; |
| 339 | 290 | ||
| 340 | my ($nick, $alias) = (split / /, $msg ); | 291 | my $sth = $dbh->prepare( "SELECT w0rds, nick FROM users WHERE w0rds > 0 ORDER BY w0rds DESC LIMIT 10" ); |
| 292 | $sth->execute(); | ||
| 341 | 293 | ||
| 342 | my $sth = $dbh->prepare( "SELECT nick FROM aliases WHERE alias = ?" ); | 294 | while ( my ($w0rds, $nick ) = $sth->fetchrow_array ) { |
| 343 | $sth->execute( $nick ); | 295 | $kernel->post( 'francoise', 'privmsg', $dest, "$w0rds $nick" ); |
| 344 | if( my ($tmp) = $sth->fetchrow_array ) { | ||
| 345 | $alias = $nick; $nick = $tmp; | ||
| 346 | } | 296 | } |
| 297 | } | ||
| 347 | 298 | ||
| 348 | $sth = $dbh->prepare( "SELECT COUNT(*) FROM aliases WHERE nick = ? AND alias = ?" ); | 299 | sub francoise_alias{ |
| 349 | $sth->execute( $nick, $alias); | 300 | my ($kernel, $dest, $msg ) = @_; |
| 350 | return if( ($sth->fetchrow_array)[0] > 0 ); | 301 | my ($nick, $alias) = (split / /, $msg ); |
| 351 | |||
| 352 | $sth = $dbh->prepare( "SELECT words, lines FROM users WHERE nick = ?"); | ||
| 353 | $sth->execute($nick); my @userrow = $sth->fetchrow_array; | ||
| 354 | $sth->execute($alias); my @aliasrow = $sth->fetchrow_array; | ||
| 355 | 302 | ||
| 356 | print "@userrow @aliasrow \n"; | 303 | my ($tmp) = $dbh->selectrow_array( "SELECT nick FROM aliases WHERE alias = ?", undef, $nick ); |
| 304 | $alias = $nick, $nick = $tmp if $tmp; | ||
| 357 | 305 | ||
| 358 | if( @userrow && @aliasrow ) { | 306 | ($tmp) = $dbh->selectrow_array( "SELECT COUNT(*) FROM aliases WHERE nick = ? AND alias = ?", undef, $nick, $alias ); |
| 359 | $sth = $dbh->prepare( "UPDATE users SET isaway = false, words = ?, lines = ? WHERE nick = ?" ); | 307 | return if $tmp; |
| 360 | $sth->execute( $userrow[0]+$aliasrow[0], $userrow[1]+$aliasrow[1], $nick ); | ||
| 361 | 308 | ||
| 362 | $sth = $dbh->prepare( "INSERT INTO aliases ( nick, alias ) VALUES ( ?, ? )" ); | 309 | my ( $usw, $usl, $us0 ) = $dbh->selectrow_array( "SELECT words, lines, w0rds FROM users WHERE nick = ?", undef, $nick ); |
| 363 | $sth->execute($nick, $alias); | 310 | my ( $alw, $all, $al0 ) = $dbh->selectrow_array( "SELECT words, lines, w0rds FROM users WHERE nick = ?", undef, $alias); |
| 364 | 311 | ||
| 365 | $sth = $dbh->prepare( "DELETE FROM users WHERE nick = ?" ); | 312 | if( $alw || $all ) { |
| 366 | $sth->execute( $alias ); | 313 | $dbh->do( "UPDATE users SET isaway = false, words = ?, lines = ?, w0rds = ? WHERE nick = ?", |
| 314 | undef, $usw+$alw, $usl+$all, $us0 + $al0, $nick ); | ||
| 315 | $dbh->do( "INSERT INTO aliases ( nick, alias ) VALUES ( ?, ? )", undef, $nick, $alias ); | ||
| 316 | $dbh->do( "DELETE FROM users WHERE nick = ?", undef, $alias ); | ||
| 367 | } | 317 | } |
| 368 | } | 318 | } |
| 369 | 319 | ||
| 370 | sub francoise_topten0r { | ||
| 371 | } | ||
| 372 | |||
| 373 | sub francoise_forget { | 320 | sub francoise_forget { |
| 374 | |||
| 375 | } | 321 | } |
| 376 | 322 | ||
| 377 | sub francoise_donothing { | 323 | sub francoise_donothing { |
| 378 | |||
| 379 | } | 324 | } |
| 380 | 325 | ||
| 381 | #start everything | 326 | #start everything |
| @@ -13,6 +13,7 @@ create table users ( | |||
| 13 | 13 | ||
| 14 | words integer, | 14 | words integer, |
| 15 | lines integer, | 15 | lines integer, |
| 16 | w0rds integer, | ||
| 16 | 17 | ||
| 17 | isaway bool default false, | 18 | isaway bool default false, |
| 18 | awaymsg text, | 19 | awaymsg text, |
