diff --git a/.gitbook/assets/Image19.png b/.gitbook/assets/Image19.png index 44fa4fb..115bfb3 100644 Binary files a/.gitbook/assets/Image19.png and b/.gitbook/assets/Image19.png differ diff --git a/.gitbook/assets/Image20.png b/.gitbook/assets/Image20.png index 9437f20..3137dd9 100644 Binary files a/.gitbook/assets/Image20.png and b/.gitbook/assets/Image20.png differ diff --git a/.gitbook/assets/Image21.png b/.gitbook/assets/Image21.png index 080bc34..9023bd3 100644 Binary files a/.gitbook/assets/Image21.png and b/.gitbook/assets/Image21.png differ diff --git a/.gitbook/assets/permissionslevel.png b/.gitbook/assets/permissionslevel.png new file mode 100644 index 0000000..723a612 Binary files /dev/null and b/.gitbook/assets/permissionslevel.png differ diff --git a/SUMMARY.md b/SUMMARY.md index f31376f..d7cccde 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -31,9 +31,5 @@ * [Configure Modmail and Logviewer](configure-modmail-and-logviewer.md) * [Frequently Asked Questions]() * [Modmail Usage](modmail-usage.md) - * [Permissions](permissions.md) - * [Plugins](plugins.md) - * [Seperate Server Setup](seperate-server-setup.md) - * [The Unofficial List of Plugins](the-unofficial-list-of-plugins.md) * [Updating]() * [Video Tutorials](video-tutorials.md) diff --git a/frequently-asked-questions.md b/frequently-asked-questions.md index a832ca8..5c776c9 100644 --- a/frequently-asked-questions.md +++ b/frequently-asked-questions.md @@ -24,4 +24,9 @@ And then, fetch the original files with: git checkout FETCH_HEAD -- Pipfile && git checkout FETCH_HEAD -- Pipfile.lock ``` -### +### I would like to have threads in a seperate guild inbox, how can I do that? + +If you want to use a separate server to the main one as the inbox server (Where threads get relayed to) add the following environment variables into your ``.env`` file: + +* `MODMAIL_GUILD_ID` (the server where messages are sent to) +* `GUILD_ID` (The server where users message from) diff --git a/installation/README.md b/installation/README.md index e60065a..6d9c6b2 100644 --- a/installation/README.md +++ b/installation/README.md @@ -227,7 +227,7 @@ Next, we will need to generate a _MongoDB connection string_. Simply click **Con -

Choose Connect your application.

+

Choose Drivers.

@@ -279,7 +279,7 @@ TOKEN=OTY3Nzy5MzU5NjAzMzU2NzE4.GtKp_5.JOTYRwGW-LB1He5widCu73vXtmi90KxsqkmoOg LOG_URL=https://logs.mymodmailbot.com/ GUILD_ID=1079074933008781362 OWNERS=188363246695219201,231595246213922828 -MONGO_URI=mongodb+srv://username:password@cluster0-abcde.mongodb.net/ +CONNECTION_URI=mongodb+srv://username:password@cluster0-abcde.mongodb.net/ ``` {% endcode %} @@ -289,9 +289,9 @@ Your next step is to choose one of our supported hosting method that's available Click on one of the links below to view further instructions for your preferred hosting method. Each method has their pros and cons, be sure to take them into consideration when choosing your hosting platform to run Modmail. -### [Railway](railway.md) (free/paid) +### [Railway](railway.md) (paid) -A platform as a service (PaaS) that offers a generous free plan, which allows you to host Modmail for free without any downtime. A credit card is required for verification purposes. Their UI is very simple and easy for beginners to quickly deploy and run your Modmail bot on. You can learn more about their Free Tier plan and pricing by clicking [here](https://railway.app/pricing). +A platform as a service (PaaS) that offers relatively low cost plans, which allows you to host Modmail for little without any downtime. A credit card is required for payment. Their UI is very simple and easy for beginners to quickly deploy and run your Modmail bot on. You can learn more about their plans and pricing by clicking [here](https://railway.app/pricing). ### [Northflank](https://northflank.com/) (free/paid) @@ -327,7 +327,7 @@ The Modmail team does not recommend this hosting method due to their highly unst Please note that our Support Team will not be offering any official help or support if you choose this method to host Modmail. {% endhint %} -An online code execution environment. You can host Modmail there for free using certain exploits. The legitimate method costs $7 USD per month. However, regardless if you pay or host for free, hosting on Replit are often unstable and thus not recommended. However, a community guide is still available by clicking [here](broken-reference). +An online code execution environment that costs $7 USD per month. However, hosting on Replit is often unstable, and thus not recommended. However, a community guide is still available by clicking [here](broken-reference). ## Community Guides diff --git a/installation/community-guides.md b/installation/community-guides.md index 34d8419..72be22b 100644 --- a/installation/community-guides.md +++ b/installation/community-guides.md @@ -10,7 +10,7 @@ Community guides are not verified by the Modmail team, so use them at your own r ## [Replit Guide](https://gist.github.com/anondev-sudo/24978429b85b44348bcff5c0885afe82) by AnonDev -An online code execution environment. You can host Modmail there for free using certain exploits. The legitimate method costs $7 USD per month. However, regardless if you pay or host for free, hosting on Replit are often unstable and thus not recommended. But for now, this is the only option for those without a payment method for hosting or verification. +An online code execution environment that costs $7 USD per month. However, hosting on Replit is often unstable, and thus not recommended. For the up-to-date pricing info check out their [pricing](https://replit.com/pricing) page. ## [Northflank](https://blog.project-mei.xyz/2023/04/11/hosting-discord-modmail-on-northflank/) Guide by raidensakura @@ -19,3 +19,8 @@ Northflank is a Platform as a Service (PaaS) like Railway that offers abilities ## [Oracle Guide](http://docs.lidistat67.xyz/) by lidistat67 Oracle Cloud Compute is an Infrastructure as a Service (IaaS) platform. Unlike Railway and Heroku, Oracle gives you access to a VPS where you can have a more direct control of your instance. Oracle is a reputable company known for owning products such as Java, VirtualBox, MySQL, etc. Oracle Cloud offers 3,000 OCPU hours and 18,000 GB hours per month. This is equivalent to 24 GB of RAM and 4 OCPUs. TL;DR, Oracle offers powerful instances for free! Oracle requires a credit card for verification but will never charge you as long as you are on their free plan. The setup is similar to self-hosting Modmail as Oracle offers a VPS. + +## [Pterodactyl](https://martinbndr.gitbook.io/modmail-hosting-on-pterodactyl/) Guide by martinbndr + +Pterodactyl is a hosting self hostable platform that originally allows to host gameservers but it can also host other applications like modmail. +Some hosting provider providing you a free plan in order to application via this panel. \ No newline at end of file diff --git a/installation/railway.md b/installation/railway.md index df5543c..0c2c76a 100644 --- a/installation/railway.md +++ b/installation/railway.md @@ -10,18 +10,15 @@ Railway is a deployment platform where you can provision infrastructure, develop ## Requirements -* A credit card (for verification only). +* A credit card. * An email account. * A [GitHub](https://github.com/signup) account. * You have completed the initial steps: [invited your bot](./#create-a-discord-bot) and [created a MongoDB database](./#create-a-mongodb-database). ## Costs -Railway provides a **free** "Starter" plan. This plan allows you to try out their platform for free without requiring a credit card\*. Your bot will be online for 10 days after signing up. - -To keep your bot running 24/7, you'll need to sign up for their "Developer" plan. This plan is also **free**, but you will need to verify using your credit card, as it's to prevent abuse on their systems. - -\*Credit card may be required for some users. +Their lowest plan starts at $5 per month. +Visit the [pricing](https://railway.app/pricing) page for the up-to-date pricing info. ## Fork our GitHub repositories diff --git a/permissions.md b/permissions.md deleted file mode 100644 index bc4d852..0000000 --- a/permissions.md +++ /dev/null @@ -1,41 +0,0 @@ -# Permissions - -Modmail comes with an advanced permission system. The different permission levels are: - -* Owner \[5] -* Administrator \[4] -* Moderator \[3] -* Supporter \[2] -* Regular \[1] - -To see which commands are available to which permission, you can see the numbers next to the command in the help menu. - -![Imgur](https://i.imgur.com/yNl7Ept.png) - -## Setting Up - -You can add permissions in 2 different ways. - -### Adding a level to a role or user - -`?permissions add level [name] [role/user]` - -Examples: - -* `?perms add level Regular everyone` -* `?perms add level Moderator @mods` -* `?perms add level Owner @user` - -### Adding a command to a role or user - -`?permissions add command [name] [role/user]` - -Examples: - -* `?perms add command reply @user` -* `?perms add command "plugin enabled" @role` -* `?perms add command help 984301093849028` - -*** - -If you need help setting up permissions, feel free to join our [Discord server](https://discord.gg/cnUpwrnpYb) and DM Modmail. One of our support members will help you. diff --git a/plugins.md b/plugins.md deleted file mode 100644 index 2251102..0000000 --- a/plugins.md +++ /dev/null @@ -1,147 +0,0 @@ -# Plugins - -## Plugins - -Visit the [Unofficial List of Plugins](https://github.com/modmail-dev/modmail/wiki/Unofficial-List-of-Plugins) for a list of plugins. - -## Guidelines - -To get approved and officially verified, you need to ensure you follow these guidelines: - -* Supporting Python 3.8 (and above). -* No malicious intent. -* The plugin cannot be a feature pending to be added into [Modmail](https://github.com/modmail-dev/modmail/issues). You can submit a PR to add it to the core Modmail. -* Core Modmail still needs to 100% function. -* Cog name cannot be the same as any current class (`Core`, `Modmail`). -* It cannot have the same name as another approved plugin. - -## Creating Plugins - -We use [discord.py](https://discordpy.readthedocs.io/en/stable/) for the bot and plugins take the form of [Cogs](https://discordpy.readthedocs.io/en/stable/ext/commands/cogs.html). - -Short example: - -```py -from discord.ext import commands - -class Hello(commands.Cog): - def __init__(self, bot): - self.bot = bot - - @commands.Cog.listener() - async def on_message(self, message): - print(message.content) - - @commands.command() - async def say(self, ctx, *, message): - await ctx.send(message) - -async def setup(bot): - await bot.add_cog(Hello(bot)) -``` - -### Folder Structure - -Your plugin has to be uploaded on Github on a **public repository.** (Note: private repositories are supported, but they require extra setup, see [Private Plugins](https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token)). The repository folder structure has to be as follows: - -```yaml -root: - plugin_name: - .. - plugin_name.py - requirements.txt [optional] - plugin_name: - .. - plugin_name.py - requirements.txt [optional] -``` - -The plugin will be loaded with something similar to - -```py -await bot.load_extension('username.plugin_name.plugin_name') -``` - -To install a plugin that is not in the official registry, type: - -``` -?plugin add githubusername/plugin_repo/plugin_name[@branch] -``` - -An example of a plugin can be seen at [`fourjr/modmail-plugins`](https://github.com/fourjr/modmail-plugins) or any of the plugins in our [registry](https://github.com/modmail-dev/modmail/blob/master/plugins/registry.json). - -#### Branch parameter - -The branch parameter is **optional** (default to `master`) and can be used to test in-development/unstable plugins with a development branch. - -Users will always be updated to the latest version. Thus, if there is a broken plugin on the latest version, users would not be able to use the plugin. - -#### @local (For Developers) - -To make it easier to develop a plugin, there's a folder named `@local` in the plugins folder. You can directly put a folder for each plugin in it. - -Using the example cog above, the load command would be - -``` -?plugin load @local/hello -``` - -#### Best Practices - -1. Create a development branch -2. Push to it until you are confident that your code is stable -3. Merge it into `master` using pull requests or `git merge -v dev --squash` -4. Update your plugin! - -### Private Plugins - -* Obtain a [Github Personal Access Token](https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token) with `repo` scope -* Include `GITHUB_TOKEN` as a config variable (or in .env) with the token as the value. -* Upload your code to a private Github repository. -* Install just like a normal public plugin. - -### Database Interfacing - -Do **not** interact with `bot.api` directly. Fetch a partition and use it: - -```python -def __init__(self, bot): # in the class init - self.coll = bot.api.get_plugin_partition(self) -``` - -`self.coll` is a [motor.motor\_asyncio.AsyncIOMotorCollection](https://motor.readthedocs.io/en/stable/api-asyncio/asyncio\_motor\_collection.html) - -### Additional PIP requirements - -Create a [`requirements.txt` file](https://pip.pypa.io/en/stable/user\_guide/#requirements-files) in the plugin folder. Packages listed here would be installed via something similar to the following command: - -``` -python3 -m pip install -r requirements.txt --user -q -q -``` - -### Exposed Events - -The bot dispatches custom events to aid plugin developers to extend Modmail functionality. - -Currently, we have these custom coroutines: - -* `Bot.format_channel_name(bot, author, exclude_channel=None, force_null=False)` can be overwritten for custom behaviour. -* `on_plugins_ready()` which is dispatched when all the plugins are fully loaded and ready to be used. -* `on_thread_initiate(thread, creator, category, initial_message)` which is dispatched at the beginning of setup process. It is recommended to use the other events instead. -* `on_thread_create(thread)` which is dispatched when the thread is registered as a thread by Modmail (i.e., when channel topic is edited). -* `on_thread_ready(thread, creator, category, initial_message)` which is dispatched when a thread channel is created and the `genesis_message` (info embed) is sent. It is recommended to use this event. -* `on_thread_close(thread, closer, silent, delete_channel, message, scheduled)` which is dispatched when a thread is closed, after channel deletion. -* `on_thread_reply(thread, from_mod, message, anonymous, plain)` which is dispatched upon any reply. - -e.g. - -```py -@commands.Cog.listener() -async def on_thread_ready(self, thread, creator, category, initial_message): - msg = thread.genesis_message - ... # do stuff -``` - -### Approval request - -Create a [Pull Request](https://github.com/modmail-dev/modmail/pulls) adding your plugin into [`plugins/registry.json`](https://github.com/modmail-dev/modmail/blob/master/plugins/registry.json) and we will take a look at it. diff --git a/seperate-server-setup.md b/seperate-server-setup.md deleted file mode 100644 index f30609a..0000000 --- a/seperate-server-setup.md +++ /dev/null @@ -1,6 +0,0 @@ -# Seperate Server Setup - -If you want to use a separate server to the main one as the inbox server (Where threads get relayed to) add the following config variables on Heroku: - -* `MODMAIL_GUILD_ID` (the server where messages are sent to) -* `GUILD_ID` (The server where users message from) diff --git a/the-unofficial-list-of-plugins.md b/the-unofficial-list-of-plugins.md deleted file mode 100644 index 1700993..0000000 --- a/the-unofficial-list-of-plugins.md +++ /dev/null @@ -1,52 +0,0 @@ -# The Unofficial List of Plugins - -To add any of the plugins listed below, do `?plugins add plugin-name`, where `plugin-name` is the name of the plugin. - -* **Taki**: - * [`colors`](https://github.com/Taaku18/modmail-plugins/tree/master/colors) - * [`Taaku18/modmail-plugins/bettercalc`](https://github.com/Taaku18/modmail-plugins/tree/master/bettercalc) (BETA) - * [`Taaku18/modmail-plugins/animals`](https://github.com/Taaku18/modmail-plugins/tree/master/animals) -* **Akhil**: - * [`fun`](https://github.com/TheKinG2149/modmail-plugins/tree/master/fun) -* **MiTonder**: - * [`stats`](https://github.com/MiTonder/modmail-plugins/tree/master/stats) -* **DAzVise**: - * [`serverstats`](https://github.com/DAzVise/modmail-plugins/tree/master/serverstats) - * [`DAzVise/modmail-plugins/reports`](https://github.com/DAzVise/modmail-plugins/tree/master/reports) - * [`DAzVise/modmail-plugins/reaction-role`](https://github.com/DAzVise/modmail-plugins/tree/master/reaction-role) - * [`DAzVise/modmail-plugins/role`](https://github.com/DAzVise/modmail-plugins/tree/master/role) -* **SnailDOS**: - * [`snaildos/modmail-plugins/sudo`](https://github.com/snaildos/modmail-plugins/tree/master/sudo) -* **RealCyGuy**: - * [`realcyguy/modmail-plugins/8ball`](https://github.com/RealCyGuy/modmail-plugins/tree/master/8ball) -* **mischievousdev**: - * [`githubstats`](https://github.com/mischievousdev/modmail-plugins/tree/master/githubstats) -* **xTeen**: - * [`Teen1/Modmail-Plugins/helloplugin`](https://github.com/Teen1/Modmail-Plugins/tree/master/helloplugin) - * [`Teen1/Modmail-Plugins/nitroboost`](https://github.com/Teen1/Modmail-Plugins/tree/master/nitroboost) - * [`slowmode`](https://github.com/Teen1/Modmail-Plugins/tree/master/slowmode) -* **Jerrie**: - * [`Jerrie-Aries/modmail-plugins/trivia`](https://github.com/Jerrie-Aries/modmail-plugins/tree/master/trivia) - * [`Jerrie-Aries/modmail-plugins/embedmanager`](https://github.com/Jerrie-Aries/modmail-plugins/tree/master/embedmanager) - * [`Jerrie-Aries/modmail-plugins/rolemanager`](https://github.com/Jerrie-Aries/modmail-plugins/tree/master/rolemanager) -* **Nziie**: - * [`Nzii3/modmail-plugins/raw-content`](https://github.com/Nzii3/modmail-plugins/tree/main/raw-content) - -*** - -**Beware**, this is a community project, all plugins listed above may or may not be safe, only add plugins from developers you trust! - -*** - -> Plugin developers, feel free to add your plugins on this page. -> -> Format: -> -> ``` -> - **Your Name**: -> - [`plugin-name#1`](link to GitHub directory of the first plugin) -> - [`plugin-name#2`](link to GitHub directory of the second plugin) -> - ... -> ``` -> -> `plugin-name` is the approved name of the plugin as appeared in the registry for approved plugins or in the format of `username/repo/plugin-name` for not-yet approved plugins. diff --git a/usage-guide/permissions.md b/usage-guide/permissions.md index 3ff6888..fbb3538 100644 --- a/usage-guide/permissions.md +++ b/usage-guide/permissions.md @@ -1,3 +1,54 @@ --- description: How to use permissions in modmail. ---- \ No newline at end of file +--- + +# Permissions + +The modmail bot comes with an advanced permission system that makes it able to choose which individual users or users with certain roles can use modmail specific commands. + +The permission levels are the following: +* Owner \[5] +* Administrator \[4] +* Moderator \[3] +* Supporter \[2] +* Regular \[1] + +You can view each permission level that is required for the specific command inside the help command. + +
Screenshot of the Logviewer homepage.
+ +## Setting up permissions +These permissions can added in two different ways. + +### Adding a level to a role or user +`?permissions add level [name] [role/user]` + +Examples: + +* `?perms add level Regular everyone` +* `?perms add level Moderator @mods` +* `?perms add level Owner @user` + +### Adding a command to a role or user + +`?permissions add command [name] [role/user]` + +Examples: + +* `?perms add command reply @user` +* `?perms add command "plugin enabled" @role` +* `?perms add command help 984301093849028` + +## Override permission level +In some cases it can be useful to override a command permission level. +This can be done like this: + +`?permissions override ` + +Examples: + +* `?perms override reply administrator` +* `?perms override "plugin enabled" moderator` + +*** +If you need help setting up permissions, feel free to join our [Discord server](https://discord.gg/zmdYe3ZVHG) and DM Modmail. One of our support members will help you. \ No newline at end of file diff --git a/usage-guide/plugins.md b/usage-guide/plugins.md index d4e06b7..579ef98 100644 --- a/usage-guide/plugins.md +++ b/usage-guide/plugins.md @@ -1,3 +1,146 @@ ---- -description: Installing and using plugins for extended functionality. ---- \ No newline at end of file +# Plugins + +Plugins can add additional functionality into the modmail bot. +You can view a list of approved plugins via the ``?plugins registry`` command or take a look at the [`plugins/registry.json`](https://github.com/modmail-dev/modmail/blob/master/plugins/registry.json). + +## Guidelines + +To get approved and officially verified, you need to ensure you follow these guidelines: + +* Supporting Python 3.10 (and above). +* No malicious intent. +* The plugin cannot be a feature pending to be added into [Modmail](https://github.com/modmail-dev/modmail/issues). You can submit a PR to add it to the core Modmail. +* Core Modmail still needs to 100% function. +* Cog name cannot be the same as any current class (`Core`, `Modmail`). +* It cannot have the same name as another approved plugin. + +## Creating Plugins + +We use [discord.py](https://discordpy.readthedocs.io/en/stable/) for the bot and plugins take the form of [Cogs](https://discordpy.readthedocs.io/en/stable/ext/commands/cogs.html). + +Short example: + +```py +from discord.ext import commands + +class Hello(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @commands.Cog.listener() + async def on_message(self, message): + print(message.content) + + @commands.command() + async def say(self, ctx, *, message): + await ctx.send(message) + +async def setup(bot): + await bot.add_cog(Hello(bot)) +``` + +### Folder Structure + +Your plugin has to be uploaded on Github on a **public repository.** (Note: private repositories are supported, but they require extra setup, see [Private Plugins](https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token)). The repository folder structure has to be as follows: + +```yaml +root: + plugin_name: + .. + plugin_name.py + requirements.txt [optional] + plugin_name: + .. + plugin_name.py + requirements.txt [optional] +``` + +The plugin will be loaded with something similar to + +```py +await bot.load_extension('username.plugin_name.plugin_name') +``` + +To install a plugin that is not in the official registry, type: + +``` +?plugin add githubusername/plugin_repo/plugin_name[@branch] +``` + +An example of a plugin can be seen at [`fourjr/modmail-plugins`](https://github.com/fourjr/modmail-plugins) or any of the plugins in our [registry](https://github.com/modmail-dev/modmail/blob/master/plugins/registry.json). + +#### Branch parameter + +The branch parameter is **optional** (default to `master`) and can be used to test in-development/unstable plugins with a development branch. + +Users will always be updated to the latest version. Thus, if there is a broken plugin on the latest version, users would not be able to use the plugin. + +#### @local (For Developers) + +To make it easier to develop a plugin, there's a folder named `@local` in the plugins folder. You can directly put a folder for each plugin in it. + +Using the example cog above, the load command would be + +``` +?plugin load @local/hello +``` + +#### Best Practices + +1. Create a development branch +2. Push to it until you are confident that your code is stable +3. Merge it into `master` using pull requests or `git merge -v dev --squash` +4. Update your plugin! + +### Private Plugins + +* Obtain a [Github Personal Access Token](https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token) with `repo` scope +* Include `GITHUB_TOKEN` as a config variable (or in .env) with the token as the value. +* Upload your code to a private Github repository. +* Install just like a normal public plugin. + +### Database Interfacing + +Do **not** interact with `bot.api` directly. Fetch a partition and use it: + +```python +def __init__(self, bot): # in the class init + self.coll = bot.api.get_plugin_partition(self) +``` + +`self.coll` is a [motor.motor\_asyncio.AsyncIOMotorCollection](https://motor.readthedocs.io/en/stable/api-asyncio/asyncio\_motor\_collection.html) + +### Additional PIP requirements + +Create a [`requirements.txt` file](https://pip.pypa.io/en/stable/user\_guide/#requirements-files) in the plugin folder. Packages listed here would be installed via something similar to the following command: + +``` +python3 -m pip install -r requirements.txt --user -q -q +``` + +### Exposed Events + +The bot dispatches custom events to aid plugin developers to extend Modmail functionality. + +Currently, we have these custom coroutines: + +* `Bot.format_channel_name(bot, author, exclude_channel=None, force_null=False)` can be overwritten for custom behaviour. +* `on_plugins_ready()` which is dispatched when all the plugins are fully loaded and ready to be used. +* `on_thread_initiate(thread, creator, category, initial_message)` which is dispatched at the beginning of setup process. It is recommended to use the other events instead. +* `on_thread_create(thread)` which is dispatched when the thread is registered as a thread by Modmail (i.e., when channel topic is edited). +* `on_thread_ready(thread, creator, category, initial_message)` which is dispatched when a thread channel is created and the `genesis_message` (info embed) is sent. It is recommended to use this event. +* `on_thread_close(thread, closer, silent, delete_channel, message, scheduled)` which is dispatched when a thread is closed, after channel deletion. +* `on_thread_reply(thread, from_mod, message, anonymous, plain)` which is dispatched upon any reply. + +e.g. + +```py +@commands.Cog.listener() +async def on_thread_ready(self, thread, creator, category, initial_message): + msg = thread.genesis_message + ... # do stuff +``` + +### Approval request + +Create a [Pull Request](https://github.com/modmail-dev/modmail/pulls) adding your plugin into [`plugins/registry.json`](https://github.com/modmail-dev/modmail/blob/master/plugins/registry.json) and we will take a look at it.