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:
M | mata_bot.pl | | | 73 | +++++++++++++++++++++++++++++++++++++++++++++---------------------------- |
M | matabot.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 ,