diff --git a/README.md b/README.md
index 2f0b019..8f17108 100644
--- a/README.md
+++ b/README.md
@@ -1,27 +1,28 @@
-

+

# Just Another Rather Very Intelligent System
-[]()
-[](https://git.zevaryx.com/stark-industries/j.a.r.v.i.s.)
+[]()
+[](https://git.zevaryx.com/stark-industries/jarvis/jarvis-bot)
[](https://discord.gg/VtgZntXcnZ)
-Welcome to the J.A.R.V.I.S. Initiative! While the main goal is to create the best discord bot there can be, a great achievement would be to present him to the Robots and have him integrated into the dbrand server. Feel free to suggest anything you may think to be useful… or cool.
+Welcome to the JARVIS Initiative! While the main goal is to create the best discord bot there can be, a great achievement would be to present him to the Robots and have him integrated into the dbrand server. Feel free to suggest anything you may think to be useful… or cool.
**Note:** Some commands have been custom made to be used in the dbrand server.
## Features
-
-J.A.R.V.I.S. currently offers:
+JARVIS currently offers:
- 👩💼 **Administration**: `verify`, `ban/unban`, `kick`, `purge`, `mute/unmute` and more!
- 🚓 **Moderation**: `lock/unlock`, `lockdown`, `warn`, `autoreact`, and also more!
-- 👻 **Fun**: `jokes`. Please proceed to laugh now.
+- 🔗 **Social Media**: `reddit` and `twitter` syncing!
+- 🔧 **Utilities**: `remindme`, `rolegiver`, `temprole`, `image`, and so many more!
+- 🏷️ **Tags**: Custom `tag`s! Useful for custom messages without the hassle!
- 👑 **dbrand**: `ctc2` and other dbrand-specific commands. [Join their server](https://discord.gg/dbrand) to see them in action!
@@ -31,7 +32,7 @@ Before **creating an issue**, please ensure that it hasn't already been reported
If you have a question, please join the community Discord before opening an issue.
-If you wish to contribute to the J.A.R.V.I.S codebase or documentation, join the Discord! The recognized developers there will help you get started.
+If you wish to contribute to the JARVIS codebase or documentation, join the Discord! The recognized developers there will help you get started.
## Community
@@ -41,45 +42,31 @@ Join the [Stark R&D Department Discord server](https://discord.gg/VtgZntXcnZ) to
- MongoDB 5.0 or higher
- Python 3.10 or higher
- [tokei](https://github.com/XAMPPRocky/tokei) 12.1 or higher
-
-On top of the above requirements, the following pip packages are also required:
-- `dis-snek>=5.0.0`
-- `psutil>=5.8, <6`
-- `GitPython>=3.1, <4`
-- `PyYaml>=5.4, <6`
-- `pymongo>=3.12.0, <4`
-- `opencv-python>=4.5, <5`
-- `Pillow>=8.2.0, <9`
-- `python-gitlab>=2.9.0, <3`
-- `ulid-py>=1.1.0, <2`
+- Everything in `requirements.txt`
-## J.A.R.V.I.S. Cogs
+## JARVIS Cogs
Current cogs that are implemented:
- `AdminCog`
- Handles all admin commands
-- `ModlogCog`
- - Handles modlog events
- `AutoreactCog`
- Handles autoreaction configuration
+- `BotutilCog`
+ - Handles internal bot utilities (private use only)
- `CTC2Cog`
- dbrand Complete the Code utilities
- `DbrandCog`
- dbrand-specific functions and utilities
- `DevCog`
- Developer utilities, such as hashing, encoding, and UUID generation
-- `ErrorCog`
- - Handles all bot errors
- `GitlabCog`
- Shows Gitlab information about J.A.R.V.I.S.
- `ImageCog`
- - Image-processing cog. Only cog with no slash commands
-- `JokesCog`
- - Get a joke, have a laugh
-- `OwnerCog`
- - For the bot owner. Bot management commands
+ - Image-processing cog.
+- `RedditCog`
+ - Reddit lookup and following commands
- `RemindmeCog`
- Manage reminders
- `RolegiverCog`
@@ -88,6 +75,12 @@ Current cogs that are implemented:
- Manage Guild settings
- `StarboardCog`
- Configure and add starboards and stars
+- `TagCog`
+ - For managing tags
+- `TemproleCog`
+ - For managing and assigning temporary roles
+- `TwitterCog`
+ - Twitter following commands
- `UtilCog`
- Generic utilities, like userinfo and roleinfo
- `VerifyCog`
@@ -111,20 +104,12 @@ Contains all AdminCogs, including:
- `KickCog`
- `LockCog`
- `LockdownCog`
+- `ModcaseCog`
- `MuteCog`
- `PurgeCog`
- `RolepingCog`
- `WarningCog`
-##### `jarvis.cogs.modlog`
-
-Contains all ModlogCogs, including:
-- `ModlogCommandCog`
-- `ModlogMemberCog`
-- `ModlogMessageCog`
-
-`jarvis.cogs.modlog.utils` includes modlog-specific utilities
-
#### `jarvis.data`
Contains data relevant to J.A.R.V.I.S., such as emoji lookups and dbrand data
@@ -133,20 +118,6 @@ Contains data relevant to J.A.R.V.I.S., such as emoji lookups and dbrand data
Any JSON files that are needed are stored here
-#### `jarvis.db`
-
-All database-related files.
-
-`jarvis.db.types` handles almost all of the database conections
-
-#### `jarvis.events`
-
-Containers for `@on_` d.py events
-
-#### `jarvis.tasks`
-
-All background tasks run from this folder
-
#### `jarvis.utils`
Generic utilities
diff --git a/jarvis/client.py b/jarvis/client.py
index 904edd0..6c14b29 100644
--- a/jarvis/client.py
+++ b/jarvis/client.py
@@ -110,12 +110,13 @@ class Jarvis(StatsClient):
async def _prerun(self, ctx: Context, *args, **kwargs) -> None:
name = ctx.invoke_target
+ cargs = ""
if isinstance(ctx, InteractionContext) and ctx.target_id:
kwargs["context target"] = ctx.target
- args = " ".join(f"{k}:{v}" for k, v in kwargs.items())
+ cargs = " ".join(f"{k}:{v}" for k, v in kwargs.items())
elif isinstance(ctx, PrefixedContext):
- args = " ".join(args)
- self.logger.debug(f"Running command `{name}` with args: {args or 'None'}")
+ cargs = " ".join(args)
+ self.logger.debug(f"Running command `{name}` with args: {cargs or 'None'}")
async def _sync_domains(self) -> None:
self.logger.debug("Loading phishing domains")
@@ -232,7 +233,8 @@ class Jarvis(StatsClient):
name = ctx.invoke_target
if not isinstance(ctx.channel, DMChannel) and name not in ["pw"]:
modlog = await Setting.find_one(q(guild=ctx.guild.id, setting="activitylog"))
- if modlog:
+ ignore = await Setting.find_one(q(guild=ctx.guild.id, setting="log_ignore"))
+ if modlog and (ignore and ctx.channel.id not in ignore.value):
channel = await ctx.guild.fetch_channel(modlog.value)
args = []
if isinstance(ctx, InteractionContext) and ctx.target_id:
@@ -702,7 +704,8 @@ class Jarvis(StatsClient):
after = event.after
if not after.author.bot:
modlog = await Setting.find_one(q(guild=after.guild.id, setting="activitylog"))
- if modlog:
+ ignore = await Setting.find_one(q(guild=after.guild.id, setting="log_ignore"))
+ if modlog and (ignore and after.channel.id not in ignore.value):
if not before or before.content == after.content or before.content is None:
return
try:
@@ -754,7 +757,8 @@ class Jarvis(StatsClient):
"""Process on_message_delete events."""
message = event.message
modlog = await Setting.find_one(q(guild=message.guild.id, setting="activitylog"))
- if modlog:
+ ignore = await Setting.find_one(q(guild=message.guild.id, setting="log_ignore"))
+ if modlog and (ignore and message.channel.id not in ignore.value):
try:
content = message.content or "N/A"
except AttributeError:
diff --git a/jarvis/cogs/settings.py b/jarvis/cogs/settings.py
index 7595cfc..de12ff3 100644
--- a/jarvis/cogs/settings.py
+++ b/jarvis/cogs/settings.py
@@ -5,7 +5,7 @@ from typing import Any
from jarvis_core.db import q
from jarvis_core.db.models import Setting
-from naff import Client, Extension, InteractionContext
+from naff import AutocompleteContext, Client, Extension, InteractionContext
from naff.models.discord.channel import GuildText
from naff.models.discord.components import ActionRow, Button, ButtonStyles
from naff.models.discord.embed import EmbedField
@@ -17,6 +17,7 @@ from naff.models.naff.application_commands import (
slash_option,
)
from naff.models.naff.command import check
+from thefuzz import process
from jarvis.utils import build_embed
from jarvis.utils.permissions import admin_or_permissions
@@ -152,6 +153,29 @@ class SettingsCog(Extension):
await self.update_settings("notify", active, ctx.guild.id)
await ctx.send(f"Settings applied. Notifications active: {active}")
+ @set_.subcommand(
+ 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
+ )
+ @check(admin_or_permissions(Permissions.MANAGE_GUILD))
+ async def _add_log_ignore(self, ctx: InteractionContext, channel: GuildText) -> None:
+ 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"))
+ if not setting:
+ setting = Setting(guild=ctx.guild.id, setting="log_ignore", value=[])
+ if not setting.value:
+ setting.value = []
+ if channel in setting.value:
+ await ctx.send("Channel already ignored", ephemeral=True)
+ return
+ setting.value.append(channel.id)
+ await setting.commit(replace=True)
+ await ctx.send("Channel added to ActivityLog ignore list")
+
# Unset
@unset.subcommand(
sub_cmd_name="modlog",
@@ -210,6 +234,37 @@ class SettingsCog(Extension):
await self.delete_settings("notify", ctx.guild.id)
await ctx.send("Setting `notify` unset")
+ @unset.subcommand(
+ sub_cmd_name="log_ignore", sub_cmd_description="Add a channel for ActivityLog"
+ )
+ @slash_option(
+ name="channel",
+ description="Channel to stop ignoring",
+ opt_type=OptionTypes.STRING,
+ required=True,
+ autocomplete=True,
+ )
+ @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"))
+ 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 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"))
+ if not setting:
+ return {}
+ channels = [ctx.guild.get_channel(x) for x in setting.value]
+ channels = {c.name: c.id for c in channels if c}
+ options = process.extract(channel, list(channels.keys()), limit=25)
+ await ctx.send(choices=[{"name": c[0], "value": str(channels[c[0]])} for c in options])
+
@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:
@@ -242,6 +297,13 @@ class SettingsCog(Extension):
value += "\n" + nvalue.mention
else:
value += "\n||`[redacted]`||"
+ elif setting.setting == "log_ignore":
+ names = []
+ for v in setting.value:
+ channel = ctx.guild.get_channel(v)
+ if channel:
+ names.append(channel.mention)
+ value = ", ".join(names) if names else "None"
fields.append(EmbedField(name=setting.setting, value=str(value) or "N/A", inline=False))
embed = build_embed(title="Current Settings", description="", fields=fields)
diff --git a/poetry.lock b/poetry.lock
index 4f99613..abc28ae 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -514,7 +514,7 @@ python-versions = "*"
[[package]]
name = "naff"
-version = "1.7.1"
+version = "1.8.0"
description = "Not another freaking fork"
category = "main"
optional = false
@@ -1564,7 +1564,10 @@ mypy-extensions = [
{file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
{file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
]
-naff = []
+naff = [
+ {file = "naff-1.8.0-py3-none-any.whl", hash = "sha256:96284f17841a782bdf4cb1e0b767b75e93a0afb9c0cd852a448e9a475b38efb6"},
+ {file = "naff-1.8.0.tar.gz", hash = "sha256:0fada9174642d6daa5b76f2e52c992722ffc8219ba9067b101d018380df1ad24"},
+]
nafftrack = []
nanoid = [
{file = "nanoid-2.0.0-py3-none-any.whl", hash = "sha256:90aefa650e328cffb0893bbd4c236cfd44c48bc1f2d0b525ecc53c3187b653bb"},
diff --git a/requirements.txt b/requirements.txt
index 13d8c4c..581821d 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,76 +1,93 @@
-aiofile==3.7.4
-aiofiles==0.6.0 ; python_version >= "3.6"
-aiohttp==3.8.1
-aioredis==2.0.1
-aiosignal==1.2.0 ; python_version >= "3.10"
-aiosqlite==0.17.0 ; python_version >= "3.6"
-ansicon==1.89.0 ; python_version >= "3.8" and python_version < "4.0" and platform_system == "Windows"
-async-generator==1.10 ; python_version >= "3.6"
-async-timeout==4.0.2 ; python_version >= "3.6"
-asyncio-extras==1.3.2 ; python_version >= "3.6"
-asyncpraw==7.5.0
-asyncprawcore==2.3.0 ; python_version >= "3.6"
-attrs==21.4.0 ; python_version >= "3.10"
-blessed==1.19.1 ; python_version >= "3.8" and python_version < "4.0"
-caio==0.9.5 ; python_version >= "3.5" and python_version < "4"
-certifi==2021.10.8
-charset-normalizer==2.0.12 ; python_version >= "3.10"
-codefind==0.1.3 ; python_version >= "3.8" and python_version < "4.0"
-commonmark==0.9.1 ; python_version >= "3.10" and python_full_version < "4.0.0"
-dateparser==1.1.1
-discord-typings==0.4.0 ; python_version >= "3.10"
-distro==1.7.0 ; python_version >= "3.6"
-frozenlist==1.3.0 ; python_version >= "3.10"
+aiofile==3.7.4; python_version > "3.4" and python_version < "4"
+aiofiles==0.6.0; python_version >= "3.6"
+aiohttp==3.8.1; python_version >= "3.6"
+aioredis==2.0.1; python_version >= "3.6"
+aiosignal==1.2.0; python_version >= "3.10" and python_version < "4.0"
+aiosqlite==0.17.0; python_version >= "3.6"
+ansicon==1.89.0; python_version >= "3.8" and python_version < "4.0" and platform_system == "Windows"
+ansitoimg==2022.1; python_version >= "3.7" and python_version < "4.0"
+appdirs==1.4.4; python_version >= "3.7" and python_version < "4.0"
+async-generator==1.10; python_version >= "3.6"
+async-timeout==4.0.2; python_version >= "3.10" and python_version < "4.0"
+asyncio-extras==1.3.2; python_version >= "3.6"
+asyncpraw==7.5.0; python_version >= "3.6"
+asyncprawcore==2.3.0; python_version >= "3.6"
+attrs==21.4.0; python_version >= "3.10" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.10" and python_version < "4.0" and python_full_version >= "3.5.0"
+blessed==1.19.1; python_version >= "3.8" and python_version < "4.0"
+caio==0.9.5; python_version >= "3.5" and python_version < "4"
+certifi==2021.10.8; python_full_version >= "3.7.0" and python_version >= "3.10" and (python_version >= "3.10" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.10") and python_version < "4.0"
+charset-normalizer==2.0.12; python_version >= "3.10" and python_version < "4.0" and python_full_version >= "3.7.0" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7") and (python_version >= "3.10" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.10")
+click==8.1.3; python_version >= "3.10" and python_version < "4.0"
+codefind==0.1.3; python_version >= "3.8" and python_version < "4.0"
+colorama==0.4.4; python_version >= "3.10" and python_full_version < "3.0.0" and python_version < "4.0" and platform_system == "Windows" or python_version >= "3.10" and python_version < "4.0" and platform_system == "Windows" and python_full_version >= "3.5.0"
+commonmark==0.9.1; python_full_version >= "3.6.3" and python_full_version < "4.0.0" and python_version >= "3.10" and python_version < "4.0"
+dateparser==1.1.1; python_version >= "3.5"
+discord-typings==0.4.0; python_version >= "3.10" and python_version < "4.0"
+distro==1.7.0; python_version >= "3.6"
+frozenlist==1.3.0; python_version >= "3.10" and python_version < "4.0"
funcsigs==1.0.2
-gitdb==4.0.9 ; python_version >= "3.7"
-gitpython==3.1.27
-idna==3.3 ; python_version >= "3.10"
-jarvis-core @ git+https://git.zevaryx.com/stark-industries/jarvis/jarvis-core.git@main
-jinxed==1.2.0 ; python_version >= "3.8" and python_version < "4.0" and platform_system == "Windows"
-jurigged==0.5.2
-marshmallow==3.16.0 ; python_version >= "3.10" and python_version < "4.0"
-mongoengine==0.23.1
-motor==2.5.1 ; python_version >= "3.10" and python_version < "4.0"
-multidict==6.0.2 ; python_version >= "3.10"
-naff==1.2.0
-nanoid==2.0.0 ; python_version >= "3.10" and python_version < "4.0"
-numpy==1.22.4 ; python_version >= "3.8" or python_version >= "3.8" and platform_system == "Darwin" and platform_machine == "arm64" or python_version >= "3.8" and platform_system == "Linux" and platform_machine == "aarch64"
-oauthlib==3.2.0 ; python_version >= "3.7"
-opencv-python==4.6.0.66
-orjson==3.7.2 ; python_version >= "3.10" and python_version < "4.0"
-ovld==0.3.2 ; python_version >= "3.8" and python_version < "4.0"
-packaging==21.3 ; python_version >= "3.10" and python_version < "4.0"
-pastypy==1.0.2
-pillow==9.1.1
-protobuf==3.20.1 ; python_version >= "3.7"
-psutil==5.9.1
-pycryptodome==3.14.1 ; python_version >= "3.10"
-pygments==2.12.0 ; python_version >= "3.10" and python_full_version < "4.0.0"
-pymongo==3.12.3 ; python_version >= "3.10" and python_version < "4.0" or python_version >= "3.6"
-pyparsing==3.0.9 ; python_version >= "3.10" and python_version < "4.0"
-python-dateutil==2.8.2 ; python_version >= "3.5"
-python-gitlab==3.5.0
-pytz==2022.1 ; python_version >= "3.10" and python_version < "4.0" or python_version >= "3.5"
-pytz-deprecation-shim==0.1.0.post0 ; python_full_version >= "3.6.0"
-pyyaml==6.0
-regex==2022.3.2 ; python_version >= "3.6"
-requests==2.27.1 ; python_full_version >= "3.6.0"
-requests-oauthlib==1.3.1 ; python_version >= "3.7"
-requests-toolbelt==0.9.1 ; python_full_version >= "3.7.0"
-rich==12.4.4
+gitdb==4.0.9; python_version >= "3.7"
+gitpython==3.1.27; python_version >= "3.7"
+h11==0.13.0; python_version >= "3.10" and python_version < "4.0"
+idna==3.3; python_full_version >= "3.7.0" and python_version >= "3.10" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7") and (python_version >= "3.10" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.10") and python_version < "4.0"
+importlib-metadata==4.11.4; python_version >= "3.7" and python_version < "4.0"
+jarvis-core @ git+https://git.zevaryx.com/stark-industries/jarvis/jarvis-core.git@main ; python_version >= "3.10" and python_version < "4.0"
+jinxed==1.2.0; python_version >= "3.8" and python_version < "4.0" and platform_system == "Windows"
+jurigged==0.5.2; python_version >= "3.8" and python_version < "4.0"
+marshmallow==3.16.0; python_version >= "3.10" and python_version < "4.0"
+mongoengine==0.23.1; python_version >= "3.6"
+motor==2.5.1; python_version >= "3.10" and python_version < "4.0" and python_full_version >= "3.5.2"
+multidict==6.0.2; python_version >= "3.10" and python_version < "4.0"
+naff==1.7.1; python_version >= "3.10"
+nafftrack @ git+https://github.com/artem30801/nafftrack.git@master ; python_version >= "3.10" and python_version < "4.0"
+nanoid==2.0.0; python_version >= "3.10" and python_version < "4.0"
+nest-asyncio==1.5.5; python_version >= "3.5"
+numpy==1.22.4; python_version >= "3.10" and platform_system == "Linux" and platform_machine == "aarch64" or python_version >= "3.10" or python_version >= "3.9" and platform_system == "Darwin" and platform_machine == "arm64"
+oauthlib==3.2.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7"
+opencv-python==4.6.0.66; python_version >= "3.6"
+orjson==3.7.2; python_version >= "3.10" and python_version < "4.0"
+ovld==0.3.2; python_version >= "3.8" and python_version < "4.0"
+packaging==21.3; python_version >= "3.10" and python_version < "4.0"
+pastypy==1.0.2; python_version >= "3.10"
+pillow==9.1.1; python_version >= "3.7"
+prometheus-client==0.14.1; python_version >= "3.10" and python_version < "4.0"
+protobuf==3.20.1; python_version >= "3.7"
+psutil==5.9.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.4.0")
+pycryptodome==3.14.1; python_version >= "3.10" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.10"
+pyee==8.2.2; python_version >= "3.7" and python_version < "4.0"
+pygments==2.12.0; python_full_version >= "3.6.3" and python_full_version < "4.0.0" and python_version >= "3.10" and python_version < "4.0"
+pymongo==3.12.3; python_version >= "3.10" and python_version < "4.0" and python_full_version >= "3.5.2"
+pyparsing==3.0.9; python_version >= "3.10" and python_version < "4.0" and python_full_version >= "3.6.8"
+pyppeteer==1.0.2; python_version >= "3.7" and python_version < "4.0"
+python-dateutil==2.8.2; python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.5"
+python-gitlab==3.5.0; python_full_version >= "3.7.0"
+python-levenshtein==0.12.2
+pytz==2022.1; python_version >= "3.10" and python_version < "4.0"
+pytz-deprecation-shim==0.1.0.post0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6"
+pyyaml==6.0; python_version >= "3.6"
+regex==2022.3.2; python_version >= "3.6"
+requests==2.27.1; python_full_version >= "3.7.0" and python_version >= "3.7" and (python_version >= "3.10" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.10") and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7") and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6")
+requests-oauthlib==1.3.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7"
+requests-toolbelt==0.9.1; python_full_version >= "3.7.0"
+rich==12.4.4; python_full_version >= "3.6.3" and python_full_version < "4.0.0"
rook==0.1.175
-six==1.16.0 ; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" or python_version >= "3.8" and python_version < "4.0"
-smmap==5.0.0 ; python_version >= "3.7"
-tomli==2.0.1 ; python_version >= "3.10"
-tweepy==4.10.0
-typing-extensions==4.2.0 ; python_version >= "3.7"
-tzdata==2022.1 ; python_version >= "3.6"
-tzlocal==4.2 ; python_version >= "3.6"
+six==1.16.0; python_version >= "3.8" and python_full_version < "3.0.0" and python_version < "4.0" or python_full_version >= "3.3.0" and python_version >= "3.8" and python_version < "4.0"
+smmap==5.0.0; python_version >= "3.7"
+thefuzz==0.19.0
+tomli==2.0.1; python_version >= "3.10" and python_version < "4.0"
+tqdm==4.64.0; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.4.0"
+tweepy==4.10.0; python_version >= "3.7"
+typing-extensions==4.2.0; python_version >= "3.10"
+tzdata==2022.1; platform_system == "Windows" and python_version >= "3.6" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6")
+tzlocal==4.2; python_version >= "3.6"
ulid-py==1.1.0
-umongo==3.1.0 ; python_version >= "3.10" and python_version < "4.0"
-update-checker==0.18.0 ; python_version >= "3.6"
-urllib3==1.26.8 ; python_version >= "3.10" and python_version < "4"
-watchdog==2.1.8 ; python_version >= "3.8" and python_version < "4.0"
-wcwidth==0.2.5 ; python_version >= "3.8" and python_version < "4.0"
-websocket-client==1.3.2 ; python_version >= "3.7"
-yarl==1.7.2 ; python_version >= "3.6"
+umongo==3.1.0; python_version >= "3.10" and python_version < "4.0"
+update-checker==0.18.0; python_version >= "3.6"
+urllib3==1.26.8; python_full_version >= "3.7.0" and python_version < "4" and python_version >= "3.10" and (python_version >= "3.10" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.10") and (python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_full_version >= "3.5.0" and python_version < "4" and python_version >= "3.7")
+uvicorn==0.18.2; python_version >= "3.10" and python_version < "4.0"
+watchdog==2.1.8; python_version >= "3.8" and python_version < "4.0"
+wcwidth==0.2.5; python_version >= "3.8" and python_version < "4.0"
+websocket-client==1.3.2; python_version >= "3.7"
+websockets==10.3; python_version >= "3.7" and python_version < "4.0"
+yarl==1.7.2; python_version >= "3.10" and python_version < "4.0"
+zipp==3.8.0; python_version >= "3.7" and python_version < "4.0"