feat: Beanie migration
This commit is contained in:
parent
649782f4ef
commit
2208930b4e
14 changed files with 698 additions and 418 deletions
|
@ -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())
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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
453
poetry.lock
generated
|
@ -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"
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Add table
Reference in a new issue