mirror of
https://github.com/solero/houdini.git
synced 2025-04-26 16:46:27 +00:00
59 lines
2.3 KiB
Python
59 lines
2.3 KiB
Python
import config
|
|
|
|
from houdini import handlers, ClientType
|
|
from houdini.handlers import XMLPacket
|
|
from houdini.converters import VersionChkConverter
|
|
|
|
from houdini.data.buddy import BuddyList
|
|
|
|
|
|
@handlers.handler(XMLPacket('verChk'))
|
|
@handlers.allow_once
|
|
async def handle_version_check(p, version: VersionChkConverter):
|
|
if config.client['MultiClientSupport']:
|
|
if config.client['LegacyVersionChk'] == version:
|
|
p.client_type = ClientType.Legacy
|
|
elif config.client['VanillaVersionChk'] == version:
|
|
p.client_type = ClientType.Vanilla
|
|
elif config.client['DefaultVersionChk'] == version:
|
|
p.client_type = config.client['DefaultClientType']
|
|
|
|
if p.client_type is None:
|
|
await p.send_xml({'body': {'action': 'apiKO', 'r': '0'}})
|
|
await p.close()
|
|
else:
|
|
await p.send_xml({'body': {'action': 'apiOK', 'r': '0'}})
|
|
|
|
|
|
@handlers.handler(XMLPacket('rndK'))
|
|
@handlers.allow_once
|
|
async def handle_random_key(p, data):
|
|
await p.send_xml({'body': {'action': 'rndK', 'r': '-1'}, 'k': config.client['AuthStaticKey']})
|
|
|
|
|
|
async def get_server_presence(p, pid):
|
|
buddy_worlds = []
|
|
world_populations = []
|
|
|
|
for server_name, server_config in config.servers.items():
|
|
if server_config['World']:
|
|
server_population = await p.server.redis.hget('population', server_config['Id'])
|
|
server_population = (7 if int(server_population) == server_config['Capacity']
|
|
else int(server_population) / (server_config['Capacity'] / 6)) \
|
|
if server_population else 0
|
|
|
|
world_populations.append('{},{}'.format(server_config['Id'], server_population))
|
|
|
|
server_key = '{}.players'.format(server_config['Id'])
|
|
if await p.server.redis.scard(server_key):
|
|
async with p.server.db.transaction():
|
|
buddies = BuddyList.select('buddy_id').where(BuddyList.penguin_id == pid).gino.iterate()
|
|
tr = p.server.redis.multi_exec()
|
|
async for buddy_id, in buddies:
|
|
tr.sismember(server_key, buddy_id)
|
|
online_buddies = await tr.execute()
|
|
if any(online_buddies):
|
|
buddy_worlds.append(server_config['Id'])
|
|
|
|
return '|'.join(world_populations), '|'.join(buddy_worlds)
|