This commit is contained in:
csd4ni3l
2025-03-29 15:37:48 +01:00
parent a2fad93b03
commit 8d6aceeac6
13 changed files with 1384 additions and 169 deletions

172
.gitignore vendored
View File

@@ -1,174 +1,10 @@
# Byte-compiled / optimized / DLL files
# Python-generated files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
*.py[oc]
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
*.egg-info
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# UV
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
#uv.lock
# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock
# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
# in version control.
# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
.pdm.toml
.pdm-python
.pdm-build/
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
# Virtual environments
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# PyCharm
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
# Ruff stuff:
.ruff_cache/
# PyPI configuration file
.pypirc

1
.python-version Normal file
View File

@@ -0,0 +1 @@
3.13

View File

@@ -1,2 +1,4 @@
# mc-bot
MC Discord Bot
This is one of my Hungarian projects where i made a Discord bot with additional Minecraft features.
Its not going to be developed heavily.

933
bot.py Normal file
View File

@@ -0,0 +1,933 @@
import discord
import asyncio
import random
import datetime
import json, ast
import traceback
from mcstatus import JavaServer
import time
import pytz
from discord.ext import tasks
import discord.utils
intents = discord.Intents().all()
bot = discord.Bot(intents=intents)
global warns
with open('warns.json', 'r') as file:
warns = json.loads(file.read())
with open('giveaways.json','r') as file:
giveaways_json_list: list = json.loads(file.read())
with open('settings.json','r') as file:
global settings
settings: dict = json.loads(file.read())
ticket_categories = settings['ticket_categories']
log_channel_id = settings['log_channel_id']
join_channel_id = settings['join_channel_id']
join_autorole_id = settings['join_autorole_id']
ticket_support_role_ids = settings['ticket_support_role_ids']
emergency_admin_ids = settings['emergency_admin_user_ids']
partner_manager_role_id = settings['partner_manager_role_id']
reaction_roles = settings['reaction_roles']
transcript_channel_id = settings['transcript_channel_id']
ticket_category_id = settings['ticket_category_id']
suggestion_channel_id = settings['suggestion_channel_id']
players_status_channel_id = settings['players_status_channel_id']
ping_status_channel_id = settings['ping_status_channel_id']
server_ip = settings["minecraft_server_domain_ip"]
private_server_ip = settings["private_minecraft_server_ip"]
private_server_port = settings["private_minecraft_server_port"]
server_name = settings["server_name"]
screenshot_command_enabled = settings['screenshot_command_enabled']
giveaways = []
global players_before
players_before = 0
def get_minecraft_status():
server = JavaServer.lookup(f"{private_server_ip}:{private_server_port}")
return server.status()
def convert_duration(duration):
if 's' in duration:
return duration.replace('s', ' másodperc')
if 'm' in duration:
return duration.replace('m', ' perc')
if 'h' in duration:
return duration.replace('h', ' óra')
if 'd' in duration:
return duration.replace('d', ' nap')
if 'w' in duration:
return duration.replace('w', ' hét')
if 'mo' in duration:
return duration.replace('mo', ' hónap')
def convert_duration_to_seconds(duration):
time_convert = {"s": 1, "m": 60, "h": 3600,
"d": 86400, "w": 604800, "mo": 31536000}
return int(duration.split(duration[-1])[0]) * time_convert[duration[-1]]
def convert_seconds_to_date(seconds):
days, remainder = divmod(seconds, 86400)
hours, remainder = divmod(remainder, 3600)
minutes, seconds = divmod(remainder, 60)
result = ""
if days > 0:
result += "{} nap ".format(int(days))
if hours > 0:
result += "{} óra ".format(int(hours))
if minutes > 0:
result += "{} perc ".format(int(minutes))
if seconds > 0 or not any([days, hours, minutes]):
result += "{} másodperc".format(int(seconds))
return result.strip()
@tasks.loop(minutes=1)
async def update_mc_status():
minecraft_status = get_minecraft_status()
player_num, ping = minecraft_status.players.online, minecraft_status.latency
await bot.change_presence(activity=discord.Activity(type=discord.ActivityType.playing, name=f"{server_name} | {player_num} Online | /help"))
global players_before
if players_before == 0 or player_num != players_before:
await discord.utils.get(bot.guilds[0].channels, id=players_status_channel_id).edit(name=f"Játékosok: {player_num}")
players_before = player_num
await discord.utils.get(bot.guilds[0].channels, id=ping_status_channel_id).edit(name=f"Ping: {round(ping,2)} ms")
@tasks.loop(seconds=15)
async def update_giveaways():
for n in range(len(giveaways)):
giveaway = giveaways[n]
if not giveaway['ended']:
if giveaway['end_time'] <= time.time():
await end_giveaway(n, giveaway)
continue
message = giveaway['message']
time_left_in_seconds = giveaway['end_time'] - time.time()
time_left_in_str = convert_seconds_to_date(time_left_in_seconds)
embed = discord.Embed(
title="🎉 Giveaway 🎉", description=f"Reagálj 🎉 emotikonnal hogy jelentkezz!\nHátralevő idő: **{time_left_in_str}**\nNyeremény: **{giveaway['prize']}**\nNyertesek száma: **{giveaway['winner_num']}**", color=0xFFFF00)
if not bot.user.avatar == None:
embed.set_footer(text=f"{server_name} Bot", icon_url=bot.user.avatar.url)
else:
embed.set_footer(text=f"{server_name} Bot")
await message.edit(embed=embed)
await asyncio.sleep(1)
@bot.event
async def on_member_join(member):
if not join_channel_id == -1:
embed = discord.Embed(title=f'Üdvözöllek, {member.name}', color=discord.Colour.red(), description=f"👋 Üdvözöllek a(z) {server_name} discord szerverén, **{member.display_name}**!\nReméljük jól fogod érezni magad a szerverünkön!")
if not bot.user.avatar == None:
embed.set_footer(text=f"{server_name} Bot", icon_url=bot.user.avatar.url)
else:
embed.set_footer(text=f"{server_name} Bot")
embed.set_thumbnail(url=bot.user.avatar.url)
await bot.get_channel(join_channel_id).send(embed=embed)
if not join_autorole_id == -1:
await member.add_roles(discord.utils.get(member.guild.roles, id=join_autorole_id))
@bot.event
async def on_ready():
await bot.sync_commands()
for giveaway_dict in giveaways_json_list:
try:
channel = await bot.guilds[0].fetch_channel(giveaway_dict['channel_id'])
message = await channel.fetch_message(giveaway_dict['message_id'])
giveaways.append({"message_id": giveaway_dict['message_id'], "message": message, "winner_num": giveaway_dict['winner_num'],
"duration": convert_duration(giveaway_dict['_duration']), "_duration": giveaway_dict['_duration'], "prize": giveaway_dict['prize'], "ended": giveaway_dict['ended'], "end_time": giveaway_dict['start_time']+convert_duration_to_seconds(giveaway_dict['_duration'])})
except:
continue
if not server_ip == 'example.com':
if not server_ip == 'HAMAROSAN!':
update_mc_status.start()
else:
await bot.change_presence(activity=discord.Activity(type=discord.ActivityType.playing, name=f"{server_name} | /help"))
if not ping_status_channel_id == -1:
await discord.utils.get(bot.guilds[0].channels, id=ping_status_channel_id).edit(name=f"Ping: HAMAROSAN!")
if not players_status_channel_id == -1:
await discord.utils.get(bot.guilds[0].channels, id=players_status_channel_id).edit(name=f"Játékosok: HAMAROSAN!")
else:
await bot.change_presence(activity=discord.Activity(type=discord.ActivityType.playing, name=f"{server_name} | /help"))
print(f'{server_name} bot online')
update_giveaways.start()
# await bot.change_presence(activity=discord.Activity(type=discord.ActivityType.playing, name=f"{server_name} | /help"))
if not server_ip == 'example.com':
@bot.event
async def on_message(message):
if not message.author.bot:
if any(i in message.content.lower() for i in [' ip', ' ipje', ' ip ']) and message.content.endswith('?'):
await message.reply(f'A szerver ipje: **{server_ip}**')
@bot.event
async def on_member_update(before, after):
try:
if log_channel_id == -1:
return
channel = bot.get_channel(log_channel_id)
embed = discord.Embed(title=f'{after.name}', color=discord.Colour.red())
roles_changed = False
nick_changed = False
name_changed = False
new_roles = [role.name for role in after.roles if role not in before.roles]
if len(new_roles) != 0:
roles_changed = True
embed.add_field(name='Felhasználó által megkapott rangok:',value=','.join(new_roles))
removed_roles = [role.name for role in before.roles if role not in after.roles]
if len(removed_roles) != 0:
roles_changed = True
embed.add_field(name='Felhasználótól elvett rangok:',value=','.join(removed_roles))
if roles_changed:
embed.title += ' rangjai'
if before.nick != after.nick:
nick_changed = True
embed.title += (' és beceneve' if roles_changed else ' beceneve')
embed.add_field(name='Felhasználó régi beceneve', value=str(before.nick).replace('None','Nincs becenév'))
embed.add_field(name='Felhasználó új beceneve', value=str(after.nick).replace('None','Nincs becenév'))
if before.display_name != after.display_name:
name_changed = True
embed.title += (' és neve' if roles_changed or nick_changed else ' neve')
embed.add_field(name='Felhasználó régi neve', value=str(before.nick))
embed.add_field(name='Felhasználó új neve', value=str(after.nick))
if roles_changed and not name_changed and not nick_changed:
embed.title += ' megváltoztak!' # Egy felhasználó rangjai megváltoztak!
else:
embed.title += ' megváltozott!'
if not embed.title == f'{after.name} megváltozott!':
if not after.avatar == None:
embed.set_thumbnail(url=after.avatar.url)
await channel.send(embed=embed)
except:
traceback.print_exc()
@bot.event
async def on_message_delete(message):
try:
if log_channel_id == -1:
return
log_channel: discord.channel.TextChannel = bot.get_channel(log_channel_id)
if not log_channel == '':
embed = discord.Embed(title=f'{message.author.name} üzenetét törölték a ' +
message.channel.name+f' csatornában!', color=discord.Colour.red())
if not message.author.avatar == None:
embed.set_thumbnail(url=message.author.avatar.url)
embed.add_field(name='Tartalma: ', value=message.content)
await log_channel.send(embed=embed)
except:
traceback.print_exc()
@bot.event
async def on_guild_channel_create(channel):
try:
if log_channel_id == -1:
return
log_channel: discord.channel.TextChannel = bot.get_channel(log_channel_id)
if not log_channel == '':
async for entry in channel.guild.audit_logs(limit=1, action=discord.AuditLogAction.channel_create):
creator = entry.user
embed = discord.Embed(title=creator.name+' létrehozta a ' +
channel.name+' csatornát!', color=discord.Colour.red())
if not creator.avatar == None:
embed.set_thumbnail(url=creator.avatar.url)
await log_channel.send(embed=embed)
except:
traceback.print_exc()
@bot.event
async def on_guild_channel_delete(channel):
try:
if log_channel_id == -1:
return
log_channel: discord.channel.TextChannel = bot.get_channel(log_channel_id)
if not log_channel == '':
async for entry in channel.guild.audit_logs(limit=1, action=discord.AuditLogAction.channel_delete):
deleter = entry.user
embed = discord.Embed(title=deleter.name+' törölte a ' +
channel.name+' csatornát!', color=discord.Colour.red())
if not deleter.avatar == None:
embed.set_thumbnail(url=deleter.avatar.url)
await log_channel.send(embed=embed)
except:
traceback.print_exc()
@bot.event
async def on_message_edit(before, after):
try:
if not after.author.bot:
if log_channel_id == -1:
return
log_channel: discord.channel.TextChannel = bot.get_channel(log_channel_id)
if not log_channel == '':
embed = discord.Embed(title=after.author.name+' módosította a saját üzenetét itt: ' +
after.channel.name+'!', color=discord.Colour.red())
if not after.avatar == None:
embed.set_thumbnail(url=after.author.avatar.url)
embed.add_field(name='Eredeti tartalma:',
value=before.content)
embed.add_field(name='Módosított tartalma:', value=after.content)
await log_channel.send(embed=embed)
except:
traceback.print_exc()
@bot.event
async def on_bulk_message_delete(messages):
try:
if log_channel_id == -1:
return
log_channel: discord.channel.TextChannel = bot.get_channel(log_channel_id)
if not log_channel == '':
async for entry in messages[0].guild.audit_logs(limit=1, action=discord.AuditLogAction.message_bulk_delete):
deleter = entry.user
embed = discord.Embed(title=deleter.name+' törölt '+str(len(messages))+' üzenetet a ' +
messages[0].channel.name+' csatornában!', color=discord.Colour.red())
if not deleter.avatar == None:
embed.set_thumbnail(url=deleter.avatar.url)
await log_channel.send(embed=embed)
except:
traceback.print_exc()
async def end_giveaway(n, giveaway):
message = await bot.get_channel(giveaway['message'].channel.id).fetch_message(giveaway["message_id"])
participant_mentions = [
participant.mention for participant in [user async for user in message.reactions[0].users()]]
if bot.user.mention in participant_mentions:
participant_mentions.remove(bot.user.mention)
if len(participant_mentions) > giveaway['winner_num']:
winner_list = random.sample(
participant_mentions, giveaway['winner_num'])
else:
winner_list = participant_mentions
if len(winner_list) == 0:
embed = discord.Embed(title="🎉 Giveaway Vége 🎉",
description=f"Háralevő idő: **A giveawaynek már vége van**\nNyeremény: **{giveaway['prize']}**\nNyertesek száma: **{giveaway['winner_num']}**\nSajnálom de senki sem nyert.", color=0xFF0000)
if not bot.user.avatar == None:
embed.set_footer(text=f"{server_name} Bot", icon_url=bot.user.avatar.url)
else:
embed.set_footer(text=f"{server_name} Bot")
await message.edit(embed=embed)
else:
embed = discord.Embed(title="🎉 Giveaway Vége 🎉",
description=f"Hátralevő idő: **A giveawaynek már vége van**\nNyeremény: **{giveaway['prize']}**\nNyertesek száma: **{giveaway['winner_num']}**\nNyertes(ek): {', '.join(winner_list)}", color=0xFF0000)
await message.edit(content=', '.join(winner_list), embed=embed)
giveaways[n]['ended'] = True
giveaways_json_list[n]['ended'] = True
with open('giveaways.json','w') as file:
file.write(json.dumps(giveaways_json_list, indent=4))
@bot.slash_command()
async def greroll(interaction, message_id):
if interaction.user.guild_permissions.administrator:
for n,giveaway in enumerate(giveaways):
if int(message_id) == giveaway["message_id"]:
try:
await end_giveaway(n, giveaway)
await interaction.response.send_message('Giveaway sikeresen újrasorsolva!')
return
except:
traceback.print_exc()
else:
await interaction.response.send_message("Nincs jogod használni ezt a parancsot!", ephemeral=True)
# @bot.slash_command()
# async def árverés(interaction: discord.Interaction, tárgy: str, mennyiség: int, ár: int):
# if not isinstance(mennyiség, int) or not isinstance(ár, int):
# await interaction.response.send_message("A mennyiségnek és az árnak egy számnak kell lennie!", ephemeral=True)
# embed = discord.Embed(title="Árverési Információk")
# embed.add_field(name="Eladó", value=interaction.user.mention)
# embed.add_field(name="Tárgy", value=tárgy)
# embed.add_field(name="Mennyiség", value=str(mennyiség))
# embed.add_field(name="Ár", value="$"+str(ár))
# embed.set_footer(icon_url=bot.user.avatar.url, text=f"{server_name} Bot")
# auction_channel = discord.utils.get(interaction.guild.channels, id=auction_channel_id)
# await auction_channel.send(content=f"{interaction.user.display_name} kirakott a piacra egy új árverést!", embed=embed)
# await interaction.response.send_message("Árverés sikeresen kitéve!")
@bot.slash_command()
async def giveaway(interaction: discord.Interaction, duration: str, winners: int, prize: str):
if interaction.user.guild_permissions.administrator:
try:
embed = discord.Embed(
title="🎉 Giveaway 🎉", description=f"Reagálj 🎉 emotikonnal hogy jelentkezz!\nHátralevő idő: **{convert_duration(duration)}**\nNyeremény: **{prize}**\nNyertesek száma: **{winners}**", color=0xFFFF00)
if not bot.user.avatar == None:
embed.set_footer(text=f"{server_name} Bot", icon_url=bot.user.avatar.url)
else:
embed.set_footer(text=f"{server_name} Bot")
message = await interaction.channel.send(embed=embed)
await message.add_reaction("🎉")
giveaways.append({"message_id": message.id, "message": message, "winner_num": winners,
"duration": convert_duration_to_seconds(duration), "_duration": duration, "prize": prize, 'end_time': time.time()+convert_duration_to_seconds(duration), "ended": False})
giveaways_json_list.append({"message_id": message.id, "channel_id": interaction.channel.id, "winner_num": winners, "_duration": duration, "prize": prize, "start_time": time.time(), "ended": False})
with open("giveaways.json",'w') as file:
file.write(json.dumps(giveaways_json_list, indent=4))
except:
traceback.print_exc()
else:
await interaction.response.send_message("Nincs jogod használni ezt a parancsot!", ephemeral=True)
@bot.slash_command()
async def send_reaction_role_message(interaction, channel: discord.channel.TextChannel):
global settings
embed_description = "Reagálj a megfelelő emojikra a rangokért!"
for reaction_role_emoji, reaction_role_dict in reaction_roles.items():
embed_description += f"\n{reaction_role_emoji}: {reaction_role_dict['description']}"
embed = discord.Embed(title="Reakció Rangok", description=embed_description, color=discord.Colour.red())
if not bot.user.avatar == None:
embed.set_footer(text=f"{server_name} Bot", icon_url=bot.user.avatar.url)
else:
embed.set_footer(text=f"{server_name} Bot")
message: discord.Message = await channel.send(embed=embed)
await interaction.response.send_message("Üzenet elküldve a megadott csatornába!\nÜzenet ID: " + str(message.id), ephemeral=True)
for reaction_role_emoji, _ in reaction_roles.items():
await message.add_reaction(reaction_role_emoji)
settings['reaction_role_message_id'] = message.id
with open('settings.json', 'w') as file:
file.write(json.dumps(settings, indent=4))
async def on_reaction_add(emoji, message, user: discord.Member):
global settings
if not user.bot and message.id == settings['reaction_role_message_id'] and emoji.name in reaction_roles:
await user.add_roles(discord.utils.get(message.guild.roles, id=reaction_roles[emoji.name]['role_id']))
# elif message.id == koth_message_id:
# role = discord.utils.get(message.guild.roles, id=koth_ping_role_id)
# await user.add_roles(role)
async def on_reaction_remove(emoji, message, user: discord.Member):
global settings
if not user.bot and message.id == settings['reaction_role_message_id'] and emoji.name in reaction_roles:
await user.remove_roles(discord.utils.get(message.guild.roles, id=reaction_roles[emoji.name]['role_id']))
# elif message.id == koth_message_id:
# role = discord.utils.get(message.guild.roles, id=koth_ping_role_id)
# await user.remove_roles(role)
@bot.event
async def on_raw_reaction_add(payload): # trigger on_reaction_add for all messages not just cached ones.
channel = await bot.fetch_channel(payload.channel_id)
await on_reaction_add(payload.emoji, await channel.fetch_message(payload.message_id), discord.utils.get(channel.guild.members,id=payload.user_id))
@bot.event
async def on_raw_reaction_remove(payload):
channel = await bot.fetch_channel(payload.channel_id)
message = await channel.fetch_message(payload.message_id)
user = discord.utils.get(channel.guild.members,id=payload.user_id)
await on_reaction_remove(payload.emoji, message, user)
@bot.slash_command()
async def suggest(interaction, suggestion):
if not suggestion_channel_id == -1:
embed = discord.Embed(title=str(interaction.user.name)+' új javaslata', description=suggestion, color=discord.Colour.red())
embed.set_thumbnail(url=interaction.user.avatar.url)
if not bot.user.avatar == None:
embed.set_footer(text=f"{server_name} Bot", icon_url=bot.user.avatar.url)
else:
embed.set_footer(text=f"{server_name} Bot")
message = await bot.get_channel(suggestion_channel_id).send(embed=embed)
await message.add_reaction('')
await message.add_reaction('')
await interaction.response.send_message('Ötlet sikeresen közzétéve!')
else:
await interaction.response.send_message('Ez a parancs nincs beállítva!', ephemeral=True)
# @bot.slash_command(description="Készít egy képernyőképet az adott URL-ről")
# async def screenshot(interaction: discord.Interaction, url):
# if screenshot_command_enabled:
# if any(['porn' in url, 'xxx' in url, 'boob' in url, 'pussy' in url, 'cock' in url, 'dick' in url]):
# await interaction.response.send_message('Az NSFW ezen a szerveren nem engedélyezett!', ephemeral=True)
# await interaction.response.defer()
# options = webdriver.ChromeOptions()
# options.add_argument('--headless') # A fej nélküli módban futtatás segíthet elkerülni az ablak megjelenítését
# options.add_argument("--disable-extensions")
# options.add_argument("--disable-gpu")
# options.add_argument("--no-sandbox")
# options.add_argument("--disable-dev-shm-usage")
# options.add_argument("--disable-popup-blocking")
# options.add_argument("--disable-cookie-encryption")
# options.add_argument("--disable-cookie-security")
# options.add_argument("--accept-cookies") # Sütik elfogadása
# driver = webdriver.Chrome(service=webdriver.ChromeService(executable_path='/usr/local/bin/chromedriver'), options=options)
# driver.get(url)
# driver.save_screenshot('screenshot.png')
# driver.quit()
# file = discord.File('screenshot.png', filename='screenshot.png')
# embed = discord.Embed(title="Képernyőkép", description=f"Készítve az alábbi URL-ről: {url}", color=discord.Color.blue())
# embed.set_image(url="attachment://screenshot.png")
# if not bot.user.avatar == None:
# embed.set_footer(text=f"{server_name} Bot", icon_url=bot.user.avatar.url)
# else:
# embed.set_footer(text=f"{server_name} Bot")
# await interaction.followup.send(file=file, embed=embed)
# else:
# await interaction.response.send_message('Ez a parancs ki van kapcsolva!', ephemeral=True)
async def close_ticket(interaction):
channel = interaction.message.channel
closer = interaction.user
await interaction.response.pong()
message = await interaction.channel.send(f'Törlés 5 másodperc múlva!')
for i in range(4, 0, -1):
await asyncio.sleep(1)
await message.edit(content=f'Törlés {i} másodperc múlva!')
await asyncio.sleep(0.5)
await channel.delete()
if not transcript_channel_id == -1:
transcript_channel = discord.utils.get(interaction.guild.channels, id=transcript_channel_id)
transcript_embed = discord.Embed(title=f"Jegy #{channel.name.split('-')[1]} bezárva")
# transcript_embed.add_field(name="Jegy témája", value=..., inline=False)
transcript_embed.add_field(name="Bezárta", value=closer.mention)
await transcript_channel.send(embed=transcript_embed)
@bot.slash_command()
async def lock(interaction):
if interaction.user.guild_permissions.manage_channels:
await interaction.channel.set_permissions(interaction.guild.default_role, send_messages=False)
await interaction.response.send_message(f'Csatorna lezárva {interaction.user.mention} által!')
else:
await interaction.response.send_message("Nincs jogod használni ezt a parancsot!", ephemeral=True)
@bot.slash_command()
async def unlock(interaction):
if interaction.user.guild_permissions.manage_channels:
await interaction.channel.set_permissions(interaction.guild.default_role, send_messages=True)
await interaction.response.send_message(f'Csatorna megnyitva {interaction.user.mention} által!')
else:
await interaction.response.send_message("Nincs jogod használni ezt a parancsot!", ephemeral=True)
async def ticket(interaction: discord.Interaction, ticket_tema):
guild = interaction.guild
if not ticket_category_id == -1:
ticket_category = discord.utils.get(
interaction.guild.categories, id=ticket_category_id)
else:
await interaction.response.send_message('Ticket létrehozása sikertelen. Ticket kategória nincs beállítva.')
return
overwrites = {
# Make default not able to view this private channel
interaction.guild.default_role: discord.PermissionOverwrite(read_messages=False, send_messages=False),
# Add the bot to the channel
interaction.guild.me: discord.PermissionOverwrite(read_messages=True, send_messages=True),
# add author to channel
interaction.user: discord.PermissionOverwrite(
read_messages=True, send_messages=True, attach_files=True)
}
for role_id in ticket_support_role_ids:
role = discord.utils.get(guild.roles, id=role_id)
if not role == None:
overwrites[role] = discord.PermissionOverwrite(
read_messages=True, send_messages=True)
else:
print(f'Invalid rang ID találva a Ticket Support rangokhoz!\nID: {role_id}')
if ticket_tema == "Partnerkedés" and not partner_manager_role_id == -1:
overwrites[discord.utils.get(guild.roles, id=partner_manager_role_id)] = discord.PermissionOverwrite(
read_messages=True, send_messages=True)
with open('values.json', 'r') as file:
values_json = json.loads(file.read())
values_json['ticket_number'] += 1
ticket_number = values_json['ticket_number']
with open('values.json', 'w') as file:
file.write(json.dumps(values_json, indent=4))
channel = await guild.create_text_channel('jegy-'+str(ticket_number), category=ticket_category, overwrites=overwrites)
await interaction.response.send_message(f'Ticket sikeresen megnyitva: <#{channel.id}>', ephemeral=True)
view = discord.ui.View(timeout=None)
embed = discord.Embed(title='Ticket Létrehozva!')
button = discord.ui.Button(
label='Ticket bezárása', custom_id=f'ticket_{ticket_number}_close_button')
view.add_item(button)
bot.add_view(view)
embed.add_field(name='Ticket témája:',value=ticket_tema)
embed.add_field(name='Létrehozója:', value=interaction.user.mention)
if not bot.user.avatar == None:
embed.set_footer(text=f"{server_name} Bot", icon_url=bot.user.avatar.url)
else:
embed.set_footer(text=f"{server_name} Bot")
await channel.send(embed=embed, view=view)
if not transcript_channel_id == -1:
transcript_channel = discord.utils.get(interaction.guild.channels, id=transcript_channel_id)
transcript_embed = discord.Embed(title=f"Jegy #{channel.name.split('-')[1]} létrehozva")
transcript_embed.add_field(name='Ticket témája:',value=ticket_tema)
transcript_embed.add_field(name="Létrehozta", value=interaction.user.mention)
await transcript_channel.send(embed=transcript_embed)
@bot.slash_command()
async def send_ticket_message(interaction, channel: discord.channel.TextChannel):
if interaction.user.guild_permissions.administrator:
if len(ticket_categories) == 0:
await interaction.response.send_message('Nincsenek hibajegy kategóriák beállítva!', ephemeral=True)
return
embed = discord.Embed(
title="Ticket nyitás", description='''
⁉️ Problémát találtál? Bugot találtál? Nyiss ticketet!
📌| Kérlek írd le a problémádat a ticket megnyitása után.
⚡| Egyik csapattagunk máris válaszolni fog!''')
if not bot.user.avatar == None:
embed.set_footer(text=f"{server_name} Bot", icon_url=bot.user.avatar.url)
else:
embed.set_footer(text=f"{server_name} Bot")
view = discord.ui.View(timeout=None)
select = discord.ui.Select(options=[discord.SelectOption(
label=dolog, value=dolog, emoji=emoji) for emoji, dolog in ticket_categories], custom_id='ticket')
view.add_item(select)
bot.add_view(view)
await channel.send(embed=embed, view=view)
await interaction.response.send_message('Ticket Panel sikeresen elküldve a megadott csatornába!', ephemeral=True)
else:
await interaction.response.send_message("Nincs jogod használni ezt a parancsot!", ephemeral=True)
@bot.event
async def on_interaction(interaction: discord.Interaction):
if interaction.type == discord.InteractionType.application_command:
await discord.Bot.on_interaction(bot, interaction)
return
custom_id = interaction.data['custom_id']
if custom_id == 'ticket':
await ticket(interaction, interaction.data['values'][0])
elif custom_id.startswith('ticket_') and custom_id.endswith('_close_button'):
await close_ticket(interaction)
@bot.slash_command()
async def warn(interaction, member: discord.Member, *, reason='Ok nem megadva'):
if interaction.user.guild_permissions.moderate_members:
if interaction.user.id == member.id:
await interaction.response.send_message('Saját magadat nem figyelmeztetheted!', ephemeral=True)
return
if member.bot:
await interaction.response.send_message('Egy botot nem figyelmeztethetsz!', ephemeral=True)
return
if not interaction.user.id == interaction.guild.owner_id and interaction.user.id in emergency_admin_ids and not interaction.user.top_role.position > member.top_role.position:
await interaction.response.send_message("Nincs jogod ezt a felhasználót figyelmeztetni!", ephemeral=True)
return
if member.id in warns:
warns[member.id].append(reason)
else:
warns[member.id] = [reason]
await member.send(f'Figyelmeztetve lettél a következő okból: {reason}')
await interaction.response.send_message(f'A figyelmeztetést elküldtem, a következő okból: {reason}')
if len(warns[member.id]) == 2:
await member.timeout(datetime.timedelta(hours=1))
if len(warns[member.id]) == 3:
await member.kick()
if len(warns[member.id]) == 4:
await member.timeout(datetime.timedelta(days=1))
if len(warns[member.id]) == 5:
await member.timeout(datetime.timedelta(days=3))
if len(warns[member.id]) == 6:
await member.ban(reason='Elérte a 6 figyelmeztetést, ezért automatikusan bannoltam')
with open('warns.txt', 'w') as file:
file.write(json.dumps(warns, indent=4))
else:
await interaction.response.send_message("Nincs jogod használni ezt a parancsot!", ephemeral=True)
@bot.slash_command()
async def mcstats(interaction: discord.Interaction):
if not server_ip == 'example.com':
if not server_ip == 'HAMAROSAN!':
try:
await interaction.response.defer()
status = get_minecraft_status()
except:
traceback.print_exc()
await interaction.followup.send('A szerver nem elérhető!')
return
embed = discord.Embed(title='MC Statisztikák', color=discord.Colour.red())
embed.add_field(name="Online Játékosok",value=str(status.players.online))
embed.add_field(name="Ping",value=f"{round(status.latency,2)} ms")
if not bot.user.avatar == None:
embed.set_footer(text=f"{server_name} Bot", icon_url=bot.user.avatar.url)
else:
embed.set_footer(text=f"{server_name} Bot")
await interaction.followup.send(embed=embed)
else:
await interaction.response.send_message("IP HAMAROSAN!")
else:
await interaction.response.send_message("Ez a parancs ki van kapcsolva!", ephemeral=True)
@bot.slash_command()
async def kick(interaction, member: discord.Member, reason=None):
if interaction.user.guild_permissions.kick_members:
if interaction.user.id == member.id:
await interaction.response.send_message('Saját magadat nem rúghatod ki!', ephemeral=True)
return
if bot.user.id == member.id:
await interaction.response.send_message('A botot nem rúghatod ki!', ephemeral=True)
return
if not interaction.user.id == interaction.guild.owner_id and interaction.user.id in emergency_admin_ids and not interaction.user.top_role.position > member.top_role.position:
await interaction.response.send_message("Nincs jogod ezt a felhasználót kirúgni!", ephemeral=True)
return
await member.kick(reason=reason)
await interaction.response.send_message(f'A {member.name} felhasználó ki lett rúgva!')
else:
await interaction.response.send_message("Nincs jogod használni ezt a parancsot!", ephemeral=True)
@bot.slash_command()
async def ban(interaction: discord.Interaction, member: discord.Member, reason=None):
if interaction.user.guild_permissions.ban_members:
if interaction.user.id == member.id:
await interaction.response.send_message('Saját magadat nem tilthatod ki!', ephemeral=True)
return
if bot.user.id == member.id:
await interaction.response.send_message('A botot nem tilthatod ki!', ephemeral=True)
return
if not interaction.user.id == interaction.guild.owner_id and interaction.user.id in emergency_admin_ids and not interaction.user.top_role.position > member.top_role.position:
await interaction.response.send_message("Nincs jogod ezt a felhasználót kitiltani!", ephemeral=True)
return
if not reason == None:
await member.ban(reason=reason)
else:
await member.ban()
await interaction.response.send_message(f'A {member.name} felhasználó ki lett tiltva!')
else:
await interaction.response.send_message("Nincs jogod használni ezt a parancsot!", ephemeral=True)
@bot.slash_command()
async def unban(interaction, member_id: int, reason=None):
if interaction.user.guild_permissions.ban_members and interaction.user.guild_permissions.administrator:
banned_users = await interaction.guild.bans()
for ban_entry in banned_users:
user = ban_entry.user
if member_id == user.id:
if not reason == None:
await interaction.guild.unban(user, reason=reason)
else:
await interaction.guild.unban(user)
await interaction.response.send_message(f'A {user.name} felhasználó kitiltása fel lett oldva!')
else:
await interaction.response.send_message("Nincs jogod használni ezt a parancsot!", ephemeral=True)
@bot.slash_command()
async def mute(interaction, member: discord.Member, time):
if interaction.user.guild_permissions.moderate_members:
if interaction.user.id == member.id:
await interaction.response.send_message('Saját magadat nem muteolhatod!', ephemeral=True)
return
if member.bot:
await interaction.response.send_message('Egy botot nem muteolhatsz!', ephemeral=True)
return
if not interaction.user.id == interaction.guild.owner_id and interaction.user.id in emergency_admin_ids and not interaction.user.top_role.position > member.top_role.position:
time_convert = {"s": 1, "m": 60, "h": 3600,
"d": 86400, "w": 604800, "mo": 31536000}
seconds = int(time.split(time[-1])[0]) * time_convert[time[-1]]
duration = datetime.timedelta(seconds=seconds)
await member.timeout(duration)
await interaction.response.send_message(f'{member.name} muteolva lett {seconds} másodpercig')
else:
await interaction.response.send_message('Nem muteolhatsz nálad magasabb rangú felhasználót!!')
else:
await interaction.response.send_message("Nincs jogod használni ezt a parancsot!", ephemeral=True)
@bot.slash_command()
async def userinfo(interaction, tag: discord.Member = None):
member = tag or interaction.user
roles = [i.name for i in member.roles]
roles.remove("@everyone")
account_age = (discord.utils.utcnow() - member.created_at).days
boosting_since = member.premium_since
is_boosting = bool(boosting_since)
activity = member.activity.name if member.activity else "N/A"
embed = discord.Embed(title='User Info', color=discord.Colour.red())
if member.avatar:
embed.set_thumbnail(url=member.avatar.url)
embed.add_field(name='Felhasználó neve', value=f"{member.name}", inline=False)
embed.add_field(name='ID', value=str(member.id), inline=False)
embed.add_field(name='Státusz', value=str(member.status).replace('idle', 'Tétlen').replace('dnd', 'Elfoglalt').replace('online', 'Elérhető').replace('offline', 'Nem elérhető'), inline=False)
embed.add_field(name='Profil Létrehozva', value=member.created_at.strftime("%b %d, %Y"), inline=False)
embed.add_field(name='Fiók Kor', value=f"{account_age} nap", inline=False)
embed.add_field(name='Csatlakozott a Szerverre', value=member.joined_at.strftime("%b %d, %Y"), inline=False)
embed.add_field(name='Jelenlegi Tevékenység', value=activity, inline=False)
embed.add_field(name='Rangok', value='\n'.join(roles) or "Nincs rangja", inline=False)
embed.add_field(name='Legmagasabb rang', value=roles[-1] if roles else "Nincs rangja", inline=False)
embed.add_field(name='Nitro Boost?', value='Igen' if is_boosting else 'Nem', inline=False)
if is_boosting:
embed.add_field(name='Boostolás kezdete', value=boosting_since.strftime("%b %d, %Y"), inline=False)
embed.add_field(name='Bot?', value='Igen' if member.bot else 'Nem', inline=False)
if bot.user.avatar:
embed.set_footer(text=f"{server_name} Bot", icon_url=bot.user.avatar.url)
else:
embed.set_footer(text=f"{server_name} Bot")
await interaction.response.send_message(embed=embed)
@bot.slash_command()
async def ui(interaction, member: discord.Member = None):
await userinfo(interaction, member)
if not server_ip == 'example.com':
@bot.slash_command()
async def ip(interaction):
await interaction.response.send_message(f'A szerver ipje: **{server_ip}**')
@bot.slash_command()
async def help(interaction, help_tema=None):
embed = discord.Embed(title='Bot Parancsok', color=discord.Colour.red())
parancsok = {
'Mod': [
['/clear {mennyiség}', 'Törli a jelenlegi csatornában lévő üzeneteket'],
['/warn {felhasználó említése}', 'Egy figyelmeztetést ad a megadott felhasználónak, ha az elért egy számú figyelmeztetést, büntetést is ad.'],
['/mute {felhasználó neve}', 'Lenémít egy felhasználót'],
['/kick {felhasználó említése}', 'Kirúg egy felhasználót'],
['/ban {felhasználó említése}', 'Kitilt egy felhasználót'],
['/unban {felhasználó neve}', 'Unbannol egy felhasználót'],
['/clear_member_msg {felhasználó említése} {üzenetek száma}', 'Csak egy kiválszott felhasználó üzeneteit törli a jelenlegi csatornában']],
'Fun': [
['/say {szöveg}', 'A bot elküldi amit írsz.'],
['/suggest {ötlet}','Segíts nekünk egy ötlet írásával!'],
['/screenshot {link}','Készíts egy screenshotot egy oldalról!']],
'Infó': [
['/help', 'Ez a parancs'],
['/userinfo {felhasználó említés} vagy /ui {felhasználó említés}','Információk egy felhasználóról'],
['/serverinfo vagy /si {felhasználó említés}','Információk a dc szerverünkről'],
['/ip', 'Kiírja a minecraft szerverünk ip címét'],
['/mcstats','Tudd meg szerverünk jelenlegi pingjét és játékos számát']],
'Admin': [
['/giveaway {idő} {nyertesek száma} {nyeremény}','Csinál egy giveawayt a jelenlegi csatornában.'],
['/greroll {üzenet idja}','A megadott üzenet id alapján a giveawayt fogja újrasorsolni..'],
['/send_reaction_role_message {csatorna említése}','Elküldi a reakció rang panelt az említett csatornában'],
['/send_ticket_message {csatorna említése}','Elküldi a hibajegy panelt az említett csatornában'],
['/autoclose {idő}','Adott idő után ha nem talál üzenetet, akkor bezárja a ticketet'],
['/lock','Lezárja a jelenlegi csatornát.'],
['/unlock','Felnyitja a jelenlegi csatornát.']]
}
kategoria_leirasok = {
'Infó': 'Információs Parancsok pl /userinfo',
'Admin': 'Adminoknak szánt parancsok',
'Mod': 'Moderátoroknak szánt parancsok.',
"Fun": 'Fun parancsok pl. /say'}
if help_tema != None:
if parancsok.get(help_tema.title()) != None:
for parancs in parancsok[help_tema.title()]:
embed.add_field(name=parancs[0], value=parancs[1])
else:
await interaction.response.send_message('Ez a help kategória nem létezik!')
return
# for kategoria in parancsok:
# for parancs in parancsok[kategoria]:
# if parancs[0].replace('/', '').startswith(str(help_tema)):
# embed.add_field(name=parancs[0], value=parancs[1])
# break
else:
for kategoria in parancsok:
embed.add_field(name=kategoria, value=kategoria_leirasok[kategoria])
if not bot.user.avatar == None:
embed.set_footer(text=f"{server_name} Bot", icon_url=bot.user.avatar.url)
else:
embed.set_footer(text=f"{server_name} Bot")
await interaction.response.send_message(embed=embed)
@bot.slash_command()
async def serverinfo(interaction: discord.Interaction):
server = interaction.guild
roles = [role.name for role in server.roles]
roles.reverse()
embed = discord.Embed(title='Szerver infó', color=discord.Colour.red())
embed.add_field(name='Név', value=server.name, inline=False)
embed.add_field(name='ID', value=server.id, inline=False)
embed.add_field(name='Rangok száma', value=str(len(server.roles)), inline=False)
embed.add_field(name='Tagok száma', value=str(len(server.members)), inline=False)
embed.add_field(name='Emberek száma', value=str(sum([1 if not member.bot else 0 for member in server.members])), inline=False)
embed.add_field(name='Botok száma', value=str(sum([1 if member.bot else 0 for member in server.members])), inline=False)
embed.add_field(name='Legmagasabb rang', value=roles[0], inline=False)
embed.add_field(name="Boostok száma", value=server.premium_subscription_count, inline=False)
#embed.add_field(name="Botok", value=server.premium_subscription_count, inline=False)
if not bot.user.avatar == None:
embed.set_footer(text=f"{server_name} Bot", icon_url=bot.user.avatar.url)
else:
embed.set_footer(text=f"{server_name} Bot")
await interaction.response.send_message(embed=embed)
@bot.slash_command()
async def si(interaction):
await serverinfo(interaction)
@bot.slash_command()
async def clear(interaction: discord.Interaction, mennyiseg: int):
if interaction.user.guild_permissions.manage_messages:
await interaction.channel.purge(limit=mennyiseg+1)
response = await interaction.response.send_message(f'{mennyiseg} üzenet törölve!')
else:
await interaction.response.send_message("Nincs jogod használni ezt a parancsot!", ephemeral=True)
@bot.slash_command()
async def say(interaction, szoveg):
if interaction.user.guild_permissions.manage_messages:
if '<@' in szoveg or "@everyone" in szoveg or "@here" in szoveg:
await interaction.response.send_message('Pinget nem használhatsz egy say parancsban!', ephemeral=True)
return
await interaction.channel.send(szoveg)
#await interaction.response.send_message(szoveg)
else:
await interaction.response.send_message("Nincs jogod használni ezt a parancsot!", ephemeral=True)
def check_member_msg_purge(message, member, amount):
global cleared_num
if member == message.author:
cleared_num += 1
return cleared_num <= amount
@bot.slash_command()
async def clear_member_msg(interaction, amount: int, member: discord.Member):
if interaction.user.guild_permissions.manage_messages:
global cleared_num
cleared_num = 0
if not amount == 'all':
await interaction.channel.purge(check=lambda message: member == message.author)
else:
await interaction.channel.purge(check=lambda message, member=member, amount=amount:check_member_msg_purge(message, member, amount))
await interaction.channel.send(amount.replace('all', 'összes')+' '+str(member)+' által írt üzenet törölve')
@bot.slash_command()
async def autoclose(interaction, duration):
if interaction.user.guild_permissions.manage_channels:
ticket_category = discord.utils.get(
interaction.channel.guild.categories, id=ticket_category_id)
if interaction.channel.category == ticket_category:
time_convert = {"s": 1, "m": 60, "h": 3600,
"d": 86400, "w": 604800, "mo": 31536000}
seconds = int(duration.split(duration[-1])[0]) * time_convert[duration[-1]]
await interaction.response.send_message(f'Sikeres autoclose művelet! Ha ticketben nem lesz üzenet {seconds} másodperc után, a ticket automatikusan zárolva lesz!')
await asyncio.sleep(seconds)
messages = await interaction.channel.history(limit=1).flatten()
last_message = messages[0]
time_difference = datetime.datetime.now(pytz.timezone('Europe/Berlin')) - last_message.created_at.replace(tzinfo=pytz.UTC)
if time_difference.total_seconds() >= seconds:
await interaction.channel.send("Ticket inaktivitás miatt zárolva.")
await asyncio.sleep(3)
await interaction.channel.delete()
else:
await interaction.response.send_message('Ezt a parancsot csak ticketekben lehet használni!')
else:
await interaction.response.send_message("Nincs jogod használni ezt a parancsot!", ephemeral=True)
if not settings['token'] == 'TOKEN':
bot.run(settings['token'])
else:
print('Írd át a token változót a settings.json fájlban a bot elindításához!')

1
giveaways.json Normal file
View File

@@ -0,0 +1 @@
[]

12
pyproject.toml Normal file
View File

@@ -0,0 +1,12 @@
[project]
name = "mc-bot"
version = "0.1.0"
description = "MC discord bot"
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
"audioop-lts>=0.2.1",
"mcstatus>=11.1.1",
"py-cord[voice]>=2.6.1",
"pytz>=2025.2",
]

3
requirements.txt Normal file
View File

@@ -0,0 +1,3 @@
py-cord[voice]
mcstatus
pytz

29
settings.json Normal file
View File

@@ -0,0 +1,29 @@
{
"log_channel_id": -1,
"ticket_categories": [
["⛔", "Hiba bejelentése"],
["🏆", "TGF"],
["🤡", "Csaló Jelentése"],
["🎁", "Jutalom átvétele"],
["❓", "Egyéb kérdések"],
["🤝", "Partnerkedés"]
],
"join_channel_id": -1,
"join_autorole_id": -1,
"ticket_support_role_ids": [],
"emergency_admin_user_ids": [],
"partner_manager_role_id": -1,
"reaction_role_message_id": -1,
"reaction_roles": {},
"transcript_channel_id": -1,
"ticket_category_id": -1,
"suggestion_channel_id": -1,
"players_status_channel_id": -1,
"ping_status_channel_id": -1,
"minecraft_server_domain_ip": "example.com",
"private_minecraft_server_ip": "number.number.number.number",
"private_minecraft_server_port": 25565,
"screenshot_command_enabled": false,
"server_name": "",
"token": ""
}

2
start.sh Executable file
View File

@@ -0,0 +1,2 @@
export PATH=$PATH:/opt/chrome
nohup python3 bot.py &

4
stop.sh Executable file
View File

@@ -0,0 +1,4 @@
process=($(ps -A | grep python3))
declare -p process
process_id=${process[0]}
kill $process_id

388
uv.lock generated Normal file
View File

@@ -0,0 +1,388 @@
version = 1
revision = 1
requires-python = ">=3.13"
[[package]]
name = "aiohappyeyeballs"
version = "2.6.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265 },
]
[[package]]
name = "aiohttp"
version = "3.11.14"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "aiohappyeyeballs" },
{ name = "aiosignal" },
{ name = "attrs" },
{ name = "frozenlist" },
{ name = "multidict" },
{ name = "propcache" },
{ name = "yarl" },
]
sdist = { url = "https://files.pythonhosted.org/packages/6c/96/91e93ae5fd04d428c101cdbabce6c820d284d61d2614d00518f4fa52ea24/aiohttp-3.11.14.tar.gz", hash = "sha256:d6edc538c7480fa0a3b2bdd705f8010062d74700198da55d16498e1b49549b9c", size = 7676994 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c5/8e/d7f353c5aaf9f868ab382c3d3320dc6efaa639b6b30d5a686bed83196115/aiohttp-3.11.14-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d14e274828561db91e4178f0057a915f3af1757b94c2ca283cb34cbb6e00b50", size = 698774 },
{ url = "https://files.pythonhosted.org/packages/d5/52/097b98d50f8550883f7d360c6cd4e77668c7442038671bb4b349ced95066/aiohttp-3.11.14-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f30fc72daf85486cdcdfc3f5e0aea9255493ef499e31582b34abadbfaafb0965", size = 461443 },
{ url = "https://files.pythonhosted.org/packages/2b/5c/19c84bb5796be6ca4fd1432012cfd5f88ec02c8b9e0357cdecc48ff2c4fd/aiohttp-3.11.14-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4edcbe34e6dba0136e4cabf7568f5a434d89cc9de5d5155371acda275353d228", size = 453717 },
{ url = "https://files.pythonhosted.org/packages/6d/08/61c2b6f04a4e1329c82ffda53dd0ac4b434681dc003578a1237d318be885/aiohttp-3.11.14-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a7169ded15505f55a87f8f0812c94c9412623c744227b9e51083a72a48b68a5", size = 1666559 },
{ url = "https://files.pythonhosted.org/packages/7c/22/913ad5b4b979ecf69300869551c210b2eb8c22ca4cd472824a1425479775/aiohttp-3.11.14-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad1f2fb9fe9b585ea4b436d6e998e71b50d2b087b694ab277b30e060c434e5db", size = 1721701 },
{ url = "https://files.pythonhosted.org/packages/5b/ea/0ee73ea764b2e1f769c1caf59f299ac017b50632ceaa809960385b68e735/aiohttp-3.11.14-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20412c7cc3720e47a47e63c0005f78c0c2370020f9f4770d7fc0075f397a9fb0", size = 1779094 },
{ url = "https://files.pythonhosted.org/packages/e6/ca/6ce3da7c3295e0655b3404a309c7002099ca3619aeb04d305cedc77a0a14/aiohttp-3.11.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dd9766da617855f7e85f27d2bf9a565ace04ba7c387323cd3e651ac4329db91", size = 1678406 },
{ url = "https://files.pythonhosted.org/packages/b1/b1/3a13ed54dc6bb57057cc94fec2a742f24a89885cfa84b71930826af40f5f/aiohttp-3.11.14-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:599b66582f7276ebefbaa38adf37585e636b6a7a73382eb412f7bc0fc55fb73d", size = 1604446 },
{ url = "https://files.pythonhosted.org/packages/00/21/fc9f327a121ff0be32ed4ec3ccca65f420549bf3a646b02f8534ba5fe86d/aiohttp-3.11.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b41693b7388324b80f9acfabd479bd1c84f0bc7e8f17bab4ecd9675e9ff9c734", size = 1619129 },
{ url = "https://files.pythonhosted.org/packages/56/5b/1a4a45b1f6f95b998c49d3d1e7763a75eeff29f2f5ec7e06d94a359e7d97/aiohttp-3.11.14-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:86135c32d06927339c8c5e64f96e4eee8825d928374b9b71a3c42379d7437058", size = 1657924 },
{ url = "https://files.pythonhosted.org/packages/2f/2d/b6211aa0664b87c93fda2f2f60d5211be514a2d5b4935e1286d54b8aa28d/aiohttp-3.11.14-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:04eb541ce1e03edc1e3be1917a0f45ac703e913c21a940111df73a2c2db11d73", size = 1617501 },
{ url = "https://files.pythonhosted.org/packages/fa/3d/d46ccb1f361a1275a078bfc1509bcd6dc6873e22306d10baa61bc77a0dfc/aiohttp-3.11.14-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dc311634f6f28661a76cbc1c28ecf3b3a70a8edd67b69288ab7ca91058eb5a33", size = 1684211 },
{ url = "https://files.pythonhosted.org/packages/2d/e2/71d12ee6268ad3bf4ee82a4f2fc7f0b943f480296cb6f61af1afe05b8d24/aiohttp-3.11.14-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:69bb252bfdca385ccabfd55f4cd740d421dd8c8ad438ded9637d81c228d0da49", size = 1715797 },
{ url = "https://files.pythonhosted.org/packages/8d/a7/d0de521dc5ca6e8c766f8d1f373c859925f10b2a96455b16107c1e9b2d60/aiohttp-3.11.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2b86efe23684b58a88e530c4ab5b20145f102916bbb2d82942cafec7bd36a647", size = 1673682 },
{ url = "https://files.pythonhosted.org/packages/f0/86/5c075ebeca7063a49a0da65a4e0aa9e49d741aca9a2fe9552d86906e159b/aiohttp-3.11.14-cp313-cp313-win32.whl", hash = "sha256:b9c60d1de973ca94af02053d9b5111c4fbf97158e139b14f1be68337be267be6", size = 411014 },
{ url = "https://files.pythonhosted.org/packages/4a/e0/2f9e77ef2d4a1dbf05f40b7edf1e1ce9be72bdbe6037cf1db1712b455e3e/aiohttp-3.11.14-cp313-cp313-win_amd64.whl", hash = "sha256:0a29be28e60e5610d2437b5b2fed61d6f3dcde898b57fb048aa5079271e7f6f3", size = 436964 },
]
[[package]]
name = "aiosignal"
version = "1.3.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "frozenlist" },
]
sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54", size = 19424 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597 },
]
[[package]]
name = "asyncio-dgram"
version = "2.2.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "setuptools" },
]
sdist = { url = "https://files.pythonhosted.org/packages/34/6b/7c3e984ef144c2a034bd7c881f2ae0516df8e8f845909f757a3ae04e5532/asyncio-dgram-2.2.0.tar.gz", hash = "sha256:73362b491786153d8b888936c5780548b40b4e6f5e0d62bfef956cb7b6ed9684", size = 11944 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/61/00/cb33d8a9ebad87c9507262b131c92659bcf62975320b7feb9acdfb260ba0/asyncio_dgram-2.2.0-py3-none-any.whl", hash = "sha256:7afe5a587d1d57908c7a02fe84c785f075d3fb59b555039a6ff8aead28622743", size = 7403 },
]
[[package]]
name = "attrs"
version = "25.3.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815 },
]
[[package]]
name = "audioop-lts"
version = "0.2.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/dd/3b/69ff8a885e4c1c42014c2765275c4bd91fe7bc9847e9d8543dbcbb09f820/audioop_lts-0.2.1.tar.gz", hash = "sha256:e81268da0baa880431b68b1308ab7257eb33f356e57a5f9b1f915dfb13dd1387", size = 30204 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/01/91/a219253cc6e92db2ebeaf5cf8197f71d995df6f6b16091d1f3ce62cb169d/audioop_lts-0.2.1-cp313-abi3-macosx_10_13_universal2.whl", hash = "sha256:fd1345ae99e17e6910f47ce7d52673c6a1a70820d78b67de1b7abb3af29c426a", size = 46252 },
{ url = "https://files.pythonhosted.org/packages/ec/f6/3cb21e0accd9e112d27cee3b1477cd04dafe88675c54ad8b0d56226c1e0b/audioop_lts-0.2.1-cp313-abi3-macosx_10_13_x86_64.whl", hash = "sha256:e175350da05d2087e12cea8e72a70a1a8b14a17e92ed2022952a4419689ede5e", size = 27183 },
{ url = "https://files.pythonhosted.org/packages/ea/7e/f94c8a6a8b2571694375b4cf94d3e5e0f529e8e6ba280fad4d8c70621f27/audioop_lts-0.2.1-cp313-abi3-macosx_11_0_arm64.whl", hash = "sha256:4a8dd6a81770f6ecf019c4b6d659e000dc26571b273953cef7cd1d5ce2ff3ae6", size = 26726 },
{ url = "https://files.pythonhosted.org/packages/ef/f8/a0e8e7a033b03fae2b16bc5aa48100b461c4f3a8a38af56d5ad579924a3a/audioop_lts-0.2.1-cp313-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1cd3c0b6f2ca25c7d2b1c3adeecbe23e65689839ba73331ebc7d893fcda7ffe", size = 80718 },
{ url = "https://files.pythonhosted.org/packages/8f/ea/a98ebd4ed631c93b8b8f2368862cd8084d75c77a697248c24437c36a6f7e/audioop_lts-0.2.1-cp313-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff3f97b3372c97782e9c6d3d7fdbe83bce8f70de719605bd7ee1839cd1ab360a", size = 88326 },
{ url = "https://files.pythonhosted.org/packages/33/79/e97a9f9daac0982aa92db1199339bd393594d9a4196ad95ae088635a105f/audioop_lts-0.2.1-cp313-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a351af79edefc2a1bd2234bfd8b339935f389209943043913a919df4b0f13300", size = 80539 },
{ url = "https://files.pythonhosted.org/packages/b2/d3/1051d80e6f2d6f4773f90c07e73743a1e19fcd31af58ff4e8ef0375d3a80/audioop_lts-0.2.1-cp313-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aeb6f96f7f6da80354330470b9134d81b4cf544cdd1c549f2f45fe964d28059", size = 78577 },
{ url = "https://files.pythonhosted.org/packages/7a/1d/54f4c58bae8dc8c64a75071c7e98e105ddaca35449376fcb0180f6e3c9df/audioop_lts-0.2.1-cp313-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c589f06407e8340e81962575fcffbba1e92671879a221186c3d4662de9fe804e", size = 82074 },
{ url = "https://files.pythonhosted.org/packages/36/89/2e78daa7cebbea57e72c0e1927413be4db675548a537cfba6a19040d52fa/audioop_lts-0.2.1-cp313-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fbae5d6925d7c26e712f0beda5ed69ebb40e14212c185d129b8dfbfcc335eb48", size = 84210 },
{ url = "https://files.pythonhosted.org/packages/a5/57/3ff8a74df2ec2fa6d2ae06ac86e4a27d6412dbb7d0e0d41024222744c7e0/audioop_lts-0.2.1-cp313-abi3-musllinux_1_2_i686.whl", hash = "sha256:d2d5434717f33117f29b5691fbdf142d36573d751716249a288fbb96ba26a281", size = 85664 },
{ url = "https://files.pythonhosted.org/packages/16/01/21cc4e5878f6edbc8e54be4c108d7cb9cb6202313cfe98e4ece6064580dd/audioop_lts-0.2.1-cp313-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:f626a01c0a186b08f7ff61431c01c055961ee28769591efa8800beadd27a2959", size = 93255 },
{ url = "https://files.pythonhosted.org/packages/3e/28/7f7418c362a899ac3b0bf13b1fde2d4ffccfdeb6a859abd26f2d142a1d58/audioop_lts-0.2.1-cp313-abi3-musllinux_1_2_s390x.whl", hash = "sha256:05da64e73837f88ee5c6217d732d2584cf638003ac72df124740460531e95e47", size = 87760 },
{ url = "https://files.pythonhosted.org/packages/6d/d8/577a8be87dc7dd2ba568895045cee7d32e81d85a7e44a29000fe02c4d9d4/audioop_lts-0.2.1-cp313-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:56b7a0a4dba8e353436f31a932f3045d108a67b5943b30f85a5563f4d8488d77", size = 84992 },
{ url = "https://files.pythonhosted.org/packages/ef/9a/4699b0c4fcf89936d2bfb5425f55f1a8b86dff4237cfcc104946c9cd9858/audioop_lts-0.2.1-cp313-abi3-win32.whl", hash = "sha256:6e899eb8874dc2413b11926b5fb3857ec0ab55222840e38016a6ba2ea9b7d5e3", size = 26059 },
{ url = "https://files.pythonhosted.org/packages/3a/1c/1f88e9c5dd4785a547ce5fd1eb83fff832c00cc0e15c04c1119b02582d06/audioop_lts-0.2.1-cp313-abi3-win_amd64.whl", hash = "sha256:64562c5c771fb0a8b6262829b9b4f37a7b886c01b4d3ecdbae1d629717db08b4", size = 30412 },
{ url = "https://files.pythonhosted.org/packages/c4/e9/c123fd29d89a6402ad261516f848437472ccc602abb59bba522af45e281b/audioop_lts-0.2.1-cp313-abi3-win_arm64.whl", hash = "sha256:c45317debeb64002e980077642afbd977773a25fa3dfd7ed0c84dccfc1fafcb0", size = 23578 },
{ url = "https://files.pythonhosted.org/packages/7a/99/bb664a99561fd4266687e5cb8965e6ec31ba4ff7002c3fce3dc5ef2709db/audioop_lts-0.2.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:3827e3fce6fee4d69d96a3d00cd2ab07f3c0d844cb1e44e26f719b34a5b15455", size = 46827 },
{ url = "https://files.pythonhosted.org/packages/c4/e3/f664171e867e0768ab982715e744430cf323f1282eb2e11ebfb6ee4c4551/audioop_lts-0.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:161249db9343b3c9780ca92c0be0d1ccbfecdbccac6844f3d0d44b9c4a00a17f", size = 27479 },
{ url = "https://files.pythonhosted.org/packages/a6/0d/2a79231ff54eb20e83b47e7610462ad6a2bea4e113fae5aa91c6547e7764/audioop_lts-0.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5b7b4ff9de7a44e0ad2618afdc2ac920b91f4a6d3509520ee65339d4acde5abf", size = 27056 },
{ url = "https://files.pythonhosted.org/packages/86/46/342471398283bb0634f5a6df947806a423ba74b2e29e250c7ec0e3720e4f/audioop_lts-0.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e37f416adb43b0ced93419de0122b42753ee74e87070777b53c5d2241e7fab", size = 87802 },
{ url = "https://files.pythonhosted.org/packages/56/44/7a85b08d4ed55517634ff19ddfbd0af05bf8bfd39a204e4445cd0e6f0cc9/audioop_lts-0.2.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:534ce808e6bab6adb65548723c8cbe189a3379245db89b9d555c4210b4aaa9b6", size = 95016 },
{ url = "https://files.pythonhosted.org/packages/a8/2a/45edbca97ea9ee9e6bbbdb8d25613a36e16a4d1e14ae01557392f15cc8d3/audioop_lts-0.2.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2de9b6fb8b1cf9f03990b299a9112bfdf8b86b6987003ca9e8a6c4f56d39543", size = 87394 },
{ url = "https://files.pythonhosted.org/packages/14/ae/832bcbbef2c510629593bf46739374174606e25ac7d106b08d396b74c964/audioop_lts-0.2.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f24865991b5ed4b038add5edbf424639d1358144f4e2a3e7a84bc6ba23e35074", size = 84874 },
{ url = "https://files.pythonhosted.org/packages/26/1c/8023c3490798ed2f90dfe58ec3b26d7520a243ae9c0fc751ed3c9d8dbb69/audioop_lts-0.2.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bdb3b7912ccd57ea53197943f1bbc67262dcf29802c4a6df79ec1c715d45a78", size = 88698 },
{ url = "https://files.pythonhosted.org/packages/2c/db/5379d953d4918278b1f04a5a64b2c112bd7aae8f81021009da0dcb77173c/audioop_lts-0.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:120678b208cca1158f0a12d667af592e067f7a50df9adc4dc8f6ad8d065a93fb", size = 90401 },
{ url = "https://files.pythonhosted.org/packages/99/6e/3c45d316705ab1aec2e69543a5b5e458d0d112a93d08994347fafef03d50/audioop_lts-0.2.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:54cd4520fc830b23c7d223693ed3e1b4d464997dd3abc7c15dce9a1f9bd76ab2", size = 91864 },
{ url = "https://files.pythonhosted.org/packages/08/58/6a371d8fed4f34debdb532c0b00942a84ebf3e7ad368e5edc26931d0e251/audioop_lts-0.2.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:d6bd20c7a10abcb0fb3d8aaa7508c0bf3d40dfad7515c572014da4b979d3310a", size = 98796 },
{ url = "https://files.pythonhosted.org/packages/ee/77/d637aa35497e0034ff846fd3330d1db26bc6fd9dd79c406e1341188b06a2/audioop_lts-0.2.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:f0ed1ad9bd862539ea875fb339ecb18fcc4148f8d9908f4502df28f94d23491a", size = 94116 },
{ url = "https://files.pythonhosted.org/packages/1a/60/7afc2abf46bbcf525a6ebc0305d85ab08dc2d1e2da72c48dbb35eee5b62c/audioop_lts-0.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e1af3ff32b8c38a7d900382646e91f2fc515fd19dea37e9392275a5cbfdbff63", size = 91520 },
{ url = "https://files.pythonhosted.org/packages/65/6d/42d40da100be1afb661fd77c2b1c0dfab08af1540df57533621aea3db52a/audioop_lts-0.2.1-cp313-cp313t-win32.whl", hash = "sha256:f51bb55122a89f7a0817d7ac2319744b4640b5b446c4c3efcea5764ea99ae509", size = 26482 },
{ url = "https://files.pythonhosted.org/packages/01/09/f08494dca79f65212f5b273aecc5a2f96691bf3307cac29acfcf84300c01/audioop_lts-0.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f0f2f336aa2aee2bce0b0dcc32bbba9178995454c7b979cf6ce086a8801e14c7", size = 30780 },
{ url = "https://files.pythonhosted.org/packages/5d/35/be73b6015511aa0173ec595fc579133b797ad532996f2998fd6b8d1bbe6b/audioop_lts-0.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:78bfb3703388c780edf900be66e07de5a3d4105ca8e8720c5c4d67927e0b15d0", size = 23918 },
]
[[package]]
name = "cffi"
version = "1.17.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pycparser" },
]
sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 },
{ url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 },
{ url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 },
{ url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 },
{ url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 },
{ url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 },
{ url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 },
{ url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 },
{ url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 },
{ url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 },
{ url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 },
]
[[package]]
name = "dnspython"
version = "2.7.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1", size = 345197 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632 },
]
[[package]]
name = "frozenlist"
version = "1.5.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/8f/ed/0f4cec13a93c02c47ec32d81d11c0c1efbadf4a471e3f3ce7cad366cbbd3/frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817", size = 39930 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/da/3b/915f0bca8a7ea04483622e84a9bd90033bab54bdf485479556c74fd5eaf5/frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953", size = 91538 },
{ url = "https://files.pythonhosted.org/packages/c7/d1/a7c98aad7e44afe5306a2b068434a5830f1470675f0e715abb86eb15f15b/frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0", size = 52849 },
{ url = "https://files.pythonhosted.org/packages/3a/c8/76f23bf9ab15d5f760eb48701909645f686f9c64fbb8982674c241fbef14/frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2", size = 50583 },
{ url = "https://files.pythonhosted.org/packages/1f/22/462a3dd093d11df623179d7754a3b3269de3b42de2808cddef50ee0f4f48/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f", size = 265636 },
{ url = "https://files.pythonhosted.org/packages/80/cf/e075e407fc2ae7328155a1cd7e22f932773c8073c1fc78016607d19cc3e5/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608", size = 270214 },
{ url = "https://files.pythonhosted.org/packages/a1/58/0642d061d5de779f39c50cbb00df49682832923f3d2ebfb0fedf02d05f7f/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b", size = 273905 },
{ url = "https://files.pythonhosted.org/packages/ab/66/3fe0f5f8f2add5b4ab7aa4e199f767fd3b55da26e3ca4ce2cc36698e50c4/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840", size = 250542 },
{ url = "https://files.pythonhosted.org/packages/f6/b8/260791bde9198c87a465224e0e2bb62c4e716f5d198fc3a1dacc4895dbd1/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439", size = 267026 },
{ url = "https://files.pythonhosted.org/packages/2e/a4/3d24f88c527f08f8d44ade24eaee83b2627793fa62fa07cbb7ff7a2f7d42/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de", size = 257690 },
{ url = "https://files.pythonhosted.org/packages/de/9a/d311d660420b2beeff3459b6626f2ab4fb236d07afbdac034a4371fe696e/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641", size = 253893 },
{ url = "https://files.pythonhosted.org/packages/c6/23/e491aadc25b56eabd0f18c53bb19f3cdc6de30b2129ee0bc39cd387cd560/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e", size = 267006 },
{ url = "https://files.pythonhosted.org/packages/08/c4/ab918ce636a35fb974d13d666dcbe03969592aeca6c3ab3835acff01f79c/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9", size = 276157 },
{ url = "https://files.pythonhosted.org/packages/c0/29/3b7a0bbbbe5a34833ba26f686aabfe982924adbdcafdc294a7a129c31688/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03", size = 264642 },
{ url = "https://files.pythonhosted.org/packages/ab/42/0595b3dbffc2e82d7fe658c12d5a5bafcd7516c6bf2d1d1feb5387caa9c1/frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c", size = 44914 },
{ url = "https://files.pythonhosted.org/packages/17/c4/b7db1206a3fea44bf3b838ca61deb6f74424a8a5db1dd53ecb21da669be6/frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28", size = 51167 },
{ url = "https://files.pythonhosted.org/packages/c6/c8/a5be5b7550c10858fcf9b0ea054baccab474da77d37f1e828ce043a3a5d4/frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", size = 11901 },
]
[[package]]
name = "idna"
version = "3.10"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
]
[[package]]
name = "mc-bot"
version = "0.1.0"
source = { virtual = "." }
dependencies = [
{ name = "audioop-lts" },
{ name = "mcstatus" },
{ name = "py-cord", extra = ["voice"] },
{ name = "pytz" },
]
[package.metadata]
requires-dist = [
{ name = "audioop-lts", specifier = ">=0.2.1" },
{ name = "mcstatus", specifier = ">=11.1.1" },
{ name = "py-cord", extras = ["voice"], specifier = ">=2.6.1" },
{ name = "pytz", specifier = ">=2025.2" },
]
[[package]]
name = "mcstatus"
version = "11.1.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "asyncio-dgram" },
{ name = "dnspython" },
]
sdist = { url = "https://files.pythonhosted.org/packages/ff/ad/2d0b0cdde02cb505221d5078c91c8123fbc5e467b56983b2321e45bb1858/mcstatus-11.1.1.tar.gz", hash = "sha256:b2856ee4032faf810b0c6af10a141381e6115caf14a7348c47edc8e3da84f5d4", size = 32949 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/eb/f2/a39110f7982e5903314cb73912541932b13b9f95b010a81173854350121d/mcstatus-11.1.1-py3-none-any.whl", hash = "sha256:7f5f7f44fa1d17c4e05c0ae94ecc114d9d146ef572e7dd9f2d9da72771ce135c", size = 37422 },
]
[[package]]
name = "multidict"
version = "6.2.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/82/4a/7874ca44a1c9b23796c767dd94159f6c17e31c0e7d090552a1c623247d82/multidict-6.2.0.tar.gz", hash = "sha256:0085b0afb2446e57050140240a8595846ed64d1cbd26cef936bfab3192c673b8", size = 71066 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/a4/6c/5df5590b1f9a821154589df62ceae247537b01ab26b0aa85997c35ca3d9e/multidict-6.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5c5e7d2e300d5cb3b2693b6d60d3e8c8e7dd4ebe27cd17c9cb57020cac0acb80", size = 49151 },
{ url = "https://files.pythonhosted.org/packages/d5/ca/c917fbf1be989cd7ea9caa6f87e9c33844ba8d5fbb29cd515d4d2833b84c/multidict-6.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:256d431fe4583c5f1e0f2e9c4d9c22f3a04ae96009b8cfa096da3a8723db0a16", size = 29803 },
{ url = "https://files.pythonhosted.org/packages/22/19/d97086fc96f73acf36d4dbe65c2c4175911969df49c4e94ef082be59d94e/multidict-6.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a3c0ff89fe40a152e77b191b83282c9664357dce3004032d42e68c514ceff27e", size = 29947 },
{ url = "https://files.pythonhosted.org/packages/e3/3b/203476b6e915c3f51616d5f87230c556e2f24b168c14818a3d8dae242b1b/multidict-6.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef7d48207926edbf8b16b336f779c557dd8f5a33035a85db9c4b0febb0706817", size = 130369 },
{ url = "https://files.pythonhosted.org/packages/c6/4f/67470007cf03b2bb6df8ae6d716a8eeb0a7d19e0c8dba4e53fa338883bca/multidict-6.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3c099d3899b14e1ce52262eb82a5f5cb92157bb5106bf627b618c090a0eadc", size = 135231 },
{ url = "https://files.pythonhosted.org/packages/6d/f5/7a5ce64dc9a3fecc7d67d0b5cb9c262c67e0b660639e5742c13af63fd80f/multidict-6.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e16e7297f29a544f49340012d6fc08cf14de0ab361c9eb7529f6a57a30cbfda1", size = 133634 },
{ url = "https://files.pythonhosted.org/packages/05/93/ab2931907e318c0437a4cd156c9cfff317ffb33d99ebbfe2d64200a870f7/multidict-6.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:042028348dc5a1f2be6c666437042a98a5d24cee50380f4c0902215e5ec41844", size = 131349 },
{ url = "https://files.pythonhosted.org/packages/54/aa/ab8eda83a6a85f5b4bb0b1c28e62b18129b14519ef2e0d4cfd5f360da73c/multidict-6.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:08549895e6a799bd551cf276f6e59820aa084f0f90665c0f03dd3a50db5d3c48", size = 120861 },
{ url = "https://files.pythonhosted.org/packages/15/2f/7d08ea7c5d9f45786893b4848fad59ec8ea567367d4234691a721e4049a1/multidict-6.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4ccfd74957ef53fa7380aaa1c961f523d582cd5e85a620880ffabd407f8202c0", size = 134611 },
{ url = "https://files.pythonhosted.org/packages/8b/07/387047bb1eac563981d397a7f85c75b306df1fff3c20b90da5a6cf6e487e/multidict-6.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83b78c680d4b15d33042d330c2fa31813ca3974197bddb3836a5c635a5fd013f", size = 128955 },
{ url = "https://files.pythonhosted.org/packages/8d/6e/7ae18f764a5282c2d682f1c90c6b2a0f6490327730170139a7a63bf3bb20/multidict-6.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b4c153863dd6569f6511845922c53e39c8d61f6e81f228ad5443e690fca403de", size = 139759 },
{ url = "https://files.pythonhosted.org/packages/b6/f4/c1b3b087b9379b9e56229bcf6570b9a963975c205a5811ac717284890598/multidict-6.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:98aa8325c7f47183b45588af9c434533196e241be0a4e4ae2190b06d17675c02", size = 136426 },
{ url = "https://files.pythonhosted.org/packages/a2/0e/ef7b39b161ffd40f9e25dd62e59644b2ccaa814c64e9573f9bc721578419/multidict-6.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9e658d1373c424457ddf6d55ec1db93c280b8579276bebd1f72f113072df8a5d", size = 134648 },
{ url = "https://files.pythonhosted.org/packages/37/5c/7905acd0ca411c97bcae62ab167d9922f0c5a1d316b6d3af875d4bda3551/multidict-6.2.0-cp313-cp313-win32.whl", hash = "sha256:3157126b028c074951839233647bd0e30df77ef1fedd801b48bdcad242a60f4e", size = 26680 },
{ url = "https://files.pythonhosted.org/packages/89/36/96b071d1dad6ac44fe517e4250329e753787bb7a63967ef44bb9b3a659f6/multidict-6.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:2e87f1926e91855ae61769ba3e3f7315120788c099677e0842e697b0bfb659f2", size = 28942 },
{ url = "https://files.pythonhosted.org/packages/f5/05/d686cd2a12d648ecd434675ee8daa2901a80f477817e89ab3b160de5b398/multidict-6.2.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:2529ddbdaa424b2c6c2eb668ea684dd6b75b839d0ad4b21aad60c168269478d7", size = 50807 },
{ url = "https://files.pythonhosted.org/packages/4c/1f/c7db5aac8fea129fa4c5a119e3d279da48d769138ae9624d1234aa01a06f/multidict-6.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:13551d0e2d7201f0959725a6a769b6f7b9019a168ed96006479c9ac33fe4096b", size = 30474 },
{ url = "https://files.pythonhosted.org/packages/e5/f1/1fb27514f4d73cea165429dcb7d90cdc4a45445865832caa0c50dd545420/multidict-6.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d1996ee1330e245cd3aeda0887b4409e3930524c27642b046e4fae88ffa66c5e", size = 30841 },
{ url = "https://files.pythonhosted.org/packages/d6/6b/9487169e549a23c8958edbb332afaf1ab55d61f0c03cb758ee07ff8f74fb/multidict-6.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c537da54ce4ff7c15e78ab1292e5799d0d43a2108e006578a57f531866f64025", size = 148658 },
{ url = "https://files.pythonhosted.org/packages/d7/22/79ebb2e4f70857c94999ce195db76886ae287b1b6102da73df24dcad4903/multidict-6.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f249badb360b0b4d694307ad40f811f83df4da8cef7b68e429e4eea939e49dd", size = 151988 },
{ url = "https://files.pythonhosted.org/packages/49/5d/63b17f3c1a2861587d26705923a94eb6b2600e5222d6b0d513bce5a78720/multidict-6.2.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48d39b1824b8d6ea7de878ef6226efbe0773f9c64333e1125e0efcfdd18a24c7", size = 148432 },
{ url = "https://files.pythonhosted.org/packages/a3/22/55204eec45c4280fa431c11494ad64d6da0dc89af76282fc6467432360a0/multidict-6.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b99aac6bb2c37db336fa03a39b40ed4ef2818bf2dfb9441458165ebe88b793af", size = 143161 },
{ url = "https://files.pythonhosted.org/packages/97/e6/202b2cf5af161228767acab8bc49e73a91f4a7de088c9c71f3c02950a030/multidict-6.2.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07bfa8bc649783e703263f783f73e27fef8cd37baaad4389816cf6a133141331", size = 136820 },
{ url = "https://files.pythonhosted.org/packages/7d/16/dbedae0e94c7edc48fddef0c39483f2313205d9bc566fd7f11777b168616/multidict-6.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b2c00ad31fbc2cbac85d7d0fcf90853b2ca2e69d825a2d3f3edb842ef1544a2c", size = 150875 },
{ url = "https://files.pythonhosted.org/packages/f3/04/38ccf25d4bf8beef76a22bad7d9833fd088b4594c9765fe6fede39aa6c89/multidict-6.2.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:0d57a01a2a9fa00234aace434d8c131f0ac6e0ac6ef131eda5962d7e79edfb5b", size = 142050 },
{ url = "https://files.pythonhosted.org/packages/9e/89/4f6b43386e7b79a4aad560d751981a0a282a1943c312ac72f940d7cf8f9f/multidict-6.2.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:abf5b17bc0cf626a8a497d89ac691308dbd825d2ac372aa990b1ca114e470151", size = 154117 },
{ url = "https://files.pythonhosted.org/packages/24/e3/3dde5b193f86d30ad6400bd50e116b0df1da3f0c7d419661e3bd79e5ad86/multidict-6.2.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:f7716f7e7138252d88607228ce40be22660d6608d20fd365d596e7ca0738e019", size = 149408 },
{ url = "https://files.pythonhosted.org/packages/df/b2/ec1e27e8e3da12fcc9053e1eae2f6b50faa8708064d83ea25aa7fb77ffd2/multidict-6.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d5a36953389f35f0a4e88dc796048829a2f467c9197265504593f0e420571547", size = 145767 },
{ url = "https://files.pythonhosted.org/packages/3a/8e/c07a648a9d592fa9f3a19d1c7e1c7738ba95aff90db967a5a09cff1e1f37/multidict-6.2.0-cp313-cp313t-win32.whl", hash = "sha256:e653d36b1bf48fa78c7fcebb5fa679342e025121ace8c87ab05c1cefd33b34fc", size = 28950 },
{ url = "https://files.pythonhosted.org/packages/dc/a9/bebb5485b94d7c09831638a4df9a1a924c32431a750723f0bf39cd16a787/multidict-6.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ca23db5fb195b5ef4fd1f77ce26cadefdf13dba71dab14dadd29b34d457d7c44", size = 32001 },
{ url = "https://files.pythonhosted.org/packages/9c/fd/b247aec6add5601956d440488b7f23151d8343747e82c038af37b28d6098/multidict-6.2.0-py3-none-any.whl", hash = "sha256:5d26547423e5e71dcc562c4acdc134b900640a39abd9066d7326a7cc2324c530", size = 10266 },
]
[[package]]
name = "propcache"
version = "0.3.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/07/c8/fdc6686a986feae3541ea23dcaa661bd93972d3940460646c6bb96e21c40/propcache-0.3.1.tar.gz", hash = "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf", size = 43651 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/58/60/f645cc8b570f99be3cf46714170c2de4b4c9d6b827b912811eff1eb8a412/propcache-0.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8", size = 77865 },
{ url = "https://files.pythonhosted.org/packages/6f/d4/c1adbf3901537582e65cf90fd9c26fde1298fde5a2c593f987112c0d0798/propcache-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f", size = 45452 },
{ url = "https://files.pythonhosted.org/packages/d1/b5/fe752b2e63f49f727c6c1c224175d21b7d1727ce1d4873ef1c24c9216830/propcache-0.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111", size = 44800 },
{ url = "https://files.pythonhosted.org/packages/62/37/fc357e345bc1971e21f76597028b059c3d795c5ca7690d7a8d9a03c9708a/propcache-0.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5", size = 225804 },
{ url = "https://files.pythonhosted.org/packages/0d/f1/16e12c33e3dbe7f8b737809bad05719cff1dccb8df4dafbcff5575002c0e/propcache-0.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb", size = 230650 },
{ url = "https://files.pythonhosted.org/packages/3e/a2/018b9f2ed876bf5091e60153f727e8f9073d97573f790ff7cdf6bc1d1fb8/propcache-0.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7", size = 234235 },
{ url = "https://files.pythonhosted.org/packages/45/5f/3faee66fc930dfb5da509e34c6ac7128870631c0e3582987fad161fcb4b1/propcache-0.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120", size = 228249 },
{ url = "https://files.pythonhosted.org/packages/62/1e/a0d5ebda5da7ff34d2f5259a3e171a94be83c41eb1e7cd21a2105a84a02e/propcache-0.3.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654", size = 214964 },
{ url = "https://files.pythonhosted.org/packages/db/a0/d72da3f61ceab126e9be1f3bc7844b4e98c6e61c985097474668e7e52152/propcache-0.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e", size = 222501 },
{ url = "https://files.pythonhosted.org/packages/18/6d/a008e07ad7b905011253adbbd97e5b5375c33f0b961355ca0a30377504ac/propcache-0.3.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b", size = 217917 },
{ url = "https://files.pythonhosted.org/packages/98/37/02c9343ffe59e590e0e56dc5c97d0da2b8b19fa747ebacf158310f97a79a/propcache-0.3.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53", size = 217089 },
{ url = "https://files.pythonhosted.org/packages/53/1b/d3406629a2c8a5666d4674c50f757a77be119b113eedd47b0375afdf1b42/propcache-0.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5", size = 228102 },
{ url = "https://files.pythonhosted.org/packages/cd/a7/3664756cf50ce739e5f3abd48febc0be1a713b1f389a502ca819791a6b69/propcache-0.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7", size = 230122 },
{ url = "https://files.pythonhosted.org/packages/35/36/0bbabaacdcc26dac4f8139625e930f4311864251276033a52fd52ff2a274/propcache-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef", size = 226818 },
{ url = "https://files.pythonhosted.org/packages/cc/27/4e0ef21084b53bd35d4dae1634b6d0bad35e9c58ed4f032511acca9d4d26/propcache-0.3.1-cp313-cp313-win32.whl", hash = "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24", size = 40112 },
{ url = "https://files.pythonhosted.org/packages/a6/2c/a54614d61895ba6dd7ac8f107e2b2a0347259ab29cbf2ecc7b94fa38c4dc/propcache-0.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037", size = 44034 },
{ url = "https://files.pythonhosted.org/packages/5a/a8/0a4fd2f664fc6acc66438370905124ce62e84e2e860f2557015ee4a61c7e/propcache-0.3.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f", size = 82613 },
{ url = "https://files.pythonhosted.org/packages/4d/e5/5ef30eb2cd81576256d7b6caaa0ce33cd1d2c2c92c8903cccb1af1a4ff2f/propcache-0.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c", size = 47763 },
{ url = "https://files.pythonhosted.org/packages/87/9a/87091ceb048efeba4d28e903c0b15bcc84b7c0bf27dc0261e62335d9b7b8/propcache-0.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc", size = 47175 },
{ url = "https://files.pythonhosted.org/packages/3e/2f/854e653c96ad1161f96194c6678a41bbb38c7947d17768e8811a77635a08/propcache-0.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de", size = 292265 },
{ url = "https://files.pythonhosted.org/packages/40/8d/090955e13ed06bc3496ba4a9fb26c62e209ac41973cb0d6222de20c6868f/propcache-0.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6", size = 294412 },
{ url = "https://files.pythonhosted.org/packages/39/e6/d51601342e53cc7582449e6a3c14a0479fab2f0750c1f4d22302e34219c6/propcache-0.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7", size = 294290 },
{ url = "https://files.pythonhosted.org/packages/3b/4d/be5f1a90abc1881884aa5878989a1acdafd379a91d9c7e5e12cef37ec0d7/propcache-0.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458", size = 282926 },
{ url = "https://files.pythonhosted.org/packages/57/2b/8f61b998c7ea93a2b7eca79e53f3e903db1787fca9373af9e2cf8dc22f9d/propcache-0.3.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11", size = 267808 },
{ url = "https://files.pythonhosted.org/packages/11/1c/311326c3dfce59c58a6098388ba984b0e5fb0381ef2279ec458ef99bd547/propcache-0.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c", size = 290916 },
{ url = "https://files.pythonhosted.org/packages/4b/74/91939924b0385e54dc48eb2e4edd1e4903ffd053cf1916ebc5347ac227f7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf", size = 262661 },
{ url = "https://files.pythonhosted.org/packages/c2/d7/e6079af45136ad325c5337f5dd9ef97ab5dc349e0ff362fe5c5db95e2454/propcache-0.3.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27", size = 264384 },
{ url = "https://files.pythonhosted.org/packages/b7/d5/ba91702207ac61ae6f1c2da81c5d0d6bf6ce89e08a2b4d44e411c0bbe867/propcache-0.3.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757", size = 291420 },
{ url = "https://files.pythonhosted.org/packages/58/70/2117780ed7edcd7ba6b8134cb7802aada90b894a9810ec56b7bb6018bee7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18", size = 290880 },
{ url = "https://files.pythonhosted.org/packages/4a/1f/ecd9ce27710021ae623631c0146719280a929d895a095f6d85efb6a0be2e/propcache-0.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a", size = 287407 },
{ url = "https://files.pythonhosted.org/packages/3e/66/2e90547d6b60180fb29e23dc87bd8c116517d4255240ec6d3f7dc23d1926/propcache-0.3.1-cp313-cp313t-win32.whl", hash = "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d", size = 42573 },
{ url = "https://files.pythonhosted.org/packages/cb/8f/50ad8599399d1861b4d2b6b45271f0ef6af1b09b0a2386a46dbaf19c9535/propcache-0.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e", size = 46757 },
{ url = "https://files.pythonhosted.org/packages/b8/d3/c3cb8f1d6ae3b37f83e1de806713a9b3642c5895f0215a62e1a4bd6e5e34/propcache-0.3.1-py3-none-any.whl", hash = "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", size = 12376 },
]
[[package]]
name = "py-cord"
version = "2.6.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "aiohttp" },
]
sdist = { url = "https://files.pythonhosted.org/packages/27/c7/c539d69d5cfa1ea5891d596212f73d619e40c7fc9f02ae906f4147993b94/py_cord-2.6.1.tar.gz", hash = "sha256:36064f225f2c7bbddfe542d5ed581f2a5744f618e039093cf7cd2659a58bc79b", size = 965087 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/e7/90/2690ded84e34b15ca2619932a358c1b7dc6d28fe845dfbd01929fc33c9da/py_cord-2.6.1-py3-none-any.whl", hash = "sha256:e3d3b528c5e37b0e0825f5b884cbb9267860976c1e4878e28b55da8fd3af834b", size = 1089154 },
]
[package.optional-dependencies]
voice = [
{ name = "pynacl" },
]
[[package]]
name = "pycparser"
version = "2.22"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 },
]
[[package]]
name = "pynacl"
version = "1.5.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "cffi" },
]
sdist = { url = "https://files.pythonhosted.org/packages/a7/22/27582568be639dfe22ddb3902225f91f2f17ceff88ce80e4db396c8986da/PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba", size = 3392854 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/ce/75/0b8ede18506041c0bf23ac4d8e2971b4161cd6ce630b177d0a08eb0d8857/PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1", size = 349920 },
{ url = "https://files.pythonhosted.org/packages/59/bb/fddf10acd09637327a97ef89d2a9d621328850a72f1fdc8c08bdf72e385f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92", size = 601722 },
{ url = "https://files.pythonhosted.org/packages/5d/70/87a065c37cca41a75f2ce113a5a2c2aa7533be648b184ade58971b5f7ccc/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394", size = 680087 },
{ url = "https://files.pythonhosted.org/packages/ee/87/f1bb6a595f14a327e8285b9eb54d41fef76c585a0edef0a45f6fc95de125/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d", size = 856678 },
{ url = "https://files.pythonhosted.org/packages/66/28/ca86676b69bf9f90e710571b67450508484388bfce09acf8a46f0b8c785f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858", size = 1133660 },
{ url = "https://files.pythonhosted.org/packages/3d/85/c262db650e86812585e2bc59e497a8f59948a005325a11bbbc9ecd3fe26b/PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b", size = 663824 },
{ url = "https://files.pythonhosted.org/packages/fd/1a/cc308a884bd299b651f1633acb978e8596c71c33ca85e9dc9fa33a5399b9/PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff", size = 1117912 },
{ url = "https://files.pythonhosted.org/packages/25/2d/b7df6ddb0c2a33afdb358f8af6ea3b8c4d1196ca45497dd37a56f0c122be/PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543", size = 204624 },
{ url = "https://files.pythonhosted.org/packages/5e/22/d3db169895faaf3e2eda892f005f433a62db2decbcfbc2f61e6517adfa87/PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93", size = 212141 },
]
[[package]]
name = "pytz"
version = "2025.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225 },
]
[[package]]
name = "setuptools"
version = "78.1.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/a9/5a/0db4da3bc908df06e5efae42b44e75c81dd52716e10192ff36d0c1c8e379/setuptools-78.1.0.tar.gz", hash = "sha256:18fd474d4a82a5f83dac888df697af65afa82dec7323d09c3e37d1f14288da54", size = 1367827 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/54/21/f43f0a1fa8b06b32812e0975981f4677d28e0f3271601dc88ac5a5b83220/setuptools-78.1.0-py3-none-any.whl", hash = "sha256:3e386e96793c8702ae83d17b853fb93d3e09ef82ec62722e61da5cd22376dcd8", size = 1256108 },
]
[[package]]
name = "yarl"
version = "1.18.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "idna" },
{ name = "multidict" },
{ name = "propcache" },
]
sdist = { url = "https://files.pythonhosted.org/packages/b7/9d/4b94a8e6d2b51b599516a5cb88e5bc99b4d8d4583e468057eaa29d5f0918/yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1", size = 181062 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/30/c7/c790513d5328a8390be8f47be5d52e141f78b66c6c48f48d241ca6bd5265/yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb", size = 140789 },
{ url = "https://files.pythonhosted.org/packages/30/aa/a2f84e93554a578463e2edaaf2300faa61c8701f0898725842c704ba5444/yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa", size = 94144 },
{ url = "https://files.pythonhosted.org/packages/c6/fc/d68d8f83714b221a85ce7866832cba36d7c04a68fa6a960b908c2c84f325/yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782", size = 91974 },
{ url = "https://files.pythonhosted.org/packages/56/4e/d2563d8323a7e9a414b5b25341b3942af5902a2263d36d20fb17c40411e2/yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0", size = 333587 },
{ url = "https://files.pythonhosted.org/packages/25/c9/cfec0bc0cac8d054be223e9f2c7909d3e8442a856af9dbce7e3442a8ec8d/yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482", size = 344386 },
{ url = "https://files.pythonhosted.org/packages/ab/5d/4c532190113b25f1364d25f4c319322e86232d69175b91f27e3ebc2caf9a/yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186", size = 345421 },
{ url = "https://files.pythonhosted.org/packages/23/d1/6cdd1632da013aa6ba18cee4d750d953104a5e7aac44e249d9410a972bf5/yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58", size = 339384 },
{ url = "https://files.pythonhosted.org/packages/9a/c4/6b3c39bec352e441bd30f432cda6ba51681ab19bb8abe023f0d19777aad1/yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53", size = 326689 },
{ url = "https://files.pythonhosted.org/packages/23/30/07fb088f2eefdc0aa4fc1af4e3ca4eb1a3aadd1ce7d866d74c0f124e6a85/yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2", size = 345453 },
{ url = "https://files.pythonhosted.org/packages/63/09/d54befb48f9cd8eec43797f624ec37783a0266855f4930a91e3d5c7717f8/yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8", size = 341872 },
{ url = "https://files.pythonhosted.org/packages/91/26/fd0ef9bf29dd906a84b59f0cd1281e65b0c3e08c6aa94b57f7d11f593518/yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1", size = 347497 },
{ url = "https://files.pythonhosted.org/packages/d9/b5/14ac7a256d0511b2ac168d50d4b7d744aea1c1aa20c79f620d1059aab8b2/yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a", size = 359981 },
{ url = "https://files.pythonhosted.org/packages/ca/b3/d493221ad5cbd18bc07e642894030437e405e1413c4236dd5db6e46bcec9/yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10", size = 366229 },
{ url = "https://files.pythonhosted.org/packages/04/56/6a3e2a5d9152c56c346df9b8fb8edd2c8888b1e03f96324d457e5cf06d34/yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8", size = 360383 },
{ url = "https://files.pythonhosted.org/packages/fd/b7/4b3c7c7913a278d445cc6284e59b2e62fa25e72758f888b7a7a39eb8423f/yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d", size = 310152 },
{ url = "https://files.pythonhosted.org/packages/f5/d5/688db678e987c3e0fb17867970700b92603cadf36c56e5fb08f23e822a0c/yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c", size = 315723 },
{ url = "https://files.pythonhosted.org/packages/f5/4b/a06e0ec3d155924f77835ed2d167ebd3b211a7b0853da1cf8d8414d784ef/yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b", size = 45109 },
]

3
values.json Normal file
View File

@@ -0,0 +1,3 @@
{
"ticket_number": 1
}

1
warns.json Normal file
View File

@@ -0,0 +1 @@
{}