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( 'houdini.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( f'{server_config["Id"]},{server_population}') server_key = f'houdini.players.{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)
async def get_server_presence(p, pdata): buddy_worlds = [] world_populations = [] pops = await p.server.redis.hgetall('houdini.population') for server_id, server_population in pops.items(): server_population = 7 if int(server_population) == p.server.config.capacity \ else int(server_population) // (p.server.config.capacity // 6) server_population = server_population if not pdata.moderator else 0 world_populations.append(f'{int(server_id)},{int(server_population)}') server_key = f'houdini.players.{int(server_id)}' if await p.server.redis.scard(server_key): async with p.server.db.transaction(): buddies = BuddyList.select('buddy_id').where( BuddyList.penguin_id == pdata.id).gino.iterate() async with p.server.redis.pipeline(transaction=True) as tr: async for buddy_id, in buddies: tr.sismember(server_key, buddy_id) online_buddies = await tr.execute() if any(online_buddies): buddy_worlds.append(str(int(server_id))) return '|'.join(world_populations), '|'.join(buddy_worlds)
async def handle_get_buddies_legacy(p): buddies_query = BuddyList.load(parent=Penguin.on(Penguin.id == BuddyList.buddy_id)).where( BuddyList.penguin_id == p.data.id) buddies = [] async with p.server.db.transaction(): buddy_list = buddies_query.gino.iterate() async for buddy in buddy_list: buddy_presence = int(buddy.buddy_id in p.server.penguins_by_id) buddies.append(f'{buddy.buddy_id}|{buddy.parent.nickname}|{buddy_presence}') await p.send_xt('gb', *buddies) await update_player_presence(p)
async def handle_get_buddies(p): buddies_query = BuddyList.load(parent=Penguin.on(Penguin.id == BuddyList.buddy_id)).where( BuddyList.penguin_id == p.id) request_query = BuddyRequest.load(parent=Penguin.on(Penguin.id == BuddyRequest.requester_id)).where( BuddyRequest.penguin_id == p.id) buddies = [] best_buddies = [] characters = [] best_characters = [] async with p.server.db.transaction(): buddy_list = buddies_query.gino.iterate() buddy_requests = request_query.gino.iterate() async for buddy in buddy_list: buddy_presence = int(buddy.buddy_id in p.server.penguins_by_id) buddies.append(f'{buddy.buddy_id}|{buddy.parent.safe_nickname(p.server.config.lang)}|{buddy_presence}') if buddy.best_buddy: best_buddies.append(str(buddy.buddy_id)) for character in p.character_buddies.values(): character_presence = int(character.character_id in p.server.penguins_by_character_id) characters.append(f'{character.character_id}|{character_presence}') if character.best_buddy: best_characters.append(str(character.character_id)) requests = [f'{request.requester_id}|{request.parent.safe_nickname(p.server.config.lang)}' async for request in buddy_requests] best_friend_count = len(best_buddies) + len(best_characters) notification_aware = int(best_friend_count >= 1) best_friends_enabled = int((len(buddies) + len(characters)) >= 6) await p.send_xt('gs', best_friend_count, notification_aware, int(p.active), best_friends_enabled) await p.send_xt('gb', *buddies) await p.send_xt('pbr', *requests) await p.send_xt('gc', *characters) if best_friends_enabled: await p.send_xt('gbf', *best_buddies) await p.send_xt('gbc', *best_characters) await update_player_presence(p)