From d503243e128d93cfbcf74835a9da1ad03f662a8d Mon Sep 17 00:00:00 2001 From: Adarnof Date: Fri, 23 Feb 2018 13:35:56 -0500 Subject: [PATCH] Use new endpoint for adding Discord users. Closes #974 (cherry picked from commit 70c2a4a6e46ce34be1b981a60fd7efd065c235fb) --- services/modules/discord/manager.py | 26 +++++++++++++++++-------- services/modules/discord/tasks.py | 30 ++++++++++++++++------------- services/modules/discord/tests.py | 14 ++++++++------ 3 files changed, 43 insertions(+), 27 deletions(-) diff --git a/services/modules/discord/manager.py b/services/modules/discord/manager.py index 1281c0a7..cbbb3771 100644 --- a/services/modules/discord/manager.py +++ b/services/modules/discord/manager.py @@ -24,8 +24,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 @@ -185,23 +185,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/services/modules/discord/tasks.py b/services/modules/discord/tasks.py index e47bafd0..3a431da2 100644 --- a/services/modules/discord/tasks.py +++ b/services/modules/discord/tasks.py @@ -21,15 +21,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 @@ -64,12 +65,7 @@ class DiscordTasks: user = User.objects.get(pk=pk) logger.debug("Updating discord groups for user %s" % user) if DiscordTasks.has_account(user): - groups = [] - for group in user.groups.all(): - groups.append(str(group.name)) - if len(groups) == 0: - logger.debug("No syncgroups found for user. Adding empty group.") - groups.append('empty') + groups = DiscordTasks.get_groups(user) logger.debug("Updating user %s discord groups to %s" % (user, groups)) try: DiscordOAuthManager.update_groups(user.discord.uid, groups) @@ -110,10 +106,10 @@ class DiscordTasks: user = User.objects.get(pk=pk) logger.debug("Updating discord nickname for user %s" % user) if DiscordTasks.has_account(user): - character = EveManager.get_main_character(user) - logger.debug("Updating user %s discord nickname to %s" % (user, character.character_name)) + name = DiscordTasks.get_nickname(user) + logger.debug("Updating user %s discord nickname to %s" % (user, name)) try: - DiscordOAuthManager.update_nickname(user.discord.uid, character.character_name) + DiscordOAuthManager.update_nickname(user.discord.uid, name) except DiscordApiBackoff as bo: logger.info("Discord nickname update API back off for %s, " "retrying in %s seconds" % (user, bo.retry_after_seconds)) @@ -139,3 +135,11 @@ class DiscordTasks: @classmethod def disable(cls): DiscordUser.objects.all().delete() + + @staticmethod + def get_nickname(user): + return EveManager.get_main_character(user).character_name + + @staticmethod + def get_groups(user): + return [g.name for g in user.groups.all()] diff --git a/services/modules/discord/tests.py b/services/modules/discord/tests.py index 6f83ac4c..67dd7a1f 100644 --- a/services/modules/discord/tests.py +++ b/services/modules/discord/tests.py @@ -267,18 +267,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')