Move buddy presence generation to login module

This commit is contained in:
Ben 2019-08-05 19:20:01 +01:00
parent ffdc515880
commit ad122f1987
2 changed files with 35 additions and 27 deletions

View File

@ -1,7 +1,11 @@
import config
from houdini import handlers from houdini import handlers
from houdini.handlers import XMLPacket from houdini.handlers import XMLPacket
from houdini.converters import VersionChkConverter from houdini.converters import VersionChkConverter
from houdini.data.buddy import BuddyList
@handlers.handler(XMLPacket('verChk')) @handlers.handler(XMLPacket('verChk'))
@handlers.allow_once @handlers.allow_once
@ -17,3 +21,31 @@ async def handle_version_check(p, version: VersionChkConverter):
@handlers.allow_once @handlers.allow_once
async def handle_random_key(p, data): async def handle_random_key(p, data):
await p.send_xml({'body': {'action': 'rndK', 'r': '-1'}, 'k': 'houdini'}) await p.send_xml({'body': {'action': 'rndK', 'r': '-1'}, 'k': 'houdini'})
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_name)
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)

View File

@ -1,8 +1,8 @@
from houdini import handlers from houdini import handlers
from houdini.handlers import XMLPacket, login from houdini.handlers import XMLPacket, login
from houdini.handlers.login import get_server_presence
from houdini.converters import Credentials from houdini.converters import Credentials
from houdini.data.penguin import Penguin from houdini.data.penguin import Penguin
from houdini.data.buddy import BuddyList
from houdini.data.moderator import Ban from houdini.data.moderator import Ban
from houdini.crypto import Crypto from houdini.crypto import Crypto
@ -88,35 +88,11 @@ async def handle_login(p, credentials: Credentials):
tr.setex('{}.ckey'.format(data.id), p.server.server_config['KeyTTL'], confirmation_hash) tr.setex('{}.ckey'.format(data.id), p.server.server_config['KeyTTL'], confirmation_hash)
await tr.execute() await tr.execute()
buddy_worlds = [] world_populations, buddy_presence = await get_server_presence(p, data.id)
world_populations = []
servers_config = config.servers
for server_name, server_config in servers_config.items():
if server_config['World']:
server_population = await p.server.redis.get('{}.population'.format(server_name))
server_population = (7 if int(server_population) == server_config['Capacity']
else int(server_population) / (server_config['Capacity'] / 6)) \
if server_population else 0
server_players = await p.server.redis.smembers('{}.players'.format(server_name))
world_populations.append('{},{}'.format(server_config['Id'], server_population))
if not len(server_players) > 0:
p.logger.debug('Skipping buddy iteration for {}'.format(server_name))
continue
buddies = await BuddyList.select('BuddyID').where(BuddyList.PenguinID == data.ID).gino.all()
for buddy_id in buddies:
if str(buddy_id) in server_players:
buddy_worlds.append(server_config['Id'])
break
raw_login_data = '|'.join([str(data.id), str(data.id), data.username, login_key, str(data.approval), raw_login_data = '|'.join([str(data.id), str(data.id), data.username, login_key, str(data.approval),
str(data.rejection)]) str(data.rejection)])
await p.send_xt('l', raw_login_data, confirmation_hash, '', '|'.join(world_populations), '|'.join(buddy_worlds), await p.send_xt('l', raw_login_data, confirmation_hash, '', world_populations, buddy_presence,
data.email) data.email)
handle_version_check = login.handle_version_check handle_version_check = login.handle_version_check