From 70c2a4a6e46ce34be1b981a60fd7efd065c235fb Mon Sep 17 00:00:00 2001 From: Adarnof Date: Thu, 22 Feb 2018 17:41:38 -0500 Subject: [PATCH] Use new endpoint for adding Discord users. Closes #974 --- .../services/modules/discord/manager.py | 26 +++++++++++++------ .../services/modules/discord/tasks.py | 17 +++++++----- .../services/modules/discord/tests.py | 14 +++++----- 3 files changed, 36 insertions(+), 21 deletions(-) diff --git a/allianceauth/services/modules/discord/manager.py b/allianceauth/services/modules/discord/manager.py index 68bf3fe3..53406bdd 100644 --- a/allianceauth/services/modules/discord/manager.py +++ b/allianceauth/services/modules/discord/manager.py @@ -22,8 +22,8 @@ Previously all we asked for was permission to kick members, manage roles, and ma Users have reported weird unauthorized errors we don't understand. So now we ask for full server admin. It's almost fixed the problem. """ -# kick members, manage roles, manage nicknames -# BOT_PERMISSIONS = 0x00000002 + 0x10000000 + 0x08000000 +# kick members, manage roles, manage nicknames, create instant invite +# BOT_PERMISSIONS = 0x00000002 + 0x10000000 + 0x08000000 + 0x00000001 BOT_PERMISSIONS = 0x00000008 # get user ID, accept invite @@ -183,23 +183,33 @@ class DiscordOAuthManager: return token @staticmethod - def add_user(code): + def add_user(code, groups, nickname=None): try: token = DiscordOAuthManager._process_callback_code(code)['access_token'] logger.debug("Received token from OAuth") custom_headers = {'accept': 'application/json', 'authorization': 'Bearer ' + token} - path = DISCORD_URL + "/invites/" + str(settings.DISCORD_INVITE_CODE) - r = requests.post(path, headers=custom_headers) - logger.debug("Got status code %s after accepting Discord invite" % r.status_code) - r.raise_for_status() - path = DISCORD_URL + "/users/@me" r = requests.get(path, headers=custom_headers) logger.debug("Got status code %s after retrieving Discord profile" % r.status_code) r.raise_for_status() user_id = r.json()['id'] + + path = DISCORD_URL + "/guilds/" + str(settings.DISCORD_GUILD_ID) + "/members/" + str(user_id) + group_ids = [DiscordOAuthManager._group_name_to_id(DiscordOAuthManager._sanitize_group_name(g)) for g in + groups] + data = { + 'roles': group_ids, + 'access_token': token, + } + if nickname: + data['nick'] = nickname + custom_headers['authorization'] = 'Bot ' + settings.DISCORD_BOT_TOKEN + r = requests.put(path, headers=custom_headers, json=data) + logger.debug("Got status code %s after joining Discord server" % r.status_code) + r.raise_for_status() + logger.info("Added Discord user ID %s to server." % user_id) return user_id except: diff --git a/allianceauth/services/modules/discord/tasks.py b/allianceauth/services/modules/discord/tasks.py index 2c10aeef..86bb06f2 100644 --- a/allianceauth/services/modules/discord/tasks.py +++ b/allianceauth/services/modules/discord/tasks.py @@ -19,15 +19,16 @@ class DiscordTasks: @classmethod def add_user(cls, user, code): - user_id = DiscordOAuthManager.add_user(code) + groups = DiscordTasks.get_groups(user) + nickname = None + if settings.DISCORD_SYNC_NAMES: + nickname = DiscordTasks.get_nickname(user) + user_id = DiscordOAuthManager.add_user(code, groups, nickname=nickname) if user_id: discord_user = DiscordUser() discord_user.user = user discord_user.uid = user_id discord_user.save() - if settings.DISCORD_SYNC_NAMES: - cls.update_nickname.delay(user.pk) - cls.update_groups.delay(user.pk) return True return False @@ -62,9 +63,7 @@ class DiscordTasks: user = User.objects.get(pk=pk) logger.debug("Updating discord groups for user %s" % user) if DiscordTasks.has_account(user): - groups = [user.profile.state.name] - for group in user.groups.all(): - groups.append(str(group.name)) + groups = DiscordTasks.get_groups(user) logger.debug("Updating user %s discord groups to %s" % (user, groups)) try: DiscordOAuthManager.update_groups(user.discord.uid, groups) @@ -142,3 +141,7 @@ class DiscordTasks: def get_nickname(user): from .auth_hooks import DiscordService return NameFormatter(DiscordService(), user).format_name() + + @staticmethod + def get_groups(user): + return [g.name for g in user.groups.all()] + [user.profile.state.name] diff --git a/allianceauth/services/modules/discord/tests.py b/allianceauth/services/modules/discord/tests.py index c4add20c..58126fbc 100644 --- a/allianceauth/services/modules/discord/tests.py +++ b/allianceauth/services/modules/discord/tests.py @@ -245,18 +245,20 @@ class DiscordManagerTestCase(TestCase): headers = {'accept': 'application/json', 'authorization': 'Bearer accesstoken'} - m.register_uri('POST', - manager.DISCORD_URL + '/invites/' + str(settings.DISCORD_INVITE_CODE), - request_headers=headers, - text='{}') - m.register_uri('GET', manager.DISCORD_URL + "/users/@me", request_headers=headers, text=json.dumps({'id': "123456"})) + headers = {'accept': 'application/json', 'authorization': 'Bot ' + settings.DISCORD_BOT_TOKEN} + + m.register_uri('PUT', + manager.DISCORD_URL + '/guilds/' + str(settings.DISCORD_GUILD_ID) + '/members/123456', + request_headers=headers, + text='{}') + # Act - return_value = DiscordOAuthManager.add_user('abcdef') + return_value = DiscordOAuthManager.add_user('abcdef', []) # Assert self.assertEqual(return_value, '123456')