forked from hipstercat/giantsd
Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
acf7392d86 | |||
a5d2629096 |
1
countries.json
Normal file
1
countries.json
Normal file
File diff suppressed because one or more lines are too long
@ -1,5 +1,7 @@
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
|
from geolite2 import geolite2
|
||||||
|
|
||||||
from .packet import Packet
|
from .packet import Packet
|
||||||
from .EnumQuery import EnumQuery
|
from .EnumQuery import EnumQuery
|
||||||
from .EnumResponse import EnumResponse
|
from .EnumResponse import EnumResponse
|
||||||
@ -21,9 +23,21 @@ import random
|
|||||||
from .DN_MSG_INTERNAL_SEND_CONNECT_INFO import DN_MSG_INTERNAl_SEND_CONNECT_INFO
|
from .DN_MSG_INTERNAL_SEND_CONNECT_INFO import DN_MSG_INTERNAl_SEND_CONNECT_INFO
|
||||||
import asyncio
|
import asyncio
|
||||||
from dpnet.gamepackets import *
|
from dpnet.gamepackets import *
|
||||||
|
import requests
|
||||||
|
import json
|
||||||
|
|
||||||
logger = setup_logger(__name__)
|
logger = setup_logger(__name__)
|
||||||
|
|
||||||
|
server_names = ["\x02Hello \x05from \x02A\x03m\x04a\x05z\x06e\x07d\x03",
|
||||||
|
"\x08Have fun playing Giants!\x01",
|
||||||
|
"\x02Oh hello \x03%IP%\x05",
|
||||||
|
"\x03!! DON'T JOIN THIS SERVER !!\x01",
|
||||||
|
"\x03COVID-19 total cases in \x02%COVID_COUNTRY%\03: %COVID%\x01",
|
||||||
|
"\x04Don't forget to join our Discord: \x06https://discord.gg/Avj4azU\x01",
|
||||||
|
"\x08vvv this server has the worst ping in the world vvv\x01"]
|
||||||
|
|
||||||
|
with open("countries.json") as fp:
|
||||||
|
countries = json.load(fp)
|
||||||
|
|
||||||
class Netserver(asyncio.DatagramProtocol):
|
class Netserver(asyncio.DatagramProtocol):
|
||||||
def __init__(self, server):
|
def __init__(self, server):
|
||||||
@ -40,8 +54,8 @@ class Netserver(asyncio.DatagramProtocol):
|
|||||||
self.remotesocket = transport
|
self.remotesocket = transport
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
logger.debug("Run")
|
|
||||||
return
|
return
|
||||||
|
logger.debug("Run")
|
||||||
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
self.socket.bind((self.server.listen_ip, self.server.listen_port))
|
self.socket.bind((self.server.listen_ip, self.server.listen_port))
|
||||||
logger.debug("Listening to %s:%s", self.server.listen_ip, self.server.listen_port)
|
logger.debug("Listening to %s:%s", self.server.listen_ip, self.server.listen_port)
|
||||||
@ -50,7 +64,7 @@ class Netserver(asyncio.DatagramProtocol):
|
|||||||
|
|
||||||
if self.server.register_with_ms:
|
if self.server.register_with_ms:
|
||||||
ms = MasterServer(self.server)
|
ms = MasterServer(self.server)
|
||||||
ms.register()
|
ms._register()
|
||||||
|
|
||||||
while self.server.running:
|
while self.server.running:
|
||||||
start = datetime.now()
|
start = datetime.now()
|
||||||
@ -93,15 +107,38 @@ class Netserver(asyncio.DatagramProtocol):
|
|||||||
if second == EnumQuery.COMMAND:
|
if second == EnumQuery.COMMAND:
|
||||||
# EnumQuery
|
# EnumQuery
|
||||||
try:
|
try:
|
||||||
|
random_players = random.randint(100, 1000)
|
||||||
eq = EnumQuery(data)
|
eq = EnumQuery(data)
|
||||||
#logger.debug("Got EnumQuery, sending EnumResponse")
|
#logger.debug("Got EnumQuery, sending EnumResponse")
|
||||||
er = EnumResponse()
|
er = EnumResponse()
|
||||||
er.Payload = eq.Payload
|
er.Payload = eq.Payload
|
||||||
er.ApplicationDescSize = 0x50
|
er.ApplicationDescSize = 0x50
|
||||||
er.ApplicationDescFlags = 0x41
|
er.ApplicationDescFlags = 0x41
|
||||||
er.MaxPlayers = self.server.maxplayers
|
er.MaxPlayers = random_players
|
||||||
er.CurrentPlayers = len(self.server.players)
|
er.CurrentPlayers = 1337
|
||||||
er.SessionName = self.server.name
|
|
||||||
|
# magic
|
||||||
|
random_name = random.choice(server_names)
|
||||||
|
if "%IP%" in random_name: random_name = random_name.replace("%IP%", addr[0])
|
||||||
|
if "%JOIN_COUNT%" in random_name: random_name = random_name.replace("%JOIN_COUNT%", str(Netserver.join_count))
|
||||||
|
if "%COVID%" in random_name:
|
||||||
|
reader = geolite2.reader()
|
||||||
|
player_country = reader.get(addr[0])
|
||||||
|
d = {country["ISO2"]: country for country in countries}
|
||||||
|
try:
|
||||||
|
d_covid = requests.get("https://api.covid19api.com/summary", timeout=1).json()
|
||||||
|
except requests.Timeout:
|
||||||
|
random_name = random_name.replace("%COVID%", "unknown :'(")
|
||||||
|
random_name = random_name.replace("%COVID_COUNTRY%", "Global")
|
||||||
|
else:
|
||||||
|
if player_country and player_country["country"]["iso_code"] in d:
|
||||||
|
random_name = random_name.replace("%COVID%", str(list(filter(lambda d: d["CountryCode"] == player_country["country"]["iso_code"], d_covid["Countries"]))[0]["TotalConfirmed"]))
|
||||||
|
random_name = random_name.replace("%COVID_COUNTRY%", player_country["country"]["names"]["en"])
|
||||||
|
else:
|
||||||
|
random_name = random_name.replace("%COVID%", str(d_covid["Global"]["TotalConfirmed"]))
|
||||||
|
random_name = random_name.replace("%COVID_COUNTRY%", "Global")
|
||||||
|
|
||||||
|
er.SessionName = random_name
|
||||||
er.ApplicationInstanceGUID = self.guid
|
er.ApplicationInstanceGUID = self.guid
|
||||||
er.ApplicationGUID = eq.ApplicationGUID
|
er.ApplicationGUID = eq.ApplicationGUID
|
||||||
'''er.ApplicationReservedData = b'\xff' # Map ID
|
'''er.ApplicationReservedData = b'\xff' # Map ID
|
||||||
@ -584,7 +621,6 @@ class Netserver(asyncio.DatagramProtocol):
|
|||||||
if not player:
|
if not player:
|
||||||
logger.debug("Fuck that no player wtf man")
|
logger.debug("Fuck that no player wtf man")
|
||||||
return
|
return
|
||||||
|
|
||||||
payload = Packet()
|
payload = Packet()
|
||||||
payload.putByte(0x4e) # packet opcode
|
payload.putByte(0x4e) # packet opcode
|
||||||
#payload.putByte(0x9d) # packet opcode?
|
#payload.putByte(0x9d) # packet opcode?
|
||||||
|
29
server.py
29
server.py
@ -1,5 +1,9 @@
|
|||||||
|
import threading
|
||||||
|
import time
|
||||||
|
|
||||||
from dpnet.packet import Packet
|
from dpnet.packet import Packet
|
||||||
from giants.map import Map
|
from giants.map import Map
|
||||||
|
from giants.masterserver import MasterServer
|
||||||
from giants.player import Player
|
from giants.player import Player
|
||||||
from dpnet.netserver import Netserver
|
from dpnet.netserver import Netserver
|
||||||
from dpnet.session import Session
|
from dpnet.session import Session
|
||||||
@ -24,7 +28,7 @@ class Server:
|
|||||||
self.register_with_ms = kwargs.get("register", False)
|
self.register_with_ms = kwargs.get("register", False)
|
||||||
self.teams = kwargs.get("teams", Teams.MvM)
|
self.teams = kwargs.get("teams", Teams.MvM)
|
||||||
self.game_type = kwargs.get("gametype", GameTypes.TeamDeathmatchWithFullBase)
|
self.game_type = kwargs.get("gametype", GameTypes.TeamDeathmatchWithFullBase)
|
||||||
self.currentmap = kwargs.get("map", Map("Testmap.gck"))
|
self.currentmap = kwargs.get("map", Map("H4XX.exe.gck"))
|
||||||
self.maxplayers = kwargs.get("maxplayers", 20)
|
self.maxplayers = kwargs.get("maxplayers", 20)
|
||||||
self.name = kwargs.get("name", "Default Server Name")
|
self.name = kwargs.get("name", "Default Server Name")
|
||||||
|
|
||||||
@ -282,16 +286,33 @@ class Server:
|
|||||||
def get_player_by_index(self, playerindex):
|
def get_player_by_index(self, playerindex):
|
||||||
return self.players[playerindex]
|
return self.players[playerindex]
|
||||||
|
|
||||||
|
|
||||||
|
def ms_register_thread(s):
|
||||||
|
ms = MasterServer(s)
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
print("Registering again")
|
||||||
|
ms._register()
|
||||||
|
except:
|
||||||
|
traceback.print_exc()
|
||||||
|
time.sleep(120)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
server = Server(name="giantsd", maxplayers=20, register=False, teams=Teams.MvM, map=Map("Three Way Island - Canyons.gck")) #, map=Map("Three Way Island - Canyons.gck"))
|
server = Server(name="\x02A\x03m\x04a\x05z\x06e\x07d \x08i\x09s \x02w\x03a\x04t\x05c\x06h\x07i\x08n\x09g \x02y\x03o\x04u\x01", maxplayers=355, register=True, teams=Teams.TeamB, gametype=GameTypes.GTypeNull, map=Map("H4XX.exe.gck"),
|
||||||
server.load_plugins()
|
port=19110)
|
||||||
|
# server.load_plugins()
|
||||||
|
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_event_loop()
|
||||||
listen = loop.create_datagram_endpoint(lambda: Netserver(server), local_addr=(server.listen_ip, server.listen_port))
|
listen = loop.create_datagram_endpoint(lambda: Netserver(server), local_addr=(server.listen_ip, server.listen_port))
|
||||||
|
|
||||||
|
statsserverthread = threading.Thread(target=ms_register_thread, args=(server,))
|
||||||
|
statsserverthread.start()
|
||||||
transport, protocol = loop.run_until_complete(listen)
|
transport, protocol = loop.run_until_complete(listen)
|
||||||
loop.create_task(server.ask_command())
|
# loop.create_task(server.ask_command())
|
||||||
try:
|
try:
|
||||||
loop.run_forever()
|
loop.run_forever()
|
||||||
|
statsserverthread.join()
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
pass
|
pass
|
||||||
transport.close()
|
transport.close()
|
||||||
|
Loading…
Reference in New Issue
Block a user