mata_bot

some cheeky bot for inspired by https://analognowhere.com comics
git clone https://git.pastanoggin.com/mata_bot.git
Log | Files | Refs | README | LICENSE

commit 699af575932db751f5e8b569ade0eba9899dbe19
parent a90fe83e647b257c36e5a230a373f884ea57430b
Author: noodle <noodle@pastanoggin.com>
Date:   Thu, 26 Jun 2025 15:28:45 +0300

refactor and change -l and -v description

Diffstat:
Mmata_bot.pl | 43++++++++++++++++++++++---------------------
Mmatabot.8 | 4++--
2 files changed, 24 insertions(+), 23 deletions(-)

diff --git a/mata_bot.pl b/mata_bot.pl @@ -18,9 +18,9 @@ my $DEFAULT_CHAN = '#testmatabot'; my $DEFAULT_HOST = 'localhost'; my $DEFAULT_LOGGING = 0; my $DEFAULT_LOGLEVEL = 'none'; -my $DEFAULT_PATH_BALL = "/usr/local/share/matabot/ball"; -my $DEFAULT_PATH_HELLOS = "/usr/local/share/matabot/hellos"; -my $DEFAULT_PATH_QUOTES = "/usr/local/share/matabot/quotes"; +my $DEFAULT_PATH_BALL = '/usr/local/share/matabot/ball'; +my $DEFAULT_PATH_HELLOS = '/usr/local/share/matabot/hellos'; +my $DEFAULT_PATH_QUOTES = '/usr/local/share/matabot/quotes'; my $DEFAULT_PORT = 6667; my $DEFAULT_TLS = 0; my $MATA_CUTE = '[>.<]'; @@ -52,7 +52,7 @@ sub respond_command { my $min = $ndice; my $max = $ndice * $nface; my $result = $min + int rand(1 + $max - $min); - my $roll = "d${nface}"; + my $roll = 'd' . $nface; $roll = $ndice . $roll if $ndice > 1; $reply = "${sender_nick} rolled a ${roll} and got ${result}! ${MATA_HAPPY}"; } elsif ($content =~ /\b{wb}pray+\b{wb}/) { @@ -60,7 +60,7 @@ sub respond_command { } elsif ($content =~ /\b{wb}bru[hv]+\b{wb}/i) { $reply = "Did i stutter? ${MATA_NORM}"; } elsif ($content =~ /\b{wb}f+(u?ck+)? *(yo)?u+\b{wb}/i) { - $reply = "$MATA_FLIPOFF" + $reply = $MATA_FLIPOFF } elsif ($content =~ /\b{wb}i+ *l+(ove+)? *(you+|y+|u+)\b{wb}/i) { $reply = "<3 ${MATA_HAPPY}" } elsif ($content =~ /(thanks+|thx+|thank +(yo)?u+)( *a+ *lot+)?/i) { @@ -155,7 +155,7 @@ sub respond { my $video_id = $1; my $response = HTTP::Tiny->new->get("https://fuyt.lab8.cz/?s=${video_id}&o=relevance"); unless ($response->{success}) { - $reply = "failed to get title of video ${video_id} ${MATA_DEAD} ($response->{status} $response->{reason}!)"; + $reply = "failed to get title of youtube video ${video_id} ${MATA_DEAD} ($response->{status} $response->{reason}!)"; return $message, $reply; } unless (length $response->{content}) { @@ -163,13 +163,13 @@ sub respond { return $message, $reply; } my $content = $response->{content}; - if ($content =~ m,<span class="title"><a href="https://www\.youtube\.com/watch\?v=$video_id" accesskey="0">([^<]+)</a>,i) { + if ($content =~ m,<span class="title"><a href="https://www\.youtube\.com/watch\?v=${video_id}" accesskey="0">([^<]+)</a>,i) { my $title = $1; $title =~ tr/[\000\r\n]//d; $title = trim($title); - $reply = "YouTube: $title"; + $reply = "YouTube: ${title}"; } else { - $reply = "failed to get title of video ${video_id} ${MATA_DEAD} (no videos matching ID $video_id!)"; + $reply = "failed to get title of video ${video_id} ${MATA_DEAD} (no videos matching ID ${video_id}!)"; } } elsif ($message =~ m,https?://[^ ]+,) { my $url = $&; @@ -204,7 +204,7 @@ sub respond { my $title = $1; $title =~ tr/[\000\r\n]//d; $title = trim($title); - $reply = "Title: $title"; + $reply = "Title: ${title}"; } else { $reply = "No title found (GET ${url} ${MATA_DEAD}"; } @@ -238,7 +238,7 @@ sub out { my $s = IO::Select->new($sock); $! = 0; if ($s->can_write($SOCK_TIMEOUT)) { - print $sock "$message\r\n"; + print $sock $message . "\r\n"; logger($opts, 'info', '<- ' . $message); return 1; } else { @@ -257,6 +257,7 @@ sub evasdrop { my $pongtime = time; my $s = IO::Select->new($sock); my %subbuffer; + while (1) { my $reply; $! = 0; @@ -307,7 +308,7 @@ sub evasdrop { my $sender_nick = $1; my $sender_message = $2; ($subbuffer->{$sender_nick}, $reply) = respond($lists, $subbuffer, $sender_nick, $sender_message); - $reply = "PRIVMSG $opts->{'chan'} :" . $reply if $reply; + $reply = "PRIVMSG $opts->{'chan'} :${reply}" if $reply; } out($sock, $opts, $reply) if $reply; } else { @@ -351,15 +352,15 @@ sub init { $loglevel = 'error'; } $loglevel = 'info' if $flags{'v'}; - open (my $ball_file, "<", $ball_path) or die "couldn't open ${ball_path}: $!"; + open (my $ball_file, '<', $ball_path) or die "couldn't open ${ball_path}: $!"; chomp(my @ball = <$ball_file>); - close $ball_file or die "$ball_file: $!"; - open (my $hellos_file, "<", $hellos_path) or die "couldn't open ${hellos_path}: $!"; + close $ball_file or die "${ball_file}: $!"; + open (my $hellos_file, '<', $hellos_path) or die "couldn't open ${hellos_path}: $!"; chomp(my @hellos = <$hellos_file>); - close $hellos_file or die "$hellos_file: $!"; - open (my $quotes_file, "<", $quotes_path) or die "couldn't open ${quotes_path}: $!"; + close $hellos_file or die "${hellos_file}: $!"; + open (my $quotes_file, '<', $quotes_path) or die "couldn't open ${quotes_path}: $!"; chomp(my @quotes = <$quotes_file>); - close $quotes_file or die "$quotes_file: $!"; + close $quotes_file or die "${quotes_file}: $!"; return { chan => $chan, @@ -406,13 +407,13 @@ while (1) { } if ($sock) { # set user, real, and nick, then join - out($sock, $opts, "USER $USER * * :$REAL"); - out($sock, $opts, "NICK $NICK"); + out($sock, $opts, "USER ${USER} * * :${REAL}"); + out($sock, $opts, "NICK ${NICK}"); out($sock, $opts, "JOIN $opts->{'chan'}"); # main loop evasdrop($sock, $opts, $lists); # end session and sleep a bit before reconnecting - out($sock, $opts, "QUIT"); + out($sock, $opts, 'QUIT'); if ($opts->{'tls'}) { close($sock); } else { diff --git a/matabot.8 b/matabot.8 @@ -57,7 +57,7 @@ Load the quotes file from .It Fl t Turn on TLS. .It Fl v -Produce more verbose output. +Produce more verbose output (logs all irc events in addition to errors). .El .Sh COMMANDS Bot can do some tricks (non-exhaustive, or it won't be funny): @@ -125,7 +125,7 @@ comic. Typical invocation .Po use these flags in your Pa /etc/rc.conf.local Pc Ns : .Pp -.Dl $ matabot -th irc.server.tld -j #analognowhere -p 6697 +.Dl $ matabot -lth irc.server.tld -j #analognowhere -p 6697 .Pp Test on a local ircd with verbose logging turned on. (No TLS):