#!/usr/bin/perl use warnings; use strict; use encoding 'utf8'; use DBI; use POE; use POE::Component::IRC; use LWP::Simple; my $name; my $guild; my $lvl; my $race; my $class; my $built; my $realm; sub CHANNEL () { "#poeTest" } # Create the component that will represent an IRC network. my ($irc) = POE::Component::IRC->spawn(); # Establish database connection # Not using mysql for mirror #my $dbh = DBI->connect('dbi:mysql:armory','user','pwd'); # Create the bot session. The new() call specifies the events the bot # knows about and the functions that will handle those events. POE::Session->create( inline_states => { _start => \&bot_start, irc_001 => \&on_connect, irc_public => \&on_public, irc_disconnect => \&on_disconnect, }, ); # Fill hash #my $sql = "SELECT name, counter FROM arguments"; #my $sth = $dbh->prepare($sql); #$sth->execute || # die "Could not execute SQL statement ... maybe invalid?"; #my %hash; #output database results #while (my (@row) =$sth->fetchrow_array) #{ # $hash{$row[0]} = $row[1]; #} # The bot session has started. Register this bot with the "magnet" # IRC component. Select a nickname. Connect to a server. sub bot_start { my $kernel = $_[KERNEL]; my $heap = $_[HEAP]; my $session = $_[SESSION]; $irc->yield( register => "all" ); my $nick = 'ArmoryBot'; $irc->yield( connect => { Nick => $nick, Username => 'ArmoryBot', Ircname => 'ArmoryBot', Server => 'irc.quakenet.org', Port => '6667', } ); } # The bot has successfully connected to a server. Join a channel. sub on_connect { $irc->yield( join => CHANNEL ); } # The bot has received a public message. Parse it for commands, and # respond to interesting things. sub on_public { my ( $kernel, $who, $where, $msg ) = @_[ KERNEL, ARG0, ARG1, ARG2 ]; my $nick = ( split /!/, $who )[0]; my $channel = $where->[0]; # Monitor activity my $ts = scalar localtime; print " [$ts] <$nick:$channel> $msg\n"; if ( my ($request) = $msg =~ /^!Armory (.+)/i ) { my @split = split(' ', $request); if ($split[0] eq "quit") { if ($nick eq "chemosh_") # If chemosh_ calls quit the bot { $irc->yield ( shutdown => "Taking a break" ); } } else { # Send armory profile link my $url = "http://armory.wow-europe.com/character-sheet.xml?r=Nordrassil&n=$split[0]"; $irc->yield( privmsg => CHANNEL, $url ); # Add comment to database #on_command($split[0]); } } elsif ($msg =~ /^!Armory$/i) { my $response = "Usage info: http://www.jahmaan.com/armorybot.html"; $irc->yield( privmsg => CHANNEL, $response ); } elsif ( my ($rep) = $msg =~ /^!Armoryrep (.+)/i ) { my @split = split(' ', $rep); my $url = "http://armory.wow-europe.com/character-reputation.xml?r=Nordrassil&n=$split[0]"; # Send a response back to the server. $irc->yield( privmsg => CHANNEL, $url ); #on_command($split[0]); } elsif ( my ($tal) = $msg =~ /^!Armorytal (.+)/i ) { my @split = split(' ', $tal); my $url = "http://armory.wow-europe.com/character-talents.xml?r=Nordrassil&n=$split[0]"; # Send a response back to the server. $irc->yield( privmsg => CHANNEL, $url ); #on_command($split[0]); } elsif ( ($msg =~ /^!eat$/i) || ($msg =~ /^!eaten$/i) ) { # idle } elsif ( my ($eat) = $msg =~ /^!eat (.+)/i ) { my @split = split(' ', $eat); my $response = "Oh my god! $nick has eaten $split[0]! Bastard!"; # Send a response back to the server. $irc->yield( privmsg => CHANNEL, $response ); #on_eat($split[0]); } elsif ( my ($eaten) = $msg =~ /^!eaten (.+)/i ) { my @split = split(' ', $eaten); # Show how many times has been eaten times_eaten($split[0]); } elsif ($msg =~ /^!define life/i ) { my $define = "3 (usu. one's life) the period between the birth and death of a living thing, esp. a human being"; # Send a response back to the server. $irc->yield( privmsg => CHANNEL, $define ); } elsif ($msg =~ /^!beer$/i ) { my $update_sql = "UPDATE beer SET counter = counter+1 LIMIT 1"; #$sth = $dbh->prepare($update_sql); #$sth->execute || # die "Could not execute SQL statement ... maybe invalid?"; # Send a response back to the server. $poe_kernel->post( $irc => ctcp => $channel => "ACTION gives $nick a bucket of cold beer." ); } elsif ($msg =~ /^!beerquantity$/i ) { #my $update_sql = "SELECT counter FROM beer LIMIT 1"; #$sth = $dbh->prepare($update_sql); #$sth->execute || # die "Could not execute SQL statement ... maybe invalid?"; #my @row = $sth->fetchrow_array; # Send a response back to the server. $irc->yield( privmsg => CHANNEL, "Database unavailable .. I fail" ); } elsif ( my ($charname) = $msg =~ /^!whois (.+)/i ) { my @input = split(' ', $charname); my $charname = $input[0]; getWhois($charname); } elsif ( my ($itemstr) = $msg =~ /^!item (.+)/ ) { my @item = split(' ', $itemstr); my $size = @item; my $itemlink = "http://www.wowhead.com/?search="; for (my $i=0; $i<$size; $i++) { if($i==0) { $itemlink .= "$item[$i]"; } else { $itemlink .= "\+$item[$i]" } } $irc->yield( privmsg => CHANNEL, $itemlink ); } } sub getWhois { my ($charname) = @_; my $link = "http://armory.wow-europe.com/character-sheet.xml?r=Nordrassil&n=$charname"; my $source = get($link) or die 'Unable to get page'; print " -> requested link: $link\n"; print $source; if ($source =~ /(.+)(charTitle\W\w*\s?\w*\W\w+\W)(\w+)(\W\w+\W)(.*)(\Wlevel)(.+)/ ) { $name = $3; $guild = $5; } # realm if ($source =~ /(.+)(theCharUrl\s\W\s\W\w\W)(\w+\s?\w*)(.+)/ ) { $realm = $3; } # Check lvl, race, class if ($source =~ /(.+)(character\Wdescription\Wnoflash>)(\w+)(\S\S)(\d\d?)(\S\S)(\w+\s?\w+)(\S\S)(\w+)(.+)/ ) { $lvl = $5; $race = $7; $class = $9; } # Built if ($source =~ /()(\d\d?)(\s\/\s)(\d\d?)(\s\/\s)(\d\d?)(<\/span>)/ ) { if ($class eq "Druid") { my %hash = (balance => $2, feral => $4, restoration => $6); $built = sortBuilt(%hash); } if ($class eq "Hunter") { my %hash = ("beast mastery" => $2, marksmanship => $4, survival => $6); $built = sortBuilt(%hash); } if ($class eq "Mage") { my %hash = (arcane => $2, fire => $4, frost => $6); $built = sortBuilt(%hash); } if ($class eq "Paladin") { my %hash = (holy => $2, protection => $4, retribution => $6); $built = sortBuilt(%hash); } if ($class eq "Priest") { my %hash = (discipline => $2, holy => $4, shadow => $6); $built = sortBuilt(%hash); } if ($class eq "Rogue") { my %hash = (assassination => $2, combat => $4, subtlety => $6); $built = sortBuilt(%hash); } if ($class eq "Shaman") { my %hash = (elemental => $2, enhancement => $4, restoration => $6); $built = sortBuilt(%hash); } if ($class eq "Warlock") { my %hash = (affliction => $2, demonology => $4, destruction => $6); $built = sortBuilt(%hash); } if ($class eq "Warrior") { my %hash = (arms => $2, fury => $4, protection => $6); $built = sortBuilt(%hash); } print_whois(); } } sub print_whois { $name = ucfirst($name); $built = ucfirst($built); my $whois = "$name <$guild> Level $lvl $race $built $class on $realm\n"; $irc->yield( privmsg => CHANNEL, $whois ); } sub sortBuilt { my (%hash) = @_; my @sorted = sort { $hash{$a} <=> $hash{$b} } keys %hash; return $sorted[2]; } # Run the bot until it is done. $poe_kernel->run(); exit 0;