예제 #1
0
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)
예제 #2
0
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)
예제 #3
0
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)
예제 #4
0
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)