Skip to content

Commit e26d5b9

Browse files
authored
Added guilds_member and refresh token support
You can now use the guilds.member scope! I've also added support to collect refresh tokens and a method to get a new access token from the refresh token.
1 parent 98f97bd commit e26d5b9

File tree

1 file changed

+56
-35
lines changed

1 file changed

+56
-35
lines changed

discordoauth2.py

Lines changed: 56 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,42 @@ def __init__(self, access_token, bot_token):
66
self.bot_token = bot_token
77

88
def identify(self):
9-
try:
10-
headers = {
11-
'Authorization': f'Bearer {self.token}'
12-
}
13-
user_object = requests.get(url="https://discordapp.com/api/users/@me",headers=headers)
14-
return user_object.json()
15-
except(requests.exceptions.HTTPError) as error:
16-
return error
9+
headers = {
10+
'Authorization': f'Bearer {self.token}'
11+
}
12+
user_object = requests.get(url="https://discordapp.com/api/v9/users/@me",headers=headers)
13+
if user_object.status_code == 401: raise Exception(f"Scope wasn't granted in OAuth2.")
14+
if user_object.status_code == 429: raise Exception(f"You are being Rate Limited. Retry after: {user_object.json()['retry_after']}")
15+
return user_object.json()
1716

1817
def connections(self):
19-
try:
20-
headers = {
21-
'Authorization': f'Bearer {self.token}'
22-
}
23-
user_object = requests.get(url="https://discordapp.com/api/users/@me/connections",headers=headers)
24-
return user_object.json()
25-
except(requests.exceptions.HTTPError) as error:
26-
return error
18+
headers = {
19+
'Authorization': f'Bearer {self.token}'
20+
}
21+
user_object = requests.get(url="https://discordapp.com/api/v9/users/@me/connections",headers=headers)
22+
if user_object.status_code == 401: raise Exception(f"Scope wasn't granted in OAuth2.")
23+
if user_object.status_code == 429: raise Exception(f"You are being Rate Limited. Retry after: {user_object.json()['retry_after']}")
24+
return user_object.json()
2725

2826
def guilds(self):
29-
try:
30-
headers = {
31-
'Authorization': f'Bearer {self.token}'
32-
}
33-
user_object = requests.get(url="https://discordapp.com/api/users/@me/guilds",headers=headers)
34-
return user_object.json()
35-
except(requests.exceptions.HTTPError) as error:
36-
return error
27+
headers = {
28+
'Authorization': f'Bearer {self.token}'
29+
}
30+
user_object = requests.get(url="https://discordapp.com/api/v9/users/@me/guilds",headers=headers)
31+
if user_object.status_code == 401: raise Exception(f"Scope wasn't granted in OAuth2.")
32+
if user_object.status_code == 429: raise Exception(f"You are being Rate Limited. Retry after: {user_object.json()['retry_after']}")
33+
return user_object.json()
3734

38-
def join_guild(self, guild):
35+
def guilds_member(self, guild):
36+
headers = {
37+
'Authorization': f'Bearer {self.token}'
38+
}
39+
user_object = requests.get(url=f"https://discordapp.com/api/v9/users/@me/guilds/{guild}/member",headers=headers)
40+
if user_object.status_code == 401: raise Exception(f"Scope wasn't granted in OAuth2.")
41+
if user_object.status_code == 429: raise Exception(f"You are being Rate Limited. Retry after: {user_object.json()['retry_after']}")
42+
return user_object.json()
43+
44+
def guilds_join(self, guild):
3945
try:
4046
headers = {
4147
'Authorization': f'Bot {self.bot_token}',
@@ -44,29 +50,44 @@ def join_guild(self, guild):
4450
data = {
4551
'access_token': self.token
4652
}
47-
user_object = requests.put(url=f"https://discordapp.com/api/guilds/{guild}/members/{self.identify}", json=data, headers=headers)
48-
return user_object.text
53+
user_object = requests.put(url=f"https://discordapp.com/api/v9/guilds/{guild}/members/{self.identify()['id']}", json=data, headers=headers)
54+
if user_object.status_code == 401: raise Exception(f"Scope wasn't granted in OAuth2.")
55+
if user_object.status_code == 429: raise Exception(f"You are being Rate Limited. Retry after: {user_object.json()['retry_after']}")
56+
if user_object.status_code == 403: raise Exception(f"Provided token cannot invite people on Guild: {guild}. Guild ID may be incorrect.")
57+
return user_object
4958
except(requests.exceptions.HTTPError) as error:
5059
return error
5160

61+
class access_token():
62+
def __init__(self, response, token):
63+
self.access = token_instance(response["access_token"], token)
64+
self.expires = response["expires_in"]
65+
self.refresh_token = response["refresh_token"]
66+
5267
class discordOauth2():
53-
endpoint = 'https://discord.com/api/v8'
5468
def __init__(self, client, secret, redirect, token=None):
5569
self.client = client
5670
self.secret = secret
5771
self.redirect = redirect
5872
self.token = token
5973

6074
def exchange_code(self, token):
61-
data = {
75+
response = requests.post("https://discord.com/api/v9/oauth2/token", data={
6276
'client_id': self.client,
6377
'client_secret': self.secret,
6478
'grant_type': 'authorization_code',
6579
'code': token,
6680
'redirect_uri': self.redirect
67-
}
68-
headers = {
69-
'Content-Type': 'application/x-www-form-urlencoded'
70-
}
71-
data = requests.post(discordOauth2.endpoint+'/oauth2/token', data=data, headers=headers).json()
72-
return token_instance(data['access_token'], self.token)
81+
})
82+
if response.status_code == 429: raise Exception(f"You are being Rate Limited")
83+
return access_token(response.json(), self.token)
84+
85+
def refresh_token(self, refresh_token):
86+
response = requests.post("https://discord.com/api/v9/oauth2/token", data={
87+
'client_id': self.client,
88+
'client_secret': self.secret,
89+
'grant_type': 'refresh_token',
90+
'refresh_token': refresh_token
91+
})
92+
if response.status_code == 429: raise Exception(f"You are being Rate Limited")
93+
return access_token(response.json(), self.token)

0 commit comments

Comments
 (0)