15
my (@playerlist, @serverlist, @maplist, %servers, %rank);
16
my ($home, $arg, $mode) = ($ENV{'HOME'}, "", 0);
17
my ($score, $server) = (0, "");
20
# Parse any command line arguments...
26
show_help, exit if $arg =~ /^-(-h(e(lp?)?)?|h)$/;
27
$mode=1, next if $arg =~ /^-(-p(l(a(y(er?)?)?)?)?|p)$/;
28
$mode=2, next if $arg =~ /^-(-s(e(r(v(er?)?)?)?)?|s)$/;
29
$mode=3, next if $arg =~ /^-(-m(ap?)?|m)$/;
31
parse_error ($arg), exit if $arg =~ /^-/;
33
push (@playerlist, $arg), next if $mode == 1;
34
push (@serverlist, $arg), next if $mode == 2;
35
push (@maplist, $arg), next if $mode == 3;
40
# Find/Parse configuration file
42
if (open (CONFIGFILE, "$home/.var/config/x/xpilot/metapilot") ||
43
open (CONFIGFILE, "$home/.metapilot") ||
44
open (CONFIGFILE, "$home/.metapilotrc"))
48
/^\s*(player|PLAYER|Player)\s*:\s*(.*)$/ && push @playerlist, $2;
49
/^\s*(server|SERVER|Server)\s*:\s*(.*)$/ && push @serverlist, $2;
50
/^\s*(map|MAP|Map)\s*:\s*(.*)$/ && push @maplist, $2;
57
for (my ($count)=0; $count<=$#serverlist; ++$count)
59
$serverlist[$count] =~ s/\./\\./g;
65
print "Players: ".join (', ', @playerlist)."\n";
66
print "Servers: ".join (', ', @serverlist)."\n";
67
print "Maps: ".join (', ', @maplist)."\n\n";
72
# Open up a connection to the metaserver; sort the servers listed there...
76
$iaddr = inet_aton ("meta.xpilot.org") ||
77
die "Unable to locate metaserver: $!\n";
79
$paddr = sockaddr_in (4401, $iaddr);
81
socket (METASERVER, PF_INET, SOCK_STREAM, getprotobyname ("tcp")) ||
82
die "Unable to create socket: $!\n";
84
connect (METASERVER, $paddr) ||
85
die ("Unable to connect to metaserver: $!\n");
91
my ($score, $count) = 0, 0;
93
my ($version, $server, $port, $num_players, $map, $size, $written_by,
94
$status, $max_players, $fps, $player_list, $sound, $uptime,
95
$num_team_bases, $timing, $ipaddress, $num_free_bases,
96
$num_queued_players) = split (':');
98
next if $servers{"$server:$port"};
99
$servers{"$server:$port"} = $_;
101
for ($count=0; $count<=$#serverlist; ++$count)
103
++$score if $server =~ /$serverlist[$count]/i;
104
++$score if $server =~ /\b$serverlist[$count]\b/i;
105
++$score if $server =~ /^$serverlist[$count]$/i;
108
for ($count=0; $count<=$#playerlist; ++$count)
110
++$score if $player_list =~ /$playerlist[$count]/i;
111
++$score if $player_list =~ /\b$playerlist[$count]\b/i;
112
++$score if $player_list =~ /(^|,)$playerlist[$count]=/i;
115
for ($count=0; $count<=$#maplist; ++$count)
117
++$score if $map =~ /$maplist[$count]/i;
118
++$score if $map =~ /\b$maplist[$count]\b/i;
119
++$score if $map =~ /^$maplist[$count]$/i;
122
++$score if $player_list;
123
$score-=9 if ($map =~ /(The (Newbie )?Globe|Random Land|CloudScape)/);
125
printf "%-30s %d\n", $server, $score if $ENV{'DEBUG'};
127
$rank{$score} .= ($rank{$score} ? "," : "")."$server:$port";
134
# Print out the servers ranked by score...
136
foreach $score (sort (keys (%rank)))
139
foreach $server (split (',', $rank{$score}))
141
print_entry ($servers{$server});
154
Usage: $0 [OPTION]...
156
-h, -\-help, display this message
157
-p, -\-player PLAYERLIST watch out for player(s)
158
-s, -\-server SERVERLIST watch out for server(s)
159
-m, -\-map MAPLIST watch out for map(s)
165
# More online help (for people that can't get the options right)
170
print "$0: illegal option '$arg'\n";
171
print "Try \'$0 --help\' for more information.\n";
181
my ($version, $server, $port, $num_players, $map, $size, $written_by,
182
$status, $max_players, $fps, $player_list, $sound, $uptime,
183
$num_team_bases, $timing, $ipaddress, $num_free_bases,
184
$num_queued_players) = split (':', $line);
187
# Print the servername...
190
$server.($port == 15345 ? "" : ":$port"),
191
$map.($sound=~/yes/ ? " (sound)" : ""),
194
# Print the players...
196
my (@players) = split (",", $player_list);
200
my ($name,$client) = split ("=", shift (@players));
202
# Remove the team from the end of the client
203
$client =~ s/\{([0-9]+)\}$//;
204
my ($team) = ($1 ? "Team $1" : "");
206
# Remove spaces and trailing junk
207
$client =~ s/[ ].*//;
211
printf " %-15s %-7s %s\n",
218
printf " %-15s %s\n",