mirror of
https://github.com/allthingslinux/tux.git
synced 2024-10-02 16:43:12 +00:00
refactor(timezones.py): replace json file with hardcoded timezones for better performance
feat(timezones.py): add support for reactionmenu to improve user interaction style(timezones.py): improve code readability by removing unnecessary comments and adding more descriptive variable names
This commit is contained in:
parent
94abe651d2
commit
bcf4ef1551
1 changed files with 115 additions and 43 deletions
|
@ -1,67 +1,139 @@
|
||||||
import json
|
from datetime import UTC, datetime
|
||||||
from datetime import datetime
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
|
import discord
|
||||||
import pytz
|
import pytz
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
|
from reactionmenu import Page, ViewButton, ViewMenu, ViewSelect
|
||||||
|
|
||||||
from tux.utils.embeds import EmbedCreator
|
timezones = {
|
||||||
|
"North America": [
|
||||||
|
("🇺🇸", "US", "Pacific/Honolulu", "HST", -10),
|
||||||
|
("🇺🇸", "US", "America/Anchorage", "AKST", -9),
|
||||||
|
("🇺🇸", "US", "America/Los_Angeles", "PST", -8),
|
||||||
|
("🇺🇸", "US", "America/Denver", "MST", -7),
|
||||||
|
("🇺🇸", "US", "America/Chicago", "CST", -6),
|
||||||
|
("🇺🇸", "US", "America/New_York", "EST", -5),
|
||||||
|
("🇲🇽", "MX", "America/Mexico_City", "CST", -6),
|
||||||
|
("🇨🇦", "CA", "America/Toronto", "EST", -5),
|
||||||
|
("🇨🇦", "CA", "America/Vancouver", "PST", -8),
|
||||||
|
],
|
||||||
|
"South America": [
|
||||||
|
("🇧🇷", "BR", "America/Sao_Paulo", "BRT", -3),
|
||||||
|
("🇦🇷", "AR", "America/Argentina/Buenos_Aires", "ART", -3),
|
||||||
|
("🇨🇱", "CL", "America/Santiago", "CLT", -3),
|
||||||
|
("🇵🇪", "PE", "America/Lima", "PET", -5),
|
||||||
|
("🇨🇴", "CO", "America/Bogota", "COT", -5),
|
||||||
|
("🇻🇪", "VE", "America/Caracas", "VET", -4),
|
||||||
|
("🇧🇴", "BO", "America/La_Paz", "BOT", -4),
|
||||||
|
("🇵🇾", "PY", "America/Asuncion", "PYT", -4),
|
||||||
|
("🇺🇾", "UY", "America/Montevideo", "UYT", -3),
|
||||||
|
],
|
||||||
|
"Africa": [
|
||||||
|
("🇬🇭", "GH", "Africa/Accra", "GMT", 0),
|
||||||
|
("🇳🇬", "NG", "Africa/Lagos", "WAT", 1),
|
||||||
|
("🇿🇦", "ZA", "Africa/Johannesburg", "SAST", 2),
|
||||||
|
("🇪🇬", "EG", "Africa/Cairo", "EET", 2),
|
||||||
|
("🇰🇪", "KE", "Africa/Nairobi", "EAT", 3),
|
||||||
|
("🇲🇦", "MA", "Africa/Casablanca", "WET", 0),
|
||||||
|
("🇹🇿", "TZ", "Africa/Dar_es_Salaam", "EAT", 3),
|
||||||
|
("🇩🇿", "DZ", "Africa/Algiers", "CET", 1),
|
||||||
|
("🇳🇦", "NA", "Africa/Windhoek", "CAT", 2),
|
||||||
|
],
|
||||||
|
"Europe": [
|
||||||
|
("🇬🇧", "GB", "Europe/London", "GMT", 0),
|
||||||
|
("🇩🇪", "DE", "Europe/Berlin", "CET", 1),
|
||||||
|
("🇫🇷", "FR", "Europe/Paris", "CET", 1),
|
||||||
|
("🇮🇹", "IT", "Europe/Rome", "CET", 1),
|
||||||
|
("🇪🇸", "ES", "Europe/Madrid", "CET", 1),
|
||||||
|
("🇳🇱", "NL", "Europe/Amsterdam", "CET", 1),
|
||||||
|
("🇧🇪", "BE", "Europe/Brussels", "CET", 1),
|
||||||
|
("🇷🇺", "RU", "Europe/Moscow", "MSK", 3),
|
||||||
|
("🇬🇷", "GR", "Europe/Athens", "EET", 2),
|
||||||
|
],
|
||||||
|
"Asia": [
|
||||||
|
("🇦🇪", "AE", "Asia/Dubai", "GST", 4),
|
||||||
|
("🇮🇳", "IN", "Asia/Kolkata", "IST", 5.5),
|
||||||
|
("🇧🇩", "BD", "Asia/Dhaka", "BST", 6),
|
||||||
|
("🇲🇲", "MM", "Asia/Yangon", "MMT", 6.5),
|
||||||
|
("🇹🇭", "TH", "Asia/Bangkok", "ICT", 7),
|
||||||
|
("🇻🇳", "VN", "Asia/Ho_Chi_Minh", "ICT", 7),
|
||||||
|
("🇨🇳", "CN", "Asia/Shanghai", "CST", 8),
|
||||||
|
("🇭🇰", "HK", "Asia/Hong_Kong", "HKT", 8),
|
||||||
|
("🇯🇵", "JP", "Asia/Tokyo", "JST", 9),
|
||||||
|
],
|
||||||
|
"Australia/Oceania": [
|
||||||
|
("🇦🇺", "AU", "Australia/Perth", "AWST", 8),
|
||||||
|
("🇦🇺", "AU", "Australia/Sydney", "AEST", 10),
|
||||||
|
("🇫🇯", "FJ", "Pacific/Fiji", "FJT", 12),
|
||||||
|
("🇳🇿", "NZ", "Pacific/Auckland", "NZDT", 13),
|
||||||
|
("🇵🇬", "PG", "Pacific/Port_Moresby", "PGT", 10),
|
||||||
|
("🇼🇸", "WS", "Pacific/Apia", "WSST", 13),
|
||||||
|
("🇸🇧", "SB", "Pacific/Guadalcanal", "SBT", 11),
|
||||||
|
("🇻🇺", "VU", "Pacific/Efate", "VUT", 11),
|
||||||
|
("🇵🇫", "PF", "Pacific/Tahiti", "THAT", -10),
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
continent_emojis = {
|
||||||
|
"North America": "🌎",
|
||||||
|
"South America": "🌎",
|
||||||
|
"Africa": "🌍",
|
||||||
|
"Europe": "🌍",
|
||||||
|
"Asia": "🌏",
|
||||||
|
"Australia/Oceania": "🌏",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class Timezones(commands.Cog):
|
class Timezones(commands.Cog):
|
||||||
def __init__(self, bot: commands.Bot) -> None:
|
def __init__(self, bot: commands.Bot) -> None:
|
||||||
self.bot = bot
|
self.bot = bot
|
||||||
|
|
||||||
def loadjson(self, json_file: str) -> dict:
|
@commands.hybrid_command(
|
||||||
"""
|
name="timezones",
|
||||||
Opens the JSON file and returns a dictionary
|
aliases=["tz"],
|
||||||
|
usage="timezones",
|
||||||
|
)
|
||||||
|
async def timezones(self, ctx: commands.Context[commands.Bot]) -> None:
|
||||||
|
utc_now = datetime.now(UTC)
|
||||||
|
|
||||||
Parameters
|
menu = ViewMenu(ctx, menu_type=ViewMenu.TypeEmbed)
|
||||||
----------
|
|
||||||
json_file : str
|
|
||||||
The path to the json file
|
|
||||||
"""
|
|
||||||
|
|
||||||
with Path.open(json_file) as file:
|
default_embeds: list[discord.Embed] = []
|
||||||
return json.load(file)
|
options: dict[discord.SelectOption, list[Page]] = {}
|
||||||
|
|
||||||
async def buildtzstring(self, json_file: str) -> str:
|
for continent, tz_list in timezones.items():
|
||||||
"""
|
embeds: list[discord.Embed] = []
|
||||||
Formats the timezone data within the timezones.json file into a string.
|
pages = [tz_list[i : i + 9] for i in range(0, len(tz_list), 9)]
|
||||||
|
|
||||||
Parameters
|
for page in pages:
|
||||||
----------
|
embed = discord.Embed(title=f"Timezones in {continent}", color=discord.Color.blurple())
|
||||||
json_file : str
|
|
||||||
The path to the json file
|
|
||||||
"""
|
|
||||||
|
|
||||||
timezone_data = self.loadjson(json_file)
|
for flag, _country, tz_name, abbr, utc_offset in page:
|
||||||
|
tz = pytz.timezone(tz_name)
|
||||||
|
local_time = utc_now.astimezone(tz)
|
||||||
|
time_24hr = local_time.strftime("%H:%M")
|
||||||
|
time_12hr = local_time.strftime("%I:%M %p")
|
||||||
|
|
||||||
formatted_lines = []
|
embed.add_field(
|
||||||
utc_now = datetime.now(pytz.utc)
|
name=f"{flag} {abbr} (UTC{utc_offset:+.2f})",
|
||||||
|
value=f"`{time_24hr} | {time_12hr}`",
|
||||||
|
inline=True,
|
||||||
|
)
|
||||||
|
|
||||||
for entry in timezone_data:
|
embeds.append(embed)
|
||||||
entry_tz = pytz.timezone(f'{entry["full_timezone"]}')
|
|
||||||
entry_time_now = utc_now.astimezone(entry_tz)
|
|
||||||
formatted_time = entry_time_now.strftime("%H:%M")
|
|
||||||
line = f'{entry["discord_emoji"]} `{entry["offset"]} {entry["timezone"]}` | **{formatted_time}**'
|
|
||||||
formatted_lines.append(line)
|
|
||||||
|
|
||||||
return "\n".join(formatted_lines)
|
default_embeds.extend(embeds)
|
||||||
|
|
||||||
@commands.hybrid_command(name="timezones")
|
options[discord.SelectOption(label=continent, emoji=continent_emojis[continent])] = Page.from_embeds(embeds)
|
||||||
async def timezones(self, ctx: commands.Context) -> None:
|
|
||||||
"""
|
|
||||||
Presents a list of the top 20 timezones in the world.
|
|
||||||
"""
|
|
||||||
|
|
||||||
embed = EmbedCreator.create_info_embed(
|
for embed in default_embeds:
|
||||||
title="List of timezones",
|
menu.add_page(embed)
|
||||||
description=await self.buildtzstring("./tux/utils/data/timezones.json"),
|
|
||||||
ctx=ctx,
|
|
||||||
)
|
|
||||||
|
|
||||||
await ctx.send(embed=embed)
|
select = ViewSelect(title="Select Continent", options=options)
|
||||||
|
menu.add_select(select)
|
||||||
|
menu.add_button(ViewButton.end_session())
|
||||||
|
|
||||||
|
await menu.start()
|
||||||
|
|
||||||
|
|
||||||
async def setup(bot: commands.Bot) -> None:
|
async def setup(bot: commands.Bot) -> None:
|
||||||
|
|
Loading…
Reference in a new issue