Commit Diff


commit - 3d896652c9fe14bb83f6731110257ea690d9b733
commit + 226a18d30068bb5656e736ec939efde93a145eb2
blob - c3be6663f1d17a8727366e79dfa83dcee2b10a25
blob + a21bced174018c28beee6eb450a5dd3a75163c0f
--- mata_bot.pl
+++ 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;
 }
blob - ffa522e38d93f4cbcf6f69707dcaacad7d4b2855
blob + cae6191aadb57699d86b4a5f7eeb781861ea1aef
--- matabot.8
+++ 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 ,