;######################################################### ;################# Counter-Strike Query ################## ;######################################################### alias csquery { ; by bobby - bobby921@gmail.com - #script on irc.gamesurge.net ; edited by Snp #snp on irc.gamesurge.net ; function: queries a half-life server for its information using the new protocol (as of 7/25/05) ; usage: /queryhlserver [:port] - (port is automatically 27015 unless otherwise specified) ; example: /queryhlserver 255.255.255.255 ; /queryhlserver 255.255.255.255:27016 if (*.*.*.* !iswm $1) return $null else { if (($gettok($1,1,46) !isnum) || ($gettok($1,2,46) !isnum) || ($gettok($1,3,46) !isnum) || ($gettok($gettok($1,4,46),1,58) !isnum)) return $null else { if ($chr(58) isin $1) { var %queryhl.ip = $replace($1,$chr(58),$chr(32)) if (($gettok(%queryhl.ip,2,32) !isnum) || ($gettok(%queryhl.ip,2,32) > 65535)) return $null } else { if ($2) { if ($2 <= 65535) var %queryhl.ip = $1 $2 else return $null } else var %queryhl.ip = $1 27015 } set %queryhl.beginticks $ticks .timerqueryhltimeout -o 1 2 queryhltimeout if ($sock(queryhlserver)) sockclose queryhlserver sockudp -k queryhlserver %queryhl.ip $str($chr(255),4) $+ TSource Engine Query sockmark queryhlserver %queryhl.ip } } } alias queryhltimeout { unset %queryhl.beginticks echo -a HL server timed out. Your connection or the server may be experiencing problems. sockclose queryhlserver } on *:udpread:queryhlserver:{ var %queryhl.ping = $calc($ticks - %queryhl.beginticks) sockread &query ;; uncomment the line below if you want to see the raw return ;echo -a $bvar(&query,1,$bvar(&query,0)) breplace &query 0 254 32 160 var %queryhl.return = $bvar(&query,1,$bvar(&query,0)).text, %x = 1 ;; uncomment the line below if you want to see the somewhat parsed return ;echo -a parsed return: %queryhl.return if (*Source* iswm $gettok(%queryhl.return,4,254)) { set %source 1 var %queryhl.hostname = $right($gettok(%queryhl.return,1,254),-6) var %queryhl.map = $gettok(%queryhl.return,2,254) var %queryhl.gamedir = $gettok(%queryhl.return,4,254) var %queryhl.mod = $ifmatch } else { ;; grab hostname, map, gamedir, and mod var %queryhl.hostname = $gettok(%queryhl.return,2,254) var %queryhl.map = $gettok(%queryhl.return,3,254) var %queryhl.gamedir = $gettok(%queryhl.return,4,254) var %queryhl.mod = $gettok(%queryhl.return,5,254) } ;; for position calc (prevents messed up position if mod name is in hostname) var %position = $regex(position,%queryhl.hostname,/ $+ %queryhl.mode $+ */g) if (!%position) var %position = 1 var %positionnumber = $pos(%queryhl.return,$gettok(%queryhl.return,5,254),%position) ;; parsing for players var %gamechars = $len($gettok(%queryhl.return,5,254)) var %charcalc = $calc(%positionnumber + %gamechars) var %players = $mid(%queryhl.return,%charcalc,3) ;; grab current connected players and maxplayers var %queryhl.players = $iif($asc($mid(%players,2,1)) == 254,0,$ifmatch) var %queryhl.maxplayers = $asc($right(%players,1)) if (%queryhl.maxplayers == 160) var %queryhl.maxplayers = 32 ;; parse next part and grab protocol number and server type (if players is 0 position it 1 back) var %2ndstring = $gettok(%queryhl.return,6,254) var %queryhl.protocolnumber = $asc($mid(%2ndstring,$iif(%queryhl.players == 0,2,3),1)) if (!%queryhl.protocolnumber) var %queryhl.protocolnumber = 0 var %queryhl.servertype = $iif($mid(%2ndstring,$iif(%queryhl.players == 0,3,4),1) == d,dedicated,listen) ;; calculate the current position in the return + 1 (where the password yes/no is) var %pwPos = $calc(%charcalc + $pos(%2ndstring,5,1) + 1) ;; grab the server operating system (if players is 0 position it 1 back), password 0|1, secure 0|1, and number of bots var %queryhl.serveros = $iif($mid(%2ndstring,$iif(%queryhl.players == 0,4,5),1) == l,Linux,Windows) if (%source == 1) { var %sourcestring = $gettok(%queryhl.return,-2,254) set %lewl $gettok(%queryhl.return,-2,254) var %queryhl.servertype = $iif($mid(%sourcestring,-2,1) == d,Dedicated,Listen) var %queryhl.serveros = $iif($right(%sourcestring,1) == l,Linux,Windows) unset %source } var %queryhl.password = $iif($right($mid(%queryhl.return,%pwPos,6),1) == $chr(254),No,Yes) var %queryhl.secure = $iif($mid($calc($len(%queryhl.return) - 1),1) == $chr(254),No,Yes) var %queryhl.bots = $iif($asc($right(%queryhl.return,1)) == 254,0,$ifmatch) ; echo results var %queryhl.ip = $sock($sockname).mark tokenize 32 %queryhl.ip echo -a IP Address: $+($1,:,$2) (approximate ping: %queryhl.ping $+ ms) echo -a Hostname: %queryhl.hostname echo -a Map: %queryhl.map echo -a Gamedir: %queryhl.gamedir echo -a Mod: %queryhl.mod echo -a Players: %queryhl.players echo -a Maxplayers: %queryhl.maxplayers echo -a Protocol Number: %queryhl.protocolnumber echo -a Server Type: %queryhl.servertype echo -a Operating System: %queryhl.serveros echo -a Password Protected: %queryhl.password echo -a VAC Secure: %queryhl.secure echo -a Bots: %queryhl.bots msg %my.chan %skin.start Hostname:15 %queryhl.hostname %skin.mid Game Type:15 %queryhl.gamedir %skin.mid Listen/Dedicated:15 %queryhl.servertype %skin.end msg %my.chan %skin.start OS:15 %queryhl.serveros %skin.mid Map:15 %queryhl.map %skin.mid Players:15 %queryhl.players $+ / $+ %queryhl.maxplayers %skin.mid PW:15 %queryhl.password %skin.mid VAC:15 %queryhl.secure %skin.mid Bots:15 %queryhl.bots %skin.end unset %queryhl.beginticks sockclose queryhlserver .timerqueryhltimeout off }