diff options
| author | 2019-01-03 19:22:30 +0100 | |
|---|---|---|
| committer | 2019-01-03 19:22:30 +0100 | |
| commit | 667105dc059a73838e49a35dc9ee4e0222a0c7c1 (patch) | |
| tree | 0c178eb9cb9392e019652342606aeba249f19e1f | |
| parent | Add `PUT` support in API client. (diff) | |
Sync updated users since last boot.
| -rw-r--r-- | bot/cogs/sync/cog.py | 6 | ||||
| -rw-r--r-- | bot/cogs/sync/syncers.py | 37 | 
2 files changed, 24 insertions, 19 deletions
diff --git a/bot/cogs/sync/cog.py b/bot/cogs/sync/cog.py index 84175745a..959e26eeb 100644 --- a/bot/cogs/sync/cog.py +++ b/bot/cogs/sync/cog.py @@ -1,3 +1,4 @@ +import logging  from typing import Callable, Iterable  from discord import Guild @@ -5,6 +6,8 @@ from discord.ext.commands import Bot  from . import syncers +log = logging.getLogger(__name__) +  class Sync:      """Captures relevant events and sends them to the site.""" @@ -27,4 +30,7 @@ class Sync:          guild = self.bot.get_guild(self.SYNC_SERVER_ID)          if guild is not None:              for syncer in self.ON_READY_SYNCERS: +                syncer_name = syncer.__name__[5:]  # drop off `sync_` +                log.info("Starting `%s` syncer.", syncer_name)                  await syncer(self.bot, guild) +                log.info("`%s` syncer finished.", syncer_name) diff --git a/bot/cogs/sync/syncers.py b/bot/cogs/sync/syncers.py index 6235a8243..9fff72320 100644 --- a/bot/cogs/sync/syncers.py +++ b/bot/cogs/sync/syncers.py @@ -69,21 +69,17 @@ def get_users_for_update(      Obtain a set of users to update on the website.      """ -    api_user_ids = set(api_users.keys()) -    guild_user_ids = set(guild_users.keys()) -    left_user_ids = api_user_ids - guild_user_ids - -    api_users.update(guild_users) -    for left_id in left_user_ids: -        if left_id in api_users: -            user = api_users[left_id] -            log.debug( -                "User `%s#%s` (`%d`) left since the last sync, updating `in_guild` field.", -                user.name, user.discriminator, user.discriminator -            ) -            api_users[left_id]._replace(in_guild=False) - -    return api_users.values() +    users_to_update = set() +    for api_user in api_users.values(): +        guild_user = guild_users.get(api_user.id) +        if guild_user is not None: +            if api_user != guild_user: +                users_to_update.add(guild_user) +        else: +            # User left +            api_user._replace(in_guild=False) +            users_to_update.add(guild_user) +    return users_to_update  # Taken from `https://docs.python.org/3.7/library/itertools.html#itertools-recipes`. @@ -102,7 +98,7 @@ async def sync_users(bot: Bot, guild: Guild):      current_users = await bot.api_client.get('bot/users')      api_users = {          user_dict['id']: User( -            roles=set(user_dict.pop('roles')), +            roles=tuple(sorted(user_dict.pop('roles'))),              **user_dict          )          for user_dict in current_users @@ -110,18 +106,21 @@ async def sync_users(bot: Bot, guild: Guild):      guild_users = {          member.id: User(              id=member.id, name=member.name, -            discriminator=member.discriminator, avatar_hash=member.avatar, -            roles={role.id for role in member.roles}, in_guild=True +            discriminator=int(member.discriminator), avatar_hash=member.avatar, +            roles=tuple(sorted(role.id for role in member.roles)), in_guild=True          )          for member in guild.members      }      users_to_update = get_users_for_update(guild_users, api_users)      log.info("Updating a total of `%d` users on the site.", len(users_to_update))      for user in users_to_update: +        if user is None:  # ?? +            continue +          await bot.api_client.put(              'bot/users/' + str(user.id),              json={ -                'avatar': user.avatar_hash, +                'avatar_hash': user.avatar_hash,                  'discriminator': user.discriminator,                  'id': user.id,                  'in_guild': user.in_guild,  |