Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Skyblock #54

Merged
merged 15 commits into from
Jun 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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