feat: Beanie migration

This commit is contained in:
Zeva Rose 2023-05-10 18:06:44 -06:00
parent 649782f4ef
commit 2208930b4e
14 changed files with 698 additions and 418 deletions

View file

@ -2,13 +2,12 @@
import asyncio import asyncio
from typing import Optional from typing import Optional
#import rook
from jarvis_core.db import connect from jarvis_core.db import connect
from jarvis_core.log import get_logger from jarvis_core.log import get_logger
from naff import Client, Intents from interactions import Client, Intents
from jarvis_tasks import const from jarvis_tasks import const
from jarvis_tasks.config import TaskConfig from jarvis_tasks.config import load_config
from jarvis_tasks.prometheus.serve import StatTracker from jarvis_tasks.prometheus.serve import StatTracker
from jarvis_tasks.tasks import ( from jarvis_tasks.tasks import (
autokick, autokick,
@ -26,7 +25,7 @@ __version__ = const.__version__
logger = None logger = None
async def _start(config: Optional[str] = "config.yaml") -> None: async def _start() -> None:
""" """
Main start function. Main start function.
@ -34,15 +33,11 @@ async def _start(config: Optional[str] = "config.yaml") -> None:
config: Config path config: Config path
""" """
# Load config # Load config
config = TaskConfig.from_yaml(config) config = load_config()
# if config.rook_token:
# rook.start(token=config.rook_token, labels={"env": "dev"})
# Connect to database # Connect to database
testing = config.mongo["database"] != "jarvis" logger.debug(f"Connecting to database, environ={config.environment.value}")
logger.debug(f"Connecting to database, testing={testing}") await connect(**config.mongo.dict(), testing=config.environment.value == "develop")
connect(**config.mongo["connect"], testing=testing)
# Get event loop # Get event loop
loop = asyncio.get_event_loop() loop = asyncio.get_event_loop()
@ -66,10 +61,12 @@ async def _start(config: Optional[str] = "config.yaml") -> None:
reddit.reddit, reddit.reddit,
reminder.remind, reminder.remind,
temprole.remove, temprole.remove,
twitter.twitter, # twitter.twitter,
warning.unwarn, warning.unwarn,
] ]
tasks = [loop.create_task(f(bot)) for f in functions] + [loop.create_task(tracker.start())] tasks = [loop.create_task(f(bot)) for f in functions] + [
# loop.create_task(tracker.start())
]
for task in tasks: for task in tasks:
await task await task
except KeyboardInterrupt: except KeyboardInterrupt:
@ -77,7 +74,7 @@ async def _start(config: Optional[str] = "config.yaml") -> None:
task.cancel() task.cancel()
def start(config: Optional[str] = "config.yaml") -> None: def start() -> None:
""" """
Start the background tasks. Start the background tasks.
@ -86,10 +83,10 @@ def start(config: Optional[str] = "config.yaml") -> None:
""" """
global logger, debug global logger, debug
# Set log level # Set log level
_config = TaskConfig.from_yaml(config) _config = load_config()
logger = get_logger(__name__) logger = get_logger(__name__)
logger.setLevel(_config.log_level) logger.setLevel(_config.log_level)
# Run the main tasks # Run the main tasks
logger.debug("Starting asyncio") logger.debug("Starting asyncio")
asyncio.run(_start(config)) asyncio.run(_start())

View file

@ -1,7 +1,149 @@
"""Task config.""" """Task config."""
from jarvis_core.config import Config from enum import Enum
from os import environ
from pathlib import Path
from typing import Optional
import yaml
import orjson as json
from dotenv import load_dotenv
from jarvis_core.util import find_all
from pydantic import BaseModel
try:
from yaml import CLoader as Loader
except ImportError:
from yaml import Loader
class TaskConfig(Config): class Environment(Enum):
REQUIRED = ["token", "mongo"] """JARVIS running environment."""
OPTIONAL = {"log_level": "WARNING", "twitter": None, "reddit": None, "rook_token": None}
production = "production"
develop = "develop"
class Mongo(BaseModel):
"""MongoDB config."""
host: list[str] | str = "localhost"
username: Optional[str] = None
password: Optional[str] = None
port: int = 27017
class Reddit(BaseModel):
"""Reddit config."""
user_agent: Optional[str] = None
client_secret: str
client_id: str
class Twitter(BaseModel):
"""Twitter config."""
consumer_key: str
consumer_secret: str
access_token: str
access_secret: str
bearer_token: str
class Config(BaseModel):
"""Tasks config model."""
token: str
mongo: Mongo
reddit: Optional[Reddit] = None
twitter: Optional[Twitter] = None
log_level: str = "INFO"
environment: Environment = Environment.develop
_config: Config = None
def _load_json() -> Config | None:
path = Path("config.json")
config = None
if path.exists():
with path.open() as f:
j = json.loads(f.read())
config = Config(**j)
return config
def _load_yaml() -> Config | None:
path = Path("config.yaml")
config = None
if path.exists():
with path.open() as f:
y = yaml.load(f.read(), Loader=Loader)
config = Config(**y)
return config
def _load_env() -> Config | None:
load_dotenv()
data = {}
mongo = {}
twitter = {}
reddit = {}
mongo_keys = find_all(lambda x: x.upper().startswith("MONGO"), environ.keys())
reddit_keys = find_all(lambda x: x.upper().startswith("REDDIT"), environ.keys())
twitter_keys = find_all(lambda x: x.upper().startswith("TWITTER"), environ.keys())
config_keys = (
mongo_keys + reddit_keys + twitter_keys + ["TOKEN", "LOG_LEVEL", "ENVIRONMENT"]
)
for item, value in environ.items():
if item not in config_keys:
continue
if item in mongo_keys:
key = "_".join(item.split("_")[1:]).lower()
mongo[key] = value
elif item in twitter_keys:
key = "_".join(item.split("_")[1:]).lower()
twitter[key] = value
elif item in reddit_keys:
key = "_".join(item.split("_")[1:]).lower()
reddit[key] = value
else:
data[item.lower()] = value
data["mongo"] = mongo
if all(x is not None for x in reddit.values()):
data["reddit"] = reddit
if all(x is not None for x in twitter.values()):
data["twitter"] = twitter
return Config(**data)
def load_config(method: Optional[str] = None) -> Config:
"""
Load the config using the specified method first
Args:
method: Method to use first
"""
global _config
if _config is not None:
return _config
methods = {"yaml": _load_yaml, "json": _load_json, "env": _load_env}
method_names = list(methods.keys())
if method and method in method_names:
method_names.remove(method)
method_names.insert(0, method)
for method in method_names:
if _config := methods[method]():
return _config
raise FileNotFoundError("Missing one of: config.yaml, config.json, .env")

View file

@ -3,9 +3,9 @@ import asyncio
import logging import logging
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
from jarvis_core.db import q from beanie.operators import Exists
from jarvis_core.db.models import Setting from jarvis_core.db.models import Setting
from naff import Client from interactions import Client
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -22,17 +22,21 @@ async def autokick(bot: Client) -> None:
logger.debug("Starting Task-autokick") logger.debug("Starting Task-autokick")
while True: while True:
autokicks = Setting.find(q(setting="autokick", value__exists=True)) autokicks = Setting.find(Setting.setting == "autokick", Exists(Setting.value))
async for auto in autokicks: async for auto in autokicks:
if auto.value <= 0: if auto.value <= 0:
logger.warn("Autokick setting <= 0, deleting") logger.warn("Autokick setting <= 0, deleting")
await auto.delete() await auto.delete()
continue continue
verified = await Setting.find_one( verified = await Setting.find_one(
q(setting="verified", value__exists=True, guild=auto.guild) Setting.setting == "verified",
Exists(Setting.value),
Setting.guild == auto.guild,
) )
unverified = await Setting.find_one( unverified = await Setting.find_one(
q(setting="unverified", value__exists=True, guild=auto.guild) Setting.setting == "unverified",
Exists(Setting.value),
Setting.guild == auto.guild,
) )
if not verified or not unverified: if not verified or not unverified:
logger.debug( logger.debug(
@ -47,7 +51,9 @@ async def autokick(bot: Client) -> None:
await unverified.delete() await unverified.delete()
continue continue
if guild.id not in resync or resync[guild.id] >= datetime.now(tz=timezone.utc): if guild.id not in resync or resync[guild.id] >= datetime.now(
tz=timezone.utc
):
logger.info(f"Guild {guild.id} out of date, resyncing") logger.info(f"Guild {guild.id} out of date, resyncing")
limit = 1000 limit = 1000
guild_id = guild.id guild_id = guild.id
@ -60,7 +66,9 @@ async def autokick(bot: Client) -> None:
role = await guild.fetch_role(unverified.value) role = await guild.fetch_role(unverified.value)
for member in role.members: for member in role.members:
if member.joined_at + timedelta(days=auto.value) >= datetime.now(tz=timezone.utc): if member.joined_at + timedelta(days=auto.value) >= datetime.now(
tz=timezone.utc
):
await member.kick(reason="Failed to verify in {auto.value} days") await member.kick(reason="Failed to verify in {auto.value} days")
await asyncio.sleep(14400) await asyncio.sleep(14400)

View file

@ -3,12 +3,12 @@ import asyncio
import logging import logging
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
from jarvis_core.db import q from beanie.operators import LTE
from jarvis_core.db.models import Ban, Unban from jarvis_core.db.models import Ban, Unban
from naff import Client from interactions import Client
from naff.client.errors import NotFound from interactions.client.errors import NotFound
from naff.models.discord.guild import Guild from interactions.models.discord.guild import Guild
from naff.models.discord.user import User from interactions.models.discord.user import User
from jarvis_tasks.util import runat from jarvis_tasks.util import runat
@ -24,7 +24,7 @@ async def _unban(bot: int, guild: Guild, user: User, ban: Ban) -> None:
except NotFound: except NotFound:
logger.debug(f"User {user.id} not banned from guild {guild.id}") logger.debug(f"User {user.id} not banned from guild {guild.id}")
ban.active = False ban.active = False
await ban.commit() await ban.save()
await Unban( await Unban(
user=user.id, user=user.id,
guild=guild.id, guild=guild.id,
@ -32,7 +32,7 @@ async def _unban(bot: int, guild: Guild, user: User, ban: Ban) -> None:
discrim=user.discriminator, discrim=user.discriminator,
admin=bot, admin=bot,
reason="Ban expired", reason="Ban expired",
).commit() ).save()
queue.remove(ban.id) queue.remove(ban.id)
@ -46,7 +46,9 @@ async def unban(bot: Client) -> None:
logger.debug("Starting Task-ban") logger.debug("Starting Task-ban")
while True: while True:
max_ts = datetime.now(tz=timezone.utc) + timedelta(minutes=9) max_ts = datetime.now(tz=timezone.utc) + timedelta(minutes=9)
bans = Ban.find(q(type="temp", active=True, duration__lte=max_ts)) bans = Ban.find(
Ban.type == "temp", Ban.active == True, LTE(Ban.duration, max_ts)
)
async for ban in bans: async for ban in bans:
if ban.id in queue: if ban.id in queue:
continue continue

View file

@ -3,11 +3,11 @@ import asyncio
import logging import logging
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
from jarvis_core.db import q from beanie.operators import LTE
from jarvis_core.db.models import Lock from jarvis_core.db.models import Lock
from naff import Client from interactions import Client
from naff.client.utils.misc_utils import get from interactions.client.utils.misc_utils import get
from naff.models.discord.channel import GuildChannel from interactions.models.discord.channel import GuildChannel
from jarvis_tasks.util import runat from jarvis_tasks.util import runat
@ -33,7 +33,7 @@ async def _unlock(channel: GuildChannel, lock: Lock) -> None:
except Exception: except Exception:
logger.debug("Locked channel deleted, ignoring error") logger.debug("Locked channel deleted, ignoring error")
lock.active = False lock.active = False
await lock.commit() await lock.save()
queue.remove(lock.id) queue.remove(lock.id)
@ -47,7 +47,7 @@ async def unlock(bot: Client) -> None:
logger.debug("Starting Task-lock") logger.debug("Starting Task-lock")
while True: while True:
max_ts = datetime.now(tz=timezone.utc) + timedelta(seconds=55) max_ts = datetime.now(tz=timezone.utc) + timedelta(seconds=55)
locks = Lock.find(q(active=True, created_at__lte=max_ts)) locks = Lock.find(Lock.active == True, LTE(Lock.created_at, max_ts))
async for lock in locks: async for lock in locks:
if lock.id in queue: if lock.id in queue:
continue continue

View file

@ -3,11 +3,11 @@ import asyncio
import logging import logging
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
from jarvis_core.db import q from beanie.operators import LTE
from jarvis_core.db.models import Lockdown from jarvis_core.db.models import Lockdown
from naff import Client from interactions import Client
from naff.models.discord.enums import Permissions from interactions.models.discord.enums import Permissions
from naff.models.discord.role import Role from interactions.models.discord.role import Role
from jarvis_tasks.util import runat from jarvis_tasks.util import runat
@ -20,7 +20,7 @@ async def _lift(role: Role, lock: Lockdown) -> None:
original_perms = Permissions(lock.original_perms) original_perms = Permissions(lock.original_perms)
await role.edit(permissions=original_perms) await role.edit(permissions=original_perms)
lock.active = False lock.active = False
await lock.commit() await lock.save()
queue.remove(lock.id) queue.remove(lock.id)
@ -34,7 +34,7 @@ async def lift(bot: Client) -> None:
logger.debug("Starting Task-lift") logger.debug("Starting Task-lift")
while True: while True:
max_ts = datetime.now(tz=timezone.utc) + timedelta(seconds=55) max_ts = datetime.now(tz=timezone.utc) + timedelta(seconds=55)
locks = Lockdown.find(q(active=True, created_at__lte=max_ts)) locks = Lockdown.find(Lockdown.active == True, LTE(Lockdown.created_at, max_ts))
async for lock in locks: async for lock in locks:
if lock.id in queue: if lock.id in queue:
continue continue

View file

@ -10,27 +10,31 @@ from asyncpraw.models.reddit.redditor import Redditor as Ruser
from asyncpraw.models.reddit.submission import Submission from asyncpraw.models.reddit.submission import Submission
from asyncpraw.models.reddit.submission import Subreddit as Sub from asyncpraw.models.reddit.submission import Subreddit as Sub
from asyncprawcore.exceptions import Forbidden, NotFound from asyncprawcore.exceptions import Forbidden, NotFound
from jarvis_core.db import q from beanie.operators import NotIn
from jarvis_core.db.models import Redditor, RedditorFollow, Subreddit, SubredditFollow from jarvis_core.db.models import Subreddit, SubredditFollow
from naff import Client
from naff.client.errors import NotFound as DNotFound # from jarvis_core.db.models import Redditor, RedditorFollow, Subreddit, SubredditFollow
from naff.models.discord.embed import Embed, EmbedField from interactions import Client
from interactions.client.errors import NotFound as DNotFound
from interactions.models.discord.embed import Embed, EmbedField
from jarvis_tasks import const from jarvis_tasks import const
from jarvis_tasks.config import TaskConfig from jarvis_tasks.config import load_config
from jarvis_tasks.prometheus.stats import reddit_count, reddit_gauge from jarvis_tasks.prometheus.stats import reddit_count, reddit_gauge
from jarvis_tasks.util import build_embed from jarvis_tasks.util import build_embed
DEFAULT_USER_AGENT = f"python:JARVIS-Tasks:{const.__version__} (by u/zevaryx)" DEFAULT_USER_AGENT = f"python:JARVIS-Tasks:{const.__version__} (by u/zevaryx)"
config = TaskConfig.from_yaml() config = load_config()
config.reddit["user_agent"] = config.reddit.get("user_agent", DEFAULT_USER_AGENT) config.reddit.user_agent = config.reddit.dict().get("user_agent", DEFAULT_USER_AGENT)
running = [] running = []
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
image_link = re.compile(r"https?://(?:www)?\.?preview\.redd\.it\/(.*\..*)\?.*") image_link = re.compile(r"https?://(?:www)?\.?preview\.redd\.it\/(.*\..*)\?.*")
async def post_embeds(sub: Sub, post: Submission, reddit: Reddit) -> Optional[List[Embed]]: async def post_embeds(
sub: Sub, post: Submission, reddit: Reddit
) -> Optional[List[Embed]]:
""" """
Build a post embeds. Build a post embeds.
@ -52,14 +56,20 @@ async def post_embeds(sub: Sub, post: Submission, reddit: Reddit) -> Optional[Li
og_post = post # noqa: F841 og_post = post # noqa: F841
post = await reddit.submission(post.crosspost_parent_list[0]["id"]) post = await reddit.submission(post.crosspost_parent_list[0]["id"])
await post.load() await post.load()
fields.append(EmbedField(name="Crossposted From", value=post.subreddit_name_prefixed)) fields.append(
EmbedField(name="Crossposted From", value=post.subreddit_name_prefixed)
)
content = f"> **{post.title}**" content = f"> **{post.title}**"
if "url" in vars(post): if "url" in vars(post):
if any(post.url.endswith(x) for x in ["jpeg", "jpg", "png", "gif"]): if any(post.url.endswith(x) for x in ["jpeg", "jpg", "png", "gif"]):
images = [post.url] images = [post.url]
if "media_metadata" in vars(post): if "media_metadata" in vars(post):
for k, v in post.media_metadata.items(): for k, v in post.media_metadata.items():
if v["status"] != "valid" or v["m"] not in ["image/jpg", "image/png", "image/gif"]: if v["status"] != "valid" or v["m"] not in [
"image/jpg",
"image/png",
"image/gif",
]:
continue continue
ext = v["m"].split("/")[-1] ext = v["m"].split("/")[-1]
i_url = f"https://i.redd.it/{k}.{ext}" i_url = f"https://i.redd.it/{k}.{ext}"
@ -77,7 +87,9 @@ async def post_embeds(sub: Sub, post: Submission, reddit: Reddit) -> Optional[Li
if post.spoiler: if post.spoiler:
content += "||" content += "||"
content += f"\n\n[View this post]({url})" content += f"\n\n[View this post]({url})"
content = "\n".join(image_link.sub(r"https://i.redd.it/\1", x) for x in content.split("\n")) content = "\n".join(
image_link.sub(r"https://i.redd.it/\1", x) for x in content.split("\n")
)
if not images and not content: if not images and not content:
logger.debug(f"Post {post.id} had neither content nor images?") logger.debug(f"Post {post.id} had neither content nor images?")
@ -94,9 +106,12 @@ async def post_embeds(sub: Sub, post: Submission, reddit: Reddit) -> Optional[Li
url=url, url=url,
color=color, color=color,
) )
base_embed.set_author(name="u/" + post.author.name, url=author_url, icon_url=author_icon) base_embed.set_author(
name="u/" + post.author.name, url=author_url, icon_url=author_icon
)
base_embed.set_footer( base_embed.set_footer(
text="Reddit", icon_url="https://www.redditinc.com/assets/images/site/reddit-logo.png" text="Reddit",
icon_url="https://www.redditinc.com/assets/images/site/reddit-logo.png",
) )
embeds = [base_embed] embeds = [base_embed]
@ -111,84 +126,92 @@ async def post_embeds(sub: Sub, post: Submission, reddit: Reddit) -> Optional[Li
return embeds return embeds
async def _stream_user(sub: Ruser, bot: Client, reddit: Reddit) -> None: # async def _stream_user(sub: Ruser, bot: Client, reddit: Reddit) -> None:
""" # """
Stream a redditor # Stream a redditor
Args: # Args:
sub: Redditor to stream # sub: Redditor to stream
bot: Client instance # bot: Client instance
""" # """
now = datetime.now(tz=timezone.utc) # now = datetime.now(tz=timezone.utc)
await sub.load() # await sub.load()
running.append(sub.name) # running.append(sub.name)
logger.debug(f"Streaming user {sub.name}") # logger.debug(f"Streaming user {sub.name}")
try: # try:
async for post in sub.stream.submissions(): # async for post in sub.stream.submissions():
if not post: # if not post:
logger.debug(f"Got None for post from {sub.name}") # logger.debug(f"Got None for post from {sub.name}")
continue # continue
await post.subreddit.load() # await post.subreddit.load()
if post.created_utc < now.timestamp(): # if post.created_utc < now.timestamp():
continue # continue
logger.debug(f"Got new post from {sub.name} in r/{post.subreddit.display_name}") # logger.debug(
follows = RedditorFollow.find(q(name=sub.name)) # f"Got new post from {sub.name} in r/{post.subreddit.display_name}"
num_follows = 0 # )
# follows = RedditorFollow.find(RedditorFollow.name == sub.name)
# num_follows = 0
async for follow in follows: # async for follow in follows:
num_follows += 1 # num_follows += 1
guild = await bot.fetch_guild(follow.guild) # guild = await bot.fetch_guild(follow.guild)
if not guild: # if not guild:
logger.warning(f"Follow {follow.id}'s guild no longer exists, deleting") # logger.warning(
await follow.delete() # f"Follow {follow.id}'s guild no longer exists, deleting"
num_follows -= 1 # )
continue # await follow.delete()
# num_follows -= 1
# continue
channel = await bot.fetch_channel(follow.channel) # channel = await bot.fetch_channel(follow.channel)
if not channel: # if not channel:
logger.warning(f"Follow {follow.id}'s channel no longer exists, deleting") # logger.warning(
await follow.delete() # f"Follow {follow.id}'s channel no longer exists, deleting"
num_follows -= 1 # )
continue # await follow.delete()
# num_follows -= 1
# continue
embeds = await post_embeds(post.subreddit, post, reddit) # embeds = await post_embeds(post.subreddit, post, reddit)
timestamp = int(post.created_utc) # timestamp = int(post.created_utc)
try: # try:
await channel.send( # await channel.send(
f"`u/{sub.name}` posted to r/{post.subreddit.display_name} at <t:{timestamp}:f>", # f"`u/{sub.name}` posted to r/{post.subreddit.display_name} at <t:{timestamp}:f>",
embeds=embeds, # embeds=embeds,
) # )
count = reddit_count.labels( # count = reddit_count.labels(
guild_id=guild.id, # guild_id=guild.id,
guild_name=guild.name, # guild_name=guild.name,
subreddit_name=post.subreddit.display_name, # subreddit_name=post.subreddit.display_name,
redditor_name=sub.name, # redditor_name=sub.name,
) # )
count.inc() # count.inc()
except DNotFound: # except DNotFound:
logger.warning(f"Follow {follow.id}'s channel no longer exists, deleting") # logger.warning(
await follow.delete() # f"Follow {follow.id}'s channel no longer exists, deleting"
num_follows -= 1 # )
continue # await follow.delete()
except Exception: # num_follows -= 1
logger.error( # continue
f"Failed to send message to {channel.id} in {channel.guild.name}", # except Exception:
exc_info=True, # logger.error(
) # f"Failed to send message to {channel.id} in {channel.guild.name}",
# exc_info=True,
# )
gauge = reddit_gauge.labels(redditor_name=sub.name) # gauge = reddit_gauge.labels(redditor_name=sub.name)
gauge.set(num_follows) # gauge.set(num_follows)
if num_follows == 0: # if num_follows == 0:
s = await Redditor.find_one(q(name=sub.name)) # s = await Redditor.find_one(Redditor.name == sub.name)
if s: # if s:
await s.delete() # await s.delete()
break # break
except Exception: # except Exception:
logger.error(f"Redditor stream {sub.name} failed", exc_info=True) # logger.error(f"Redditor stream {sub.name} failed", exc_info=True)
running.remove(sub.name) # running.remove(sub.name)
async def _stream_subreddit(sub: Sub, bot: Client, reddit: Reddit) -> None: async def _stream_subreddit(sub: Sub, bot: Client, reddit: Reddit) -> None:
@ -211,7 +234,9 @@ async def _stream_subreddit(sub: Sub, bot: Client, reddit: Reddit) -> None:
if post.created_utc < now.timestamp(): if post.created_utc < now.timestamp():
continue continue
logger.debug(f"Got new post in {sub.display_name}") logger.debug(f"Got new post in {sub.display_name}")
follows = SubredditFollow.find(q(display_name=sub.display_name)) follows = SubredditFollow.find(
SubredditFollow.display_name == sub.display_name
)
num_follows = 0 num_follows = 0
async for follow in follows: async for follow in follows:
@ -219,14 +244,18 @@ async def _stream_subreddit(sub: Sub, bot: Client, reddit: Reddit) -> None:
guild = await bot.fetch_guild(follow.guild) guild = await bot.fetch_guild(follow.guild)
if not guild: if not guild:
logger.warning(f"Follow {follow.id}'s guild no longer exists, deleting") logger.warning(
f"Follow {follow.id}'s guild no longer exists, deleting"
)
await follow.delete() await follow.delete()
num_follows -= 1 num_follows -= 1
continue continue
channel = await bot.fetch_channel(follow.channel) channel = await bot.fetch_channel(follow.channel)
if not channel: if not channel:
logger.warning(f"Follow {follow.id}'s channel no longer exists, deleting") logger.warning(
f"Follow {follow.id}'s channel no longer exists, deleting"
)
await follow.delete() await follow.delete()
num_follows -= 1 num_follows -= 1
continue continue
@ -247,7 +276,9 @@ async def _stream_subreddit(sub: Sub, bot: Client, reddit: Reddit) -> None:
) )
count.inc() count.inc()
except DNotFound: except DNotFound:
logger.warning(f"Follow {follow.id}'s channel no longer exists, deleting") logger.warning(
f"Follow {follow.id}'s channel no longer exists, deleting"
)
await follow.delete() await follow.delete()
num_follows -= 1 num_follows -= 1
continue continue
@ -263,7 +294,7 @@ async def _stream_subreddit(sub: Sub, bot: Client, reddit: Reddit) -> None:
gauge.set(num_follows) gauge.set(num_follows)
if num_follows == 0: if num_follows == 0:
s = await Subreddit.find_one(q(display_name=sub.display_name)) s = await Subreddit.find_one(Subreddit.display_name == sub.display_name)
if s: if s:
await s.delete() await s.delete()
break break
@ -276,12 +307,12 @@ async def _stream(sub: Sub | Ruser, bot: Client, reddit: Reddit) -> None:
""" """
Stream handler. Stream handler.
Decides what type of stream to launch based on `type(sub)` Decides what type of stream to launch based on `isinstance(sub, Sub)`
""" """
if isinstance(sub, Sub): if isinstance(sub, Sub):
await _stream_subreddit(sub, bot, reddit) await _stream_subreddit(sub, bot, reddit)
else: # else:
await _stream_user(sub, bot, reddit) # await _stream_user(sub, bot, reddit)
async def reddit(bot: Client) -> None: async def reddit(bot: Client) -> None:
@ -301,7 +332,9 @@ async def reddit(bot: Client) -> None:
async for sub in Subreddit.find(): async for sub in Subreddit.find():
count = 0 count = 0
async for follow in SubredditFollow.find(q(display_name=sub.display_name)): async for follow in SubredditFollow.find(
SubredditFollow.display_name == sub.display_name
):
count += 1 count += 1
guild = await bot.fetch_guild(follow.guild) guild = await bot.fetch_guild(follow.guild)
@ -316,30 +349,30 @@ async def reddit(bot: Client) -> None:
logger.debug(f"Subreddit {sub.display_name} has no followers, removing") logger.debug(f"Subreddit {sub.display_name} has no followers, removing")
await sub.delete() await sub.delete()
logger.debug("Validating redditor follows") # logger.debug("Validating redditor follows")
async for sub in Redditor.find(): # async for sub in Redditor.find():
count = 0 # count = 0
async for follow in RedditorFollow.find(q(name=sub.name)): # async for follow in RedditorFollow.find(RedditorFollow.name == sub.name):
count += 1 # count += 1
guild = await bot.fetch_guild(follow.guild) # guild = await bot.fetch_guild(follow.guild)
channel = await bot.fetch_channel(follow.channel) # channel = await bot.fetch_channel(follow.channel)
if not guild or not channel: # if not guild or not channel:
logger.debug(f"Follow {follow.id} invalid, deleting") # logger.debug(f"Follow {follow.id} invalid, deleting")
await follow.delete() # await follow.delete()
count -= 1 # count -= 1
continue # continue
if count == 0: # if count == 0:
logger.debug(f"Redditor {sub.name} has no followers, removing") # logger.debug(f"Redditor {sub.name} has no followers, removing")
await sub.delete() # await sub.delete()
old_count = 0 old_count = 0
while True: while True:
count = len(running) count = len(running)
subs = Subreddit.find(q(display_name__nin=running)) subs = Subreddit.find(NotIn(Subreddit.display_name, running))
users = Redditor.find(q(name__nin=running)) # users = Redditor.find(NotIn(Redditor.name, running))
# Go through all actively followed subreddits # Go through all actively followed subreddits
async for sub in subs: async for sub in subs:
@ -348,7 +381,9 @@ async def reddit(bot: Client) -> None:
logger.debug(f"Follow {sub.display_name} was found despite filter") logger.debug(f"Follow {sub.display_name} was found despite filter")
continue continue
is_followed = await SubredditFollow.find_one(q(display_name=sub.display_name)) is_followed = await SubredditFollow.find_one(
SubredditFollow.display_name == sub.display_name
)
if not is_followed: if not is_followed:
logger.warn(f"Subreddit {sub.display_name} has no followers, removing") logger.warn(f"Subreddit {sub.display_name} has no followers, removing")
await sub.delete() await sub.delete()
@ -359,7 +394,9 @@ async def reddit(bot: Client) -> None:
sub = await red.subreddit(sub.display_name) sub = await red.subreddit(sub.display_name)
except (NotFound, Forbidden) as e: except (NotFound, Forbidden) as e:
# Subreddit is either quarantined, deleted, or private # Subreddit is either quarantined, deleted, or private
logger.warn(f"Subreddit {sub.display_name} raised {e.__class__.__name__}, removing") logger.warn(
f"Subreddit {sub.display_name} raised {e.__class__.__name__}, removing"
)
try: try:
await sub.delete() await sub.delete()
except Exception: except Exception:
@ -372,34 +409,38 @@ async def reddit(bot: Client) -> None:
count += 1 count += 1
# Go through all actively followed redditors # Go through all actively followed redditors
async for sub in users: # async for sub in users:
logger.debug(f"Creating stream for {sub.name}") # logger.debug(f"Creating stream for {sub.name}")
if sub.name in running: # if sub.name in running:
logger.debug(f"Follow {sub.name} was found despite filter") # logger.debug(f"Follow {sub.name} was found despite filter")
continue # continue
is_followed = await SubredditFollow.find_one(q(name=sub.name)) # is_followed = await SubredditFollow.find_one(
if not is_followed: # SubredditFollow.name == sub.name
logger.warn(f"Redditor {sub.name} has no followers, removing") # )
await sub.delete() # if not is_followed:
continue # logger.warn(f"Redditor {sub.name} has no followers, removing")
# await sub.delete()
# continue
# Get subreddit # # Get subreddit
try: # try:
sub = await red.user(sub.name) # sub = await red.user(sub.name)
except (NotFound, Forbidden) as e: # except (NotFound, Forbidden) as e:
# Subreddit is either quarantined, deleted, or private # # Subreddit is either quarantined, deleted, or private
logger.warn(f"Redditor {sub.display_name} raised {e.__class__.__name__}, removing") # logger.warn(
try: # f"Redditor {sub.display_name} raised {e.__class__.__name__}, removing"
await sub.delete() # )
except Exception: # try:
logger.debug("Ignoring deletion error") # await sub.delete()
continue # except Exception:
# logger.debug("Ignoring deletion error")
# continue
# Create and run stream # # Create and run stream
coro = _stream(sub, bot, red) # coro = _stream(sub, bot, red)
asyncio.create_task(coro) # asyncio.create_task(coro)
count += 1 # count += 1
if old_count != count: if old_count != count:
logger.debug(f"Now streaming {count} subreddits") logger.debug(f"Now streaming {count} subreddits")

View file

@ -4,12 +4,12 @@ import logging
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
from typing import Optional from typing import Optional
from jarvis_core.db import q from beanie.operators import NotIn, LTE
from jarvis_core.db.models import Reminder from jarvis_core.db.models import Reminder
from naff import Client from interactions import Client
from naff.models.discord.channel import GuildText from interactions.models.discord.channel import GuildText
from naff.models.discord.embed import Embed from interactions.models.discord.embed import Embed
from naff.models.discord.user import User from interactions.models.discord.user import User
from jarvis_tasks.prometheus.stats import reminder_count from jarvis_tasks.prometheus.stats import reminder_count
from jarvis_tasks.util import build_embed, runat from jarvis_tasks.util import build_embed, runat
@ -52,14 +52,18 @@ async def _remind(
f"Reminder {reminder.id} private, sent notification to origin channel" f"Reminder {reminder.id} private, sent notification to origin channel"
) )
reminder.active = False reminder.active = False
await reminder.commit() await reminder.save()
delete = False delete = False
else: else:
logger.warning(f"Reminder {reminder.id} failed, no way to contact user.") logger.warning(
f"Reminder {reminder.id} failed, no way to contact user."
)
if delete: if delete:
await reminder.delete() await reminder.delete()
if reminded: if reminded:
count = reminder_count.labels(guild_id=channel.guild.id, guild_name=channel.guild.name) count = reminder_count.labels(
guild_id=channel.guild.id, guild_name=channel.guild.name
)
count.inc() count.inc()
queue.remove(reminder.id) queue.remove(reminder.id)
@ -74,7 +78,12 @@ async def remind(bot: Client) -> None:
logger.debug("Starting Task-remind") logger.debug("Starting Task-remind")
while True: while True:
max_ts = datetime.now(tz=timezone.utc) + timedelta(seconds=5) max_ts = datetime.now(tz=timezone.utc) + timedelta(seconds=5)
reminders = Reminder.find(q(id__nin=queue, remind_at__lte=max_ts, active=True)) reminders = Reminder.find(
NotIn(Reminder.id, queue),
LTE(Reminder.remind_at, max_ts),
Reminder.active == True,
)
async for reminder in reminders: async for reminder in reminders:
if reminder.id in queue: if reminder.id in queue:
logger.debug(f"Reminder {reminder.id} was found despite filter") logger.debug(f"Reminder {reminder.id} was found despite filter")

View file

@ -3,9 +3,9 @@ import asyncio
import logging import logging
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
from jarvis_core.db import q from beanie.operators import LTE, NotIn
from jarvis_core.db.models import Temprole from jarvis_core.db.models import Temprole
from naff import Client from interactions import Client
from jarvis_tasks.util import runat from jarvis_tasks.util import runat
@ -52,7 +52,9 @@ async def remove(bot: Client) -> None:
logger.debug("Starting Task-remove") logger.debug("Starting Task-remove")
while True: while True:
max_ts = datetime.now(tz=timezone.utc) + timedelta(seconds=45) max_ts = datetime.now(tz=timezone.utc) + timedelta(seconds=45)
temproles = Temprole.find(q(expires_at__lte=max_ts, id__nin=queue)) temproles = Temprole.find(
LTE(Temprole.expires_at, max_ts), NotIn(Temprole.id, queue)
)
async for temprole in temproles: async for temprole in temproles:
if temprole.id in queue: if temprole.id in queue:
logger.warn("Temprole found despite filter") logger.warn("Temprole found despite filter")

View file

@ -5,20 +5,19 @@ from datetime import datetime, timedelta, timezone
from html import unescape from html import unescape
from typing import List from typing import List
from jarvis_core.db import q
from jarvis_core.db.models import TwitterAccount, TwitterFollow from jarvis_core.db.models import TwitterAccount, TwitterFollow
from naff import Client from interactions import Client
from naff.client.errors import NotFound from interactions.client.errors import NotFound
from naff.models.discord.embed import Embed from interactions.models.discord.embed import Embed
from tweepy.streaming import StreamRule from tweepy.streaming import StreamRule
from tweepy.asynchronous import AsyncClient, AsyncStreamingClient from tweepy.asynchronous import AsyncClient, AsyncStreamingClient
from tweepy import Media, Tweet, User from tweepy import Media, Tweet, User
from jarvis_tasks.config import TaskConfig from jarvis_tasks.config import load_config
from jarvis_tasks.prometheus.stats import twitter_count, twitter_error, twitter_gauge from jarvis_tasks.prometheus.stats import twitter_count, twitter_error, twitter_gauge
from jarvis_tasks.util import build_embed from jarvis_tasks.util import build_embed
config = TaskConfig.from_yaml() config = load_config()
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
tlogger = logging.getLogger("Tweepy") tlogger = logging.getLogger("Tweepy")
tlogger.setLevel(logging.DEBUG) tlogger.setLevel(logging.DEBUG)
@ -29,7 +28,9 @@ DEFAULT_TWEET_FIELDS = "created_at"
DEFAULT_USER_FIELDS = "url,profile_image_url" DEFAULT_USER_FIELDS = "url,profile_image_url"
async def tweet_embeds(tweet: Tweet, retweet: bool, quoted: bool, api: AsyncClient) -> List[Embed]: async def tweet_embeds(
tweet: Tweet, retweet: bool, quoted: bool, api: AsyncClient
) -> List[Embed]:
""" """
Build a tweet embeds. Build a tweet embeds.
@ -119,7 +120,10 @@ class JARVISTwitterStream(AsyncStreamingClient):
Args: Args:
status_code: HTTP Status Code status_code: HTTP Status Code
""" """
logger.error(f"Received status code {status_code} while streaming, restarting", exc_info=True) logger.error(
f"Received status code {status_code} while streaming, restarting",
exc_info=True,
)
errors = twitter_error.labels(error_code=status_code) errors = twitter_error.labels(error_code=status_code)
errors.inc() errors.inc()
self.disconnect() self.disconnect()
@ -142,7 +146,7 @@ class JARVISTwitterStream(AsyncStreamingClient):
) )
author = status.includes.get("users")[0] author = status.includes.get("users")[0]
logger.debug(f"{author.username} sent new tweet") logger.debug(f"{author.username} sent new tweet")
follows = TwitterFollow.find(q(twitter_id=author.id)) follows = TwitterFollow.find(TwitterFollow.twitter_id == author.id)
num_follows = 0 num_follows = 0
retweet = False retweet = False
@ -184,7 +188,11 @@ class JARVISTwitterStream(AsyncStreamingClient):
f"`@{author.username}` {mod} this at <t:{timestamp}:f>", f"`@{author.username}` {mod} this at <t:{timestamp}:f>",
embeds=embeds, embeds=embeds,
) )
count = twitter_count.labels(guild_id=guild.id, guild_name=guild.name, twitter_handle=author.username) count = twitter_count.labels(
guild_id=guild.id,
guild_name=guild.name,
twitter_handle=author.username,
)
count.inc() count.inc()
except NotFound: except NotFound:
logger.warn(f"Follow {follow.id} invalid, deleting") logger.warn(f"Follow {follow.id} invalid, deleting")
@ -192,11 +200,17 @@ class JARVISTwitterStream(AsyncStreamingClient):
num_follows -= 1 num_follows -= 1
continue continue
except Exception: except Exception:
logger.debug(f"Failed to send message to {channel.id} in {channel.guild.name}") logger.debug(
f"Failed to send message to {channel.id} in {channel.guild.name}"
)
if num_follows == 0: if num_follows == 0:
logger.warning(f"Account {author.username} no longer has followers, removing") logger.warning(
account = await TwitterAccount.find_one(q(twitter_id=author.id)) f"Account {author.username} no longer has followers, removing"
)
account = await TwitterAccount.find_one(
TwitterAccount.twitter_id == author.id
)
if account: if account:
await account.delete() await account.delete()
self.disconnect() self.disconnect()
@ -216,7 +230,9 @@ async def twitter(bot: Client) -> None:
logger.warn("Missing Twitter config, not starting") logger.warn("Missing Twitter config, not starting")
return return
api = AsyncClient(bearer_token=config.twitter["bearer_token"]) api = AsyncClient(bearer_token=config.twitter["bearer_token"])
stream = JARVISTwitterStream(bot=bot, bearer_token=config.twitter["bearer_token"], api=api) stream = JARVISTwitterStream(
bot=bot, bearer_token=config.twitter["bearer_token"], api=api
)
rules = await stream.get_rules() rules = await stream.get_rules()
if rules.data: if rules.data:
await stream.delete_rules(rules.data) await stream.delete_rules(rules.data)
@ -226,7 +242,9 @@ async def twitter(bot: Client) -> None:
async for account in TwitterAccount.find(): async for account in TwitterAccount.find():
count = 0 count = 0
async for follow in TwitterFollow.find(q(twitter_id=account.twitter_id)): async for follow in TwitterFollow.find(
TwitterFollow.twitter_id == account.twitter_id
):
count += 1 count += 1
try: try:
guild = await bot.fetch_guild(follow.guild) guild = await bot.fetch_guild(follow.guild)
@ -270,7 +288,7 @@ async def twitter(bot: Client) -> None:
continue continue
account.handle = user.data.username account.handle = user.data.username
account.last_sync = datetime.now(tz=timezone.utc) account.last_sync = datetime.now(tz=timezone.utc)
await account.commit() await account.save()
ids.append(account.twitter_id) ids.append(account.twitter_id)
# Get new tweets # Get new tweets

View file

@ -3,9 +3,9 @@ import asyncio
import logging import logging
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
from jarvis_core.db import q from beanie.operators import LTE, NotIn
from jarvis_core.db.models import Warning from jarvis_core.db.models import Warning
from naff import Client from interactions import Client
from jarvis_tasks.util import runat from jarvis_tasks.util import runat
@ -16,7 +16,7 @@ logger = logging.getLogger(__name__)
async def _unwarn(warn: Warning) -> None: async def _unwarn(warn: Warning) -> None:
logger.debug(f"Deactivating warning {warn.id}") logger.debug(f"Deactivating warning {warn.id}")
warn.active = False warn.active = False
await warn.commit() await warn.save()
queue.remove(warn.id) queue.remove(warn.id)
@ -30,7 +30,11 @@ async def unwarn(bot: Client) -> None:
logger.debug("Starting Task-unwarn") logger.debug("Starting Task-unwarn")
while True: while True:
max_ts = datetime.now(tz=timezone.utc) + timedelta(minutes=55) max_ts = datetime.now(tz=timezone.utc) + timedelta(minutes=55)
warns = Warning.find(q(active=True, expires_at__lte=max_ts, id__nin=queue)) warns = Warning.find(
Warning.active == True,
LTE(Warning.expires_at, max_ts),
NotIn(Warning.id, queue),
)
async for warn in warns: async for warn in warns:
if warn.id in queue: if warn.id in queue:
logger.warn("Warning found despite filter") logger.warn("Warning found despite filter")

View file

@ -4,7 +4,7 @@ from datetime import datetime, timezone
from logging import Logger from logging import Logger
from typing import Coroutine from typing import Coroutine
from naff.models.discord.embed import Embed from interactions.models.discord.embed import Embed
async def runat(when: datetime, coro: Coroutine, logger: Logger) -> None: async def runat(when: datetime, coro: Coroutine, logger: Logger) -> None:

453
poetry.lock generated
View file

@ -1,4 +1,4 @@
# This file is automatically @generated by Poetry and should not be changed by hand. # This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand.
[[package]] [[package]]
name = "aiofiles" name = "aiofiles"
@ -275,22 +275,22 @@ test = ["asynctest (>=0.13.0)", "mock (>=0.8)", "pytest", "pytest-vcr", "testfix
[[package]] [[package]]
name = "attrs" name = "attrs"
version = "22.2.0" version = "23.1.0"
description = "Classes Without Boilerplate" description = "Classes Without Boilerplate"
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.6" python-versions = ">=3.7"
files = [ files = [
{file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"},
{file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"},
] ]
[package.extras] [package.extras]
cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] cov = ["attrs[tests]", "coverage[toml] (>=5.3)"]
dev = ["attrs[docs,tests]"] dev = ["attrs[docs,tests]", "pre-commit"]
docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"]
tests = ["attrs[tests-no-zope]", "zope.interface"] tests = ["attrs[tests-no-zope]", "zope-interface"]
tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"]
[[package]] [[package]]
name = "black" name = "black"
@ -329,14 +329,14 @@ uvloop = ["uvloop (>=0.15.2)"]
[[package]] [[package]]
name = "certifi" name = "certifi"
version = "2022.12.7" version = "2023.5.7"
description = "Python package for providing Mozilla's CA Bundle." description = "Python package for providing Mozilla's CA Bundle."
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.6" python-versions = ">=3.6"
files = [ files = [
{file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"},
{file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"},
] ]
[[package]] [[package]]
@ -651,6 +651,36 @@ files = [
{file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
] ]
[[package]]
name = "interactions-py"
version = "5.3.1"
description = "Easy, simple, scalable and modular: a Python API wrapper for interactions."
category = "main"
optional = false
python-versions = ">=3.10"
files = [
{file = "interactions.py-5.3.1-py3-none-any.whl", hash = "sha256:dbc6e15b46926987e3cbd198b536976ea7bc2b87355848c3b96e77da0ad120c1"},
{file = "interactions.py-5.3.1.tar.gz", hash = "sha256:c09b505630a33b52b3facc44837eb6c55e88e916c6302e1d6ce45b6c2d237c02"},
]
[package.dependencies]
aiohttp = "*"
attrs = "*"
discord-typings = ">=0.5.1"
emoji = "*"
tomli = "*"
[package.extras]
all = ["Brotli", "PyNaCl (>=1.5.0,<1.6)", "aioconsole (>=0.6.0)", "aiodns", "faust-cchardet", "jurigged", "orjson", "sentry-sdk", "uvloop"]
console = ["aioconsole (>=0.6.0)"]
dev = ["Brotli", "PyNaCl (>=1.5.0,<1.6)", "aioconsole (>=0.6.0)", "aiodns", "faust-cchardet", "jurigged", "mkdocs-autorefs", "mkdocs-awesome-pages-plugin", "mkdocs-git-committers-plugin-2", "mkdocs-git-revision-date-localized-plugin", "mkdocs-material", "mkdocs-minify-plugin", "mkdocstrings-python", "orjson", "pre-commit", "pytest", "pytest-asyncio", "pytest-cov", "python-dotenv", "sentry-sdk", "typeguard", "uvloop"]
docs = ["Brotli", "PyNaCl (>=1.5.0,<1.6)", "aioconsole (>=0.6.0)", "aiodns", "faust-cchardet", "jurigged", "mkdocs-autorefs", "mkdocs-awesome-pages-plugin", "mkdocs-git-committers-plugin-2", "mkdocs-git-revision-date-localized-plugin", "mkdocs-material", "mkdocs-minify-plugin", "mkdocstrings-python", "orjson", "sentry-sdk", "uvloop"]
jurigged = ["jurigged"]
sentry = ["sentry-sdk"]
speedup = ["Brotli", "aiodns", "faust-cchardet", "orjson", "uvloop"]
tests = ["pytest", "pytest-asyncio", "pytest-cov", "python-dotenv", "typeguard"]
voice = ["PyNaCl (>=1.5.0,<1.6)"]
[[package]] [[package]]
name = "jarvis-core" name = "jarvis-core"
version = "0.16.1" version = "0.16.1"
@ -676,7 +706,7 @@ umongo = "^3.1.0"
type = "git" type = "git"
url = "https://git.zevaryx.com/stark-industries/jarvis/jarvis-core.git" url = "https://git.zevaryx.com/stark-industries/jarvis/jarvis-core.git"
reference = "main" reference = "main"
resolved_reference = "392797c4aea76db0dff8772d95acea3ff3094b46" resolved_reference = "ec4219e5a54bea78ff19f23f1754a036e8d0eae3"
[[package]] [[package]]
name = "marshmallow" name = "marshmallow"
@ -701,14 +731,14 @@ tests = ["pytest", "pytz", "simplejson"]
[[package]] [[package]]
name = "motor" name = "motor"
version = "3.1.1" version = "3.1.2"
description = "Non-blocking MongoDB driver for Tornado or asyncio" description = "Non-blocking MongoDB driver for Tornado or asyncio"
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "motor-3.1.1-py3-none-any.whl", hash = "sha256:01d93d7c512810dcd85f4d634a7244ba42ff6be7340c869791fe793561e734da"}, {file = "motor-3.1.2-py3-none-any.whl", hash = "sha256:4bfc65230853ad61af447088527c1197f91c20ee957cfaea3144226907335716"},
{file = "motor-3.1.1.tar.gz", hash = "sha256:a4bdadf8a08ebb186ba16e557ba432aa867f689a42b80f2e9f8b24bbb1604742"}, {file = "motor-3.1.2.tar.gz", hash = "sha256:80c08477c09e70db4f85c99d484f2bafa095772f1d29b3ccb253270f9041da9a"},
] ]
[package.dependencies] [package.dependencies]
@ -819,34 +849,6 @@ files = [
{file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
] ]
[[package]]
name = "naff"
version = "2.1.0"
description = "Not another freaking fork"
category = "main"
optional = false
python-versions = ">=3.10"
files = [
{file = "naff-2.1.0-py3-none-any.whl", hash = "sha256:e433683b62f1a151867a44c752cb8725e8505f99086b07765f66696fa553adf2"},
{file = "naff-2.1.0.tar.gz", hash = "sha256:a58db2f56f6f5fc4fbefb354ce4d17a78080817ac8524ce6e74dedc54e1c850c"},
]
[package.dependencies]
aiohttp = "*"
attrs = ">=22.1.0"
discord-typings = ">=0.5.1"
emoji = "*"
tomli = "*"
[package.extras]
all = ["Brotli", "PyNaCl (>=1.5.0,<1.6)", "aiodns", "jurigged", "orjson", "sentry-sdk"]
docs = ["Brotli", "PyNaCl (>=1.5.0,<1.6)", "aiodns", "jurigged", "mkdocs-autorefs", "mkdocs-awesome-pages-plugin", "mkdocs-git-committers-plugin-2", "mkdocs-git-revision-date-localized-plugin", "mkdocs-material", "mkdocs-minify-plugin", "mkdocstrings-python", "orjson", "sentry-sdk"]
jurigged = ["jurigged"]
sentry = ["sentry-sdk"]
speedup = ["Brotli", "aiodns", "orjson"]
tests = ["pytest", "pytest-asyncio", "pytest-cov", "pytest-recording", "python-dotenv", "typeguard"]
voice = ["PyNaCl (>=1.5.0,<1.6)"]
[[package]] [[package]]
name = "nanoid" name = "nanoid"
version = "2.0.0" version = "2.0.0"
@ -878,68 +880,70 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"]
[[package]] [[package]]
name = "orjson" name = "orjson"
version = "3.8.7" version = "3.8.12"
description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy"
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "orjson-3.8.7-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:f98c82850b7b4b7e27785ca43706fa86c893cdb88d54576bbb9b0d9c1070e421"}, {file = "orjson-3.8.12-cp310-cp310-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:c84046e890e13a119404a83f2e09e622509ed4692846ff94c4ca03654fbc7fb5"},
{file = "orjson-3.8.7-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:1dee503c6c1a0659c5b46f5f39d9ca9d3657b11ca8bb4af8506086df416887d9"}, {file = "orjson-3.8.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29706dd8189835bcf1781faed286e99ae54fd6165437d364dfdbf0276bf39b19"},
{file = "orjson-3.8.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc4fa83831f42ce5c938f8cefc2e175fa1df6f661fdeaba3badf26d2b8cfcf73"}, {file = "orjson-3.8.12-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f4e22b0aa70c963ac01fcd620de15be21a5027711b0e5d4b96debcdeea43e3ae"},
{file = "orjson-3.8.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9e432c6c9c8b97ad825276d5795286f7cc9689f377a97e3b7ecf14918413303f"}, {file = "orjson-3.8.12-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d1acf52d3a4b9384af09a5c2658c3a7a472a4d62a0ad1fe2c8fab8ef460c9b4"},
{file = "orjson-3.8.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee519964a5a0efb9633f38b1129fd242807c5c57162844efeeaab1c8de080051"}, {file = "orjson-3.8.12-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a72b50719bdd6bb0acfca3d4d1c841aa4b191f3ff37268e7aba04e5d6be44ccd"},
{file = "orjson-3.8.7-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:109b539ce5bf60a121454d008fa67c3b67e5a3249e47d277012645922cf74bd0"}, {file = "orjson-3.8.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83e8c740a718fa6d511a82e463adc7ab17631c6eea81a716b723e127a9c51d57"},
{file = "orjson-3.8.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ad4d441fbde4133af6fee37f67dbf23181b9c537ecc317346ec8c3b4c8ec7705"}, {file = "orjson-3.8.12-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebb03e4c7648f7bb299872002a6120082da018f41ba7a9ebf4ceae8d765443d2"},
{file = "orjson-3.8.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:89dc786419e1ce2588345f58dd6a434e6728bce66b94989644234bcdbe39b603"}, {file = "orjson-3.8.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:44f7bb4c995652106276442de1147c9993716d1e2d79b7fd435afa154ff236b9"},
{file = "orjson-3.8.7-cp310-none-win_amd64.whl", hash = "sha256:697abde7350fb8076d44bcb6b4ab3ce415ae2b5a9bb91efc460e5ab0d96bb5d3"}, {file = "orjson-3.8.12-cp310-none-win_amd64.whl", hash = "sha256:06e528f9a84fbb4000fd0eee573b5db543ee70ae586fdbc53e740b0ac981701c"},
{file = "orjson-3.8.7-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:1c19f47b35b9966a3abadf341b18ee4a860431bf2b00fd8d58906d51cf78aa70"}, {file = "orjson-3.8.12-cp311-cp311-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:9a6c1594d5a9ff56e5babc4a87ac372af38d37adef9e06744e9f158431e33f43"},
{file = "orjson-3.8.7-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:3ffaabb380cd0ee187b4fc362516df6bf739808130b1339445c7d8878fca36e7"}, {file = "orjson-3.8.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6390ce0bce24c107fc275736aa8a4f768ef7eb5df935d7dca0cc99815eb5d99"},
{file = "orjson-3.8.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d88837002c5a8af970745b8e0ca1b0fdb06aafbe7f1279e110d338ea19f3d23"}, {file = "orjson-3.8.12-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:efb3a10030462a22c731682434df5c137a67632a8339f821cd501920b169007e"},
{file = "orjson-3.8.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff60187d1b7e0bfab376b6002b08c560b7de06c87cf3a8ac639ecf58f84c5f3b"}, {file = "orjson-3.8.12-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7e405d54c84c30d9b1c918c290bcf4ef484a45c69d5583a95db81ffffba40b44"},
{file = "orjson-3.8.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0110970aed35dec293f30ed1e09f8604afd5d15c5ef83de7f6c427619b3ba47b"}, {file = "orjson-3.8.12-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd6fbd1413559572e81b5ac64c45388147c3ba85cc3df2eaa11002945e0dbd1f"},
{file = "orjson-3.8.7-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:51b275475d4e36118b65ad56f9764056a09d985c5d72e64579bf8816f1356a5e"}, {file = "orjson-3.8.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f480ae7b84369b1860d8867f0baf8d885fede400fda390ce088bfa8edf97ffdc"},
{file = "orjson-3.8.7-cp311-none-win_amd64.whl", hash = "sha256:63144d27735f3b60f079f247ac9a289d80dfe49a7f03880dfa0c0ba64d6491d5"}, {file = "orjson-3.8.12-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:355055e0977c43b0e5325b9312b7208c696fe20cd54eed1d6fc80b0a4d6721f5"},
{file = "orjson-3.8.7-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:a16273d77db746bb1789a2bbfded81148a60743fd6f9d5185e02d92e3732fa18"}, {file = "orjson-3.8.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d937503e4dfba5edc8d5e0426d3cc97ed55716e93212b2e12a198664487b9965"},
{file = "orjson-3.8.7-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5bb32259ea22cc9dd47a6fdc4b8f9f1e2f798fcf56c7c1122a7df0f4c5d33bf3"}, {file = "orjson-3.8.12-cp311-none-win_amd64.whl", hash = "sha256:eb16e0195febd24b44f4db1ab3be85ecf6038f92fd511370cebc004b3d422294"},
{file = "orjson-3.8.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad02e9102d4ba67db30a136e631e32aeebd1dce26c9f5942a457b02df131c5d0"}, {file = "orjson-3.8.12-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:dc27a8ec13f28e92dc1ea89bf1232d77e7d3ebfd5c1ccf4f3729a70561cb63bd"},
{file = "orjson-3.8.7-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dbcfcec2b7ac52deb7be3685b551addc28ee8fa454ef41f8b714df6ba0e32a27"}, {file = "orjson-3.8.12-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77710774faed337ac4ad919dadc5f3b655b0cd40518e5386e6f1f116de9c6c25"},
{file = "orjson-3.8.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a0e5504a5fc86083cc210c6946e8d61e13fe9f1d7a7bf81b42f7050a49d4fb"}, {file = "orjson-3.8.12-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7e549468867991f6f9cfbd9c5bbc977330173bd8f6ceb79973bbd4634e13e1b9"},
{file = "orjson-3.8.7-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:7bd4fd37adb03b1f2a1012d43c9f95973a02164e131dfe3ff804d7e180af5653"}, {file = "orjson-3.8.12-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96fb1eb82b578eb6c0e53e3cf950839fe98ea210626f87c8204bd4fc2cc6ba02"},
{file = "orjson-3.8.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:188ed9f9a781333ad802af54c55d5a48991e292239aef41bd663b6e314377eb8"}, {file = "orjson-3.8.12-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d153b228b6e24f8bccf732a51e01e8e938eef59efed9030c5c257778fbe0804"},
{file = "orjson-3.8.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:cc52f58c688cb10afd810280e450f56fbcb27f52c053463e625c8335c95db0dc"}, {file = "orjson-3.8.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:becbd5af6d035a7ec2ee3239d4700929d52d8517806b97dd04efcc37289403f7"},
{file = "orjson-3.8.7-cp37-none-win_amd64.whl", hash = "sha256:403c8c84ac8a02c40613b0493b74d5256379e65196d39399edbf2ed3169cbeb5"}, {file = "orjson-3.8.12-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d63f524048825e05950db3b6998c756d5377a5e8c469b2e3bdb9f3217523d74"},
{file = "orjson-3.8.7-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:7d6ac5f8a2a17095cd927c4d52abbb38af45918e0d3abd60fb50cfd49d71ae24"}, {file = "orjson-3.8.12-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ec4f0130d9a27cb400423e09e0f9e46480e9e977f05fdcf663a7a2c68735513e"},
{file = "orjson-3.8.7-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:0295a7bfd713fa89231fd0822c995c31fc2343c59a1d13aa1b8b6651335654f5"}, {file = "orjson-3.8.12-cp37-none-win_amd64.whl", hash = "sha256:6f1b01f641f5e87168b819ac1cbd81aa6278e7572c326f3d27e92dea442a2c0d"},
{file = "orjson-3.8.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feb32aaaa34cf2f891eb793ad320d4bb6731328496ae59b6c9eb1b620c42b529"}, {file = "orjson-3.8.12-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:062e67108c218fdb9475edd5272b1629c05b56c66416fa915de5656adde30e73"},
{file = "orjson-3.8.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7a3ab1a473894e609b6f1d763838c6689ba2b97620c256a32c4d9f10595ac179"}, {file = "orjson-3.8.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ba645c92801417933fa74448622ba614a275ea82df05e888095c7742d913bb4"},
{file = "orjson-3.8.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e8c430d82b532c5ab95634e034bbf6ca7432ffe175a3e63eadd493e00b3a555"}, {file = "orjson-3.8.12-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7d50d9b1ae409ea15534365fec0ce8a5a5f7dc94aa790aacfb8cfec87ab51aa4"},
{file = "orjson-3.8.7-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:366cc75f7e09106f9dac95a675aef413367b284f25507d21e55bd7f45f445e80"}, {file = "orjson-3.8.12-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f00038bf5d07439d13c0c2c5cd6ad48eb86df7dbd7a484013ce6a113c421b14"},
{file = "orjson-3.8.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:84d154d07e8b17d97e990d5d710b719a031738eb1687d8a05b9089f0564ff3e0"}, {file = "orjson-3.8.12-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:397670665f94cf5cff779054781d80395084ba97191d82f7b3a86f0a20e6102b"},
{file = "orjson-3.8.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06180014afcfdc167ca984b312218aa62ce20093965c437c5f9166764cb65ef7"}, {file = "orjson-3.8.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f568205519bb0197ca91915c5da6058cfbb59993e557b02dfc3b2718b34770a"},
{file = "orjson-3.8.7-cp38-none-win_amd64.whl", hash = "sha256:41244431ba13f2e6ef22b52c5cf0202d17954489f4a3c0505bd28d0e805c3546"}, {file = "orjson-3.8.12-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4fd240e736ce52cd757d74142d9933fd35a3184396be887c435f0574e0388654"},
{file = "orjson-3.8.7-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:b20f29fa8371b8023f1791df035a2c3ccbd98baa429ac3114fc104768f7db6f8"}, {file = "orjson-3.8.12-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6cae2ff288a80e81ce30313e735c5436495ab58cf8d4fbe84900e616d0ee7a78"},
{file = "orjson-3.8.7-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:226bfc1da2f21ee74918cee2873ea9a0fec1a8830e533cb287d192d593e99d02"}, {file = "orjson-3.8.12-cp38-none-win_amd64.whl", hash = "sha256:710c40c214b753392e46f9275fd795e9630dd737a5ab4ac6e4ee1a02fe83cc0d"},
{file = "orjson-3.8.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e75c11023ac29e29fd3e75038d0e8dd93f9ea24d7b9a5e871967a8921a88df24"}, {file = "orjson-3.8.12-cp39-cp39-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:aff761de5ed5543a0a51e9f703668624749aa2239de5d7d37d9c9693daeaf5dc"},
{file = "orjson-3.8.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:78604d3acfd7cd502f6381eea0c42281fe2b74755b334074ab3ebc0224100be1"}, {file = "orjson-3.8.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:135f29cf936283a0cd1b8bce86540ca181108f2a4d4483eedad6b8026865d2a9"},
{file = "orjson-3.8.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7129a6847f0494aa1427167486ef6aea2e835ba05f6c627df522692ee228f65"}, {file = "orjson-3.8.12-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62f999798f2fa55e567d483864ebfc30120fb055c2696a255979439323a5b15c"},
{file = "orjson-3.8.7-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1a1a8f4980059f48483782c608145b0f74538c266e01c183d9bcd9f8b71dbada"}, {file = "orjson-3.8.12-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fa58ca064c640fa9d823f98fbbc8e71940ecb78cea3ac2507da1cbf49d60b51"},
{file = "orjson-3.8.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d60304172a33705ce4bd25a6261ab84bed2dab0b3d3b79672ea16c7648af4832"}, {file = "orjson-3.8.12-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8682f752c19f6a7d9fc727fd98588b4c8b0dce791b5794bb814c7379ccd64a79"},
{file = "orjson-3.8.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4f733062d84389c32c0492e5a4929056fac217034a94523debe0430bcc602cda"}, {file = "orjson-3.8.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3d096dde3e46d01841abc1982b906694ab3c92f338d37a2e6184739dc8a958"},
{file = "orjson-3.8.7-cp39-none-win_amd64.whl", hash = "sha256:010e2970ec9e826c332819e0da4b14b29b19641da0f1a6af4cec91629ef9b988"}, {file = "orjson-3.8.12-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:834b50df79f1fe89bbaced3a1c1d8c8c92cc99e84cdcd374d8da4974b3560d2a"},
{file = "orjson-3.8.7.tar.gz", hash = "sha256:8460c8810652dba59c38c80d27c325b5092d189308d8d4f3e688dbd8d4f3b2dc"}, {file = "orjson-3.8.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2ad149ed76dce2bbdfbadd61c35959305e77141badf364a158beb4ef3d88ec37"},
{file = "orjson-3.8.12-cp39-none-win_amd64.whl", hash = "sha256:82d65e478a21f98107b4eb8390104746bb3024c27084b57edab7d427385f1f70"},
{file = "orjson-3.8.12.tar.gz", hash = "sha256:9f0f042cf002a474a6aea006dd9f8d7a5497e35e5fb190ec78eb4d232ec19955"},
] ]
[[package]] [[package]]
name = "packaging" name = "packaging"
version = "23.0" version = "23.1"
description = "Core utilities for Python packages" description = "Core utilities for Python packages"
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"},
{file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"},
] ]
[[package]] [[package]]
@ -956,19 +960,19 @@ files = [
[[package]] [[package]]
name = "platformdirs" name = "platformdirs"
version = "3.1.1" version = "3.5.0"
description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
category = "dev" category = "dev"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "platformdirs-3.1.1-py3-none-any.whl", hash = "sha256:e5986afb596e4bb5bde29a79ac9061aa955b94fca2399b7aaac4090860920dd8"}, {file = "platformdirs-3.5.0-py3-none-any.whl", hash = "sha256:47692bc24c1958e8b0f13dd727307cff1db103fca36399f457da8e05f222fdc4"},
{file = "platformdirs-3.1.1.tar.gz", hash = "sha256:024996549ee88ec1a9aa99ff7f8fc819bb59e2c3477b410d90a16d32d6e707aa"}, {file = "platformdirs-3.5.0.tar.gz", hash = "sha256:7954a68d0ba23558d753f73437c55f89027cf8f5108c19844d4b82e5af396335"},
] ]
[package.extras] [package.extras]
docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"]
test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"]
[[package]] [[package]]
name = "pluggy" name = "pluggy"
@ -1001,16 +1005,69 @@ files = [
[package.extras] [package.extras]
twisted = ["twisted"] twisted = ["twisted"]
[[package]]
name = "pydantic"
version = "1.10.7"
description = "Data validation and settings management using python type hints"
category = "main"
optional = false
python-versions = ">=3.7"
files = [
{file = "pydantic-1.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e79e999e539872e903767c417c897e729e015872040e56b96e67968c3b918b2d"},
{file = "pydantic-1.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:01aea3a42c13f2602b7ecbbea484a98169fb568ebd9e247593ea05f01b884b2e"},
{file = "pydantic-1.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:516f1ed9bc2406a0467dd777afc636c7091d71f214d5e413d64fef45174cfc7a"},
{file = "pydantic-1.10.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae150a63564929c675d7f2303008d88426a0add46efd76c3fc797cd71cb1b46f"},
{file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ecbbc51391248116c0a055899e6c3e7ffbb11fb5e2a4cd6f2d0b93272118a209"},
{file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f4a2b50e2b03d5776e7f21af73e2070e1b5c0d0df255a827e7c632962f8315af"},
{file = "pydantic-1.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:a7cd2251439988b413cb0a985c4ed82b6c6aac382dbaff53ae03c4b23a70e80a"},
{file = "pydantic-1.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:68792151e174a4aa9e9fc1b4e653e65a354a2fa0fed169f7b3d09902ad2cb6f1"},
{file = "pydantic-1.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe2507b8ef209da71b6fb5f4e597b50c5a34b78d7e857c4f8f3115effaef5fe"},
{file = "pydantic-1.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a86d8c8db68086f1e30a530f7d5f83eb0685e632e411dbbcf2d5c0150e8dcd"},
{file = "pydantic-1.10.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75ae19d2a3dbb146b6f324031c24f8a3f52ff5d6a9f22f0683694b3afcb16fb"},
{file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:464855a7ff7f2cc2cf537ecc421291b9132aa9c79aef44e917ad711b4a93163b"},
{file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:193924c563fae6ddcb71d3f06fa153866423ac1b793a47936656e806b64e24ca"},
{file = "pydantic-1.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:b4a849d10f211389502059c33332e91327bc154acc1845f375a99eca3afa802d"},
{file = "pydantic-1.10.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cc1dde4e50a5fc1336ee0581c1612215bc64ed6d28d2c7c6f25d2fe3e7c3e918"},
{file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0cfe895a504c060e5d36b287ee696e2fdad02d89e0d895f83037245218a87fe"},
{file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:670bb4683ad1e48b0ecb06f0cfe2178dcf74ff27921cdf1606e527d2617a81ee"},
{file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:950ce33857841f9a337ce07ddf46bc84e1c4946d2a3bba18f8280297157a3fd1"},
{file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c15582f9055fbc1bfe50266a19771bbbef33dd28c45e78afbe1996fd70966c2a"},
{file = "pydantic-1.10.7-cp37-cp37m-win_amd64.whl", hash = "sha256:82dffb306dd20bd5268fd6379bc4bfe75242a9c2b79fec58e1041fbbdb1f7914"},
{file = "pydantic-1.10.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c7f51861d73e8b9ddcb9916ae7ac39fb52761d9ea0df41128e81e2ba42886cd"},
{file = "pydantic-1.10.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6434b49c0b03a51021ade5c4daa7d70c98f7a79e95b551201fff682fc1661245"},
{file = "pydantic-1.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d34ab766fa056df49013bb6e79921a0265204c071984e75a09cbceacbbdd5d"},
{file = "pydantic-1.10.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:701daea9ffe9d26f97b52f1d157e0d4121644f0fcf80b443248434958fd03dc3"},
{file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf135c46099ff3f919d2150a948ce94b9ce545598ef2c6c7bf55dca98a304b52"},
{file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0f85904f73161817b80781cc150f8b906d521fa11e3cdabae19a581c3606209"},
{file = "pydantic-1.10.7-cp38-cp38-win_amd64.whl", hash = "sha256:9f6f0fd68d73257ad6685419478c5aece46432f4bdd8d32c7345f1986496171e"},
{file = "pydantic-1.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c230c0d8a322276d6e7b88c3f7ce885f9ed16e0910354510e0bae84d54991143"},
{file = "pydantic-1.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:976cae77ba6a49d80f461fd8bba183ff7ba79f44aa5cfa82f1346b5626542f8e"},
{file = "pydantic-1.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d45fc99d64af9aaf7e308054a0067fdcd87ffe974f2442312372dfa66e1001d"},
{file = "pydantic-1.10.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2a5ebb48958754d386195fe9e9c5106f11275867051bf017a8059410e9abf1f"},
{file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:abfb7d4a7cd5cc4e1d1887c43503a7c5dd608eadf8bc615413fc498d3e4645cd"},
{file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:80b1fab4deb08a8292d15e43a6edccdffa5377a36a4597bb545b93e79c5ff0a5"},
{file = "pydantic-1.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:d71e69699498b020ea198468e2480a2f1e7433e32a3a99760058c6520e2bea7e"},
{file = "pydantic-1.10.7-py3-none-any.whl", hash = "sha256:0cd181f1d0b1d00e2b705f1bf1ac7799a2d938cce3376b8007df62b29be3c2c6"},
{file = "pydantic-1.10.7.tar.gz", hash = "sha256:cfc83c0678b6ba51b0532bea66860617c4cd4251ecf76e9846fa5a9f3454e97e"},
]
[package.dependencies]
typing-extensions = ">=4.2.0"
[package.extras]
dotenv = ["python-dotenv (>=0.10.4)"]
email = ["email-validator (>=1.0.3)"]
[[package]] [[package]]
name = "pygments" name = "pygments"
version = "2.14.0" version = "2.15.1"
description = "Pygments is a syntax highlighting package written in Python." description = "Pygments is a syntax highlighting package written in Python."
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.6" python-versions = ">=3.7"
files = [ files = [
{file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"}, {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"},
{file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297"}, {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"},
] ]
[package.extras] [package.extras]
@ -1113,18 +1170,17 @@ zstd = ["zstandard"]
[[package]] [[package]]
name = "pytest" name = "pytest"
version = "7.2.2" version = "7.3.1"
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"
files = [ files = [
{file = "pytest-7.2.2-py3-none-any.whl", hash = "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e"}, {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"},
{file = "pytest-7.2.2.tar.gz", hash = "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4"}, {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"},
] ]
[package.dependencies] [package.dependencies]
attrs = ">=19.2.0"
colorama = {version = "*", markers = "sys_platform == \"win32\""} colorama = {version = "*", markers = "sys_platform == \"win32\""}
exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
iniconfig = "*" iniconfig = "*"
@ -1133,7 +1189,7 @@ pluggy = ">=0.12,<2.0"
tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""}
[package.extras] [package.extras]
testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"]
[[package]] [[package]]
name = "python-dotenv" name = "python-dotenv"
@ -1214,21 +1270,21 @@ files = [
[[package]] [[package]]
name = "requests" name = "requests"
version = "2.28.2" version = "2.30.0"
description = "Python HTTP for Humans." description = "Python HTTP for Humans."
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.7, <4" python-versions = ">=3.7"
files = [ files = [
{file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, {file = "requests-2.30.0-py3-none-any.whl", hash = "sha256:10e94cc4f3121ee6da529d358cdaeaff2f1c409cd377dbc72b825852f2f7e294"},
{file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, {file = "requests-2.30.0.tar.gz", hash = "sha256:239d7d4458afcb28a692cdd298d87542235f4ca8d36d03a15bfc128a6559a2f4"},
] ]
[package.dependencies] [package.dependencies]
certifi = ">=2017.4.17" certifi = ">=2017.4.17"
charset-normalizer = ">=2,<4" charset-normalizer = ">=2,<4"
idna = ">=2.5,<4" idna = ">=2.5,<4"
urllib3 = ">=1.21.1,<1.27" urllib3 = ">=1.21.1,<3"
[package.extras] [package.extras]
socks = ["PySocks (>=1.5.6,!=1.5.7)"] socks = ["PySocks (>=1.5.6,!=1.5.7)"]
@ -1286,14 +1342,14 @@ files = [
[[package]] [[package]]
name = "tweepy" name = "tweepy"
version = "4.13.0" version = "4.14.0"
description = "Twitter library for Python" description = "Twitter library for Python"
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "tweepy-4.13.0-py3-none-any.whl", hash = "sha256:95207c41023b75a066b0b442a0a907acada610a3cfa09c4ccb5f2d9e522c33b5"}, {file = "tweepy-4.14.0-py3-none-any.whl", hash = "sha256:db6d3844ccc0c6d27f339f12ba8acc89912a961da513c1ae50fa2be502a56afb"},
{file = "tweepy-4.13.0.tar.gz", hash = "sha256:097425335f9f6674826ba7e72b2247bbca39c9ca0a0bd82f30a38a5bef8c6c88"}, {file = "tweepy-4.14.0.tar.gz", hash = "sha256:1f9f1707d6972de6cff6c5fd90dfe6a449cd2e0d70bd40043ffab01e07a06c8c"},
] ]
[package.dependencies] [package.dependencies]
@ -1365,20 +1421,21 @@ test = ["pytest (>=2.7.3)"]
[[package]] [[package]]
name = "urllib3" name = "urllib3"
version = "1.26.15" version = "2.0.2"
description = "HTTP library with thread-safe connection pooling, file post, and more." description = "HTTP library with thread-safe connection pooling, file post, and more."
category = "main" category = "main"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" python-versions = ">=3.7"
files = [ files = [
{file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, {file = "urllib3-2.0.2-py3-none-any.whl", hash = "sha256:d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e"},
{file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, {file = "urllib3-2.0.2.tar.gz", hash = "sha256:61717a1095d7e155cdb737ac7bb2f4324a858a1e2e6466f6d03ff630ca68d3cc"},
] ]
[package.extras] [package.extras]
brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"]
secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"]
socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
zstd = ["zstandard (>=0.18.0)"]
[[package]] [[package]]
name = "uvicorn" name = "uvicorn"
@ -1402,86 +1459,86 @@ standard = ["PyYAML (>=5.1)", "colorama (>=0.4)", "httptools (>=0.4.0)", "python
[[package]] [[package]]
name = "yarl" name = "yarl"
version = "1.8.2" version = "1.9.2"
description = "Yet another URL library" description = "Yet another URL library"
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "yarl-1.8.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bb81f753c815f6b8e2ddd2eef3c855cf7da193b82396ac013c661aaa6cc6b0a5"}, {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"},
{file = "yarl-1.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:47d49ac96156f0928f002e2424299b2c91d9db73e08c4cd6742923a086f1c863"}, {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"},
{file = "yarl-1.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3fc056e35fa6fba63248d93ff6e672c096f95f7836938241ebc8260e062832fe"}, {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"},
{file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a3c13d1c3005dbbac5c9f0d3210b60220a65a999b1833aa46bd6677c69b08e"}, {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"},
{file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10b08293cda921157f1e7c2790999d903b3fd28cd5c208cf8826b3b508026996"}, {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"},
{file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de986979bbd87272fe557e0a8fcb66fd40ae2ddfe28a8b1ce4eae22681728fef"}, {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"},
{file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c4fcfa71e2c6a3cb568cf81aadc12768b9995323186a10827beccf5fa23d4f8"}, {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"},
{file = "yarl-1.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae4d7ff1049f36accde9e1ef7301912a751e5bae0a9d142459646114c70ecba6"}, {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"},
{file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bf071f797aec5b96abfc735ab97da9fd8f8768b43ce2abd85356a3127909d146"}, {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"},
{file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:74dece2bfc60f0f70907c34b857ee98f2c6dd0f75185db133770cd67300d505f"}, {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"},
{file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:df60a94d332158b444301c7f569659c926168e4d4aad2cfbf4bce0e8fb8be826"}, {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"},
{file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:63243b21c6e28ec2375f932a10ce7eda65139b5b854c0f6b82ed945ba526bff3"}, {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"},
{file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cfa2bbca929aa742b5084fd4663dd4b87c191c844326fcb21c3afd2d11497f80"}, {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"},
{file = "yarl-1.8.2-cp310-cp310-win32.whl", hash = "sha256:b05df9ea7496df11b710081bd90ecc3a3db6adb4fee36f6a411e7bc91a18aa42"}, {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"},
{file = "yarl-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:24ad1d10c9db1953291f56b5fe76203977f1ed05f82d09ec97acb623a7976574"}, {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"},
{file = "yarl-1.8.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a1fca9588f360036242f379bfea2b8b44cae2721859b1c56d033adfd5893634"}, {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"},
{file = "yarl-1.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f37db05c6051eff17bc832914fe46869f8849de5b92dc4a3466cd63095d23dfd"}, {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"},
{file = "yarl-1.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77e913b846a6b9c5f767b14dc1e759e5aff05502fe73079f6f4176359d832581"}, {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"},
{file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0978f29222e649c351b173da2b9b4665ad1feb8d1daa9d971eb90df08702668a"}, {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"},
{file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388a45dc77198b2460eac0aca1efd6a7c09e976ee768b0d5109173e521a19daf"}, {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"},
{file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2305517e332a862ef75be8fad3606ea10108662bc6fe08509d5ca99503ac2aee"}, {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"},
{file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42430ff511571940d51e75cf42f1e4dbdded477e71c1b7a17f4da76c1da8ea76"}, {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"},
{file = "yarl-1.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3150078118f62371375e1e69b13b48288e44f6691c1069340081c3fd12c94d5b"}, {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"},
{file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c15163b6125db87c8f53c98baa5e785782078fbd2dbeaa04c6141935eb6dab7a"}, {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"},
{file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4d04acba75c72e6eb90745447d69f84e6c9056390f7a9724605ca9c56b4afcc6"}, {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"},
{file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e7fd20d6576c10306dea2d6a5765f46f0ac5d6f53436217913e952d19237efc4"}, {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"},
{file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:75c16b2a900b3536dfc7014905a128a2bea8fb01f9ee26d2d7d8db0a08e7cb2c"}, {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"},
{file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6d88056a04860a98341a0cf53e950e3ac9f4e51d1b6f61a53b0609df342cc8b2"}, {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"},
{file = "yarl-1.8.2-cp311-cp311-win32.whl", hash = "sha256:fb742dcdd5eec9f26b61224c23baea46c9055cf16f62475e11b9b15dfd5c117b"}, {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"},
{file = "yarl-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8c46d3d89902c393a1d1e243ac847e0442d0196bbd81aecc94fcebbc2fd5857c"}, {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"},
{file = "yarl-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ceff9722e0df2e0a9e8a79c610842004fa54e5b309fe6d218e47cd52f791d7ef"}, {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"},
{file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f6b4aca43b602ba0f1459de647af954769919c4714706be36af670a5f44c9c1"}, {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"},
{file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1684a9bd9077e922300ecd48003ddae7a7474e0412bea38d4631443a91d61077"}, {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"},
{file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ebb78745273e51b9832ef90c0898501006670d6e059f2cdb0e999494eb1450c2"}, {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"},
{file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3adeef150d528ded2a8e734ebf9ae2e658f4c49bf413f5f157a470e17a4a2e89"}, {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"},
{file = "yarl-1.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57a7c87927a468e5a1dc60c17caf9597161d66457a34273ab1760219953f7f4c"}, {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"},
{file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:efff27bd8cbe1f9bd127e7894942ccc20c857aa8b5a0327874f30201e5ce83d0"}, {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"},
{file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a783cd344113cb88c5ff7ca32f1f16532a6f2142185147822187913eb989f739"}, {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"},
{file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:705227dccbe96ab02c7cb2c43e1228e2826e7ead880bb19ec94ef279e9555b5b"}, {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"},
{file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:34c09b43bd538bf6c4b891ecce94b6fa4f1f10663a8d4ca589a079a5018f6ed7"}, {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"},
{file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a48f4f7fea9a51098b02209d90297ac324241bf37ff6be6d2b0149ab2bd51b37"}, {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"},
{file = "yarl-1.8.2-cp37-cp37m-win32.whl", hash = "sha256:0414fd91ce0b763d4eadb4456795b307a71524dbacd015c657bb2a39db2eab89"}, {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"},
{file = "yarl-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d881d152ae0007809c2c02e22aa534e702f12071e6b285e90945aa3c376463c5"}, {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"},
{file = "yarl-1.8.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5df5e3d04101c1e5c3b1d69710b0574171cc02fddc4b23d1b2813e75f35a30b1"}, {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"},
{file = "yarl-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a66c506ec67eb3159eea5096acd05f5e788ceec7b96087d30c7d2865a243918"}, {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"},
{file = "yarl-1.8.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2b4fa2606adf392051d990c3b3877d768771adc3faf2e117b9de7eb977741229"}, {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"},
{file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e21fb44e1eff06dd6ef971d4bdc611807d6bd3691223d9c01a18cec3677939e"}, {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"},
{file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93202666046d9edadfe9f2e7bf5e0782ea0d497b6d63da322e541665d65a044e"}, {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"},
{file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc77086ce244453e074e445104f0ecb27530d6fd3a46698e33f6c38951d5a0f1"}, {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"},
{file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dd68a92cab699a233641f5929a40f02a4ede8c009068ca8aa1fe87b8c20ae3"}, {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"},
{file = "yarl-1.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b372aad2b5f81db66ee7ec085cbad72c4da660d994e8e590c997e9b01e44901"}, {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"},
{file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e6f3515aafe0209dd17fb9bdd3b4e892963370b3de781f53e1746a521fb39fc0"}, {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"},
{file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dfef7350ee369197106805e193d420b75467b6cceac646ea5ed3049fcc950a05"}, {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"},
{file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:728be34f70a190566d20aa13dc1f01dc44b6aa74580e10a3fb159691bc76909d"}, {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"},
{file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ff205b58dc2929191f68162633d5e10e8044398d7a45265f90a0f1d51f85f72c"}, {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"},
{file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baf211dcad448a87a0d9047dc8282d7de59473ade7d7fdf22150b1d23859f946"}, {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"},
{file = "yarl-1.8.2-cp38-cp38-win32.whl", hash = "sha256:272b4f1599f1b621bf2aabe4e5b54f39a933971f4e7c9aa311d6d7dc06965165"}, {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"},
{file = "yarl-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:326dd1d3caf910cd26a26ccbfb84c03b608ba32499b5d6eeb09252c920bcbe4f"}, {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"},
{file = "yarl-1.8.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f8ca8ad414c85bbc50f49c0a106f951613dfa5f948ab69c10ce9b128d368baf8"}, {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"},
{file = "yarl-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:418857f837347e8aaef682679f41e36c24250097f9e2f315d39bae3a99a34cbf"}, {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"},
{file = "yarl-1.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae0eec05ab49e91a78700761777f284c2df119376e391db42c38ab46fd662b77"}, {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"},
{file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:009a028127e0a1755c38b03244c0bea9d5565630db9c4cf9572496e947137a87"}, {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"},
{file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3edac5d74bb3209c418805bda77f973117836e1de7c000e9755e572c1f7850d0"}, {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"},
{file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da65c3f263729e47351261351b8679c6429151ef9649bba08ef2528ff2c423b2"}, {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"},
{file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef8fb25e52663a1c85d608f6dd72e19bd390e2ecaf29c17fb08f730226e3a08"}, {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"},
{file = "yarl-1.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcd7bb1e5c45274af9a1dd7494d3c52b2be5e6bd8d7e49c612705fd45420b12d"}, {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"},
{file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44ceac0450e648de86da8e42674f9b7077d763ea80c8ceb9d1c3e41f0f0a9951"}, {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"},
{file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:97209cc91189b48e7cfe777237c04af8e7cc51eb369004e061809bcdf4e55220"}, {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"},
{file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:48dd18adcf98ea9cd721a25313aef49d70d413a999d7d89df44f469edfb38a06"}, {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"},
{file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e59399dda559688461762800d7fb34d9e8a6a7444fd76ec33220a926c8be1516"}, {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"},
{file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d617c241c8c3ad5c4e78a08429fa49e4b04bedfc507b34b4d8dceb83b4af3588"}, {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"},
{file = "yarl-1.8.2-cp39-cp39-win32.whl", hash = "sha256:cb6d48d80a41f68de41212f3dfd1a9d9898d7841c8f7ce6696cf2fd9cb57ef83"}, {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"},
{file = "yarl-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:6604711362f2dbf7160df21c416f81fac0de6dbcf0b5445a2ef25478ecc4c778"}, {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"},
{file = "yarl-1.8.2.tar.gz", hash = "sha256:49d43402c6e3013ad0978602bf6bf5328535c48d192304b91b97a3c6790b1562"}, {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"},
] ]
[package.dependencies] [package.dependencies]
@ -1491,4 +1548,4 @@ multidict = ">=4.0"
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"
python-versions = ">=3.10,<4" python-versions = ">=3.10,<4"
content-hash = "9ca94b33d925f4cdba1a25f6febf51c85139983788a3af7106b51222b3fdf6e5" content-hash = "a73579b1ea2b00a08b8ce355213156911df93608c07fc7112944a1e29f1a31e1"

View file

@ -1,19 +1,19 @@
[tool.poetry] [tool.poetry]
name = "jarvis-tasks" name = "jarvis-tasks"
version = "0.9.1" version = "0.10.0"
description = "" description = ""
authors = ["Your Name <you@example.com>"] authors = ["Your Name <you@example.com>"]
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = ">=3.10,<4" python = ">=3.10,<4"
jarvis-core = {git = "https://git.zevaryx.com/stark-industries/jarvis/jarvis-core.git", rev = "main"} jarvis-core = {git = "https://git.zevaryx.com/stark-industries/jarvis/jarvis-core.git", rev = "main"}
naff = ">=2.1.0"
aiohttp = "^3.8.3" aiohttp = "^3.8.3"
tweepy = {extras = ["async"], version = "^4.13.0"} tweepy = {extras = ["async"], version = "^4.13.0"}
asyncpraw = "^7.5.0" asyncpraw = "^7.5.0"
#rook = "^0.1.170"
uvicorn = "^0.17.6" uvicorn = "^0.17.6"
prometheus-client = "^0.14.1" prometheus-client = "^0.14.1"
interactions-py = "^5.3.1"
pydantic = "^1.10.7"
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
pytest = "^7.1" pytest = "^7.1"