From 17b4703748d6e0b8f92e8679b7b6799c20097d11 Mon Sep 17 00:00:00 2001 From: Will Da Silva Date: Mon, 5 Oct 2020 14:14:01 -0400 Subject: Replace OMDB with TMDB Closes: #136 --- bot/exts/evergreen/snakes/_snakes_cog.py | 94 +++++++++++++++----------------- 1 file changed, 43 insertions(+), 51 deletions(-) (limited to 'bot/exts/evergreen') diff --git a/bot/exts/evergreen/snakes/_snakes_cog.py b/bot/exts/evergreen/snakes/_snakes_cog.py index a846274b..9216c054 100644 --- a/bot/exts/evergreen/snakes/_snakes_cog.py +++ b/bot/exts/evergreen/snakes/_snakes_cog.py @@ -15,6 +15,7 @@ import aiohttp import async_timeout from PIL import Image, ImageDraw, ImageFont from discord import Colour, Embed, File, Member, Message, Reaction +from discord.errors import HTTPException from discord.ext.commands import BadArgument, Bot, Cog, CommandError, Context, bot_has_permissions, group from bot.constants import ERROR_REPLIES, Tokens @@ -739,71 +740,62 @@ class Snakes(Cog): @snakes_group.command(name='movie') async def movie_command(self, ctx: Context) -> None: """ - Gets a random snake-related movie from OMDB. + Gets a random snake-related movie from TMDB. Written by Samuel. Modified by gdude. + Modified by Will Da Silva. """ - url = "http://www.omdbapi.com/" - page = random.randint(1, 27) + page = random.randint(1, 16) - response = await self.bot.http_session.get( - url, - params={ - "s": "snake", - "page": page, - "type": "movie", - "apikey": Tokens.omdb - } - ) - data = await response.json() - movie = random.choice(data["Search"])["imdbID"] - - response = await self.bot.http_session.get( - url, - params={ - "i": movie, - "apikey": Tokens.omdb - } - ) - data = await response.json() - - embed = Embed( - title=data["Title"], - color=SNAKE_COLOR - ) - - del data["Response"], data["imdbID"], data["Title"] - - for key, value in data.items(): - if not value or value == "N/A" or key in ("Response", "imdbID", "Title", "Type"): - continue + async with ctx.typing(): + response = await self.bot.http_session.get( + "https://api.themoviedb.org/3/search/movie", + params={ + "query": "snake", + "page": page, + "language": "en-US", + "api_key": Tokens.tmdb, + } + ) + data = await response.json() + movie = random.choice(data["results"])["id"] + + response = await self.bot.http_session.get( + f"https://api.themoviedb.org/3/movie/{movie}", + params={ + "language": "en-US", + "api_key": Tokens.tmdb, + } + ) + data = await response.json() - if key == "Ratings": # [{'Source': 'Internet Movie Database', 'Value': '7.6/10'}] - rating = random.choice(value) + embed = Embed(title=data["title"], color=SNAKE_COLOR) - if rating["Source"] != "Internet Movie Database": - embed.add_field(name=f"Rating: {rating['Source']}", value=rating["Value"]) + if data["poster_path"] is not None: + embed.set_image(url=f"https://images.tmdb.org/t/p/original{data['poster_path']}?api_key={Tokens.tmdb}") - continue + embed.add_field(name="Overview", value=data["overview"]) - if key == "Poster": - embed.set_image(url=value) - continue + embed.add_field(name="Release Date", value=data["release_date"]) - elif key == "imdbRating": - key = "IMDB Rating" + if data["genres"]: + embed.add_field(name="Genres", value=", ".join([x["name"] for x in data["genres"]])) - elif key == "imdbVotes": - key = "IMDB Votes" + if data["vote_count"]: + embed.add_field(name="Rating", value=f"{data['vote_average']}/10 ({data['vote_count']} votes)", inline=True) - embed.add_field(name=key, value=value, inline=True) + if data["budget"] and data["revenue"]: + embed.add_field(name="Budget", value=data["budget"], inline=True) + embed.add_field(name="Revenue", value=data["revenue"], inline=True) - embed.set_footer(text="Data provided by the OMDB API") + embed.set_footer(text="Data provided by the TMDB") - await ctx.channel.send( - embed=embed - ) + try: + await ctx.channel.send(embed=embed) + except HTTPException as err: + await ctx.channel.send("An error occurred while fetching a snake-related movie!") + raise err from None @snakes_group.command(name='quiz') @locked() -- cgit v1.2.3 From 86e4b815e07c058b9af200540c5a6032a9d4f98a Mon Sep 17 00:00:00 2001 From: Will Da Silva Date: Thu, 8 Oct 2020 10:37:37 -0400 Subject: Fix TMDB leak --- bot/exts/evergreen/snakes/_snakes_cog.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'bot/exts/evergreen') diff --git a/bot/exts/evergreen/snakes/_snakes_cog.py b/bot/exts/evergreen/snakes/_snakes_cog.py index 9216c054..5e7a1169 100644 --- a/bot/exts/evergreen/snakes/_snakes_cog.py +++ b/bot/exts/evergreen/snakes/_snakes_cog.py @@ -773,7 +773,7 @@ class Snakes(Cog): embed = Embed(title=data["title"], color=SNAKE_COLOR) if data["poster_path"] is not None: - embed.set_image(url=f"https://images.tmdb.org/t/p/original{data['poster_path']}?api_key={Tokens.tmdb}") + embed.set_image(url=f"https://images.tmdb.org/t/p/original{data['poster_path']}") embed.add_field(name="Overview", value=data["overview"]) -- cgit v1.2.3 From 1a1ebf1a53542259ac202d4f4a4ba25d949a2f25 Mon Sep 17 00:00:00 2001 From: Will Da Silva Date: Tue, 13 Oct 2020 15:06:40 -0400 Subject: Set the number of movie pages fetched on first request --- bot/exts/evergreen/snakes/_snakes_cog.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'bot/exts/evergreen') diff --git a/bot/exts/evergreen/snakes/_snakes_cog.py b/bot/exts/evergreen/snakes/_snakes_cog.py index 5e7a1169..a7740b94 100644 --- a/bot/exts/evergreen/snakes/_snakes_cog.py +++ b/bot/exts/evergreen/snakes/_snakes_cog.py @@ -152,6 +152,7 @@ class Snakes(Cog): self.snake_idioms = utils.get_resource("snake_idioms") self.snake_quizzes = utils.get_resource("snake_quiz") self.snake_facts = utils.get_resource("snake_facts") + self.num_movie_pages = None # region: Helper methods @staticmethod @@ -746,7 +747,8 @@ class Snakes(Cog): Modified by gdude. Modified by Will Da Silva. """ - page = random.randint(1, 16) + # Initially 8 pages are fetched. The actual number of pages is set after the first request. + page = random.randint(1, self.num_movie_pages or 8) async with ctx.typing(): response = await self.bot.http_session.get( @@ -759,6 +761,8 @@ class Snakes(Cog): } ) data = await response.json() + if self.num_movie_pages is None: + self.num_movie_pages = data["total_pages"] movie = random.choice(data["results"])["id"] response = await self.bot.http_session.get( -- cgit v1.2.3 From 60277653cdfd66f9721667544b379b793f87b1a6 Mon Sep 17 00:00:00 2001 From: Will Da Silva Date: Fri, 16 Oct 2020 11:05:22 -0400 Subject: Comply with TMDB ToS --- bot/exts/evergreen/snakes/_snakes_cog.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'bot/exts/evergreen') diff --git a/bot/exts/evergreen/snakes/_snakes_cog.py b/bot/exts/evergreen/snakes/_snakes_cog.py index a7740b94..75234e7d 100644 --- a/bot/exts/evergreen/snakes/_snakes_cog.py +++ b/bot/exts/evergreen/snakes/_snakes_cog.py @@ -793,7 +793,8 @@ class Snakes(Cog): embed.add_field(name="Budget", value=data["budget"], inline=True) embed.add_field(name="Revenue", value=data["revenue"], inline=True) - embed.set_footer(text="Data provided by the TMDB") + embed.set_footer(text="This product uses the TMDb API but is not endorsed or certified by TMDb.") + embed.set_thumbnail(url="https://i.imgur.com/LtFtC8H.png") try: await ctx.channel.send(embed=embed) -- cgit v1.2.3 From 6bf4974f1975600c2943d8eae46fe24bf1f6a69e Mon Sep 17 00:00:00 2001 From: Will Da Silva Date: Fri, 16 Oct 2020 11:06:18 -0400 Subject: Fix empty field in snake movie embed --- bot/exts/evergreen/snakes/_snakes_cog.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'bot/exts/evergreen') diff --git a/bot/exts/evergreen/snakes/_snakes_cog.py b/bot/exts/evergreen/snakes/_snakes_cog.py index 75234e7d..0b3a8fe5 100644 --- a/bot/exts/evergreen/snakes/_snakes_cog.py +++ b/bot/exts/evergreen/snakes/_snakes_cog.py @@ -779,9 +779,11 @@ class Snakes(Cog): if data["poster_path"] is not None: embed.set_image(url=f"https://images.tmdb.org/t/p/original{data['poster_path']}") - embed.add_field(name="Overview", value=data["overview"]) + if data["overview"]: + embed.add_field(name="Overview", value=data["overview"]) - embed.add_field(name="Release Date", value=data["release_date"]) + if data["release_date"]: + embed.add_field(name="Release Date", value=data["release_date"]) if data["genres"]: embed.add_field(name="Genres", value=", ".join([x["name"] for x in data["genres"]])) -- cgit v1.2.3 From 4d2f89991432639431968d352bde2cd747b9432c Mon Sep 17 00:00:00 2001 From: Rohan Date: Wed, 2 Dec 2020 21:58:09 +0530 Subject: Modify error handler check for locally handled errors. Error handler now checks if the error has the attribute "handled" for locally handled errors. --- bot/exts/evergreen/error_handler.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'bot/exts/evergreen') diff --git a/bot/exts/evergreen/error_handler.py b/bot/exts/evergreen/error_handler.py index 6e518435..b502dd4e 100644 --- a/bot/exts/evergreen/error_handler.py +++ b/bot/exts/evergreen/error_handler.py @@ -42,8 +42,8 @@ class CommandErrorHandler(commands.Cog): @commands.Cog.listener() async def on_command_error(self, ctx: commands.Context, error: commands.CommandError) -> None: """Activates when a command opens an error.""" - if hasattr(ctx.command, 'on_error'): - logging.debug("A command error occured but the command had it's own error handler.") + if hasattr(error, 'handled'): + logging.debug(f"Command {ctx.command} had its error already handled locally; ignoring.") return error = getattr(error, 'original', error) -- cgit v1.2.3 From cd24f9b4e70ebe654fa771238fca7e207e8cb0de Mon Sep 17 00:00:00 2001 From: Rohan Date: Fri, 4 Dec 2020 20:33:03 +0530 Subject: Check value of handled attribute on error in global error handler. --- bot/exts/evergreen/error_handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'bot/exts/evergreen') diff --git a/bot/exts/evergreen/error_handler.py b/bot/exts/evergreen/error_handler.py index b502dd4e..99af1519 100644 --- a/bot/exts/evergreen/error_handler.py +++ b/bot/exts/evergreen/error_handler.py @@ -42,7 +42,7 @@ class CommandErrorHandler(commands.Cog): @commands.Cog.listener() async def on_command_error(self, ctx: commands.Context, error: commands.CommandError) -> None: """Activates when a command opens an error.""" - if hasattr(error, 'handled'): + if getattr(error, 'handled', False): logging.debug(f"Command {ctx.command} had its error already handled locally; ignoring.") return -- cgit v1.2.3 From cd20acfee1e36351e561ba7c410dc8fac7725572 Mon Sep 17 00:00:00 2001 From: Rohan Date: Mon, 7 Dec 2020 01:16:29 +0530 Subject: Modify snakes_cog error handler. local error handler no longer checks for BadArgument error and the attribute handled will be set to True on the error if an OSError occurs. --- bot/exts/evergreen/snakes/_snakes_cog.py | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) (limited to 'bot/exts/evergreen') diff --git a/bot/exts/evergreen/snakes/_snakes_cog.py b/bot/exts/evergreen/snakes/_snakes_cog.py index 70bb0e73..2e88c146 100644 --- a/bot/exts/evergreen/snakes/_snakes_cog.py +++ b/bot/exts/evergreen/snakes/_snakes_cog.py @@ -15,7 +15,7 @@ import aiohttp import async_timeout from PIL import Image, ImageDraw, ImageFont from discord import Colour, Embed, File, Member, Message, Reaction -from discord.ext.commands import BadArgument, Bot, Cog, CommandError, Context, bot_has_permissions, group +from discord.ext.commands import Bot, Cog, CommandError, Context, bot_has_permissions, group from bot.constants import ERROR_REPLIES, Tokens from bot.exts.evergreen.snakes import _utils as utils @@ -1131,21 +1131,11 @@ class Snakes(Cog): @video_command.error async def command_error(self, ctx: Context, error: CommandError) -> None: """Local error handler for the Snake Cog.""" - embed = Embed() - embed.colour = Colour.red() - - if isinstance(error, BadArgument): - embed.description = str(error) - embed.title = random.choice(ERROR_REPLIES) - - elif isinstance(error, OSError): + if isinstance(error, OSError): + error.handled = True + embed = Embed() + embed.colour = Colour.red() log.error(f"snake_card encountered an OSError: {error} ({error.original})") embed.description = "Could not generate the snake card! Please try again." embed.title = random.choice(ERROR_REPLIES) - - else: - log.error(f"Unhandled tag command error: {error} ({error.original})") - return - - await ctx.send(embed=embed) - # endregion + await ctx.send(embed=embed) -- cgit v1.2.3 From 40fce53d6c01f0e753d70cb4b265d88f1107e104 Mon Sep 17 00:00:00 2001 From: Rohan Date: Wed, 9 Dec 2020 23:13:39 +0530 Subject: Check if error.original is an instance of OSError. Also, remove error handler for get_command and video_command. --- bot/exts/evergreen/snakes/_snakes_cog.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'bot/exts/evergreen') diff --git a/bot/exts/evergreen/snakes/_snakes_cog.py b/bot/exts/evergreen/snakes/_snakes_cog.py index 2e88c146..4fa4dcd1 100644 --- a/bot/exts/evergreen/snakes/_snakes_cog.py +++ b/bot/exts/evergreen/snakes/_snakes_cog.py @@ -1126,16 +1126,15 @@ class Snakes(Cog): # endregion # region: Error handlers - @get_command.error @card_command.error - @video_command.error async def command_error(self, ctx: Context, error: CommandError) -> None: """Local error handler for the Snake Cog.""" - if isinstance(error, OSError): + original_error = getattr(error, "original", None) + if isinstance(original_error, OSError): error.handled = True embed = Embed() embed.colour = Colour.red() - log.error(f"snake_card encountered an OSError: {error} ({error.original})") + log.error(f"snake_card encountered an OSError: {error} ({original_error})") embed.description = "Could not generate the snake card! Please try again." embed.title = random.choice(ERROR_REPLIES) await ctx.send(embed=embed) -- cgit v1.2.3 From 2e4e50216508dd89314b093872f2d5477f94aa10 Mon Sep 17 00:00:00 2001 From: William Da Silva Date: Tue, 29 Dec 2020 00:24:10 -0500 Subject: Remove unused import --- bot/exts/evergreen/snakes/_snakes_cog.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'bot/exts/evergreen') diff --git a/bot/exts/evergreen/snakes/_snakes_cog.py b/bot/exts/evergreen/snakes/_snakes_cog.py index f18014a8..d5e4f206 100644 --- a/bot/exts/evergreen/snakes/_snakes_cog.py +++ b/bot/exts/evergreen/snakes/_snakes_cog.py @@ -16,7 +16,7 @@ import async_timeout from PIL import Image, ImageDraw, ImageFont from discord import Colour, Embed, File, Member, Message, Reaction from discord.errors import HTTPException -from discord.ext.commands import BadArgument, Bot, Cog, CommandError, Context, bot_has_permissions, group +from discord.ext.commands import Bot, Cog, CommandError, Context, bot_has_permissions, group from bot.constants import ERROR_REPLIES, Tokens from bot.exts.evergreen.snakes import _utils as utils -- cgit v1.2.3 From 8e54fab377c7f798259bbf217afc8c3f68c9fb0f Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 8 Jan 2021 00:04:44 +0000 Subject: Get and renew V4 OAuth token --- bot/constants.py | 5 +++-- bot/exts/evergreen/game.py | 53 ++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 50 insertions(+), 8 deletions(-) (limited to 'bot/exts/evergreen') 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)) -- cgit v1.2.3 From 0fcfb1459c258bae4bf2895a16559210e44c675c Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 8 Jan 2021 00:09:16 +0000 Subject: Un-comment out task start --- bot/exts/evergreen/game.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'bot/exts/evergreen') diff --git a/bot/exts/evergreen/game.py b/bot/exts/evergreen/game.py index f5707a22..fe5fc612 100644 --- a/bot/exts/evergreen/game.py +++ b/bot/exts/evergreen/game.py @@ -151,7 +151,7 @@ class Games(Cog): self.bot.loop.create_task(self.renew_access_token()) - # self.refresh_genres_task.start() + self.refresh_genres_task.start() async def renew_access_token(self) -> None: """Refeshes V4 access token 2 days before expiry.""" -- cgit v1.2.3 From 542cdc023629513c6d280e2bf96d5d554baa78d9 Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 8 Jan 2021 16:43:39 +0000 Subject: Move renewal window to a const --- bot/exts/evergreen/game.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'bot/exts/evergreen') diff --git a/bot/exts/evergreen/game.py b/bot/exts/evergreen/game.py index fe5fc612..be4fcbc9 100644 --- a/bot/exts/evergreen/game.py +++ b/bot/exts/evergreen/game.py @@ -23,6 +23,9 @@ BASE_URL = "https://api.igdb.com/v4" CLIENT_ID = Tokens.igdb_client_id CLIENT_SECRET = Tokens.igdb_client_secret +# The number of seconds before expiry that we attempt to re-fetch a new access token +ACCESS_TOKEN_RENEWAL_WINDOW = 60*60*24*2 + # URL to request API access token OAUTH_URL = "https://id.twitch.tv/oauth2/token" @@ -168,8 +171,8 @@ class Games(Cog): self.access_token = result["access_token"] - # Set next renewal to 2 days before expire time - next_renewal = result["expires_in"] - 60*60*24*2 + # Attempt to renew before the token expires + next_renewal = result["expires_in"] - ACCESS_TOKEN_RENEWAL_WINDOW time_delta = timedelta(seconds=next_renewal) logger.info(f"Successfully renewed access token. Refreshing again in {time_delta}") -- cgit v1.2.3 From 4d68fb6e1be9fd7d1287e2f1650f88b1e447f69d Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 8 Jan 2021 18:40:50 +0000 Subject: Use current token if we can't get a new one --- bot/exts/evergreen/game.py | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) (limited to 'bot/exts/evergreen') diff --git a/bot/exts/evergreen/game.py b/bot/exts/evergreen/game.py index be4fcbc9..2abd7555 100644 --- a/bot/exts/evergreen/game.py +++ b/bot/exts/evergreen/game.py @@ -35,7 +35,7 @@ OAUTH_PARAMS = { "grant_type": "client_credentials" } -HEADERS = { +BASE_HEADERS = { "Client-ID": CLIENT_ID, "Accept": "application/json" } @@ -151,25 +151,34 @@ class Games(Cog): self.http_session: ClientSession = bot.http_session self.genres: Dict[str, int] = {} + self.headers = BASE_HEADERS 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.""" + """Refeshes V4 access token a number of seconds before expiry. See `ACCESS_TOKEN_RENEWAL_WINDOW`.""" 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') + # If there is a valid access token continue to use that, + # otherwise unload cog. + if "access_token" in self.headers: + time_delta = timedelta(seconds=ACCESS_TOKEN_RENEWAL_WINDOW) + logger.error( + "Failed to renew IGDB access token. " + f"Current token will last for {time_delta} " + f"OAuth response message: {result['message']}" + ) + else: + logger.warning("Invalid OAuth credentials. Unloading Games cog.") + self.bot.remove_cog('Games') + return - self.access_token = result["access_token"] + self.headers["access_token"] = result["access_token"] # Attempt to renew before the token expires next_renewal = result["expires_in"] - ACCESS_TOKEN_RENEWAL_WINDOW @@ -197,7 +206,7 @@ class Games(Cog): async def _get_genres(self) -> None: """Create genres variable for games command.""" body = "fields name; limit 100;" - async with self.http_session.get(f"{BASE_URL}/genres", data=body, headers=HEADERS) as resp: + async with self.http_session.get(f"{BASE_URL}/genres", data=body, headers=self.headers) as resp: result = await resp.json() genres = {genre["name"].capitalize(): genre["id"] for genre in result} @@ -347,7 +356,7 @@ class Games(Cog): body = GAMES_LIST_BODY.format(**params) # Do request to IGDB API, create headers, URL, define body, return result - async with self.http_session.get(url=f"{BASE_URL}/games", data=body, headers=HEADERS) as resp: + async with self.http_session.get(url=f"{BASE_URL}/games", data=body, headers=self.headers) as resp: return await resp.json() async def create_page(self, data: Dict[str, Any]) -> Tuple[str, str]: @@ -389,7 +398,7 @@ class Games(Cog): # Define request body of IGDB API request and do request body = SEARCH_BODY.format(**{"term": search_term}) - async with self.http_session.get(url=f"{BASE_URL}/games", data=body, headers=HEADERS) as resp: + async with self.http_session.get(url=f"{BASE_URL}/games", data=body, headers=self.headers) as resp: data = await resp.json() # Loop over games, format them to good format, make line and append this to total lines @@ -418,7 +427,7 @@ class Games(Cog): "offset": offset }) - async with self.http_session.get(url=f"{BASE_URL}/companies", data=body, headers=HEADERS) as resp: + async with self.http_session.get(url=f"{BASE_URL}/companies", data=body, headers=self.headers) as resp: return await resp.json() async def create_company_page(self, data: Dict[str, Any]) -> Tuple[str, str]: -- cgit v1.2.3 From 3ba700e7b7c211d69193d3ba3d3e02927b448441 Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 8 Jan 2021 20:44:43 +0000 Subject: Switch to post requests and start task at right time. --- bot/exts/evergreen/game.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) (limited to 'bot/exts/evergreen') diff --git a/bot/exts/evergreen/game.py b/bot/exts/evergreen/game.py index 2abd7555..680724c2 100644 --- a/bot/exts/evergreen/game.py +++ b/bot/exts/evergreen/game.py @@ -155,8 +155,6 @@ class Games(Cog): 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 a number of seconds before expiry. See `ACCESS_TOKEN_RENEWAL_WINDOW`.""" while True: @@ -165,7 +163,7 @@ class Games(Cog): if resp.status != 200: # If there is a valid access token continue to use that, # otherwise unload cog. - if "access_token" in self.headers: + if "Authorization" in self.headers: time_delta = timedelta(seconds=ACCESS_TOKEN_RENEWAL_WINDOW) logger.error( "Failed to renew IGDB access token. " @@ -178,7 +176,7 @@ class Games(Cog): return - self.headers["access_token"] = result["access_token"] + self.headers["Authorization"] = f"Bearer {result['access_token']}" # Attempt to renew before the token expires next_renewal = result["expires_in"] - ACCESS_TOKEN_RENEWAL_WINDOW @@ -186,6 +184,10 @@ class Games(Cog): time_delta = timedelta(seconds=next_renewal) logger.info(f"Successfully renewed access token. Refreshing again in {time_delta}") + # This will be true the first time this loop runs. + # Since we now have an access token, its safe to start this task. + if self.genres == {}: + self.refresh_genres_task.start() await sleep(next_renewal) @tasks.loop(hours=24.0) @@ -206,9 +208,8 @@ class Games(Cog): async def _get_genres(self) -> None: """Create genres variable for games command.""" body = "fields name; limit 100;" - async with self.http_session.get(f"{BASE_URL}/genres", data=body, headers=self.headers) as resp: + async with self.http_session.post(f"{BASE_URL}/genres", data=body, headers=self.headers) as resp: result = await resp.json() - genres = {genre["name"].capitalize(): genre["id"] for genre in result} # Replace complex names with names from ALIASES @@ -356,7 +357,7 @@ class Games(Cog): body = GAMES_LIST_BODY.format(**params) # Do request to IGDB API, create headers, URL, define body, return result - async with self.http_session.get(url=f"{BASE_URL}/games", data=body, headers=self.headers) as resp: + async with self.http_session.post(url=f"{BASE_URL}/games", data=body, headers=self.headers) as resp: return await resp.json() async def create_page(self, data: Dict[str, Any]) -> Tuple[str, str]: @@ -398,7 +399,7 @@ class Games(Cog): # Define request body of IGDB API request and do request body = SEARCH_BODY.format(**{"term": search_term}) - async with self.http_session.get(url=f"{BASE_URL}/games", data=body, headers=self.headers) as resp: + async with self.http_session.post(url=f"{BASE_URL}/games", data=body, headers=self.headers) as resp: data = await resp.json() # Loop over games, format them to good format, make line and append this to total lines @@ -427,7 +428,7 @@ class Games(Cog): "offset": offset }) - async with self.http_session.get(url=f"{BASE_URL}/companies", data=body, headers=self.headers) as resp: + async with self.http_session.post(url=f"{BASE_URL}/companies", data=body, headers=self.headers) as resp: return await resp.json() async def create_company_page(self, data: Dict[str, Any]) -> Tuple[str, str]: -- cgit v1.2.3 From 92f1ee13d71fd4f72edc8e24488115a2294421f8 Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 8 Jan 2021 20:57:57 +0000 Subject: Add OAuth response to warning. --- bot/exts/evergreen/game.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'bot/exts/evergreen') diff --git a/bot/exts/evergreen/game.py b/bot/exts/evergreen/game.py index 680724c2..d37be0e2 100644 --- a/bot/exts/evergreen/game.py +++ b/bot/exts/evergreen/game.py @@ -171,7 +171,10 @@ class Games(Cog): f"OAuth response message: {result['message']}" ) else: - logger.warning("Invalid OAuth credentials. Unloading Games cog.") + logger.warning( + "Invalid OAuth credentials. Unloading Games cog. " + f"OAuth response message: {result['message']}" + ) self.bot.remove_cog('Games') return -- cgit v1.2.3 From 03cb65d7b08210f43fe991196546fb1d61c7dca4 Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 9 Jan 2021 20:05:58 +0000 Subject: Actually use 256 colours --- bot/exts/evergreen/8bitify.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'bot/exts/evergreen') diff --git a/bot/exts/evergreen/8bitify.py b/bot/exts/evergreen/8bitify.py index c048d9bf..54e68f80 100644 --- a/bot/exts/evergreen/8bitify.py +++ b/bot/exts/evergreen/8bitify.py @@ -19,7 +19,7 @@ class EightBitify(commands.Cog): @staticmethod def quantize(image: Image) -> Image: """Reduces colour palette to 256 colours.""" - return image.quantize(colors=32) + return image.quantize() @commands.command(name="8bitify") async def eightbit_command(self, ctx: commands.Context) -> None: -- cgit v1.2.3 From c654f693eda0db6b12e8bafa6ef0354ca4f43245 Mon Sep 17 00:00:00 2001 From: aruna2019 Date: Thu, 21 Jan 2021 01:13:52 +0530 Subject: Fixed battleship reading uppercases incorrectly. --- bot/exts/evergreen/battleship.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'bot/exts/evergreen') diff --git a/bot/exts/evergreen/battleship.py b/bot/exts/evergreen/battleship.py index 9bc374e6..fa3fb35c 100644 --- a/bot/exts/evergreen/battleship.py +++ b/bot/exts/evergreen/battleship.py @@ -140,7 +140,7 @@ class Game: @staticmethod def get_square(grid: Grid, square: str) -> Square: """Grabs a square from a grid with an inputted key.""" - index = ord(square[0]) - ord("A") + index = ord(square[0].upper()) - ord("A") number = int(square[1:]) return grid[number-1][index] # -1 since lists are indexed from 0 -- cgit v1.2.3