#!/usr/bin/perl -w ##################################################### # oblio_irc.pl # # A POE IRC Bot Named Oblio (a bot with no point) # # @requires POE, POE::Component::IRC # # # # @author: Adam Eivy (antic@shadowpuppet.net) # my $Version = 0.7; my $Modified= "2006.08.26"; # @web: http://www.shadowpuppet.net # # # # @licence: # # This script is released under the # # GNU General Public License. # # More information on the GPL can be found # # at http://www.gnu.org/copyleft/gpl.html # # # # @usage: # # nice -n 19 perl [file].pl # # # # @description: # # IRC bot. # # rot13 encrypts public messages. # # It responds to "rot13 {text to encrypt}. # # Gives ops to user who sends private message to it # # using "![botname] -o #channel [passphrase]" # # more AI coming soon... # ##################################################### use strict; use lib "./perl"; # Path to non-global installed perl mods use POE; use POE::Component::IRC; #use Irc::Bot::Log; ######################### # Variables # ######################### my $BotName = "oblio"; # append a random number to the end of name if we need to run multiple instances #my $nick = 'oblio' . $$ % 100; my $UserName = "Oblio: Helper Bot"; my $IrcName = "type !oblio -h"; # will autojoin these channels after connecting my @channels = qw(#hack #min3 #go #sccc #jsdesk); my @Operators = ("antic", "oblio"); my $Server = "localhost"; my $Port = 6667; my $Passphrase = "YOUR_PASSPHRASE_HERE"; # removed for publication #my $log = Irc::Bot::Log->new( Path => './logs/' ); # Calculate number of array vars my $NumOfOps = scalar(@Operators); my $NumOfChannels = scalar(@channels); ############# # CODE # ############# # Create the component that will represent an IRC network. POE::Component::IRC->new("magnet"); # Create the bot session. The new() call specifies the events the bot # knows about and the functions that will handle those events. POE::Session->new ( _start => \&bot_start, irc_001 => \&on_connect, irc_public => \&on_public, irc_msg => \&on_private, irc_join => \&on_join, irc_error => \&on_error, irc_disconnected => \&bot_start, ); ############################### # Bot Startup # ############################### # 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]; $kernel->post( magnet => register => "all" ); $kernel->post( magnet => connect => { Nick => $BotName, Username => $UserName, Ircname => $IrcName, Server => $Server, Port => $Port, } ); } ############################### # Connected to Server # ############################### # The bot has successfully connected to a server. Join channels in @channels. sub on_connect { for (my $x=0; $x < $NumOfChannels; $x++) { $_[KERNEL]->post( magnet => join => $channels[$x]); # list the users of channel joined # useful for identifying users $_[KERNEL]->post( 'magnet', 'who', $channels[$x]); } } ############################### # Server Error Recieved # ############################### sub on_error{ # add detection of particular server, for now call routine my $ServError = $_[ARG0]; print " $ServError !\n"; } ############################### # Bot Disconnects From Server # ############################### sub on_discon{ # add detection of particular server, for now call routine my $DisServer = $_[ARG0]; print " disconnected from $DisServer!\n"; $_[KERNEL]->post( magnet => connect => { Nick => $BotName, Username => $UserName, Ircname => $IrcName, Server => $Server, Port => $Port, } ); } ########################### # Someone Joins Channel # ########################### sub on_join{ my ( $kernel, $who, $where ) = @_[ KERNEL, ARG0, ARG1 ]; my $nick = ( split /!/, $who )[0]; # my $channel = $where->[0]; # TODO: If new user is in Operator list, send and check code, then op for (my $op=0; $op < $NumOfOps; $op++) { if ($who =~ $Operators[$op]) { $kernel->post( magnet => privmsg => $nick, "Welcome Friend" ); } } # TODO: Get list of users, if another oblio exists, ask for op status } ########################### # Recieved Public Message # ########################### sub on_public { my ( $kernel, $who, $where, $msg ) = @_[ KERNEL, ARG0, ARG1, ARG2 ]; my $nick = ( split /!/, $who )[0]; my $channel = $where->[0]; my $ts = scalar localtime; # Log all activity to a file named with my irc Name open LOG, ">>./log/$BotName-$channel.log"; print LOG " [$ts] <$nick:$channel> $msg\n"; close LOG; # bring up help menu on !$BotName -h if ( $msg =~ /^(!$BotName -h)$/ ) { $kernel->post( magnet => privmsg => $nick, "Oblio version $Version \t : $Modified" ); $kernel->post( magnet => privmsg => $nick, " ::Command Menu::" ); $kernel->post( magnet => privmsg => $nick, "\t" ); $kernel->post( magnet => privmsg => $nick, "Commands used in Channel (Public)" ); $kernel->post( magnet => privmsg => $nick, "!$BotName -h help Menu" ); $kernel->post( magnet => privmsg => $nick, "!$BotName -a about OblioBot" ); $kernel->post( magnet => privmsg => $nick, "!$BotName -r [message] rot13 encypher a message" ); $kernel->post( magnet => privmsg => $nick, "\t" ); $kernel->post( magnet => privmsg => $nick, "Commands over Private message (Ops only)" ); $kernel->post( magnet => privmsg => $nick, "!$BotName -o [#channel] [passphrase] op me in #channel" ); $kernel->post( magnet => privmsg => $nick, "!$BotName -j [#channel] [passphrase] tell bot to join #channel" ); $kernel->post( magnet => privmsg => $nick, "!$BotName -s [user] [filepath] [passphrase] send me this file" ); $kernel->post( magnet => privmsg => $nick, "End of Menu" ); #$kernel->post( magnet => dcc_chat => $nick, "Oblio version $Version \t ::Command Menu:: \n" ); } # bring up about on !$BotName -a if ( $msg =~ /^(!$BotName -a)$/ ) { $kernel->post( magnet => privmsg => $nick, "Oblio version $Version \t : $Modified" ); $kernel->post( magnet => privmsg => $nick, " ::About::" ); $kernel->post( magnet => privmsg => $nick, "\t" ); $kernel->post( magnet => privmsg => $nick, "Oblio is a simple IRC bot in Perl using POE::Component::IRC" ); $kernel->post( magnet => privmsg => $nick, "Created by Adam Eivy" ); $kernel->post( magnet => privmsg => $nick, "http://adam.shadowpuppet.net" ); $kernel->post( magnet => privmsg => $nick, "\t" ); $kernel->post( magnet => privmsg => $nick, "Bot Hosted by http://www.dreamhost.com/r.cgi?30755" ); } # rot13 encypher text if ( my ($rot13) = $msg =~ /^!$BotName -r (.+)/ ) { $rot13 =~ tr[a-zA-Z][n-za-mN-ZA-M]; $kernel->post( magnet => privmsg => $channel, $rot13 ); } # respond to direct questions in main channel if ( $msg =~ /^($BotName) (.+)/ ) { my $oblisay = "$2?"; $kernel->post( magnet => privmsg => $channel, $oblisay ); } } ############################ # Recieved Private Message # ############################ sub on_private { my ( $kernel, $who, $where, $msg ) = @_[ KERNEL, ARG0, ARG1, ARG2 ]; my $nick = ( split /!/, $who )[0]; my $channel = $where->[0]; my $ts = scalar localtime; print " [$ts] <$nick:$channel> $msg\n"; # this part takes a command "![botname] -o #channel [passphrase]" if ( $msg =~ /^(!$BotName -o) (#.+) ($Passphrase)$/ ) { $kernel->post( magnet => privmsg => $nick, "trying to op $nick on $2..."); $kernel->post( 'magnet', 'mode', $2, '+o', $nick); $kernel->post( magnet => privmsg => $nick, "Success!" ); } # super operator: "![botname] -su [passphrase]" if ( $msg =~ /^(!$BotName -su) ($Passphrase)$/ ) { for (my $x=0; $x < $NumOfChannels; $x++) { $kernel->post( magnet => privmsg => $nick, "trying to op $nick on $channels[$x]..."); $kernel->post( 'magnet', 'mode', $channels[$x], '+o', $nick); $kernel->post( magnet => privmsg => $nick, "Success!" ); } } # this part takes a command "![botname] -j #channel [passphrase]" if ( $msg =~ /^(!$BotName -j) (#.+) ($Passphrase)$/ ) { $kernel->post( magnet => privmsg => $nick, "trying to join $2..."); $kernel->post( 'magnet', 'join', $2); $kernel->post( magnet => privmsg => $nick, "Success!" ); } # this part takes a command "![botname] -s user filepath [passphrase]" if ( $msg =~ /^(!$BotName -s) (.+) (.+) ($Passphrase)$/ ) { my $command = "dcc send $2 $3"; $kernel->post( 'magnet', 'DCC', $2, 'SEND', $3); $kernel->post( magnet => privmsg => $nick, $command); } } ################### # LOGGING # ################### # Log join event # sub on_join { # my ( $kernel, $who, $where ) = @_[ KERNEL, ARG0, ARG1 ]; # my $nick = ( split /!/, $who )[0]; # # log activity # $log->serv_log( "Connected.." ); # $log->chan_log( "$nick has joined $where\n" ); # $log->bot_log( "$nick tried to access me!\n" ); # } ############ # RUN BOT # ############ # Run the bot until it is done. $poe_kernel->run(); exit 0;