r5254 - trunk/Docs/server/rcon2irc

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Wed Dec 17 15:52:50 EST 2008


Author: div0
Date: 2008-12-17 15:52:49 -0500 (Wed, 17 Dec 2008)
New Revision: 5254

Modified:
   trunk/Docs/server/rcon2irc/rcon2irc.pl
Log:
admin interface beginning


Modified: trunk/Docs/server/rcon2irc/rcon2irc.pl
===================================================================
--- trunk/Docs/server/rcon2irc/rcon2irc.pl	2008-12-17 14:27:16 UTC (rev 5253)
+++ trunk/Docs/server/rcon2irc/rcon2irc.pl	2008-12-17 20:52:49 UTC (rev 5254)
@@ -433,6 +433,9 @@
 	dp_server_from_wan => "",
 	irc_local => "",
 
+	irc_admin_password => "",
+	irc_admin_timeout => 3600,
+
 	plugins => "",
 );
 
@@ -719,7 +722,8 @@
 		$store{irc_nick} = "";
 		schedule sub {
 			my ($timer) = @_;
-			out dp => 0, 'status', 'log_dest_udp';
+			out dp => 0, 'status 1', 'log_dest_udp';
+			$store{status_waiting} = -1;
 		} => 1;
 		# this will clear irc_error_active
 	} => 30;
@@ -829,6 +833,12 @@
 	return 0;
 }
 
+my $RE_FAIL = qr/$ $/;
+my $RE_SUCCEED = qr//;
+sub cond($)
+{
+	return $_[0] ? $RE_FAIL : $RE_SUCCEED;
+}
 
 
 # List of all handlers on the various sockets. Additional handlers can be added by a plugin.
@@ -859,6 +869,7 @@
 
 	# retrieve hostname from status replies
 	[ dp => q{host:     (.*)} => sub {
+		return 0 unless $store{status_waiting} < 0;
 		my ($name) = @_;
 		$store{dp_hostname} = $name;
 		return 0;
@@ -866,17 +877,21 @@
 
 	# retrieve version from status replies
 	[ dp => q{version:  (.*)} => sub {
+		return 0 unless $store{status_waiting} < 0;
 		my ($version) = @_;
 		$store{dp_version} = $version;
 		return 0;
 	} ],
 
-	# retrieve number of open player slots
+	# retrieve player names
 	[ dp => q{players:  (\d+) active \((\d+) max\)} => sub {
+		return 0 unless $store{status_waiting} < 0;
 		my ($active, $max) = @_;
 		my $full = ($active >= $max);
 		$store{slots_max} = $max;
 		$store{slots_active} = $active;
+		$store{status_waiting} = $active;
+		$store{playerslots_active_new} = [];
 		if($full != ($store{slots_full} || 0))
 		{
 			$store{slots_full} = $full;
@@ -895,6 +910,65 @@
 		return 0;
 	} ],
 
+	# retrieve player names
+	[ dp => q{\^\d(\S+)\s+(\d+)\s+(\d+)\s+(\S+)\s+(-?\d+)\s+\#(\d+)\s+\^\d(.*)} => sub {
+		return 0 unless $store{status_waiting} > 0;
+		my ($ip, $pl, $ping, $time, $frags, $no, $name) = ($1, $2, $3, $4, $5, $6, $7);
+		$store{"playerslot_$no"} = { ip => $ip, pl => $pl, ping => $ping, 'time' => $time, frags => $frags, no => $no, name => $name };
+		push @{$store{playerslots_active_new}}, $no;
+		if(--$store{status_waiting} == 0)
+		{
+			$store{playerslots_active} = $store{playerslots_active_new};
+		}
+		return 0;
+	} ],
+
+	# IRC admin commands
+	[ irc => q{:(([^! ]*)![^ ]*) (?i:PRIVMSG) [^&#%]\S* :(.*)} => sub {
+		return 0 unless $config{irc_admin_password} ne '';
+
+		my ($hostmask, $nick, $command) = @_;
+
+		if($command eq "login $config{irc_admin_password}")
+		{
+			$store{logins}{$hostmask} = time() + $config{irc_admin_timeout};
+		}
+
+		if(($store{logins}{$hostmask} || 0) < time())
+		{
+			out irc => 0, "PRIVMSG $nick :authentication required";
+			return -1;
+		}
+
+		if($command eq "status")
+		{
+			for my $slot(@{$store{playerslots_active}})
+			{
+				my $s = $store{"playerslot_$slot"};
+				out irc => 0, "PRIVMSG $nick :$slot $s->{ip} $s->{name}";
+			}
+		}
+
+		if($command =~ /^kick (\d+)$/)
+		{
+			my ($id) = ($1);
+			out dp => 0, "kick # $id";
+			my $slotnik = "playerslot_$id";
+			out irc => 0, "PRIVMSG $nick :kicked $id ($store{$slotnik}{name} @ $store{$slotnik}{ip})";
+		}
+
+		if($command =~ /^kickban (\d+) (\d+) (\d+) (.*)$/)
+		{
+			my ($id, $bantime, $mask, $reason) = ($1, $2, $3, $4);
+			$reason =~ s/(["\\])/\\$1/g;
+			out dp => 0, "kickban # $id $bantime $mask $reason";
+			my $slotnik = "playerslot_$id";
+			out irc => 0, "PRIVMSG $nick :kickbanned $id ($store{$slotnik}{name} @ $store{$slotnik}{ip}), netmask $mask, for $bantime seconds ($reason)";
+		}
+
+		return -1;
+	} ],
+
 	# LMS: detect "no more lives" message
 	[ dp => q{\^4.*\^4 has no more lives left} => sub {
 		if(!$store{lms_blocked})
@@ -1290,7 +1364,8 @@
 # not containing our own IP:port, or by rcon2irc_eval not being a defined command).
 schedule sub {
 	my ($timer) = @_;
-	out dp => 0, 'status', 'log_dest_udp', 'rcon2irc_eval set dummy 1';
+	out dp => 0, 'status 1', 'log_dest_udp', 'rcon2irc_eval set dummy 1';
+	$store{status_waiting} = -1;
 	schedule $timer => (exists $store{dp_hostname} ? $config{dp_status_delay} : 1);;
 } => 1;
 




More information about the nexuiz-commits mailing list