Portál AbcLinuxu, 1. května 2025 14:08
Před X měsíci jsem koupil fajnovou doménu killem.al (registrována u Albánského host.al - vše v pohodě). Akorát mě nenapadá co tam teď dát , tak jsem zvedávej na tipy od místních KERNEL ULTRAS
Zatím jsem tam hodil veřejný openarena server. Rád bych aby se na webu ukazovalo kolik je zrovna připojeno hráčů. Samozřejmě žádný z nástrojů, doporučených na OpenArena wiki, toto neumí. Rozhodl jsem se tedy vytvořit vlastní skriptik co použije crcon (utilitka do konzole která pošle příkaz OpenArena serveru a vypíše odpověď - příkazy jsou stejne jaké bere konzole ve hře). Když ani crcon nechtěl fungovat, to už mě naštvalo natolik že jsem se ze zahrady vrátil zpátky do baráku i když máme jeden krasnej slunecnej den snad po měsíci.
Zpátky k crcon, ve zdrojaku stačilo víceméně zvětšit timeout při čekání na odpověď a začalo to šlapat. Ale když už jsem se díval do zdrojaku tak mě zarazilo že i když se skládají z několika souboru a možná tisíce řádku kódu tak to vlastně nic moc nedělá (autor si implementuje vlastní parser argumentů apod.) a navíc protokol kterým s q3/openarena serverem komunikuje je těžce jednoduchý. Tak jsem rovnou napsal skriptik v pythonu který celý crcon nahradí. Tady je. Dvacet řádku pythonu místo tisíce v céčku .. a navíc to i funguje
:
import socket import argparse import sys parser = argparse.ArgumentParser(description="OpenArena rcon") parser.add_argument("-s","--server",type=str,required=True) parser.add_argument("-p","--password",type=str,required=True) parser.add_argument("-c","--command",type=str,required=True) parser.add_argument("-t","--timeout",type=float,default=10,required=False) args = parser.parse_args() if ":" not in args.server: ip = args.server port = 27960 else: doubledot_pos = args.server.find(":") ip = args.server[:doubledot_pos] try: port = int(args.server[doubledot_pos+1:]) except ValueError: print("invalid server, use 'ip:port' format for -s") sys.exit(2) try: sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.settimeout(args.timeout) sock.connect( (ip,port) ) sock.sendall("\xff\xff\xff\xffrcon "+args.password+" "+args.command+"\n") reply = sock.recv(1024)[10:] while True: try: reply += sock.recv(1024)[10:] except socket.timeout: break if reply and not reply[-1] == "\n": raise socket.timeout("reply doesnt end with \\n") print(reply) except socket.timeout: print ("timeout reached, try with higher -t") sys.exit(2) except socket.error: print ("couldn't connect") sys.exit(2)
Tiskni
Sdílej:
netstat -unt | grep $SERVERPORT |wc -lZdar Max
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.