mata_bot

some cheeky bot for #unix_surrealism
git clone https://git.pastanoggin.com/mata_bot.git
Log | Files | Refs | README | LICENSE

commit 226a18d30068bb5656e736ec939efde93a145eb2
parent 3d896652c9fe14bb83f6731110257ea690d9b733
Author: noodle <noodle@pastanoggin.com>
Date:   Thu, 26 Jun 2025 14:12:29 +0300

make -l only log errors and add -v for verbose logging

Diffstat:
Mmata_bot.pl | 73+++++++++++++++++++++++++++++++++++++++++++++----------------------------
Mmatabot.8 | 10++++++----
2 files changed, 51 insertions(+), 32 deletions(-)

diff --git a/mata_bot.pl b/mata_bot.pl @@ -17,6 +17,7 @@ my $PONG_TIMEOUT = 60; 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"; @@ -218,20 +219,30 @@ sub respond { } sub logger { - my $logmessage = shift; - print strftime('%Y-%m-%dT%H:%M:%SZ ', gmtime()), $logmessage, "\n"; + my ($opts, $level, $message) = @_; + return if not $opts->{'logging'}; + if ($level eq 'error') { + return if not $opts->{'loglevel'} =~ /^(?:error|info)$/; + $message = '!! ' . $message; + } elsif ($level eq 'info') { + return if $opts->{'loglevel'} ne 'info'; + } else { + die "logger: invalid logging level '${level}'!"; + } + $message = strftime('%Y-%m-%dT%H:%M:%SZ ', gmtime()) . $message . "\n"; + print STDERR $message; } sub out { - my ($sock, $logging, $message) = @_; + my ($sock, $opts, $message) = @_; my $s = IO::Select->new($sock); $! = 0; if ($s->can_write($SOCK_TIMEOUT)) { print $sock "$message\r\n"; - logger('<- ' . $message) if $logging; + logger($opts, 'info', '<- ' . $message); return 1; } else { - if ($!) { logger("!! $!") if $logging; return; } + if ($!) { logger($opts, 'error', $!); return; } return 0; } } @@ -257,7 +268,7 @@ sub evasdrop { $sock->recv($chunk, $CHUNK_LENGTH); } if (not $chunk) { - logger("!! recv received an empty response"); + logger($opts, 'error', 'recv received an empty response'); return; } return if not $chunk; @@ -280,7 +291,7 @@ sub evasdrop { $buffer .= $chunk; next; } - logger('-> ' . $message) if ($opts->{'logging'}); + logger($opts, 'info', '-> ' . $message); # respond to message if ($message =~ /^PING :([^\000\r\n\ ]+)$/) { @@ -298,19 +309,19 @@ sub evasdrop { ($subbuffer->{$sender_nick}, $reply) = respond($lists, $subbuffer, $sender_nick, $sender_message); $reply = "PRIVMSG $opts->{'chan'} :" . $reply if $reply; } - out($sock, $opts->{'logging'}, $reply) if $reply; + out($sock, $opts, $reply) if $reply; } else { - if ($!) { logger("!! ${!}") if $opts->{'logging'}; return; } + if ($!) { logger($opts, 'error', $!); return; } } # ping-pong if ($checkping and time-$pingtime >= $PING_TIMEOUT) { # ping server every once in a while and wait for pong - out($sock, $opts->{'logging'}, "PING $opts->{'host'}"); + out($sock, $opts, "PING $opts->{'host'}"); $checkping = 0; } elsif (not $checkping and time-$pongtime >= $PONG_TIMEOUT) { # we leaving if we don't get ponged on time - logger("!! PONG response from server timed out") if $opts->{'logging'}; + logger($opts, 'error', 'PONG response from server timed out'); return } } @@ -322,19 +333,24 @@ sub init { my $hellos_path = $DEFAULT_PATH_HELLOS; my $host = $DEFAULT_HOST; my $logging = $DEFAULT_LOGGING; + my $loglevel = $DEFAULT_LOGLEVEL; my $port = $DEFAULT_PORT; my $quotes_path = $DEFAULT_PATH_QUOTES; my $tls = $DEFAULT_TLS; - getopts('tlH:b:h:j:p:q:', \my %flags); + getopts('tlvH:b:h:j:p:q:', \my %flags); $ball_path = $flags{'b'} if $flags{'b'}; $chan = "#$flags{'j'}" if $flags{'j'}; $hellos_path = $flags{'H'} if $flags{'H'}; $host = $flags{'h'} if $flags{'h'}; - $logging = 1 if $flags{'l'}; $port = $flags{'p'} if $flags{'p'}; $quotes_path = $flags{'q'} if $flags{'q'}; $tls = 1 if $flags{'t'}; + if ($flags{'l'}) { + $logging = 1; + $loglevel = 'error'; + } + $loglevel = 'info' if $flags{'v'}; 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: $!"; @@ -346,16 +362,17 @@ sub init { close $quotes_file or die "$quotes_file: $!"; return { - 'chan' => $chan, - 'host' => $host, - 'logging' => $logging, - 'port' => $port, - 'tls' => $tls, + chan => $chan, + host => $host, + logging => $logging, + loglevel => $loglevel, + port => $port, + tls => $tls, }, { - 'ball' => \@ball, - 'hellos' => \@hellos, - 'quotes' => \@quotes, + ball => \@ball, + hellos => \@hellos, + quotes => \@quotes, }; } @@ -371,7 +388,7 @@ while (1) { PeerHost => $opts->{'host'}, PeerPort => $opts->{'port'}, )) { - logger("!! can't open socket: $IO::Socket::errstr") if $opts->{'logging'}; + logger($opts, 'error', "can't open socket: $IO::Socket::errstr"); $sock = undef; } } else { @@ -383,25 +400,25 @@ while (1) { PeerHost => $opts->{'host'}, PeerPort => $opts->{'port'}, )) { - logger("!! can't open socket: $IO::Socket::errstr") if $opts->{'logging'}; + logger($opts, 'error', "can't open socket: $IO::Socket::errstr"); $sock = undef; } } if ($sock) { # set user, real, and nick, then join - out($sock, $opts->{'logging'}, "USER $USER * * :$REAL"); - out($sock, $opts->{'logging'}, "NICK $NICK"); - out($sock, $opts->{'logging'}, "JOIN $opts->{'chan'}"); + 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->{'logging'}, "QUIT"); + out($sock, $opts, "QUIT"); if ($opts->{'tls'}) { close($sock); } else { $sock->close(); } } - logger("!! reconnecting in ${RECONNECT_TIME} seconds...") if $opts->{'logging'}; + logger($opts, 'error', "reconnecting in ${RECONNECT_TIME} seconds..."); sleep $RECONNECT_TIME; } diff --git a/matabot.8 b/matabot.8 @@ -8,7 +8,7 @@ . .Sh SYNOPSIS .Nm matabot -.Op Fl tl +.Op Fl tlv .Op Fl H Ar path .Op Fl b Ar path .Op Fl j Ar join @@ -45,7 +45,7 @@ Join (default: testmatabot). Don't include the leading #. .It Fl l -Turn on logging to stdout. +Log errors to stderr. .It Fl p Ar port Connect to .Ar port @@ -56,6 +56,8 @@ Load the quotes file from .Po default: Pa /usr/local/share/matabot/quotes Pc Ns . .It Fl t Turn on TLS. +.It Fl v +Produce more verbose output. .El .Sh COMMANDS Bot can do some tricks (non-exhaustive, or it won't be funny): @@ -123,10 +125,10 @@ Typical invocation .Pp .Dl $ matabot -th irc.server.tld -j #analognowhere -p 6697 .Pp -Test on a local ircd with logging turned on. +Test on a local ircd with verbose logging turned on. (No TLS): .Pp -.Dl $ matabot -l +.Dl $ matabot -lv . .Sh SEE ALSO .Xr perl 1 ,