Use new endpoint for adding Discord users.

Closes #974
(cherry picked from commit 70c2a4a6e46ce34be1b981a60fd7efd065c235fb)
This commit is contained in:
Adarnof 2018-02-23 13:35:56 -05:00
parent 5962f0f29f
commit d503243e12
3 changed files with 43 additions and 27 deletions

View File

@ -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. Users have reported weird unauthorized errors we don't understand. So now we ask for full server admin.
It's almost fixed the problem. It's almost fixed the problem.
""" """
# kick members, manage roles, manage nicknames # kick members, manage roles, manage nicknames, create instant invite
# BOT_PERMISSIONS = 0x00000002 + 0x10000000 + 0x08000000 # BOT_PERMISSIONS = 0x00000002 + 0x10000000 + 0x08000000 + 0x00000001
BOT_PERMISSIONS = 0x00000008 BOT_PERMISSIONS = 0x00000008
# get user ID, accept invite # get user ID, accept invite
@ -185,23 +185,33 @@ class DiscordOAuthManager:
return token return token
@staticmethod @staticmethod
def add_user(code): def add_user(code, groups, nickname=None):
try: try:
token = DiscordOAuthManager._process_callback_code(code)['access_token'] token = DiscordOAuthManager._process_callback_code(code)['access_token']
logger.debug("Received token from OAuth") logger.debug("Received token from OAuth")
custom_headers = {'accept': 'application/json', 'authorization': 'Bearer ' + token} 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" path = DISCORD_URL + "/users/@me"
r = requests.get(path, headers=custom_headers) r = requests.get(path, headers=custom_headers)
logger.debug("Got status code %s after retrieving Discord profile" % r.status_code) logger.debug("Got status code %s after retrieving Discord profile" % r.status_code)
r.raise_for_status() r.raise_for_status()
user_id = r.json()['id'] 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) logger.info("Added Discord user ID %s to server." % user_id)
return user_id return user_id
except: except:

View File

@ -21,15 +21,16 @@ class DiscordTasks:
@classmethod @classmethod
def add_user(cls, user, code): 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: if user_id:
discord_user = DiscordUser() discord_user = DiscordUser()
discord_user.user = user discord_user.user = user
discord_user.uid = user_id discord_user.uid = user_id
discord_user.save() discord_user.save()
if settings.DISCORD_SYNC_NAMES:
cls.update_nickname.delay(user.pk)
cls.update_groups.delay(user.pk)
return True return True
return False return False
@ -64,12 +65,7 @@ class DiscordTasks:
user = User.objects.get(pk=pk) user = User.objects.get(pk=pk)
logger.debug("Updating discord groups for user %s" % user) logger.debug("Updating discord groups for user %s" % user)
if DiscordTasks.has_account(user): if DiscordTasks.has_account(user):
groups = [] groups = DiscordTasks.get_groups(user)
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')
logger.debug("Updating user %s discord groups to %s" % (user, groups)) logger.debug("Updating user %s discord groups to %s" % (user, groups))
try: try:
DiscordOAuthManager.update_groups(user.discord.uid, groups) DiscordOAuthManager.update_groups(user.discord.uid, groups)
@ -110,10 +106,10 @@ class DiscordTasks:
user = User.objects.get(pk=pk) user = User.objects.get(pk=pk)
logger.debug("Updating discord nickname for user %s" % user) logger.debug("Updating discord nickname for user %s" % user)
if DiscordTasks.has_account(user): if DiscordTasks.has_account(user):
character = EveManager.get_main_character(user) name = DiscordTasks.get_nickname(user)
logger.debug("Updating user %s discord nickname to %s" % (user, character.character_name)) logger.debug("Updating user %s discord nickname to %s" % (user, name))
try: try:
DiscordOAuthManager.update_nickname(user.discord.uid, character.character_name) DiscordOAuthManager.update_nickname(user.discord.uid, name)
except DiscordApiBackoff as bo: except DiscordApiBackoff as bo:
logger.info("Discord nickname update API back off for %s, " logger.info("Discord nickname update API back off for %s, "
"retrying in %s seconds" % (user, bo.retry_after_seconds)) "retrying in %s seconds" % (user, bo.retry_after_seconds))
@ -139,3 +135,11 @@ class DiscordTasks:
@classmethod @classmethod
def disable(cls): def disable(cls):
DiscordUser.objects.all().delete() 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()]

View File

@ -267,18 +267,20 @@ class DiscordManagerTestCase(TestCase):
headers = {'accept': 'application/json', 'authorization': 'Bearer accesstoken'} 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', m.register_uri('GET',
manager.DISCORD_URL + "/users/@me", manager.DISCORD_URL + "/users/@me",
request_headers=headers, request_headers=headers,
text=json.dumps({'id': "123456"})) 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 # Act
return_value = DiscordOAuthManager.add_user('abcdef') return_value = DiscordOAuthManager.add_user('abcdef', [])
# Assert # Assert
self.assertEqual(return_value, '123456') self.assertEqual(return_value, '123456')