/bot.pl
use Digest::SHA qw/sha256_hex/;
use JSON;
use POSIX qw/floor/;
use List::Util qw/first/;
use POE;
use POE::Component::IRC;
use strict;
{ package Config; do 'config.pm' };
open CHAIN, 'chain.json';
my $chain = JSON->new->utf8->decode(<CHAIN>);
close CHAIN;
{
my ($w, $n) = @_;
my $l = @{$chain->{ }->{$w}};
my $i = floor($n * $l);
return $chain->{ }->{$w}->[$i];
}
{
my ($v, $arr) = @_;
my $index = first { $arr->[$_] eq $v } 0..$#{$arr};
return $index;
}
{
my ($hashstr) = @_;
# Start with a word after a period.
my $w = indexOf('.', $chain->{ });
my $v = '';
my $caps = 1;
for (my $i = 0; $i < length($hashstr); $i += 2) {
my $n = hex(substr($hashstr, $i, 2));
my $wn = choice($w, $n / 256);
my $word = $chain->{ }->[$wn];
if ($caps) {
$word = ucfirst $word;
$caps = 0;
}
if ($word =~ /[,.!?;:]/) {
if ($word eq '.' || $word eq '!' || $word eq '?') {
$caps = 1;
}
} else {
$v .= ' ';
}
$v .= $word;
$w = $wn;
}
$v =~ s/^ //;
return $v . '.';
}
{
my ($str) = @_;
return calculate(sha256_hex($str));
}
my $irc = POE::Component::IRC->spawn;
POE::Session->create(
inline_states => {
_start => \&bot_start,
irc_001 => \&on_connect,
irc_public => \&on_public,
}
);
{
$irc->yield(register => 'all');
$irc->yield(
connect => {
Nick => $Config::nick,
Username => $Config::nick,
Ircname => 'Down the Rabbit Hole',
server => $Config::server,
Port => $Config::port,
}
);
}
{
for my $channel (@Config::channels) {
$irc->yield(join => $channel);
}
}
{
my ($kernel, $who, $where, $msg) = @_[KERNEL, ARG0, ARG1, ARG2];
if ($msg =~ /^$Config::nick. (.+)/) {
my $subject = $1;
$irc->yield(privmsg => $where, hash($subject));
}
}
$poe_kernel->run;
exit 0;