Skip to content

Commit

Permalink
Merge pull request #54 from Zalk0/skyblock
Browse files Browse the repository at this point in the history
Skyblock ranking features
  • Loading branch information
gylfirst authored Jun 21, 2024
2 parents cda308d + 4de1967 commit 6fbd585
Show file tree
Hide file tree
Showing 9 changed files with 656 additions and 57 deletions.
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,4 @@ HYPIXEL_KEY=
HYPIXEL_GUILD_ID=
HYPIXEL_GUILD_NAME=
HYPIXEL_GUILD_ROLE=
HYPIXEL_RANK_CHANNEL=
10 changes: 7 additions & 3 deletions chouette/commands/misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,11 @@ async def delete(interaction: discord.Interaction[ChouetteBot], message: discord
last_id = interaction.channel.last_message_id

def is_msg(msg: discord.Message) -> bool:
"""Vérifie si le message est dans l'intervalle (dernier message <=> message sélectionné).
On décale les IDs de 22 bits pour obtenir le timestamp du message."""
"""
Vérifie si le message est dans l'intervalle (dernier message ↔ message sélectionné).
On décale les IDs de 22 bits pour obtenir le timestamp du message.
"""
return (message.id >> 22) <= (msg.id >> 22) <= (last_id >> 22)

del_msg = await message.channel.purge(bulk=True, reason="Admin used bulk delete", check=is_msg)
Expand All @@ -94,7 +97,8 @@ async def info(interaction: discord.Interaction[ChouetteBot]) -> None:
dockerhub_link = "https://hub.docker.com/r/gylfirst/chouettebot"
await interaction.response.send_message(
f"Bot Discord créé par : {creators}\n\n"
f"Projet développé pendant notre temps libre. Vous pouvez demander des fonctionnalités sur GitHub.\n"
"Projet développé pendant notre temps libre. "
"Vous pouvez demander des fonctionnalités sur GitHub.\n"
f"[Code source](<{github_link}>)\n"
f"[Image Docker](<{dockerhub_link}>)\n\n"
f"Dernière mise à jour : {last_update}"
Expand Down
61 changes: 41 additions & 20 deletions chouette/commands/skyblock.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import discord
from discord import app_commands

from chouette.utils.skyblock import pseudo_to_profile
from chouette.utils.skyblock_guild import check

if TYPE_CHECKING:
Expand All @@ -20,10 +21,7 @@ def __init__(self) -> None:
"""Initialise la classe Skyblock."""
super().__init__(name="skyblock", description="Commandes relatives au Skyblock d'Hypixel")

@app_commands.command(
name="mods",
description="Vérifie les dernières mises à jour des mods populaires du Skyblock d'Hypixel",
)
@app_commands.command(name="mods")
async def mods(self, interaction: discord.Interaction[ChouetteBot]) -> None:
"""Vérifie les dernières mises à jour des mods populaires du Skyblock d'Hypixel."""
await interaction.response.defer(thinking=True)
Expand Down Expand Up @@ -52,24 +50,27 @@ async def mods(self, interaction: discord.Interaction[ChouetteBot]) -> None:
f"[lien]({skytils['assets'][0]['browser_download_url']})"
)

@app_commands.command(
name="tuto",
description="Donne le lien du tutoriel pour débuter sur le Skyblock d'Hypixel",
)
@app_commands.command(name="tuto")
async def tuto(self, interaction: discord.Interaction[ChouetteBot]) -> None:
"""Donne le lien du tutoriel pour débuter sur le Skyblock d'Hypixel."""
await interaction.response(thinking=True)
repo_url = "https://github.com/gylfirst/HowToSkyblock"
await interaction.followup.send(
f"Ce tutoriel est écrit pour que les débutants puissent jouer au Skyblock d'Hypixel facilement.\n"
f"Vous pouvez le trouver [ici](<{repo_url}>).\n"
f"Fait avec :heart: par [gylfirst](<https://github.com/gylfirst>)!"
strip_color = discord.Colour.from_str(value="#DAA520") # HTML name: GoldenRod
embed_tuto = discord.Embed(
title="Tutoriel pour débuter sur le Skyblock d'Hypixel",
description="Ce tutoriel est écrit pour que les débutants puissent jouer au Skyblock d'Hypixel facilement.",
color=strip_color,
)
embed_tuto.set_author(name="Gylfirst", url="https://github.com/gylfirst")
embed_tuto.set_thumbnail(url="https://hypixel.net/attachments/1608783256403-png.2210524")
embed_tuto.add_field(
name="Comment utiliser le tutoriel ?",
value=f"Il suffit de cliquer sur le lien ci-dessous pour accéder au tutoriel.\n{repo_url}",
inline=False,
)
embed_tuto.set_footer(text="HowToSkyblock")
await interaction.response.send_message(embed=embed_tuto)

@app_commands.command(
name="spider_rain",
description="Indique le temps de la prochaine pluie ou orage sur Spider's Den",
)
@app_commands.command(name="spider_rain")
async def spider(self, interaction: discord.Interaction[ChouetteBot]) -> None:
"""Indique le temps de la prochaine pluie ou orage sur Spider's Den."""
utc_last_thunderstorm = round(
Expand All @@ -93,9 +94,7 @@ async def spider(self, interaction: discord.Interaction[ChouetteBot]) -> None:
thunderstorm_msg = f"Le prochain orage s'arrêtera <t:{thunderstorm_duration}:R>"
await interaction.response.send_message(f"{rain_msg}\n{thunderstorm_msg}")

@app_commands.command(
name="guild", description="Donne un rôle si le joueur est dans la guilde"
)
@app_commands.command(name="guild")
@app_commands.rename(pseudo="pseudo_mc")
async def in_guild(self, interaction: discord.Interaction[ChouetteBot], pseudo: str) -> None:
"""Donne un rôle sur le Discord si le joueur est dans la guilde."""
Expand All @@ -114,3 +113,25 @@ async def in_guild(self, interaction: discord.Interaction[ChouetteBot], pseudo:
await interaction.followup.send("Vous avez été assigné le rôle de membre !")
else:
await interaction.followup.send(checked)

@app_commands.command(name="link")
@app_commands.rename(pseudo="pseudo_mc")
@app_commands.describe(pseudo="Ton pseudo Minecraft", profile="Ton profil Skyblock préféré")
async def link(
self, interaction: discord.Interaction[ChouetteBot], pseudo: str, profile: str | None
):
"""Lie le profil Hypixel Skyblock du joueur."""
await interaction.response.defer(ephemeral=True, thinking=True)
discord_pseudo = interaction.user.name
async with aiohttp.ClientSession() as session:
profile_name = await pseudo_to_profile(
session, interaction.client.config["HYPIXEL_KEY"], discord_pseudo, pseudo, profile
)
if isinstance(profile_name, str):
interaction.client.bot_logger.error(profile_name)
await interaction.followup.send(f"Il y a eu une erreur :\n`{profile_name}`")
return
await interaction.followup.send(
f"Vous êtes bien connecté et le profil "
f"{profile_name.get('profile')} a été enregistré."
)
24 changes: 22 additions & 2 deletions chouette/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from discord.ext import tasks

from chouette.utils.birthdays import calculate_age, load_birthdays
from chouette.utils.ranking import display_ranking, update_stats

if TYPE_CHECKING:
from chouette.bot import ChouetteBot
Expand All @@ -26,7 +27,7 @@
async def tasks_list(client: ChouetteBot) -> None:
"""Liste des tâches à effectuer pour le bot."""

# Loop to send message every 2 hours for pokeroll in utc time (default)
# Send message every 2 hours for pokeroll in utc time (default)
@tasks.loop(time=[time(t) for t in range(0, 24, 2)])
async def poke_ping() -> None:
"""Envoie un message pour le pokeroll."""
Expand All @@ -36,7 +37,7 @@ async def poke_ping() -> None:
msg_poke = f"{dresseurs.mention} C'est l'heure d'attraper des pokémons {pokeball}"
await client.get_channel(int(client.config["POKE_CHANNEL"])).send(msg_poke)

# Loop to check if it's someone's birthday every day at 8am in local time
# Check if it's someone's birthday every day at 8am in local time
@tasks.loop(time=time(8, tzinfo=TIMEZONE))
async def check_birthdays() -> None:
"""Vérifie si c'est l'anniversaire de quelqu'un."""
Expand All @@ -63,6 +64,25 @@ async def check_birthdays() -> None:
)
await client.get_channel(int(client.config["BIRTHDAY_CHANNEL"])).send(msg_birthday)

# Display the ranking for Hypixel Skyblock guild every month on the 1st at 8am in local time
@tasks.loop(time=time(8, tzinfo=TIMEZONE))
async def skyblock_guild_ranking() -> None:
"""Affiche le classement de la guilde Hypixel Skyblock."""
if date.today().day == 1:
guild = client.get_guild(int(client.config["HYPIXEL_GUILD_ID"]))
member = guild.get_role(int(client.config["HYPIXEL_GUILD_ROLE"]))
api_key = client.config["HYPIXEL_KEY"]
update_message = await update_stats(api_key=api_key)
client.bot_logger.info(update_message)
if not guild.icon:
icon_url = "https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/636e0a69f118df70ad7828d4_icon_clyde_blurple_RGB.svg"
else:
icon_url = guild.icon.url
await client.get_channel(int(client.config["HYPIXEL_RANK_CHANNEL"])).send(
f"||{member.mention}||", embed=await display_ranking(img=icon_url)
)

# Start loop
poke_ping.start()
check_birthdays.start()
skyblock_guild_ranking.start()
19 changes: 19 additions & 0 deletions chouette/utils/birthdays.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,22 @@ async def datetime_to_timestamp(birthday: date) -> str:
birthday_dt = datetime.fromisoformat(str(birthday))
unix_timestamp = birthday_dt.timestamp()
return f"<t:{int(unix_timestamp)}:R>"


async def month_to_str(month: int) -> str:
"""Convertit un numéro de mois en français."""
months: list[str] = [
"Janvier",
"Février",
"Mars",
"Avril",
"Mai",
"Juin",
"Juillet",
"Août",
"Septembre",
"Octobre",
"Novembre",
"Décembre",
]
return months[month - 1]
Loading

0 comments on commit 6fbd585

Please sign in to comment.