Use modern Discord Ui stuff, fix time zones and, fix Dockerfile
Changes: Use buttons, pagination and modals instead of old text-based stuff Fix time zones (Closes #23) Fix Dockerfile Replace Discord.py with discord-py-interactions Default time zone is now UTC instead of Europe/Stockholm Replace /remind resume /remind pause /remind remove /remind modify with /remind list
This commit is contained in:
26
CHANGELOG.md
26
CHANGELOG.md
@ -1,9 +1,29 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
All notable changes to discord-reminder-bot will be documented in this file.
|
## [1.0.0] - 2022-09-17
|
||||||
|
|
||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
### Added
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
||||||
|
- Added tests for checking if timezones are working correctly
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Bot is now using [discord-py-interactions](https://github.com/interactions-py/library) instead of
|
||||||
|
[discord-py-slash-command](https://github.com/interactions-py/library/tree/legacy-v3) and [discord.py]
|
||||||
|
(https://github.com/Rapptz/discord.py).
|
||||||
|
- `/remind pause`, `/remind resume`, `/remind delete`, and `/remind modify` are now buttons under `/remind list`.
|
||||||
|
- `/remind list` uses pagination now.
|
||||||
|
- `/remind modify` uses a modal now.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- [Dockerfile](/Dockerfile) was broken, now it is fixed. (Thanks to [FirosStuart](https://github.com/FirosStuart)
|
||||||
|
for the fix)
|
||||||
|
- Timezones are now handled correctly. (Thanks to [FirosStuart](https://github.com/FirosStuart))
|
||||||
|
|
||||||
|
### Breaking Changes
|
||||||
|
|
||||||
|
- You will need the latest version of Poetry to install the dependencies. (Or have Git installed)
|
||||||
|
|
||||||
## [0.3.0] - 2022-02-19
|
## [0.3.0] - 2022-02-19
|
||||||
|
|
||||||
|
@ -38,9 +38,9 @@ COPY pyproject.toml poetry.lock README.md /home/botuser/
|
|||||||
# Change directory to where we will run the bot.
|
# Change directory to where we will run the bot.
|
||||||
WORKDIR /home/botuser
|
WORKDIR /home/botuser
|
||||||
|
|
||||||
RUN poetry install --no-interaction --no-ansi --no-dev
|
RUN poetry install --no-interaction --no-ansi --only main
|
||||||
|
|
||||||
COPY discord_reminder_bot/main.py discord_reminder_bot/settings.py discord_reminder_bot/countdown.py /home/botuser/discord_reminder_bot/
|
COPY discord_reminder_bot /home/botuser/discord_reminder_bot/
|
||||||
|
|
||||||
VOLUME ["/home/botuser/data/"]
|
VOLUME ["/home/botuser/data/"]
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
__version__ = "0.3.0"
|
__version__ = "1.0.0"
|
||||||
|
197
discord_reminder_bot/create_pages.py
Normal file
197
discord_reminder_bot/create_pages.py
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
"""This module creates the pages for the paginator."""
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
import interactions
|
||||||
|
from apscheduler.job import Job
|
||||||
|
from apscheduler.triggers.date import DateTrigger
|
||||||
|
from interactions import ActionRow, ComponentContext
|
||||||
|
from interactions.ext.paginator import Page, Paginator, RowPosition
|
||||||
|
|
||||||
|
from discord_reminder_bot.countdown import calculate
|
||||||
|
from discord_reminder_bot.settings import scheduler
|
||||||
|
|
||||||
|
|
||||||
|
def create_pages(ctx) -> list[Page]:
|
||||||
|
"""Create pages for the paginator.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
ctx (interactions.Context): The context of the command.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
list[Page]: A list of pages.
|
||||||
|
"""
|
||||||
|
pages = []
|
||||||
|
|
||||||
|
jobs: List[Job] = scheduler.get_jobs()
|
||||||
|
for job in jobs:
|
||||||
|
channel_id = job.kwargs.get("channel_id")
|
||||||
|
# Only add reminders from channels in the server we run "/reminder list" in
|
||||||
|
# Check if channel is in the Discord server, if not, skip it.
|
||||||
|
for channel in ctx.guild.channels:
|
||||||
|
if int(channel.id) == channel_id:
|
||||||
|
if type(job.trigger) is DateTrigger:
|
||||||
|
# Get trigger time for normal reminders
|
||||||
|
trigger_time = job.trigger.run_date
|
||||||
|
else:
|
||||||
|
# Get trigger time for cron and interval jobs
|
||||||
|
trigger_time = job.next_run_time
|
||||||
|
|
||||||
|
# Paused reminders returns None
|
||||||
|
if trigger_time is None:
|
||||||
|
trigger_value = None
|
||||||
|
trigger_text = "Paused"
|
||||||
|
else:
|
||||||
|
trigger_value = f'{trigger_time.strftime("%Y-%m-%d %H:%M")} (in {calculate(job)})'
|
||||||
|
trigger_text = trigger_value
|
||||||
|
|
||||||
|
message = job.kwargs.get("message")
|
||||||
|
|
||||||
|
edit_button = interactions.Button(
|
||||||
|
label="Edit",
|
||||||
|
style=interactions.ButtonStyle.PRIMARY,
|
||||||
|
custom_id="edit",
|
||||||
|
)
|
||||||
|
pause_button = interactions.Button(
|
||||||
|
label="Pause",
|
||||||
|
style=interactions.ButtonStyle.PRIMARY,
|
||||||
|
custom_id="pause",
|
||||||
|
)
|
||||||
|
unpause_button = interactions.Button(
|
||||||
|
label="Unpause",
|
||||||
|
style=interactions.ButtonStyle.PRIMARY,
|
||||||
|
custom_id="unpause",
|
||||||
|
)
|
||||||
|
remove_button = interactions.Button(
|
||||||
|
label="Remove",
|
||||||
|
style=interactions.ButtonStyle.DANGER,
|
||||||
|
custom_id="remove",
|
||||||
|
)
|
||||||
|
|
||||||
|
embed = interactions.Embed(
|
||||||
|
title=f"{job.id}",
|
||||||
|
fields=[
|
||||||
|
interactions.EmbedField(
|
||||||
|
name=f"**Channel:**",
|
||||||
|
value=f"#{channel.name}",
|
||||||
|
),
|
||||||
|
interactions.EmbedField(
|
||||||
|
name=f"**Message:**",
|
||||||
|
value=f"{message}",
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
if trigger_value is not None:
|
||||||
|
embed.add_field(
|
||||||
|
name=f"**Trigger:**",
|
||||||
|
value=f"{trigger_text}",
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
embed.add_field(
|
||||||
|
name=f"**Trigger:**",
|
||||||
|
value=f"_Paused_",
|
||||||
|
)
|
||||||
|
|
||||||
|
components = [
|
||||||
|
edit_button,
|
||||||
|
remove_button,
|
||||||
|
]
|
||||||
|
|
||||||
|
if type(job.trigger) is not DateTrigger:
|
||||||
|
# Get trigger time for cron and interval jobs
|
||||||
|
trigger_time = job.next_run_time
|
||||||
|
if trigger_time is None:
|
||||||
|
pause_or_unpause_button = unpause_button
|
||||||
|
else:
|
||||||
|
pause_or_unpause_button = pause_button
|
||||||
|
components.insert(1, pause_or_unpause_button)
|
||||||
|
|
||||||
|
# Add a page to pages list
|
||||||
|
pages.append(
|
||||||
|
Page(
|
||||||
|
embeds=embed,
|
||||||
|
title=message,
|
||||||
|
components=ActionRow(components=components), # type: ignore
|
||||||
|
callback=callback,
|
||||||
|
position=RowPosition.BOTTOM,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
return pages
|
||||||
|
|
||||||
|
|
||||||
|
async def callback(self: Paginator, ctx: ComponentContext):
|
||||||
|
"""Callback for the paginator."""
|
||||||
|
job_id = self.component_ctx.message.embeds[0].title
|
||||||
|
job = scheduler.get_job(job_id)
|
||||||
|
|
||||||
|
if job is None:
|
||||||
|
await ctx.send("Job not found.")
|
||||||
|
return
|
||||||
|
|
||||||
|
channel_id = job.kwargs.get("channel_id")
|
||||||
|
old_message = job.kwargs.get("message")
|
||||||
|
|
||||||
|
components = [
|
||||||
|
interactions.TextInput( # type: ignore
|
||||||
|
style=interactions.TextStyleType.PARAGRAPH,
|
||||||
|
placeholder=old_message,
|
||||||
|
label="New message",
|
||||||
|
custom_id="new_message",
|
||||||
|
value=old_message,
|
||||||
|
required=False,
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
if type(job.trigger) is DateTrigger:
|
||||||
|
# Get trigger time for normal reminders
|
||||||
|
trigger_time = job.trigger.run_date
|
||||||
|
job_type = "normal"
|
||||||
|
components.append(
|
||||||
|
interactions.TextInput( # type: ignore
|
||||||
|
style=interactions.TextStyleType.SHORT,
|
||||||
|
placeholder=str(trigger_time),
|
||||||
|
label="New date, Can be human readable or ISO8601",
|
||||||
|
custom_id="new_date",
|
||||||
|
value=str(trigger_time),
|
||||||
|
required=False,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
else:
|
||||||
|
# Get trigger time for cron and interval jobs
|
||||||
|
trigger_time = job.next_run_time
|
||||||
|
job_type = "cron/interval"
|
||||||
|
|
||||||
|
if ctx.custom_id == "edit":
|
||||||
|
await self.end_paginator()
|
||||||
|
modal = interactions.Modal(
|
||||||
|
title=f"Edit {job_type} reminder.",
|
||||||
|
custom_id="edit_modal",
|
||||||
|
components=components,
|
||||||
|
)
|
||||||
|
await ctx.popup(modal)
|
||||||
|
print(ctx.data)
|
||||||
|
|
||||||
|
elif ctx.custom_id == "pause":
|
||||||
|
await self.end_paginator()
|
||||||
|
# TODO: Add unpause button if user paused the wrong job
|
||||||
|
paused_job = scheduler.pause_job(job_id)
|
||||||
|
print(f"Paused job: {paused_job}")
|
||||||
|
|
||||||
|
await ctx.send(f"Job {job_id} paused.")
|
||||||
|
elif ctx.custom_id == "unpause":
|
||||||
|
await self.end_paginator()
|
||||||
|
# TODO: Add pause button if user unpauses the wrong job
|
||||||
|
scheduler.resume_job(job_id)
|
||||||
|
await ctx.send(f"Job {job_id} unpaused.")
|
||||||
|
elif ctx.custom_id == "remove":
|
||||||
|
await self.end_paginator()
|
||||||
|
# TODO: Add recreate button if user removed the wrong job
|
||||||
|
scheduler.remove_job(job_id)
|
||||||
|
await ctx.send(
|
||||||
|
f"Job {job_id} removed.\n"
|
||||||
|
f"**Message:** {old_message}\n"
|
||||||
|
f"**Channel:** {channel_id}\n"
|
||||||
|
f"**Time:** {trigger_time}"
|
||||||
|
)
|
@ -1,438 +1,175 @@
|
|||||||
import logging
|
import logging
|
||||||
|
from typing import List
|
||||||
|
|
||||||
import dateparser
|
import dateparser
|
||||||
import discord
|
import interactions
|
||||||
from apscheduler.triggers.date import DateTrigger
|
from apscheduler.jobstores.base import JobLookupError
|
||||||
from discord.errors import NotFound
|
from interactions import CommandContext, Embed, Option, OptionType
|
||||||
from discord.ext import commands
|
from interactions.ext.paginator import Paginator
|
||||||
from discord_slash import SlashCommand, SlashContext
|
from interactions.ext.wait_for import setup
|
||||||
from discord_slash.error import IncorrectFormat, RequestFailure
|
|
||||||
from discord_slash.model import SlashCommandOptionType
|
|
||||||
from discord_slash.utils.manage_commands import create_choice, create_option
|
|
||||||
|
|
||||||
from discord_reminder_bot.countdown import calculate
|
from discord_reminder_bot.countdown import calculate
|
||||||
from discord_reminder_bot.settings import bot_token, config_timezone, log_level, scheduler, sqlite_location
|
from discord_reminder_bot.create_pages import create_pages
|
||||||
|
from discord_reminder_bot.settings import (
|
||||||
bot = commands.Bot(
|
bot_token,
|
||||||
command_prefix="!",
|
config_timezone,
|
||||||
description="Reminder bot for Discord by TheLovinator#9276",
|
log_level,
|
||||||
intents=discord.Intents.all(),
|
scheduler,
|
||||||
|
sqlite_location,
|
||||||
)
|
)
|
||||||
slash = SlashCommand(bot, sync_commands=True)
|
|
||||||
|
bot = interactions.Client(token=bot_token)
|
||||||
|
|
||||||
|
# Initialize the wait_for extension.
|
||||||
|
setup(bot)
|
||||||
|
|
||||||
|
|
||||||
@bot.event
|
@bot.command(name="remind")
|
||||||
async def on_slash_command_error(ctx: SlashContext, ex: Exception) -> None:
|
async def base_command(ctx: interactions.CommandContext):
|
||||||
"""Handle errors in slash commands.
|
"""This description isn't seen in the UI (yet?)
|
||||||
|
|
||||||
|
This is the base command for the reminder bot."""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@bot.modal("edit_modal")
|
||||||
|
async def modal_response_edit(ctx: CommandContext, new_date: str, new_message: str):
|
||||||
|
"""Edit a reminder.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
ctx: The context of the command. Used to get the server name and what channel the command was sent in.
|
ctx: The context.
|
||||||
ex: The exception that was raised.
|
new_date: The new date.
|
||||||
|
new_message: The new message.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A Discord message with changes.
|
||||||
"""
|
"""
|
||||||
logging.error(f"Error occurred during the execution of '/{ctx.name} {ctx.subcommand_name}' by {ctx.author}: {ex}")
|
await ctx.defer()
|
||||||
if ex == RequestFailure:
|
|
||||||
message = f"Request to Discord API failed: {ex}"
|
|
||||||
elif ex == IncorrectFormat:
|
|
||||||
message = f"Incorrect format: {ex}"
|
|
||||||
elif ex == NotFound:
|
|
||||||
message = f"I couldn't find the interaction or it took me longer than 3 seconds to respond: {ex}"
|
|
||||||
else:
|
|
||||||
message = f"Error occurred during the execution of '/{ctx.name} {ctx.subcommand_name}': {ex}"
|
|
||||||
|
|
||||||
await ctx.send(
|
job_id = ctx.message.embeds[0].title
|
||||||
f"{message}\nIf this persists, please make an issue on the"
|
old_date = None
|
||||||
"[GitHub repo](https://github.com/TheLovinator1/discord-reminder-bot/issues) or contact TheLovinator#9276",
|
old_message = None
|
||||||
hidden=True,
|
|
||||||
|
try:
|
||||||
|
job = scheduler.get_job(job_id)
|
||||||
|
except JobLookupError as e:
|
||||||
|
return await ctx.send(
|
||||||
|
f"Failed to get the job after the modal.\nJob ID: {job_id}\nError: {e}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@bot.event
|
|
||||||
async def on_ready():
|
|
||||||
"""Print when the bot is ready."""
|
|
||||||
logging.info(f"Logged in as {bot.user.name}")
|
|
||||||
|
|
||||||
|
|
||||||
@slash.subcommand(
|
|
||||||
base="remind",
|
|
||||||
name="modify",
|
|
||||||
description="Modify a reminder. Does not work with cron or interval.",
|
|
||||||
options=[
|
|
||||||
create_option(
|
|
||||||
name="time_or_message",
|
|
||||||
description="Choose between modifying the date or the message.",
|
|
||||||
option_type=SlashCommandOptionType.STRING,
|
|
||||||
required=True,
|
|
||||||
choices=[
|
|
||||||
create_choice(name="Date", value="date"),
|
|
||||||
create_choice(name="Message", value="message"),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
async def command_modify(ctx: SlashContext, time_or_message: str):
|
|
||||||
"""Modify a reminder. You can change time or message.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
ctx: Context of the slash command. Contains the guild, author and message and more.
|
|
||||||
time_or_message: Choose between modifying the message or time.
|
|
||||||
"""
|
|
||||||
# TODO: Reduce complexity.
|
|
||||||
|
|
||||||
# Only make a list with normal reminders.
|
|
||||||
jobs_dict = await send_list(ctx, skip_cron_or_interval=True)
|
|
||||||
|
|
||||||
if time_or_message == "date":
|
|
||||||
date_or_message = "the date"
|
|
||||||
else:
|
|
||||||
date_or_message = "the message"
|
|
||||||
|
|
||||||
await ctx.channel.send(
|
|
||||||
f"Type the corresponding number to the reminder were you wish to change {date_or_message}."
|
|
||||||
" Does not work with cron or interval. Type Exit to exit."
|
|
||||||
)
|
|
||||||
|
|
||||||
def check(m):
|
|
||||||
"""Check if the message is from the original user and in the correct channel."""
|
|
||||||
return m.author == ctx.author and m.channel == ctx.channel
|
|
||||||
|
|
||||||
# TODO: Add timeout
|
|
||||||
response_message = await bot.wait_for("message", check=check)
|
|
||||||
if response_message.clean_content == "Exit":
|
|
||||||
return await ctx.channel.send("Exiting...")
|
|
||||||
|
|
||||||
for num, job_from_dict in jobs_dict.items():
|
|
||||||
if int(response_message.clean_content) == num:
|
|
||||||
|
|
||||||
job = scheduler.get_job(job_from_dict)
|
|
||||||
|
|
||||||
# Get_job() returns None when it can't find a job with that ID.
|
|
||||||
if job is None:
|
if job is None:
|
||||||
await ctx.send(f"No reminder with ID ({job_from_dict}).")
|
return await ctx.send("Job not found.")
|
||||||
return
|
|
||||||
|
|
||||||
message = job.kwargs.get("message")
|
|
||||||
old_time = calculate(job)
|
|
||||||
|
|
||||||
channel_name = bot.get_channel(int(job.kwargs.get("channel_id")))
|
|
||||||
msg = f"**Modified** {job_from_dict} in #{channel_name}\n"
|
|
||||||
if time_or_message == "message":
|
|
||||||
await ctx.channel.send("Type the new message. Type Exit to exit.")
|
|
||||||
|
|
||||||
# TODO: Add timeout
|
|
||||||
response_new_message = await bot.wait_for("message", check=check)
|
|
||||||
|
|
||||||
if response_new_message.clean_content == "Exit":
|
|
||||||
return await ctx.channel.send("Exiting...")
|
|
||||||
|
|
||||||
scheduler.modify_job(
|
|
||||||
job_from_dict,
|
|
||||||
kwargs={
|
|
||||||
"channel_id": job.kwargs.get("channel_id"),
|
|
||||||
"message": f"{response_new_message.clean_content}",
|
|
||||||
"author_id": job.kwargs.get("author_id"),
|
|
||||||
},
|
|
||||||
)
|
|
||||||
msg += f"**Old message**: {message}\n" f"**New message**: {response_new_message.clean_content}\n"
|
|
||||||
|
|
||||||
|
message_embeds: List[Embed] = ctx.message.embeds
|
||||||
|
for embeds in message_embeds:
|
||||||
|
for field in embeds.fields:
|
||||||
|
if field.name == "**Channel:**":
|
||||||
|
continue
|
||||||
|
elif field.name == "**Message:**":
|
||||||
|
old_message = field.value
|
||||||
|
elif field.name == "**Trigger:**":
|
||||||
|
old_date = field.value
|
||||||
else:
|
else:
|
||||||
await ctx.channel.send("Type the new date. Type Exit to exit.")
|
return await ctx.send(
|
||||||
|
f"Unknown field name ({field.name}).", ephemeral=True
|
||||||
# TODO: Add timeout
|
)
|
||||||
response_new_date = await bot.wait_for("message", check=check)
|
|
||||||
if response_new_date.clean_content == "Exit":
|
|
||||||
return await ctx.channel.send("Exiting...")
|
|
||||||
|
|
||||||
|
msg = f"Modified job {job_id}.\n"
|
||||||
|
if new_date != old_date and old_date is not None:
|
||||||
parsed_date = dateparser.parse(
|
parsed_date = dateparser.parse(
|
||||||
f"{response_new_date.clean_content}",
|
f"{new_date}",
|
||||||
settings={
|
settings={
|
||||||
"PREFER_DATES_FROM": "future",
|
"PREFER_DATES_FROM": "future",
|
||||||
"TIMEZONE": f"{config_timezone}",
|
"TIMEZONE": f"{config_timezone}",
|
||||||
|
"TO_TIMEZONE": f"{config_timezone}",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if not parsed_date:
|
||||||
|
return await ctx.send("Could not parse the date.", ephemeral=True)
|
||||||
|
|
||||||
date_new = parsed_date.strftime("%Y-%m-%d %H:%M:%S")
|
date_new = parsed_date.strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
|
||||||
job = scheduler.reschedule_job(job_from_dict, run_date=date_new)
|
new_job = scheduler.reschedule_job(job.id, run_date=date_new)
|
||||||
|
new_time = calculate(new_job)
|
||||||
|
|
||||||
date_old = job.trigger.run_date.strftime("%Y-%m-%d %H:%M")
|
msg += f"**Old date**: {old_date}\n**New date**: {date_new} (in {new_time})"
|
||||||
new_time = calculate(job_from_dict)
|
|
||||||
msg += f"**Old date**: {date_old} (in {old_time})\n**New date**: {date_new} (in {new_time})"
|
|
||||||
|
|
||||||
await ctx.send(msg)
|
if new_message != old_message and old_message is not None:
|
||||||
|
channel_id = job.kwargs.get("channel_id")
|
||||||
|
job_author_id = job.kwargs.get("author_id")
|
||||||
|
|
||||||
|
scheduler.modify_job(
|
||||||
@slash.subcommand(
|
job.id,
|
||||||
base="remind",
|
kwargs={
|
||||||
name="remove",
|
"channel_id": channel_id,
|
||||||
description="Remove a reminder",
|
"message": f"{new_message}",
|
||||||
|
"author_id": job_author_id,
|
||||||
|
},
|
||||||
)
|
)
|
||||||
async def remind_remove(ctx: SlashContext):
|
|
||||||
"""Select reminder from list that you want to remove.
|
|
||||||
|
|
||||||
Args:
|
msg += f"**Old message**: {old_message}\n**New message**: {new_message}"
|
||||||
ctx: Context of the slash command. Contains the guild, author and message and more.
|
|
||||||
"""
|
|
||||||
# TODO: Reduce complexity
|
|
||||||
|
|
||||||
jobs_dict = await send_list(ctx)
|
return await ctx.send(msg)
|
||||||
|
|
||||||
await ctx.channel.send("Type the corresponding number to the reminder you wish to remove. Type Exit to exit.")
|
|
||||||
|
|
||||||
def check(m):
|
@base_command.subcommand(
|
||||||
"""Check if the message is from the original user and in the correct channel."""
|
name="list", description="List, pause, unpause, and remove reminders."
|
||||||
return m.author == ctx.author and m.channel == ctx.channel
|
)
|
||||||
|
async def list_command(ctx: interactions.CommandContext):
|
||||||
|
"""List, pause, unpause, and remove reminders."""
|
||||||
|
|
||||||
# TODO: Add timeout
|
pages = create_pages(ctx)
|
||||||
response_message = await bot.wait_for("message", check=check)
|
if not pages:
|
||||||
if response_message.clean_content == "Exit":
|
await ctx.send("No reminders found.")
|
||||||
return await ctx.channel.send("Exiting...")
|
|
||||||
|
|
||||||
for num, job_from_dict in jobs_dict.items():
|
|
||||||
if int(response_message.clean_content) == num:
|
|
||||||
job = scheduler.get_job(job_from_dict)
|
|
||||||
if job is None:
|
|
||||||
await ctx.channel.send(f"No reminder with that ID ({job_from_dict}).")
|
|
||||||
return
|
return
|
||||||
|
|
||||||
channel_id = job.kwargs.get("channel_id")
|
if len(pages) == 1:
|
||||||
channel_name = bot.get_channel(int(channel_id))
|
await ctx.send("a")
|
||||||
message = job.kwargs.get("message")
|
|
||||||
|
|
||||||
# Only normal reminders have trigger.run_date, cron and
|
|
||||||
# interval has next_run_time
|
|
||||||
if type(job.trigger) is DateTrigger:
|
|
||||||
trigger_time = job.trigger.run_date
|
|
||||||
else:
|
|
||||||
trigger_time = job.next_run_time
|
|
||||||
|
|
||||||
# Paused reminders returns None
|
|
||||||
if trigger_time is None:
|
|
||||||
trigger_value = "Paused - can be resumed with '/remind resume'"
|
|
||||||
else:
|
|
||||||
trigger_value = f'{trigger_time.strftime("%Y-%m-%d %H:%M")} (in {calculate(job)})'
|
|
||||||
|
|
||||||
msg = f"**Removed** {message} in #{channel_name}.\n**Time**: {trigger_value}"
|
|
||||||
|
|
||||||
scheduler.remove_job(job_from_dict)
|
|
||||||
|
|
||||||
await ctx.channel.send(msg)
|
|
||||||
|
|
||||||
|
|
||||||
async def send_list(ctx: SlashContext, skip_datetriggers=False, skip_cron_or_interval=False) -> dict:
|
|
||||||
"""Create a list of reminders.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
ctx: The context of the command. Used to get the server name and what channel the command was sent in.
|
|
||||||
skip_datetriggers: Only show cron jobs and interval reminders.
|
|
||||||
skip_cron_or_interval: Only show normal reminders.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
jobs_dict: Dictionary that contains placement in list and job ID.
|
|
||||||
"""
|
|
||||||
# TODO: This will fail if the embed is bigger than 6000 characters.
|
|
||||||
jobs_dict = {}
|
|
||||||
job_number = 0
|
|
||||||
|
|
||||||
embed = discord.Embed(
|
|
||||||
colour=discord.Colour.random(),
|
|
||||||
title="discord-reminder-bot by TheLovinator#9276",
|
|
||||||
description=f"Reminders for {ctx.guild.name}",
|
|
||||||
url="https://github.com/TheLovinator1/discord-reminder-bot",
|
|
||||||
)
|
|
||||||
jobs = scheduler.get_jobs()
|
|
||||||
|
|
||||||
for job in jobs:
|
|
||||||
channel_id = job.kwargs.get("channel_id")
|
|
||||||
channel_name = bot.get_channel(int(channel_id))
|
|
||||||
|
|
||||||
# Only add reminders from channels in the server we run "/reminder list" in
|
|
||||||
# Check if channel is in the Discord server, if not, skip it.
|
|
||||||
for channel in ctx.guild.channels:
|
|
||||||
if channel.id == channel_id:
|
|
||||||
if type(job.trigger) is DateTrigger:
|
|
||||||
# Get trigger time for normal reminders
|
|
||||||
trigger_time = job.trigger.run_date
|
|
||||||
|
|
||||||
# Don't add normal reminders if true
|
|
||||||
if skip_datetriggers:
|
|
||||||
continue
|
|
||||||
else:
|
|
||||||
# Get trigger time for cron and interval jobs
|
|
||||||
trigger_time = job.next_run_time
|
|
||||||
|
|
||||||
# Don't add cron and interval reminders if true
|
|
||||||
if skip_cron_or_interval:
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Paused reminders returns None
|
|
||||||
if trigger_time is None:
|
|
||||||
trigger_value = "Paused"
|
|
||||||
else:
|
|
||||||
trigger_value = f'{trigger_time.strftime("%Y-%m-%d %H:%M")} (in {calculate(job)})'
|
|
||||||
|
|
||||||
job_number += 1
|
|
||||||
jobs_dict[job_number] = job.id
|
|
||||||
message = job.kwargs.get("message")
|
|
||||||
|
|
||||||
# Truncate message if it is too long
|
|
||||||
field_name = f"{job_number}) {message} in #{channel_name}"
|
|
||||||
field_name = field_name[:253] + (field_name[253:] and "...")
|
|
||||||
|
|
||||||
embed.add_field(
|
|
||||||
name=field_name,
|
|
||||||
value=trigger_value,
|
|
||||||
inline=False,
|
|
||||||
)
|
|
||||||
|
|
||||||
if job_number == 24:
|
|
||||||
await ctx.send("I haven't added support for showing more than 25 reminders yet 🙃")
|
|
||||||
break
|
|
||||||
|
|
||||||
# The empty embed has 76 characters
|
|
||||||
if len(embed) <= 76:
|
|
||||||
await ctx.send(f"{ctx.guild.name} has no reminders.")
|
|
||||||
else:
|
|
||||||
await ctx.send(embed=embed)
|
|
||||||
|
|
||||||
return jobs_dict
|
|
||||||
|
|
||||||
|
|
||||||
@slash.subcommand(base="remind", name="list", description="Show reminders.")
|
|
||||||
async def remind_list(ctx: SlashContext):
|
|
||||||
"""Send a list of reminders to Discord.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
ctx: Context of the slash command. Contains the guild, author and message and more.
|
|
||||||
"""
|
|
||||||
await send_list(ctx)
|
|
||||||
|
|
||||||
|
|
||||||
@slash.subcommand(base="remind", name="pause", description="Pause reminder. For cron or interval.")
|
|
||||||
async def remind_pause(ctx: SlashContext):
|
|
||||||
"""Get a list of reminders that you can pause."""
|
|
||||||
jobs_dict = await send_list(ctx, skip_datetriggers=True)
|
|
||||||
|
|
||||||
await ctx.channel.send("Type the corresponding number to the reminder you wish to pause. Type Exit to exit.")
|
|
||||||
|
|
||||||
def check(m):
|
|
||||||
"""Check if the message is from the original user and in the correct channel."""
|
|
||||||
return m.author == ctx.author and m.channel == ctx.channel
|
|
||||||
|
|
||||||
# TODO: Add timeout
|
|
||||||
response_reminder = await bot.wait_for("message", check=check)
|
|
||||||
if response_reminder.clean_content == "Exit":
|
|
||||||
return await ctx.channel.send("Exiting...")
|
|
||||||
|
|
||||||
# Pair a number with the job ID
|
|
||||||
for num, job_from_dict in jobs_dict.items():
|
|
||||||
# Check if the response is a number and if it is in the list.
|
|
||||||
if int(response_reminder.clean_content) == num:
|
|
||||||
job = scheduler.get_job(job_from_dict)
|
|
||||||
channel_id = job.kwargs.get("channel_id")
|
|
||||||
channel_name = bot.get_channel(int(channel_id))
|
|
||||||
message = job.kwargs.get("message")
|
|
||||||
|
|
||||||
if type(job.trigger) is DateTrigger:
|
|
||||||
# Get trigger time for normal reminders
|
|
||||||
trigger_time = job.trigger.run_date
|
|
||||||
else:
|
|
||||||
# Get trigger time for cron and interval jobs
|
|
||||||
trigger_time = job.next_run_time
|
|
||||||
|
|
||||||
# Tell user if he tries to pause a paused reminder
|
|
||||||
if trigger_time is None:
|
|
||||||
return await ctx.channel.send(f"{message} in #{channel_name} is already paused.")
|
|
||||||
|
|
||||||
trigger_value = f'{trigger_time.strftime("%Y-%m-%d %H:%M")} (in {calculate(job)})'
|
|
||||||
|
|
||||||
msg = f"**Paused** {message} in #{channel_name}.\n**Time**: {trigger_value}"
|
|
||||||
|
|
||||||
scheduler.pause_job(job_from_dict)
|
|
||||||
print(f"Paused {job_from_dict} in #{channel_name}")
|
|
||||||
await ctx.channel.send(msg)
|
|
||||||
|
|
||||||
|
|
||||||
@slash.subcommand(
|
|
||||||
base="remind",
|
|
||||||
name="resume",
|
|
||||||
description="Resume paused reminder. For cron or interval.",
|
|
||||||
)
|
|
||||||
async def remind_resume(ctx: SlashContext):
|
|
||||||
"""Send a list of reminders to pause to Discord."""
|
|
||||||
# TODO: Reduce the complexity of this function
|
|
||||||
jobs_dict = await send_list(ctx, skip_datetriggers=True)
|
|
||||||
|
|
||||||
await ctx.channel.send("Type the corresponding number to the reminder you wish to pause. Type Exit to exit.")
|
|
||||||
|
|
||||||
def check(m):
|
|
||||||
"""Check if the message is from the original user and in the correct channel."""
|
|
||||||
return m.author == ctx.author and m.channel == ctx.channel
|
|
||||||
|
|
||||||
# TODO: Add timeout
|
|
||||||
response_message = await bot.wait_for("message", check=check)
|
|
||||||
if response_message.clean_content == "Exit":
|
|
||||||
return await ctx.channel.send("Exiting...")
|
|
||||||
|
|
||||||
for num, job_from_dict in jobs_dict.items():
|
|
||||||
if int(response_message.clean_content) == num:
|
|
||||||
job = scheduler.get_job(job_from_dict)
|
|
||||||
if job is None:
|
|
||||||
await ctx.send(f"No reminder with that ID ({job_from_dict}).")
|
|
||||||
return
|
return
|
||||||
|
|
||||||
channel_id = job.kwargs.get("channel_id")
|
paginator: Paginator = Paginator(
|
||||||
channel_name = bot.get_channel(int(channel_id))
|
client=bot,
|
||||||
message = job.kwargs.get("message")
|
ctx=ctx,
|
||||||
|
pages=pages,
|
||||||
|
remove_after_timeout=True,
|
||||||
|
author_only=True,
|
||||||
|
extended_buttons=False,
|
||||||
|
use_buttons=False,
|
||||||
|
)
|
||||||
|
|
||||||
scheduler.resume_job(job_from_dict)
|
await paginator.run()
|
||||||
|
|
||||||
# Only normal reminders have trigger.run_date
|
|
||||||
# Cron and interval has next_run_time
|
|
||||||
if type(job.trigger) is DateTrigger:
|
|
||||||
trigger_time = job.trigger.run_date
|
|
||||||
else:
|
|
||||||
trigger_time = job.next_run_time
|
|
||||||
|
|
||||||
# Paused reminders returns None
|
|
||||||
if trigger_time is None:
|
|
||||||
trigger_value = "Paused - can be resumed with '/remind resume'"
|
|
||||||
else:
|
|
||||||
trigger_value = f'{trigger_time.strftime("%Y-%m-%d %H:%M")} (in {calculate(job)})'
|
|
||||||
|
|
||||||
msg = f"**Resumed** {message} in #{channel_name}.\n**Time**: {trigger_value}\n"
|
|
||||||
|
|
||||||
await ctx.send(msg)
|
|
||||||
|
|
||||||
|
|
||||||
@slash.subcommand(
|
@base_command.subcommand(
|
||||||
base="remind",
|
|
||||||
name="add",
|
name="add",
|
||||||
description="Set a reminder.",
|
description="Set a reminder.",
|
||||||
options=[
|
options=[
|
||||||
create_option(
|
Option(
|
||||||
name="message_reason",
|
name="message_reason",
|
||||||
description="The message I'm going to send you.",
|
description="The message to send.",
|
||||||
option_type=SlashCommandOptionType.STRING,
|
type=OptionType.STRING,
|
||||||
required=True,
|
required=True,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="message_date",
|
name="message_date",
|
||||||
description="Time and/or date when you want to get reminded.",
|
description="The date to send the message.",
|
||||||
option_type=SlashCommandOptionType.STRING,
|
type=OptionType.STRING,
|
||||||
required=True,
|
required=True,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="different_channel",
|
name="different_channel",
|
||||||
description="Send the message to a different channel.",
|
description="The channel to send the message to.",
|
||||||
option_type=SlashCommandOptionType.CHANNEL,
|
type=OptionType.CHANNEL,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
async def remind_add(
|
async def command_add(
|
||||||
ctx: SlashContext,
|
ctx: interactions.CommandContext,
|
||||||
message_date: str,
|
|
||||||
message_reason: str,
|
message_reason: str,
|
||||||
different_channel: discord.TextChannel = None,
|
message_date: str,
|
||||||
|
different_channel: interactions.Channel | None = None,
|
||||||
):
|
):
|
||||||
"""Add a new reminder. You can add a date and message.
|
"""Add a new reminder. You can add a date and message.
|
||||||
|
|
||||||
@ -442,19 +179,25 @@ async def remind_add(
|
|||||||
message_reason: The message the bot should write when the reminder is triggered.
|
message_reason: The message the bot should write when the reminder is triggered.
|
||||||
different_channel: The channel the reminder should be sent to.
|
different_channel: The channel the reminder should be sent to.
|
||||||
"""
|
"""
|
||||||
|
await ctx.defer()
|
||||||
|
|
||||||
parsed_date = dateparser.parse(
|
parsed_date = dateparser.parse(
|
||||||
f"{message_date}",
|
f"{message_date}",
|
||||||
settings={
|
settings={
|
||||||
"PREFER_DATES_FROM": "future",
|
"PREFER_DATES_FROM": "future",
|
||||||
"TIMEZONE": f"{config_timezone}",
|
"TO_TIMEZONE": f"{config_timezone}",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
channel_id = ctx.channel.id
|
if not parsed_date:
|
||||||
|
await ctx.send("Could not parse the date.")
|
||||||
|
return
|
||||||
|
|
||||||
|
channel_id = int(ctx.channel_id)
|
||||||
|
|
||||||
# If we should send the message to a different channel
|
# If we should send the message to a different channel
|
||||||
if different_channel:
|
if different_channel:
|
||||||
channel_id = different_channel.id
|
channel_id = int(different_channel.id)
|
||||||
|
|
||||||
run_date = parsed_date.strftime("%Y-%m-%d %H:%M:%S")
|
run_date = parsed_date.strftime("%Y-%m-%d %H:%M:%S")
|
||||||
reminder = scheduler.add_job(
|
reminder = scheduler.add_job(
|
||||||
@ -463,12 +206,12 @@ async def remind_add(
|
|||||||
kwargs={
|
kwargs={
|
||||||
"channel_id": channel_id,
|
"channel_id": channel_id,
|
||||||
"message": message_reason,
|
"message": message_reason,
|
||||||
"author_id": ctx.author_id,
|
"author_id": ctx.member.id,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
message = (
|
message = (
|
||||||
f"Hello {ctx.author.display_name},"
|
f"Hello {ctx.member.name},"
|
||||||
f" I will notify you in <#{channel_id}> at:\n"
|
f" I will notify you in <#{channel_id}> at:\n"
|
||||||
f"**{run_date}** (in {calculate(reminder)})\n"
|
f"**{run_date}** (in {calculate(reminder)})\n"
|
||||||
f"With the message:\n**{message_reason}**."
|
f"With the message:\n**{message_reason}**."
|
||||||
@ -477,113 +220,112 @@ async def remind_add(
|
|||||||
await ctx.send(message)
|
await ctx.send(message)
|
||||||
|
|
||||||
|
|
||||||
@slash.subcommand(
|
@base_command.subcommand(
|
||||||
base="remind",
|
|
||||||
name="cron",
|
name="cron",
|
||||||
description="Triggers when current time matches all specified time constraints, similarly to the UNIX cron.",
|
description="Triggers when current time matches all specified time constraints, similarly to the UNIX cron.",
|
||||||
options=[
|
options=[
|
||||||
create_option(
|
Option(
|
||||||
name="message_reason",
|
name="message_reason",
|
||||||
description="The message I'm going to send you.",
|
description="The message I'm going to send you.",
|
||||||
option_type=SlashCommandOptionType.STRING,
|
type=OptionType.STRING,
|
||||||
required=True,
|
required=True,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="year",
|
name="year",
|
||||||
description="4-digit year. (Example: 2042)",
|
description="4-digit year. (Example: 2042)",
|
||||||
option_type=SlashCommandOptionType.STRING,
|
type=OptionType.STRING,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="month",
|
name="month",
|
||||||
description="Month (1-12)",
|
description="Month (1-12)",
|
||||||
option_type=SlashCommandOptionType.STRING,
|
type=OptionType.STRING,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="day",
|
name="day",
|
||||||
description="Day of month (1-31)",
|
description="Day of month (1-31)",
|
||||||
option_type=SlashCommandOptionType.STRING,
|
type=OptionType.STRING,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="week",
|
name="week",
|
||||||
description="ISO week (1-53)",
|
description="ISO week (1-53)",
|
||||||
option_type=SlashCommandOptionType.STRING,
|
type=OptionType.STRING,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="day_of_week",
|
name="day_of_week",
|
||||||
description="Number or name of weekday (0-6 or mon,tue,wed,thu,fri,sat,sun). The first weekday is monday.",
|
description="Number or name of weekday (0-6 or mon,tue,wed,thu,fri,sat,sun). The first weekday is monday.",
|
||||||
option_type=SlashCommandOptionType.STRING,
|
type=OptionType.STRING,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="hour",
|
name="hour",
|
||||||
description="Hour (0-23)",
|
description="Hour (0-23)",
|
||||||
option_type=SlashCommandOptionType.STRING,
|
type=OptionType.STRING,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="minute",
|
name="minute",
|
||||||
description="Minute (0-59)",
|
description="Minute (0-59)",
|
||||||
option_type=SlashCommandOptionType.STRING,
|
type=OptionType.STRING,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="second",
|
name="second",
|
||||||
description="Second (0-59)",
|
description="Second (0-59)",
|
||||||
option_type=SlashCommandOptionType.STRING,
|
type=OptionType.STRING,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="start_date",
|
name="start_date",
|
||||||
description="Earliest possible time to trigger on, in the ISO 8601 format. (Example: 2010-10-10 09:30:00)",
|
description="Earliest possible time to trigger on, in the ISO 8601 format. (Example: 2010-10-10 09:30:00)",
|
||||||
option_type=SlashCommandOptionType.STRING,
|
type=OptionType.STRING,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="end_date",
|
name="end_date",
|
||||||
description="Latest possible time to trigger on, in the ISO 8601 format. (Example: 2010-10-10 09:30:00)",
|
description="Latest possible time to trigger on, in the ISO 8601 format. (Example: 2010-10-10 09:30:00)",
|
||||||
option_type=SlashCommandOptionType.STRING,
|
type=OptionType.STRING,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="timezone",
|
name="timezone",
|
||||||
description="Time zone to use for the date/time calculations (defaults to scheduler timezone)",
|
description="Time zone to use for the date/time calculations (defaults to scheduler timezone)",
|
||||||
option_type=SlashCommandOptionType.STRING,
|
type=OptionType.STRING,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="jitter",
|
name="jitter",
|
||||||
description="Delay the job execution by x seconds at most. Adds a random component to the execution time.",
|
description="Delay the job execution by x seconds at most. Adds a random component to the execution time.",
|
||||||
option_type=SlashCommandOptionType.INTEGER,
|
type=OptionType.INTEGER,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="different_channel",
|
name="different_channel",
|
||||||
description="Send the messages to a different channel.",
|
description="Send the messages to a different channel.",
|
||||||
option_type=SlashCommandOptionType.CHANNEL,
|
type=OptionType.CHANNEL,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
async def remind_cron(
|
async def remind_cron(
|
||||||
ctx: SlashContext,
|
ctx: interactions.CommandContext,
|
||||||
message_reason: str,
|
message_reason: str,
|
||||||
year: int = None,
|
year: int | None = None,
|
||||||
month: int = None,
|
month: int | None = None,
|
||||||
day: int = None,
|
day: int | None = None,
|
||||||
week: int = None,
|
week: int | None = None,
|
||||||
day_of_week: str = None,
|
day_of_week: str | None = None,
|
||||||
hour: int = None,
|
hour: int | None = None,
|
||||||
minute: int = None,
|
minute: int | None = None,
|
||||||
second: int = None,
|
second: int | None = None,
|
||||||
start_date: str = None,
|
start_date: str | None = None,
|
||||||
end_date: str = None,
|
end_date: str | None = None,
|
||||||
timezone: str = None,
|
timezone: str | None = None,
|
||||||
jitter: int = None,
|
jitter: int | None = None,
|
||||||
different_channel: discord.TextChannel = None,
|
different_channel: interactions.Channel | None = None,
|
||||||
):
|
):
|
||||||
"""Create new cron job. Works like UNIX cron.
|
"""Create new cron job. Works like UNIX cron.
|
||||||
|
|
||||||
@ -607,11 +349,13 @@ async def remind_cron(
|
|||||||
jitter: Delay the job execution by jitter seconds at most.
|
jitter: Delay the job execution by jitter seconds at most.
|
||||||
different_channel: Send the messages to a different channel.
|
different_channel: Send the messages to a different channel.
|
||||||
"""
|
"""
|
||||||
channel_id = ctx.channel.id
|
await ctx.defer()
|
||||||
|
|
||||||
|
channel_id = int(ctx.channel_id)
|
||||||
|
|
||||||
# If we should send the message to a different channel
|
# If we should send the message to a different channel
|
||||||
if different_channel:
|
if different_channel:
|
||||||
channel_id = different_channel.id
|
channel_id = int(different_channel.id)
|
||||||
|
|
||||||
job = scheduler.add_job(
|
job = scheduler.add_job(
|
||||||
send_to_discord,
|
send_to_discord,
|
||||||
@ -631,13 +375,13 @@ async def remind_cron(
|
|||||||
kwargs={
|
kwargs={
|
||||||
"channel_id": channel_id,
|
"channel_id": channel_id,
|
||||||
"message": message_reason,
|
"message": message_reason,
|
||||||
"author_id": ctx.author_id,
|
"author_id": ctx.member.id,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
# TODO: Add what arguments we used in the job to the message
|
# TODO: Add what arguments we used in the job to the message
|
||||||
message = (
|
message = (
|
||||||
f"Hello {ctx.author.display_name},"
|
f"Hello {ctx.member.name},"
|
||||||
f" I will send messages to <#{channel_id}>.\n"
|
f" I will send messages to <#{channel_id}>.\n"
|
||||||
f"First run in {calculate(job)} with the message:\n"
|
f"First run in {calculate(job)} with the message:\n"
|
||||||
f"**{message_reason}**."
|
f"**{message_reason}**."
|
||||||
@ -645,92 +389,91 @@ async def remind_cron(
|
|||||||
await ctx.send(message)
|
await ctx.send(message)
|
||||||
|
|
||||||
|
|
||||||
@slash.subcommand(
|
@base_command.subcommand(
|
||||||
base="remind",
|
|
||||||
name="interval",
|
name="interval",
|
||||||
description="Schedules messages to be run periodically, on selected intervals.",
|
description="Schedules messages to be run periodically, on selected intervals.",
|
||||||
options=[
|
options=[
|
||||||
create_option(
|
Option(
|
||||||
name="message_reason",
|
name="message_reason",
|
||||||
description="The message I'm going to send you.",
|
description="The message I'm going to send you.",
|
||||||
option_type=SlashCommandOptionType.STRING,
|
type=OptionType.STRING,
|
||||||
required=True,
|
required=True,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="weeks",
|
name="weeks",
|
||||||
description="Number of weeks to wait",
|
description="Number of weeks to wait",
|
||||||
option_type=SlashCommandOptionType.INTEGER,
|
type=OptionType.INTEGER,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="days",
|
name="days",
|
||||||
description="Number of days to wait",
|
description="Number of days to wait",
|
||||||
option_type=SlashCommandOptionType.INTEGER,
|
type=OptionType.INTEGER,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="hours",
|
name="hours",
|
||||||
description="Number of hours to wait",
|
description="Number of hours to wait",
|
||||||
option_type=SlashCommandOptionType.INTEGER,
|
type=OptionType.INTEGER,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="minutes",
|
name="minutes",
|
||||||
description="Number of minutes to wait",
|
description="Number of minutes to wait",
|
||||||
option_type=SlashCommandOptionType.INTEGER,
|
type=OptionType.INTEGER,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="seconds",
|
name="seconds",
|
||||||
description="Number of seconds to wait.",
|
description="Number of seconds to wait.",
|
||||||
option_type=SlashCommandOptionType.INTEGER,
|
type=OptionType.INTEGER,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="start_date",
|
name="start_date",
|
||||||
description="When to start, in the ISO 8601 format. (Example: 2010-10-10 09:30:00)",
|
description="When to start, in the ISO 8601 format. (Example: 2010-10-10 09:30:00)",
|
||||||
option_type=SlashCommandOptionType.STRING,
|
type=OptionType.STRING,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="end_date",
|
name="end_date",
|
||||||
description="When to stop, in the ISO 8601 format. (Example: 2014-06-15 11:00:00)",
|
description="When to stop, in the ISO 8601 format. (Example: 2014-06-15 11:00:00)",
|
||||||
option_type=SlashCommandOptionType.STRING,
|
type=OptionType.STRING,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="timezone",
|
name="timezone",
|
||||||
description="Time zone to use for the date/time calculations",
|
description="Time zone to use for the date/time calculations",
|
||||||
option_type=SlashCommandOptionType.STRING,
|
type=OptionType.STRING,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="jitter",
|
name="jitter",
|
||||||
description="Delay the job execution by x seconds at most. Adds a random component to the execution time.",
|
description="Delay the job execution by x seconds at most. Adds a random component to the execution time.",
|
||||||
option_type=SlashCommandOptionType.INTEGER,
|
type=OptionType.INTEGER,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
create_option(
|
Option(
|
||||||
name="different_channel",
|
name="different_channel",
|
||||||
description="Send the messages to a different channel.",
|
description="Send the messages to a different channel.",
|
||||||
option_type=SlashCommandOptionType.CHANNEL,
|
type=OptionType.CHANNEL,
|
||||||
required=False,
|
required=False,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
async def remind_interval(
|
async def remind_interval(
|
||||||
ctx: SlashContext,
|
ctx: interactions.CommandContext,
|
||||||
message_reason: str,
|
message_reason: str,
|
||||||
weeks: int = 0,
|
weeks: int = 0,
|
||||||
days: int = 0,
|
days: int = 0,
|
||||||
hours: int = 0,
|
hours: int = 0,
|
||||||
minutes: int = 0,
|
minutes: int = 0,
|
||||||
seconds: int = 0,
|
seconds: int = 0,
|
||||||
start_date: str = None,
|
start_date: str | None = None,
|
||||||
end_date: str = None,
|
end_date: str | None = None,
|
||||||
timezone: str = None,
|
timezone: str | None = None,
|
||||||
jitter: int = None,
|
jitter: int | None = None,
|
||||||
different_channel: discord.TextChannel = None,
|
different_channel: interactions.Channel | None = None,
|
||||||
):
|
):
|
||||||
"""Create a new reminder that triggers based on an interval.
|
"""Create a new reminder that triggers based on an interval.
|
||||||
|
|
||||||
@ -748,8 +491,13 @@ async def remind_interval(
|
|||||||
jitter: Delay the job execution by jitter seconds at most.
|
jitter: Delay the job execution by jitter seconds at most.
|
||||||
different_channel: Send the messages to a different channel.
|
different_channel: Send the messages to a different channel.
|
||||||
"""
|
"""
|
||||||
|
await ctx.defer()
|
||||||
|
|
||||||
channel_id = different_channel.id if different_channel else ctx.channel.id
|
channel_id = int(ctx.channel_id)
|
||||||
|
|
||||||
|
# If we should send the message to a different channel
|
||||||
|
if different_channel:
|
||||||
|
channel_id = int(different_channel.id)
|
||||||
|
|
||||||
job = scheduler.add_job(
|
job = scheduler.add_job(
|
||||||
send_to_discord,
|
send_to_discord,
|
||||||
@ -766,13 +514,13 @@ async def remind_interval(
|
|||||||
kwargs={
|
kwargs={
|
||||||
"channel_id": channel_id,
|
"channel_id": channel_id,
|
||||||
"message": message_reason,
|
"message": message_reason,
|
||||||
"author_id": ctx.author_id,
|
"author_id": ctx.member.id,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
# TODO: Add what arguments we used in the job to the message
|
# TODO: Add what arguments we used in the job to the message
|
||||||
message = (
|
message = (
|
||||||
f"Hello {ctx.author.display_name}, I will send messages to <#{channel_id}>.\n"
|
f"Hello {ctx.member.name}, I will send messages to <#{channel_id}>.\n"
|
||||||
f"First run in {calculate(job)} with the message:\n"
|
f"First run in {calculate(job)} with the message:\n"
|
||||||
f"**{message_reason}**."
|
f"**{message_reason}**."
|
||||||
)
|
)
|
||||||
@ -789,7 +537,14 @@ async def send_to_discord(channel_id: int, message: str, author_id: int):
|
|||||||
author_id: User we should ping.
|
author_id: User we should ping.
|
||||||
"""
|
"""
|
||||||
# TODO: Check if channel exists.
|
# TODO: Check if channel exists.
|
||||||
channel = bot.get_channel(int(channel_id))
|
# TODO: Send message to webhook if channel is not found.
|
||||||
|
channel = await interactions.get( # type: ignore
|
||||||
|
bot,
|
||||||
|
interactions.Channel,
|
||||||
|
object_id=int(channel_id),
|
||||||
|
force=interactions.Force.HTTP, # type: ignore
|
||||||
|
)
|
||||||
|
|
||||||
await channel.send(f"<@{author_id}>\n{message}")
|
await channel.send(f"<@{author_id}>\n{message}")
|
||||||
|
|
||||||
|
|
||||||
@ -806,7 +561,7 @@ def start():
|
|||||||
)
|
)
|
||||||
|
|
||||||
scheduler.start()
|
scheduler.start()
|
||||||
bot.run(bot_token)
|
bot.start()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
@ -7,7 +7,7 @@ from dotenv import load_dotenv
|
|||||||
|
|
||||||
load_dotenv(verbose=True)
|
load_dotenv(verbose=True)
|
||||||
sqlite_location = os.getenv("SQLITE_LOCATION", default="/jobs.sqlite")
|
sqlite_location = os.getenv("SQLITE_LOCATION", default="/jobs.sqlite")
|
||||||
config_timezone = os.getenv("TIMEZONE", default="Europe/Stockholm")
|
config_timezone = os.getenv("TIMEZONE", default="UTC")
|
||||||
bot_token = os.getenv("BOT_TOKEN", default="")
|
bot_token = os.getenv("BOT_TOKEN", default="")
|
||||||
log_level = os.getenv(key="LOG_LEVEL", default="INFO")
|
log_level = os.getenv(key="LOG_LEVEL", default="INFO")
|
||||||
|
|
||||||
|
705
poetry.lock
generated
705
poetry.lock
generated
@ -1,24 +1,36 @@
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "aiohttp"
|
name = "aiohttp"
|
||||||
version = "3.7.4.post0"
|
version = "3.8.1"
|
||||||
description = "Async http client/server framework (asyncio)"
|
description = "Async http client/server framework (asyncio)"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6"
|
python-versions = ">=3.6"
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
async-timeout = ">=3.0,<4.0"
|
aiosignal = ">=1.1.2"
|
||||||
|
async-timeout = ">=4.0.0a3,<5.0"
|
||||||
attrs = ">=17.3.0"
|
attrs = ">=17.3.0"
|
||||||
chardet = ">=2.0,<5.0"
|
charset-normalizer = ">=2.0,<3.0"
|
||||||
|
frozenlist = ">=1.1.1"
|
||||||
multidict = ">=4.5,<7.0"
|
multidict = ">=4.5,<7.0"
|
||||||
typing-extensions = ">=3.6.5"
|
|
||||||
yarl = ">=1.0,<2.0"
|
yarl = ">=1.0,<2.0"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
speedups = ["cchardet", "brotlipy", "aiodns"]
|
speedups = ["Brotli", "aiodns", "cchardet"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "apscheduler"
|
name = "aiosignal"
|
||||||
|
version = "1.2.0"
|
||||||
|
description = "aiosignal: a list of registered asynchronous callbacks"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.6"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
frozenlist = ">=1.1.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "APScheduler"
|
||||||
version = "3.9.1"
|
version = "3.9.1"
|
||||||
description = "In-process task scheduler with Cron-like capabilities"
|
description = "In-process task scheduler with Cron-like capabilities"
|
||||||
category = "main"
|
category = "main"
|
||||||
@ -27,37 +39,30 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
|
|||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
pytz = "*"
|
pytz = "*"
|
||||||
|
setuptools = ">=0.7"
|
||||||
six = ">=1.4.0"
|
six = ">=1.4.0"
|
||||||
tzlocal = ">=2.0,<3.0.0 || >=4.0.0"
|
tzlocal = ">=2.0,<3.0.0 || >=4.0.0"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
zookeeper = ["kazoo"]
|
|
||||||
twisted = ["twisted"]
|
|
||||||
tornado = ["tornado (>=4.3)"]
|
|
||||||
testing = ["pytest-asyncio", "pytest-asyncio (<0.6)", "mock", "pytest-tornado5", "pytest-cov", "pytest"]
|
|
||||||
sqlalchemy = ["sqlalchemy (>=0.8)"]
|
|
||||||
rethinkdb = ["rethinkdb (>=2.4.0)"]
|
|
||||||
redis = ["redis (>=3.0)"]
|
|
||||||
mongodb = ["pymongo (>=3.0)"]
|
|
||||||
gevent = ["gevent"]
|
|
||||||
doc = ["sphinx-rtd-theme", "sphinx"]
|
|
||||||
asyncio = ["trollius"]
|
asyncio = ["trollius"]
|
||||||
|
doc = ["sphinx", "sphinx-rtd-theme"]
|
||||||
|
gevent = ["gevent"]
|
||||||
|
mongodb = ["pymongo (>=3.0)"]
|
||||||
|
redis = ["redis (>=3.0)"]
|
||||||
|
rethinkdb = ["rethinkdb (>=2.4.0)"]
|
||||||
|
sqlalchemy = ["sqlalchemy (>=0.8)"]
|
||||||
|
testing = ["mock", "pytest", "pytest-asyncio", "pytest-asyncio (<0.6)", "pytest-cov", "pytest-tornado5"]
|
||||||
|
tornado = ["tornado (>=4.3)"]
|
||||||
|
twisted = ["twisted"]
|
||||||
|
zookeeper = ["kazoo"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "async-timeout"
|
name = "async-timeout"
|
||||||
version = "3.0.1"
|
version = "4.0.2"
|
||||||
description = "Timeout context manager for asyncio programs"
|
description = "Timeout context manager for asyncio programs"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.5.3"
|
python-versions = ">=3.6"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "atomicwrites"
|
|
||||||
version = "1.4.1"
|
|
||||||
description = "Atomic file writes."
|
|
||||||
category = "dev"
|
|
||||||
optional = false
|
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "attrs"
|
name = "attrs"
|
||||||
@ -68,18 +73,54 @@ optional = false
|
|||||||
python-versions = ">=3.5"
|
python-versions = ">=3.5"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"]
|
dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"]
|
||||||
docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
|
docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"]
|
||||||
tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "zope.interface", "cloudpickle"]
|
tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"]
|
||||||
tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "cloudpickle"]
|
tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "chardet"
|
name = "black"
|
||||||
version = "4.0.0"
|
version = "22.8.0"
|
||||||
description = "Universal encoding detector for Python 2 and 3"
|
description = "The uncompromising code formatter."
|
||||||
|
category = "dev"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.6.2"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
click = ">=8.0.0"
|
||||||
|
mypy-extensions = ">=0.4.3"
|
||||||
|
pathspec = ">=0.9.0"
|
||||||
|
platformdirs = ">=2"
|
||||||
|
tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""}
|
||||||
|
typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
colorama = ["colorama (>=0.4.3)"]
|
||||||
|
d = ["aiohttp (>=3.7.4)"]
|
||||||
|
jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
|
||||||
|
uvloop = ["uvloop (>=0.15.2)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "charset-normalizer"
|
||||||
|
version = "2.1.1"
|
||||||
|
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
python-versions = ">=3.6.0"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
unicode_backport = ["unicodedata2"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "click"
|
||||||
|
version = "8.1.3"
|
||||||
|
description = "Composable command line interface toolkit"
|
||||||
|
category = "dev"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
colorama = {version = "*", markers = "platform_system == \"Windows\""}
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "colorama"
|
name = "colorama"
|
||||||
@ -104,56 +145,75 @@ regex = "<2019.02.19 || >2019.02.19,<2021.8.27 || >2021.8.27,<2022.3.15"
|
|||||||
tzlocal = "*"
|
tzlocal = "*"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
langdetect = ["langdetect"]
|
calendars = ["convertdate", "convertdate", "hijri-converter"]
|
||||||
fasttext = ["fasttext"]
|
fasttext = ["fasttext"]
|
||||||
calendars = ["convertdate", "hijri-converter", "convertdate"]
|
langdetect = ["langdetect"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "discord-py-slash-command"
|
name = "dinteractions-Paginator"
|
||||||
version = "3.0.3"
|
version = "2.1.0"
|
||||||
description = "A slash command handler for discord.py."
|
description = "Official interactions.py paginator"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6"
|
python-versions = "*"
|
||||||
|
develop = false
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
aiohttp = "*"
|
discord-py-interactions = ">=4.3.0"
|
||||||
"discord.py" = "*"
|
interactions-wait-for = ">=1.0.5"
|
||||||
|
|
||||||
[package.extras]
|
[package.source]
|
||||||
readthedocs = ["karma-sphinx-theme", "sphinx"]
|
type = "git"
|
||||||
lint = ["karma-sphinx-theme", "sphinx", "isort", "flake8", "black"]
|
url = "https://github.com/interactions-py/paginator.git"
|
||||||
dev = ["karma-sphinx-theme", "sphinx", "isort", "flake8", "black"]
|
reference = "unstable"
|
||||||
|
resolved_reference = "5fa5c4a1fbcbfc634754822a50941cf4c95a2560"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "discord.py"
|
name = "discord-py-interactions"
|
||||||
version = "1.7.3"
|
version = "4.3.2rc1"
|
||||||
description = "A Python wrapper for the Discord API"
|
description = "Easy, simple, scalable and modular: a Python API wrapper for interactions."
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.5.3"
|
python-versions = ">=3.8.6"
|
||||||
|
develop = false
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
aiohttp = ">=3.6.0,<3.8.0"
|
aiohttp = ">=3.8.1"
|
||||||
|
attrs = ">=21.3.0"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
voice = ["PyNaCl (>=1.3.0,<1.5)"]
|
dev = ["Sphinx", "black", "enum-tools[sphinx]", "flake8", "furo", "isort", "pre-commit", "sphinx-copybutton", "sphinx-hoverxref"]
|
||||||
docs = ["sphinxcontrib-websupport", "sphinxcontrib-trio (==1.1.2)", "sphinx (==3.0.3)"]
|
lint = ["black", "flake8", "isort", "pre-commit"]
|
||||||
|
readthedocs = ["Sphinx", "enum-tools[sphinx]", "furo", "sphinx-copybutton", "sphinx-hoverxref"]
|
||||||
|
|
||||||
|
[package.source]
|
||||||
|
type = "git"
|
||||||
|
url = "https://github.com/interactions-py/library.git"
|
||||||
|
reference = "unstable"
|
||||||
|
resolved_reference = "47c4e83bf1f169db1c32e2e32a81ba23cf4624bd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "frozenlist"
|
||||||
|
version = "1.3.1"
|
||||||
|
description = "A list-like structure which implements collections.abc.MutableSequence"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "greenlet"
|
name = "greenlet"
|
||||||
version = "1.1.2"
|
version = "1.1.3"
|
||||||
description = "Lightweight in-process concurrent programming"
|
description = "Lightweight in-process concurrent programming"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*"
|
python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
docs = ["sphinx"]
|
docs = ["Sphinx"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "idna"
|
name = "idna"
|
||||||
version = "3.3"
|
version = "3.4"
|
||||||
description = "Internationalized Domain Names in Applications (IDNA)"
|
description = "Internationalized Domain Names in Applications (IDNA)"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
@ -167,6 +227,17 @@ category = "dev"
|
|||||||
optional = false
|
optional = false
|
||||||
python-versions = "*"
|
python-versions = "*"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "interactions-wait-for"
|
||||||
|
version = "1.0.6"
|
||||||
|
description = "Add a wait_for function to discord-py-interactions"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
discord-py-interactions = ">=4.1.0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "multidict"
|
name = "multidict"
|
||||||
version = "6.0.2"
|
version = "6.0.2"
|
||||||
@ -212,6 +283,26 @@ python-versions = ">=3.6"
|
|||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
|
pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pathspec"
|
||||||
|
version = "0.10.1"
|
||||||
|
description = "Utility library for gitignore style pattern matching of file paths."
|
||||||
|
category = "dev"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "platformdirs"
|
||||||
|
version = "2.5.2"
|
||||||
|
description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
|
||||||
|
category = "dev"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"]
|
||||||
|
test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pluggy"
|
name = "pluggy"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
@ -221,8 +312,8 @@ optional = false
|
|||||||
python-versions = ">=3.6"
|
python-versions = ">=3.6"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
testing = ["pytest-benchmark", "pytest"]
|
dev = ["pre-commit", "tox"]
|
||||||
dev = ["tox", "pre-commit"]
|
testing = ["pytest", "pytest-benchmark"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "py"
|
name = "py"
|
||||||
@ -241,18 +332,17 @@ optional = false
|
|||||||
python-versions = ">=3.6.8"
|
python-versions = ">=3.6.8"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
diagrams = ["railroad-diagrams", "jinja2"]
|
diagrams = ["jinja2", "railroad-diagrams"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pytest"
|
name = "pytest"
|
||||||
version = "7.1.2"
|
version = "7.1.3"
|
||||||
description = "pytest: simple powerful testing with Python"
|
description = "pytest: simple powerful testing with Python"
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.7"
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
atomicwrites = { version = ">=1.0", markers = "sys_platform == \"win32\"" }
|
|
||||||
attrs = ">=19.2.0"
|
attrs = ">=19.2.0"
|
||||||
colorama = {version = "*", markers = "sys_platform == \"win32\""}
|
colorama = {version = "*", markers = "sys_platform == \"win32\""}
|
||||||
iniconfig = "*"
|
iniconfig = "*"
|
||||||
@ -277,11 +367,11 @@ six = ">=1.5"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "python-dotenv"
|
name = "python-dotenv"
|
||||||
version = "0.20.0"
|
version = "0.21.0"
|
||||||
description = "Read key-value pairs from a .env file and set them as environment variables"
|
description = "Read key-value pairs from a .env file and set them as environment variables"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.5"
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
cli = ["click (>=5.0)"]
|
cli = ["click (>=5.0)"]
|
||||||
@ -313,6 +403,19 @@ category = "main"
|
|||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6"
|
python-versions = ">=3.6"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "setuptools"
|
||||||
|
version = "65.3.0"
|
||||||
|
description = "Easily download, build, install, upgrade, and uninstall Python packages"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"]
|
||||||
|
testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mock", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
|
||||||
|
testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "six"
|
name = "six"
|
||||||
version = "1.16.0"
|
version = "1.16.0"
|
||||||
@ -322,8 +425,8 @@ optional = false
|
|||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sqlalchemy"
|
name = "SQLAlchemy"
|
||||||
version = "1.4.40"
|
version = "1.4.41"
|
||||||
description = "Database Abstraction Library"
|
description = "Database Abstraction Library"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
@ -333,25 +436,25 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
|
|||||||
greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"}
|
greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"}
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
aiomysql = ["greenlet (!=0.4.17)", "aiomysql"]
|
aiomysql = ["aiomysql", "greenlet (!=0.4.17)"]
|
||||||
aiosqlite = ["typing_extensions (!=3.10.0.1)", "greenlet (!=0.4.17)", "aiosqlite"]
|
aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"]
|
||||||
asyncio = ["greenlet (!=0.4.17)"]
|
asyncio = ["greenlet (!=0.4.17)"]
|
||||||
asyncmy = ["greenlet (!=0.4.17)", "asyncmy (>=0.2.3,!=0.2.4)"]
|
asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"]
|
||||||
mariadb_connector = ["mariadb (>=1.0.1,!=1.1.2)"]
|
mariadb_connector = ["mariadb (>=1.0.1,!=1.1.2)"]
|
||||||
mssql = ["pyodbc"]
|
mssql = ["pyodbc"]
|
||||||
mssql_pymssql = ["pymssql"]
|
mssql_pymssql = ["pymssql"]
|
||||||
mssql_pyodbc = ["pyodbc"]
|
mssql_pyodbc = ["pyodbc"]
|
||||||
mypy = ["sqlalchemy2-stubs", "mypy (>=0.910)"]
|
mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"]
|
||||||
mysql = ["mysqlclient (>=1.4.0,<2)", "mysqlclient (>=1.4.0)"]
|
mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"]
|
||||||
mysql_connector = ["mysql-connector-python"]
|
mysql_connector = ["mysql-connector-python"]
|
||||||
oracle = ["cx_oracle (>=7,<8)", "cx_oracle (>=7)"]
|
oracle = ["cx_oracle (>=7)", "cx_oracle (>=7,<8)"]
|
||||||
postgresql = ["psycopg2 (>=2.7)"]
|
postgresql = ["psycopg2 (>=2.7)"]
|
||||||
postgresql_asyncpg = ["greenlet (!=0.4.17)", "asyncpg"]
|
postgresql_asyncpg = ["asyncpg", "greenlet (!=0.4.17)"]
|
||||||
postgresql_pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"]
|
postgresql_pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"]
|
||||||
postgresql_psycopg2binary = ["psycopg2-binary"]
|
postgresql_psycopg2binary = ["psycopg2-binary"]
|
||||||
postgresql_psycopg2cffi = ["psycopg2cffi"]
|
postgresql_psycopg2cffi = ["psycopg2cffi"]
|
||||||
pymysql = ["pymysql (<1)", "pymysql"]
|
pymysql = ["pymysql", "pymysql (<1)"]
|
||||||
sqlcipher = ["sqlcipher3-binary"]
|
sqlcipher = ["sqlcipher3_binary"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tomli"
|
name = "tomli"
|
||||||
@ -371,7 +474,7 @@ python-versions = "*"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "types-pytz"
|
name = "types-pytz"
|
||||||
version = "2022.1.2"
|
version = "2022.2.1.0"
|
||||||
description = "Typing stubs for pytz"
|
description = "Typing stubs for pytz"
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
@ -381,7 +484,7 @@ python-versions = "*"
|
|||||||
name = "typing-extensions"
|
name = "typing-extensions"
|
||||||
version = "4.3.0"
|
version = "4.3.0"
|
||||||
description = "Backported and Experimental Type Hints for Python 3.7+"
|
description = "Backported and Experimental Type Hints for Python 3.7+"
|
||||||
category = "main"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.7"
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
@ -406,8 +509,8 @@ pytz-deprecation-shim = "*"
|
|||||||
tzdata = {version = "*", markers = "platform_system == \"Windows\""}
|
tzdata = {version = "*", markers = "platform_system == \"Windows\""}
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
|
devenv = ["black", "pyroma", "pytest-cov", "zest.releaser"]
|
||||||
test = ["pytest (>=4.3)", "pytest-mock (>=3.3)"]
|
test = ["pytest (>=4.3)", "pytest-mock (>=3.3)"]
|
||||||
devenv = ["zest.releaser", "pytest-cov", "pyroma", "black"]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "yarl"
|
name = "yarl"
|
||||||
@ -424,66 +527,131 @@ multidict = ">=4.0"
|
|||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "1.1"
|
lock-version = "1.1"
|
||||||
python-versions = "^3.9"
|
python-versions = "^3.9"
|
||||||
content-hash = "65479ab66de5e952949a0aaf54d1b40c3214392b02884ee0d6ad9af10737b809"
|
content-hash = "ee932a49c2278086f28d13735e483526bd1ee91feb33f0682aaf42aa59048aa5"
|
||||||
|
|
||||||
[metadata.files]
|
[metadata.files]
|
||||||
aiohttp = [
|
aiohttp = [
|
||||||
{ file = "aiohttp-3.7.4.post0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:3cf75f7cdc2397ed4442594b935a11ed5569961333d49b7539ea741be2cc79d5" },
|
{file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1ed0b6477896559f17b9eaeb6d38e07f7f9ffe40b9f0f9627ae8b9926ae260a8"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:4b302b45040890cea949ad092479e01ba25911a15e648429c7c5aae9650c67a8" },
|
{file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7dadf3c307b31e0e61689cbf9e06be7a867c563d5a63ce9dca578f956609abf8"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:fe60131d21b31fd1a14bd43e6bb88256f69dfc3188b3a89d736d6c71ed43ec95" },
|
{file = "aiohttp-3.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a79004bb58748f31ae1cbe9fa891054baaa46fb106c2dc7af9f8e3304dc30316"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:393f389841e8f2dfc86f774ad22f00923fdee66d238af89b70ea314c4aefd290" },
|
{file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12de6add4038df8f72fac606dff775791a60f113a725c960f2bab01d8b8e6b15"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:c6e9dcb4cb338d91a73f178d866d051efe7c62a7166653a91e7d9fb18274058f" },
|
{file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f0d5f33feb5f69ddd57a4a4bd3d56c719a141080b445cbf18f238973c5c9923"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:5df68496d19f849921f05f14f31bd6ef53ad4b00245da3195048c69934521809" },
|
{file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eaba923151d9deea315be1f3e2b31cc39a6d1d2f682f942905951f4e40200922"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:0563c1b3826945eecd62186f3f5c7d31abb7391fedc893b7e2b26303b5a9f3fe" },
|
{file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:099ebd2c37ac74cce10a3527d2b49af80243e2a4fa39e7bce41617fbc35fa3c1"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp36-cp36m-win32.whl", hash = "sha256:3d78619672183be860b96ed96f533046ec97ca067fd46ac1f6a09cd9b7484287" },
|
{file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2e5d962cf7e1d426aa0e528a7e198658cdc8aa4fe87f781d039ad75dcd52c516"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp36-cp36m-win_amd64.whl", hash = "sha256:f705e12750171c0ab4ef2a3c76b9a4024a62c4103e3a55dd6f99265b9bc6fcfc" },
|
{file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fa0ffcace9b3aa34d205d8130f7873fcfefcb6a4dd3dd705b0dab69af6712642"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:230a8f7e24298dea47659251abc0fd8b3c4e38a664c59d4b89cca7f6c09c9e87" },
|
{file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:61bfc23df345d8c9716d03717c2ed5e27374e0fe6f659ea64edcd27b4b044cf7"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2e19413bf84934d651344783c9f5e22dee452e251cfd220ebadbed2d9931dbf0" },
|
{file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:31560d268ff62143e92423ef183680b9829b1b482c011713ae941997921eebc8"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e4b2b334e68b18ac9817d828ba44d8fcb391f6acb398bcc5062b14b2cbeac970" },
|
{file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:01d7bdb774a9acc838e6b8f1d114f45303841b89b95984cbb7d80ea41172a9e3"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:d012ad7911653a906425d8473a1465caa9f8dea7fcf07b6d870397b774ea7c0f" },
|
{file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:97ef77eb6b044134c0b3a96e16abcb05ecce892965a2124c566af0fd60f717e2"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:40eced07f07a9e60e825554a31f923e8d3997cfc7fb31dbc1328c70826e04cde" },
|
{file = "aiohttp-3.8.1-cp310-cp310-win32.whl", hash = "sha256:c2aef4703f1f2ddc6df17519885dbfa3514929149d3ff900b73f45998f2532fa"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:209b4a8ee987eccc91e2bd3ac36adee0e53a5970b8ac52c273f7f8fd4872c94c" },
|
{file = "aiohttp-3.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:713ac174a629d39b7c6a3aa757b337599798da4c1157114a314e4e391cd28e32"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:14762875b22d0055f05d12abc7f7d61d5fd4fe4642ce1a249abdf8c700bf1fd8" },
|
{file = "aiohttp-3.8.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:473d93d4450880fe278696549f2e7aed8cd23708c3c1997981464475f32137db"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp37-cp37m-win32.whl", hash = "sha256:7615dab56bb07bff74bc865307aeb89a8bfd9941d2ef9d817b9436da3a0ea54f" },
|
{file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99b5eeae8e019e7aad8af8bb314fb908dd2e028b3cdaad87ec05095394cce632"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp37-cp37m-win_amd64.whl", hash = "sha256:d9e13b33afd39ddeb377eff2c1c4f00544e191e1d1dee5b6c51ddee8ea6f0cf5" },
|
{file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af642b43ce56c24d063325dd2cf20ee012d2b9ba4c3c008755a301aaea720ad"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:547da6cacac20666422d4882cfcd51298d45f7ccb60a04ec27424d2f36ba3eaf" },
|
{file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3630c3ef435c0a7c549ba170a0633a56e92629aeed0e707fec832dee313fb7a"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:af9aa9ef5ba1fd5b8c948bb11f44891968ab30356d65fd0cc6707d989cd521df" },
|
{file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4a4a4e30bf1edcad13fb0804300557aedd07a92cabc74382fdd0ba6ca2661091"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:64322071e046020e8797117b3658b9c2f80e3267daec409b350b6a7a05041213" },
|
{file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6f8b01295e26c68b3a1b90efb7a89029110d3a4139270b24fda961893216c440"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bb437315738aa441251214dad17428cafda9cdc9729499f1d6001748e1d432f4" },
|
{file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a25fa703a527158aaf10dafd956f7d42ac6d30ec80e9a70846253dd13e2f067b"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:e54962802d4b8b18b6207d4a927032826af39395a3bd9196a5af43fc4e60b009" },
|
{file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5bfde62d1d2641a1f5173b8c8c2d96ceb4854f54a44c23102e2ccc7e02f003ec"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:a00bb73540af068ca7390e636c01cbc4f644961896fa9363154ff43fd37af2f5" },
|
{file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:51467000f3647d519272392f484126aa716f747859794ac9924a7aafa86cd411"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:79ebfc238612123a713a457d92afb4096e2148be17df6c50fb9bf7a81c2f8013" },
|
{file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:03a6d5349c9ee8f79ab3ff3694d6ce1cfc3ced1c9d36200cb8f08ba06bd3b782"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp38-cp38-win32.whl", hash = "sha256:515dfef7f869a0feb2afee66b957cc7bbe9ad0cdee45aec7fdc623f4ecd4fb16" },
|
{file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:102e487eeb82afac440581e5d7f8f44560b36cf0bdd11abc51a46c1cd88914d4"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp38-cp38-win_amd64.whl", hash = "sha256:114b281e4d68302a324dd33abb04778e8557d88947875cbf4e842c2c01a030c5" },
|
{file = "aiohttp-3.8.1-cp36-cp36m-win32.whl", hash = "sha256:4aed991a28ea3ce320dc8ce655875e1e00a11bdd29fe9444dd4f88c30d558602"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:7b18b97cf8ee5452fa5f4e3af95d01d84d86d32c5e2bfa260cf041749d66360b" },
|
{file = "aiohttp-3.8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b0e20cddbd676ab8a64c774fefa0ad787cc506afd844de95da56060348021e96"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:15492a6368d985b76a2a5fdd2166cddfea5d24e69eefed4630cbaae5c81d89bd" },
|
{file = "aiohttp-3.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:37951ad2f4a6df6506750a23f7cbabad24c73c65f23f72e95897bb2cecbae676"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bdb230b4943891321e06fc7def63c7aace16095be7d9cf3b1e01be2f10fba439" },
|
{file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c23b1ad869653bc818e972b7a3a79852d0e494e9ab7e1a701a3decc49c20d51"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:cffe3ab27871bc3ea47df5d8f7013945712c46a3cc5a95b6bee15887f1675c22" },
|
{file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:15b09b06dae900777833fe7fc4b4aa426556ce95847a3e8d7548e2d19e34edb8"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:f881853d2643a29e643609da57b96d5f9c9b93f62429dcc1cbb413c7d07f0e1a" },
|
{file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:477c3ea0ba410b2b56b7efb072c36fa91b1e6fc331761798fa3f28bb224830dd"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:a5ca29ee66f8343ed336816c553e82d6cade48a3ad702b9ffa6125d187e2dedb" },
|
{file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2f2f69dca064926e79997f45b2f34e202b320fd3782f17a91941f7eb85502ee2"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:17c073de315745a1510393a96e680d20af8e67e324f70b42accbd4cb3315c9fb" },
|
{file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ef9612483cb35171d51d9173647eed5d0069eaa2ee812793a75373447d487aa4"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp39-cp39-win32.whl", hash = "sha256:932bb1ea39a54e9ea27fc9232163059a0b8855256f4052e776357ad9add6f1c9" },
|
{file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6d69f36d445c45cda7b3b26afef2fc34ef5ac0cdc75584a87ef307ee3c8c6d00"},
|
||||||
{ file = "aiohttp-3.7.4.post0-cp39-cp39-win_amd64.whl", hash = "sha256:02f46fc0e3c5ac58b80d4d56eb0a7c7d97fcef69ace9326289fb9f1955e65cfe" },
|
{file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:55c3d1072704d27401c92339144d199d9de7b52627f724a949fc7d5fc56d8b93"},
|
||||||
{ file = "aiohttp-3.7.4.post0.tar.gz", hash = "sha256:493d3299ebe5f5a7c66b9819eacdcfbbaaf1a8e84911ddffcdc48888497afecf" },
|
{file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b9d00268fcb9f66fbcc7cd9fe423741d90c75ee029a1d15c09b22d23253c0a44"},
|
||||||
|
{file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:07b05cd3305e8a73112103c834e91cd27ce5b4bd07850c4b4dbd1877d3f45be7"},
|
||||||
|
{file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c34dc4958b232ef6188c4318cb7b2c2d80521c9a56c52449f8f93ab7bc2a8a1c"},
|
||||||
|
{file = "aiohttp-3.8.1-cp37-cp37m-win32.whl", hash = "sha256:d2f9b69293c33aaa53d923032fe227feac867f81682f002ce33ffae978f0a9a9"},
|
||||||
|
{file = "aiohttp-3.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6ae828d3a003f03ae31915c31fa684b9890ea44c9c989056fea96e3d12a9fa17"},
|
||||||
|
{file = "aiohttp-3.8.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0c7ebbbde809ff4e970824b2b6cb7e4222be6b95a296e46c03cf050878fc1785"},
|
||||||
|
{file = "aiohttp-3.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b7ef7cbd4fec9a1e811a5de813311ed4f7ac7d93e0fda233c9b3e1428f7dd7b"},
|
||||||
|
{file = "aiohttp-3.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c3d6a4d0619e09dcd61021debf7059955c2004fa29f48788a3dfaf9c9901a7cd"},
|
||||||
|
{file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:718626a174e7e467f0558954f94af117b7d4695d48eb980146016afa4b580b2e"},
|
||||||
|
{file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:589c72667a5febd36f1315aa6e5f56dd4aa4862df295cb51c769d16142ddd7cd"},
|
||||||
|
{file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ed076098b171573161eb146afcb9129b5ff63308960aeca4b676d9d3c35e700"},
|
||||||
|
{file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:086f92daf51a032d062ec5f58af5ca6a44d082c35299c96376a41cbb33034675"},
|
||||||
|
{file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:11691cf4dc5b94236ccc609b70fec991234e7ef8d4c02dd0c9668d1e486f5abf"},
|
||||||
|
{file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:31d1e1c0dbf19ebccbfd62eff461518dcb1e307b195e93bba60c965a4dcf1ba0"},
|
||||||
|
{file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:11a67c0d562e07067c4e86bffc1553f2cf5b664d6111c894671b2b8712f3aba5"},
|
||||||
|
{file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:bb01ba6b0d3f6c68b89fce7305080145d4877ad3acaed424bae4d4ee75faa950"},
|
||||||
|
{file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:44db35a9e15d6fe5c40d74952e803b1d96e964f683b5a78c3cc64eb177878155"},
|
||||||
|
{file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:844a9b460871ee0a0b0b68a64890dae9c415e513db0f4a7e3cab41a0f2fedf33"},
|
||||||
|
{file = "aiohttp-3.8.1-cp38-cp38-win32.whl", hash = "sha256:7d08744e9bae2ca9c382581f7dce1273fe3c9bae94ff572c3626e8da5b193c6a"},
|
||||||
|
{file = "aiohttp-3.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:04d48b8ce6ab3cf2097b1855e1505181bdd05586ca275f2505514a6e274e8e75"},
|
||||||
|
{file = "aiohttp-3.8.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5315a2eb0239185af1bddb1abf472d877fede3cc8d143c6cddad37678293237"},
|
||||||
|
{file = "aiohttp-3.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a996d01ca39b8dfe77440f3cd600825d05841088fd6bc0144cc6c2ec14cc5f74"},
|
||||||
|
{file = "aiohttp-3.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:13487abd2f761d4be7c8ff9080de2671e53fff69711d46de703c310c4c9317ca"},
|
||||||
|
{file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea302f34477fda3f85560a06d9ebdc7fa41e82420e892fc50b577e35fc6a50b2"},
|
||||||
|
{file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2f635ce61a89c5732537a7896b6319a8fcfa23ba09bec36e1b1ac0ab31270d2"},
|
||||||
|
{file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e999f2d0e12eea01caeecb17b653f3713d758f6dcc770417cf29ef08d3931421"},
|
||||||
|
{file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0770e2806a30e744b4e21c9d73b7bee18a1cfa3c47991ee2e5a65b887c49d5cf"},
|
||||||
|
{file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d15367ce87c8e9e09b0f989bfd72dc641bcd04ba091c68cd305312d00962addd"},
|
||||||
|
{file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c7cefb4b0640703eb1069835c02486669312bf2f12b48a748e0a7756d0de33d"},
|
||||||
|
{file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:71927042ed6365a09a98a6377501af5c9f0a4d38083652bcd2281a06a5976724"},
|
||||||
|
{file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:28d490af82bc6b7ce53ff31337a18a10498303fe66f701ab65ef27e143c3b0ef"},
|
||||||
|
{file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b6613280ccedf24354406caf785db748bebbddcf31408b20c0b48cb86af76866"},
|
||||||
|
{file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81e3d8c34c623ca4e36c46524a3530e99c0bc95ed068fd6e9b55cb721d408fb2"},
|
||||||
|
{file = "aiohttp-3.8.1-cp39-cp39-win32.whl", hash = "sha256:7187a76598bdb895af0adbd2fb7474d7f6025d170bc0a1130242da817ce9e7d1"},
|
||||||
|
{file = "aiohttp-3.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:1c182cb873bc91b411e184dab7a2b664d4fea2743df0e4d57402f7f3fa644bac"},
|
||||||
|
{file = "aiohttp-3.8.1.tar.gz", hash = "sha256:fc5471e1a54de15ef71c1bc6ebe80d4dc681ea600e68bfd1cbce40427f0b7578"},
|
||||||
]
|
]
|
||||||
apscheduler = [
|
aiosignal = [
|
||||||
|
{file = "aiosignal-1.2.0-py3-none-any.whl", hash = "sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a"},
|
||||||
|
{file = "aiosignal-1.2.0.tar.gz", hash = "sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2"},
|
||||||
|
]
|
||||||
|
APScheduler = [
|
||||||
{file = "APScheduler-3.9.1-py2.py3-none-any.whl", hash = "sha256:ddc25a0ddd899de44d7f451f4375fb971887e65af51e41e5dcf681f59b8b2c9a"},
|
{file = "APScheduler-3.9.1-py2.py3-none-any.whl", hash = "sha256:ddc25a0ddd899de44d7f451f4375fb971887e65af51e41e5dcf681f59b8b2c9a"},
|
||||||
{file = "APScheduler-3.9.1.tar.gz", hash = "sha256:65e6574b6395498d371d045f2a8a7e4f7d50c6ad21ef7313d15b1c7cf20df1e3"},
|
{file = "APScheduler-3.9.1.tar.gz", hash = "sha256:65e6574b6395498d371d045f2a8a7e4f7d50c6ad21ef7313d15b1c7cf20df1e3"},
|
||||||
]
|
]
|
||||||
async-timeout = [
|
async-timeout = [
|
||||||
{ file = "async-timeout-3.0.1.tar.gz", hash = "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f" },
|
{file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"},
|
||||||
{ file = "async_timeout-3.0.1-py3-none-any.whl", hash = "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3" },
|
{file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"},
|
||||||
]
|
|
||||||
atomicwrites = [
|
|
||||||
{ file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11" },
|
|
||||||
]
|
]
|
||||||
attrs = [
|
attrs = [
|
||||||
{file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"},
|
{file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"},
|
||||||
{file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"},
|
{file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"},
|
||||||
]
|
]
|
||||||
chardet = [
|
black = [
|
||||||
{ file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5" },
|
{file = "black-22.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce957f1d6b78a8a231b18e0dd2d94a33d2ba738cd88a7fe64f53f659eea49fdd"},
|
||||||
{ file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa" },
|
{file = "black-22.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5107ea36b2b61917956d018bd25129baf9ad1125e39324a9b18248d362156a27"},
|
||||||
|
{file = "black-22.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8166b7bfe5dcb56d325385bd1d1e0f635f24aae14b3ae437102dedc0c186747"},
|
||||||
|
{file = "black-22.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd82842bb272297503cbec1a2600b6bfb338dae017186f8f215c8958f8acf869"},
|
||||||
|
{file = "black-22.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d839150f61d09e7217f52917259831fe2b689f5c8e5e32611736351b89bb2a90"},
|
||||||
|
{file = "black-22.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a05da0430bd5ced89176db098567973be52ce175a55677436a271102d7eaa3fe"},
|
||||||
|
{file = "black-22.8.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a098a69a02596e1f2a58a2a1c8d5a05d5a74461af552b371e82f9fa4ada8342"},
|
||||||
|
{file = "black-22.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5594efbdc35426e35a7defa1ea1a1cb97c7dbd34c0e49af7fb593a36bd45edab"},
|
||||||
|
{file = "black-22.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a983526af1bea1e4cf6768e649990f28ee4f4137266921c2c3cee8116ae42ec3"},
|
||||||
|
{file = "black-22.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b2c25f8dea5e8444bdc6788a2f543e1fb01494e144480bc17f806178378005e"},
|
||||||
|
{file = "black-22.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:78dd85caaab7c3153054756b9fe8c611efa63d9e7aecfa33e533060cb14b6d16"},
|
||||||
|
{file = "black-22.8.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cea1b2542d4e2c02c332e83150e41e3ca80dc0fb8de20df3c5e98e242156222c"},
|
||||||
|
{file = "black-22.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5b879eb439094751185d1cfdca43023bc6786bd3c60372462b6f051efa6281a5"},
|
||||||
|
{file = "black-22.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a12e4e1353819af41df998b02c6742643cfef58282915f781d0e4dd7a200411"},
|
||||||
|
{file = "black-22.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3a73f66b6d5ba7288cd5d6dad9b4c9b43f4e8a4b789a94bf5abfb878c663eb3"},
|
||||||
|
{file = "black-22.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:e981e20ec152dfb3e77418fb616077937378b322d7b26aa1ff87717fb18b4875"},
|
||||||
|
{file = "black-22.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8ce13ffed7e66dda0da3e0b2eb1bdfc83f5812f66e09aca2b0978593ed636b6c"},
|
||||||
|
{file = "black-22.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:32a4b17f644fc288c6ee2bafdf5e3b045f4eff84693ac069d87b1a347d861497"},
|
||||||
|
{file = "black-22.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ad827325a3a634bae88ae7747db1a395d5ee02cf05d9aa7a9bd77dfb10e940c"},
|
||||||
|
{file = "black-22.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53198e28a1fb865e9fe97f88220da2e44df6da82b18833b588b1883b16bb5d41"},
|
||||||
|
{file = "black-22.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:bc4d4123830a2d190e9cc42a2e43570f82ace35c3aeb26a512a2102bce5af7ec"},
|
||||||
|
{file = "black-22.8.0-py3-none-any.whl", hash = "sha256:d2c21d439b2baf7aa80d6dd4e3659259be64c6f49dfd0f32091063db0e006db4"},
|
||||||
|
{file = "black-22.8.0.tar.gz", hash = "sha256:792f7eb540ba9a17e8656538701d3eb1afcb134e3b45b71f20b25c77a8db7e6e"},
|
||||||
|
]
|
||||||
|
charset-normalizer = [
|
||||||
|
{file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"},
|
||||||
|
{file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"},
|
||||||
|
]
|
||||||
|
click = [
|
||||||
|
{file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"},
|
||||||
|
{file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"},
|
||||||
]
|
]
|
||||||
colorama = [
|
colorama = [
|
||||||
{file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"},
|
{file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"},
|
||||||
@ -493,79 +661,137 @@ dateparser = [
|
|||||||
{file = "dateparser-1.1.1-py2.py3-none-any.whl", hash = "sha256:9600874312ff28a41f96ec7ccdc73be1d1c44435719da47fea3339d55ff5a628"},
|
{file = "dateparser-1.1.1-py2.py3-none-any.whl", hash = "sha256:9600874312ff28a41f96ec7ccdc73be1d1c44435719da47fea3339d55ff5a628"},
|
||||||
{file = "dateparser-1.1.1.tar.gz", hash = "sha256:038196b1f12c7397e38aad3d61588833257f6f552baa63a1499e6987fa8d42d9"},
|
{file = "dateparser-1.1.1.tar.gz", hash = "sha256:038196b1f12c7397e38aad3d61588833257f6f552baa63a1499e6987fa8d42d9"},
|
||||||
]
|
]
|
||||||
discord-py-slash-command = [
|
dinteractions-Paginator = []
|
||||||
{ file = "discord-py-slash-command-3.0.3.tar.gz", hash = "sha256:a9a220492e1a32fc66a20aebe49ccb6d6308a504d79627096f4e9443fdd8978e" },
|
discord-py-interactions = []
|
||||||
{ file = "discord_py_slash_command-3.0.3-py3-none-any.whl", hash = "sha256:e6a83a0bd656ad96859483450ade1a4e760b3351e612a9639fd6acf14abe1676" },
|
frozenlist = [
|
||||||
]
|
{file = "frozenlist-1.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5f271c93f001748fc26ddea409241312a75e13466b06c94798d1a341cf0e6989"},
|
||||||
"discord.py" = [
|
{file = "frozenlist-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c6ef8014b842f01f5d2b55315f1af5cbfde284eb184075c189fd657c2fd8204"},
|
||||||
{ file = "discord.py-1.7.3-py3-none-any.whl", hash = "sha256:c6f64db136de0e18e090f6752ea68bdd4ab0a61b82dfe7acecefa22d6477bb0c" },
|
{file = "frozenlist-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:219a9676e2eae91cb5cc695a78b4cb43d8123e4160441d2b6ce8d2c70c60e2f3"},
|
||||||
{ file = "discord.py-1.7.3.tar.gz", hash = "sha256:462cd0fe307aef8b29cbfa8dd613e548ae4b2cb581d46da9ac0d46fb6ea19408" },
|
{file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b47d64cdd973aede3dd71a9364742c542587db214e63b7529fbb487ed67cddd9"},
|
||||||
|
{file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2af6f7a4e93f5d08ee3f9152bce41a6015b5cf87546cb63872cc19b45476e98a"},
|
||||||
|
{file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a718b427ff781c4f4e975525edb092ee2cdef6a9e7bc49e15063b088961806f8"},
|
||||||
|
{file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c56c299602c70bc1bb5d1e75f7d8c007ca40c9d7aebaf6e4ba52925d88ef826d"},
|
||||||
|
{file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:717470bfafbb9d9be624da7780c4296aa7935294bd43a075139c3d55659038ca"},
|
||||||
|
{file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:31b44f1feb3630146cffe56344704b730c33e042ffc78d21f2125a6a91168131"},
|
||||||
|
{file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c3b31180b82c519b8926e629bf9f19952c743e089c41380ddca5db556817b221"},
|
||||||
|
{file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d82bed73544e91fb081ab93e3725e45dd8515c675c0e9926b4e1f420a93a6ab9"},
|
||||||
|
{file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49459f193324fbd6413e8e03bd65789e5198a9fa3095e03f3620dee2f2dabff2"},
|
||||||
|
{file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:94e680aeedc7fd3b892b6fa8395b7b7cc4b344046c065ed4e7a1e390084e8cb5"},
|
||||||
|
{file = "frozenlist-1.3.1-cp310-cp310-win32.whl", hash = "sha256:fabb953ab913dadc1ff9dcc3a7a7d3dc6a92efab3a0373989b8063347f8705be"},
|
||||||
|
{file = "frozenlist-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:eee0c5ecb58296580fc495ac99b003f64f82a74f9576a244d04978a7e97166db"},
|
||||||
|
{file = "frozenlist-1.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0bc75692fb3770cf2b5856a6c2c9de967ca744863c5e89595df64e252e4b3944"},
|
||||||
|
{file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086ca1ac0a40e722d6833d4ce74f5bf1aba2c77cbfdc0cd83722ffea6da52a04"},
|
||||||
|
{file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b51eb355e7f813bcda00276b0114c4172872dc5fb30e3fea059b9367c18fbcb"},
|
||||||
|
{file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74140933d45271c1a1283f708c35187f94e1256079b3c43f0c2267f9db5845ff"},
|
||||||
|
{file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee4c5120ddf7d4dd1eaf079af3af7102b56d919fa13ad55600a4e0ebe532779b"},
|
||||||
|
{file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97d9e00f3ac7c18e685320601f91468ec06c58acc185d18bb8e511f196c8d4b2"},
|
||||||
|
{file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6e19add867cebfb249b4e7beac382d33215d6d54476bb6be46b01f8cafb4878b"},
|
||||||
|
{file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a027f8f723d07c3f21963caa7d585dcc9b089335565dabe9c814b5f70c52705a"},
|
||||||
|
{file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:61d7857950a3139bce035ad0b0945f839532987dfb4c06cfe160254f4d19df03"},
|
||||||
|
{file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:53b2b45052e7149ee8b96067793db8ecc1ae1111f2f96fe1f88ea5ad5fd92d10"},
|
||||||
|
{file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bbb1a71b1784e68870800b1bc9f3313918edc63dbb8f29fbd2e767ce5821696c"},
|
||||||
|
{file = "frozenlist-1.3.1-cp37-cp37m-win32.whl", hash = "sha256:ab6fa8c7871877810e1b4e9392c187a60611fbf0226a9e0b11b7b92f5ac72792"},
|
||||||
|
{file = "frozenlist-1.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f89139662cc4e65a4813f4babb9ca9544e42bddb823d2ec434e18dad582543bc"},
|
||||||
|
{file = "frozenlist-1.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4c0c99e31491a1d92cde8648f2e7ccad0e9abb181f6ac3ddb9fc48b63301808e"},
|
||||||
|
{file = "frozenlist-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:61e8cb51fba9f1f33887e22488bad1e28dd8325b72425f04517a4d285a04c519"},
|
||||||
|
{file = "frozenlist-1.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc2f3e368ee5242a2cbe28323a866656006382872c40869b49b265add546703f"},
|
||||||
|
{file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58fb94a01414cddcdc6839807db77ae8057d02ddafc94a42faee6004e46c9ba8"},
|
||||||
|
{file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:022178b277cb9277d7d3b3f2762d294f15e85cd2534047e68a118c2bb0058f3e"},
|
||||||
|
{file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:572ce381e9fe027ad5e055f143763637dcbac2542cfe27f1d688846baeef5170"},
|
||||||
|
{file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19127f8dcbc157ccb14c30e6f00392f372ddb64a6ffa7106b26ff2196477ee9f"},
|
||||||
|
{file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42719a8bd3792744c9b523674b752091a7962d0d2d117f0b417a3eba97d1164b"},
|
||||||
|
{file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2743bb63095ef306041c8f8ea22bd6e4d91adabf41887b1ad7886c4c1eb43d5f"},
|
||||||
|
{file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:fa47319a10e0a076709644a0efbcaab9e91902c8bd8ef74c6adb19d320f69b83"},
|
||||||
|
{file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52137f0aea43e1993264a5180c467a08a3e372ca9d378244c2d86133f948b26b"},
|
||||||
|
{file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:f5abc8b4d0c5b556ed8cd41490b606fe99293175a82b98e652c3f2711b452988"},
|
||||||
|
{file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1e1cf7bc8cbbe6ce3881863671bac258b7d6bfc3706c600008925fb799a256e2"},
|
||||||
|
{file = "frozenlist-1.3.1-cp38-cp38-win32.whl", hash = "sha256:0dde791b9b97f189874d654c55c24bf7b6782343e14909c84beebd28b7217845"},
|
||||||
|
{file = "frozenlist-1.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:9494122bf39da6422b0972c4579e248867b6b1b50c9b05df7e04a3f30b9a413d"},
|
||||||
|
{file = "frozenlist-1.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:31bf9539284f39ff9398deabf5561c2b0da5bb475590b4e13dd8b268d7a3c5c1"},
|
||||||
|
{file = "frozenlist-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e0c8c803f2f8db7217898d11657cb6042b9b0553a997c4a0601f48a691480fab"},
|
||||||
|
{file = "frozenlist-1.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da5ba7b59d954f1f214d352308d1d86994d713b13edd4b24a556bcc43d2ddbc3"},
|
||||||
|
{file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74e6b2b456f21fc93ce1aff2b9728049f1464428ee2c9752a4b4f61e98c4db96"},
|
||||||
|
{file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526d5f20e954d103b1d47232e3839f3453c02077b74203e43407b962ab131e7b"},
|
||||||
|
{file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b499c6abe62a7a8d023e2c4b2834fce78a6115856ae95522f2f974139814538c"},
|
||||||
|
{file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab386503f53bbbc64d1ad4b6865bf001414930841a870fc97f1546d4d133f141"},
|
||||||
|
{file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f63c308f82a7954bf8263a6e6de0adc67c48a8b484fab18ff87f349af356efd"},
|
||||||
|
{file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:12607804084d2244a7bd4685c9d0dca5df17a6a926d4f1967aa7978b1028f89f"},
|
||||||
|
{file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:da1cdfa96425cbe51f8afa43e392366ed0b36ce398f08b60de6b97e3ed4affef"},
|
||||||
|
{file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f810e764617b0748b49a731ffaa525d9bb36ff38332411704c2400125af859a6"},
|
||||||
|
{file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:35c3d79b81908579beb1fb4e7fcd802b7b4921f1b66055af2578ff7734711cfa"},
|
||||||
|
{file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c92deb5d9acce226a501b77307b3b60b264ca21862bd7d3e0c1f3594022f01bc"},
|
||||||
|
{file = "frozenlist-1.3.1-cp39-cp39-win32.whl", hash = "sha256:5e77a8bd41e54b05e4fb2708dc6ce28ee70325f8c6f50f3df86a44ecb1d7a19b"},
|
||||||
|
{file = "frozenlist-1.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:625d8472c67f2d96f9a4302a947f92a7adbc1e20bedb6aff8dbc8ff039ca6189"},
|
||||||
|
{file = "frozenlist-1.3.1.tar.gz", hash = "sha256:3a735e4211a04ccfa3f4833547acdf5d2f863bfeb01cfd3edaffbc251f15cec8"},
|
||||||
]
|
]
|
||||||
greenlet = [
|
greenlet = [
|
||||||
{ file = "greenlet-1.1.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:58df5c2a0e293bf665a51f8a100d3e9956febfbf1d9aaf8c0677cf70218910c6" },
|
{file = "greenlet-1.1.3-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:8c287ae7ac921dfde88b1c125bd9590b7ec3c900c2d3db5197f1286e144e712b"},
|
||||||
{ file = "greenlet-1.1.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:aec52725173bd3a7b56fe91bc56eccb26fbdff1386ef123abb63c84c5b43b63a" },
|
{file = "greenlet-1.1.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:870a48007872d12e95a996fca3c03a64290d3ea2e61076aa35d3b253cf34cd32"},
|
||||||
{ file = "greenlet-1.1.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:833e1551925ed51e6b44c800e71e77dacd7e49181fdc9ac9a0bf3714d515785d" },
|
{file = "greenlet-1.1.3-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:7c5227963409551ae4a6938beb70d56bf1918c554a287d3da6853526212fbe0a"},
|
||||||
{ file = "greenlet-1.1.2-cp27-cp27m-win32.whl", hash = "sha256:aa5b467f15e78b82257319aebc78dd2915e4c1436c3c0d1ad6f53e47ba6e2713" },
|
{file = "greenlet-1.1.3-cp27-cp27m-win32.whl", hash = "sha256:9fae214f6c43cd47f7bef98c56919b9222481e833be2915f6857a1e9e8a15318"},
|
||||||
{ file = "greenlet-1.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:40b951f601af999a8bf2ce8c71e8aaa4e8c6f78ff8afae7b808aae2dc50d4c40" },
|
{file = "greenlet-1.1.3-cp27-cp27m-win_amd64.whl", hash = "sha256:de431765bd5fe62119e0bc6bc6e7b17ac53017ae1782acf88fcf6b7eae475a49"},
|
||||||
{ file = "greenlet-1.1.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:95e69877983ea39b7303570fa6760f81a3eec23d0e3ab2021b7144b94d06202d" },
|
{file = "greenlet-1.1.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:510c3b15587afce9800198b4b142202b323bf4b4b5f9d6c79cb9a35e5e3c30d2"},
|
||||||
{ file = "greenlet-1.1.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:356b3576ad078c89a6107caa9c50cc14e98e3a6c4874a37c3e0273e4baf33de8" },
|
{file = "greenlet-1.1.3-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:9951dcbd37850da32b2cb6e391f621c1ee456191c6ae5528af4a34afe357c30e"},
|
||||||
{ file = "greenlet-1.1.2-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:8639cadfda96737427330a094476d4c7a56ac03de7265622fcf4cfe57c8ae18d" },
|
{file = "greenlet-1.1.3-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:07c58e169bbe1e87b8bbf15a5c1b779a7616df9fd3e61cadc9d691740015b4f8"},
|
||||||
{ file = "greenlet-1.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97e5306482182170ade15c4b0d8386ded995a07d7cc2ca8f27958d34d6736497" },
|
{file = "greenlet-1.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df02fdec0c533301497acb0bc0f27f479a3a63dcdc3a099ae33a902857f07477"},
|
||||||
{ file = "greenlet-1.1.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6a36bb9474218c7a5b27ae476035497a6990e21d04c279884eb10d9b290f1b1" },
|
{file = "greenlet-1.1.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c88e134d51d5e82315a7c32b914a58751b7353eb5268dbd02eabf020b4c4700"},
|
||||||
{ file = "greenlet-1.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abb7a75ed8b968f3061327c433a0fbd17b729947b400747c334a9c29a9af6c58" },
|
{file = "greenlet-1.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b41d19c0cfe5c259fe6c539fd75051cd39a5d33d05482f885faf43f7f5e7d26"},
|
||||||
{ file = "greenlet-1.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b336501a05e13b616ef81ce329c0e09ac5ed8c732d9ba7e3e983fcc1a9e86965" },
|
{file = "greenlet-1.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:6f5d4b2280ceea76c55c893827961ed0a6eadd5a584a7c4e6e6dd7bc10dfdd96"},
|
||||||
{ file = "greenlet-1.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:14d4f3cd4e8b524ae9b8aa567858beed70c392fdec26dbdb0a8a418392e71708" },
|
{file = "greenlet-1.1.3-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:184416e481295832350a4bf731ba619a92f5689bf5d0fa4341e98b98b1265bd7"},
|
||||||
{ file = "greenlet-1.1.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:17ff94e7a83aa8671a25bf5b59326ec26da379ace2ebc4411d690d80a7fbcf23" },
|
{file = "greenlet-1.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd0404d154084a371e6d2bafc787201612a1359c2dee688ae334f9118aa0bf47"},
|
||||||
{ file = "greenlet-1.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9f3cba480d3deb69f6ee2c1825060177a22c7826431458c697df88e6aeb3caee" },
|
{file = "greenlet-1.1.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a43bbfa9b6cfdfaeefbd91038dde65ea2c421dc387ed171613df340650874f2"},
|
||||||
{ file = "greenlet-1.1.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:fa877ca7f6b48054f847b61d6fa7bed5cebb663ebc55e018fda12db09dcc664c" },
|
{file = "greenlet-1.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce5b64dfe8d0cca407d88b0ee619d80d4215a2612c1af8c98a92180e7109f4b5"},
|
||||||
{ file = "greenlet-1.1.2-cp35-cp35m-win32.whl", hash = "sha256:7cbd7574ce8e138bda9df4efc6bf2ab8572c9aff640d8ecfece1b006b68da963" },
|
{file = "greenlet-1.1.3-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:903fa5716b8fbb21019268b44f73f3748c41d1a30d71b4a49c84b642c2fed5fa"},
|
||||||
{ file = "greenlet-1.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:903bbd302a2378f984aef528f76d4c9b1748f318fe1294961c072bdc7f2ffa3e" },
|
{file = "greenlet-1.1.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:0118817c9341ef2b0f75f5af79ac377e4da6ff637e5ee4ac91802c0e379dadb4"},
|
||||||
{ file = "greenlet-1.1.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:049fe7579230e44daef03a259faa24511d10ebfa44f69411d99e6a184fe68073" },
|
{file = "greenlet-1.1.3-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:466ce0928e33421ee84ae04c4ac6f253a3a3e6b8d600a79bd43fd4403e0a7a76"},
|
||||||
{ file = "greenlet-1.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:dd0b1e9e891f69e7675ba5c92e28b90eaa045f6ab134ffe70b52e948aa175b3c" },
|
{file = "greenlet-1.1.3-cp35-cp35m-win32.whl", hash = "sha256:65ad1a7a463a2a6f863661329a944a5802c7129f7ad33583dcc11069c17e622c"},
|
||||||
{ file = "greenlet-1.1.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7418b6bfc7fe3331541b84bb2141c9baf1ec7132a7ecd9f375912eca810e714e" },
|
{file = "greenlet-1.1.3-cp35-cp35m-win_amd64.whl", hash = "sha256:7532a46505470be30cbf1dbadb20379fb481244f1ca54207d7df3bf0bbab6a20"},
|
||||||
{ file = "greenlet-1.1.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9d29ca8a77117315101425ec7ec2a47a22ccf59f5593378fc4077ac5b754fce" },
|
{file = "greenlet-1.1.3-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:caff52cb5cd7626872d9696aee5b794abe172804beb7db52eed1fd5824b63910"},
|
||||||
{ file = "greenlet-1.1.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21915eb821a6b3d9d8eefdaf57d6c345b970ad722f856cd71739493ce003ad08" },
|
{file = "greenlet-1.1.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:db41f3845eb579b544c962864cce2c2a0257fe30f0f1e18e51b1e8cbb4e0ac6d"},
|
||||||
{ file = "greenlet-1.1.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eff9d20417ff9dcb0d25e2defc2574d10b491bf2e693b4e491914738b7908168" },
|
{file = "greenlet-1.1.3-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:e8533f5111704d75de3139bf0b8136d3a6c1642c55c067866fa0a51c2155ee33"},
|
||||||
{ file = "greenlet-1.1.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b8c008de9d0daba7b6666aa5bbfdc23dcd78cafc33997c9b7741ff6353bafb7f" },
|
{file = "greenlet-1.1.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9537e4baf0db67f382eb29255a03154fcd4984638303ff9baaa738b10371fa57"},
|
||||||
{ file = "greenlet-1.1.2-cp36-cp36m-win32.whl", hash = "sha256:32ca72bbc673adbcfecb935bb3fb1b74e663d10a4b241aaa2f5a75fe1d1f90aa" },
|
{file = "greenlet-1.1.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8bfd36f368efe0ab2a6aa3db7f14598aac454b06849fb633b762ddbede1db90"},
|
||||||
{ file = "greenlet-1.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f0214eb2a23b85528310dad848ad2ac58e735612929c8072f6093f3585fd342d" },
|
{file = "greenlet-1.1.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0877a9a2129a2c56a2eae2da016743db7d9d6a05d5e1c198f1b7808c602a30e"},
|
||||||
{ file = "greenlet-1.1.2-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:b92e29e58bef6d9cfd340c72b04d74c4b4e9f70c9fa7c78b674d1fec18896dc4" },
|
{file = "greenlet-1.1.3-cp36-cp36m-win32.whl", hash = "sha256:88b04e12c9b041a1e0bcb886fec709c488192638a9a7a3677513ac6ba81d8e79"},
|
||||||
{ file = "greenlet-1.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fdcec0b8399108577ec290f55551d926d9a1fa6cad45882093a7a07ac5ec147b" },
|
{file = "greenlet-1.1.3-cp36-cp36m-win_amd64.whl", hash = "sha256:4f166b4aca8d7d489e82d74627a7069ab34211ef5ebb57c300ec4b9337b60fc0"},
|
||||||
{ file = "greenlet-1.1.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:93f81b134a165cc17123626ab8da2e30c0455441d4ab5576eed73a64c025b25c" },
|
{file = "greenlet-1.1.3-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:cd16a89efe3a003029c87ff19e9fba635864e064da646bc749fc1908a4af18f3"},
|
||||||
{ file = "greenlet-1.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e12bdc622676ce47ae9abbf455c189e442afdde8818d9da983085df6312e7a1" },
|
{file = "greenlet-1.1.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5b756e6730ea59b2745072e28ad27f4c837084688e6a6b3633c8b1e509e6ae0e"},
|
||||||
{ file = "greenlet-1.1.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c790abda465726cfb8bb08bd4ca9a5d0a7bd77c7ac1ca1b839ad823b948ea28" },
|
{file = "greenlet-1.1.3-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:9b2f7d0408ddeb8ea1fd43d3db79a8cefaccadd2a812f021333b338ed6b10aba"},
|
||||||
{ file = "greenlet-1.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f276df9830dba7a333544bd41070e8175762a7ac20350786b322b714b0e654f5" },
|
{file = "greenlet-1.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44b4817c34c9272c65550b788913620f1fdc80362b209bc9d7dd2f40d8793080"},
|
||||||
{ file = "greenlet-1.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c5d5b35f789a030ebb95bff352f1d27a93d81069f2adb3182d99882e095cefe" },
|
{file = "greenlet-1.1.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d58a5a71c4c37354f9e0c24c9c8321f0185f6945ef027460b809f4bb474bfe41"},
|
||||||
{ file = "greenlet-1.1.2-cp37-cp37m-win32.whl", hash = "sha256:64e6175c2e53195278d7388c454e0b30997573f3f4bd63697f88d855f7a6a1fc" },
|
{file = "greenlet-1.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1dd51d2650e70c6c4af37f454737bf4a11e568945b27f74b471e8e2a9fd21268"},
|
||||||
{ file = "greenlet-1.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b11548073a2213d950c3f671aa88e6f83cda6e2fb97a8b6317b1b5b33d850e06" },
|
{file = "greenlet-1.1.3-cp37-cp37m-win32.whl", hash = "sha256:048d2bed76c2aa6de7af500ae0ea51dd2267aec0e0f2a436981159053d0bc7cc"},
|
||||||
{ file = "greenlet-1.1.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:9633b3034d3d901f0a46b7939f8c4d64427dfba6bbc5a36b1a67364cf148a1b0" },
|
{file = "greenlet-1.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:77e41db75f9958f2083e03e9dd39da12247b3430c92267df3af77c83d8ff9eed"},
|
||||||
{ file = "greenlet-1.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:eb6ea6da4c787111adf40f697b4e58732ee0942b5d3bd8f435277643329ba627" },
|
{file = "greenlet-1.1.3-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:1626185d938d7381631e48e6f7713e8d4b964be246073e1a1d15c2f061ac9f08"},
|
||||||
{ file = "greenlet-1.1.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:f3acda1924472472ddd60c29e5b9db0cec629fbe3c5c5accb74d6d6d14773478" },
|
{file = "greenlet-1.1.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:1ec2779774d8e42ed0440cf8bc55540175187e8e934f2be25199bf4ed948cd9e"},
|
||||||
{ file = "greenlet-1.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e859fcb4cbe93504ea18008d1df98dee4f7766db66c435e4882ab35cf70cac43" },
|
{file = "greenlet-1.1.3-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:f2f908239b7098799b8845e5936c2ccb91d8c2323be02e82f8dcb4a80dcf4a25"},
|
||||||
{ file = "greenlet-1.1.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00e44c8afdbe5467e4f7b5851be223be68adb4272f44696ee71fe46b7036a711" },
|
{file = "greenlet-1.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b181e9aa6cb2f5ec0cacc8cee6e5a3093416c841ba32c185c30c160487f0380"},
|
||||||
{ file = "greenlet-1.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec8c433b3ab0419100bd45b47c9c8551248a5aee30ca5e9d399a0b57ac04651b" },
|
{file = "greenlet-1.1.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2cf45e339cabea16c07586306a31cfcc5a3b5e1626d365714d283732afed6809"},
|
||||||
{ file = "greenlet-1.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2bde6792f313f4e918caabc46532aa64aa27a0db05d75b20edfc5c6f46479de2" },
|
{file = "greenlet-1.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6200a11f003ec26815f7e3d2ded01b43a3810be3528dd760d2f1fa777490c3cd"},
|
||||||
{ file = "greenlet-1.1.2-cp38-cp38-win32.whl", hash = "sha256:288c6a76705dc54fba69fbcb59904ae4ad768b4c768839b8ca5fdadec6dd8cfd" },
|
{file = "greenlet-1.1.3-cp38-cp38-win32.whl", hash = "sha256:db5b25265010a1b3dca6a174a443a0ed4c4ab12d5e2883a11c97d6e6d59b12f9"},
|
||||||
{ file = "greenlet-1.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:8d2f1fb53a421b410751887eb4ff21386d119ef9cde3797bf5e7ed49fb51a3b3" },
|
{file = "greenlet-1.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:095a980288fe05adf3d002fbb180c99bdcf0f930e220aa66fcd56e7914a38202"},
|
||||||
{ file = "greenlet-1.1.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:166eac03e48784a6a6e0e5f041cfebb1ab400b394db188c48b3a84737f505b67" },
|
{file = "greenlet-1.1.3-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:cbc1eb55342cbac8f7ec159088d54e2cfdd5ddf61c87b8bbe682d113789331b2"},
|
||||||
{ file = "greenlet-1.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:572e1787d1460da79590bf44304abbc0a2da944ea64ec549188fa84d89bba7ab" },
|
{file = "greenlet-1.1.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:694ffa7144fa5cc526c8f4512665003a39fa09ef00d19bbca5c8d3406db72fbe"},
|
||||||
{ file = "greenlet-1.1.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:be5f425ff1f5f4b3c1e33ad64ab994eed12fc284a6ea71c5243fd564502ecbe5" },
|
{file = "greenlet-1.1.3-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:aa741c1a8a8cc25eb3a3a01a62bdb5095a773d8c6a86470bde7f607a447e7905"},
|
||||||
{ file = "greenlet-1.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1692f7d6bc45e3200844be0dba153612103db241691088626a33ff1f24a0d88" },
|
{file = "greenlet-1.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3a669f11289a8995d24fbfc0e63f8289dd03c9aaa0cc8f1eab31d18ca61a382"},
|
||||||
{ file = "greenlet-1.1.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7227b47e73dedaa513cdebb98469705ef0d66eb5a1250144468e9c3097d6b59b" },
|
{file = "greenlet-1.1.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76a53bfa10b367ee734b95988bd82a9a5f0038a25030f9f23bbbc005010ca600"},
|
||||||
{ file = "greenlet-1.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ff61ff178250f9bb3cd89752df0f1dd0e27316a8bd1465351652b1b4a4cdfd3" },
|
{file = "greenlet-1.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fb0aa7f6996879551fd67461d5d3ab0c3c0245da98be90c89fcb7a18d437403"},
|
||||||
{ file = "greenlet-1.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0051c6f1f27cb756ffc0ffbac7d2cd48cb0362ac1736871399a739b2885134d3" },
|
{file = "greenlet-1.1.3-cp39-cp39-win32.whl", hash = "sha256:5fbe1ab72b998ca77ceabbae63a9b2e2dc2d963f4299b9b278252ddba142d3f1"},
|
||||||
{ file = "greenlet-1.1.2-cp39-cp39-win32.whl", hash = "sha256:f70a9e237bb792c7cc7e44c531fd48f5897961701cdaa06cf22fc14965c496cf" },
|
{file = "greenlet-1.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:ffe73f9e7aea404722058405ff24041e59d31ca23d1da0895af48050a07b6932"},
|
||||||
{ file = "greenlet-1.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:013d61294b6cd8fe3242932c1c5e36e5d1db2c8afb58606c5a67efce62c1f5fd" },
|
{file = "greenlet-1.1.3.tar.gz", hash = "sha256:bcb6c6dd1d6be6d38d6db283747d07fda089ff8c559a835236560a4410340455"},
|
||||||
{ file = "greenlet-1.1.2.tar.gz", hash = "sha256:e30f5ea4ae2346e62cedde8794a56858a67b878dd79f7df76a0767e356b1744a" },
|
|
||||||
]
|
]
|
||||||
idna = [
|
idna = [
|
||||||
{ file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff" },
|
{file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"},
|
||||||
{ file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d" },
|
{file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"},
|
||||||
]
|
]
|
||||||
iniconfig = [
|
iniconfig = [
|
||||||
{file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
|
{file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
|
||||||
{file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
|
{file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
|
||||||
]
|
]
|
||||||
|
interactions-wait-for = [
|
||||||
|
{file = "interactions-wait-for-1.0.6.tar.gz", hash = "sha256:2ae9db8da995f5a68353821f95471078630a3eaa8d6f55a1ee79f1a5f33f61b9"},
|
||||||
|
{file = "interactions_wait_for-1.0.6-py3-none-any.whl", hash = "sha256:80662daa8570239f586830d9fe11806344d28c91f731c034851376b85d31a9bc"},
|
||||||
|
]
|
||||||
multidict = [
|
multidict = [
|
||||||
{file = "multidict-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2"},
|
{file = "multidict-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2"},
|
||||||
{file = "multidict-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3"},
|
{file = "multidict-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3"},
|
||||||
@ -660,6 +886,14 @@ packaging = [
|
|||||||
{file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
|
{file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
|
||||||
{file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
|
{file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
|
||||||
]
|
]
|
||||||
|
pathspec = [
|
||||||
|
{file = "pathspec-0.10.1-py3-none-any.whl", hash = "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93"},
|
||||||
|
{file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"},
|
||||||
|
]
|
||||||
|
platformdirs = [
|
||||||
|
{file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"},
|
||||||
|
{file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"},
|
||||||
|
]
|
||||||
pluggy = [
|
pluggy = [
|
||||||
{file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
|
{file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
|
||||||
{file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
|
{file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
|
||||||
@ -673,16 +907,16 @@ pyparsing = [
|
|||||||
{file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"},
|
{file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"},
|
||||||
]
|
]
|
||||||
pytest = [
|
pytest = [
|
||||||
{ file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c" },
|
{file = "pytest-7.1.3-py3-none-any.whl", hash = "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7"},
|
||||||
{ file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45" },
|
{file = "pytest-7.1.3.tar.gz", hash = "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39"},
|
||||||
]
|
]
|
||||||
python-dateutil = [
|
python-dateutil = [
|
||||||
{file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
|
{file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
|
||||||
{file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
|
{file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
|
||||||
]
|
]
|
||||||
python-dotenv = [
|
python-dotenv = [
|
||||||
{ file = "python-dotenv-0.20.0.tar.gz", hash = "sha256:b7e3b04a59693c42c36f9ab1cc2acc46fa5df8c78e178fc33a8d4cd05c8d498f" },
|
{file = "python-dotenv-0.21.0.tar.gz", hash = "sha256:b77d08274639e3d34145dfa6c7008e66df0f04b7be7a75fd0d5292c191d79045"},
|
||||||
{ file = "python_dotenv-0.20.0-py3-none-any.whl", hash = "sha256:d92a187be61fe482e4fd675b6d52200e7be63a12b724abbf931a40ce4fa92938" },
|
{file = "python_dotenv-0.21.0-py3-none-any.whl", hash = "sha256:1684eb44636dd462b66c3ee016599815514527ad99965de77f43e0944634a7e5"},
|
||||||
]
|
]
|
||||||
pytz = [
|
pytz = [
|
||||||
{file = "pytz-2022.2.1-py2.py3-none-any.whl", hash = "sha256:220f481bdafa09c3955dfbdddb7b57780e9a94f5127e35456a48589b9e0c0197"},
|
{file = "pytz-2022.2.1-py2.py3-none-any.whl", hash = "sha256:220f481bdafa09c3955dfbdddb7b57780e9a94f5127e35456a48589b9e0c0197"},
|
||||||
@ -768,47 +1002,56 @@ regex = [
|
|||||||
{file = "regex-2022.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:9efa41d1527b366c88f265a227b20bcec65bda879962e3fc8a2aee11e81266d7"},
|
{file = "regex-2022.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:9efa41d1527b366c88f265a227b20bcec65bda879962e3fc8a2aee11e81266d7"},
|
||||||
{file = "regex-2022.3.2.tar.gz", hash = "sha256:79e5af1ff258bc0fe0bdd6f69bc4ae33935a898e3cbefbbccf22e88a27fa053b"},
|
{file = "regex-2022.3.2.tar.gz", hash = "sha256:79e5af1ff258bc0fe0bdd6f69bc4ae33935a898e3cbefbbccf22e88a27fa053b"},
|
||||||
]
|
]
|
||||||
|
setuptools = [
|
||||||
|
{file = "setuptools-65.3.0-py3-none-any.whl", hash = "sha256:2e24e0bec025f035a2e72cdd1961119f557d78ad331bb00ff82efb2ab8da8e82"},
|
||||||
|
{file = "setuptools-65.3.0.tar.gz", hash = "sha256:7732871f4f7fa58fb6bdcaeadb0161b2bd046c85905dbaa066bdcbcc81953b57"},
|
||||||
|
]
|
||||||
six = [
|
six = [
|
||||||
{file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
|
{file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
|
||||||
{file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
|
{file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
|
||||||
]
|
]
|
||||||
sqlalchemy = [
|
SQLAlchemy = [
|
||||||
{ file = "SQLAlchemy-1.4.40-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:b07fc38e6392a65935dc8b486229679142b2ea33c94059366b4d8b56f1e35a97" },
|
{file = "SQLAlchemy-1.4.41-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:13e397a9371ecd25573a7b90bd037db604331cf403f5318038c46ee44908c44d"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fb4edb6c354eac0fcc07cb91797e142f702532dbb16c1d62839d6eec35f814cf" },
|
{file = "SQLAlchemy-1.4.41-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2d6495f84c4fd11584f34e62f9feec81bf373787b3942270487074e35cbe5330"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp27-cp27m-win32.whl", hash = "sha256:2026632051a93997cf8f6fda14360f99230be1725b7ab2ef15be205a4b8a5430" },
|
{file = "SQLAlchemy-1.4.41-cp27-cp27m-win32.whl", hash = "sha256:e570cfc40a29d6ad46c9aeaddbdcee687880940a3a327f2c668dd0e4ef0a441d"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp27-cp27m-win_amd64.whl", hash = "sha256:f2aa85aebc0ef6b342d5d3542f969caa8c6a63c8d36cf5098769158a9fa2123c" },
|
{file = "SQLAlchemy-1.4.41-cp27-cp27m-win_amd64.whl", hash = "sha256:5facb7fd6fa8a7353bbe88b95695e555338fb038ad19ceb29c82d94f62775a05"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0b9e3d81f86ba04007f0349e373a5b8c81ec2047aadb8d669caf8c54a092461" },
|
{file = "SQLAlchemy-1.4.41-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:f37fa70d95658763254941ddd30ecb23fc4ec0c5a788a7c21034fc2305dab7cc"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:1ab08141d93de83559f6a7d9a962830f918623a885b3759ec2b9d1a531ff28fe" },
|
{file = "SQLAlchemy-1.4.41-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:361f6b5e3f659e3c56ea3518cf85fbdae1b9e788ade0219a67eeaaea8a4e4d2a"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00dd998b43b282c71de46b061627b5edb9332510eb1edfc5017b9e4356ed44ea" },
|
{file = "SQLAlchemy-1.4.41-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0990932f7cca97fece8017414f57fdd80db506a045869d7ddf2dda1d7cf69ecc"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bb342c0e25cc8f78a0e7c692da3b984f072666b316fbbec2a0e371cb4dfef5f0" },
|
{file = "SQLAlchemy-1.4.41-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cd767cf5d7252b1c88fcfb58426a32d7bd14a7e4942497e15b68ff5d822b41ad"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23b693876ac7963b6bc7b1a5f3a2642f38d2624af834faad5933913928089d1b" },
|
{file = "SQLAlchemy-1.4.41-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5102fb9ee2c258a2218281adcb3e1918b793c51d6c2b4666ce38c35101bb940e"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp310-cp310-win32.whl", hash = "sha256:2cf50611ef4221ad587fb7a1708e61ff72966f84330c6317642e08d6db4138fd" },
|
{file = "SQLAlchemy-1.4.41-cp310-cp310-win32.whl", hash = "sha256:2082a2d2fca363a3ce21cfa3d068c5a1ce4bf720cf6497fb3a9fc643a8ee4ddd"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp310-cp310-win_amd64.whl", hash = "sha256:26ee4dbac5dd7abf18bf3cd8f04e51f72c339caf702f68172d308888cd26c6c9" },
|
{file = "SQLAlchemy-1.4.41-cp310-cp310-win_amd64.whl", hash = "sha256:e4b12e3d88a8fffd0b4ca559f6d4957ed91bd4c0613a4e13846ab8729dc5c251"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:b41b87b929118838bafc4bb18cf3c5cd1b3be4b61cd9042e75174df79e8ac7a2" },
|
{file = "SQLAlchemy-1.4.41-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:90484a2b00baedad361402c257895b13faa3f01780f18f4a104a2f5c413e4536"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:885e11638946472b4a0a7db8e6df604b2cf64d23dc40eedc3806d869fcb18fae" },
|
{file = "SQLAlchemy-1.4.41-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b67fc780cfe2b306180e56daaa411dd3186bf979d50a6a7c2a5b5036575cbdbb"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b7ff0a8bf0aec1908b92b8dfa1246128bf4f94adbdd3da6730e9c542e112542d" },
|
{file = "SQLAlchemy-1.4.41-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ad2b727fc41c7f8757098903f85fafb4bf587ca6605f82d9bf5604bd9c7cded"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfa8ab4ba0c97ab6bcae1f0948497d14c11b6c6ecd1b32b8a79546a0823d8211" },
|
{file = "SQLAlchemy-1.4.41-cp311-cp311-win32.whl", hash = "sha256:59bdc291165b6119fc6cdbc287c36f7f2859e6051dd923bdf47b4c55fd2f8bd0"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp36-cp36m-win32.whl", hash = "sha256:d259fa08e4b3ed952c01711268bcf6cd2442b0c54866d64aece122f83da77c6d" },
|
{file = "SQLAlchemy-1.4.41-cp311-cp311-win_amd64.whl", hash = "sha256:d2e054aed4645f9b755db85bc69fc4ed2c9020c19c8027976f66576b906a74f1"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp36-cp36m-win_amd64.whl", hash = "sha256:c8d974c991eef0cd29418a5957ae544559dc326685a6f26b3a914c87759bf2f4" },
|
{file = "SQLAlchemy-1.4.41-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:4ba7e122510bbc07258dc42be6ed45997efdf38129bde3e3f12649be70683546"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:28b1791a30d62fc104070965f1a2866699c45bbf5adc0be0cf5f22935edcac58" },
|
{file = "SQLAlchemy-1.4.41-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0dcf127bb99458a9d211e6e1f0f3edb96c874dd12f2503d4d8e4f1fd103790b"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7ccdca6cd167611f4a62a8c2c0c4285c2535640d77108f782ce3f3cccb70f3a" },
|
{file = "SQLAlchemy-1.4.41-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e16c2be5cb19e2c08da7bd3a87fed2a0d4e90065ee553a940c4fc1a0fb1ab72b"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:69deec3a94de10062080d91e1ba69595efeafeafe68b996426dec9720031fb25" },
|
{file = "SQLAlchemy-1.4.41-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ebeeec5c14533221eb30bad716bc1fd32f509196318fb9caa7002c4a364e4c"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ad778f4e80913fb171247e4fa82123d0068615ae1d51a9791fc4284cb81748" },
|
{file = "SQLAlchemy-1.4.41-cp36-cp36m-win32.whl", hash = "sha256:3e2ef592ac3693c65210f8b53d0edcf9f4405925adcfc031ff495e8d18169682"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp37-cp37m-win32.whl", hash = "sha256:9ced2450c9fd016f9232d976661623e54c450679eeefc7aa48a3d29924a63189" },
|
{file = "SQLAlchemy-1.4.41-cp36-cp36m-win_amd64.whl", hash = "sha256:eb30cf008850c0a26b72bd1b9be6730830165ce049d239cfdccd906f2685f892"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp37-cp37m-win_amd64.whl", hash = "sha256:cdee4d475e35684d210dc6b430ff8ca2ed0636378ac19b457e2f6f350d1f5acc" },
|
{file = "SQLAlchemy-1.4.41-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:c23d64a0b28fc78c96289ffbd0d9d1abd48d267269b27f2d34e430ea73ce4b26"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:08b47c971327e733ffd6bae2d4f50a7b761793efe69d41067fcba86282819eea" },
|
{file = "SQLAlchemy-1.4.41-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8eb8897367a21b578b26f5713833836f886817ee2ffba1177d446fa3f77e67c8"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cf03d37819dc17a388d313919daf32058d19ba1e592efdf14ce8cbd997e6023" },
|
{file = "SQLAlchemy-1.4.41-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:14576238a5f89bcf504c5f0a388d0ca78df61fb42cb2af0efe239dc965d4f5c9"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a62c0ecbb9976550f26f7bf75569f425e661e7249349487f1483115e5fc893a6" },
|
{file = "SQLAlchemy-1.4.41-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:639e1ae8d48b3c86ffe59c0daa9a02e2bfe17ca3d2b41611b30a0073937d4497"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ec440990ab00650d0c7ea2c75bc225087afdd7ddcb248e3d934def4dff62762" },
|
{file = "SQLAlchemy-1.4.41-cp37-cp37m-win32.whl", hash = "sha256:0005bd73026cd239fc1e8ccdf54db58b6193be9a02b3f0c5983808f84862c767"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp38-cp38-win32.whl", hash = "sha256:2b64955850a14b9d481c17becf0d3f62fb1bb31ac2c45c2caf5ad06d9e811187" },
|
{file = "SQLAlchemy-1.4.41-cp37-cp37m-win_amd64.whl", hash = "sha256:5323252be2bd261e0aa3f33cb3a64c45d76829989fa3ce90652838397d84197d"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp38-cp38-win_amd64.whl", hash = "sha256:959bf4390766a8696aa01285016c766b4eb676f712878aac5fce956dd49695d9" },
|
{file = "SQLAlchemy-1.4.41-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:05f0de3a1dc3810a776275763764bb0015a02ae0f698a794646ebc5fb06fad33"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:0992f3cc640ec0f88f721e426da884c34ff0a60eb73d3d64172e23dfadfc8a0b" },
|
{file = "SQLAlchemy-1.4.41-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0002e829142b2af00b4eaa26c51728f3ea68235f232a2e72a9508a3116bd6ed0"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa9e0d7832b7511b3b3fd0e67fac85ff11fd752834c143ca2364c9b778c0485a" },
|
{file = "SQLAlchemy-1.4.41-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:22ff16cedab5b16a0db79f1bc99e46a6ddececb60c396562e50aab58ddb2871c"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c9d0f1a9538cc5e75f2ea0cb6c3d70155a1b7f18092c052e0d84105622a41b63" },
|
{file = "SQLAlchemy-1.4.41-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccfd238f766a5bb5ee5545a62dd03f316ac67966a6a658efb63eeff8158a4bbf"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c956a5d1adb49a35d78ef0fae26717afc48a36262359bb5b0cbd7a3a247c26f" },
|
{file = "SQLAlchemy-1.4.41-cp38-cp38-win32.whl", hash = "sha256:58bb65b3274b0c8a02cea9f91d6f44d0da79abc993b33bdedbfec98c8440175a"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp39-cp39-win32.whl", hash = "sha256:6b70d02bbe1adbbf715d2249cacf9ac17c6f8d22dfcb3f1a4fbc5bf64364da8a" },
|
{file = "SQLAlchemy-1.4.41-cp38-cp38-win_amd64.whl", hash = "sha256:ce8feaa52c1640de9541eeaaa8b5fb632d9d66249c947bb0d89dd01f87c7c288"},
|
||||||
{ file = "SQLAlchemy-1.4.40-cp39-cp39-win_amd64.whl", hash = "sha256:bf073c619b5a7f7cd731507d0fdc7329bee14b247a63b0419929e4acd24afea8" },
|
{file = "SQLAlchemy-1.4.41-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:199a73c31ac8ea59937cc0bf3dfc04392e81afe2ec8a74f26f489d268867846c"},
|
||||||
{ file = "SQLAlchemy-1.4.40.tar.gz", hash = "sha256:44a660506080cc975e1dfa5776fe5f6315ddc626a77b50bf0eee18b0389ea265" },
|
{file = "SQLAlchemy-1.4.41-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676d51c9f6f6226ae8f26dc83ec291c088fe7633269757d333978df78d931ab"},
|
||||||
|
{file = "SQLAlchemy-1.4.41-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:036d8472356e1d5f096c5e0e1a7e0f9182140ada3602f8fff6b7329e9e7cfbcd"},
|
||||||
|
{file = "SQLAlchemy-1.4.41-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2307495d9e0ea00d0c726be97a5b96615035854972cc538f6e7eaed23a35886c"},
|
||||||
|
{file = "SQLAlchemy-1.4.41-cp39-cp39-win32.whl", hash = "sha256:9c56e19780cd1344fcd362fd6265a15f48aa8d365996a37fab1495cae8fcd97d"},
|
||||||
|
{file = "SQLAlchemy-1.4.41-cp39-cp39-win_amd64.whl", hash = "sha256:f5fa526d027d804b1f85cdda1eb091f70bde6fb7d87892f6dd5a48925bc88898"},
|
||||||
|
{file = "SQLAlchemy-1.4.41.tar.gz", hash = "sha256:0292f70d1797e3c54e862e6f30ae474014648bc9c723e14a2fda730adb0a9791"},
|
||||||
]
|
]
|
||||||
tomli = [
|
tomli = [
|
||||||
{file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
|
{file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
|
||||||
@ -819,8 +1062,8 @@ types-dateparser = [
|
|||||||
{file = "types_dateparser-1.1.4-py3-none-any.whl", hash = "sha256:cc4b371ef4176b367c1d43f40bf96f72df89dba79d369d69851dd928209251a0"},
|
{file = "types_dateparser-1.1.4-py3-none-any.whl", hash = "sha256:cc4b371ef4176b367c1d43f40bf96f72df89dba79d369d69851dd928209251a0"},
|
||||||
]
|
]
|
||||||
types-pytz = [
|
types-pytz = [
|
||||||
{ file = "types-pytz-2022.1.2.tar.gz", hash = "sha256:1a8b25c225c5e6bd8468aa9eb45ddd3b337f6716d4072ad0aa4ef1e41478eebc" },
|
{file = "types-pytz-2022.2.1.0.tar.gz", hash = "sha256:47cfb19c52b9f75896440541db392fd312a35b279c6307a531db71152ea63e2b"},
|
||||||
{ file = "types_pytz-2022.1.2-py3-none-any.whl", hash = "sha256:8aa9fd2af9dee5f5bd7221c6804c9addeafa7ebc0008f544d4ace02b066818a4" },
|
{file = "types_pytz-2022.2.1.0-py3-none-any.whl", hash = "sha256:50ead2254b524a3d4153bc65d00289b66898060d2938e586170dce918dbaf3b3"},
|
||||||
]
|
]
|
||||||
typing-extensions = [
|
typing-extensions = [
|
||||||
{file = "typing_extensions-4.3.0-py3-none-any.whl", hash = "sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02"},
|
{file = "typing_extensions-4.3.0-py3-none-any.whl", hash = "sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02"},
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "discord-reminder-bot"
|
name = "discord-reminder-bot"
|
||||||
version = "0.3.0"
|
version = "1.0.0"
|
||||||
description = "Discord bot that allows you to set date, cron and interval reminders."
|
description = "Discord bot that allows you to set date, cron and interval reminders."
|
||||||
authors = ["Joakim Hellsén <tlovinator@gmail.com>"]
|
authors = ["Joakim Hellsén <tlovinator@gmail.com>"]
|
||||||
license = "GPL-3.0-or-later"
|
license = "GPL-3.0-or-later"
|
||||||
@ -22,19 +22,24 @@ bot = "discord_reminder_bot.main:start"
|
|||||||
|
|
||||||
[tool.poetry.dependencies]
|
[tool.poetry.dependencies]
|
||||||
python = "^3.9"
|
python = "^3.9"
|
||||||
"discord.py" = "^1.7.3"
|
python-dotenv = "^0.21.0"
|
||||||
python-dotenv = "^0.20.0"
|
|
||||||
discord-py-slash-command = "^3.0.3"
|
|
||||||
APScheduler = "^3.9.1"
|
APScheduler = "^3.9.1"
|
||||||
dateparser = "^1.1.1"
|
dateparser = "^1.1.1"
|
||||||
SQLAlchemy = "^1.4.32"
|
SQLAlchemy = "^1.4.41"
|
||||||
|
discord-py-interactions = { git = "https://github.com/interactions-py/library.git", rev = "unstable" }
|
||||||
|
interactions-wait-for = "^1.0.6"
|
||||||
|
dinteractions-paginator = { git = "https://github.com/interactions-py/paginator.git", rev = "unstable" }
|
||||||
|
|
||||||
[tool.poetry.dev-dependencies]
|
[tool.poetry.dev-dependencies]
|
||||||
pytest = "^7.1.2"
|
pytest = "^7.1.2"
|
||||||
mypy = "^0.971"
|
mypy = "^0.971"
|
||||||
types-dateparser = "^1.1.4"
|
types-dateparser = "^1.1.4"
|
||||||
types-pytz = "^2022.1.2"
|
types-pytz = "^2022.1.2"
|
||||||
|
black = "^22.8.0"
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
requires = ["poetry-core>=1.0.0"]
|
requires = ["poetry-core>=1.0.0"]
|
||||||
build-backend = "poetry.core.masonry.api"
|
build-backend = "poetry.core.masonry.api"
|
||||||
|
|
||||||
|
[tool.isort]
|
||||||
|
profile = "black"
|
@ -3,6 +3,7 @@
|
|||||||
Jobs are stored in memory.
|
Jobs are stored in memory.
|
||||||
"""
|
"""
|
||||||
import re
|
import re
|
||||||
|
from sched import scheduler
|
||||||
|
|
||||||
import dateparser
|
import dateparser
|
||||||
import pytz
|
import pytz
|
||||||
@ -17,7 +18,8 @@ class TestCountdown:
|
|||||||
"""This tests everything.
|
"""This tests everything.
|
||||||
|
|
||||||
This sets up sqlite database in memory, changes scheduler timezone
|
This sets up sqlite database in memory, changes scheduler timezone
|
||||||
to Europe/Stockholm and creates job that runs January 18 2040.
|
to Europe/Stockholm and creates job that runs January 18 2040 and one that
|
||||||
|
runs at 00:00.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
jobstores = {"default": SQLAlchemyJobStore(url="sqlite:///:memory")}
|
jobstores = {"default": SQLAlchemyJobStore(url="sqlite:///:memory")}
|
||||||
@ -35,8 +37,7 @@ class TestCountdown:
|
|||||||
"TO_TIMEZONE": "Europe/Stockholm",
|
"TO_TIMEZONE": "Europe/Stockholm",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
run_date = parsed_date.strftime("%Y-%m-%d %H:%M:%S")
|
||||||
run_date = parsed_date.strftime("%Y-%m-%d %H:%M:%S") # type: ignore
|
|
||||||
job = scheduler.add_job(
|
job = scheduler.add_job(
|
||||||
send_to_discord,
|
send_to_discord,
|
||||||
run_date=run_date,
|
run_date=run_date,
|
||||||
@ -47,9 +48,57 @@ class TestCountdown:
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
timezone_date = dateparser.parse(
|
||||||
|
"00:00",
|
||||||
|
settings={
|
||||||
|
"PREFER_DATES_FROM": "future",
|
||||||
|
"TO_TIMEZONE": "Europe/Stockholm",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
timezone_run_date = timezone_date.strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
timezone_job = scheduler.add_job(
|
||||||
|
send_to_discord,
|
||||||
|
run_date=timezone_run_date,
|
||||||
|
kwargs={
|
||||||
|
"channel_id": 865712621109772329,
|
||||||
|
"message": "Running PyTest at 00:00",
|
||||||
|
"author_id": 126462229892694018,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
timezone_date2 = dateparser.parse(
|
||||||
|
"13:37",
|
||||||
|
settings={
|
||||||
|
"PREFER_DATES_FROM": "future",
|
||||||
|
"TO_TIMEZONE": "Europe/Stockholm",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
timezone_run_date2 = timezone_date2.strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
timezone_job2 = scheduler.add_job(
|
||||||
|
send_to_discord,
|
||||||
|
run_date=timezone_run_date2,
|
||||||
|
kwargs={
|
||||||
|
"channel_id": 865712621109772329,
|
||||||
|
"message": "Running PyTest at 13:37",
|
||||||
|
"author_id": 126462229892694018,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
def test_countdown(self):
|
def test_countdown(self):
|
||||||
"""Check if calc_countdown returns days, hours and minutes."""
|
"""Check if calc_countdown returns days, hours and minutes."""
|
||||||
# FIXME: This will break when there is 0 seconds/hours/days left
|
# FIXME: This will break when there is 0 seconds/hours/days left
|
||||||
pattern = re.compile(r"\d* (day|days), \d* (hour|hours). \d* (minute|minutes)")
|
pattern = re.compile(r"\d* (day|days), \d* (hour|hours). \d* (minute|minutes)")
|
||||||
countdown = calculate(self.job)
|
countdown = calculate(self.job)
|
||||||
assert pattern.match(countdown)
|
assert pattern.match(countdown)
|
||||||
|
|
||||||
|
def test_if_timezones_are_working(self):
|
||||||
|
"""Check if timezones are working."""
|
||||||
|
time_job = self.scheduler.get_job(self.timezone_job.id)
|
||||||
|
assert time_job.trigger.run_date.hour == 0
|
||||||
|
assert time_job.trigger.run_date.minute == 0
|
||||||
|
assert time_job.trigger.run_date.second == 0
|
||||||
|
|
||||||
|
time_job2 = self.scheduler.get_job(self.timezone_job2.id)
|
||||||
|
assert time_job2.trigger.run_date.hour == 13
|
||||||
|
assert time_job2.trigger.run_date.minute == 37
|
||||||
|
assert time_job2.trigger.run_date.second == 0
|
||||||
|
Reference in New Issue
Block a user