mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2025-07-12 05:50:16 +02:00
parent
99b136b824
commit
70c2a4a6e4
@ -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.
|
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
|
||||||
@ -183,23 +183,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:
|
||||||
|
@ -19,15 +19,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
|
||||||
|
|
||||||
@ -62,9 +63,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 = [user.profile.state.name]
|
groups = DiscordTasks.get_groups(user)
|
||||||
for group in user.groups.all():
|
|
||||||
groups.append(str(group.name))
|
|
||||||
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)
|
||||||
@ -142,3 +141,7 @@ class DiscordTasks:
|
|||||||
def get_nickname(user):
|
def get_nickname(user):
|
||||||
from .auth_hooks import DiscordService
|
from .auth_hooks import DiscordService
|
||||||
return NameFormatter(DiscordService(), user).format_name()
|
return NameFormatter(DiscordService(), user).format_name()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_groups(user):
|
||||||
|
return [g.name for g in user.groups.all()] + [user.profile.state.name]
|
||||||
|
@ -245,18 +245,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