Add the refresh button
Some checks failed
Build and Publish / build_and_publish (push) Has been cancelled

This commit is contained in:
Nexus 2024-07-05 00:34:14 +01:00
parent a8f5ae145a
commit dbd06bfe38

View file

@ -2,6 +2,8 @@
This module is only meant to be loaded during election times.
"""
import asyncio
from calendar import c
from contextlib import asynccontextmanager
import logging
import random
import datetime
@ -148,18 +150,11 @@ class ElectionCog(commands.Cog):
# ]
return results
@commands.slash_command(name="election")
async def get_election_results(self, ctx: discord.ApplicationContext):
"""Gets the current election results"""
await ctx.defer()
async def _get_embed(self) -> discord.Embed | None:
async with httpx.AsyncClient(headers=self.HEADERS) as client:
response = await client.get(self.SOURCE, follow_redirects=True)
if response.status_code != 200:
return await ctx.respond(
"Sorry, I can't do that right now (HTTP %d while fetching results from BBC)" % response.status_code
)
# noinspection PyTypeChecker
raise RuntimeError(f"HTTP {response.status_code} while fetching results from BBC")
soup = await asyncio.to_thread(BeautifulSoup, response.text, "html.parser")
results = await self.bot.loop.run_in_executor(None, self.process_soup, soup)
if results:
@ -185,9 +180,33 @@ class ElectionCog(commands.Cog):
top_party = list(sorted(colour_scores.keys(), key=lambda k: colour_scores[k], reverse=True))[0]
embed.colour = discord.Colour(results[top_party][2])
embed.description = "\n".join(description_parts)
return await ctx.respond(embed=embed)
else:
return await ctx.respond("Unable to get election results at this time.")
return embed
@commands.slash_command(name="election")
async def get_election_results(self, ctx: discord.ApplicationContext):
"""Gets the current election results"""
class RefreshView(discord.ui.View):
@discord.ui.button(label="Refresh", style=discord.ButtonStyle.primary, emoji="\U0001f501")
async def refresh(_self, _btn, interaction):
await interaction.response.defer(invisible=True)
try:
embed = await self._get_embed()
except Exception as e:
self.log.exception("Failed to get election results.")
return await interaction.followup.send(f"Sorry, I cannot contact the BBC at this time: {e}")
if embed is None:
return await interaction.followup.send("Sorry, I could not find any election results.")
await interaction.edit_original_response(embed=embed)
await ctx.defer()
try:
embed = await self._get_embed()
except Exception as e:
self.log.exception("Failed to get election results.")
return await ctx.respond(f"Sorry, I cannot contact the BBC at this time: {e}")
if embed is None:
return await ctx.respond("Sorry, I could not find any election results.")
await ctx.respond(embed=embed, view=RefreshView())
def setup(bot):