Finalize NAFF 2.0 migration

This commit is contained in:
Zeva Rose 2022-12-29 12:50:04 -07:00
parent b4fd6b1f5b
commit db640578df
11 changed files with 97 additions and 100 deletions

View file

@ -81,8 +81,10 @@ async def run() -> None:
) )
# External modules # External modules
if jconfig.log_level == "DEBUG": if jconfig.jurigged:
logging.addLevelName(11, "\033[35mJURIG\033[0m ") logging.addLevelName(11, "\033[35mJURIG\033[0m ")
if jconfig.log_level == "INFO":
logger.setLevel(11)
jurigged.watch(pattern="jarvis/*.py", logger=partial(jlogger, logger)) jurigged.watch(pattern="jarvis/*.py", logger=partial(jlogger, logger))
# Initialize bot # Initialize bot

View file

@ -10,17 +10,17 @@ from jarvis.utils import build_embed
class ComponentEventMixin: class ComponentEventMixin:
async def _handle_modcase_button(self, event: ButtonPressed) -> None: async def _handle_modcase_button(self, event: ButtonPressed) -> bool:
context = event.context context = event.ctx
if not context.custom_id.startswith("modcase|"): if not context.custom_id.startswith("modcase|"):
return # Failsafe return False # Failsafe
if not context.deferred and not context.responded: if not context.deferred and not context.responded:
await context.defer(ephemeral=True) await context.defer(ephemeral=True)
if not context.author.has_permission(Permissions.MODERATE_MEMBERS): if not context.author.has_permission(Permissions.MODERATE_MEMBERS):
return return False
user_key = f"msg|{context.message.id}" user_key = f"msg|{context.message.id}"
action_key = "" action_key = ""
@ -79,11 +79,13 @@ class ComponentEventMixin:
await self.redis.delete(user_key) await self.redis.delete(user_key)
await self.redis.delete(action_key) await self.redis.delete(action_key)
async def _handle_delete_button(self, event: ButtonPressed) -> None: return True
context = event.context
async def _handle_delete_button(self, event: ButtonPressed) -> bool:
context = event.ctx
if not context.custom_id.startswith("delete|"): if not context.custom_id.startswith("delete|"):
return # Failsafe return False # Failsafe
if not context.deferred and not context.responded: if not context.deferred and not context.responded:
await context.defer(ephemeral=True) await context.defer(ephemeral=True)
@ -96,19 +98,20 @@ class ComponentEventMixin:
and not str(context.author.id) == uid and not str(context.author.id) == uid
): ):
await context.send("I'm afraid I can't let you do that", ephemeral=True) await context.send("I'm afraid I can't let you do that", ephemeral=True)
return # User does not have perms to delete return True # User does not have perms to delete
if star := await Star.find_one(q(star=context.message.id, guild=context.guild.id)): if star := await Star.find_one(q(star=context.message.id, guild=context.guild.id)):
await star.delete() await star.delete()
await context.message.delete() await context.message.delete()
await context.send("Message deleted", ephemeral=True) await context.send("Message deleted", ephemeral=True)
return True
async def _handle_copy_button(self, event: ButtonPressed) -> None: async def _handle_copy_button(self, event: ButtonPressed) -> bool:
context = event.context context = event.ctx
if not context.custom_id.startswith("copy|"): if not context.custom_id.startswith("copy|"):
return return False
if not context.deferred and not context.responded: if not context.deferred and not context.responded:
await context.defer(ephemeral=True) await context.defer(ephemeral=True)
@ -130,10 +133,12 @@ class ComponentEventMixin:
await context.send("Reminder copied!", ephemeral=True) await context.send("Reminder copied!", ephemeral=True)
async def _handle_phishlist_button(self, event: ButtonPressed) -> None: return True
context = event.context
async def _handle_phishlist_button(self, event: ButtonPressed) -> bool:
context = event.ctx
if not context.custom_id.startswith("pl|"): if not context.custom_id.startswith("pl|"):
return return False
if not context.deferred and not context.responded: if not context.deferred and not context.responded:
await context.defer(ephemeral=True) await context.defer(ephemeral=True)
@ -143,7 +148,7 @@ class ComponentEventMixin:
pl = await Phishlist.find_one(q(_id=id_)) pl = await Phishlist.find_one(q(_id=id_))
if not pl: if not pl:
self.logger.warn(f"Phishlist {id_} does not exist!") self.logger.warn(f"Phishlist {id_} does not exist!")
return return False
pl.valid = valid pl.valid = valid
pl.confirmed = True pl.confirmed = True
@ -159,11 +164,16 @@ class ComponentEventMixin:
await context.message.edit(components=context.message.components, embeds=embed) await context.message.edit(components=context.message.components, embeds=embed)
await context.send("Confirmed! Thank you for confirming this URL.") await context.send("Confirmed! Thank you for confirming this URL.")
return True
@listen() @listen()
async def on_button(self, event: ButtonPressed) -> None: async def on_button(self, event: ButtonPressed) -> None:
"""Process button events.""" """Process button events."""
await self._handle_modcase_button(event) modcase = await self._handle_modcase_button(event)
await self._handle_delete_button(event) delete = await self._handle_delete_button(event)
await self._handle_copy_button(event) copy = await self._handle_copy_button(event)
await self._handle_phishlist_button(event) phishlist = await self._handle_phishlist_button(event)
if not any([modcase, delete, copy, phishlist]):
# self.logger.warn(f"Unhandled ButtonPressed event: {event.ctx.custom_id}")
pass

View file

@ -30,4 +30,4 @@ class TaskMixin:
if domain in self.phishing_domains: if domain in self.phishing_domains:
sub -= 1 sub -= 1
self.phishing_domains.remove(domain) self.phishing_domains.remove(domain)
self.logger.debug(f"{add} additions, {sub} removals") self.logger.info(f"{add} additions, {sub} removals")

View file

@ -33,6 +33,7 @@ CURRENCIES = (
"CNY", "CNY",
"CZK", "CZK",
"DKK", "DKK",
"EUR",
"GBP", "GBP",
"HKD", "HKD",
"HRK", "HRK",
@ -167,6 +168,7 @@ class CalcCog(Extension):
conv = value * rate conv = value * rate
fields = ( fields = (
EmbedField(name="Conversion Rate", value=f"1 {from_currency} ~= {rate:0.4f} {to_currency}"),
EmbedField(name=from_currency, value=f"{value:0.2f}"), EmbedField(name=from_currency, value=f"{value:0.2f}"),
EmbedField(name=to_currency, value=f"{conv:0.2f}"), EmbedField(name=to_currency, value=f"{conv:0.2f}"),
) )

View file

@ -223,11 +223,11 @@ class RedditCog(Extension):
try: try:
context = await self.bot.wait_for_component( context = await self.bot.wait_for_component(
check=lambda x: ctx.author.id == x.context.author.id, check=lambda x: ctx.author.id == x.ctx.author.id,
messages=message, messages=message,
timeout=60 * 5, timeout=60 * 5,
) )
for to_delete in context.context.values: for to_delete in context.ctx.values:
follow = get(redditors, guild=ctx.guild.id, name=names[int(to_delete)]) follow = get(redditors, guild=ctx.guild.id, name=names[int(to_delete)])
try: try:
await follow.delete() await follow.delete()
@ -237,8 +237,8 @@ class RedditCog(Extension):
for component in row.components: for component in row.components:
component.disabled = True component.disabled = True
block = "\n".join(names[int(x)] for x in context.context.values) block = "\n".join(names[int(x)] for x in context.ctx.values)
await context.context.edit_origin( await context.ctx.edit_origin(
content=f"Unfollowed the following:\n```\n{block}\n```", components=components content=f"Unfollowed the following:\n```\n{block}\n```", components=components
) )
except asyncio.TimeoutError: except asyncio.TimeoutError:
@ -342,11 +342,11 @@ class RedditCog(Extension):
try: try:
context = await self.bot.wait_for_component( context = await self.bot.wait_for_component(
check=lambda x: ctx.author.id == x.context.author.id, check=lambda x: ctx.author.id == x.ctx.author.id,
messages=message, messages=message,
timeout=60 * 5, timeout=60 * 5,
) )
for to_delete in context.context.values: for to_delete in context.ctx.values:
follow = get(subreddits, guild=ctx.guild.id, display_name=names[int(to_delete)]) follow = get(subreddits, guild=ctx.guild.id, display_name=names[int(to_delete)])
try: try:
await follow.delete() await follow.delete()
@ -356,8 +356,8 @@ class RedditCog(Extension):
for component in row.components: for component in row.components:
component.disabled = True component.disabled = True
block = "\n".join(names[int(x)] for x in context.context.values) block = "\n".join(names[int(x)] for x in context.ctx.values)
await context.context.edit_origin( await context.ctx.edit_origin(
content=f"Unfollowed the following:\n```\n{block}\n```", components=components content=f"Unfollowed the following:\n```\n{block}\n```", components=components
) )
except asyncio.TimeoutError: except asyncio.TimeoutError:

View file

@ -241,13 +241,13 @@ class RolegiverCog(Extension):
try: try:
context = await self.bot.wait_for_component( context = await self.bot.wait_for_component(
check=lambda x: ctx.author.id == x.context.author.id, check=lambda x: ctx.author.id == x.ctx.author.id,
messages=message, messages=message,
timeout=60 * 5, timeout=60 * 5,
) )
added_roles = [] added_roles = []
for role in context.context.values: for role in context.ctx.values:
role = await ctx.guild.fetch_role(int(role)) role = await ctx.guild.fetch_role(int(role))
added_roles.append(role) added_roles.append(role)
await ctx.author.add_role(role, reason="Rolegiver") await ctx.author.add_role(role, reason="Rolegiver")
@ -282,7 +282,7 @@ class RolegiverCog(Extension):
for component in row.components: for component in row.components:
component.disabled = True component.disabled = True
await context.context.edit_origin(embeds=embed, content="\u200b", components=components) await context.ctx.edit_origin(embeds=embed, content="\u200b", components=components)
except asyncio.TimeoutError: except asyncio.TimeoutError:
for row in components: for row in components:
for component in row.components: for component in row.components:
@ -321,13 +321,13 @@ class RolegiverCog(Extension):
try: try:
context = await self.bot.wait_for_component( context = await self.bot.wait_for_component(
check=lambda x: ctx.author.id == x.context.author.id, check=lambda x: ctx.author.id == x.ctx.author.id,
messages=message, messages=message,
timeout=60 * 5, timeout=60 * 5,
) )
removed_roles = [] removed_roles = []
for to_remove in context.context.values: for to_remove in context.ctx.values:
role = get(user_roles, id=int(to_remove)) role = get(user_roles, id=int(to_remove))
await ctx.author.remove_role(role, reason="Rolegiver") await ctx.author.remove_role(role, reason="Rolegiver")
user_roles.remove(role) user_roles.remove(role)
@ -358,7 +358,7 @@ class RolegiverCog(Extension):
for component in row.components: for component in row.components:
component.disabled = True component.disabled = True
await context.context.edit_origin(embeds=embed, components=components, content="\u200b") await context.ctx.edit_origin(embeds=embed, components=components, content="\u200b")
except asyncio.TimeoutError: except asyncio.TimeoutError:
for row in components: for row in components:

View file

@ -55,9 +55,7 @@ class SettingsCog(Extension):
sub_cmd_name="modlog", sub_cmd_name="modlog",
sub_cmd_description="Set Moglod channel", sub_cmd_description="Set Moglod channel",
) )
@slash_option( @slash_option(name="channel", description="ModLog Channel", opt_type=OptionTypes.CHANNEL, required=True)
name="channel", description="ModLog Channel", opt_type=OptionTypes.CHANNEL, required=True
)
@check(admin_or_permissions(Permissions.MANAGE_GUILD)) @check(admin_or_permissions(Permissions.MANAGE_GUILD))
async def _set_modlog(self, ctx: InteractionContext, channel: GuildText) -> None: async def _set_modlog(self, ctx: InteractionContext, channel: GuildText) -> None:
if not isinstance(channel, GuildText): if not isinstance(channel, GuildText):
@ -98,9 +96,7 @@ class SettingsCog(Extension):
await ctx.send(f"Settings applied. New massmention limit is {amount}") await ctx.send(f"Settings applied. New massmention limit is {amount}")
@set_.subcommand(sub_cmd_name="verified", sub_cmd_description="Set verified role") @set_.subcommand(sub_cmd_name="verified", sub_cmd_description="Set verified role")
@slash_option( @slash_option(name="role", description="Verified role", opt_type=OptionTypes.ROLE, required=True)
name="role", description="Verified role", opt_type=OptionTypes.ROLE, required=True
)
@check(admin_or_permissions(Permissions.MANAGE_GUILD)) @check(admin_or_permissions(Permissions.MANAGE_GUILD))
async def _set_verified(self, ctx: InteractionContext, role: Role) -> None: async def _set_verified(self, ctx: InteractionContext, role: Role) -> None:
if role.id == ctx.guild.id: if role.id == ctx.guild.id:
@ -117,9 +113,7 @@ class SettingsCog(Extension):
await ctx.send(f"Settings applied. New verified role is `{role.name}`") await ctx.send(f"Settings applied. New verified role is `{role.name}`")
@set_.subcommand(sub_cmd_name="unverified", sub_cmd_description="Set unverified role") @set_.subcommand(sub_cmd_name="unverified", sub_cmd_description="Set unverified role")
@slash_option( @slash_option(name="role", description="Unverified role", opt_type=OptionTypes.ROLE, required=True)
name="role", description="Unverified role", opt_type=OptionTypes.ROLE, required=True
)
@check(admin_or_permissions(Permissions.MANAGE_GUILD)) @check(admin_or_permissions(Permissions.MANAGE_GUILD))
async def _set_unverified(self, ctx: InteractionContext, role: Role) -> None: async def _set_unverified(self, ctx: InteractionContext, role: Role) -> None:
if role.id == ctx.guild.id: if role.id == ctx.guild.id:
@ -135,9 +129,7 @@ class SettingsCog(Extension):
await self.update_settings("unverified", role.id, ctx.guild.id) await self.update_settings("unverified", role.id, ctx.guild.id)
await ctx.send(f"Settings applied. New unverified role is `{role.name}`") await ctx.send(f"Settings applied. New unverified role is `{role.name}`")
@set_.subcommand( @set_.subcommand(sub_cmd_name="noinvite", sub_cmd_description="Set if invite deletion should happen")
sub_cmd_name="noinvite", sub_cmd_description="Set if invite deletion should happen"
)
@slash_option(name="active", description="Active?", opt_type=OptionTypes.BOOLEAN, required=True) @slash_option(name="active", description="Active?", opt_type=OptionTypes.BOOLEAN, required=True)
@check(admin_or_permissions(Permissions.MANAGE_GUILD)) @check(admin_or_permissions(Permissions.MANAGE_GUILD))
async def _set_invitedel(self, ctx: InteractionContext, active: bool) -> None: async def _set_invitedel(self, ctx: InteractionContext, active: bool) -> None:
@ -153,12 +145,8 @@ class SettingsCog(Extension):
await self.update_settings("notify", active, ctx.guild.id) await self.update_settings("notify", active, ctx.guild.id)
await ctx.send(f"Settings applied. Notifications active: {active}") await ctx.send(f"Settings applied. Notifications active: {active}")
@set_.subcommand( @set_.subcommand(sub_cmd_name="log_ignore", sub_cmd_description="Ignore a channel for ActivityLog")
sub_cmd_name="log_ignore", sub_cmd_description="Ignore a channel for ActivityLog" @slash_option(name="channel", description="Channel to ignore", opt_type=OptionTypes.CHANNEL, required=True)
)
@slash_option(
name="channel", description="Channel to ignore", opt_type=OptionTypes.CHANNEL, required=True
)
@check(admin_or_permissions(Permissions.MANAGE_GUILD)) @check(admin_or_permissions(Permissions.MANAGE_GUILD))
async def _add_log_ignore(self, ctx: InteractionContext, channel: GuildText) -> None: async def _add_log_ignore(self, ctx: InteractionContext, channel: GuildText) -> None:
if not isinstance(channel, GuildText): if not isinstance(channel, GuildText):
@ -218,9 +206,7 @@ class SettingsCog(Extension):
await self.delete_settings("unverified", ctx.guild.id) await self.delete_settings("unverified", ctx.guild.id)
await ctx.send("Setting `unverified` unset") await ctx.send("Setting `unverified` unset")
@unset.subcommand( @unset.subcommand(sub_cmd_name="noinvite", sub_cmd_description="Unset if invite deletion should happen")
sub_cmd_name="noinvite", sub_cmd_description="Unset if invite deletion should happen"
)
@check(admin_or_permissions(Permissions.MANAGE_GUILD)) @check(admin_or_permissions(Permissions.MANAGE_GUILD))
async def _unset_invitedel(self, ctx: InteractionContext, active: bool) -> None: async def _unset_invitedel(self, ctx: InteractionContext, active: bool) -> None:
await ctx.defer() await ctx.defer()
@ -234,9 +220,7 @@ class SettingsCog(Extension):
await self.delete_settings("notify", ctx.guild.id) await self.delete_settings("notify", ctx.guild.id)
await ctx.send("Setting `notify` unset") await ctx.send("Setting `notify` unset")
@unset.subcommand( @unset.subcommand(sub_cmd_name="log_ignore", sub_cmd_description="Add a channel for ActivityLog")
sub_cmd_name="log_ignore", sub_cmd_description="Add a channel for ActivityLog"
)
@slash_option( @slash_option(
name="channel", name="channel",
description="Channel to stop ignoring", description="Channel to stop ignoring",
@ -282,21 +266,15 @@ class SettingsCog(Extension):
if value: if value:
value = value.mention value = value.mention
else: else:
value = "||`[redacted]`||" await setting.delete()
continue
elif setting.setting in ["activitylog", "modlog"]: elif setting.setting in ["activitylog", "modlog"]:
value = await ctx.guild.fetch_channel(value) value = await ctx.guild.fetch_channel(value)
if value: if value:
value = value.mention value = value.mention
else: else:
value = "||`[redacted]`||" await setting.delete()
elif setting.setting == "rolegiver": continue
value = ""
for _role in setting.value:
nvalue = await ctx.guild.fetch_role(_role)
if nvalue:
value += "\n" + nvalue.mention
else:
value += "\n||`[redacted]`||"
elif setting.setting == "log_ignore": elif setting.setting == "log_ignore":
names = [] names = []
for v in setting.value: for v in setting.value:
@ -315,19 +293,18 @@ class SettingsCog(Extension):
async def _clear(self, ctx: InteractionContext) -> None: async def _clear(self, ctx: InteractionContext) -> None:
components = [ components = [
ActionRow( ActionRow(
Button(style=ButtonStyles.RED, emoji="✖️", custom_id="no"), Button(style=ButtonStyles.RED, emoji="✖️", custom_id=f"{ctx.guild.id}|set_clear|no"),
Button(style=ButtonStyles.GREEN, emoji="✔️", custom_id="yes"), Button(style=ButtonStyles.GREEN, emoji="✔️", custom_id=f"{ctx.guild.id}|set_clear|yes"),
) )
] ]
message = await ctx.send("***Are you sure?***", components=components) message = await ctx.send("***Are you sure?***", components=components)
try: try:
context = await self.bot.wait_for_component( context = await self.bot.wait_for_component(
check=lambda x: ctx.author.id == x.context.author.id, check=lambda x: ctx.author.id == x.ctx.author.id,
messages=message, messages=message,
timeout=60 * 5, timeout=60 * 5,
) )
content = "***Are you sure?***" if context.ctx.custom_id == f"{ctx.guild.id}|set_clear|yes":
if context.context.custom_id == "yes":
async for setting in Setting.find(q(guild=ctx.guild.id)): async for setting in Setting.find(q(guild=ctx.guild.id)):
await setting.delete() await setting.delete()
content = "Guild settings cleared" content = "Guild settings cleared"
@ -336,7 +313,7 @@ class SettingsCog(Extension):
for row in components: for row in components:
for component in row.components: for component in row.components:
component.disabled = True component.disabled = True
await context.context.edit_origin(content=content, components=components) await context.ctx.edit_origin(content=content, components=components)
except asyncio.TimeoutError: except asyncio.TimeoutError:
for row in components: for row in components:
for component in row.components: for component in row.components:

View file

@ -136,11 +136,11 @@ class TwitterCog(Extension):
try: try:
context = await self.bot.wait_for_component( context = await self.bot.wait_for_component(
check=lambda x: ctx.author.id == x.context.author.id, check=lambda x: ctx.author.id == x.ctx.author.id,
messages=message, messages=message,
timeout=60 * 5, timeout=60 * 5,
) )
for to_delete in context.context.values: for to_delete in context.ctx.values:
follow = get(twitters, guild=ctx.guild.id, twitter_id=int(to_delete)) follow = get(twitters, guild=ctx.guild.id, twitter_id=int(to_delete))
try: try:
await follow.delete() await follow.delete()
@ -150,8 +150,8 @@ class TwitterCog(Extension):
for component in row.components: for component in row.components:
component.disabled = True component.disabled = True
block = "\n".join(handlemap[x] for x in context.context.values) block = "\n".join(handlemap[x] for x in context.ctx.values)
await context.context.edit_origin( await context.ctx.edit_origin(
content=f"Unfollowed the following:\n```\n{block}\n```", components=components content=f"Unfollowed the following:\n```\n{block}\n```", components=components
) )
except asyncio.TimeoutError: except asyncio.TimeoutError:
@ -200,13 +200,13 @@ class TwitterCog(Extension):
try: try:
context = await self.bot.wait_for_component( context = await self.bot.wait_for_component(
check=lambda x: ctx.author.id == x.author.id, check=lambda x: ctx.author.id == x.ctx.author.id,
messages=message, messages=message,
timeout=60 * 5, timeout=60 * 5,
) )
handlemap = {} handlemap = {}
for to_update in context.context.values: for to_update in context.ctx.values:
account = await TwitterAccount.find_one(q(twitter_id=int(to_update))) account = await TwitterAccount.find_one(q(twitter_id=int(to_update)))
handlemap[str(twitter.twitter_id)] = account.handle handlemap[str(twitter.twitter_id)] = account.handle
t = get(twitters, guild=ctx.guild.id, twitter_id=int(to_update)) t = get(twitters, guild=ctx.guild.id, twitter_id=int(to_update))
@ -217,8 +217,8 @@ class TwitterCog(Extension):
for component in row.components: for component in row.components:
component.disabled = True component.disabled = True
block = "\n".join(handlemap[x] for x in context.context.values) block = "\n".join(handlemap[x] for x in context.ctx.values)
await context.context.edit_origin( await context.ctx.edit_origin(
content=( content=(
f"{'Unfollowed' if not retweets else 'Followed'} " f"{'Unfollowed' if not retweets else 'Followed'} "
"retweets from the following:" "retweets from the following:"

View file

@ -17,6 +17,7 @@ class JarvisConfig(Config):
"twitter": None, "twitter": None,
"reddit": None, "reddit": None,
"rook_token": None, "rook_token": None,
"jurigged": False,
} }
ENV_REQUIRED = [ ENV_REQUIRED = [
"TOKEN", "TOKEN",
@ -42,6 +43,7 @@ class JarvisConfig(Config):
"TWITTER_ACCESS_TOKEN": None, "TWITTER_ACCESS_TOKEN": None,
"TWITTER_ACCESS_SECRET": None, "TWITTER_ACCESS_SECRET": None,
"URLS_DBRAND_SHIPPING": None, "URLS_DBRAND_SHIPPING": None,
"JURIGGED": False,
} }
@classmethod @classmethod

24
poetry.lock generated
View file

@ -1475,19 +1475,19 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa
[[package]] [[package]]
name = "platformdirs" name = "platformdirs"
version = "2.6.0" version = "2.6.2"
description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
category = "dev" category = "dev"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "platformdirs-2.6.0-py3-none-any.whl", hash = "sha256:1a89a12377800c81983db6be069ec068eee989748799b946cce2a6e80dcc54ca"}, {file = "platformdirs-2.6.2-py3-none-any.whl", hash = "sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490"},
{file = "platformdirs-2.6.0.tar.gz", hash = "sha256:b46ffafa316e6b83b47489d240ce17173f123a9b9c83282141c3daf26ad9ac2e"}, {file = "platformdirs-2.6.2.tar.gz", hash = "sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2"},
] ]
[package.extras] [package.extras]
docs = ["furo (>=2022.9.29)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.4)"] docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"]
test = ["appdirs (==1.4.4)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"]
[[package]] [[package]]
name = "pre-commit" name = "pre-commit"
@ -2225,10 +2225,8 @@ description = "Fuzzy string matching in python"
category = "main" category = "main"
optional = false optional = false
python-versions = "*" python-versions = "*"
files = [ files = []
{file = "thefuzz-0.19.0-py2.py3-none-any.whl", hash = "sha256:4fcdde8e40f5ca5e8106bc7665181f9598a9c8b18b0a4d38c41a095ba6788972"}, develop = false
{file = "thefuzz-0.19.0.tar.gz", hash = "sha256:6f7126db2f2c8a54212b05e3a740e45f4291c497d75d20751728f635bb74aa3d"},
]
[package.dependencies] [package.dependencies]
python-levenshtein = {version = ">=0.12", optional = true, markers = "extra == \"speedup\""} python-levenshtein = {version = ">=0.12", optional = true, markers = "extra == \"speedup\""}
@ -2236,6 +2234,12 @@ python-levenshtein = {version = ">=0.12", optional = true, markers = "extra == \
[package.extras] [package.extras]
speedup = ["python-levenshtein (>=0.12)"] speedup = ["python-levenshtein (>=0.12)"]
[package.source]
type = "git"
url = "https://github.com/zevaryx/thefuzz.git"
reference = "master"
resolved_reference = "e4ab69d3d44cc3dd67221cba53e6a614786b0d7c"
[[package]] [[package]]
name = "tomli" name = "tomli"
version = "2.0.1" version = "2.0.1"
@ -2686,4 +2690,4 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools"
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"
python-versions = ">=3.10,<4" python-versions = ">=3.10,<4"
content-hash = "9b727b6dcd39bfdbe5adbf2c1ab9a2846142f93c4214d72a30c81780c8e9c2b8" content-hash = "89f766c3bacf47f7b955a812a695020dbae9c4f301816e94c943151af2696a19"

View file

@ -14,21 +14,21 @@ psutil = "^5.9.0"
python-gitlab = "^3.1.1" python-gitlab = "^3.1.1"
ulid-py = "^1.1.0" ulid-py = "^1.1.0"
tweepy = "^4.5.0" tweepy = "^4.5.0"
jarvis-core = {git = "https://git.zevaryx.com/stark-industries/jarvis/jarvis-core.git", rev = "main"} jarvis-core = {git = "https://git.zevaryx.com/stark-industries/jarvis/jarvis-core.git", rev = "main"} # Mine
aiohttp = "^3.8.3" aiohttp = "^3.8.3"
pastypy = "^1.0.3.post1" pastypy = "^1.0.3.post1" # Mine
dateparser = "^1.1.1" dateparser = "^1.1.1"
aiofile = "^3.8.1" aiofile = "^3.8.1"
asyncpraw = "^7.5.0" asyncpraw = "^7.5.0"
rich = "^12.3.0" rich = "^12.3.0"
jurigged = "^0.5.3" jurigged = "^0.5.3" # Contributed
naff = { version = "^2.0.0", extras = ["orjson"] } naff = { version = "^2.0.0", extras = ["orjson"] } # Contributed
ansitoimg = "^2022.1" ansitoimg = "^2022.1"
nest-asyncio = "^1.5.5" nest-asyncio = "^1.5.5"
thefuzz = {extras = ["speedup"], git = "https://github.com/zevaryx/thefuzz.git", rev = "master"} thefuzz = {extras = ["speedup"], git = "https://github.com/zevaryx/thefuzz.git", rev = "master"} # Forked
beautifulsoup4 = "^4.11.1" beautifulsoup4 = "^4.11.1"
calculator = {git = "https://git.zevaryx.com/zevaryx/calculator.git"} calculator = {git = "https://git.zevaryx.com/zevaryx/calculator.git"} # Mine
nafftrack = {git = "https://github.com/zevaryx/nafftrack.git"} nafftrack = {git = "https://github.com/zevaryx/nafftrack.git"} # Contributed
redis = "^4.4.0" redis = "^4.4.0"
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]