rendered paste body#! /usr/bin/perl
## Using
use strict;
use warnings;
## Modules
use Time::HiRes qw(usleep);
use YAML::Syck;
## Init
my $title = 'Bot';
my $version = '1.0';
my $desc = 'Robot';
Xchat::register($title, $version, $desc);
Xchat::print('Loading ' . $title . '... ');
Xchat::hook_server("RAW LINE", \&OnIncoming);
Xchat::hook_command("", \&OnOutgoing);
## Subs
## Events
sub OnIncoming
{
my @parts = @{$_[0]};
my $message = join(' ', @parts);
my $mynick = Xchat::get_info('nick');
my $server = Xchat::get_info('server');
&ParseIncoming(\@parts);
return Xchat::EAT_ALL;
}
sub OnOutgoing
{
my @parts = @{$_[0]};
my $message = join(' ', @parts);
my $mynick = Xchat::get_info('nick');
my $server = Xchat::get_info('server');
my $xchatdir = Xchat::get_info('xchatdir');
my $configfile = $xchatdir . '/bot.conf';
my $file = LoadFile($configfile);
my %config = %{$file};
return &ParseOutgoing(\@parts, \%config);
}
## Parsing Subs
sub ParseIncoming
{
my @parts = @{$_[0]};
my $sender = shift @parts;
my $command = shift @parts;
my $recipient = shift @parts;
my $message = join(' ', @parts);
my $wholemessage = join(' ', $sender, $command, $recipient, $message);
my $mynick = Xchat::get_info('nick');
my $server = Xchat::get_info('server');
if ($sender =~ /^:(.+)!(.+)@(.+)$/) {
my $snick = $1;
my $suser = $2;
my $shost = $3;
if ($snick eq $mynick) {
if ($command eq 'PRIVMSG') {
if ($message =~ /^:!(\S+)( (.+))?$/) {
my $command = $1;
my $text = $3;
if ($command =~ /^testfunc$/) {
my $str = '54(0) F';
my $find = '(\d+)\(0\)';
my $repl = '$1\x{00B0}';
$str =~ s/(^| )(\d+)\(0\)( |$)/$1$2\x{00B0}$3/g;
&OutputEmit($str);
} elsif ($command =~ /^testfunc2$/) {
} elsif ($command =~ /^testfunc3$/) {
} elsif ($command =~ /^testfunc4$/) {
} elsif ($command =~ /^testfunc5$/) {
} elsif ($command =~ /^testfunc6$/) {
} elsif ($command =~ /^testfunc7$/) {
my $str = '54(0) F';
my $find = '(\d+)\(0\)';
my $repl = '$1\x{00B0}';
$str =~ s/^$find /$1\x{00B0} /g;
&OutputEmit($str);
} else {
&OutputEmit('Unknown Command');
}
} elsif ($message =~ /^:(.+)$/) {
&ReceiveRaw($wholemessage);
&Output($wholemessage);
} else {
&ReceiveRaw($wholemessage);
&Output($wholemessage);
}
} elsif ($command eq 'PING') {
&ReceiveRaw($wholemessage);
&Output('Ping');
} elsif ($command eq 'PONG') {
&ReceiveRaw($wholemessage);
&Output('Pong');
} else {
&ReceiveRaw($wholemessage);
&Output($wholemessage);
}
} else {
&ReceiveRaw($wholemessage);
&Output($wholemessage);
}
} elsif ($sender =~ /^:$server$/) {
if ($command eq 'PRIVMSG') {
&ReceiveRaw($wholemessage);
&Output($wholemessage);
} elsif ($command eq 'PING') {
&ReceiveRaw($wholemessage);
&Output('Server Ping');
} elsif ($command eq 'PONG') {
&ReceiveRaw($wholemessage);
&Output('Server Pong');
} else {
&ReceiveRaw($wholemessage);
&Output($wholemessage);
}
} else {
&ReceiveRaw($wholemessage);
&Output($wholemessage);
}
}
sub ParseOutgoing
{
my @parts = @{$_[0]};
my %config = %{$_[1]};
my $message = join(' ', @parts);
my $mynick = Xchat::get_info('nick');
my $server = Xchat::get_info('server');
# $message =~ s/(\d+)\(0\)/$1 . "\x{00B0}"/eg;
# $message = &ReplaceWord($message, '(\d+)\(0\)', '$1\x{00B0}');
# $message = &ReplaceWord($message, '\(c\)', '\x{00A9}');
# $message = &ReplaceWord($message, '\(r\)', '\x{00AE}');
# $message = &ReplaceWord($message, '\(beep\)', '\x{0007}');
# $message = &ReplaceWord($message, '[*\\]nix', 'linux');
# $message = &ReplaceWord($message, '(\S+)\@gamil.com', '$1\@gmail.com');
my @replace = @{$config{replace}};
for (my $i = 0; $i < scalar @replace; $i++) {
my %item = %{$replace[$i]};
$message = &ReplaceWord($message, $item{find}, $item{replace});
}
Xchat::command('SAY ' . $message);
return Xchat::EAT_ALL;
}
## Send/Receive
sub Send
{
my $command = $_[0];
my $recipient = $_[1];
my $message = $_[2];
my $server = Xchat::get_info('server');
Xchat::command("QUOTE $command $recipient :$message", undef, $server);
}
sub SendRaw
{
my $raw = $_[0];
my $server = Xchat::get_info('server');
Xchat::command("QUOTE $raw", undef, $server);
}
sub Receive
{
my $sender = $_[0];
my $command = $_[1];
my $recipient = $_[2];
my $message = $_[3];
my $server = Xchat::get_info('server');
Xchat::command("RECV :$sender $command $recipient :$message", undef, $server);
}
sub ReceiveRaw
{
my $raw = $_[0];
my $server = Xchat::get_info('server');
Xchat::command("RECV $raw", undef, $server);
}
sub Output
{
my $message = $_[0];
my $mynick = Xchat::get_info('nick');
my $server = Xchat::get_info('server');
Xchat::command("RECV :RawLog!bot\@bot.andrewh.com PRIVMSG $mynick :$message", undef, $server);
}
sub OutputEmit
{
my $message = $_[0];
my $sender = 'Bot';;
if ($_[1]) {
$sender = $_[1];
}
Xchat::emit_print('Channel Message', ($sender, $message, '', ''));
}
## General Subs
sub Sleep #### USE HOOK_TIMEOUT
{
my $seconds = $_[0];
my $slept = usleep(1000000 * $seconds) / 1000000;
return $slept;
}
sub ReplaceWord
{
my $text = $_[0];
my $word = $_[1];
my $replcement = $_[2];
eval('$text =~ s/^$word /' . $replcement . ' /g');
eval('$text =~ s/ $word / ' . $replcement . ' /g');
eval('$text =~ s/ $word$/ ' . $replcement . '/g');
eval('$text =~ s/^$word$/' . $replcement . '/g');
return $text;
}
sub Rand
{
my $min = $_[0];
my $max = $_[1];
my $num = $min + rand($max - $min);
return $num;
}
## End
Xchat::print("Done\n");