diff --git a/.flake8 b/.flake8 index 3ce22df..54f1937 100644 --- a/.flake8 +++ b/.flake8 @@ -13,5 +13,6 @@ extend-ignore = # Plugins we don't currently include: flake8-return R502, # do not implicitly return None in function able to return non-None value. R503, # missing explicit return at the end of function ableto return non-None value. + R504, # unnecessary variable assignment, causes issues with Config R505, B023, # Temporary max-line-length=100 diff --git a/jarvis/__init__.py b/jarvis/__init__.py index 4938cf9..af2c56c 100644 --- a/jarvis/__init__.py +++ b/jarvis/__init__.py @@ -8,12 +8,12 @@ from interactions import Intents from jarvis_core.db import connect from jarvis_core.log import get_logger from redis import asyncio as aioredis -from statipy.db import init_db +from statipy.db import Stat, StaticStat from jarvis import const from jarvis.client import Jarvis from jarvis.cogs import __path__ as cogs_path -from jarvis.config import JarvisConfig +from jarvis.config import load_config from jarvis.utils import get_extensions __version__ = const.__version__ @@ -58,25 +58,25 @@ def jlogger(logger: logging.Logger, event: Any) -> None: async def run() -> None: """Run JARVIS""" # Configure logger - jconfig = JarvisConfig.from_yaml() + config = load_config() logger = get_logger("jarvis", show_locals=False) # jconfig.log_level == "DEBUG") - logger.setLevel(jconfig.log_level) + logger.setLevel(config.log_level) file_handler = logging.FileHandler(filename="jarvis.log", encoding="UTF-8", mode="w") file_handler.setFormatter(logging.Formatter("[%(asctime)s] [%(name)s] [%(levelname)8s] %(message)s")) logger.addHandler(file_handler) # Configure client intents = Intents.DEFAULT | Intents.MESSAGES | Intents.GUILD_MEMBERS | Intents.GUILD_MESSAGES - redis_config = jconfig.redis.copy() + redis_config = config.redis.dict() redis_host = redis_config.pop("host") redis = await aioredis.from_url(redis_host, decode_responses=True, **redis_config) - await init_db(**jconfig.mongo["connect"]) + await connect(**config.mongo.dict(), testing=config.environment.value == "develop", extra_models=[StaticStat, Stat]) jarvis = Jarvis( intents=intents, - sync_interactions=jconfig.sync, + sync_interactions=config.sync, delete_unused_application_cmds=True, send_command_tracebacks=False, redis=redis, @@ -84,16 +84,15 @@ async def run() -> None: ) # External modules - if jconfig.jurigged: + if config.jurigged: logging.addLevelName(11, "\033[35mJURIG\033[0m ") - if jconfig.log_level == "INFO": + if config.log_level == "INFO": logger.setLevel(11) jurigged.watch(pattern="jarvis/*.py", logger=partial(jlogger, logger)) # Initialize bot logger.info("Starting JARVIS") logger.debug("Connecting to database") - connect(**jconfig.mongo["connect"], testing=jconfig.mongo["database"] != "jarvis") logger.debug("Loading configuration from database") # jconfig.get_db_config() @@ -106,6 +105,5 @@ async def run() -> None: logger.debug("Loading statipy") jarvis.load_extension("statipy.ext") - jarvis.max_messages = jconfig.max_messages logger.debug("Running JARVIS") - await jarvis.astart(jconfig.token) + await jarvis.astart(config.token) diff --git a/jarvis/cogs/core/admin/autoreact.py b/jarvis/cogs/core/admin/autoreact.py index c7edcb6..7ce43c2 100644 --- a/jarvis/cogs/core/admin/autoreact.py +++ b/jarvis/cogs/core/admin/autoreact.py @@ -12,7 +12,6 @@ from interactions.models.internal.application_commands import ( slash_option, ) from interactions.models.internal.command import check -from jarvis_core.db import q from jarvis_core.db.models import Autoreact from jarvis.data.unicode import emoji_list @@ -41,7 +40,7 @@ class AutoReactCog(Extension): Returns: Tuple of success? and error message """ - exists = await Autoreact.find_one(q(guild=ctx.guild.id, channel=channel.id)) + exists = await Autoreact.find_one(Autoreact.guild == ctx.guild.id, Autoreact.channel == channel.id) if exists: return False, f"Autoreact already exists for {channel.mention}." @@ -51,7 +50,7 @@ class AutoReactCog(Extension): reactions=[], thread=thread, admin=ctx.author.id, - ).commit() + ).save() return True, None @@ -66,7 +65,7 @@ class AutoReactCog(Extension): Returns: Success? """ - ar = await Autoreact.find_one(q(guild=ctx.guild.id, channel=channel.id)) + ar = await Autoreact.find_one(Autoreact.guild == ctx.guild.id, Autoreact.channel == channel.id) if ar: await ar.delete() return True @@ -105,10 +104,10 @@ class AutoReactCog(Extension): if not find(lambda x: x.id == emoji_id, await ctx.guild.fetch_all_custom_emojis()): await ctx.send("Please use a custom emote from this server.", ephemeral=True) return - autoreact = await Autoreact.find_one(q(guild=ctx.guild.id, channel=channel.id)) + autoreact = await Autoreact.find_one(Autoreact.guild == ctx.guild.id, Autoreact.channel == channel.id) if not autoreact: await self.create_autoreact(ctx, channel, thread) - autoreact = await Autoreact.find_one(q(guild=ctx.guild.id, channel=channel.id)) + autoreact = await Autoreact.find_one(Autoreact.guild == ctx.guild.id, Autoreact.channel == channel.id) if emote and emote in autoreact.reactions: await ctx.send( f"Emote already added to {channel.mention} autoreactions.", @@ -124,7 +123,7 @@ class AutoReactCog(Extension): if emote: autoreact.reactions.append(emote) autoreact.thread = thread - await autoreact.commit() + await autoreact.save() message = "" if emote: message += f" Added {emote} to {channel.mention} autoreact." @@ -149,7 +148,7 @@ class AutoReactCog(Extension): ) @check(admin_or_permissions(Permissions.MANAGE_GUILD)) async def _autoreact_remove(self, ctx: InteractionContext, channel: GuildText, emote: str) -> None: - autoreact = await Autoreact.find_one(q(guild=ctx.guild.id, channel=channel.id)) + autoreact = await Autoreact.find_one(Autoreact.guild == ctx.guild.id, Autoreact.channel == channel.id) if not autoreact: await ctx.send( f"Please create autoreact first with /autoreact add {channel.mention} {emote}", @@ -167,7 +166,7 @@ class AutoReactCog(Extension): return else: autoreact.reactions.remove(emote) - await autoreact.commit() + await autoreact.save() if len(autoreact.reactions) == 0 and not autoreact.thread: await self.delete_autoreact(ctx, channel) await ctx.send(f"Removed {emote} from {channel.mention} autoreact.") @@ -201,7 +200,7 @@ class AutoReactCog(Extension): required=True, ) async def _autoreact_list(self, ctx: InteractionContext, channel: GuildText) -> None: - exists = await Autoreact.find_one(q(guild=ctx.guild.id, channel=channel.id)) + exists = await Autoreact.find_one(Autoreact.guild == ctx.guild.id, Autoreact.channel == channel.id) if not exists: await ctx.send( f"Please create autoreact first with /autoreact add {channel.mention} ", diff --git a/jarvis/cogs/core/admin/ban.py b/jarvis/cogs/core/admin/ban.py index 35d7bc6..84152c0 100644 --- a/jarvis/cogs/core/admin/ban.py +++ b/jarvis/cogs/core/admin/ban.py @@ -15,7 +15,6 @@ from interactions.models.internal.application_commands import ( slash_option, ) from interactions.models.internal.command import check -from jarvis_core.db import q from jarvis_core.db.models import Ban, Unban from jarvis.branding import get_command_color @@ -53,7 +52,7 @@ class BanCog(ModcaseCog): duration=duration, active=active, ) - await b.commit() + await b.save() embed = ban_embed( user=user, @@ -77,7 +76,7 @@ class BanCog(ModcaseCog): admin=ctx.author.id, reason=reason, ) - await u.commit() + await u.save() embed = unban_embed(user=user, admin=ctx.author, reason=reason) @@ -248,7 +247,9 @@ class BanCog(ModcaseCog): # We take advantage of the previous checks to save CPU cycles if not discord_ban_info: if isinstance(user, User): - database_ban_info = await Ban.find_one(q(guild=ctx.guild.id, user=user.id, active=True)) + database_ban_info = await Ban.find_one( + Ban.guild == ctx.guild.id, Ban.user == user.id, Ban.active is True + ) else: search = { "guild": ctx.guild.id, @@ -257,7 +258,8 @@ class BanCog(ModcaseCog): } if discrim: search["discrim"] = discrim - database_ban_info = await Ban.find_one(q(**search)) + + database_ban_info = await Ban.find_one(*[getattr(Ban, k) == v for k, v in search.items]) if not discord_ban_info and not database_ban_info: await ctx.send(f"Unable to find user {orig_user}", ephemeral=True) @@ -311,7 +313,7 @@ class BanCog(ModcaseCog): search["active"] = True if btype > 0: search["type"] = types[btype] - bans = await Ban.find(search).sort([("created_at", -1)]).to_list(None) + bans = await Ban.find(*[getattr(Ban, k) == v for k, v in search.items]).sort(-Ban.created_at).to_list() db_bans = [] fields = [] for ban in bans: diff --git a/jarvis/cogs/core/admin/filters.py b/jarvis/cogs/core/admin/filters.py index 9f6bdc5..894f069 100644 --- a/jarvis/cogs/core/admin/filters.py +++ b/jarvis/cogs/core/admin/filters.py @@ -18,7 +18,6 @@ from interactions.models.internal.application_commands import ( slash_option, ) from interactions.models.internal.command import check -from jarvis_core.db import q from jarvis_core.db.models import Filter from thefuzz import process @@ -36,7 +35,7 @@ class FilterCog(Extension): content = "" f: Filter = None if search: - if f := await Filter.find_one(q(name=name, guild=ctx.guild.id)): + if f := await Filter.find_one(Filter.name == name, Filter.guild == ctx.guild.id): content = "\n".join(f.filters) kw = "Updating" if search else "Creating" @@ -68,7 +67,7 @@ class FilterCog(Extension): else: f.name = new_name f.filters = filters - await f.commit() + await f.save() except Exception as e: await data.send(f"{e}", ephemeral=True) return @@ -114,7 +113,7 @@ class FilterCog(Extension): required=True, ) async def _filter_view(self, ctx: InteractionContext, name: str) -> None: - f = await Filter.find_one(q(name=name, guild=ctx.guild.id)) + f = await Filter.find_one(Filter.name == name, Filter.guild == ctx.guild.id) if not f: await ctx.send("That filter doesn't exist", ephemeral=True) return @@ -133,7 +132,7 @@ class FilterCog(Extension): ) @check(admin_or_permissions(Permissions.MANAGE_MESSAGES)) async def _filter_delete(self, ctx: InteractionContext, name: str) -> None: - f = await Filter.find_one(q(name=name, guild=ctx.guild.id)) + f = await Filter.find_one(Filter.name == name, Filter.guild == ctx.guild.id) if not f: await ctx.send("That filter doesn't exist", ephemeral=True) return @@ -151,7 +150,7 @@ class FilterCog(Extension): @_filter_delete.autocomplete("name") async def _autocomplete(self, ctx: AutocompleteContext, name: str) -> None: if not self.cache.get(ctx.guild.id): - filters = await Filter.find(q(guild=ctx.guild.id)).to_list(None) + filters = await Filter.find(Filter.guild == ctx.guild.id).to_list() self.cache[ctx.guild.id] = [f.name for f in filters] results = process.extract(name, self.cache.get(ctx.guild.id), limit=25) choices = [{"name": r[0], "value": r[0]} for r in results] diff --git a/jarvis/cogs/core/admin/kick.py b/jarvis/cogs/core/admin/kick.py index ba6ce5b..93185a8 100644 --- a/jarvis/cogs/core/admin/kick.py +++ b/jarvis/cogs/core/admin/kick.py @@ -55,5 +55,5 @@ class KickCog(ModcaseCog): admin=ctx.author.id, guild=ctx.guild.id, ) - await k.commit() + await k.save() await ctx.send(embeds=embed) diff --git a/jarvis/cogs/core/admin/lock.py b/jarvis/cogs/core/admin/lock.py index 02cd0bf..c89e226 100644 --- a/jarvis/cogs/core/admin/lock.py +++ b/jarvis/cogs/core/admin/lock.py @@ -12,7 +12,6 @@ from interactions.models.internal.application_commands import ( slash_option, ) from interactions.models.internal.command import check -from jarvis_core.db import q from jarvis_core.db.models import Lock, Permission from jarvis.utils.permissions import admin_or_permissions @@ -82,7 +81,7 @@ class LockCog(Extension): reason=reason, duration=duration, original_perms=current, - ).commit() + ).save() await ctx.send(f"{channel.mention} locked for {duration} minute(s)") @slash_command(name="unlock", description="Unlock a channel") @@ -100,7 +99,7 @@ class LockCog(Extension): ) -> None: if not channel: channel = ctx.channel - lock = await Lock.find_one(q(guild=ctx.guild.id, channel=channel.id, active=True)) + lock = await Lock.find_one(Lock.guild == ctx.guild.id, Lock.channel == channel.id, Lock.active is True) if not lock: await ctx.send(f"{channel.mention} not locked.", ephemeral=True) return @@ -114,5 +113,5 @@ class LockCog(Extension): await channel.delete_permission(target=overwrite, reason="Unlock") lock.active = False - await lock.commit() + await lock.save() await ctx.send(f"{channel.mention} unlocked") diff --git a/jarvis/cogs/core/admin/lockdown.py b/jarvis/cogs/core/admin/lockdown.py index 141def1..0de3690 100644 --- a/jarvis/cogs/core/admin/lockdown.py +++ b/jarvis/cogs/core/admin/lockdown.py @@ -13,7 +13,6 @@ from interactions.models.internal.application_commands import ( slash_option, ) from interactions.models.internal.command import check -from jarvis_core.db import q from jarvis_core.db.models import Lock, Lockdown, Permission from jarvis.utils.permissions import admin_or_permissions @@ -41,7 +40,7 @@ async def lock(bot: Client, target: GuildChannel, admin: Member, reason: str, du reason=reason, duration=duration, original_perms=current, - ).commit() + ).save() async def lock_all(bot: Client, guild: Guild, admin: Member, reason: str, duration: int) -> None: @@ -73,7 +72,7 @@ async def unlock_all(bot: Client, guild: Guild, admin: Member) -> None: target: Target channel admin: Admin who ended lockdown """ - locks = Lock.find(q(guild=guild.id, active=True)) + locks = Lock.find(Lock.guild == guild.id, Lock.active is True) async for lock in locks: target = await guild.fetch_channel(lock.channel) if target: @@ -85,11 +84,11 @@ async def unlock_all(bot: Client, guild: Guild, admin: Member) -> None: elif overwrite and not lock.original_perms: await target.delete_permission(target=overwrite, reason="Lockdown end") lock.active = False - await lock.commit() - lockdown = await Lockdown.find_one(q(guild=guild.id, active=True)) + await lock.save() + lockdown = await Lockdown.find_one(Lockdown.guild == guild.id, Lockdown.active is True) if lockdown: lockdown.active = False - await lockdown.commit() + await lockdown.save() class LockdownCog(Extension): @@ -130,7 +129,7 @@ class LockdownCog(Extension): await ctx.send("Duration must be <= 7 days", ephemeral=True) return - exists = await Lockdown.find_one(q(guild=ctx.guild.id, active=True)) + exists = await Lockdown.find_one(Lockdown.guild == ctx.guild.id, Lockdown.active is True) if exists: await ctx.send("Server already in lockdown", ephemeral=True) return @@ -146,7 +145,7 @@ class LockdownCog(Extension): guild=ctx.guild.id, reason=reason, original_perms=int(original_perms), - ).commit() + ).save() await ctx.send("Server now in lockdown.") @lockdown.subcommand(sub_cmd_name="end", sub_cmd_description="End a lockdown") @@ -157,7 +156,7 @@ class LockdownCog(Extension): ) -> None: await ctx.defer() - lockdown = await Lockdown.find_one(q(guild=ctx.guild.id, active=True)) + lockdown = await Lockdown.find_one(Lockdown.guild == ctx.guild.id, Lockdown.active is True) if not lockdown: await ctx.send("Server not in lockdown", ephemeral=True) return diff --git a/jarvis/cogs/core/admin/modcase.py b/jarvis/cogs/core/admin/modcase.py index 1b8e226..4b8eb75 100644 --- a/jarvis/cogs/core/admin/modcase.py +++ b/jarvis/cogs/core/admin/modcase.py @@ -11,7 +11,6 @@ from interactions.models.internal.application_commands import ( slash_option, ) from interactions.models.internal.command import check -from jarvis_core.db import q from jarvis_core.db.models import Modlog, Note, actions from rich.console import Console from rich.table import Table @@ -56,7 +55,8 @@ class CaseCog(Extension): action_output = "" action_output_extra = "" for idx, action in enumerate(mod_case.actions): - parent_action = await ACTIONS_LOOKUP[action.action_type].find_one(q(id=action.parent)) + atype = ACTIONS_LOOKUP[action.action_type] + parent_action = await atype.find_one(atype.id == action.parent) if not parent_action: action.orphaned = True action_table.add_row(action.action_type.title(), "[N/A]", "[N/A]") @@ -155,7 +155,8 @@ class CaseCog(Extension): for action in mod_case.actions: if action.orphaned: continue - parent_action = await ACTIONS_LOOKUP[action.action_type].find_one(q(id=action.parent)) + atype = ACTIONS_LOOKUP[action.action_type] + parent_action = await atype.find_one(atype.id == action.parent) if not parent_action: action.orphaned = True continue @@ -195,12 +196,13 @@ class CaseCog(Extension): ) @check(admin_or_permissions(Permissions.BAN_MEMBERS)) async def _cases_list(self, ctx: InteractionContext, user: Optional[Member] = None, closed: bool = False) -> None: - query = q(guild=ctx.guild.id) + query = [Modlog.guild == ctx.guild.id] if not closed: - query.update(q(open=True)) + query.append(Modlog.open is True) if user: - query.update(q(user=user.id)) - cases = await Modlog.find(query).sort("created_at", -1).to_list(None) + query.append(Modlog.user == user.id) + + cases = await Modlog.find(*query).sort(+Modlog.created_at).to_list() if len(cases) == 0: await ctx.send("No cases to view", ephemeral=True) @@ -217,7 +219,7 @@ class CaseCog(Extension): @slash_option(name="cid", description="Case ID", opt_type=OptionType.STRING, required=True) @check(admin_or_permissions(Permissions.BAN_MEMBERS)) async def _case_show_summary(self, ctx: InteractionContext, cid: str) -> None: - case = await Modlog.find_one(q(guild=ctx.guild.id, nanoid=cid)) + case = await Modlog.find_one(Modlog.guild == ctx.guild.id, Modlog.nanoid == cid) if not case: await ctx.send(f"Could not find case with ID {cid}", ephemeral=True) return @@ -229,7 +231,7 @@ class CaseCog(Extension): @slash_option(name="cid", description="Case ID", opt_type=OptionType.STRING, required=True) @check(admin_or_permissions(Permissions.BAN_MEMBERS)) async def _case_show_actions(self, ctx: InteractionContext, cid: str) -> None: - case = await Modlog.find_one(q(guild=ctx.guild.id, nanoid=cid)) + case = await Modlog.find_one(Modlog.guild == ctx.guild.id, Modlog.nanoid == cid) if not case: await ctx.send(f"Could not find case with ID {cid}", ephemeral=True) return @@ -242,13 +244,13 @@ class CaseCog(Extension): @slash_option(name="cid", description="Case ID", opt_type=OptionType.STRING, required=True) @check(admin_or_permissions(Permissions.BAN_MEMBERS)) async def _case_close(self, ctx: InteractionContext, cid: str) -> None: - case = await Modlog.find_one(q(guild=ctx.guild.id, nanoid=cid)) + case = await Modlog.find_one(Modlog.guild == ctx.guild.id, Modlog.nanoid == cid) if not case: await ctx.send(f"Could not find case with ID {cid}", ephemeral=True) return case.open = False - await case.commit() + await case.save() embed = await self.get_summary_embed(case, ctx.guild) await ctx.send(embeds=embed) @@ -257,13 +259,13 @@ class CaseCog(Extension): @slash_option(name="cid", description="Case ID", opt_type=OptionType.STRING, required=True) @check(admin_or_permissions(Permissions.BAN_MEMBERS)) async def _case_reopen(self, ctx: InteractionContext, cid: str) -> None: - case = await Modlog.find_one(q(guild=ctx.guild.id, nanoid=cid)) + case = await Modlog.find_one(Modlog.guild == ctx.guild.id, Modlog.nanoid == cid) if not case: await ctx.send(f"Could not find case with ID {cid}", ephemeral=True) return case.open = True - await case.commit() + await case.save() embed = await self.get_summary_embed(case, ctx.guild) await ctx.send(embeds=embed) @@ -273,7 +275,7 @@ class CaseCog(Extension): @slash_option(name="note", description="Note to add", opt_type=OptionType.STRING, required=True) @check(admin_or_permissions(Permissions.BAN_MEMBERS)) async def _case_note(self, ctx: InteractionContext, cid: str, note: str) -> None: - case = await Modlog.find_one(q(guild=ctx.guild.id, nanoid=cid)) + case = await Modlog.find_one(Modlog.guild == ctx.guild.id, Modlog.nanoid == cid) if not case: await ctx.send(f"Could not find case with ID {cid}", ephemeral=True) return @@ -289,7 +291,7 @@ class CaseCog(Extension): note = Note(admin=ctx.author.id, content=note) case.notes.append(note) - await case.commit() + await case.save() embed = await self.get_summary_embed(case, ctx.guild) await ctx.send(embeds=embed) @@ -299,7 +301,7 @@ class CaseCog(Extension): @slash_option(name="note", description="Note to add", opt_type=OptionType.STRING, required=True) @check(admin_or_permissions(Permissions.BAN_MEMBERS)) async def _case_new(self, ctx: InteractionContext, user: Member, note: str) -> None: - case = await Modlog.find_one(q(guild=ctx.guild.id, user=user.id, open=True)) + case = await Modlog.find_one(Modlog.guild == ctx.guild.id, Modlog.user == user.id, Modlog.open is True) if case: await ctx.send(f"Case already open with ID `{case.nanoid}`", ephemeral=True) return @@ -315,8 +317,7 @@ class CaseCog(Extension): note = Note(admin=ctx.author.id, content=note) case = Modlog(user=user.id, guild=ctx.guild.id, admin=ctx.author.id, notes=[note], actions=[]) - await case.commit() - await case.reload() + await case.save() embed = await self.get_summary_embed(case, ctx.guild) await ctx.send(embeds=embed) diff --git a/jarvis/cogs/core/admin/mute.py b/jarvis/cogs/core/admin/mute.py index 76d19f2..0e3850f 100644 --- a/jarvis/cogs/core/admin/mute.py +++ b/jarvis/cogs/core/admin/mute.py @@ -37,7 +37,7 @@ class MuteCog(ModcaseCog): guild=ctx.guild.id, duration=duration, active=True, - ).commit() + ).save() return mute_embed(user=user, admin=ctx.author, reason=reason, guild=ctx.guild) diff --git a/jarvis/cogs/core/admin/purge.py b/jarvis/cogs/core/admin/purge.py index c5ea83f..793152e 100644 --- a/jarvis/cogs/core/admin/purge.py +++ b/jarvis/cogs/core/admin/purge.py @@ -9,7 +9,6 @@ from interactions.models.internal.application_commands import ( slash_option, ) from interactions.models.internal.command import check -from jarvis_core.db import q from jarvis_core.db.models import Autopurge, Purge from jarvis.utils.permissions import admin_or_permissions @@ -45,7 +44,7 @@ class PurgeCog(Extension): guild=ctx.guild.id, admin=ctx.author.id, count=amount, - ).commit() + ).save() @slash_command(name="autopurge", sub_cmd_name="add", sub_cmd_description="Automatically purge messages") @slash_option( @@ -72,7 +71,7 @@ class PurgeCog(Extension): await ctx.send("Delay must be < 5 minutes", ephemeral=True) return - autopurge = await Autopurge.find_one(q(guild=ctx.guild.id, channel=channel.id)) + autopurge = await Autopurge.find_one(Autopurge.guild == ctx.guild.id, Autopurge.channel == channel.id) if autopurge: await ctx.send("Autopurge already exists.", ephemeral=True) return @@ -82,7 +81,7 @@ class PurgeCog(Extension): channel=channel.id, admin=ctx.author.id, delay=delay, - ).commit() + ).save() await ctx.send(f"Autopurge set up on {channel.mention}, delay is {delay} seconds") @@ -95,7 +94,7 @@ class PurgeCog(Extension): ) @check(admin_or_permissions(Permissions.MANAGE_MESSAGES)) async def _autopurge_remove(self, ctx: InteractionContext, channel: GuildText) -> None: - autopurge = await Autopurge.find_one(q(guild=ctx.guild.id, channel=channel.id)) + autopurge = await Autopurge.find_one(Autopurge.guild == ctx.guild.id, Autopurge.channel == channel.id) if not autopurge: await ctx.send("Autopurge does not exist.", ephemeral=True) return @@ -121,12 +120,12 @@ class PurgeCog(Extension): ) @check(admin_or_permissions(Permissions.MANAGE_MESSAGES)) async def _autopurge_update(self, ctx: InteractionContext, channel: GuildText, delay: int) -> None: - autopurge = await Autopurge.find_one(q(guild=ctx.guild.id, channel=channel.id)) + autopurge = await Autopurge.find_one(Autopurge.guild == ctx.guild.id, Autopurge.channel == channel.id) if not autopurge: await ctx.send("Autopurge does not exist.", ephemeral=True) return autopurge.delay = delay - await autopurge.commit() + await autopurge.save() await ctx.send(f"Autopurge delay updated to {delay} seconds on {channel.mention}.") diff --git a/jarvis/cogs/core/admin/roleping.py b/jarvis/cogs/core/admin/roleping.py index 2ddb2c6..f407e7a 100644 --- a/jarvis/cogs/core/admin/roleping.py +++ b/jarvis/cogs/core/admin/roleping.py @@ -13,8 +13,7 @@ from interactions.models.internal.application_commands import ( slash_option, ) from interactions.models.internal.command import check -from jarvis_core.db import q -from jarvis_core.db.models import Roleping +from jarvis_core.db.models import Bypass, Roleping from jarvis.utils import build_embed from jarvis.utils.permissions import admin_or_permissions @@ -36,7 +35,7 @@ class RolepingCog(Extension): @slash_option(name="role", description="Role to add", opt_type=OptionType.ROLE, required=True) @check(admin_or_permissions(Permissions.MANAGE_GUILD)) async def _roleping_add(self, ctx: InteractionContext, role: Role) -> None: - roleping = await Roleping.find_one(q(guild=ctx.guild.id, role=role.id)) + roleping = await Roleping.find_one(Roleping.guild == ctx.guild.id, Roleping.role == role.id) if roleping: await ctx.send(f"Role `{role.name}` already in roleping.", ephemeral=True) return @@ -50,15 +49,15 @@ class RolepingCog(Extension): guild=ctx.guild.id, admin=ctx.author.id, active=True, - bypass={"roles": [], "users": []}, - ).commit() + bypass=Bypass(), + ).save() await ctx.send(f"Role `{role.name}` added to roleping.") @roleping.subcommand(sub_cmd_name="remove", sub_cmd_description="Remove a role") @slash_option(name="role", description="Role to remove", opt_type=OptionType.ROLE, required=True) @check(admin_or_permissions(Permissions.MANAGE_GUILD)) async def _roleping_remove(self, ctx: InteractionContext, role: Role) -> None: - roleping = await Roleping.find_one(q(guild=ctx.guild.id, role=role.id)) + roleping = await Roleping.find_one(Roleping.guild == ctx.guild.id, Roleping.role == role.id) if not roleping: await ctx.send("Roleping does not exist", ephemeral=True) return @@ -71,8 +70,7 @@ class RolepingCog(Extension): @roleping.subcommand(sub_cmd_name="list", sub_cmd_description="Lick all blocklisted roles") async def _roleping_list(self, ctx: InteractionContext) -> None: - - rolepings = await Roleping.find(q(guild=ctx.guild.id)).to_list(None) + rolepings = await Roleping.find(Roleping.guild == ctx.guild.id).to_list() if not rolepings: await ctx.send("No rolepings configured", ephemeral=True) return @@ -83,10 +81,10 @@ class RolepingCog(Extension): if not role: await roleping.delete() continue - broles = find_all(lambda x: x.id in roleping.bypass["roles"], ctx.guild.roles) # noqa: B023 + broles = find_all(lambda x: x.id in roleping.bypass.roles, ctx.guild.roles) # noqa: B023 bypass_roles = [r.mention or "||`[redacted]`||" for r in broles] bypass_users = [ - (await ctx.guild.fetch_member(u)).mention or "||`[redacted]`||" for u in roleping.bypass["users"] + (await ctx.guild.fetch_member(u)).mention or "||`[redacted]`||" for u in roleping.bypass.users ] bypass_roles = bypass_roles or ["None"] bypass_users = bypass_users or ["None"] @@ -137,23 +135,23 @@ class RolepingCog(Extension): @slash_option(name="role", description="Rolepinged role", opt_type=OptionType.ROLE, required=True) @check(admin_or_permissions(Permissions.MANAGE_GUILD)) async def _roleping_bypass_user(self, ctx: InteractionContext, bypass: Member, role: Role) -> None: - roleping = await Roleping.find_one(q(guild=ctx.guild.id, role=role.id)) + roleping = await Roleping.find_one(Roleping.guild == ctx.guild.id, role=role.id) if not roleping: await ctx.send(f"Roleping not configured for {role.mention}", ephemeral=True) return - if bypass.id in roleping.bypass["users"]: + if bypass.id in roleping.bypass.users: await ctx.send(f"{bypass.mention} already in bypass", ephemeral=True) return - if len(roleping.bypass["users"]) == 10: + if len(roleping.bypass.users) == 10: await ctx.send( "Already have 10 users in bypass. Please consider using roles for roleping bypass", ephemeral=True, ) return - matching_role = list(filter(lambda x: x.id in roleping.bypass["roles"], bypass.roles)) + matching_role = list(filter(lambda x: x.id in roleping.bypass.roles, bypass.roles)) if matching_role: await ctx.send( @@ -162,8 +160,8 @@ class RolepingCog(Extension): ) return - roleping.bypass["users"].append(bypass.id) - await roleping.commit() + roleping.bypass.users.append(bypass.id) + await roleping.save() await ctx.send(f"{bypass.display_name} user bypass added for `{role.name}`") @bypass.subcommand( @@ -177,24 +175,24 @@ class RolepingCog(Extension): if bypass.id == ctx.guild.id: await ctx.send("Cannot add `@everyone` as a bypass", ephemeral=True) return - roleping = await Roleping.find_one(q(guild=ctx.guild.id, role=role.id)) + roleping = await Roleping.find_one(Roleping.guild == ctx.guild.id, Roleping.role == role.id) if not roleping: await ctx.send(f"Roleping not configured for {role.mention}", ephemeral=True) return - if bypass.id in roleping.bypass["roles"]: + if bypass.id in roleping.bypass.roles: await ctx.send(f"{bypass.mention} already in bypass", ephemeral=True) return - if len(roleping.bypass["roles"]) == 10: + if len(roleping.bypass.roles) == 10: await ctx.send( "Already have 10 roles in bypass. " "Please consider consolidating roles for roleping bypass", ephemeral=True, ) return - roleping.bypass["roles"].append(bypass.id) - await roleping.commit() + roleping.bypass.roles.append(bypass.id) + await roleping.save() await ctx.send(f"{bypass.name} role bypass added for `{role.name}`") restore = roleping.group(name="restore", description="Remove a roleping bypass") @@ -207,7 +205,7 @@ class RolepingCog(Extension): @slash_option(name="role", description="Rolepinged role", opt_type=OptionType.ROLE, required=True) @check(admin_or_permissions(Permissions.MANAGE_GUILD)) async def _roleping_restore_user(self, ctx: InteractionContext, bypass: Member, role: Role) -> None: - roleping: Roleping = await Roleping.find_one(q(guild=ctx.guild.id, role=role.id)) + roleping: Roleping = await Roleping.find_one(Roleping.guild == ctx.guild.id, Roleping.role == role.id) if not roleping: await ctx.send(f"Roleping not configured for {role.mention}", ephemeral=True) return @@ -217,7 +215,7 @@ class RolepingCog(Extension): return roleping.bypass.users.remove(bypass.id) - await roleping.commit() + await roleping.save() await ctx.send(f"{bypass.display_name} user bypass removed for `{role.name}`") @restore.subcommand( @@ -228,7 +226,7 @@ class RolepingCog(Extension): @slash_option(name="role", description="Rolepinged role", opt_type=OptionType.ROLE, required=True) @check(admin_or_permissions(Permissions.MANAGE_GUILD)) async def _roleping_restore_role(self, ctx: InteractionContext, bypass: Role, role: Role) -> None: - roleping: Roleping = await Roleping.find_one(q(guild=ctx.guild.id, role=role.id)) + roleping: Roleping = await Roleping.find_one(Roleping.guild == ctx.guild.id, Roleping.role == role.id) if not roleping: await ctx.send(f"Roleping not configured for {role.mention}", ephemeral=True) return @@ -238,5 +236,5 @@ class RolepingCog(Extension): return roleping.bypass.roles.remove(bypass.id) - await roleping.commit() + await roleping.save() await ctx.send(f"{bypass.display_name} user bypass removed for `{role.name}`") diff --git a/jarvis/cogs/core/admin/settings.py b/jarvis/cogs/core/admin/settings.py index a2268fb..bea5e78 100644 --- a/jarvis/cogs/core/admin/settings.py +++ b/jarvis/cogs/core/admin/settings.py @@ -15,7 +15,6 @@ from interactions.models.internal.application_commands import ( slash_option, ) from interactions.models.internal.command import check -from jarvis_core.db import q from jarvis_core.db.models import Setting from thefuzz import process @@ -32,17 +31,17 @@ class SettingsCog(Extension): async def update_settings(self, setting: str, value: Any, guild: int) -> bool: """Update a guild setting.""" - existing = await Setting.find_one(q(setting=setting, guild=guild)) + existing = await Setting.find_one(Setting.setting == setting, Setting.guild == guild) if not existing: existing = Setting(setting=setting, guild=guild, value=value) existing.value = value - updated = await existing.commit() + updated = await existing.save() return updated is not None async def delete_settings(self, setting: str, guild: int) -> bool: """Delete a guild setting.""" - existing = await Setting.find_one(q(setting=setting, guild=guild)) + existing = await Setting.find_one(Setting.setting == setting, Setting.guild == guild) if existing: return await existing.delete() return False @@ -152,7 +151,7 @@ class SettingsCog(Extension): if not isinstance(channel, GuildText): await ctx.send("Channel must be a GuildText", ephemeral=True) return - setting = await Setting.find_one(q(guild=ctx.guild.id, setting="log_ignore")) + setting: Setting = await Setting.find_one(Setting.guild == ctx.guild.id, Setting.setting == "log_ignore") if not setting: setting = Setting(guild=ctx.guild.id, setting="log_ignore", value=[]) if not setting.value: @@ -161,7 +160,7 @@ class SettingsCog(Extension): await ctx.send("Channel already ignored", ephemeral=True) return setting.value.append(channel.id) - await setting.commit(replace=True) + await setting.save() await ctx.send("Channel added to ActivityLog ignore list") # Unset @@ -231,17 +230,17 @@ class SettingsCog(Extension): @check(admin_or_permissions(Permissions.MANAGE_GUILD)) async def _remove_log_ignore(self, ctx: InteractionContext, channel: str) -> None: channel = int(channel) - setting = await Setting.find_one(q(guild=ctx.guild.id, setting="log_ignore")) + setting = await Setting.find_one(Setting.guild == ctx.guild.id, Setting.setting == "log_ignore") if not setting or channel not in setting.value: await ctx.send("Channel not being ignored", ephemeral=True) return setting.value.remove(channel) - await setting.commit(replace=True) + await setting.save() await ctx.send("Channel no longer being ignored") @_remove_log_ignore.autocomplete(option_name="channel") async def _channel_search(self, ctx: AutocompleteContext, channel: str) -> None: - setting = await Setting.find_one(q(guild=ctx.guild.id, setting="log_ignore")) + setting = await Setting.find_one(Setting.guild == ctx.guild.id, Setting.setting == "log_ignore") if not setting: return {} channels = [ctx.guild.get_channel(x) for x in setting.value] @@ -252,7 +251,7 @@ class SettingsCog(Extension): @settings.subcommand(sub_cmd_name="view", sub_cmd_description="View settings") @check(admin_or_permissions(Permissions.MANAGE_GUILD)) async def _view(self, ctx: InteractionContext) -> None: - settings = Setting.find(q(guild=ctx.guild.id)) + settings = Setting.find(Setting.guild == ctx.guild.id) fields = [] async for setting in settings: @@ -305,7 +304,7 @@ class SettingsCog(Extension): timeout=60 * 5, ) if context.ctx.custom_id == f"{ctx.guild.id}|set_clear|yes": - async for setting in Setting.find(q(guild=ctx.guild.id)): + async for setting in Setting.find(Setting.guild == ctx.guild.id): await setting.delete() content = "Guild settings cleared" else: diff --git a/jarvis/cogs/core/admin/temprole.py b/jarvis/cogs/core/admin/temprole.py index d70d935..60b27af 100644 --- a/jarvis/cogs/core/admin/temprole.py +++ b/jarvis/cogs/core/admin/temprole.py @@ -92,9 +92,7 @@ class TemproleCog(Extension): return await user.add_role(role, reason=reason) - await Temprole( - guild=ctx.guild.id, user=user.id, role=role.id, admin=ctx.author.id, expires_at=duration - ).commit() + await Temprole(guild=ctx.guild.id, user=user.id, role=role.id, admin=ctx.author.id, expires_at=duration).save() ts = int(duration.timestamp()) diff --git a/jarvis/cogs/core/admin/verify.py b/jarvis/cogs/core/admin/verify.py index 745e71b..2618c73 100644 --- a/jarvis/cogs/core/admin/verify.py +++ b/jarvis/cogs/core/admin/verify.py @@ -8,7 +8,6 @@ from interactions.models.discord.components import Button, ButtonStyle, spread_t from interactions.models.internal.application_commands import slash_command from interactions.models.internal.command import cooldown from interactions.models.internal.cooldowns import Buckets -from jarvis_core.db import q from jarvis_core.db.models import Setting @@ -40,7 +39,7 @@ class VerifyCog(Extension): @slash_command(name="verify", description="Verify that you've read the rules") @cooldown(bucket=Buckets.USER, rate=1, interval=30) async def _verify(self, ctx: InteractionContext) -> None: - role = await Setting.find_one(q(guild=ctx.guild.id, setting="verified")) + role = await Setting.find_one(Setting.guild == ctx.guild.id, Setting.setting == "verified") if not role: message = await ctx.send("This guild has not enabled verification", ephemeral=True) return @@ -73,13 +72,13 @@ class VerifyCog(Extension): for row in components: for component in row.components: component.disabled = True - setting = await Setting.find_one(q(guild=ctx.guild.id, setting="verified")) + setting = await Setting.find_one(Setting.guild == ctx.guild.id, Setting.setting == "verified") try: role = await ctx.guild.fetch_role(setting.value) await ctx.author.add_role(role, reason="Verification passed") except AttributeError: self.logger.warning("Verified role deleted before verification finished") - setting = await Setting.find_one(q(guild=ctx.guild.id, setting="unverified")) + setting = await Setting.find_one(Setting.guild == ctx.guild.id, Setting.setting == "unverified") if setting: try: role = await ctx.guild.fetch_role(setting.value) diff --git a/jarvis/cogs/core/admin/warning.py b/jarvis/cogs/core/admin/warning.py index 9c4782e..50d8912 100644 --- a/jarvis/cogs/core/admin/warning.py +++ b/jarvis/cogs/core/admin/warning.py @@ -12,7 +12,6 @@ from interactions.models.internal.application_commands import ( slash_option, ) from interactions.models.internal.command import check -from jarvis_core.db import q from jarvis_core.db.models import Warning from jarvis.embeds.admin import warning_embed @@ -62,7 +61,7 @@ class WarningCog(ModcaseCog): duration=duration, expires_at=expires_at, active=True, - ).commit() + ).save() embed = warning_embed(user, reason, ctx.author) await ctx.send(embeds=embed) @@ -78,13 +77,11 @@ class WarningCog(ModcaseCog): async def _warnings(self, ctx: InteractionContext, user: Member, active: bool = True) -> None: warnings = ( await Warning.find( - q( - user=user.id, - guild=ctx.guild.id, - ) + Warning.user == user.id, + Warning.guild == ctx.guild.id, ) - .sort("created_at", -1) - .to_list(None) + .sort(-Warning.created_at) + .to_list() ) if len(warnings) == 0: await ctx.send("That user has no warnings.", ephemeral=True) diff --git a/jarvis/cogs/core/remindme.py b/jarvis/cogs/core/remindme.py index ad0b84b..e52534d 100644 --- a/jarvis/cogs/core/remindme.py +++ b/jarvis/cogs/core/remindme.py @@ -18,7 +18,6 @@ from interactions.models.internal.application_commands import ( SlashCommand, slash_option, ) -from jarvis_core.db import q from jarvis_core.db.models import Reminder from thefuzz import process @@ -205,7 +204,7 @@ class RemindmeCog(Extension): @reminders.subcommand(sub_cmd_name="list", sub_cmd_description="List reminders") async def _list(self, ctx: InteractionContext) -> None: - reminders = await Reminder.find(q(user=ctx.author.id, active=True)).to_list(None) + reminders = await Reminder.find(Reminder.user == ctx.author.id, Reminder.active is True).to_list() if not reminders: await ctx.send("You have no reminders set.", ephemeral=True) return @@ -223,7 +222,7 @@ class RemindmeCog(Extension): autocomplete=True, ) async def _delete(self, ctx: InteractionContext, content: str) -> None: - reminder = await Reminder.find_one(q(_id=content)) + reminder = await Reminder.find_one(Reminder.id == content) if not reminder: await ctx.send(f"Reminder `{content}` does not exist", ephemeral=True) return @@ -263,7 +262,7 @@ class RemindmeCog(Extension): autocomplete=True, ) async def _fetch(self, ctx: InteractionContext, content: str) -> None: - reminder = await Reminder.find_one(q(_id=content)) + reminder = await Reminder.find_one(Reminder.id == content) if not reminder: await ctx.send(f"Reminder `{content}` does not exist", ephemeral=True) return @@ -294,7 +293,7 @@ class RemindmeCog(Extension): @_fetch.autocomplete("content") @_delete.autocomplete("content") async def _search_reminders(self, ctx: AutocompleteContext, content: str) -> None: - reminders = await Reminder.find(q(user=ctx.author.id)).to_list(None) + reminders = await Reminder.find(Reminder.user == ctx.author.id).to_list() lookup = {r.message: str(r.id) for r in reminders} results = process.extract(content, list(lookup.keys()), limit=5) choices = [{"name": r[0], "value": lookup[r[0]]} for r in results] diff --git a/jarvis/cogs/core/socials/reddit.py b/jarvis/cogs/core/socials/reddit.py index feb58c2..475a978 100644 --- a/jarvis/cogs/core/socials/reddit.py +++ b/jarvis/cogs/core/socials/reddit.py @@ -24,17 +24,10 @@ from interactions.models.internal.application_commands import ( slash_option, ) from interactions.models.internal.command import check -from jarvis_core.db import q -from jarvis_core.db.models import ( - Redditor, - RedditorFollow, - Subreddit, - SubredditFollow, - UserSetting, -) +from jarvis_core.db.models import Subreddit, SubredditFollow, UserSetting from jarvis import const -from jarvis.config import JarvisConfig +from jarvis.config import load_config from jarvis.utils import build_embed from jarvis.utils.permissions import admin_or_permissions @@ -50,9 +43,9 @@ class RedditCog(Extension): def __init__(self, bot: Client): self.bot = bot self.logger = logging.getLogger(__name__) - config = JarvisConfig.from_yaml() - config.reddit["user_agent"] = config.reddit.get("user_agent", DEFAULT_USER_AGENT) - self.api = Reddit(**config.reddit) + config = load_config() + config.reddit.user_agent = config.reddit.user_agent or DEFAULT_USER_AGENT + self.api = Reddit(**config.reddit.dict()) async def post_embeds(self, sub: Sub, post: Submission) -> Optional[List[Embed]]: """ @@ -139,117 +132,122 @@ class RedditCog(Extension): follow = reddit.group(name="follow", description="Add a follow") unfollow = reddit.group(name="unfollow", description="Remove a follow") - @follow.subcommand(sub_cmd_name="redditor", sub_cmd_description="Follow a Redditor") - @slash_option( - name="name", - description="Redditor name", - opt_type=OptionType.STRING, - required=True, - ) - @slash_option( - name="channel", - description="Channel to post to", - opt_type=OptionType.CHANNEL, - channel_types=[ChannelType.GUILD_TEXT], - required=True, - ) - @check(admin_or_permissions(Permissions.MANAGE_GUILD)) - async def _redditor_follow(self, ctx: InteractionContext, name: str, channel: GuildText) -> None: - if not user_name.match(name): - await ctx.send("Invalid Redditor name", ephemeral=True) - return + # Due to bugs and missing models, this section is commented out for the time being + # TODO: + # 1. Fix bugs + # 2. Migrate to beanie + # + # @follow.subcommand(sub_cmd_name="redditor", sub_cmd_description="Follow a Redditor") + # @slash_option( + # name="name", + # description="Redditor name", + # opt_type=OptionType.STRING, + # required=True, + # ) + # @slash_option( + # name="channel", + # description="Channel to post to", + # opt_type=OptionType.CHANNEL, + # channel_types=[ChannelType.GUILD_TEXT], + # required=True, + # ) + # @check(admin_or_permissions(Permissions.MANAGE_GUILD)) + # async def _redditor_follow(self, ctx: InteractionContext, name: str, channel: GuildText) -> None: + # if not user_name.match(name): + # await ctx.send("Invalid Redditor name", ephemeral=True) + # return - if not isinstance(channel, GuildText): - await ctx.send("Channel must be a text channel", ephemeral=True) - return + # if not isinstance(channel, GuildText): + # await ctx.send("Channel must be a text channel", ephemeral=True) + # return - try: - redditor = await self.api.redditor(name) - await redditor.load() - except (NotFound, Forbidden, Redirect) as e: - self.logger.debug(f"Redditor {name} raised {e.__class__.__name__} on add") - await ctx.send("Redditor may be deleted or nonexistent.", ephemeral=True) - return + # try: + # redditor = await self.api.redditor(name) + # await redditor.load() + # except (NotFound, Forbidden, Redirect) as e: + # self.logger.debug(f"Redditor {name} raised {e.__class__.__name__} on add") + # await ctx.send("Redditor may be deleted or nonexistent.", ephemeral=True) + # return - exists = await RedditorFollow.find_one(q(name=redditor.name, guild=ctx.guild.id)) - if exists: - await ctx.send("Redditor already being followed in this guild", ephemeral=True) - return + # exists = await RedditorFollow.find_one(q(name=redditor.name, guild=ctx.guild.id)) + # if exists: + # await ctx.send("Redditor already being followed in this guild", ephemeral=True) + # return - count = len([i async for i in SubredditFollow.find(q(guild=ctx.guild.id))]) - if count >= 12: - await ctx.send("Cannot follow more than 12 Redditors", ephemeral=True) - return + # count = len([i async for i in SubredditFollow.find(q(guild=ctx.guild.id))]) + # if count >= 12: + # await ctx.send("Cannot follow more than 12 Redditors", ephemeral=True) + # return - sr = await Redditor.find_one(q(name=redditor.name)) - if not sr: - sr = Redditor(name=redditor.name) - await sr.commit() + # sr = await Redditor.find_one(q(name=redditor.name)) + # if not sr: + # sr = Redditor(name=redditor.name) + # await sr.commit() - srf = RedditorFollow( - name=redditor.name, - channel=channel.id, - guild=ctx.guild.id, - admin=ctx.author.id, - ) - await srf.commit() + # srf = RedditorFollow( + # name=redditor.name, + # channel=channel.id, + # guild=ctx.guild.id, + # admin=ctx.author.id, + # ) + # await srf.commit() - await ctx.send(f"Now following `u/{name}` in {channel.mention}") + # await ctx.send(f"Now following `u/{name}` in {channel.mention}") - @unfollow.subcommand(sub_cmd_name="redditor", sub_cmd_description="Unfollow Redditor") - @check(admin_or_permissions(Permissions.MANAGE_GUILD)) - async def _redditor_unfollow(self, ctx: InteractionContext) -> None: - subs = RedditorFollow.find(q(guild=ctx.guild.id)) - redditors = [] - async for sub in subs: - redditors.append(sub) - if not redditors: - await ctx.send("You need to follow a redditor first", ephemeral=True) - return + # @unfollow.subcommand(sub_cmd_name="redditor", sub_cmd_description="Unfollow Redditor") + # @check(admin_or_permissions(Permissions.MANAGE_GUILD)) + # async def _redditor_unfollow(self, ctx: InteractionContext) -> None: + # subs = RedditorFollow.find(q(guild=ctx.guild.id)) + # redditors = [] + # async for sub in subs: + # redditors.append(sub) + # if not redditors: + # await ctx.send("You need to follow a redditor first", ephemeral=True) + # return - options = [] - names = [] - for idx, redditor in enumerate(redditors): - sub = await Redditor.find_one(q(name=redditor.name)) - names.append(sub.name) - option = StringSelectOption(label=sub.name, value=str(idx)) - options.append(option) + # options = [] + # names = [] + # for idx, redditor in enumerate(redditors): + # sub = await Redditor.find_one(q(name=redditor.name)) + # names.append(sub.name) + # option = StringSelectOption(label=sub.name, value=str(idx)) + # options.append(option) - select = StringSelectMenu(options=options, custom_id="to_delete", min_values=1, max_values=len(redditors)) + # select = StringSelectMenu(options=options, custom_id="to_delete", min_values=1, max_values=len(redditors)) - components = [ActionRow(select)] - block = "\n".join(x for x in names) - message = await ctx.send( - content=f"You are following the following redditors:\n```\n{block}\n```\n\n" - "Please choose redditors to unfollow", - components=components, - ) + # components = [ActionRow(select)] + # block = "\n".join(x for x in names) + # message = await ctx.send( + # content=f"You are following the following redditors:\n```\n{block}\n```\n\n" + # "Please choose redditors to unfollow", + # components=components, + # ) - try: - context = await self.bot.wait_for_component( - check=lambda x: ctx.author.id == x.ctx.author.id, - messages=message, - timeout=60 * 5, - ) - for to_delete in context.ctx.values: - follow = get(redditors, guild=ctx.guild.id, name=names[int(to_delete)]) - try: - await follow.delete() - except Exception: - self.logger.debug("Ignoring deletion error") - for row in components: - for component in row.components: - component.disabled = True + # try: + # context = await self.bot.wait_for_component( + # check=lambda x: ctx.author.id == x.ctx.author.id, + # messages=message, + # timeout=60 * 5, + # ) + # for to_delete in context.ctx.values: + # follow = get(redditors, guild=ctx.guild.id, name=names[int(to_delete)]) + # try: + # await follow.delete() + # except Exception: + # self.logger.debug("Ignoring deletion error") + # for row in components: + # for component in row.components: + # component.disabled = True - block = "\n".join(names[int(x)] for x in context.ctx.values) - await context.ctx.edit_origin( - content=f"Unfollowed the following:\n```\n{block}\n```", components=components - ) - except asyncio.TimeoutError: - for row in components: - for component in row.components: - component.disabled = True - await message.edit(components=components) + # block = "\n".join(names[int(x)] for x in context.ctx.values) + # await context.ctx.edit_origin( + # content=f"Unfollowed the following:\n```\n{block}\n```", components=components + # ) + # except asyncio.TimeoutError: + # for row in components: + # for component in row.components: + # component.disabled = True + # await message.edit(components=components) @follow.subcommand(sub_cmd_name="subreddit", sub_cmd_description="Follow a Subreddit") @slash_option( @@ -283,12 +281,14 @@ class RedditCog(Extension): await ctx.send("Subreddit may be private, quarantined, or nonexistent.", ephemeral=True) return - exists = await SubredditFollow.find_one(q(display_name=subreddit.display_name, guild=ctx.guild.id)) + exists = await SubredditFollow.find_one( + SubredditFollow.display_name == subreddit.display_name, SubredditFollow.guild == ctx.guild.id + ) if exists: await ctx.send("Subreddit already being followed in this guild", ephemeral=True) return - count = len([i async for i in SubredditFollow.find(q(guild=ctx.guild.id))]) + count = await SubredditFollow.find(SubredditFollow.guild == ctx.guild.id).count() if count >= 12: await ctx.send("Cannot follow more than 12 Subreddits", ephemeral=True) return @@ -300,10 +300,10 @@ class RedditCog(Extension): ) return - sr = await Subreddit.find_one(q(display_name=subreddit.display_name)) + sr = await Subreddit.find_one(Subreddit.display_name == subreddit.display_name) if not sr: sr = Subreddit(display_name=subreddit.display_name, over18=subreddit.over18) - await sr.commit() + await sr.save() srf = SubredditFollow( display_name=subreddit.display_name, @@ -311,17 +311,14 @@ class RedditCog(Extension): guild=ctx.guild.id, admin=ctx.author.id, ) - await srf.commit() + await srf.save() await ctx.send(f"Now following `r/{name}` in {channel.mention}") @unfollow.subcommand(sub_cmd_name="subreddit", sub_cmd_description="Unfollow Subreddits") @check(admin_or_permissions(Permissions.MANAGE_GUILD)) async def _subreddit_unfollow(self, ctx: InteractionContext) -> None: - subs = SubredditFollow.find(q(guild=ctx.guild.id)) - subreddits = [] - async for sub in subs: - subreddits.append(sub) + subreddits = await SubredditFollow.find(SubredditFollow.guild == ctx.guild.id).to_list() if not subreddits: await ctx.send("You need to follow a Subreddit first", ephemeral=True) return @@ -329,7 +326,7 @@ class RedditCog(Extension): options = [] names = [] for idx, subreddit in enumerate(subreddits): - sub = await Subreddit.find_one(q(display_name=subreddit.display_name)) + sub = await Subreddit.find_one(Subreddit.display_name == subreddit.display_name) names.append(sub.display_name) option = StringSelectOption(label=sub.display_name, value=str(idx)) options.append(option) @@ -393,7 +390,9 @@ class RedditCog(Extension): embeds = await self.post_embeds(subreddit, post) if post.over_18 and not ctx.channel.nsfw: - setting = await UserSetting.find_one(q(user=ctx.author.id, type="reddit", setting="dm_nsfw")) + setting = await UserSetting.find_one( + UserSetting.user == ctx.author.id, UserSetting.type == "reddit", UserSetting.setting == "dm_nsfw" + ) if setting and setting.value: try: await ctx.author.send(embeds=embeds) @@ -440,7 +439,9 @@ class RedditCog(Extension): embeds = await self.post_embeds(subreddit, post) if post.over_18 and not ctx.channel.nsfw: - setting = await UserSetting.find_one(q(user=ctx.author.id, type="reddit", setting="dm_nsfw")) + setting = await UserSetting.find_one( + UserSetting.user == ctx.author.id, UserSetting.type == "reddit", UserSetting.setting == "dm_nsfw" + ) if setting and setting.value: try: await ctx.author.send(embeds=embeds) @@ -473,7 +474,9 @@ class RedditCog(Extension): embeds = await self.post_embeds(subreddit, post) if post.over_18 and not ctx.channel.nsfw: - setting = await UserSetting.find_one(q(user=ctx.author.id, type="reddit", setting="dm_nsfw")) + setting = await UserSetting.find_one( + UserSetting.user == ctx.author.id, UserSetting.type == "reddit", UserSetting.setting == "dm_nsfw" + ) if setting and setting.value: try: await ctx.author.send(embeds=embeds) @@ -506,7 +509,9 @@ class RedditCog(Extension): embeds = await self.post_embeds(subreddit, post) if post.over_18 and not ctx.channel.nsfw: - setting = await UserSetting.find_one(q(user=ctx.author.id, type="reddit", setting="dm_nsfw")) + setting = await UserSetting.find_one( + UserSetting.user == ctx.author.id, UserSetting.type == "reddit", UserSetting.setting == "dm_nsfw" + ) if setting and setting.value: try: await ctx.author.send(embeds=embeds) @@ -530,7 +535,9 @@ class RedditCog(Extension): embeds = await self.post_embeds(post.subreddit, post) if post.over_18 and not ctx.channel.nsfw: - setting = await UserSetting.find_one(q(user=ctx.author.id, type="reddit", setting="dm_nsfw")) + setting = await UserSetting.find_one( + UserSetting.user == ctx.author.id, UserSetting.type == "reddit", UserSetting.setting == "dm_nsfw" + ) if setting and setting.value: try: await ctx.author.send(embeds=embeds) @@ -543,15 +550,19 @@ class RedditCog(Extension): @reddit.subcommand(sub_cmd_name="dm_nsfw", sub_cmd_description="DM NSFW posts if channel isn't NSFW") @slash_option(name="dm", description="Send DM?", opt_type=OptionType.BOOLEAN, required=True) async def _reddit_dm(self, ctx: InteractionContext, dm: bool) -> None: - setting = await UserSetting.find_one(q(user=ctx.author.id, type="reddit", setting="dm_nsfw")) + setting = await UserSetting.find_one( + UserSetting.user == ctx.author.id, UserSetting.type == "reddit", UserSetting.setting == "dm_nsfw" + ) if not setting: setting = UserSetting(user=ctx.author.id, type="reddit", setting="dm_nsfw", value=dm) setting.value = dm - await setting.commit() + await setting.save() await ctx.send(f"Reddit DM NSFW setting is now set to {dm}", ephemeral=True) def setup(bot: Client) -> None: """Add RedditCog to JARVIS""" - if JarvisConfig.from_yaml().reddit: + if load_config().reddit: RedditCog(bot) + else: + bot.logger.info("Missing Reddit configuration, not loading") diff --git a/jarvis/cogs/core/socials/twitter.py b/jarvis/cogs/core/socials/twitter.py index 42e3d9a..c5d0cf0 100644 --- a/jarvis/cogs/core/socials/twitter.py +++ b/jarvis/cogs/core/socials/twitter.py @@ -17,10 +17,9 @@ from interactions.models.internal.application_commands import ( slash_option, ) from interactions.models.internal.command import check -from jarvis_core.db import q from jarvis_core.db.models import TwitterAccount, TwitterFollow -from jarvis.config import JarvisConfig +from jarvis.config import load_config from jarvis.utils.permissions import admin_or_permissions @@ -30,8 +29,8 @@ class TwitterCog(Extension): def __init__(self, bot: Client): self.bot = bot self.logger = logging.getLogger(__name__) - config = JarvisConfig.from_yaml() - auth = tweepy.AppAuthHandler(config.twitter["consumer_key"], config.twitter["consumer_secret"]) + config = load_config() + auth = tweepy.AppAuthHandler(config.twitter.consumer_key, config.twitter.consumer_secret) self.api = tweepy.API(auth) self._guild_cache = {} self._channel_cache = {} @@ -78,24 +77,26 @@ class TwitterCog(Extension): await ctx.send("Unable to get user timeline. Are you sure the handle is correct?", ephemeral=True) return - exists = await TwitterFollow.find_one(q(twitter_id=account.id, guild=ctx.guild.id)) + exists = await TwitterFollow.find_one( + TwitterFollow.twitter_id == account.id, TwitterFollow.guild == ctx.guild.id + ) if exists: await ctx.send("Twitter account already being followed in this guild", ephemeral=True) return - count = len([i async for i in TwitterFollow.find(q(guild=ctx.guild.id))]) + count = await TwitterFollow.find(TwitterFollow.guild == ctx.guild.id).count() if count >= 12: await ctx.send("Cannot follow more than 12 Twitter accounts", ephemeral=True) return - ta = await TwitterAccount.find_one(q(twitter_id=account.id)) + ta = await TwitterAccount.find_one(TwitterAccount.twitter_id == account.id) if not ta: ta = TwitterAccount( handle=account.screen_name, twitter_id=account.id, last_tweet=latest_tweet.id, ) - await ta.commit() + await ta.save() tf = TwitterFollow( twitter_id=account.id, @@ -105,14 +106,14 @@ class TwitterCog(Extension): retweets=retweets, ) - await tf.commit() + await tf.save() await ctx.send(f"Now following `@{handle}` in {channel.mention}") @twitter.subcommand(sub_cmd_name="unfollow", sub_cmd_description="Unfollow Twitter accounts") @check(admin_or_permissions(Permissions.MANAGE_GUILD)) async def _twitter_unfollow(self, ctx: InteractionContext) -> None: - t = TwitterFollow.find(q(guild=ctx.guild.id)) + t = TwitterFollow.find(TwitterFollow.guild == ctx.guild.id) twitters = [] async for twitter in t: twitters.append(twitter) @@ -123,7 +124,7 @@ class TwitterCog(Extension): options = [] handlemap = {} for twitter in twitters: - account = await TwitterAccount.find_one(q(twitter_id=twitter.twitter_id)) + account = await TwitterAccount.find_one(TwitterAccount.twitter_id == twitter.twitter_id) handlemap[str(twitter.twitter_id)] = account.handle option = StringSelectOption(label=account.handle, value=str(twitter.twitter_id)) options.append(option) @@ -176,7 +177,7 @@ class TwitterCog(Extension): ) @check(admin_or_permissions(Permissions.MANAGE_GUILD)) async def _twitter_modify(self, ctx: InteractionContext, retweets: bool = True) -> None: - t = TwitterFollow.find(q(guild=ctx.guild.id)) + t = TwitterFollow.find(TwitterFollow.guild == ctx.guild.id) twitters = [] async for twitter in t: twitters.append(twitter) @@ -187,7 +188,7 @@ class TwitterCog(Extension): options = [] handlemap = {} for twitter in twitters: - account = await TwitterAccount.find_one(q(twitter_id=twitter.id)) + account = await TwitterAccount.find_one(TwitterAccount.twitter_id == twitter.id) handlemap[str(twitter.twitter_id)] = account.handle option = StringSelectOption(label=account.handle, value=str(twitter.twitter_id)) options.append(option) @@ -211,11 +212,11 @@ class TwitterCog(Extension): handlemap = {} for to_update in context.ctx.values: - account = await TwitterAccount.find_one(q(twitter_id=int(to_update))) + account = await TwitterAccount.find_one(TwitterAccount.twitter_id == int(to_update)) handlemap[str(twitter.twitter_id)] = account.handle t = get(twitters, guild=ctx.guild.id, twitter_id=int(to_update)) - t.update(q(retweets=True)) - await t.commit() + t.retweets = True + await t.save() for row in components: for component in row.components: @@ -239,5 +240,7 @@ class TwitterCog(Extension): def setup(bot: Client) -> None: """Add TwitterCog to JARVIS""" - if JarvisConfig.from_yaml().twitter: + if load_config().twitter: TwitterCog(bot) + else: + bot.logger.info("No Twitter configuration, not loading") diff --git a/jarvis/cogs/extra/pinboard.py b/jarvis/cogs/extra/pinboard.py index e8e5a43..7f679e9 100644 --- a/jarvis/cogs/extra/pinboard.py +++ b/jarvis/cogs/extra/pinboard.py @@ -21,8 +21,7 @@ from interactions.models.internal.application_commands import ( slash_option, ) from interactions.models.internal.command import check -from jarvis_core.db import q -from jarvis_core.db.models import Star, Starboard +from jarvis_core.db.models import Pin, Pinboard from jarvis.utils import build_embed from jarvis.utils.permissions import admin_or_permissions @@ -43,16 +42,16 @@ class PinboardCog(Extension): self.bot = bot self.logger = logging.getLogger(__name__) - async def _purge_starboard(self, ctx: InteractionContext, board: Starboard) -> None: + async def _purge_starboard(self, ctx: InteractionContext, board: Pinboard) -> None: channel = await ctx.guild.fetch_channel(board.channel) - async for star in Star.find(q(starboard=channel.id, guild=ctx.guild.id)): - if message := await channel.fetch_message(star.message): + async for pin in Pin.find(Pin.pinboard == channel.id, Pin.guild == ctx.guild.id): + if message := await channel.fetch_message(pin.message): try: await message.delete() await asyncio.sleep(1) # Avoid rate limits except (errors.Forbidden, errors.NotFound): - self.logger.debug(f"Failed to delete star {star.id}'s message.") - await star.delete() + self.logger.debug(f"Failed to delete star {pin.id}'s message.") + await pin.delete() pinboard = SlashCommand(name="pinboard", description="Extra pins! Manage pinboards") @@ -60,12 +59,12 @@ class PinboardCog(Extension): sub_cmd_name="list", sub_cmd_description="List all pinboards", ) - @check(admin_or_permissions(Permissions.MANAGE_GUILD)) + @check(admin_or_permissions(Permissions.MANAGE_GUILD, Permissions.MANAGE_MESSAGES)) async def _list(self, ctx: InteractionContext) -> None: - starboards = await Starboard.find(q(guild=ctx.guild.id)).to_list(None) - if starboards != []: + pinboards = await Pinboard.find(Pinboard.guild == ctx.guild.id).to_list() + if pinboards != []: message = "Available Pinboards:\n" - for s in starboards: + for s in pinboards: message += f"<#{s.channel}>\n" await ctx.send(message) else: @@ -78,7 +77,7 @@ class PinboardCog(Extension): opt_type=OptionType.CHANNEL, required=True, ) - @check(admin_or_permissions(Permissions.MANAGE_GUILD)) + @check(admin_or_permissions(Permissions.MANAGE_GUILD, Permissions.MANAGE_MESSAGES)) async def _create(self, ctx: InteractionContext, channel: GuildText) -> None: if channel not in ctx.guild.channels: await ctx.send( @@ -90,21 +89,21 @@ class PinboardCog(Extension): await ctx.send("Channel must be a GuildText", ephemeral=True) return - exists = await Starboard.find_one(q(channel=channel.id, guild=ctx.guild.id)) + exists = await Pinboard.find_one(Pinboard.channel == channel.id, Pinboard.guild == ctx.guild.id) if exists: await ctx.send(f"Pinboard already exists at {channel.mention}.", ephemeral=True) return - count = await Starboard.count_documents(q(guild=ctx.guild.id)) + count = await Pinboard.find(Pinboard.guild == ctx.guild.id).count() if count >= 25: await ctx.send("25 pinboard limit reached", ephemeral=True) return - await Starboard( + await Pinboard( guild=ctx.guild.id, channel=channel.id, admin=ctx.author.id, - ).commit() + ).save() await ctx.send(f"Pinboard created. Check it out at {channel.mention}.") @pinboard.subcommand(sub_cmd_name="delete", sub_cmd_description="Delete a pinboard") @@ -114,9 +113,9 @@ class PinboardCog(Extension): opt_type=OptionType.CHANNEL, required=True, ) - @check(admin_or_permissions(Permissions.MANAGE_GUILD)) + @check(admin_or_permissions(Permissions.MANAGE_GUILD, Permissions.MANAGE_MESSAGES)) async def _delete(self, ctx: InteractionContext, channel: GuildText) -> None: - found = await Starboard.find_one(q(channel=channel.id, guild=ctx.guild.id)) + found = await Pinboard.find_one(Pinboard.channel == channel.id, Pinboard.guild == ctx.guild.id) if found: await found.delete() asyncio.create_task(self._purge_starboard(ctx, found)) @@ -132,8 +131,8 @@ class PinboardCog(Extension): ) -> None: if not channel: channel = ctx.channel - starboards = await Starboard.find(q(guild=ctx.guild.id)).to_list(None) - if not starboards: + pinboards = await Pinboard.find(Pinboard.guild == ctx.guild.id).to_list() + if not pinboards: await ctx.send("No pinboards exist.", ephemeral=True) return @@ -149,18 +148,19 @@ class PinboardCog(Extension): return channel_list = [] - to_delete = [] - for starboard in starboards: - c = await ctx.guild.fetch_channel(starboard.channel) + to_delete: list[Pinboard] = [] + + for pinboard in pinboards: + c = await ctx.guild.fetch_channel(pinboard.channel) if c and isinstance(c, GuildText): channel_list.append(c) else: - self.logger.warning(f"Pinboard {starboard.channel} no longer valid in {ctx.guild.name}") - to_delete.append(starboard) + self.logger.warning(f"Pinboard {pinboard.channel} no longer valid in {ctx.guild.name}") + to_delete.append(pinboard) - for starboard in to_delete: + for pinboard in to_delete: try: - await starboard.delete() + await pinboard.delete() except Exception: self.logger.debug("Ignoring deletion error") @@ -187,25 +187,23 @@ class PinboardCog(Extension): check=lambda x: ctx.author.id == x.context.author.id, ) - starboard = channel_list[int(com_ctx.context.values[0])] + pinboard = channel_list[int(com_ctx.context.values[0])] - exists = await Star.find_one( - q( - message=message.id, - channel=channel.id, - guild=ctx.guild.id, - starboard=starboard.id, - ) + exists = await Pin.find_one( + Pin.message == message.id, + Pin.channel == channel.id, + Pin.guild == ctx.guild.id, + Pin.pinboard == pinboard.id, ) if exists: await ctx.send( - f"Message already sent to Pinboard {starboard.mention}", + f"Message already sent to Pinboard {pinboard.mention}", ephemeral=True, ) return - count = await Star.count_documents(q(guild=ctx.guild.id, starboard=starboard.id)) + count = await Pin.find(Pin.guild == ctx.guild.id, Pin.pinboard == pinboard.id).count() content = message.content attachments = message.attachments @@ -234,28 +232,28 @@ class PinboardCog(Extension): if image_url: embed.set_image(url=image_url) star_components = Button(style=ButtonStyle.DANGER, emoji="🗑️", custom_id=f"delete|{ctx.author.id}") - star = await starboard.send(embeds=embed, components=star_components) + pin = await pinboard.send(embeds=embed, components=star_components) - await Star( + await Pin( index=count, message=message.id, channel=channel.id, guild=ctx.guild.id, - starboard=starboard.id, + pinboard=pinboard.id, admin=ctx.author.id, - star=star.id, + pin=pin.id, active=True, - ).commit() + ).save() components[0].components[0].disabled = True await com_ctx.context.edit_origin( - content=f"Message saved to Pinboard.\nSee it in {starboard.mention}", + content=f"Message saved to Pinboard.\nSee it in {pinboard.mention}", components=components, ) @context_menu(name="Pin Message", context_type=CommandType.MESSAGE) - @check(admin_or_permissions(Permissions.MANAGE_GUILD)) + @check(admin_or_permissions(Permissions.MANAGE_GUILD, Permissions.MANAGE_MESSAGES)) async def _star_message(self, ctx: InteractionContext) -> None: await self._star_add(ctx, message=str(ctx.target_id)) diff --git a/jarvis/cogs/extra/rolegiver.py b/jarvis/cogs/extra/rolegiver.py index 342eddd..db10b2d 100644 --- a/jarvis/cogs/extra/rolegiver.py +++ b/jarvis/cogs/extra/rolegiver.py @@ -28,7 +28,6 @@ from interactions.models.internal.application_commands import ( ) from interactions.models.internal.command import check, cooldown from interactions.models.internal.cooldowns import Buckets -from jarvis_core.db import q from jarvis_core.db.models import Rolegiver from thefuzz import process @@ -47,8 +46,7 @@ class RolegiverCog(Extension): @listen() async def on_ready(self) -> None: """NAFF on_ready hook for loading cache.""" - all_rolegivers = await Rolegiver.find({}).to_list(None) - for rolegiver in all_rolegivers: + async for rolegiver in Rolegiver.find(): guild = await self.bot.fetch_guild(rolegiver.guild) if not guild: await rolegiver.delete() @@ -64,7 +62,7 @@ class RolegiverCog(Extension): self.cache[guild.id] = {} self.cache[guild.id][role.name] = role.id rolegiver.roles = roles - await rolegiver.commit() + await rolegiver.save() rolegiver = SlashCommand(name="rolegiver", description="Allow users to choose their own roles") @@ -86,7 +84,7 @@ class RolegiverCog(Extension): ) return - setting = await Rolegiver.find_one(q(guild=ctx.guild.id)) + setting = await Rolegiver.find_one(Rolegiver.guild == ctx.guild.id) if setting and setting.roles and role.id in setting.roles: await ctx.send("Role already in rolegiver", ephemeral=True) return @@ -97,7 +95,7 @@ class RolegiverCog(Extension): setting.roles = setting.roles or [] setting.roles.append(role.id) - await setting.commit() + await setting.save() roles = [] for role_id in setting.roles: @@ -142,7 +140,7 @@ class RolegiverCog(Extension): ) @check(admin_or_permissions(Permissions.MANAGE_GUILD)) async def _rolegiver_remove(self, ctx: InteractionContext, role: str) -> None: - setting = await Rolegiver.find_one(q(guild=ctx.guild.id)) + setting = await Rolegiver.find_one(Rolegiver.guild == ctx.guild.id) if not setting or (setting and not setting.roles): await ctx.send("Rolegiver has no roles", ephemeral=True) return @@ -155,7 +153,7 @@ class RolegiverCog(Extension): return setting.value.remove(role_id) - await setting.commit() + await setting.save() role = await ctx.guild.fetch_role(role_id) if not role: await ctx.send("Role not found in guild", ephemeral=True) @@ -169,7 +167,7 @@ class RolegiverCog(Extension): to_remove.append(id_) setting.value = [x for x in setting.value if x not in to_remove] - await setting.commit() + await setting.save() fields = [ EmbedField(name="Removed Role", value=role.mention), @@ -191,7 +189,7 @@ class RolegiverCog(Extension): @rolegiver.subcommand(sub_cmd_name="list", sub_cmd_description="List rolegiver roles") async def _rolegiver_list(self, ctx: InteractionContext) -> None: - setting = await Rolegiver.find_one(q(guild=ctx.guild.id)) + setting = await Rolegiver.find_one(Rolegiver.guild == ctx.guild.id) if not setting or (setting and not setting.roles): await ctx.send("Rolegiver has no roles", ephemeral=True) return @@ -223,7 +221,7 @@ class RolegiverCog(Extension): @rolegiver.subcommand(sub_cmd_name="get", sub_cmd_description="Get a role") @cooldown(bucket=Buckets.USER, rate=1, interval=10) async def _role_get(self, ctx: InteractionContext) -> None: - setting = await Rolegiver.find_one(q(guild=ctx.guild.id)) + setting = await Rolegiver.find_one(Rolegiver.quild == ctx.guild.id) if not setting or (setting and not setting.roles): await ctx.send("Rolegiver has no roles", ephemeral=True) return @@ -299,7 +297,7 @@ class RolegiverCog(Extension): async def _role_remove(self, ctx: InteractionContext) -> None: user_roles = ctx.author.roles - setting = await Rolegiver.find_one(q(guild=ctx.guild.id)) + setting = await Rolegiver.find_one(Rolegiver.guild == ctx.guild.id) if not setting or (setting and not setting.roles): await ctx.send("Rolegiver has no roles", ephemeral=True) return @@ -374,14 +372,14 @@ class RolegiverCog(Extension): @rolegiver.subcommand(sub_cmd_name="cleanup", sub_cmd_description="Removed deleted roles from rolegiver") @check(admin_or_permissions(Permissions.MANAGE_GUILD)) async def _rolegiver_cleanup(self, ctx: InteractionContext) -> None: - setting = await Rolegiver.find_one(q(guild=ctx.guild.id)) + setting = await Rolegiver.find_one(Rolegiver.guild == ctx.guild.id) if not setting or not setting.roles: await ctx.send("Rolegiver has no roles", ephemeral=True) guild_role_ids = [r.id for r in ctx.guild.roles] for role_id in setting.roles: if role_id not in guild_role_ids: setting.roles.remove(role_id) - await setting.commit() + await setting.save() await ctx.send("Rolegiver cleanup finished") self.cache.pop(ctx.guild.id, None) @@ -389,8 +387,7 @@ class RolegiverCog(Extension): @_rolegiver_remove.autocomplete("role") async def _autocomplete(self, ctx: AutocompleteContext, role: str) -> None: if not self.cache.get(ctx.guild.id): - rolegivers = await Rolegiver.find(q(guild=ctx.guild.id)).to_list(None) - for rolegiver in rolegivers: + async for rolegiver in Rolegiver.find(Rolegiver.guild == ctx.guild.id): role = await ctx.guild.fetch_role(rolegiver.role) if not role: await rolegiver.delete() diff --git a/jarvis/cogs/extra/tags.py b/jarvis/cogs/extra/tags.py index f72523e..516f9fa 100644 --- a/jarvis/cogs/extra/tags.py +++ b/jarvis/cogs/extra/tags.py @@ -14,7 +14,6 @@ from interactions.models.internal.application_commands import ( SlashCommand, slash_option, ) -from jarvis_core.db import q from jarvis_core.db.models import Setting, Tag from thefuzz import process @@ -43,7 +42,7 @@ class TagCog(Extension): required=True, ) async def _get(self, ctx: InteractionContext, name: str) -> None: - tag = await Tag.find_one(q(guild=ctx.guild.id, name=name)) + tag = await Tag.find_one(Tag.guild == ctx.guild.id, Tag.name == name) if not tag: await ctx.send("Well this is awkward, looks like the tag was deleted just now", ephemeral=True) return @@ -80,7 +79,7 @@ class TagCog(Extension): except asyncio.TimeoutError: return - noinvite = await Setting.find_one(q(guild=ctx.guild.id, setting="noinvite")) + noinvite = await Setting.find_one(Setting.guild == ctx.guild.id, Setting.setting == "noinvite") if ( (invites.search(content) or invites.search(name)) @@ -99,7 +98,7 @@ class TagCog(Extension): await response.send("Tag name must only contain: [A-Za-z0-9_- ]", ephemeral=True) return - tag = await Tag.find_one(q(guild=ctx.guild.id, name=name)) + tag = await Tag.find_one(Tag.guild == ctx.guild.id, Tag.name == name) if tag: await response.send("That tag already exists", ephemeral=True) return @@ -112,7 +111,7 @@ class TagCog(Extension): content=content, guild=ctx.guild.id, ) - await tag.commit() + await tag.save() embed = build_embed( title="Tag Created", @@ -142,7 +141,7 @@ class TagCog(Extension): ) async def _edit(self, ctx: InteractionContext, name: str) -> None: old_name = name - tag = await Tag.find_one(q(guild=ctx.guild.id, name=name)) + tag = await Tag.find_one(Tag.guild == ctx.guild.id, Tag.name == name) if not tag: await ctx.send("Tag not found", ephemeral=True) return @@ -181,12 +180,12 @@ class TagCog(Extension): except asyncio.TimeoutError: return - new_tag = await Tag.find_one(q(guild=ctx.guild.id, name=name)) + new_tag = await Tag.find_one(Tag.guild == ctx.guild.id, Tag.name == name) if new_tag and new_tag.id != tag.id: await ctx.send("That tag name is used by another tag, choose another name", ephemeral=True) return - noinvite = await Setting.find_one(q(guild=ctx.guild.id, setting="noinvite")) + noinvite = await Setting.find_one(Setting.guild == ctx.guild.id, Setting.setting == "noinvite") if ( (invites.search(content) or invites.search(name)) @@ -210,7 +209,7 @@ class TagCog(Extension): tag.edited_at = datetime.now(tz=timezone.utc) tag.editor = ctx.author.id - await tag.commit() + await tag.save() embed = build_embed( title="Tag Updated", @@ -240,7 +239,7 @@ class TagCog(Extension): autocomplete=True, ) async def _delete(self, ctx: InteractionContext, name: str) -> None: - tag = await Tag.find_one(q(guild=ctx.guild.id, name=name)) + tag = await Tag.find_one(Tag.guild == ctx.guild.id, Tag.name == name) if not tag: await ctx.send("Tag not found", ephemeral=True) return @@ -264,7 +263,7 @@ class TagCog(Extension): autocomplete=True, ) async def _info(self, ctx: InteractionContext, name: str) -> None: - tag = await Tag.find_one(q(guild=ctx.guild.id, name=name)) + tag = await Tag.find_one(Tag.guild == ctx.guild.id, Tag.name == name) if not tag: await ctx.send("Tag not found", ephemeral=True) return @@ -307,7 +306,7 @@ class TagCog(Extension): @tag.subcommand(sub_cmd_name="list", sub_cmd_description="List tag names") async def _list(self, ctx: InteractionContext) -> None: - tags = await Tag.find(q(guild=ctx.guild.id)).to_list(None) + tags = await Tag.find(Tag.guild == ctx.guild.id).to_list() names = "\n".join(f"`{t.name}`" for t in tags) embed = build_embed(title="All Tags", description=names, fields=[]) components = Button(style=ButtonStyle.DANGER, emoji="🗑️", custom_id=f"delete|{ctx.author.id}") @@ -319,7 +318,7 @@ class TagCog(Extension): @_info.autocomplete("name") async def _autocomplete(self, ctx: AutocompleteContext, name: str) -> None: if not self.cache.get(ctx.guild.id): - tags = await Tag.find(q(guild=ctx.guild.id)).to_list(None) + tags = await Tag.find(Tag.guild == ctx.guild.id).to_list() self.cache[ctx.guild.id] = [tag.name for tag in tags] results = process.extract(name, self.cache.get(ctx.guild.id), limit=25) choices = [{"name": r[0], "value": r[0]} for r in results] diff --git a/jarvis/cogs/unique/ctc2.py b/jarvis/cogs/unique/ctc2.py index c8a4940..6b27034 100644 --- a/jarvis/cogs/unique/ctc2.py +++ b/jarvis/cogs/unique/ctc2.py @@ -15,7 +15,6 @@ from interactions.models.internal.application_commands import ( ) from interactions.models.internal.command import cooldown from interactions.models.internal.cooldowns import Buckets -from jarvis_core.db import q from jarvis_core.db.models import Guess from jarvis.utils import build_embed @@ -74,7 +73,7 @@ class CTCCog(Extension): ephemeral=True, ) return - guessed = await Guess.find_one(q(guess=guess)) + guessed = await Guess.find_one(Guess.guess == guess) if guessed: await ctx.send("Already guessed, dipshit.", ephemeral=True) return @@ -86,7 +85,7 @@ class CTCCog(Extension): correct = True else: await ctx.send("Nope.", ephemeral=True) - await Guess(guess=guess, user=ctx.author.id, correct=correct).commit() + await Guess(guess=guess, user=ctx.author.id, correct=correct).save() @ctc2.subcommand( sub_cmd_name="guesses", @@ -96,21 +95,21 @@ class CTCCog(Extension): async def _guesses(self, ctx: InteractionContext) -> None: await ctx.defer() cache = {} - guesses = Guess.find().sort("correct", -1).sort("id", -1) + guesses = Guess.find().sort(-Guess.correct, -Guess.id) fields = [] async for guess in guesses: - user = cache.get(guess["user"]) or await self.bot.fetch_user(guess["user"]) + user = cache.get(guess.user) or await self.bot.fetch_user(guess.user) if not user: user = "[redacted]" if isinstance(user, (Member, User)): user = user.username + "#" + user.discriminator - cache[guess["user"]] = user + cache[guess.user] = user name = "Correctly" if guess["correct"] else "Incorrectly" name += " guessed by: " + user fields.append( EmbedField( name=name, - value=guess["guess"] + "\n\u200b", + value=guess.guess + "\n\u200b", inline=False, ) ) diff --git a/jarvis/cogs/unique/dbrand.py b/jarvis/cogs/unique/dbrand.py index 1817d83..30562c8 100644 --- a/jarvis/cogs/unique/dbrand.py +++ b/jarvis/cogs/unique/dbrand.py @@ -18,7 +18,7 @@ from interactions.models.internal.cooldowns import Buckets from thefuzz import process from jarvis.branding import CUSTOM_EMOJIS -from jarvis.config import JarvisConfig +from jarvis.config import load_config from jarvis.data.dbrand import shipping_lookup from jarvis.utils import build_embed @@ -80,7 +80,7 @@ class DbrandCog(Extension): self.base_url = "https://dbrand.com/" self._session = aiohttp.ClientSession() self._session.headers.update({"Content-Type": "application/json"}) - self.api_url = JarvisConfig.from_yaml().urls["dbrand_shipping"] + self.api_url = load_config().urls["dbrand_shipping"] self.cache = {} def __del__(self): @@ -350,5 +350,7 @@ class DbrandCog(Extension): def setup(bot: Client) -> None: """Add dbrandcog to JARVIS""" - if JarvisConfig.from_yaml().urls.get("dbrand_shipping"): + if load_config().urls.get("dbrand_shipping"): DbrandCog(bot) + else: + bot.logger.info("Missing dbrand shipping URL, not loading dbrand cog") diff --git a/jarvis/cogs/unique/gl.py b/jarvis/cogs/unique/gl.py index 86bd6de..3f832af 100644 --- a/jarvis/cogs/unique/gl.py +++ b/jarvis/cogs/unique/gl.py @@ -17,7 +17,7 @@ from interactions.models.internal.application_commands import ( slash_option, ) -from jarvis.config import JarvisConfig +from jarvis.config import load_config from jarvis.utils import build_embed guild_ids = [862402786116763668] @@ -29,7 +29,7 @@ class GitlabCog(Extension): def __init__(self, bot: Client): self.bot = bot self.logger = logging.getLogger(__name__) - config = JarvisConfig.from_yaml() + config = load_config() self._gitlab = gitlab.Gitlab("https://git.zevaryx.com", private_token=config.gitlab_token) # JARVIS GitLab ID is 29 self.project = self._gitlab.projects.get(29) @@ -436,5 +436,7 @@ class GitlabCog(Extension): def setup(bot: Client) -> None: """Add GitlabCog to JARVIS if Gitlab token exists.""" - if JarvisConfig.from_yaml().gitlab_token: + if load_config().gitlab_token: GitlabCog(bot) + else: + bot.logger.info("Missing GitLab token, ignoring GitLab cog") diff --git a/jarvis/config.py b/jarvis/config.py index a4feeb2..c11b6ba 100644 --- a/jarvis/config.py +++ b/jarvis/config.py @@ -1,90 +1,196 @@ """Load the config for JARVIS""" +from enum import Enum +from os import environ +from pathlib import Path +from typing import Optional + +import orjson as json +import yaml +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 -from jarvis_core.config import Config +class Mongo(BaseModel): + """MongoDB config.""" + + host: list[str] | str = "localhost" + username: Optional[str] = None + password: Optional[str] = None + port: int = 27017 -class JarvisConfig(Config): - REQUIRED = ("token", "mongo", "redis") - OPTIONAL = { - "urls": None, - "sync": False, - "log_level": "INFO", - "cogs": None, - "events": True, - "gitlab_token": None, - "max_messages": 1000, - "twitter": None, - "reddit": None, - "rook_token": None, - "jurigged": False, - } - ENV_REQUIRED = [ - "TOKEN", - "MONGODB_HOST", - "MONGODB_USER", - "MONGODB_PASS", - "MONGODB_PORT", - "MONGODB_DATABASE", - "REDIS_HOST", - "REDIS_USER", - "REDIS_PASS", - ] - ENV_OPTIONAL = { - "MAX_MESSAGES": 10000, - "GITLAB_TOKEN": None, - "LOG_LEVEL": "INFO", - "SYNC": False, - "ROOK": None, - "REDDIT_SECRET": None, - "REDDIT_CLIENT": None, - "TWITTER_CONSUMER_KEY": None, - "TWITTER_CONSUMER_SECRET": None, - "TWITTER_ACCESS_TOKEN": None, - "TWITTER_ACCESS_SECRET": None, - "URLS_DBRAND_SHIPPING": None, - "JURIGGED": False, - } +class Redis(BaseModel): + """Redis config.""" - @classmethod - def _process_env(cls, **kwargs) -> dict: - """Process environment variables into usable info.""" - data = {} - mongo = {"connect": {}, "database": ""} - redis = {} - twitter = {} - reddit = {} - urls = {} - for item, value in kwargs.items(): - if item.startswith("MONGODB"): - key = item.split("_")[1].lower() - if key == "database": - mongo[key] = value - else: - mongo["connect"][key] = value - elif item.startswith("REDIS"): - key = item.split("_")[1].lower() - redis[key] = value - elif item.startswith("TWITTER"): - key = "_".join(item.split("_")[1:]).lower() - twitter[key] = value - elif item.startswith("REDDIT"): - key = item.split("_")[1].lower() - reddit[key] = value - elif item.startswith("URLS_"): - key = "_".join(item.split("_")[1:]).lower() - urls[key] = value - else: - if item == "SYNC": - value = value.lower() == "True" - data[item.lower()] = value + host: str = "localhost" + username: Optional[str] = None + password: Optional[str] = None - data["mongo"] = mongo - data["redis"] = redis - 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 - data["urls"] = {k: v for k, v in urls if v} - return data +class Mastodon(BaseModel): + """Mastodon config.""" + + token: str + url: str + + +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 Environment(Enum): + """JARVIS running environment.""" + + production = "production" + develop = "develop" + + +class Config(BaseModel): + """JARVIS config model.""" + + token: str + environment: Environment = Environment.develop + mongo: Mongo + redis: Redis + mastodon: Optional[Mastodon] = None + reddit: Optional[Reddit] = None + twitter: Optional[Twitter] = None + urls: Optional[dict[str, str]] = None + sync: bool = False + log_level: str = "INFO" + jurigged: bool = False + + +_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 = {} + redis = {} + mastodon = {} + twitter = {} + reddit = {} + urls = {} + mongo_keys = find_all(lambda x: x.upper().startswith("MONGO"), environ.keys()) + redis_keys = find_all(lambda x: x.upper().startswith("REDIS"), environ.keys()) + mastodon_keys = find_all(lambda x: x.upper().startswith("MASTODON"), 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()) + url_keys = find_all(lambda x: x.upper().startswith("URLS"), environ.keys()) + + config_keys = ( + mongo_keys + + redis_keys + + mastodon_keys + + reddit_keys + + twitter_keys + + url_keys + + ["TOKEN", "SYNC", "LOG_LEVEL", "JURIGGED"] + ) + + 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 redis_keys: + key = "_".join(item.split("_")[1:]).lower() + redis[key] = value + elif item in mastodon_keys: + key = "_".join(item.split("_")[1:]).lower() + mastodon[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 + elif item in url_keys: + key = "_".join(item.split("_")[1:]).lower() + urls[key] = value + else: + if item == "SYNC": + value = value.lower() in ["yes", "true"] + data[item.lower()] = value + + data["mongo"] = mongo + data["redis"] = redis + 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 + if all(x is not None for x in mastodon.values()): + data["mastodon"] = mastodon + data["urls"] = {k: v for k, v in urls if v} + + 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") diff --git a/jarvis/utils/__init__.py b/jarvis/utils/__init__.py index 7b1b290..44319f7 100644 --- a/jarvis/utils/__init__.py +++ b/jarvis/utils/__init__.py @@ -8,7 +8,6 @@ from interactions.models.discord.guild import AuditLogEntry from interactions.models.discord.user import Member from jarvis.branding import PRIMARY_COLOR -from jarvis.config import JarvisConfig def build_embed( @@ -66,8 +65,7 @@ def modlog_embed( def get_extensions(path: str) -> list: """Get JARVIS cogs.""" - config = JarvisConfig.from_yaml() - vals = config.cogs or [x.name for x in iter_modules(path)] + vals = [x.name for x in iter_modules(path)] return [f"jarvis.cogs.{x}" for x in vals] diff --git a/jarvis/utils/cogs.py b/jarvis/utils/cogs.py index 3d3f45e..6c66b55 100644 --- a/jarvis/utils/cogs.py +++ b/jarvis/utils/cogs.py @@ -6,7 +6,6 @@ from interactions import Client, Extension, InteractionContext from interactions.models.discord.components import ActionRow, Button, ButtonStyle from interactions.models.discord.embed import EmbedField from interactions.models.discord.user import Member -from jarvis_core.db import q from jarvis_core.db.models import Action, Ban, Kick, Modlog, Mute, Setting, Warning from statipy.db import Stat @@ -45,13 +44,12 @@ class ModcaseCog(Extension): md = WarningMetadata( client_id=self.user.id, client_name=self.client_name, - name="warning", type="manual", - guild_id=message.guild.id, - guild_name=message.guild.name, + guild_id=ctx.guild.id, + guild_name=ctx.guild.name, value=1, ) - await Stat(meta=md).insert() + await Stat(meta=md, name="warning").insert() user = kwargs.pop("user", None) if not user and not ctx.target_id: self.logger.warning("Admin action %s missing user, exiting", name) @@ -69,12 +67,16 @@ class ModcaseCog(Extension): self.logger.warning("Unsupported action %s, exiting", name) return - action = await coll.find_one(q(user=user.id, guild=ctx.guild_id, active=True), sort=[("_id", -1)]) + action = await coll.find_one( + coll.user == user.id, coll.guild == ctx.guild.id, coll.active is True, sort=[("_id", -1)] + ) if not action: self.logger.warning("Missing action %s, exiting", name) return - notify = await Setting.find_one(q(guild=ctx.guild.id, setting="notify", value=True)) + notify = await Setting.find_one( + Setting.guild == ctx.guild.id, Setting.setting == "notify", Setting.value is True + ) if notify and name not in ("Kick", "Ban"): # Ignore Kick and Ban, as these are unique fields = ( EmbedField(name="Action Type", value=name, inline=False), @@ -96,14 +98,15 @@ class ModcaseCog(Extension): except Exception: self.logger.debug("User not warned of action due to closed DMs") - modlog = await Modlog.find_one(q(user=user.id, guild=ctx.guild.id, open=True)) + modlog = await Modlog.find_one(Modlog.user == user.id, Modlog.guild == ctx.guild.id, Modlog.open is True) + if modlog: m_action = Action(action_type=name.lower(), parent=action.id) modlog.actions.append(m_action) - await modlog.commit() + await modlog.save() return - modlog = await Setting.find_one(q(guild=ctx.guild.id, setting="modlog")) + modlog = await Setting.find_one(Setting.guild == ctx.guild.id, Setting.setting == "modlog") if not modlog: return diff --git a/jarvis/utils/permissions.py b/jarvis/utils/permissions.py index 5184541..bcf207f 100644 --- a/jarvis/utils/permissions.py +++ b/jarvis/utils/permissions.py @@ -1,22 +1,6 @@ """Permissions wrappers.""" from interactions import InteractionContext, Permissions -from jarvis.config import JarvisConfig - - -def user_is_bot_admin() -> bool: - """Check if a user is a JARVIS admin.""" - - async def predicate(ctx: InteractionContext) -> bool: - """Command check predicate.""" - cfg = JarvisConfig.from_yaml() - if getattr(cfg, "admins", None): - return ctx.author.id in cfg.admins - else: - return False - - return predicate - def admin_or_permissions(*perms: list) -> bool: """Check if a user is an admin or has other perms.""" diff --git a/poetry.lock b/poetry.lock index b21fd38..065cf19 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,21 +1,22 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.0 and should not be changed by hand. [[package]] name = "aiofile" -version = "3.8.1" +version = "3.8.5" description = "Asynchronous file operations." category = "main" optional = false python-versions = ">=3.7, <4" files = [ - {file = "aiofile-3.8.1.tar.gz", hash = "sha256:1623b98d88fbd16bbd2808d010de4e185a700e950ed3f17455dd851aa2455f40"}, + {file = "aiofile-3.8.5-py3-none-any.whl", hash = "sha256:6644b61ab143a8e516920cdb02d5b46f89c0a37ef036417720f653b5ed31a8c9"}, + {file = "aiofile-3.8.5.tar.gz", hash = "sha256:bb1ca0b2c4ef3b78f5012a2a3919a4151f873b6aabdc73a7b9b8e94edb2e01ae"}, ] [package.dependencies] caio = ">=0.9.0,<0.10.0" [package.extras] -develop = ["aiomisc", "pytest", "pytest-cov"] +develop = ["aiomisc-pytest", "coveralls", "pytest", "pytest-cov", "pytest-rst"] [[package]] name = "aiofiles" @@ -341,14 +342,14 @@ toml = "*" [[package]] name = "beautifulsoup4" -version = "4.11.2" +version = "4.12.0" description = "Screen-scraping library" category = "main" optional = false python-versions = ">=3.6.0" files = [ - {file = "beautifulsoup4-4.11.2-py3-none-any.whl", hash = "sha256:0e79446b10b3ecb499c1556f7e228a53e64a2bfcebd455f370d8927cb5b59e39"}, - {file = "beautifulsoup4-4.11.2.tar.gz", hash = "sha256:bc4bdda6717de5a2987436fb8d72f45dc90dd856bdfd512a1314ce90349a0106"}, + {file = "beautifulsoup4-4.12.0-py3-none-any.whl", hash = "sha256:2130a5ad7f513200fae61a17abb5e338ca980fa28c439c0571014bc0217e9591"}, + {file = "beautifulsoup4-4.12.0.tar.gz", hash = "sha256:c5fceeaec29d09c84970e47c65f2f0efe57872f7cff494c9691a26ec0ff13234"}, ] [package.dependencies] @@ -360,32 +361,46 @@ lxml = ["lxml"] [[package]] name = "black" -version = "22.12.0" +version = "23.1.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, - {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, - {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, - {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, - {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, - {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, - {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, - {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, - {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, - {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, - {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, - {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, + {file = "black-23.1.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:b6a92a41ee34b883b359998f0c8e6eb8e99803aa8bf3123bf2b2e6fec505a221"}, + {file = "black-23.1.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:57c18c5165c1dbe291d5306e53fb3988122890e57bd9b3dcb75f967f13411a26"}, + {file = "black-23.1.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:9880d7d419bb7e709b37e28deb5e68a49227713b623c72b2b931028ea65f619b"}, + {file = "black-23.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6663f91b6feca5d06f2ccd49a10f254f9298cc1f7f49c46e498a0771b507104"}, + {file = "black-23.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:9afd3f493666a0cd8f8df9a0200c6359ac53940cbde049dcb1a7eb6ee2dd7074"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:bfffba28dc52a58f04492181392ee380e95262af14ee01d4bc7bb1b1c6ca8d27"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c1c476bc7b7d021321e7d93dc2cbd78ce103b84d5a4cf97ed535fbc0d6660648"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:382998821f58e5c8238d3166c492139573325287820963d2f7de4d518bd76958"}, + {file = "black-23.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bf649fda611c8550ca9d7592b69f0637218c2369b7744694c5e4902873b2f3a"}, + {file = "black-23.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:121ca7f10b4a01fd99951234abdbd97728e1240be89fde18480ffac16503d481"}, + {file = "black-23.1.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:a8471939da5e824b891b25751955be52ee7f8a30a916d570a5ba8e0f2eb2ecad"}, + {file = "black-23.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8178318cb74f98bc571eef19068f6ab5613b3e59d4f47771582f04e175570ed8"}, + {file = "black-23.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a436e7881d33acaf2536c46a454bb964a50eff59b21b51c6ccf5a40601fbef24"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:a59db0a2094d2259c554676403fa2fac3473ccf1354c1c63eccf7ae65aac8ab6"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:0052dba51dec07ed029ed61b18183942043e00008ec65d5028814afaab9a22fd"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:49f7b39e30f326a34b5c9a4213213a6b221d7ae9d58ec70df1c4a307cf2a1580"}, + {file = "black-23.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:162e37d49e93bd6eb6f1afc3e17a3d23a823042530c37c3c42eeeaf026f38468"}, + {file = "black-23.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b70eb40a78dfac24842458476135f9b99ab952dd3f2dab738c1881a9b38b753"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:a29650759a6a0944e7cca036674655c2f0f63806ddecc45ed40b7b8aa314b651"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:bb460c8561c8c1bec7824ecbc3ce085eb50005883a6203dcfb0122e95797ee06"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c91dfc2c2a4e50df0026f88d2215e166616e0c80e86004d0003ece0488db2739"}, + {file = "black-23.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a951cc83ab535d248c89f300eccbd625e80ab880fbcfb5ac8afb5f01a258ac9"}, + {file = "black-23.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0680d4380db3719ebcfb2613f34e86c8e6d15ffeabcf8ec59355c5e7b85bb555"}, + {file = "black-23.1.0-py3-none-any.whl", hash = "sha256:7a0f701d314cfa0896b9001df70a530eb2472babb76086344e688829efd97d32"}, + {file = "black-23.1.0.tar.gz", hash = "sha256:b0bd97bea8903f5a2ba7219257a44e3f1f9d00073d6cc1add68f0beec69692ac"}, ] [package.dependencies] click = ">=8.0.0" mypy-extensions = ">=0.4.3" +packaging = ">=22.0" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] @@ -625,14 +640,14 @@ test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] [[package]] name = "dateparser" -version = "1.1.7" +version = "1.1.8" description = "Date parsing library designed to parse dates from HTML pages" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "dateparser-1.1.7-py2.py3-none-any.whl", hash = "sha256:fbed8b738a24c9cd7f47c4f2089527926566fe539e1a06125eddba75917b1eef"}, - {file = "dateparser-1.1.7.tar.gz", hash = "sha256:ff047d9cffad4d3113ead8ec0faf8a7fc43bab7d853ac8715e071312b53c465a"}, + {file = "dateparser-1.1.8-py2.py3-none-any.whl", hash = "sha256:070b29b5bbf4b1ec2cd51c96ea040dc68a614de703910a91ad1abba18f9f379f"}, + {file = "dateparser-1.1.8.tar.gz", hash = "sha256:86b8b7517efcc558f085a142cdb7620f0921543fcabdb538c8a4c4001d8178e3"}, ] [package.dependencies] @@ -710,19 +725,19 @@ dev = ["coverage", "coveralls", "pytest"] [[package]] name = "filelock" -version = "3.10.0" +version = "3.10.3" description = "A platform independent file lock." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "filelock-3.10.0-py3-none-any.whl", hash = "sha256:e90b34656470756edf8b19656785c5fea73afa1953f3e1b0d645cef11cab3182"}, - {file = "filelock-3.10.0.tar.gz", hash = "sha256:3199fd0d3faea8b911be52b663dfccceb84c95949dd13179aa21436d1a79c4ce"}, + {file = "filelock-3.10.3-py3-none-any.whl", hash = "sha256:99d6282f732410d44242ca02aa49835cf5473e2dd4d6734a2a785c8889dc191e"}, + {file = "filelock-3.10.3.tar.gz", hash = "sha256:a26bfa34d26293e04886dff13fa8dd0c8c6e1a786b723c689755fe8939297410"}, ] [package.extras] docs = ["furo (>=2022.12.7)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.2.1)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-timeout (>=2.1)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.2)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-timeout (>=2.1)"] [[package]] name = "frozenlist" @@ -840,14 +855,14 @@ gitdb = ">=4.0.1,<5" [[package]] name = "identify" -version = "2.5.20" +version = "2.5.21" description = "File identification library for Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "identify-2.5.20-py2.py3-none-any.whl", hash = "sha256:5dfef8a745ca4f2c95f27e9db74cb4c8b6d9916383988e8791f3595868f78a33"}, - {file = "identify-2.5.20.tar.gz", hash = "sha256:c8b288552bc5f05a08aff09af2f58e6976bf8ac87beb38498a0e3d98ba64eb18"}, + {file = "identify-2.5.21-py2.py3-none-any.whl", hash = "sha256:69edcaffa8e91ae0f77d397af60f148b6b45a8044b2cc6d99cafa5b04793ff00"}, + {file = "identify-2.5.21.tar.gz", hash = "sha256:7671a05ef9cfaf8ff63b15d45a91a1147a03aaccb2976d4e9bd047cbbc508471"}, ] [package.extras] @@ -867,14 +882,14 @@ files = [ [[package]] name = "importlib-metadata" -version = "6.0.0" +version = "6.1.0" description = "Read metadata from Python packages" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "importlib_metadata-6.0.0-py3-none-any.whl", hash = "sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad"}, - {file = "importlib_metadata-6.0.0.tar.gz", hash = "sha256:e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d"}, + {file = "importlib_metadata-6.1.0-py3-none-any.whl", hash = "sha256:ff80f3b5394912eb1b108fcfd444dc78b7f1f3e16b16188054bd01cb9cb86f09"}, + {file = "importlib_metadata-6.1.0.tar.gz", hash = "sha256:43ce9281e097583d758c2c708c4376371261a02c34682491a8e98352365aad20"}, ] [package.dependencies] @@ -891,32 +906,33 @@ version = "5.0.0" description = "Easy, simple, scalable and modular: a Python API wrapper for interactions." category = "main" optional = false -python-versions = ">=3.10,<4.0" +python-versions = ">=3.10" files = [] develop = false [package.dependencies] -aiohttp = "^3.8.3" -attrs = ">=22.1.0" -discord-typings = "^0.5.1" -emoji = "^2.1.0" -mypy = ">0.930" -tomli = "^2.0.1" +aiohttp = "*" +attrs = "*" +discord-typings = ">=0.5.1" +emoji = "*" +tomli = "*" [package.extras] -console = [] -docs = ["mkdocs-autorefs", "mkdocs-awesome-pages-plugin", "mkdocs-git-committers-plugin-2", "mkdocs-git-revision-date-localized-plugin", "mkdocs-material", "mkdocs-minify-plugin", "mkdocstrings-python"] -jurigged = [] -sentry = [] +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", "pytest-recording", "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", "pytest-recording", "python-dotenv", "typeguard"] -voice = [] +voice = ["PyNaCl (>=1.5.0,<1.6)"] [package.source] type = "git" url = "https://github.com/interactions-py/interactions.py" reference = "5.x" -resolved_reference = "316388be6d608e12e64c93af2cc1b03fc0acfa97" +resolved_reference = "dc2554a61387c953bcaad79a7166f93b98dd0eab" [[package]] name = "jarvis-core" @@ -943,7 +959,7 @@ umongo = "^3.1.0" type = "git" url = "https://git.zevaryx.com/stark-industries/jarvis/jarvis-core.git" reference = "main" -resolved_reference = "392797c4aea76db0dff8772d95acea3ff3094b46" +resolved_reference = "ec4219e5a54bea78ff19f23f1754a036e8d0eae3" [[package]] name = "jinxed" @@ -1240,58 +1256,11 @@ files = [ {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, ] -[[package]] -name = "mypy" -version = "1.1.1" -description = "Optional static typing for Python" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "mypy-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39c7119335be05630611ee798cc982623b9e8f0cff04a0b48dfc26100e0b97af"}, - {file = "mypy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61bf08362e93b6b12fad3eab68c4ea903a077b87c90ac06c11e3d7a09b56b9c1"}, - {file = "mypy-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbb19c9f662e41e474e0cff502b7064a7edc6764f5262b6cd91d698163196799"}, - {file = "mypy-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:315ac73cc1cce4771c27d426b7ea558fb4e2836f89cb0296cbe056894e3a1f78"}, - {file = "mypy-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:5cb14ff9919b7df3538590fc4d4c49a0f84392237cbf5f7a816b4161c061829e"}, - {file = "mypy-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:26cdd6a22b9b40b2fd71881a8a4f34b4d7914c679f154f43385ca878a8297389"}, - {file = "mypy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b5f81b40d94c785f288948c16e1f2da37203c6006546c5d947aab6f90aefef2"}, - {file = "mypy-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21b437be1c02712a605591e1ed1d858aba681757a1e55fe678a15c2244cd68a5"}, - {file = "mypy-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d809f88734f44a0d44959d795b1e6f64b2bbe0ea4d9cc4776aa588bb4229fc1c"}, - {file = "mypy-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:a380c041db500e1410bb5b16b3c1c35e61e773a5c3517926b81dfdab7582be54"}, - {file = "mypy-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b7c7b708fe9a871a96626d61912e3f4ddd365bf7f39128362bc50cbd74a634d5"}, - {file = "mypy-1.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1c10fa12df1232c936830839e2e935d090fc9ee315744ac33b8a32216b93707"}, - {file = "mypy-1.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0a28a76785bf57655a8ea5eb0540a15b0e781c807b5aa798bd463779988fa1d5"}, - {file = "mypy-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:ef6a01e563ec6a4940784c574d33f6ac1943864634517984471642908b30b6f7"}, - {file = "mypy-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d64c28e03ce40d5303450f547e07418c64c241669ab20610f273c9e6290b4b0b"}, - {file = "mypy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64cc3afb3e9e71a79d06e3ed24bb508a6d66f782aff7e56f628bf35ba2e0ba51"}, - {file = "mypy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce61663faf7a8e5ec6f456857bfbcec2901fbdb3ad958b778403f63b9e606a1b"}, - {file = "mypy-1.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2b0c373d071593deefbcdd87ec8db91ea13bd8f1328d44947e88beae21e8d5e9"}, - {file = "mypy-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:2888ce4fe5aae5a673386fa232473014056967f3904f5abfcf6367b5af1f612a"}, - {file = "mypy-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:19ba15f9627a5723e522d007fe708007bae52b93faab00f95d72f03e1afa9598"}, - {file = "mypy-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:59bbd71e5c58eed2e992ce6523180e03c221dcd92b52f0e792f291d67b15a71c"}, - {file = "mypy-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9401e33814cec6aec8c03a9548e9385e0e228fc1b8b0a37b9ea21038e64cdd8a"}, - {file = "mypy-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4b398d8b1f4fba0e3c6463e02f8ad3346f71956b92287af22c9b12c3ec965a9f"}, - {file = "mypy-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:69b35d1dcb5707382810765ed34da9db47e7f95b3528334a3c999b0c90fe523f"}, - {file = "mypy-1.1.1-py3-none-any.whl", hash = "sha256:4e4e8b362cdf99ba00c2b218036002bdcdf1e0de085cdb296a49df03fb31dfc4"}, - {file = "mypy-1.1.1.tar.gz", hash = "sha256:ae9ceae0f5b9059f33dbc62dea087e942c0ccab4b7a003719cb70f9b8abfa32f"}, -] - -[package.dependencies] -mypy-extensions = ">=1.0.0" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=3.10" - -[package.extras] -dmypy = ["psutil (>=4.0)"] -install-types = ["pip"] -python2 = ["typed-ast (>=1.4.0,<2)"] -reports = ["lxml"] - [[package]] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "main" +category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1422,56 +1391,61 @@ numpy = [ [[package]] name = "orjson" -version = "3.8.7" +version = "3.8.8" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "orjson-3.8.7-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:f98c82850b7b4b7e27785ca43706fa86c893cdb88d54576bbb9b0d9c1070e421"}, - {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.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc4fa83831f42ce5c938f8cefc2e175fa1df6f661fdeaba3badf26d2b8cfcf73"}, - {file = "orjson-3.8.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9e432c6c9c8b97ad825276d5795286f7cc9689f377a97e3b7ecf14918413303f"}, - {file = "orjson-3.8.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee519964a5a0efb9633f38b1129fd242807c5c57162844efeeaab1c8de080051"}, - {file = "orjson-3.8.7-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:109b539ce5bf60a121454d008fa67c3b67e5a3249e47d277012645922cf74bd0"}, - {file = "orjson-3.8.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ad4d441fbde4133af6fee37f67dbf23181b9c537ecc317346ec8c3b4c8ec7705"}, - {file = "orjson-3.8.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:89dc786419e1ce2588345f58dd6a434e6728bce66b94989644234bcdbe39b603"}, - {file = "orjson-3.8.7-cp310-none-win_amd64.whl", hash = "sha256:697abde7350fb8076d44bcb6b4ab3ce415ae2b5a9bb91efc460e5ab0d96bb5d3"}, - {file = "orjson-3.8.7-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:1c19f47b35b9966a3abadf341b18ee4a860431bf2b00fd8d58906d51cf78aa70"}, - {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.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d88837002c5a8af970745b8e0ca1b0fdb06aafbe7f1279e110d338ea19f3d23"}, - {file = "orjson-3.8.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff60187d1b7e0bfab376b6002b08c560b7de06c87cf3a8ac639ecf58f84c5f3b"}, - {file = "orjson-3.8.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0110970aed35dec293f30ed1e09f8604afd5d15c5ef83de7f6c427619b3ba47b"}, - {file = "orjson-3.8.7-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:51b275475d4e36118b65ad56f9764056a09d985c5d72e64579bf8816f1356a5e"}, - {file = "orjson-3.8.7-cp311-none-win_amd64.whl", hash = "sha256:63144d27735f3b60f079f247ac9a289d80dfe49a7f03880dfa0c0ba64d6491d5"}, - {file = "orjson-3.8.7-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:a16273d77db746bb1789a2bbfded81148a60743fd6f9d5185e02d92e3732fa18"}, - {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.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad02e9102d4ba67db30a136e631e32aeebd1dce26c9f5942a457b02df131c5d0"}, - {file = "orjson-3.8.7-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dbcfcec2b7ac52deb7be3685b551addc28ee8fa454ef41f8b714df6ba0e32a27"}, - {file = "orjson-3.8.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a0e5504a5fc86083cc210c6946e8d61e13fe9f1d7a7bf81b42f7050a49d4fb"}, - {file = "orjson-3.8.7-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:7bd4fd37adb03b1f2a1012d43c9f95973a02164e131dfe3ff804d7e180af5653"}, - {file = "orjson-3.8.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:188ed9f9a781333ad802af54c55d5a48991e292239aef41bd663b6e314377eb8"}, - {file = "orjson-3.8.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:cc52f58c688cb10afd810280e450f56fbcb27f52c053463e625c8335c95db0dc"}, - {file = "orjson-3.8.7-cp37-none-win_amd64.whl", hash = "sha256:403c8c84ac8a02c40613b0493b74d5256379e65196d39399edbf2ed3169cbeb5"}, - {file = "orjson-3.8.7-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:7d6ac5f8a2a17095cd927c4d52abbb38af45918e0d3abd60fb50cfd49d71ae24"}, - {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.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feb32aaaa34cf2f891eb793ad320d4bb6731328496ae59b6c9eb1b620c42b529"}, - {file = "orjson-3.8.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7a3ab1a473894e609b6f1d763838c6689ba2b97620c256a32c4d9f10595ac179"}, - {file = "orjson-3.8.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e8c430d82b532c5ab95634e034bbf6ca7432ffe175a3e63eadd493e00b3a555"}, - {file = "orjson-3.8.7-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:366cc75f7e09106f9dac95a675aef413367b284f25507d21e55bd7f45f445e80"}, - {file = "orjson-3.8.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:84d154d07e8b17d97e990d5d710b719a031738eb1687d8a05b9089f0564ff3e0"}, - {file = "orjson-3.8.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06180014afcfdc167ca984b312218aa62ce20093965c437c5f9166764cb65ef7"}, - {file = "orjson-3.8.7-cp38-none-win_amd64.whl", hash = "sha256:41244431ba13f2e6ef22b52c5cf0202d17954489f4a3c0505bd28d0e805c3546"}, - {file = "orjson-3.8.7-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:b20f29fa8371b8023f1791df035a2c3ccbd98baa429ac3114fc104768f7db6f8"}, - {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.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e75c11023ac29e29fd3e75038d0e8dd93f9ea24d7b9a5e871967a8921a88df24"}, - {file = "orjson-3.8.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:78604d3acfd7cd502f6381eea0c42281fe2b74755b334074ab3ebc0224100be1"}, - {file = "orjson-3.8.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7129a6847f0494aa1427167486ef6aea2e835ba05f6c627df522692ee228f65"}, - {file = "orjson-3.8.7-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1a1a8f4980059f48483782c608145b0f74538c266e01c183d9bcd9f8b71dbada"}, - {file = "orjson-3.8.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d60304172a33705ce4bd25a6261ab84bed2dab0b3d3b79672ea16c7648af4832"}, - {file = "orjson-3.8.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4f733062d84389c32c0492e5a4929056fac217034a94523debe0430bcc602cda"}, - {file = "orjson-3.8.7-cp39-none-win_amd64.whl", hash = "sha256:010e2970ec9e826c332819e0da4b14b29b19641da0f1a6af4cec91629ef9b988"}, - {file = "orjson-3.8.7.tar.gz", hash = "sha256:8460c8810652dba59c38c80d27c325b5092d189308d8d4f3e688dbd8d4f3b2dc"}, + {file = "orjson-3.8.8-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:18fcdea75d8b571dc9b185652b81397b62878ae7934fd62e6a0103a5b8448e34"}, + {file = "orjson-3.8.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:306618884929b596e2e083f82b5617da812df25b0c467542371f1d51f0c5a6f5"}, + {file = "orjson-3.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edc65ddb6ae6f8fbb2bbf78ac98f75b729c9eeb0776d5508dd76d3a948dda1dd"}, + {file = "orjson-3.8.8-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e6a6d55e01bce74516dff15302627a13b1f4edcb1c3942dd660978dee423ccf2"}, + {file = "orjson-3.8.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:28075c4b502d792fb6703e983d456b2a30d5d6f332d26092eb312dc782e64c64"}, + {file = "orjson-3.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eda4c37e48ff549763183a1549c10eec6ea40439520b17d09359cd74a425069"}, + {file = "orjson-3.8.8-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a3eac485a15493164867729f44e1e1247b3094ff19d37708e8cdc9c88a93c623"}, + {file = "orjson-3.8.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:88bf40e5468444c04374d1b8f1877cebbaef6bb7406cb6b4a34a570c5cbb87bc"}, + {file = "orjson-3.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:747bd4e09d8aa61e1ff677a7dd1cffd28a5d13c22f3769123c58ec988bf1b83d"}, + {file = "orjson-3.8.8-cp310-none-win_amd64.whl", hash = "sha256:dd7d86c5f5f820ac9d4783477e86eb984b63bdb32359935609eb33cf65049c54"}, + {file = "orjson-3.8.8-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:52293a6097750c2d434737966fe6e2a1ed489ac70cc8e584f5944af83de0b787"}, + {file = "orjson-3.8.8-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:9322450f392dceb49810d2f820b1932af22d66f67f1d45c31f160067dd06359f"}, + {file = "orjson-3.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68d59e3ae84a9b6f14b45a89f7fde4a08a87ea5eb76bfc854b354640de8156f5"}, + {file = "orjson-3.8.8-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:022347dad2253081eaa25366834bb8b06a5aceb0e83b39c6b0aa865759e49d69"}, + {file = "orjson-3.8.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddfcc54793e266056fe1c257d0804c336bca1c5c1ee7979d674e1fc19cfb0a6a"}, + {file = "orjson-3.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:449d8ed1e0e6b24e9df5a06b59fd66ea7f7293e141257069601ae8ff9fad705c"}, + {file = "orjson-3.8.8-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:0204bc414bc6f7a595211569840b422d96649fd8686efa1fbbcb12eed5dd9521"}, + {file = "orjson-3.8.8-cp311-none-win_amd64.whl", hash = "sha256:e991a5c2c5f2f299c77e1d07ef2812ff5b68e1d97a2aab01aca29cf756473aa3"}, + {file = "orjson-3.8.8-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:2006d9c046bbf335c951f61e016a27bd4f17323dd116f601e4a8a11739cd0a62"}, + {file = "orjson-3.8.8-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:4553d85bad4cbd634a40b7b5d36daaa197a6025f9ce3e2165b371e528759093d"}, + {file = "orjson-3.8.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57ee45d2cc6c11c50afb5a0c09d7cd559aea76c77250dbe996be6a03464d4a50"}, + {file = "orjson-3.8.8-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02f5b5db1e424706eb9f70f1c25699ff4cef16fadfc64af5b70f8628eafe4771"}, + {file = "orjson-3.8.8-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d7c9f3b1598a1ccd806ef02257a76a00c7ede09662ddb54eec2b4bd92874254"}, + {file = "orjson-3.8.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b90d171932b6a9d50e79fa2762cb303e3556bbf25c08bb316fe346ec58af9c19"}, + {file = "orjson-3.8.8-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:28dfe774c345130f1117c4d023644ec52d9d50e3eaadb9bd1c668d91dc109bb5"}, + {file = "orjson-3.8.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8f84116fcc3714e7ba3cbeb1b11ac5e4549e7d2726c50142f8299fff9dea7d53"}, + {file = "orjson-3.8.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f989f8580db86166aaaa938ccd1597ba1817e3f5df14c047baafe783e3d24173"}, + {file = "orjson-3.8.8-cp37-none-win_amd64.whl", hash = "sha256:66045850f286090800a18662d81d44f88c3fcb60ea3a9947d5caeab5d1efc92e"}, + {file = "orjson-3.8.8-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:2c2c5f3d3bbd61dba646e2b9c54a0dd7941b03fba49726bd31c1c23fedf0b9aa"}, + {file = "orjson-3.8.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:9cb36d4a14f3a911369219d5abc19b907bc41ed2730f7bfe0847b0fd3e834c87"}, + {file = "orjson-3.8.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:343124f84da0a33c83ee106a98b3e3c42767c88323d4a2809683cbe83816e8be"}, + {file = "orjson-3.8.8-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:24ad122d8dd057acf2a9965a2ffc1bc12fb310ae1cfe2912db930cbb9ef7eaba"}, + {file = "orjson-3.8.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2f28a92a9bcb4e8635524b20db1b539bda8613872f306b36cdfd9d3577d03ac"}, + {file = "orjson-3.8.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81d3c5b253eebfc4a61cea1f255a576cb2b889afa99f4510f30ec13201d4f457"}, + {file = "orjson-3.8.8-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:317164f7d4c0540a6eb8b0a0faeec84ef011d359da05188423db762b65f84e1d"}, + {file = "orjson-3.8.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5e7e39357371d4ae5649f33c01886508a4c8e5fa5c7344554af041dc0f004c01"}, + {file = "orjson-3.8.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:60fefd4bbd796b4296f478e705fe2c2c7defd28da98d3017743eb87c3238a380"}, + {file = "orjson-3.8.8-cp38-none-win_amd64.whl", hash = "sha256:0dc4a52f1087baeec6b58248fd6b01f17c124fb99f6f770596851ea434a7be0b"}, + {file = "orjson-3.8.8-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:a6bcb449537a99f55c5f05187bac00b4549a795e89c10dcca0d7629548852357"}, + {file = "orjson-3.8.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:9c98dc791aa44268ba7f6e21124cf885c813b155316c6bf257560571d243fe15"}, + {file = "orjson-3.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b2abf93b727a6af7c5ec8816168cbdff39c716af18ced425dd50ae46d69765c"}, + {file = "orjson-3.8.8-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:23447d38375a19d57975d4e32d9ce9f533803c197fd4292e10d3234c052037a8"}, + {file = "orjson-3.8.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c2e19d2b46cc93c7218bf8180807bf922ff61dc9883458a06edc66d22970fff"}, + {file = "orjson-3.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e480d74d7bf415e6548a364669404119a85dbe0e3c6cd5f7cb4c7003eac20164"}, + {file = "orjson-3.8.8-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:8e0bff5656b99dd975cae2e5230b39e5909d06c0692fd1f6f06dc46f1fe705d0"}, + {file = "orjson-3.8.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:56bb6eb7a254eec3b15feba9b20f4172ccbe6ea50a54cf66cbc8e1e4a19585c2"}, + {file = "orjson-3.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1af1cfad5d90b68e15fd625c889c4f9f91d7a88f49512cdb89f01c3881e0c9d9"}, + {file = "orjson-3.8.8-cp39-none-win_amd64.whl", hash = "sha256:d5514dfe200356a1d5a6039e00dca78d87d063f3da1eb6a371253e5a8b7ab5b0"}, + {file = "orjson-3.8.8.tar.gz", hash = "sha256:c096d7a523bae6ffb9c4a228ba4691d66113f0f2231579dc945523fbef09c6da"}, ] [[package]] @@ -1774,48 +1748,48 @@ files = [ [[package]] name = "pydantic" -version = "1.10.6" +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.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9289065611c48147c1dd1fd344e9d57ab45f1d99b0fb26c51f1cf72cd9bcd31"}, - {file = "pydantic-1.10.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8c32b6bba301490d9bb2bf5f631907803135e8085b6aa3e5fe5a770d46dd0160"}, - {file = "pydantic-1.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd9b9e98068fa1068edfc9eabde70a7132017bdd4f362f8b4fd0abed79c33083"}, - {file = "pydantic-1.10.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c84583b9df62522829cbc46e2b22e0ec11445625b5acd70c5681ce09c9b11c4"}, - {file = "pydantic-1.10.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b41822064585fea56d0116aa431fbd5137ce69dfe837b599e310034171996084"}, - {file = "pydantic-1.10.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:61f1f08adfaa9cc02e0cbc94f478140385cbd52d5b3c5a657c2fceb15de8d1fb"}, - {file = "pydantic-1.10.6-cp310-cp310-win_amd64.whl", hash = "sha256:32937835e525d92c98a1512218db4eed9ddc8f4ee2a78382d77f54341972c0e7"}, - {file = "pydantic-1.10.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bbd5c531b22928e63d0cb1868dee76123456e1de2f1cb45879e9e7a3f3f1779b"}, - {file = "pydantic-1.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e277bd18339177daa62a294256869bbe84df1fb592be2716ec62627bb8d7c81d"}, - {file = "pydantic-1.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f15277d720aa57e173954d237628a8d304896364b9de745dcb722f584812c7"}, - {file = "pydantic-1.10.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b243b564cea2576725e77aeeda54e3e0229a168bc587d536cd69941e6797543d"}, - {file = "pydantic-1.10.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3ce13a558b484c9ae48a6a7c184b1ba0e5588c5525482681db418268e5f86186"}, - {file = "pydantic-1.10.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3ac1cd4deed871dfe0c5f63721e29debf03e2deefa41b3ed5eb5f5df287c7b70"}, - {file = "pydantic-1.10.6-cp311-cp311-win_amd64.whl", hash = "sha256:b1eb6610330a1dfba9ce142ada792f26bbef1255b75f538196a39e9e90388bf4"}, - {file = "pydantic-1.10.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4ca83739c1263a044ec8b79df4eefc34bbac87191f0a513d00dd47d46e307a65"}, - {file = "pydantic-1.10.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea4e2a7cb409951988e79a469f609bba998a576e6d7b9791ae5d1e0619e1c0f2"}, - {file = "pydantic-1.10.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53de12b4608290992a943801d7756f18a37b7aee284b9ffa794ee8ea8153f8e2"}, - {file = "pydantic-1.10.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:60184e80aac3b56933c71c48d6181e630b0fbc61ae455a63322a66a23c14731a"}, - {file = "pydantic-1.10.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:415a3f719ce518e95a92effc7ee30118a25c3d032455d13e121e3840985f2efd"}, - {file = "pydantic-1.10.6-cp37-cp37m-win_amd64.whl", hash = "sha256:72cb30894a34d3a7ab6d959b45a70abac8a2a93b6480fc5a7bfbd9c935bdc4fb"}, - {file = "pydantic-1.10.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3091d2eaeda25391405e36c2fc2ed102b48bac4b384d42b2267310abae350ca6"}, - {file = "pydantic-1.10.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:751f008cd2afe812a781fd6aa2fb66c620ca2e1a13b6a2152b1ad51553cb4b77"}, - {file = "pydantic-1.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12e837fd320dd30bd625be1b101e3b62edc096a49835392dcf418f1a5ac2b832"}, - {file = "pydantic-1.10.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587d92831d0115874d766b1f5fddcdde0c5b6c60f8c6111a394078ec227fca6d"}, - {file = "pydantic-1.10.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:476f6674303ae7965730a382a8e8d7fae18b8004b7b69a56c3d8fa93968aa21c"}, - {file = "pydantic-1.10.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3a2be0a0f32c83265fd71a45027201e1278beaa82ea88ea5b345eea6afa9ac7f"}, - {file = "pydantic-1.10.6-cp38-cp38-win_amd64.whl", hash = "sha256:0abd9c60eee6201b853b6c4be104edfba4f8f6c5f3623f8e1dba90634d63eb35"}, - {file = "pydantic-1.10.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6195ca908045054dd2d57eb9c39a5fe86409968b8040de8c2240186da0769da7"}, - {file = "pydantic-1.10.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:43cdeca8d30de9a897440e3fb8866f827c4c31f6c73838e3a01a14b03b067b1d"}, - {file = "pydantic-1.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c19eb5163167489cb1e0161ae9220dadd4fc609a42649e7e84a8fa8fff7a80f"}, - {file = "pydantic-1.10.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:012c99a9c0d18cfde7469aa1ebff922e24b0c706d03ead96940f5465f2c9cf62"}, - {file = "pydantic-1.10.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:528dcf7ec49fb5a84bf6fe346c1cc3c55b0e7603c2123881996ca3ad79db5bfc"}, - {file = "pydantic-1.10.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:163e79386c3547c49366e959d01e37fc30252285a70619ffc1b10ede4758250a"}, - {file = "pydantic-1.10.6-cp39-cp39-win_amd64.whl", hash = "sha256:189318051c3d57821f7233ecc94708767dd67687a614a4e8f92b4a020d4ffd06"}, - {file = "pydantic-1.10.6-py3-none-any.whl", hash = "sha256:acc6783751ac9c9bc4680379edd6d286468a1dc8d7d9906cd6f1186ed682b2b0"}, - {file = "pydantic-1.10.6.tar.gz", hash = "sha256:cf95adb0d1671fc38d8c43dd921ad5814a735e7d9b4d9e437c088002863854fd"}, + {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] @@ -2214,18 +2188,18 @@ full = ["numpy"] [[package]] name = "redis" -version = "4.5.1" +version = "4.5.3" description = "Python client for Redis database and key-value store" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "redis-4.5.1-py3-none-any.whl", hash = "sha256:5deb072d26e67d2be1712603bfb7947ec3431fb0eec9c578994052e33035af6d"}, - {file = "redis-4.5.1.tar.gz", hash = "sha256:1eec3741cda408d3a5f84b78d089c8b8d895f21b3b050988351e925faf202864"}, + {file = "redis-4.5.3-py3-none-any.whl", hash = "sha256:7df17a0a2b72a4c8895b462dd07616c51b1dcb48fdd7ecb7b6f4bf39ecb2e94e"}, + {file = "redis-4.5.3.tar.gz", hash = "sha256:56732e156fe31801c4f43396bd3ca0c2a7f6f83d7936798531b9848d103381aa"}, ] [package.dependencies] -async-timeout = ">=4.0.2" +async-timeout = {version = ">=4.0.2", markers = "python_version < \"3.11\""} [package.extras] hiredis = ["hiredis (>=1.0.0)"] @@ -2233,100 +2207,72 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" [[package]] name = "regex" -version = "2022.10.31" +version = "2023.3.23" description = "Alternative regular expression module, to replace re." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "regex-2022.10.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a8ff454ef0bb061e37df03557afda9d785c905dab15584860f982e88be73015f"}, - {file = "regex-2022.10.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1eba476b1b242620c266edf6325b443a2e22b633217a9835a52d8da2b5c051f9"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0e5af9a9effb88535a472e19169e09ce750c3d442fb222254a276d77808620b"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d03fe67b2325cb3f09be029fd5da8df9e6974f0cde2c2ac6a79d2634e791dd57"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9d0b68ac1743964755ae2d89772c7e6fb0118acd4d0b7464eaf3921c6b49dd4"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a45b6514861916c429e6059a55cf7db74670eaed2052a648e3e4d04f070e001"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8b0886885f7323beea6f552c28bff62cbe0983b9fbb94126531693ea6c5ebb90"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5aefb84a301327ad115e9d346c8e2760009131d9d4b4c6b213648d02e2abe144"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:702d8fc6f25bbf412ee706bd73019da5e44a8400861dfff7ff31eb5b4a1276dc"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a3c1ebd4ed8e76e886507c9eddb1a891673686c813adf889b864a17fafcf6d66"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:50921c140561d3db2ab9f5b11c5184846cde686bb5a9dc64cae442926e86f3af"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:7db345956ecce0c99b97b042b4ca7326feeec6b75facd8390af73b18e2650ffc"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:763b64853b0a8f4f9cfb41a76a4a85a9bcda7fdda5cb057016e7706fde928e66"}, - {file = "regex-2022.10.31-cp310-cp310-win32.whl", hash = "sha256:44136355e2f5e06bf6b23d337a75386371ba742ffa771440b85bed367c1318d1"}, - {file = "regex-2022.10.31-cp310-cp310-win_amd64.whl", hash = "sha256:bfff48c7bd23c6e2aec6454aaf6edc44444b229e94743b34bdcdda2e35126cf5"}, - {file = "regex-2022.10.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b4b1fe58cd102d75ef0552cf17242705ce0759f9695334a56644ad2d83903fe"}, - {file = "regex-2022.10.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:542e3e306d1669b25936b64917285cdffcd4f5c6f0247636fec037187bd93542"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c27cc1e4b197092e50ddbf0118c788d9977f3f8f35bfbbd3e76c1846a3443df7"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8e38472739028e5f2c3a4aded0ab7eadc447f0d84f310c7a8bb697ec417229e"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76c598ca73ec73a2f568e2a72ba46c3b6c8690ad9a07092b18e48ceb936e9f0c"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c28d3309ebd6d6b2cf82969b5179bed5fefe6142c70f354ece94324fa11bf6a1"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9af69f6746120998cd9c355e9c3c6aec7dff70d47247188feb4f829502be8ab4"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a5f9505efd574d1e5b4a76ac9dd92a12acb2b309551e9aa874c13c11caefbe4f"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5ff525698de226c0ca743bfa71fc6b378cda2ddcf0d22d7c37b1cc925c9650a5"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4fe7fda2fe7c8890d454f2cbc91d6c01baf206fbc96d89a80241a02985118c0c"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:2cdc55ca07b4e70dda898d2ab7150ecf17c990076d3acd7a5f3b25cb23a69f1c"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:44a6c2f6374e0033873e9ed577a54a3602b4f609867794c1a3ebba65e4c93ee7"}, - {file = "regex-2022.10.31-cp311-cp311-win32.whl", hash = "sha256:d8716f82502997b3d0895d1c64c3b834181b1eaca28f3f6336a71777e437c2af"}, - {file = "regex-2022.10.31-cp311-cp311-win_amd64.whl", hash = "sha256:61edbca89aa3f5ef7ecac8c23d975fe7261c12665f1d90a6b1af527bba86ce61"}, - {file = "regex-2022.10.31-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a069c8483466806ab94ea9068c34b200b8bfc66b6762f45a831c4baaa9e8cdd"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d26166acf62f731f50bdd885b04b38828436d74e8e362bfcb8df221d868b5d9b"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac741bf78b9bb432e2d314439275235f41656e189856b11fb4e774d9f7246d81"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75f591b2055523fc02a4bbe598aa867df9e953255f0b7f7715d2a36a9c30065c"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bddd61d2a3261f025ad0f9ee2586988c6a00c780a2fb0a92cea2aa702c54"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef4163770525257876f10e8ece1cf25b71468316f61451ded1a6f44273eedeb5"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7b280948d00bd3973c1998f92e22aa3ecb76682e3a4255f33e1020bd32adf443"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:d0213671691e341f6849bf33cd9fad21f7b1cb88b89e024f33370733fec58742"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:22e7ebc231d28393dfdc19b185d97e14a0f178bedd78e85aad660e93b646604e"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:8ad241da7fac963d7573cc67a064c57c58766b62a9a20c452ca1f21050868dfa"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:586b36ebda81e6c1a9c5a5d0bfdc236399ba6595e1397842fd4a45648c30f35e"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0653d012b3bf45f194e5e6a41df9258811ac8fc395579fa82958a8b76286bea4"}, - {file = "regex-2022.10.31-cp36-cp36m-win32.whl", hash = "sha256:144486e029793a733e43b2e37df16a16df4ceb62102636ff3db6033994711066"}, - {file = "regex-2022.10.31-cp36-cp36m-win_amd64.whl", hash = "sha256:c14b63c9d7bab795d17392c7c1f9aaabbffd4cf4387725a0ac69109fb3b550c6"}, - {file = "regex-2022.10.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4cac3405d8dda8bc6ed499557625585544dd5cbf32072dcc72b5a176cb1271c8"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23cbb932cc53a86ebde0fb72e7e645f9a5eec1a5af7aa9ce333e46286caef783"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74bcab50a13960f2a610cdcd066e25f1fd59e23b69637c92ad470784a51b1347"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78d680ef3e4d405f36f0d6d1ea54e740366f061645930072d39bca16a10d8c93"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce6910b56b700bea7be82c54ddf2e0ed792a577dfaa4a76b9af07d550af435c6"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:659175b2144d199560d99a8d13b2228b85e6019b6e09e556209dfb8c37b78a11"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1ddf14031a3882f684b8642cb74eea3af93a2be68893901b2b387c5fd92a03ec"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b683e5fd7f74fb66e89a1ed16076dbab3f8e9f34c18b1979ded614fe10cdc4d9"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2bde29cc44fa81c0a0c8686992c3080b37c488df167a371500b2a43ce9f026d1"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4919899577ba37f505aaebdf6e7dc812d55e8f097331312db7f1aab18767cce8"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:9c94f7cc91ab16b36ba5ce476f1904c91d6c92441f01cd61a8e2729442d6fcf5"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ae1e96785696b543394a4e3f15f3f225d44f3c55dafe3f206493031419fedf95"}, - {file = "regex-2022.10.31-cp37-cp37m-win32.whl", hash = "sha256:c670f4773f2f6f1957ff8a3962c7dd12e4be54d05839b216cb7fd70b5a1df394"}, - {file = "regex-2022.10.31-cp37-cp37m-win_amd64.whl", hash = "sha256:8e0caeff18b96ea90fc0eb6e3bdb2b10ab5b01a95128dfeccb64a7238decf5f0"}, - {file = "regex-2022.10.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:131d4be09bea7ce2577f9623e415cab287a3c8e0624f778c1d955ec7c281bd4d"}, - {file = "regex-2022.10.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e613a98ead2005c4ce037c7b061f2409a1a4e45099edb0ef3200ee26ed2a69a8"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052b670fafbe30966bbe5d025e90b2a491f85dfe5b2583a163b5e60a85a321ad"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa62a07ac93b7cb6b7d0389d8ef57ffc321d78f60c037b19dfa78d6b17c928ee"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5352bea8a8f84b89d45ccc503f390a6be77917932b1c98c4cdc3565137acc714"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20f61c9944f0be2dc2b75689ba409938c14876c19d02f7585af4460b6a21403e"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29c04741b9ae13d1e94cf93fca257730b97ce6ea64cfe1eba11cf9ac4e85afb6"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:543883e3496c8b6d58bd036c99486c3c8387c2fc01f7a342b760c1ea3158a318"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7a8b43ee64ca8f4befa2bea4083f7c52c92864d8518244bfa6e88c751fa8fff"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6a9a19bea8495bb419dc5d38c4519567781cd8d571c72efc6aa959473d10221a"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6ffd55b5aedc6f25fd8d9f905c9376ca44fcf768673ffb9d160dd6f409bfda73"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4bdd56ee719a8f751cf5a593476a441c4e56c9b64dc1f0f30902858c4ef8771d"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ca88da1bd78990b536c4a7765f719803eb4f8f9971cc22d6ca965c10a7f2c4c"}, - {file = "regex-2022.10.31-cp38-cp38-win32.whl", hash = "sha256:5a260758454580f11dd8743fa98319bb046037dfab4f7828008909d0aa5292bc"}, - {file = "regex-2022.10.31-cp38-cp38-win_amd64.whl", hash = "sha256:5e6a5567078b3eaed93558842346c9d678e116ab0135e22eb72db8325e90b453"}, - {file = "regex-2022.10.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5217c25229b6a85049416a5c1e6451e9060a1edcf988641e309dbe3ab26d3e49"}, - {file = "regex-2022.10.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4bf41b8b0a80708f7e0384519795e80dcb44d7199a35d52c15cc674d10b3081b"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf0da36a212978be2c2e2e2d04bdff46f850108fccc1851332bcae51c8907cc"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d403d781b0e06d2922435ce3b8d2376579f0c217ae491e273bab8d092727d244"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a37d51fa9a00d265cf73f3de3930fa9c41548177ba4f0faf76e61d512c774690"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4f781ffedd17b0b834c8731b75cce2639d5a8afe961c1e58ee7f1f20b3af185"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d243b36fbf3d73c25e48014961e83c19c9cc92530516ce3c43050ea6276a2ab7"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:370f6e97d02bf2dd20d7468ce4f38e173a124e769762d00beadec3bc2f4b3bc4"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:597f899f4ed42a38df7b0e46714880fb4e19a25c2f66e5c908805466721760f5"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7dbdce0c534bbf52274b94768b3498abdf675a691fec5f751b6057b3030f34c1"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:22960019a842777a9fa5134c2364efaed5fbf9610ddc5c904bd3a400973b0eb8"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7f5a3ffc731494f1a57bd91c47dc483a1e10048131ffb52d901bfe2beb6102e8"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7ef6b5942e6bfc5706301a18a62300c60db9af7f6368042227ccb7eeb22d0892"}, - {file = "regex-2022.10.31-cp39-cp39-win32.whl", hash = "sha256:395161bbdbd04a8333b9ff9763a05e9ceb4fe210e3c7690f5e68cedd3d65d8e1"}, - {file = "regex-2022.10.31-cp39-cp39-win_amd64.whl", hash = "sha256:957403a978e10fb3ca42572a23e6f7badff39aa1ce2f4ade68ee452dc6807692"}, - {file = "regex-2022.10.31.tar.gz", hash = "sha256:a3a98921da9a1bf8457aeee6a551948a83601689e5ecdd736894ea9bbec77e83"}, + {file = "regex-2023.3.23-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:845a5e2d84389c4ddada1a9b95c055320070f18bb76512608374aca00d22eca8"}, + {file = "regex-2023.3.23-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:87d9951f5a538dd1d016bdc0dcae59241d15fa94860964833a54d18197fcd134"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37ae17d3be44c0b3f782c28ae9edd8b47c1f1776d4cabe87edc0b98e1f12b021"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b8eb1e3bca6b48dc721818a60ae83b8264d4089a4a41d62be6d05316ec38e15"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df45fac182ebc3c494460c644e853515cc24f5ad9da05f8ffb91da891bfee879"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7006105b10b59971d3b248ad75acc3651c7e4cf54d81694df5a5130a3c3f7ea"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93f3f1aa608380fe294aa4cb82e2afda07a7598e828d0341e124b8fd9327c715"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787954f541ab95d8195d97b0b8cf1dc304424adb1e07365967e656b92b38a699"}, + {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:20abe0bdf03630fe92ccafc45a599bca8b3501f48d1de4f7d121153350a2f77d"}, + {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11d00c31aeab9a6e0503bc77e73ed9f4527b3984279d997eb145d7c7be6268fd"}, + {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d5bbe0e1511b844794a3be43d6c145001626ba9a6c1db8f84bdc724e91131d9d"}, + {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ea3c0cb56eadbf4ab2277e7a095676370b3e46dbfc74d5c383bd87b0d6317910"}, + {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d895b4c863059a4934d3e874b90998df774644a41b349ebb330f85f11b4ef2c0"}, + {file = "regex-2023.3.23-cp310-cp310-win32.whl", hash = "sha256:9d764514d19b4edcc75fd8cb1423448ef393e8b6cbd94f38cab983ab1b75855d"}, + {file = "regex-2023.3.23-cp310-cp310-win_amd64.whl", hash = "sha256:11d1f2b7a0696dc0310de0efb51b1f4d813ad4401fe368e83c0c62f344429f98"}, + {file = "regex-2023.3.23-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8a9c63cde0eaa345795c0fdeb19dc62d22e378c50b0bc67bf4667cd5b482d98b"}, + {file = "regex-2023.3.23-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dd7200b4c27b68cf9c9646da01647141c6db09f48cc5b51bc588deaf8e98a797"}, + {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22720024b90a6ba673a725dcc62e10fb1111b889305d7c6b887ac7466b74bedb"}, + {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b190a339090e6af25f4a5fd9e77591f6d911cc7b96ecbb2114890b061be0ac1"}, + {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e76b6fc0d8e9efa39100369a9b3379ce35e20f6c75365653cf58d282ad290f6f"}, + {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7868b8f218bf69a2a15402fde08b08712213a1f4b85a156d90473a6fb6b12b09"}, + {file = "regex-2023.3.23-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2472428efc4127374f494e570e36b30bb5e6b37d9a754f7667f7073e43b0abdd"}, + {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c37df2a060cb476d94c047b18572ee2b37c31f831df126c0da3cd9227b39253d"}, + {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4479f9e2abc03362df4045b1332d4a2b7885b245a30d4f4b051c4083b97d95d8"}, + {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e2396e0678167f2d0c197da942b0b3fb48fee2f0b5915a0feb84d11b6686afe6"}, + {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:75f288c60232a5339e0ff2fa05779a5e9c74e9fc085c81e931d4a264501e745b"}, + {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c869260aa62cee21c5eb171a466c0572b5e809213612ef8d495268cd2e34f20d"}, + {file = "regex-2023.3.23-cp311-cp311-win32.whl", hash = "sha256:25f0532fd0c53e96bad84664171969de9673b4131f2297f1db850d3918d58858"}, + {file = "regex-2023.3.23-cp311-cp311-win_amd64.whl", hash = "sha256:5ccfafd98473e007cebf7da10c1411035b7844f0f204015efd050601906dbb53"}, + {file = "regex-2023.3.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6572ff287176c0fb96568adb292674b421fa762153ed074d94b1d939ed92c253"}, + {file = "regex-2023.3.23-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a610e0adfcb0fc84ea25f6ea685e39e74cbcd9245a72a9a7aab85ff755a5ed27"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086afe222d58b88b62847bdbd92079b4699350b4acab892f88a935db5707c790"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79e29fd62fa2f597a6754b247356bda14b866131a22444d67f907d6d341e10f3"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c07ce8e9eee878a48ebeb32ee661b49504b85e164b05bebf25420705709fdd31"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b036f401895e854de9fefe061518e78d506d8a919cc250dc3416bca03f6f9a"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78ac8dd8e18800bb1f97aad0d73f68916592dddf233b99d2b5cabc562088503a"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:539dd010dc35af935b32f248099e38447bbffc10b59c2b542bceead2bed5c325"}, + {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9bf4a5626f2a0ea006bf81e8963f498a57a47d58907eaa58f4b3e13be68759d8"}, + {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf86b4328c204c3f315074a61bc1c06f8a75a8e102359f18ce99fbcbbf1951f0"}, + {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:2848bf76673c83314068241c8d5b7fa9ad9bed866c979875a0e84039349e8fa7"}, + {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c125a02d22c555e68f7433bac8449992fa1cead525399f14e47c2d98f2f0e467"}, + {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cd1671e9d5ac05ce6aa86874dd8dfa048824d1dbe73060851b310c6c1a201a96"}, + {file = "regex-2023.3.23-cp38-cp38-win32.whl", hash = "sha256:fffe57312a358be6ec6baeb43d253c36e5790e436b7bf5b7a38df360363e88e9"}, + {file = "regex-2023.3.23-cp38-cp38-win_amd64.whl", hash = "sha256:dbb3f87e15d3dd76996d604af8678316ad2d7d20faa394e92d9394dfd621fd0c"}, + {file = "regex-2023.3.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c88e8c226473b5549fe9616980ea7ca09289246cfbdf469241edf4741a620004"}, + {file = "regex-2023.3.23-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6560776ec19c83f3645bbc5db64a7a5816c9d8fb7ed7201c5bcd269323d88072"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b1fc2632c01f42e06173d8dd9bb2e74ab9b0afa1d698058c867288d2c7a31f3"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fdf7ad455f1916b8ea5cdbc482d379f6daf93f3867b4232d14699867a5a13af7"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5fc33b27b1d800fc5b78d7f7d0f287e35079ecabe68e83d46930cf45690e1c8c"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c49552dc938e3588f63f8a78c86f3c9c75301e813bca0bef13bdb4b87ccf364"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e152461e9a0aedec7d37fc66ec0fa635eca984777d3d3c3e36f53bf3d3ceb16e"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db034255e72d2995cf581b14bb3fc9c00bdbe6822b49fcd4eef79e1d5f232618"}, + {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:55ae114da21b7a790b90255ea52d2aa3a0d121a646deb2d3c6a3194e722fc762"}, + {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ef3f528fe1cc3d139508fe1b22523745aa77b9d6cb5b0bf277f48788ee0b993f"}, + {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:a81c9ec59ca2303acd1ccd7b9ac409f1e478e40e96f8f79b943be476c5fdb8bb"}, + {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cde09c4fdd070772aa2596d97e942eb775a478b32459e042e1be71b739d08b77"}, + {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3cd9f5dd7b821f141d3a6ca0d5d9359b9221e4f051ca3139320adea9f1679691"}, + {file = "regex-2023.3.23-cp39-cp39-win32.whl", hash = "sha256:7304863f3a652dab5e68e6fb1725d05ebab36ec0390676d1736e0571ebb713ef"}, + {file = "regex-2023.3.23-cp39-cp39-win_amd64.whl", hash = "sha256:54c3fa855a3f7438149de3211738dd9b5f0c733f48b54ae05aa7fce83d48d858"}, + {file = "regex-2023.3.23.tar.gz", hash = "sha256:dc80df325b43ffea5cdea2e3eaa97a44f3dd298262b1c7fe9dbb2a9522b956a7"}, ] [[package]] @@ -2475,7 +2421,7 @@ interactions = {git = "https://github.com/interactions-py/interactions.py", rev type = "git" url = "https://github.com/zevaryx/statipy" reference = "main" -resolved_reference = "b73d7812e29e2dc8290b869bc94b029c7c1ec3e9" +resolved_reference = "9bc2f910dafd7702d275185a8b96187c6ab1f8fb" [[package]] name = "thefuzz" @@ -2594,14 +2540,14 @@ files = [ [[package]] name = "tzlocal" -version = "4.2" +version = "4.3" description = "tzinfo object for the local timezone" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "tzlocal-4.2-py3-none-any.whl", hash = "sha256:89885494684c929d9191c57aa27502afc87a579be5cdd3225c77c463ea043745"}, - {file = "tzlocal-4.2.tar.gz", hash = "sha256:ee5842fa3a795f023514ac2d801c4a81d1743bbe642e3940143326b3a00addd7"}, + {file = "tzlocal-4.3-py3-none-any.whl", hash = "sha256:b44c4388f3d34f25862cfbb387578a4d70fec417649da694a132f628a23367e2"}, + {file = "tzlocal-4.3.tar.gz", hash = "sha256:3f21d09e1b2aa9f2dacca12da240ca37de3ba5237a93addfd6d593afe9073355"}, ] [package.dependencies] @@ -2609,8 +2555,7 @@ pytz-deprecation-shim = "*" tzdata = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -devenv = ["black", "pyroma", "pytest-cov", "zest.releaser"] -test = ["pytest (>=4.3)", "pytest-mock (>=3.3)"] +devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] [[package]] name = "ulid-py" @@ -2705,40 +2650,39 @@ test = ["covdefaults (>=2.2.2)", "coverage (>=7.1)", "coverage-enable-subprocess [[package]] name = "watchdog" -version = "2.3.1" +version = "3.0.0" description = "Filesystem events monitoring" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "watchdog-2.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1f1200d4ec53b88bf04ab636f9133cb703eb19768a39351cee649de21a33697"}, - {file = "watchdog-2.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:564e7739abd4bd348aeafbf71cc006b6c0ccda3160c7053c4a53b67d14091d42"}, - {file = "watchdog-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:95ad708a9454050a46f741ba5e2f3468655ea22da1114e4c40b8cbdaca572565"}, - {file = "watchdog-2.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a073c91a6ef0dda488087669586768195c3080c66866144880f03445ca23ef16"}, - {file = "watchdog-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa8b028750b43e80eea9946d01925168eeadb488dfdef1d82be4b1e28067f375"}, - {file = "watchdog-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:964fd236cd443933268ae49b59706569c8b741073dbfd7ca705492bae9d39aab"}, - {file = "watchdog-2.3.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:91fd146d723392b3e6eb1ac21f122fcce149a194a2ba0a82c5e4d0ee29cd954c"}, - {file = "watchdog-2.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:efe3252137392a471a2174d721e1037a0e6a5da7beb72a021e662b7000a9903f"}, - {file = "watchdog-2.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:85bf2263290591b7c5fa01140601b64c831be88084de41efbcba6ea289874f44"}, - {file = "watchdog-2.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f2df370cd8e4e18499dd0bfdef476431bcc396108b97195d9448d90924e3131"}, - {file = "watchdog-2.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ea5d86d1bcf4a9d24610aa2f6f25492f441960cf04aed2bd9a97db439b643a7b"}, - {file = "watchdog-2.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6f5d0f7eac86807275eba40b577c671b306f6f335ba63a5c5a348da151aba0fc"}, - {file = "watchdog-2.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b848c71ef2b15d0ef02f69da8cc120d335cec0ed82a3fa7779e27a5a8527225"}, - {file = "watchdog-2.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0d9878be36d2b9271e3abaa6f4f051b363ff54dbbe7e7df1af3c920e4311ee43"}, - {file = "watchdog-2.3.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4cd61f98cb37143206818cb1786d2438626aa78d682a8f2ecee239055a9771d5"}, - {file = "watchdog-2.3.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3d2dbcf1acd96e7a9c9aefed201c47c8e311075105d94ce5e899f118155709fd"}, - {file = "watchdog-2.3.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03f342a9432fe08107defbe8e405a2cb922c5d00c4c6c168c68b633c64ce6190"}, - {file = "watchdog-2.3.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7a596f9415a378d0339681efc08d2249e48975daae391d58f2e22a3673b977cf"}, - {file = "watchdog-2.3.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:0e1dd6d449267cc7d6935d7fe27ee0426af6ee16578eed93bacb1be9ff824d2d"}, - {file = "watchdog-2.3.1-py3-none-manylinux2014_i686.whl", hash = "sha256:7a1876f660e32027a1a46f8a0fa5747ad4fcf86cb451860eae61a26e102c8c79"}, - {file = "watchdog-2.3.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:2caf77ae137935c1466f8cefd4a3aec7017b6969f425d086e6a528241cba7256"}, - {file = "watchdog-2.3.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:53f3e95081280898d9e4fc51c5c69017715929e4eea1ab45801d5e903dd518ad"}, - {file = "watchdog-2.3.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:9da7acb9af7e4a272089bd2af0171d23e0d6271385c51d4d9bde91fe918c53ed"}, - {file = "watchdog-2.3.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8a4d484e846dcd75e96b96d80d80445302621be40e293bfdf34a631cab3b33dc"}, - {file = "watchdog-2.3.1-py3-none-win32.whl", hash = "sha256:a74155398434937ac2780fd257c045954de5b11b5c52fc844e2199ce3eecf4cf"}, - {file = "watchdog-2.3.1-py3-none-win_amd64.whl", hash = "sha256:5defe4f0918a2a1a4afbe4dbb967f743ac3a93d546ea4674567806375b024adb"}, - {file = "watchdog-2.3.1-py3-none-win_ia64.whl", hash = "sha256:4109cccf214b7e3462e8403ab1e5b17b302ecce6c103eb2fc3afa534a7f27b96"}, - {file = "watchdog-2.3.1.tar.gz", hash = "sha256:d9f9ed26ed22a9d331820a8432c3680707ea8b54121ddcc9dc7d9f2ceeb36906"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, + {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, + {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, + {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, + {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, + {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, + {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, + {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, + {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, ] [package.extras] @@ -2942,4 +2886,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = ">=3.10,<4" -content-hash = "973d2a4a3018b5b46a43a44e3d7f3c05b80b5b03a67cc77ccb75bb10194ff646" +content-hash = "a557982b4ff57231c0e25cf53e760e49173fae268fb840e891ff4fe78436d3be" diff --git a/pyproject.toml b/pyproject.toml index ef907d4..4b5d0d4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,6 +31,8 @@ redis = "^4.4.0" interactions = {git = "https://github.com/interactions-py/interactions.py", rev = "5.x"} statipy = {git = "https://github.com/zevaryx/statipy", rev = "main"} beanie = "^1.17.0" +pydantic = "^1.10.7" +orjson = "^3.8.8" [tool.poetry.dev-dependencies] black = {version = "^22.3.0", allow-prereleases = true} @@ -38,6 +40,7 @@ black = {version = "^22.3.0", allow-prereleases = true} [tool.poetry.group.dev.dependencies] pre-commit = "^2.21.0" pandas = "^1.5.3" +black = "^23.1.0" [build-system] requires = ["poetry-core>=1.0.0"]