mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2025-07-12 22:10:16 +02:00
Use new endpoint for adding Discord users.
Closes #974 (cherry picked from commit 70c2a4a6e46ce34be1b981a60fd7efd065c235fb)
This commit is contained in:
parent
5962f0f29f
commit
d503243e12
@ -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:
|
||||||
|
@ -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()]
|
||||||
|
@ -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')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user