[1] | 1 | #!/usr/bin/perl -w |
---|
| 2 | |
---|
| 3 | ########################################################################## |
---|
| 4 | # INFORMATION TOOL ABOUT THE # OF ONLINE PLAYERS ON ATHENA SERVERS |
---|
| 5 | # |
---|
| 6 | # By connection on the athena login-server, this software displays the |
---|
| 7 | # number of online players. |
---|
| 8 | # |
---|
| 9 | #------------------------------------------------------------------------- |
---|
| 10 | # Software usage: |
---|
| 11 | # Configure the IP, the port and a valid account of the server. |
---|
| 12 | # After, use at your choice: |
---|
| 13 | # ./getlogincount - display the number of online players on all servers. |
---|
| 14 | # ./getlogincount --premier or |
---|
| 15 | # ./getlogincount --first -- display the number of online players of the |
---|
| 16 | # first server in the received list. |
---|
| 17 | # ./getlogincount [servername] -- display the number of online players |
---|
| 18 | # of the specified server. |
---|
| 19 | # |
---|
| 20 | # If successfull, the software return the value 0. |
---|
| 21 | # |
---|
| 22 | ########################################################################## |
---|
| 23 | |
---|
| 24 | #------------------------------ CONFIGURATION ---------------------------- |
---|
| 25 | |
---|
| 26 | $loginserverip = "127.0.0.1"; # IP of the login-server |
---|
| 27 | $loginserverport = 6900; # port of the login-server |
---|
| 28 | $loginaccount = "s1"; # a valid account name |
---|
| 29 | $loginpasswd = "p1"; # the password of the valid account name |
---|
| 30 | |
---|
| 31 | $connecttimeout = 10; # Connection timeout (in seconds) |
---|
| 32 | |
---|
| 33 | #------------------------------------------------------------------------- |
---|
| 34 | |
---|
| 35 | use IO::Socket; |
---|
| 36 | |
---|
| 37 | my($sname) = $ARGV[0]; |
---|
| 38 | if (!defined($sname)) { |
---|
| 39 | $sname = ""; |
---|
| 40 | } |
---|
| 41 | |
---|
| 42 | # Connection to the login-server |
---|
| 43 | my($so,$er) = (); |
---|
| 44 | eval{ |
---|
| 45 | $so = IO::Socket::INET->new( |
---|
| 46 | PeerAddr=> $loginserverip, |
---|
| 47 | PeerPort=> $loginserverport, |
---|
| 48 | Proto => "tcp", |
---|
| 49 | Timeout => $connecttimeout) or $er=1; |
---|
| 50 | }; |
---|
| 51 | if($er || $@){ |
---|
| 52 | print "Can't not connect to the login-server [${loginserverip}:$loginserverport] !\n"; |
---|
| 53 | exit(2); |
---|
| 54 | } |
---|
| 55 | |
---|
| 56 | # Request to connect on login-server |
---|
| 57 | print $so pack("v V a24 a24 C",0x0064,9,$loginaccount,$loginpasswd,3); |
---|
| 58 | $so->flush(); |
---|
| 59 | |
---|
| 60 | # Fail to connect |
---|
| 61 | if(unpack("v", &soread(\$so,2)) != 0x0069) { |
---|
| 62 | print "Login error.\n"; |
---|
| 63 | exit(3); |
---|
| 64 | } |
---|
| 65 | |
---|
| 66 | # Get length of the received packet |
---|
| 67 | my($plen) = unpack("v",&soread(\$so,2))-4; |
---|
| 68 | |
---|
| 69 | # Suppress information of the account (we need only information about the servers) |
---|
| 70 | &soread(\$so,43); |
---|
| 71 | $plen -= 43; |
---|
| 72 | |
---|
| 73 | # Check about the number of online servers |
---|
| 74 | if ($plen < 32) { |
---|
| 75 | printf "No server is connected to login-server.\n"; |
---|
| 76 | exit(1); |
---|
| 77 | } |
---|
| 78 | |
---|
| 79 | # Read information of the servers |
---|
| 80 | my(@slist) = (); |
---|
| 81 | for(;$plen > 0;$plen -= 32) { |
---|
| 82 | my($name,$count) = unpack("x6 a20 V",&soread(\$so,32)); |
---|
| 83 | $name = substr($name,0,index($name,"\0")); |
---|
| 84 | push @slist, [ $name, $count ]; |
---|
| 85 | } |
---|
| 86 | |
---|
| 87 | # Display the result |
---|
| 88 | if($sname eq "--first" || $sname eq "--premier") { # If we ask only for the first server |
---|
| 89 | printf "%-20s : %5d\n",$slist[0][0],$slist[0][1]; |
---|
| 90 | } elsif ($sname eq "") { # If we ask for all servers |
---|
| 91 | foreach $i(@slist) { |
---|
| 92 | printf "%-20s : %5d\n",$i->[0],$i->[1]; |
---|
| 93 | } |
---|
| 94 | } else { # If we ask for a specified server (by its name) |
---|
| 95 | my($flag) = 1; |
---|
| 96 | foreach $i(@slist) { |
---|
| 97 | if($i->[0] eq $sname) { |
---|
| 98 | printf "%-20s : %5d\n",$i->[0],$i->[1]; |
---|
| 99 | $flag = 0; |
---|
| 100 | } |
---|
| 101 | } |
---|
| 102 | if($flag) { # If the server doesn't exist |
---|
| 103 | printf "The server [$sname] doesn't exist.\n"; |
---|
| 104 | exit(1); |
---|
| 105 | } |
---|
| 106 | } |
---|
| 107 | |
---|
| 108 | # End of the software |
---|
| 109 | $so->shutdown(2); |
---|
| 110 | $so->close(); |
---|
| 111 | exit(0); |
---|
| 112 | |
---|
| 113 | # Sub-function: get data from the socket |
---|
| 114 | sub soread { |
---|
| 115 | my($so,$len) = @_; |
---|
| 116 | my($sobuf); |
---|
| 117 | if(read($$so,$sobuf,$len) < $len) { |
---|
| 118 | print "Socket read error.\n"; |
---|
| 119 | exit(5); |
---|
| 120 | } |
---|
| 121 | return $sobuf; |
---|
| 122 | }; |
---|