aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Chris <[email protected]>2021-01-08 00:04:44 +0000
committerGravatar Chris <[email protected]>2021-01-08 00:04:44 +0000
commit8e54fab377c7f798259bbf217afc8c3f68c9fb0f (patch)
tree5dc703fb34b2c8fb2d2f0cd93ff6f8dbb5f7c5f0
parentMerge pull request #510 from hedythedev/hackstats (diff)
Get and renew V4 OAuth token
-rw-r--r--bot/constants.py5
-rw-r--r--bot/exts/evergreen/game.py53
2 files changed, 50 insertions, 8 deletions
diff --git a/bot/constants.py b/bot/constants.py
index f6da272e..e638dfa1 100644
--- a/bot/constants.py
+++ b/bot/constants.py
@@ -174,7 +174,7 @@ class Emojis:
christmas_tree = "\U0001F384"
check = "\u2611"
envelope = "\U0001F4E8"
- trashcan = "<:trashcan:637136429717389331>"
+ trashcan = "<:trashcan:796854840293589003>"
ok_hand = ":ok_hand:"
dice_1 = "<:dice_1:755891608859443290>"
@@ -257,7 +257,8 @@ class Tokens(NamedTuple):
youtube = environ.get("YOUTUBE_API_KEY")
tmdb = environ.get("TMDB_API_KEY")
nasa = environ.get("NASA_API_KEY")
- igdb = environ.get("IGDB_API_KEY")
+ igdb_client_id = environ.get("IGDB_CLIENT_ID")
+ igdb_client_secret = environ.get("IGDB_CLIENT_SECRET")
github = environ.get("GITHUB_TOKEN")
diff --git a/bot/exts/evergreen/game.py b/bot/exts/evergreen/game.py
index d0fd7a40..f5707a22 100644
--- a/bot/exts/evergreen/game.py
+++ b/bot/exts/evergreen/game.py
@@ -2,7 +2,8 @@ import difflib
import logging
import random
import re
-from datetime import datetime as dt
+from asyncio import sleep
+from datetime import datetime as dt, timedelta
from enum import IntEnum
from typing import Any, Dict, List, Optional, Tuple
@@ -17,10 +18,22 @@ from bot.utils.decorators import with_role
from bot.utils.pagination import ImagePaginator, LinePaginator
# Base URL of IGDB API
-BASE_URL = "https://api-v3.igdb.com"
+BASE_URL = "https://api.igdb.com/v4"
+
+CLIENT_ID = Tokens.igdb_client_id
+CLIENT_SECRET = Tokens.igdb_client_secret
+
+# URL to request API access token
+OAUTH_URL = "https://id.twitch.tv/oauth2/token"
+
+OAUTH_PARAMS = {
+ "client_id": CLIENT_ID,
+ "client_secret": CLIENT_SECRET,
+ "grant_type": "client_credentials"
+}
HEADERS = {
- "user-key": Tokens.igdb,
+ "Client-ID": CLIENT_ID,
"Accept": "application/json"
}
@@ -136,7 +149,32 @@ class Games(Cog):
self.genres: Dict[str, int] = {}
- self.refresh_genres_task.start()
+ self.bot.loop.create_task(self.renew_access_token())
+
+ # self.refresh_genres_task.start()
+
+ async def renew_access_token(self) -> None:
+ """Refeshes V4 access token 2 days before expiry."""
+ while True:
+ async with self.http_session.post(OAUTH_URL, params=OAUTH_PARAMS) as resp:
+ result = await resp.json()
+ if resp.status != 200:
+ logger.error(
+ "Failed to renew IGDB access token, unloading Games cog."
+ f"OAuth response message: {result['message']}"
+ )
+ self.bot.remove_cog('Games')
+ return
+
+ self.access_token = result["access_token"]
+
+ # Set next renewal to 2 days before expire time
+ next_renewal = result["expires_in"] - 60*60*24*2
+
+ time_delta = timedelta(seconds=next_renewal)
+ logger.info(f"Successfully renewed access token. Refreshing again in {time_delta}")
+
+ await sleep(next_renewal)
@tasks.loop(hours=24.0)
async def refresh_genres_task(self) -> None:
@@ -418,7 +456,10 @@ class Games(Cog):
def setup(bot: Bot) -> None:
"""Add/Load Games cog."""
# Check does IGDB API key exist, if not, log warning and don't load cog
- if not Tokens.igdb:
- logger.warning("No IGDB API key. Not loading Games cog.")
+ if not Tokens.igdb_client_id:
+ logger.warning("No IGDB client ID. Not loading Games cog.")
+ return
+ if not Tokens.igdb_client_secret:
+ logger.warning("No IGDB client secret. Not loading Games cog.")
return
bot.add_cog(Games(bot))