From 8152017f4dc72744d0b797ca84124fdb2e12f527 Mon Sep 17 00:00:00 2001 From: Raiden Date: Fri, 7 Apr 2023 10:26:47 +0000 Subject: [PATCH 01/33] GitBook: No commit message --- .gitbook/assets/image.png | Bin 0 -> 30662 bytes SUMMARY.md | 26 +- installation/local-hosting-vps/ubuntu.md | 152 ++- installation/railway.md | 32 +- old-docs/color-names.md | 1165 +++++++++++++++++ .../configuration-variables-config-vars.md | 38 + old-docs/configure-modmail-and-logviewer.md | 59 + old-docs/frequently-asked-questions.md | 53 + old-docs/installation-1.md | 59 + old-docs/installation-continued.md | 121 ++ old-docs/modmail-usage.md | 21 + old-docs/permissions.md | 41 + old-docs/plugins.md | 147 +++ old-docs/seperate-server-setup.md | 6 + old-docs/the-unofficial-list-of-plugins.md | 52 + old-docs/updating.md | 38 + old-docs/video-tutorials.md | 3 + 17 files changed, 1971 insertions(+), 42 deletions(-) create mode 100644 .gitbook/assets/image.png create mode 100644 old-docs/color-names.md create mode 100644 old-docs/configuration-variables-config-vars.md create mode 100644 old-docs/configure-modmail-and-logviewer.md create mode 100644 old-docs/frequently-asked-questions.md create mode 100644 old-docs/installation-1.md create mode 100644 old-docs/installation-continued.md create mode 100644 old-docs/modmail-usage.md create mode 100644 old-docs/permissions.md create mode 100644 old-docs/plugins.md create mode 100644 old-docs/seperate-server-setup.md create mode 100644 old-docs/the-unofficial-list-of-plugins.md create mode 100644 old-docs/updating.md create mode 100644 old-docs/video-tutorials.md diff --git a/.gitbook/assets/image.png b/.gitbook/assets/image.png new file mode 100644 index 0000000000000000000000000000000000000000..cb0a9668730cb023257d92c93d1574d6a4366130 GIT binary patch literal 30662 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 @@ -44,7 +47,6 @@ sudo apt install -y python3.10 python3.10-dev python3.10-venv \ You can manually compile Python instead of adding using the Deadsnakes PPA. Compiling Python may take a while (est. 5-10 minutes). -{% code title="bash" %} ```bash sudo apt update && sudo apt upgrade -y # Update and upgrade all packages sudo apt install -y software-properties-common \ @@ -59,12 +61,136 @@ cd Python-3.10.9 ./configure --enable-optimizations make altinstall ``` -{% endcode %} +## Installing Bot + +Clone and cd into the official Modmail repository with: + +```bash +git clone https://github.com/modmail-dev/modmail +cd modmail +``` + +Inside the Modmail folder, Install pipenv and the bot dependencies with: + +```bash +pip install pipenv +pipenv install +``` + +Create a file named `.env` with `nano` and paste all the environmental variables (secrets) needed to run the bot via right-clicking in the nano editor. + +```bash +nano .env +``` + +
+ +After that, press `Ctrl+O` and `Enter` to save your changes. Exit the `nano` editor with `Ctrl+X`. + +You can now go ahead and try running your bot with: + +```bash +pipenv run bot +``` + +If no error shows up, it means your bot is now running correctly. + +## Setting up auto-restart + +To have the bot auto-restart on crash or system reboot, we will be using systemd by making a service file for our bot. + +In order to create the service file, you will first need to know two things, your Linux `username`, your Modmail repository `path` and your Pipenv `path`. + +First, your Linux `username` can be fetched with the following command: + +```bash +whoami +``` + +If you have cloned the Modmail repo as a `root` user, your Modmail repo path should be: + +```bash +/root/modmail +``` + +Otherwise, your path should be: +```bash +/home/$USER/modmail/ +``` + +You can get your Pipenv `path` with: + +``` +whereis pipenv +``` +Now, using `nano`, create a service file for systemd with: +```bash +sudo nano /etc/systemd/system/modmail.service +``` + +and paste in the contents below, replacing `username`, `modmail_path` and `pipenv_path` with yours respectively. `Ctrl+O` and `Enter` to save. `Ctrl+X` to exit the nano editor. + +```bash +[Unit] +Description=Modmail bot +After=network.target + +[Service] +User=username +Group=username +Restart=always +RestartSec=10 +Type=simple +WorkingDirectory=modmail_path +ExecStart=pipenv_path run python bot.py + +[Install] +WantedBy=multi-user.target +``` + +Now, start your Modmail bot with: + +```bash +sudo systemctl start modmail +``` + +If everything goes correctly, you should see your bot online. You can also view the logs of your systemd process with: + +```bash +sudo journalctl -eu modmail +``` + +With that said, go ahead and enable your Modmail service to auto-restart after crash and reboot with: + +```bash +sudo systemctl enable modmail +``` + +If in the future you need to stop and disable your Modmail service, you can do so with: + +```bash +sudo systemctl stop modmail +sudo systemctl disable modmail +``` ## Updating + +Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. + +If for some reason your update command isn't working correctly, you can update your bot by going into your modmail folder and pulling the latest changes from GitHub like so: + +```bash +cd modmail && git pull +``` + +Be sure to restart your bot to apply the changes. If you followed the above instructions on setting up auto-restart, you can do so with: + +```bash +sudo systemctl restart modmail +``` diff --git a/installation/railway.md b/installation/railway.md index b287180..fb21bff 100644 --- a/installation/railway.md +++ b/installation/railway.md @@ -6,7 +6,7 @@ description: Deploy Modmail on Railway PaaS. ## What is Railway? -Railway is a deployment platform where you can provision infrastructure, develop with that infrastructure locally, and then deploy to the cloud. +Railway is a deployment platform where you can provision infrastructure, develop with that infrastructure locally, and then deploy to the cloud. ## Requirements @@ -27,7 +27,7 @@ To keep your bot running 24/7, you'll need to sign up for their "Developer" plan You will need to fork our repositories to deploy onto Railway. -Make sure you're logged in to [GitHub](https://github.com/). You will need to fork **two** repositories. +Make sure you're logged in to [GitHub](https://github.com/). You will need to fork **two** repositories. First we fork the Modmail repository. Head over to [https://github.com/modmail-dev/modmail/fork](https://github.com/modmail-dev/modmail/fork), leave all the settings as default, and click **Create fork**. @@ -37,7 +37,7 @@ Next do the same for the Logviewer repository by heading over to [https://github
Screenshot of creating a Logviewer fork.

Create a GitHub fork for the Logviewer Repository.

-Next, to keep your Modmail and Logviewer up to date, you will need to install the [Pull app](https://github.com/apps/pull). Simply head over to [https://github.com/apps/pull](https://github.com/apps/pull), click **Install**, choose **Only select repositories**, then select **both** the Modmail and Logviewer repositories that you forked in the previous step. +Next, to keep your Modmail and Logviewer up to date, you will need to install the [Pull app](https://github.com/apps/pull). Simply head over to [https://github.com/apps/pull](https://github.com/apps/pull), click **Install**, choose **Only select repositories**, then select **both** the Modmail and Logviewer repositories that you forked in the previous step.
@@ -69,9 +69,7 @@ If your GitHub account is new or not reputable, you may be asked to verify your This unfortunately means that you will have to provide a credit card for verification. Click **Verify Account**, read and accept Railway's **Terms of Service**, then enter your credit card details. You may be temporary charged $1 USD to confirm the legitimacy of the card. -![Screenshot of clicking verify account.](../.gitbook/assets/RW6.png)![Screenshot of clicking terms of service.](../.gitbook/assets/RW7.png)![Screenshot of clicking I agree with terms of service.](../.gitbook/assets/RW7B.png)![Screenshot of entering your credit card details.](../.gitbook/assets/RW8.png) - - +Screenshot of clicking verify account.Screenshot of clicking terms of service.Screenshot of clicking I agree with terms of service.Screenshot of entering your credit card details. @@ -103,7 +101,7 @@ From the [**New Project**](https://railway.app/new) page, create the project by
-Click **New Variable**, set left to be **`CONNECTION_URI`**, then on the right, paste your revised MongoDB connection string from your Notepad (if this is new to you, [go back and read the initial steps](./)). +Click **New Variable**, set left to be **`CONNECTION_URI`**, then on the right, paste your revised MongoDB connection string from your Notepad (if this is new to you, [go back and read the initial steps](./)). Don't add any other variables, nor use the suggested variables section. You should see a new variable named **`CONNECTION_URI`** added under variables once you're done. @@ -129,7 +127,7 @@ Next, go to the **Deployments** tab, look at the latest deployment, is it succes -
Screenshot of the Logviewer homepage.

This URL should show the Logviewer homepage.

+
Screenshot of the Logviewer homepage.

This URL should show the Logviewer homepage.

@@ -153,22 +151,27 @@ Click **New Variable.** We will be adding 5 variables in total, so repeat this s | -------------------- | ----------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | | **`CONNECTION_URI`** | The MongoDB Connection string from your Notepad. |
mongodb+srv://modmail:elAO7wF1r07pNG6u@cluster0.example.mongodb.net
 
| +| | | | | **`TOKEN`** | The Discord bot token from your Notepad. |
MTA3Djv3IAxNjk1NDgdKD231.G1AoUjD.5z629aKP34JKHn4v1EsdNUwdDO3MvBR9ifVES4
 
| +| | | | | **`LOG_URL`** | The Logviewer URL from your Notepad. Remember to add `https://` in front! |
https://web-production-1234.up.railway.app
 
| +| | | | | **`OWNERS`** | Your Discord ID. If you have multiple owners, separate your IDs with a comma. |
718827787302791100
 
| +| | | | | **`GUILD_ID`** | The ID of the Discord server for your Modmail bot. |
109483701365508619
 
| +| | | |
Do you have a separate staff server? -If you manage a large server where you have a separate server for communication among your moderation team, Modmail supports directing threads into the staff server instead of your main (public) server. +If you manage a large server where you have a separate server for communication among your moderation team, Modmail supports directing threads into the staff server instead of your main (public) server. -Simply add an additional variable named **`MODMAIL_GUILD_ID`** and set the value to your staff server's ID. +Simply add an additional variable named **`MODMAIL_GUILD_ID`** and set the value to your staff server's ID. Note: the **`GUILD_ID`** should always be your main server's ID (not staff server's). @@ -204,7 +207,7 @@ You have 10 days to test Modmail without upgrading to the "Developer" plan. As m #### Usage-based subscription -Head over to the **** [**Billing Details**](https://railway.app/account/billing) page, click the **Unlock** button to unlock Developer plan. Then input your credit card details and hit **Subscribe to Developer Plan**. +Head over to the \*\*\*\* [**Billing Details**](https://railway.app/account/billing) page, click the **Unlock** button to unlock Developer plan. Then input your credit card details and hit **Subscribe to Developer Plan**. {% hint style="warning" %} Subscribing to the Developer plan under _usage based subscription_ **may incur you unexpected charges**. This because Railway does not provide any safe-guards or monthly spending limits. Average Modmail and Logviewer usage should be well below the free threshold. However, if you run resource-intensive code via plugins or due to other means, you credit card may be billed. @@ -258,9 +261,9 @@ There you go! Your bot should now be able to run 24/7 without interruptions. Hea How do I cancel my Developer plan subscription? -If you're subscribed under the [usage-based subscription](railway.md#usage-based-subscription) model, you can cancel your subscription by heading to the **** [**Billing Details**](https://railway.app/account/billing) page, click **Manage Subscription**, then click **Cancel plan**. +If you're subscribed under the [usage-based subscription](railway.md#usage-based-subscription) model, you can cancel your subscription by heading to the \*\*\*\* [**Billing Details**](https://railway.app/account/billing) page, click **Manage Subscription**, then click **Cancel plan**. -![Screenshot of clicking manage subscription.](../.gitbook/assets/RW25.png)![Screenshot of clicking cancel plan.](../.gitbook/assets/RW26.png) +Screenshot of clicking manage subscription.Screenshot of clicking cancel plan.
@@ -281,6 +284,3 @@ You can disable auto-updates by heading to the settings page for **both** your M Now that you've successfully set up Modmail, visit the [Getting Started](../getting-started.md) page to find information on using Modmail. You can also join our [**Discord Server**](https://discord.gg/cnUpwrnpYb) to interact with our community or get support for Modmail. - - - diff --git a/old-docs/color-names.md b/old-docs/color-names.md new file mode 100644 index 0000000..5fda98b --- /dev/null +++ b/old-docs/color-names.md @@ -0,0 +1,1165 @@ +# Color Names + +## Color Names + +Color Names can be used for `mod_color`, `recipient_color`, and `main_color` configuration variables. + +*** + +### Base Colors: + +| Color Name | Hex Code | +| ---------- | ------------------------------------------------------------------------- | +| b | ![#0000ff](https://via.placeholder.com/15/0000ff/000000?text=+) `#0000ff` | +| g | ![#007f00](https://via.placeholder.com/15/007f00/000000?text=+) `#007f00` | +| r | ![#ff0000](https://via.placeholder.com/15/ff0000/000000?text=+) `#ff0000` | +| c | ![#00bfbf](https://via.placeholder.com/15/00bfbf/000000?text=+) `#00bfbf` | +| m | ![#bf00bf](https://via.placeholder.com/15/bf00bf/000000?text=+) `#bf00bf` | +| y | ![#bfbf00](https://via.placeholder.com/15/bfbf00/000000?text=+) `#bfbf00` | +| k | ![#000000](https://via.placeholder.com/15/000000/000000?text=+) `#000000` | +| w | ![#ffffff](https://via.placeholder.com/15/ffffff/000000?text=+) `#ffffff` | + +*** + +### Tableau Colors: + +| Color Name | Hex Code | +| ---------- | ------------------------------------------------------------------------- | +| blue | ![#1f77b4](https://via.placeholder.com/15/1f77b4/000000?text=+) `#1f77b4` | +| orange | ![#ff7f0e](https://via.placeholder.com/15/ff7f0e/000000?text=+) `#ff7f0e` | +| green | ![#2ca02c](https://via.placeholder.com/15/2ca02c/000000?text=+) `#2ca02c` | +| red | ![#d62728](https://via.placeholder.com/15/d62728/000000?text=+) `#d62728` | +| purple | ![#9467bd](https://via.placeholder.com/15/9467bd/000000?text=+) `#9467bd` | +| brown | ![#8c564b](https://via.placeholder.com/15/8c564b/000000?text=+) `#8c564b` | +| pink | ![#e377c2](https://via.placeholder.com/15/e377c2/000000?text=+) `#e377c2` | +| gray | ![#7f7f7f](https://via.placeholder.com/15/7f7f7f/000000?text=+) `#7f7f7f` | +| olive | ![#bcbd22](https://via.placeholder.com/15/bcbd22/000000?text=+) `#bcbd22` | +| cyan | ![#17becf](https://via.placeholder.com/15/17becf/000000?text=+) `#17becf` | + +To force use tableau color, use `tab:` (ie. `tab:red`). + +*** + +### XKCD Colors: + +| Color Name | Hex Code | +| -------------------------- | ------------------------------------------------------------------------- | +| cloudy blue | ![#acc2d9](https://via.placeholder.com/15/acc2d9/000000?text=+) `#acc2d9` | +| dark pastel green | ![#56ae57](https://via.placeholder.com/15/56ae57/000000?text=+) `#56ae57` | +| dust | ![#b2996e](https://via.placeholder.com/15/b2996e/000000?text=+) `#b2996e` | +| electric lime | ![#a8ff04](https://via.placeholder.com/15/a8ff04/000000?text=+) `#a8ff04` | +| fresh green | ![#69d84f](https://via.placeholder.com/15/69d84f/000000?text=+) `#69d84f` | +| light eggplant | ![#894585](https://via.placeholder.com/15/894585/000000?text=+) `#894585` | +| nasty green | ![#70b23f](https://via.placeholder.com/15/70b23f/000000?text=+) `#70b23f` | +| really light blue | ![#d4ffff](https://via.placeholder.com/15/d4ffff/000000?text=+) `#d4ffff` | +| tea | ![#65ab7c](https://via.placeholder.com/15/65ab7c/000000?text=+) `#65ab7c` | +| warm purple | ![#952e8f](https://via.placeholder.com/15/952e8f/000000?text=+) `#952e8f` | +| yellowish tan | ![#fcfc81](https://via.placeholder.com/15/fcfc81/000000?text=+) `#fcfc81` | +| cement | ![#a5a391](https://via.placeholder.com/15/a5a391/000000?text=+) `#a5a391` | +| dark grass green | ![#388004](https://via.placeholder.com/15/388004/000000?text=+) `#388004` | +| dusty teal | ![#4c9085](https://via.placeholder.com/15/4c9085/000000?text=+) `#4c9085` | +| grey teal | ![#5e9b8a](https://via.placeholder.com/15/5e9b8a/000000?text=+) `#5e9b8a` | +| macaroni and cheese | ![#efb435](https://via.placeholder.com/15/efb435/000000?text=+) `#efb435` | +| pinkish tan | ![#d99b82](https://via.placeholder.com/15/d99b82/000000?text=+) `#d99b82` | +| spruce | ![#0a5f38](https://via.placeholder.com/15/0a5f38/000000?text=+) `#0a5f38` | +| strong blue | ![#0c06f7](https://via.placeholder.com/15/0c06f7/000000?text=+) `#0c06f7` | +| toxic green | ![#61de2a](https://via.placeholder.com/15/61de2a/000000?text=+) `#61de2a` | +| windows blue | ![#3778bf](https://via.placeholder.com/15/3778bf/000000?text=+) `#3778bf` | +| blue blue | ![#2242c7](https://via.placeholder.com/15/2242c7/000000?text=+) `#2242c7` | +| blue with a hint of purple | ![#533cc6](https://via.placeholder.com/15/533cc6/000000?text=+) `#533cc6` | +| booger | ![#9bb53c](https://via.placeholder.com/15/9bb53c/000000?text=+) `#9bb53c` | +| bright sea green | ![#05ffa6](https://via.placeholder.com/15/05ffa6/000000?text=+) `#05ffa6` | +| dark green blue | ![#1f6357](https://via.placeholder.com/15/1f6357/000000?text=+) `#1f6357` | +| deep turquoise | ![#017374](https://via.placeholder.com/15/017374/000000?text=+) `#017374` | +| green teal | ![#0cb577](https://via.placeholder.com/15/0cb577/000000?text=+) `#0cb577` | +| strong pink | ![#ff0789](https://via.placeholder.com/15/ff0789/000000?text=+) `#ff0789` | +| bland | ![#afa88b](https://via.placeholder.com/15/afa88b/000000?text=+) `#afa88b` | +| deep aqua | ![#08787f](https://via.placeholder.com/15/08787f/000000?text=+) `#08787f` | +| lavender pink | ![#dd85d7](https://via.placeholder.com/15/dd85d7/000000?text=+) `#dd85d7` | +| light moss green | ![#a6c875](https://via.placeholder.com/15/a6c875/000000?text=+) `#a6c875` | +| light seafoam green | ![#a7ffb5](https://via.placeholder.com/15/a7ffb5/000000?text=+) `#a7ffb5` | +| olive yellow | ![#c2b709](https://via.placeholder.com/15/c2b709/000000?text=+) `#c2b709` | +| pig pink | ![#e78ea5](https://via.placeholder.com/15/e78ea5/000000?text=+) `#e78ea5` | +| deep lilac | ![#966ebd](https://via.placeholder.com/15/966ebd/000000?text=+) `#966ebd` | +| desert | ![#ccad60](https://via.placeholder.com/15/ccad60/000000?text=+) `#ccad60` | +| dusty lavender | ![#ac86a8](https://via.placeholder.com/15/ac86a8/000000?text=+) `#ac86a8` | +| purpley grey | ![#947e94](https://via.placeholder.com/15/947e94/000000?text=+) `#947e94` | +| purply | ![#983fb2](https://via.placeholder.com/15/983fb2/000000?text=+) `#983fb2` | +| candy pink | ![#ff63e9](https://via.placeholder.com/15/ff63e9/000000?text=+) `#ff63e9` | +| light pastel green | ![#b2fba5](https://via.placeholder.com/15/b2fba5/000000?text=+) `#b2fba5` | +| boring green | ![#63b365](https://via.placeholder.com/15/63b365/000000?text=+) `#63b365` | +| kiwi green | ![#8ee53f](https://via.placeholder.com/15/8ee53f/000000?text=+) `#8ee53f` | +| light grey green | ![#b7e1a1](https://via.placeholder.com/15/b7e1a1/000000?text=+) `#b7e1a1` | +| orange pink | ![#ff6f52](https://via.placeholder.com/15/ff6f52/000000?text=+) `#ff6f52` | +| tea green | ![#bdf8a3](https://via.placeholder.com/15/bdf8a3/000000?text=+) `#bdf8a3` | +| very light brown | ![#d3b683](https://via.placeholder.com/15/d3b683/000000?text=+) `#d3b683` | +| egg shell | ![#fffcc4](https://via.placeholder.com/15/fffcc4/000000?text=+) `#fffcc4` | +| eggplant purple | ![#430541](https://via.placeholder.com/15/430541/000000?text=+) `#430541` | +| powder pink | ![#ffb2d0](https://via.placeholder.com/15/ffb2d0/000000?text=+) `#ffb2d0` | +| reddish grey | ![#997570](https://via.placeholder.com/15/997570/000000?text=+) `#997570` | +| baby shit brown | ![#ad900d](https://via.placeholder.com/15/ad900d/000000?text=+) `#ad900d` | +| liliac | ![#c48efd](https://via.placeholder.com/15/c48efd/000000?text=+) `#c48efd` | +| stormy blue | ![#507b9c](https://via.placeholder.com/15/507b9c/000000?text=+) `#507b9c` | +| ugly brown | ![#7d7103](https://via.placeholder.com/15/7d7103/000000?text=+) `#7d7103` | +| custard | ![#fffd78](https://via.placeholder.com/15/fffd78/000000?text=+) `#fffd78` | +| darkish pink | ![#da467d](https://via.placeholder.com/15/da467d/000000?text=+) `#da467d` | +| deep brown | ![#410200](https://via.placeholder.com/15/410200/000000?text=+) `#410200` | +| greenish beige | ![#c9d179](https://via.placeholder.com/15/c9d179/000000?text=+) `#c9d179` | +| manilla | ![#fffa86](https://via.placeholder.com/15/fffa86/000000?text=+) `#fffa86` | +| off blue | ![#5684ae](https://via.placeholder.com/15/5684ae/000000?text=+) `#5684ae` | +| battleship grey | ![#6b7c85](https://via.placeholder.com/15/6b7c85/000000?text=+) `#6b7c85` | +| browny green | ![#6f6c0a](https://via.placeholder.com/15/6f6c0a/000000?text=+) `#6f6c0a` | +| bruise | ![#7e4071](https://via.placeholder.com/15/7e4071/000000?text=+) `#7e4071` | +| kelley green | ![#009337](https://via.placeholder.com/15/009337/000000?text=+) `#009337` | +| sickly yellow | ![#d0e429](https://via.placeholder.com/15/d0e429/000000?text=+) `#d0e429` | +| sunny yellow | ![#fff917](https://via.placeholder.com/15/fff917/000000?text=+) `#fff917` | +| azul | ![#1d5dec](https://via.placeholder.com/15/1d5dec/000000?text=+) `#1d5dec` | +| darkgreen | ![#054907](https://via.placeholder.com/15/054907/000000?text=+) `#054907` | +| green/yellow | ![#b5ce08](https://via.placeholder.com/15/b5ce08/000000?text=+) `#b5ce08` | +| lichen | ![#8fb67b](https://via.placeholder.com/15/8fb67b/000000?text=+) `#8fb67b` | +| light light green | ![#c8ffb0](https://via.placeholder.com/15/c8ffb0/000000?text=+) `#c8ffb0` | +| pale gold | ![#fdde6c](https://via.placeholder.com/15/fdde6c/000000?text=+) `#fdde6c` | +| sun yellow | ![#ffdf22](https://via.placeholder.com/15/ffdf22/000000?text=+) `#ffdf22` | +| tan green | ![#a9be70](https://via.placeholder.com/15/a9be70/000000?text=+) `#a9be70` | +| burple | ![#6832e3](https://via.placeholder.com/15/6832e3/000000?text=+) `#6832e3` | +| butterscotch | ![#fdb147](https://via.placeholder.com/15/fdb147/000000?text=+) `#fdb147` | +| toupe | ![#c7ac7d](https://via.placeholder.com/15/c7ac7d/000000?text=+) `#c7ac7d` | +| dark cream | ![#fff39a](https://via.placeholder.com/15/fff39a/000000?text=+) `#fff39a` | +| indian red | ![#850e04](https://via.placeholder.com/15/850e04/000000?text=+) `#850e04` | +| light lavendar | ![#efc0fe](https://via.placeholder.com/15/efc0fe/000000?text=+) `#efc0fe` | +| poison green | ![#40fd14](https://via.placeholder.com/15/40fd14/000000?text=+) `#40fd14` | +| baby puke green | ![#b6c406](https://via.placeholder.com/15/b6c406/000000?text=+) `#b6c406` | +| bright yellow green | ![#9dff00](https://via.placeholder.com/15/9dff00/000000?text=+) `#9dff00` | +| charcoal grey | ![#3c4142](https://via.placeholder.com/15/3c4142/000000?text=+) `#3c4142` | +| squash | ![#f2ab15](https://via.placeholder.com/15/f2ab15/000000?text=+) `#f2ab15` | +| cinnamon | ![#ac4f06](https://via.placeholder.com/15/ac4f06/000000?text=+) `#ac4f06` | +| light pea green | ![#c4fe82](https://via.placeholder.com/15/c4fe82/000000?text=+) `#c4fe82` | +| radioactive green | ![#2cfa1f](https://via.placeholder.com/15/2cfa1f/000000?text=+) `#2cfa1f` | +| raw sienna | ![#9a6200](https://via.placeholder.com/15/9a6200/000000?text=+) `#9a6200` | +| baby purple | ![#ca9bf7](https://via.placeholder.com/15/ca9bf7/000000?text=+) `#ca9bf7` | +| cocoa | ![#875f42](https://via.placeholder.com/15/875f42/000000?text=+) `#875f42` | +| light royal blue | ![#3a2efe](https://via.placeholder.com/15/3a2efe/000000?text=+) `#3a2efe` | +| orangeish | ![#fd8d49](https://via.placeholder.com/15/fd8d49/000000?text=+) `#fd8d49` | +| rust brown | ![#8b3103](https://via.placeholder.com/15/8b3103/000000?text=+) `#8b3103` | +| sand brown | ![#cba560](https://via.placeholder.com/15/cba560/000000?text=+) `#cba560` | +| swamp | ![#698339](https://via.placeholder.com/15/698339/000000?text=+) `#698339` | +| tealish green | ![#0cdc73](https://via.placeholder.com/15/0cdc73/000000?text=+) `#0cdc73` | +| burnt siena | ![#b75203](https://via.placeholder.com/15/b75203/000000?text=+) `#b75203` | +| camo | ![#7f8f4e](https://via.placeholder.com/15/7f8f4e/000000?text=+) `#7f8f4e` | +| dusk blue | ![#26538d](https://via.placeholder.com/15/26538d/000000?text=+) `#26538d` | +| fern | ![#63a950](https://via.placeholder.com/15/63a950/000000?text=+) `#63a950` | +| old rose | ![#c87f89](https://via.placeholder.com/15/c87f89/000000?text=+) `#c87f89` | +| pale light green | ![#b1fc99](https://via.placeholder.com/15/b1fc99/000000?text=+) `#b1fc99` | +| peachy pink | ![#ff9a8a](https://via.placeholder.com/15/ff9a8a/000000?text=+) `#ff9a8a` | +| rosy pink | ![#f6688e](https://via.placeholder.com/15/f6688e/000000?text=+) `#f6688e` | +| light bluish green | ![#76fda8](https://via.placeholder.com/15/76fda8/000000?text=+) `#76fda8` | +| light bright green | ![#53fe5c](https://via.placeholder.com/15/53fe5c/000000?text=+) `#53fe5c` | +| light neon green | ![#4efd54](https://via.placeholder.com/15/4efd54/000000?text=+) `#4efd54` | +| light seafoam | ![#a0febf](https://via.placeholder.com/15/a0febf/000000?text=+) `#a0febf` | +| tiffany blue | ![#7bf2da](https://via.placeholder.com/15/7bf2da/000000?text=+) `#7bf2da` | +| washed out green | ![#bcf5a6](https://via.placeholder.com/15/bcf5a6/000000?text=+) `#bcf5a6` | +| browny orange | ![#ca6b02](https://via.placeholder.com/15/ca6b02/000000?text=+) `#ca6b02` | +| nice blue | ![#107ab0](https://via.placeholder.com/15/107ab0/000000?text=+) `#107ab0` | +| sapphire | ![#2138ab](https://via.placeholder.com/15/2138ab/000000?text=+) `#2138ab` | +| greyish teal | ![#719f91](https://via.placeholder.com/15/719f91/000000?text=+) `#719f91` | +| orangey yellow | ![#fdb915](https://via.placeholder.com/15/fdb915/000000?text=+) `#fdb915` | +| parchment | ![#fefcaf](https://via.placeholder.com/15/fefcaf/000000?text=+) `#fefcaf` | +| straw | ![#fcf679](https://via.placeholder.com/15/fcf679/000000?text=+) `#fcf679` | +| very dark brown | ![#1d0200](https://via.placeholder.com/15/1d0200/000000?text=+) `#1d0200` | +| terracota | ![#cb6843](https://via.placeholder.com/15/cb6843/000000?text=+) `#cb6843` | +| ugly blue | ![#31668a](https://via.placeholder.com/15/31668a/000000?text=+) `#31668a` | +| clear blue | ![#247afd](https://via.placeholder.com/15/247afd/000000?text=+) `#247afd` | +| creme | ![#ffffb6](https://via.placeholder.com/15/ffffb6/000000?text=+) `#ffffb6` | +| foam green | ![#90fda9](https://via.placeholder.com/15/90fda9/000000?text=+) `#90fda9` | +| grey/green | ![#86a17d](https://via.placeholder.com/15/86a17d/000000?text=+) `#86a17d` | +| light gold | ![#fddc5c](https://via.placeholder.com/15/fddc5c/000000?text=+) `#fddc5c` | +| seafoam blue | ![#78d1b6](https://via.placeholder.com/15/78d1b6/000000?text=+) `#78d1b6` | +| topaz | ![#13bbaf](https://via.placeholder.com/15/13bbaf/000000?text=+) `#13bbaf` | +| violet pink | ![#fb5ffc](https://via.placeholder.com/15/fb5ffc/000000?text=+) `#fb5ffc` | +| wintergreen | ![#20f986](https://via.placeholder.com/15/20f986/000000?text=+) `#20f986` | +| yellow tan | ![#ffe36e](https://via.placeholder.com/15/ffe36e/000000?text=+) `#ffe36e` | +| dark fuchsia | ![#9d0759](https://via.placeholder.com/15/9d0759/000000?text=+) `#9d0759` | +| indigo blue | ![#3a18b1](https://via.placeholder.com/15/3a18b1/000000?text=+) `#3a18b1` | +| light yellowish green | ![#c2ff89](https://via.placeholder.com/15/c2ff89/000000?text=+) `#c2ff89` | +| pale magenta | ![#d767ad](https://via.placeholder.com/15/d767ad/000000?text=+) `#d767ad` | +| rich purple | ![#720058](https://via.placeholder.com/15/720058/000000?text=+) `#720058` | +| sunflower yellow | ![#ffda03](https://via.placeholder.com/15/ffda03/000000?text=+) `#ffda03` | +| green/blue | ![#01c08d](https://via.placeholder.com/15/01c08d/000000?text=+) `#01c08d` | +| leather | ![#ac7434](https://via.placeholder.com/15/ac7434/000000?text=+) `#ac7434` | +| racing green | ![#014600](https://via.placeholder.com/15/014600/000000?text=+) `#014600` | +| vivid purple | ![#9900fa](https://via.placeholder.com/15/9900fa/000000?text=+) `#9900fa` | +| dark royal blue | ![#02066f](https://via.placeholder.com/15/02066f/000000?text=+) `#02066f` | +| hazel | ![#8e7618](https://via.placeholder.com/15/8e7618/000000?text=+) `#8e7618` | +| muted pink | ![#d1768f](https://via.placeholder.com/15/d1768f/000000?text=+) `#d1768f` | +| booger green | ![#96b403](https://via.placeholder.com/15/96b403/000000?text=+) `#96b403` | +| canary | ![#fdff63](https://via.placeholder.com/15/fdff63/000000?text=+) `#fdff63` | +| cool grey | ![#95a3a6](https://via.placeholder.com/15/95a3a6/000000?text=+) `#95a3a6` | +| dark taupe | ![#7f684e](https://via.placeholder.com/15/7f684e/000000?text=+) `#7f684e` | +| darkish purple | ![#751973](https://via.placeholder.com/15/751973/000000?text=+) `#751973` | +| true green | ![#089404](https://via.placeholder.com/15/089404/000000?text=+) `#089404` | +| coral pink | ![#ff6163](https://via.placeholder.com/15/ff6163/000000?text=+) `#ff6163` | +| dark sage | ![#598556](https://via.placeholder.com/15/598556/000000?text=+) `#598556` | +| dark slate blue | ![#214761](https://via.placeholder.com/15/214761/000000?text=+) `#214761` | +| flat blue | ![#3c73a8](https://via.placeholder.com/15/3c73a8/000000?text=+) `#3c73a8` | +| mushroom | ![#ba9e88](https://via.placeholder.com/15/ba9e88/000000?text=+) `#ba9e88` | +| rich blue | ![#021bf9](https://via.placeholder.com/15/021bf9/000000?text=+) `#021bf9` | +| dirty purple | ![#734a65](https://via.placeholder.com/15/734a65/000000?text=+) `#734a65` | +| greenblue | ![#23c48b](https://via.placeholder.com/15/23c48b/000000?text=+) `#23c48b` | +| icky green | ![#8fae22](https://via.placeholder.com/15/8fae22/000000?text=+) `#8fae22` | +| light khaki | ![#e6f2a2](https://via.placeholder.com/15/e6f2a2/000000?text=+) `#e6f2a2` | +| warm blue | ![#4b57db](https://via.placeholder.com/15/4b57db/000000?text=+) `#4b57db` | +| dark hot pink | ![#d90166](https://via.placeholder.com/15/d90166/000000?text=+) `#d90166` | +| deep sea blue | ![#015482](https://via.placeholder.com/15/015482/000000?text=+) `#015482` | +| carmine | ![#9d0216](https://via.placeholder.com/15/9d0216/000000?text=+) `#9d0216` | +| dark yellow green | ![#728f02](https://via.placeholder.com/15/728f02/000000?text=+) `#728f02` | +| pale peach | ![#ffe5ad](https://via.placeholder.com/15/ffe5ad/000000?text=+) `#ffe5ad` | +| plum purple | ![#4e0550](https://via.placeholder.com/15/4e0550/000000?text=+) `#4e0550` | +| golden rod | ![#f9bc08](https://via.placeholder.com/15/f9bc08/000000?text=+) `#f9bc08` | +| neon red | ![#ff073a](https://via.placeholder.com/15/ff073a/000000?text=+) `#ff073a` | +| old pink | ![#c77986](https://via.placeholder.com/15/c77986/000000?text=+) `#c77986` | +| very pale blue | ![#d6fffe](https://via.placeholder.com/15/d6fffe/000000?text=+) `#d6fffe` | +| blood orange | ![#fe4b03](https://via.placeholder.com/15/fe4b03/000000?text=+) `#fe4b03` | +| grapefruit | ![#fd5956](https://via.placeholder.com/15/fd5956/000000?text=+) `#fd5956` | +| sand yellow | ![#fce166](https://via.placeholder.com/15/fce166/000000?text=+) `#fce166` | +| clay brown | ![#b2713d](https://via.placeholder.com/15/b2713d/000000?text=+) `#b2713d` | +| dark blue grey | ![#1f3b4d](https://via.placeholder.com/15/1f3b4d/000000?text=+) `#1f3b4d` | +| flat green | ![#699d4c](https://via.placeholder.com/15/699d4c/000000?text=+) `#699d4c` | +| light green blue | ![#56fca2](https://via.placeholder.com/15/56fca2/000000?text=+) `#56fca2` | +| warm pink | ![#fb5581](https://via.placeholder.com/15/fb5581/000000?text=+) `#fb5581` | +| dodger blue | ![#3e82fc](https://via.placeholder.com/15/3e82fc/000000?text=+) `#3e82fc` | +| gross green | ![#a0bf16](https://via.placeholder.com/15/a0bf16/000000?text=+) `#a0bf16` | +| ice | ![#d6fffa](https://via.placeholder.com/15/d6fffa/000000?text=+) `#d6fffa` | +| metallic blue | ![#4f738e](https://via.placeholder.com/15/4f738e/000000?text=+) `#4f738e` | +| pale salmon | ![#ffb19a](https://via.placeholder.com/15/ffb19a/000000?text=+) `#ffb19a` | +| sap green | ![#5c8b15](https://via.placeholder.com/15/5c8b15/000000?text=+) `#5c8b15` | +| algae | ![#54ac68](https://via.placeholder.com/15/54ac68/000000?text=+) `#54ac68` | +| bluey grey | ![#89a0b0](https://via.placeholder.com/15/89a0b0/000000?text=+) `#89a0b0` | +| greeny grey | ![#7ea07a](https://via.placeholder.com/15/7ea07a/000000?text=+) `#7ea07a` | +| highlighter green | ![#1bfc06](https://via.placeholder.com/15/1bfc06/000000?text=+) `#1bfc06` | +| light light blue | ![#cafffb](https://via.placeholder.com/15/cafffb/000000?text=+) `#cafffb` | +| light mint | ![#b6ffbb](https://via.placeholder.com/15/b6ffbb/000000?text=+) `#b6ffbb` | +| raw umber | ![#a75e09](https://via.placeholder.com/15/a75e09/000000?text=+) `#a75e09` | +| vivid blue | ![#152eff](https://via.placeholder.com/15/152eff/000000?text=+) `#152eff` | +| deep lavender | ![#8d5eb7](https://via.placeholder.com/15/8d5eb7/000000?text=+) `#8d5eb7` | +| dull teal | ![#5f9e8f](https://via.placeholder.com/15/5f9e8f/000000?text=+) `#5f9e8f` | +| light greenish blue | ![#63f7b4](https://via.placeholder.com/15/63f7b4/000000?text=+) `#63f7b4` | +| mud green | ![#606602](https://via.placeholder.com/15/606602/000000?text=+) `#606602` | +| pinky | ![#fc86aa](https://via.placeholder.com/15/fc86aa/000000?text=+) `#fc86aa` | +| red wine | ![#8c0034](https://via.placeholder.com/15/8c0034/000000?text=+) `#8c0034` | +| shit green | ![#758000](https://via.placeholder.com/15/758000/000000?text=+) `#758000` | +| tan brown | ![#ab7e4c](https://via.placeholder.com/15/ab7e4c/000000?text=+) `#ab7e4c` | +| darkblue | ![#030764](https://via.placeholder.com/15/030764/000000?text=+) `#030764` | +| rosa | ![#fe86a4](https://via.placeholder.com/15/fe86a4/000000?text=+) `#fe86a4` | +| lipstick | ![#d5174e](https://via.placeholder.com/15/d5174e/000000?text=+) `#d5174e` | +| pale mauve | ![#fed0fc](https://via.placeholder.com/15/fed0fc/000000?text=+) `#fed0fc` | +| claret | ![#680018](https://via.placeholder.com/15/680018/000000?text=+) `#680018` | +| dandelion | ![#fedf08](https://via.placeholder.com/15/fedf08/000000?text=+) `#fedf08` | +| orangered | ![#fe420f](https://via.placeholder.com/15/fe420f/000000?text=+) `#fe420f` | +| poop green | ![#6f7c00](https://via.placeholder.com/15/6f7c00/000000?text=+) `#6f7c00` | +| ruby | ![#ca0147](https://via.placeholder.com/15/ca0147/000000?text=+) `#ca0147` | +| dark | ![#1b2431](https://via.placeholder.com/15/1b2431/000000?text=+) `#1b2431` | +| greenish turquoise | ![#00fbb0](https://via.placeholder.com/15/00fbb0/000000?text=+) `#00fbb0` | +| pastel red | ![#db5856](https://via.placeholder.com/15/db5856/000000?text=+) `#db5856` | +| piss yellow | ![#ddd618](https://via.placeholder.com/15/ddd618/000000?text=+) `#ddd618` | +| bright cyan | ![#41fdfe](https://via.placeholder.com/15/41fdfe/000000?text=+) `#41fdfe` | +| dark coral | ![#cf524e](https://via.placeholder.com/15/cf524e/000000?text=+) `#cf524e` | +| algae green | ![#21c36f](https://via.placeholder.com/15/21c36f/000000?text=+) `#21c36f` | +| darkish red | ![#a90308](https://via.placeholder.com/15/a90308/000000?text=+) `#a90308` | +| reddy brown | ![#6e1005](https://via.placeholder.com/15/6e1005/000000?text=+) `#6e1005` | +| blush pink | ![#fe828c](https://via.placeholder.com/15/fe828c/000000?text=+) `#fe828c` | +| camouflage green | ![#4b6113](https://via.placeholder.com/15/4b6113/000000?text=+) `#4b6113` | +| lawn green | ![#4da409](https://via.placeholder.com/15/4da409/000000?text=+) `#4da409` | +| putty | ![#beae8a](https://via.placeholder.com/15/beae8a/000000?text=+) `#beae8a` | +| vibrant blue | ![#0339f8](https://via.placeholder.com/15/0339f8/000000?text=+) `#0339f8` | +| dark sand | ![#a88f59](https://via.placeholder.com/15/a88f59/000000?text=+) `#a88f59` | +| purple/blue | ![#5d21d0](https://via.placeholder.com/15/5d21d0/000000?text=+) `#5d21d0` | +| saffron | ![#feb209](https://via.placeholder.com/15/feb209/000000?text=+) `#feb209` | +| twilight | ![#4e518b](https://via.placeholder.com/15/4e518b/000000?text=+) `#4e518b` | +| warm brown | ![#964e02](https://via.placeholder.com/15/964e02/000000?text=+) `#964e02` | +| bluegrey | ![#85a3b2](https://via.placeholder.com/15/85a3b2/000000?text=+) `#85a3b2` | +| bubble gum pink | ![#ff69af](https://via.placeholder.com/15/ff69af/000000?text=+) `#ff69af` | +| duck egg blue | ![#c3fbf4](https://via.placeholder.com/15/c3fbf4/000000?text=+) `#c3fbf4` | +| greenish cyan | ![#2afeb7](https://via.placeholder.com/15/2afeb7/000000?text=+) `#2afeb7` | +| petrol | ![#005f6a](https://via.placeholder.com/15/005f6a/000000?text=+) `#005f6a` | +| royal | ![#0c1793](https://via.placeholder.com/15/0c1793/000000?text=+) `#0c1793` | +| butter | ![#ffff81](https://via.placeholder.com/15/ffff81/000000?text=+) `#ffff81` | +| dusty orange | ![#f0833a](https://via.placeholder.com/15/f0833a/000000?text=+) `#f0833a` | +| off yellow | ![#f1f33f](https://via.placeholder.com/15/f1f33f/000000?text=+) `#f1f33f` | +| pale olive green | ![#b1d27b](https://via.placeholder.com/15/b1d27b/000000?text=+) `#b1d27b` | +| orangish | ![#fc824a](https://via.placeholder.com/15/fc824a/000000?text=+) `#fc824a` | +| leaf | ![#71aa34](https://via.placeholder.com/15/71aa34/000000?text=+) `#71aa34` | +| light blue grey | ![#b7c9e2](https://via.placeholder.com/15/b7c9e2/000000?text=+) `#b7c9e2` | +| dried blood | ![#4b0101](https://via.placeholder.com/15/4b0101/000000?text=+) `#4b0101` | +| lightish purple | ![#a552e6](https://via.placeholder.com/15/a552e6/000000?text=+) `#a552e6` | +| rusty red | ![#af2f0d](https://via.placeholder.com/15/af2f0d/000000?text=+) `#af2f0d` | +| lavender blue | ![#8b88f8](https://via.placeholder.com/15/8b88f8/000000?text=+) `#8b88f8` | +| light grass green | ![#9af764](https://via.placeholder.com/15/9af764/000000?text=+) `#9af764` | +| light mint green | ![#a6fbb2](https://via.placeholder.com/15/a6fbb2/000000?text=+) `#a6fbb2` | +| sunflower | ![#ffc512](https://via.placeholder.com/15/ffc512/000000?text=+) `#ffc512` | +| velvet | ![#750851](https://via.placeholder.com/15/750851/000000?text=+) `#750851` | +| brick orange | ![#c14a09](https://via.placeholder.com/15/c14a09/000000?text=+) `#c14a09` | +| lightish red | ![#fe2f4a](https://via.placeholder.com/15/fe2f4a/000000?text=+) `#fe2f4a` | +| pure blue | ![#0203e2](https://via.placeholder.com/15/0203e2/000000?text=+) `#0203e2` | +| twilight blue | ![#0a437a](https://via.placeholder.com/15/0a437a/000000?text=+) `#0a437a` | +| violet red | ![#a50055](https://via.placeholder.com/15/a50055/000000?text=+) `#a50055` | +| yellowy brown | ![#ae8b0c](https://via.placeholder.com/15/ae8b0c/000000?text=+) `#ae8b0c` | +| carnation | ![#fd798f](https://via.placeholder.com/15/fd798f/000000?text=+) `#fd798f` | +| muddy yellow | ![#bfac05](https://via.placeholder.com/15/bfac05/000000?text=+) `#bfac05` | +| dark seafoam green | ![#3eaf76](https://via.placeholder.com/15/3eaf76/000000?text=+) `#3eaf76` | +| deep rose | ![#c74767](https://via.placeholder.com/15/c74767/000000?text=+) `#c74767` | +| dusty red | ![#b9484e](https://via.placeholder.com/15/b9484e/000000?text=+) `#b9484e` | +| grey/blue | ![#647d8e](https://via.placeholder.com/15/647d8e/000000?text=+) `#647d8e` | +| lemon lime | ![#bffe28](https://via.placeholder.com/15/bffe28/000000?text=+) `#bffe28` | +| purple/pink | ![#d725de](https://via.placeholder.com/15/d725de/000000?text=+) `#d725de` | +| brown yellow | ![#b29705](https://via.placeholder.com/15/b29705/000000?text=+) `#b29705` | +| purple brown | ![#673a3f](https://via.placeholder.com/15/673a3f/000000?text=+) `#673a3f` | +| wisteria | ![#a87dc2](https://via.placeholder.com/15/a87dc2/000000?text=+) `#a87dc2` | +| banana yellow | ![#fafe4b](https://via.placeholder.com/15/fafe4b/000000?text=+) `#fafe4b` | +| lipstick red | ![#c0022f](https://via.placeholder.com/15/c0022f/000000?text=+) `#c0022f` | +| water blue | ![#0e87cc](https://via.placeholder.com/15/0e87cc/000000?text=+) `#0e87cc` | +| brown grey | ![#8d8468](https://via.placeholder.com/15/8d8468/000000?text=+) `#8d8468` | +| vibrant purple | ![#ad03de](https://via.placeholder.com/15/ad03de/000000?text=+) `#ad03de` | +| baby green | ![#8cff9e](https://via.placeholder.com/15/8cff9e/000000?text=+) `#8cff9e` | +| barf green | ![#94ac02](https://via.placeholder.com/15/94ac02/000000?text=+) `#94ac02` | +| eggshell blue | ![#c4fff7](https://via.placeholder.com/15/c4fff7/000000?text=+) `#c4fff7` | +| sandy yellow | ![#fdee73](https://via.placeholder.com/15/fdee73/000000?text=+) `#fdee73` | +| cool green | ![#33b864](https://via.placeholder.com/15/33b864/000000?text=+) `#33b864` | +| pale | ![#fff9d0](https://via.placeholder.com/15/fff9d0/000000?text=+) `#fff9d0` | +| blue/grey | ![#758da3](https://via.placeholder.com/15/758da3/000000?text=+) `#758da3` | +| hot magenta | ![#f504c9](https://via.placeholder.com/15/f504c9/000000?text=+) `#f504c9` | +| greyblue | ![#77a1b5](https://via.placeholder.com/15/77a1b5/000000?text=+) `#77a1b5` | +| purpley | ![#8756e4](https://via.placeholder.com/15/8756e4/000000?text=+) `#8756e4` | +| baby shit green | ![#889717](https://via.placeholder.com/15/889717/000000?text=+) `#889717` | +| brownish pink | ![#c27e79](https://via.placeholder.com/15/c27e79/000000?text=+) `#c27e79` | +| dark aquamarine | ![#017371](https://via.placeholder.com/15/017371/000000?text=+) `#017371` | +| diarrhea | ![#9f8303](https://via.placeholder.com/15/9f8303/000000?text=+) `#9f8303` | +| light mustard | ![#f7d560](https://via.placeholder.com/15/f7d560/000000?text=+) `#f7d560` | +| pale sky blue | ![#bdf6fe](https://via.placeholder.com/15/bdf6fe/000000?text=+) `#bdf6fe` | +| turtle green | ![#75b84f](https://via.placeholder.com/15/75b84f/000000?text=+) `#75b84f` | +| bright olive | ![#9cbb04](https://via.placeholder.com/15/9cbb04/000000?text=+) `#9cbb04` | +| dark grey blue | ![#29465b](https://via.placeholder.com/15/29465b/000000?text=+) `#29465b` | +| greeny brown | ![#696006](https://via.placeholder.com/15/696006/000000?text=+) `#696006` | +| lemon green | ![#adf802](https://via.placeholder.com/15/adf802/000000?text=+) `#adf802` | +| light periwinkle | ![#c1c6fc](https://via.placeholder.com/15/c1c6fc/000000?text=+) `#c1c6fc` | +| seaweed green | ![#35ad6b](https://via.placeholder.com/15/35ad6b/000000?text=+) `#35ad6b` | +| sunshine yellow | ![#fffd37](https://via.placeholder.com/15/fffd37/000000?text=+) `#fffd37` | +| ugly purple | ![#a442a0](https://via.placeholder.com/15/a442a0/000000?text=+) `#a442a0` | +| medium pink | ![#f36196](https://via.placeholder.com/15/f36196/000000?text=+) `#f36196` | +| puke brown | ![#947706](https://via.placeholder.com/15/947706/000000?text=+) `#947706` | +| very light pink | ![#fff4f2](https://via.placeholder.com/15/fff4f2/000000?text=+) `#fff4f2` | +| viridian | ![#1e9167](https://via.placeholder.com/15/1e9167/000000?text=+) `#1e9167` | +| bile | ![#b5c306](https://via.placeholder.com/15/b5c306/000000?text=+) `#b5c306` | +| faded yellow | ![#feff7f](https://via.placeholder.com/15/feff7f/000000?text=+) `#feff7f` | +| very pale green | ![#cffdbc](https://via.placeholder.com/15/cffdbc/000000?text=+) `#cffdbc` | +| vibrant green | ![#0add08](https://via.placeholder.com/15/0add08/000000?text=+) `#0add08` | +| bright lime | ![#87fd05](https://via.placeholder.com/15/87fd05/000000?text=+) `#87fd05` | +| spearmint | ![#1ef876](https://via.placeholder.com/15/1ef876/000000?text=+) `#1ef876` | +| light aquamarine | ![#7bfdc7](https://via.placeholder.com/15/7bfdc7/000000?text=+) `#7bfdc7` | +| light sage | ![#bcecac](https://via.placeholder.com/15/bcecac/000000?text=+) `#bcecac` | +| yellowgreen | ![#bbf90f](https://via.placeholder.com/15/bbf90f/000000?text=+) `#bbf90f` | +| baby poo | ![#ab9004](https://via.placeholder.com/15/ab9004/000000?text=+) `#ab9004` | +| dark seafoam | ![#1fb57a](https://via.placeholder.com/15/1fb57a/000000?text=+) `#1fb57a` | +| deep teal | ![#00555a](https://via.placeholder.com/15/00555a/000000?text=+) `#00555a` | +| heather | ![#a484ac](https://via.placeholder.com/15/a484ac/000000?text=+) `#a484ac` | +| rust orange | ![#c45508](https://via.placeholder.com/15/c45508/000000?text=+) `#c45508` | +| dirty blue | ![#3f829d](https://via.placeholder.com/15/3f829d/000000?text=+) `#3f829d` | +| fern green | ![#548d44](https://via.placeholder.com/15/548d44/000000?text=+) `#548d44` | +| bright lilac | ![#c95efb](https://via.placeholder.com/15/c95efb/000000?text=+) `#c95efb` | +| weird green | ![#3ae57f](https://via.placeholder.com/15/3ae57f/000000?text=+) `#3ae57f` | +| peacock blue | ![#016795](https://via.placeholder.com/15/016795/000000?text=+) `#016795` | +| avocado green | ![#87a922](https://via.placeholder.com/15/87a922/000000?text=+) `#87a922` | +| faded orange | ![#f0944d](https://via.placeholder.com/15/f0944d/000000?text=+) `#f0944d` | +| grape purple | ![#5d1451](https://via.placeholder.com/15/5d1451/000000?text=+) `#5d1451` | +| hot green | ![#25ff29](https://via.placeholder.com/15/25ff29/000000?text=+) `#25ff29` | +| lime yellow | ![#d0fe1d](https://via.placeholder.com/15/d0fe1d/000000?text=+) `#d0fe1d` | +| mango | ![#ffa62b](https://via.placeholder.com/15/ffa62b/000000?text=+) `#ffa62b` | +| shamrock | ![#01b44c](https://via.placeholder.com/15/01b44c/000000?text=+) `#01b44c` | +| bubblegum | ![#ff6cb5](https://via.placeholder.com/15/ff6cb5/000000?text=+) `#ff6cb5` | +| purplish brown | ![#6b4247](https://via.placeholder.com/15/6b4247/000000?text=+) `#6b4247` | +| vomit yellow | ![#c7c10c](https://via.placeholder.com/15/c7c10c/000000?text=+) `#c7c10c` | +| pale cyan | ![#b7fffa](https://via.placeholder.com/15/b7fffa/000000?text=+) `#b7fffa` | +| key lime | ![#aeff6e](https://via.placeholder.com/15/aeff6e/000000?text=+) `#aeff6e` | +| tomato red | ![#ec2d01](https://via.placeholder.com/15/ec2d01/000000?text=+) `#ec2d01` | +| lightgreen | ![#76ff7b](https://via.placeholder.com/15/76ff7b/000000?text=+) `#76ff7b` | +| merlot | ![#730039](https://via.placeholder.com/15/730039/000000?text=+) `#730039` | +| night blue | ![#040348](https://via.placeholder.com/15/040348/000000?text=+) `#040348` | +| purpleish pink | ![#df4ec8](https://via.placeholder.com/15/df4ec8/000000?text=+) `#df4ec8` | +| apple | ![#6ecb3c](https://via.placeholder.com/15/6ecb3c/000000?text=+) `#6ecb3c` | +| baby poop green | ![#8f9805](https://via.placeholder.com/15/8f9805/000000?text=+) `#8f9805` | +| green apple | ![#5edc1f](https://via.placeholder.com/15/5edc1f/000000?text=+) `#5edc1f` | +| heliotrope | ![#d94ff5](https://via.placeholder.com/15/d94ff5/000000?text=+) `#d94ff5` | +| yellow/green | ![#c8fd3d](https://via.placeholder.com/15/c8fd3d/000000?text=+) `#c8fd3d` | +| almost black | ![#070d0d](https://via.placeholder.com/15/070d0d/000000?text=+) `#070d0d` | +| cool blue | ![#4984b8](https://via.placeholder.com/15/4984b8/000000?text=+) `#4984b8` | +| leafy green | ![#51b73b](https://via.placeholder.com/15/51b73b/000000?text=+) `#51b73b` | +| mustard brown | ![#ac7e04](https://via.placeholder.com/15/ac7e04/000000?text=+) `#ac7e04` | +| dusk | ![#4e5481](https://via.placeholder.com/15/4e5481/000000?text=+) `#4e5481` | +| dull brown | ![#876e4b](https://via.placeholder.com/15/876e4b/000000?text=+) `#876e4b` | +| frog green | ![#58bc08](https://via.placeholder.com/15/58bc08/000000?text=+) `#58bc08` | +| vivid green | ![#2fef10](https://via.placeholder.com/15/2fef10/000000?text=+) `#2fef10` | +| bright light green | ![#2dfe54](https://via.placeholder.com/15/2dfe54/000000?text=+) `#2dfe54` | +| fluro green | ![#0aff02](https://via.placeholder.com/15/0aff02/000000?text=+) `#0aff02` | +| kiwi | ![#9cef43](https://via.placeholder.com/15/9cef43/000000?text=+) `#9cef43` | +| seaweed | ![#18d17b](https://via.placeholder.com/15/18d17b/000000?text=+) `#18d17b` | +| navy green | ![#35530a](https://via.placeholder.com/15/35530a/000000?text=+) `#35530a` | +| ultramarine blue | ![#1805db](https://via.placeholder.com/15/1805db/000000?text=+) `#1805db` | +| iris | ![#6258c4](https://via.placeholder.com/15/6258c4/000000?text=+) `#6258c4` | +| pastel orange | ![#ff964f](https://via.placeholder.com/15/ff964f/000000?text=+) `#ff964f` | +| yellowish orange | ![#ffab0f](https://via.placeholder.com/15/ffab0f/000000?text=+) `#ffab0f` | +| perrywinkle | ![#8f8ce7](https://via.placeholder.com/15/8f8ce7/000000?text=+) `#8f8ce7` | +| tealish | ![#24bca8](https://via.placeholder.com/15/24bca8/000000?text=+) `#24bca8` | +| dark plum | ![#3f012c](https://via.placeholder.com/15/3f012c/000000?text=+) `#3f012c` | +| pear | ![#cbf85f](https://via.placeholder.com/15/cbf85f/000000?text=+) `#cbf85f` | +| pinkish orange | ![#ff724c](https://via.placeholder.com/15/ff724c/000000?text=+) `#ff724c` | +| midnight purple | ![#280137](https://via.placeholder.com/15/280137/000000?text=+) `#280137` | +| light urple | ![#b36ff6](https://via.placeholder.com/15/b36ff6/000000?text=+) `#b36ff6` | +| dark mint | ![#48c072](https://via.placeholder.com/15/48c072/000000?text=+) `#48c072` | +| greenish tan | ![#bccb7a](https://via.placeholder.com/15/bccb7a/000000?text=+) `#bccb7a` | +| light burgundy | ![#a8415b](https://via.placeholder.com/15/a8415b/000000?text=+) `#a8415b` | +| turquoise blue | ![#06b1c4](https://via.placeholder.com/15/06b1c4/000000?text=+) `#06b1c4` | +| ugly pink | ![#cd7584](https://via.placeholder.com/15/cd7584/000000?text=+) `#cd7584` | +| sandy | ![#f1da7a](https://via.placeholder.com/15/f1da7a/000000?text=+) `#f1da7a` | +| electric pink | ![#ff0490](https://via.placeholder.com/15/ff0490/000000?text=+) `#ff0490` | +| muted purple | ![#805b87](https://via.placeholder.com/15/805b87/000000?text=+) `#805b87` | +| mid green | ![#50a747](https://via.placeholder.com/15/50a747/000000?text=+) `#50a747` | +| greyish | ![#a8a495](https://via.placeholder.com/15/a8a495/000000?text=+) `#a8a495` | +| neon yellow | ![#cfff04](https://via.placeholder.com/15/cfff04/000000?text=+) `#cfff04` | +| banana | ![#ffff7e](https://via.placeholder.com/15/ffff7e/000000?text=+) `#ffff7e` | +| carnation pink | ![#ff7fa7](https://via.placeholder.com/15/ff7fa7/000000?text=+) `#ff7fa7` | +| tomato | ![#ef4026](https://via.placeholder.com/15/ef4026/000000?text=+) `#ef4026` | +| sea | ![#3c9992](https://via.placeholder.com/15/3c9992/000000?text=+) `#3c9992` | +| muddy brown | ![#886806](https://via.placeholder.com/15/886806/000000?text=+) `#886806` | +| turquoise green | ![#04f489](https://via.placeholder.com/15/04f489/000000?text=+) `#04f489` | +| buff | ![#fef69e](https://via.placeholder.com/15/fef69e/000000?text=+) `#fef69e` | +| fawn | ![#cfaf7b](https://via.placeholder.com/15/cfaf7b/000000?text=+) `#cfaf7b` | +| muted blue | ![#3b719f](https://via.placeholder.com/15/3b719f/000000?text=+) `#3b719f` | +| pale rose | ![#fdc1c5](https://via.placeholder.com/15/fdc1c5/000000?text=+) `#fdc1c5` | +| dark mint green | ![#20c073](https://via.placeholder.com/15/20c073/000000?text=+) `#20c073` | +| amethyst | ![#9b5fc0](https://via.placeholder.com/15/9b5fc0/000000?text=+) `#9b5fc0` | +| blue/green | ![#0f9b8e](https://via.placeholder.com/15/0f9b8e/000000?text=+) `#0f9b8e` | +| chestnut | ![#742802](https://via.placeholder.com/15/742802/000000?text=+) `#742802` | +| sick green | ![#9db92c](https://via.placeholder.com/15/9db92c/000000?text=+) `#9db92c` | +| pea | ![#a4bf20](https://via.placeholder.com/15/a4bf20/000000?text=+) `#a4bf20` | +| rusty orange | ![#cd5909](https://via.placeholder.com/15/cd5909/000000?text=+) `#cd5909` | +| stone | ![#ada587](https://via.placeholder.com/15/ada587/000000?text=+) `#ada587` | +| rose red | ![#be013c](https://via.placeholder.com/15/be013c/000000?text=+) `#be013c` | +| pale aqua | ![#b8ffeb](https://via.placeholder.com/15/b8ffeb/000000?text=+) `#b8ffeb` | +| deep orange | ![#dc4d01](https://via.placeholder.com/15/dc4d01/000000?text=+) `#dc4d01` | +| earth | ![#a2653e](https://via.placeholder.com/15/a2653e/000000?text=+) `#a2653e` | +| mossy green | ![#638b27](https://via.placeholder.com/15/638b27/000000?text=+) `#638b27` | +| grassy green | ![#419c03](https://via.placeholder.com/15/419c03/000000?text=+) `#419c03` | +| pale lime green | ![#b1ff65](https://via.placeholder.com/15/b1ff65/000000?text=+) `#b1ff65` | +| light grey blue | ![#9dbcd4](https://via.placeholder.com/15/9dbcd4/000000?text=+) `#9dbcd4` | +| pale grey | ![#fdfdfe](https://via.placeholder.com/15/fdfdfe/000000?text=+) `#fdfdfe` | +| asparagus | ![#77ab56](https://via.placeholder.com/15/77ab56/000000?text=+) `#77ab56` | +| blueberry | ![#464196](https://via.placeholder.com/15/464196/000000?text=+) `#464196` | +| purple red | ![#990147](https://via.placeholder.com/15/990147/000000?text=+) `#990147` | +| pale lime | ![#befd73](https://via.placeholder.com/15/befd73/000000?text=+) `#befd73` | +| greenish teal | ![#32bf84](https://via.placeholder.com/15/32bf84/000000?text=+) `#32bf84` | +| caramel | ![#af6f09](https://via.placeholder.com/15/af6f09/000000?text=+) `#af6f09` | +| deep magenta | ![#a0025c](https://via.placeholder.com/15/a0025c/000000?text=+) `#a0025c` | +| light peach | ![#ffd8b1](https://via.placeholder.com/15/ffd8b1/000000?text=+) `#ffd8b1` | +| milk chocolate | ![#7f4e1e](https://via.placeholder.com/15/7f4e1e/000000?text=+) `#7f4e1e` | +| ocher | ![#bf9b0c](https://via.placeholder.com/15/bf9b0c/000000?text=+) `#bf9b0c` | +| off green | ![#6ba353](https://via.placeholder.com/15/6ba353/000000?text=+) `#6ba353` | +| purply pink | ![#f075e6](https://via.placeholder.com/15/f075e6/000000?text=+) `#f075e6` | +| lightblue | ![#7bc8f6](https://via.placeholder.com/15/7bc8f6/000000?text=+) `#7bc8f6` | +| dusky blue | ![#475f94](https://via.placeholder.com/15/475f94/000000?text=+) `#475f94` | +| golden | ![#f5bf03](https://via.placeholder.com/15/f5bf03/000000?text=+) `#f5bf03` | +| light beige | ![#fffeb6](https://via.placeholder.com/15/fffeb6/000000?text=+) `#fffeb6` | +| butter yellow | ![#fffd74](https://via.placeholder.com/15/fffd74/000000?text=+) `#fffd74` | +| dusky purple | ![#895b7b](https://via.placeholder.com/15/895b7b/000000?text=+) `#895b7b` | +| french blue | ![#436bad](https://via.placeholder.com/15/436bad/000000?text=+) `#436bad` | +| ugly yellow | ![#d0c101](https://via.placeholder.com/15/d0c101/000000?text=+) `#d0c101` | +| greeny yellow | ![#c6f808](https://via.placeholder.com/15/c6f808/000000?text=+) `#c6f808` | +| orangish red | ![#f43605](https://via.placeholder.com/15/f43605/000000?text=+) `#f43605` | +| shamrock green | ![#02c14d](https://via.placeholder.com/15/02c14d/000000?text=+) `#02c14d` | +| orangish brown | ![#b25f03](https://via.placeholder.com/15/b25f03/000000?text=+) `#b25f03` | +| tree green | ![#2a7e19](https://via.placeholder.com/15/2a7e19/000000?text=+) `#2a7e19` | +| deep violet | ![#490648](https://via.placeholder.com/15/490648/000000?text=+) `#490648` | +| gunmetal | ![#536267](https://via.placeholder.com/15/536267/000000?text=+) `#536267` | +| blue/purple | ![#5a06ef](https://via.placeholder.com/15/5a06ef/000000?text=+) `#5a06ef` | +| cherry | ![#cf0234](https://via.placeholder.com/15/cf0234/000000?text=+) `#cf0234` | +| sandy brown | ![#c4a661](https://via.placeholder.com/15/c4a661/000000?text=+) `#c4a661` | +| warm grey | ![#978a84](https://via.placeholder.com/15/978a84/000000?text=+) `#978a84` | +| dark indigo | ![#1f0954](https://via.placeholder.com/15/1f0954/000000?text=+) `#1f0954` | +| midnight | ![#03012d](https://via.placeholder.com/15/03012d/000000?text=+) `#03012d` | +| bluey green | ![#2bb179](https://via.placeholder.com/15/2bb179/000000?text=+) `#2bb179` | +| grey pink | ![#c3909b](https://via.placeholder.com/15/c3909b/000000?text=+) `#c3909b` | +| soft purple | ![#a66fb5](https://via.placeholder.com/15/a66fb5/000000?text=+) `#a66fb5` | +| blood | ![#770001](https://via.placeholder.com/15/770001/000000?text=+) `#770001` | +| brown red | ![#922b05](https://via.placeholder.com/15/922b05/000000?text=+) `#922b05` | +| medium grey | ![#7d7f7c](https://via.placeholder.com/15/7d7f7c/000000?text=+) `#7d7f7c` | +| berry | ![#990f4b](https://via.placeholder.com/15/990f4b/000000?text=+) `#990f4b` | +| poo | ![#8f7303](https://via.placeholder.com/15/8f7303/000000?text=+) `#8f7303` | +| purpley pink | ![#c83cb9](https://via.placeholder.com/15/c83cb9/000000?text=+) `#c83cb9` | +| light salmon | ![#fea993](https://via.placeholder.com/15/fea993/000000?text=+) `#fea993` | +| snot | ![#acbb0d](https://via.placeholder.com/15/acbb0d/000000?text=+) `#acbb0d` | +| easter purple | ![#c071fe](https://via.placeholder.com/15/c071fe/000000?text=+) `#c071fe` | +| light yellow green | ![#ccfd7f](https://via.placeholder.com/15/ccfd7f/000000?text=+) `#ccfd7f` | +| dark navy blue | ![#00022e](https://via.placeholder.com/15/00022e/000000?text=+) `#00022e` | +| drab | ![#828344](https://via.placeholder.com/15/828344/000000?text=+) `#828344` | +| light rose | ![#ffc5cb](https://via.placeholder.com/15/ffc5cb/000000?text=+) `#ffc5cb` | +| rouge | ![#ab1239](https://via.placeholder.com/15/ab1239/000000?text=+) `#ab1239` | +| purplish red | ![#b0054b](https://via.placeholder.com/15/b0054b/000000?text=+) `#b0054b` | +| slime green | ![#99cc04](https://via.placeholder.com/15/99cc04/000000?text=+) `#99cc04` | +| baby poop | ![#937c00](https://via.placeholder.com/15/937c00/000000?text=+) `#937c00` | +| irish green | ![#019529](https://via.placeholder.com/15/019529/000000?text=+) `#019529` | +| pink/purple | ![#ef1de7](https://via.placeholder.com/15/ef1de7/000000?text=+) `#ef1de7` | +| dark navy | ![#000435](https://via.placeholder.com/15/000435/000000?text=+) `#000435` | +| greeny blue | ![#42b395](https://via.placeholder.com/15/42b395/000000?text=+) `#42b395` | +| light plum | ![#9d5783](https://via.placeholder.com/15/9d5783/000000?text=+) `#9d5783` | +| pinkish grey | ![#c8aca9](https://via.placeholder.com/15/c8aca9/000000?text=+) `#c8aca9` | +| dirty orange | ![#c87606](https://via.placeholder.com/15/c87606/000000?text=+) `#c87606` | +| rust red | ![#aa2704](https://via.placeholder.com/15/aa2704/000000?text=+) `#aa2704` | +| pale lilac | ![#e4cbff](https://via.placeholder.com/15/e4cbff/000000?text=+) `#e4cbff` | +| orangey red | ![#fa4224](https://via.placeholder.com/15/fa4224/000000?text=+) `#fa4224` | +| primary blue | ![#0804f9](https://via.placeholder.com/15/0804f9/000000?text=+) `#0804f9` | +| kermit green | ![#5cb200](https://via.placeholder.com/15/5cb200/000000?text=+) `#5cb200` | +| brownish purple | ![#76424e](https://via.placeholder.com/15/76424e/000000?text=+) `#76424e` | +| murky green | ![#6c7a0e](https://via.placeholder.com/15/6c7a0e/000000?text=+) `#6c7a0e` | +| wheat | ![#fbdd7e](https://via.placeholder.com/15/fbdd7e/000000?text=+) `#fbdd7e` | +| very dark purple | ![#2a0134](https://via.placeholder.com/15/2a0134/000000?text=+) `#2a0134` | +| bottle green | ![#044a05](https://via.placeholder.com/15/044a05/000000?text=+) `#044a05` | +| watermelon | ![#fd4659](https://via.placeholder.com/15/fd4659/000000?text=+) `#fd4659` | +| deep sky blue | ![#0d75f8](https://via.placeholder.com/15/0d75f8/000000?text=+) `#0d75f8` | +| fire engine red | ![#fe0002](https://via.placeholder.com/15/fe0002/000000?text=+) `#fe0002` | +| yellow ochre | ![#cb9d06](https://via.placeholder.com/15/cb9d06/000000?text=+) `#cb9d06` | +| pumpkin orange | ![#fb7d07](https://via.placeholder.com/15/fb7d07/000000?text=+) `#fb7d07` | +| pale olive | ![#b9cc81](https://via.placeholder.com/15/b9cc81/000000?text=+) `#b9cc81` | +| light lilac | ![#edc8ff](https://via.placeholder.com/15/edc8ff/000000?text=+) `#edc8ff` | +| lightish green | ![#61e160](https://via.placeholder.com/15/61e160/000000?text=+) `#61e160` | +| carolina blue | ![#8ab8fe](https://via.placeholder.com/15/8ab8fe/000000?text=+) `#8ab8fe` | +| mulberry | ![#920a4e](https://via.placeholder.com/15/920a4e/000000?text=+) `#920a4e` | +| shocking pink | ![#fe02a2](https://via.placeholder.com/15/fe02a2/000000?text=+) `#fe02a2` | +| auburn | ![#9a3001](https://via.placeholder.com/15/9a3001/000000?text=+) `#9a3001` | +| bright lime green | ![#65fe08](https://via.placeholder.com/15/65fe08/000000?text=+) `#65fe08` | +| celadon | ![#befdb7](https://via.placeholder.com/15/befdb7/000000?text=+) `#befdb7` | +| pinkish brown | ![#b17261](https://via.placeholder.com/15/b17261/000000?text=+) `#b17261` | +| poo brown | ![#885f01](https://via.placeholder.com/15/885f01/000000?text=+) `#885f01` | +| bright sky blue | ![#02ccfe](https://via.placeholder.com/15/02ccfe/000000?text=+) `#02ccfe` | +| celery | ![#c1fd95](https://via.placeholder.com/15/c1fd95/000000?text=+) `#c1fd95` | +| dirt brown | ![#836539](https://via.placeholder.com/15/836539/000000?text=+) `#836539` | +| strawberry | ![#fb2943](https://via.placeholder.com/15/fb2943/000000?text=+) `#fb2943` | +| dark lime | ![#84b701](https://via.placeholder.com/15/84b701/000000?text=+) `#84b701` | +| copper | ![#b66325](https://via.placeholder.com/15/b66325/000000?text=+) `#b66325` | +| medium brown | ![#7f5112](https://via.placeholder.com/15/7f5112/000000?text=+) `#7f5112` | +| muted green | ![#5fa052](https://via.placeholder.com/15/5fa052/000000?text=+) `#5fa052` | +| robin's egg | ![#6dedfd](https://via.placeholder.com/15/6dedfd/000000?text=+) `#6dedfd` | +| bright aqua | ![#0bf9ea](https://via.placeholder.com/15/0bf9ea/000000?text=+) `#0bf9ea` | +| bright lavender | ![#c760ff](https://via.placeholder.com/15/c760ff/000000?text=+) `#c760ff` | +| ivory | ![#ffffcb](https://via.placeholder.com/15/ffffcb/000000?text=+) `#ffffcb` | +| very light purple | ![#f6cefc](https://via.placeholder.com/15/f6cefc/000000?text=+) `#f6cefc` | +| light navy | ![#155084](https://via.placeholder.com/15/155084/000000?text=+) `#155084` | +| pink red | ![#f5054f](https://via.placeholder.com/15/f5054f/000000?text=+) `#f5054f` | +| olive brown | ![#645403](https://via.placeholder.com/15/645403/000000?text=+) `#645403` | +| poop brown | ![#7a5901](https://via.placeholder.com/15/7a5901/000000?text=+) `#7a5901` | +| mustard green | ![#a8b504](https://via.placeholder.com/15/a8b504/000000?text=+) `#a8b504` | +| ocean green | ![#3d9973](https://via.placeholder.com/15/3d9973/000000?text=+) `#3d9973` | +| very dark blue | ![#000133](https://via.placeholder.com/15/000133/000000?text=+) `#000133` | +| dusty green | ![#76a973](https://via.placeholder.com/15/76a973/000000?text=+) `#76a973` | +| light navy blue | ![#2e5a88](https://via.placeholder.com/15/2e5a88/000000?text=+) `#2e5a88` | +| minty green | ![#0bf77d](https://via.placeholder.com/15/0bf77d/000000?text=+) `#0bf77d` | +| adobe | ![#bd6c48](https://via.placeholder.com/15/bd6c48/000000?text=+) `#bd6c48` | +| barney | ![#ac1db8](https://via.placeholder.com/15/ac1db8/000000?text=+) `#ac1db8` | +| jade green | ![#2baf6a](https://via.placeholder.com/15/2baf6a/000000?text=+) `#2baf6a` | +| bright light blue | ![#26f7fd](https://via.placeholder.com/15/26f7fd/000000?text=+) `#26f7fd` | +| light lime | ![#aefd6c](https://via.placeholder.com/15/aefd6c/000000?text=+) `#aefd6c` | +| dark khaki | ![#9b8f55](https://via.placeholder.com/15/9b8f55/000000?text=+) `#9b8f55` | +| orange yellow | ![#ffad01](https://via.placeholder.com/15/ffad01/000000?text=+) `#ffad01` | +| ocre | ![#c69c04](https://via.placeholder.com/15/c69c04/000000?text=+) `#c69c04` | +| maize | ![#f4d054](https://via.placeholder.com/15/f4d054/000000?text=+) `#f4d054` | +| faded pink | ![#de9dac](https://via.placeholder.com/15/de9dac/000000?text=+) `#de9dac` | +| british racing green | ![#05480d](https://via.placeholder.com/15/05480d/000000?text=+) `#05480d` | +| sandstone | ![#c9ae74](https://via.placeholder.com/15/c9ae74/000000?text=+) `#c9ae74` | +| mud brown | ![#60460f](https://via.placeholder.com/15/60460f/000000?text=+) `#60460f` | +| light sea green | ![#98f6b0](https://via.placeholder.com/15/98f6b0/000000?text=+) `#98f6b0` | +| robin egg blue | ![#8af1fe](https://via.placeholder.com/15/8af1fe/000000?text=+) `#8af1fe` | +| aqua marine | ![#2ee8bb](https://via.placeholder.com/15/2ee8bb/000000?text=+) `#2ee8bb` | +| dark sea green | ![#11875d](https://via.placeholder.com/15/11875d/000000?text=+) `#11875d` | +| soft pink | ![#fdb0c0](https://via.placeholder.com/15/fdb0c0/000000?text=+) `#fdb0c0` | +| orangey brown | ![#b16002](https://via.placeholder.com/15/b16002/000000?text=+) `#b16002` | +| cherry red | ![#f7022a](https://via.placeholder.com/15/f7022a/000000?text=+) `#f7022a` | +| burnt yellow | ![#d5ab09](https://via.placeholder.com/15/d5ab09/000000?text=+) `#d5ab09` | +| brownish grey | ![#86775f](https://via.placeholder.com/15/86775f/000000?text=+) `#86775f` | +| camel | ![#c69f59](https://via.placeholder.com/15/c69f59/000000?text=+) `#c69f59` | +| purplish grey | ![#7a687f](https://via.placeholder.com/15/7a687f/000000?text=+) `#7a687f` | +| marine | ![#042e60](https://via.placeholder.com/15/042e60/000000?text=+) `#042e60` | +| greyish pink | ![#c88d94](https://via.placeholder.com/15/c88d94/000000?text=+) `#c88d94` | +| pale turquoise | ![#a5fbd5](https://via.placeholder.com/15/a5fbd5/000000?text=+) `#a5fbd5` | +| pastel yellow | ![#fffe71](https://via.placeholder.com/15/fffe71/000000?text=+) `#fffe71` | +| bluey purple | ![#6241c7](https://via.placeholder.com/15/6241c7/000000?text=+) `#6241c7` | +| canary yellow | ![#fffe40](https://via.placeholder.com/15/fffe40/000000?text=+) `#fffe40` | +| faded red | ![#d3494e](https://via.placeholder.com/15/d3494e/000000?text=+) `#d3494e` | +| sepia | ![#985e2b](https://via.placeholder.com/15/985e2b/000000?text=+) `#985e2b` | +| coffee | ![#a6814c](https://via.placeholder.com/15/a6814c/000000?text=+) `#a6814c` | +| bright magenta | ![#ff08e8](https://via.placeholder.com/15/ff08e8/000000?text=+) `#ff08e8` | +| mocha | ![#9d7651](https://via.placeholder.com/15/9d7651/000000?text=+) `#9d7651` | +| ecru | ![#feffca](https://via.placeholder.com/15/feffca/000000?text=+) `#feffca` | +| purpleish | ![#98568d](https://via.placeholder.com/15/98568d/000000?text=+) `#98568d` | +| cranberry | ![#9e003a](https://via.placeholder.com/15/9e003a/000000?text=+) `#9e003a` | +| darkish green | ![#287c37](https://via.placeholder.com/15/287c37/000000?text=+) `#287c37` | +| brown orange | ![#b96902](https://via.placeholder.com/15/b96902/000000?text=+) `#b96902` | +| dusky rose | ![#ba6873](https://via.placeholder.com/15/ba6873/000000?text=+) `#ba6873` | +| melon | ![#ff7855](https://via.placeholder.com/15/ff7855/000000?text=+) `#ff7855` | +| sickly green | ![#94b21c](https://via.placeholder.com/15/94b21c/000000?text=+) `#94b21c` | +| silver | ![#c5c9c7](https://via.placeholder.com/15/c5c9c7/000000?text=+) `#c5c9c7` | +| purply blue | ![#661aee](https://via.placeholder.com/15/661aee/000000?text=+) `#661aee` | +| purpleish blue | ![#6140ef](https://via.placeholder.com/15/6140ef/000000?text=+) `#6140ef` | +| hospital green | ![#9be5aa](https://via.placeholder.com/15/9be5aa/000000?text=+) `#9be5aa` | +| shit brown | ![#7b5804](https://via.placeholder.com/15/7b5804/000000?text=+) `#7b5804` | +| mid blue | ![#276ab3](https://via.placeholder.com/15/276ab3/000000?text=+) `#276ab3` | +| amber | ![#feb308](https://via.placeholder.com/15/feb308/000000?text=+) `#feb308` | +| easter green | ![#8cfd7e](https://via.placeholder.com/15/8cfd7e/000000?text=+) `#8cfd7e` | +| soft blue | ![#6488ea](https://via.placeholder.com/15/6488ea/000000?text=+) `#6488ea` | +| cerulean blue | ![#056eee](https://via.placeholder.com/15/056eee/000000?text=+) `#056eee` | +| golden brown | ![#b27a01](https://via.placeholder.com/15/b27a01/000000?text=+) `#b27a01` | +| bright turquoise | ![#0ffef9](https://via.placeholder.com/15/0ffef9/000000?text=+) `#0ffef9` | +| red pink | ![#fa2a55](https://via.placeholder.com/15/fa2a55/000000?text=+) `#fa2a55` | +| red purple | ![#820747](https://via.placeholder.com/15/820747/000000?text=+) `#820747` | +| greyish brown | ![#7a6a4f](https://via.placeholder.com/15/7a6a4f/000000?text=+) `#7a6a4f` | +| vermillion | ![#f4320c](https://via.placeholder.com/15/f4320c/000000?text=+) `#f4320c` | +| russet | ![#a13905](https://via.placeholder.com/15/a13905/000000?text=+) `#a13905` | +| steel grey | ![#6f828a](https://via.placeholder.com/15/6f828a/000000?text=+) `#6f828a` | +| lighter purple | ![#a55af4](https://via.placeholder.com/15/a55af4/000000?text=+) `#a55af4` | +| bright violet | ![#ad0afd](https://via.placeholder.com/15/ad0afd/000000?text=+) `#ad0afd` | +| prussian blue | ![#004577](https://via.placeholder.com/15/004577/000000?text=+) `#004577` | +| slate green | ![#658d6d](https://via.placeholder.com/15/658d6d/000000?text=+) `#658d6d` | +| dirty pink | ![#ca7b80](https://via.placeholder.com/15/ca7b80/000000?text=+) `#ca7b80` | +| dark blue green | ![#005249](https://via.placeholder.com/15/005249/000000?text=+) `#005249` | +| pine | ![#2b5d34](https://via.placeholder.com/15/2b5d34/000000?text=+) `#2b5d34` | +| yellowy green | ![#bff128](https://via.placeholder.com/15/bff128/000000?text=+) `#bff128` | +| dark gold | ![#b59410](https://via.placeholder.com/15/b59410/000000?text=+) `#b59410` | +| bluish | ![#2976bb](https://via.placeholder.com/15/2976bb/000000?text=+) `#2976bb` | +| darkish blue | ![#014182](https://via.placeholder.com/15/014182/000000?text=+) `#014182` | +| dull red | ![#bb3f3f](https://via.placeholder.com/15/bb3f3f/000000?text=+) `#bb3f3f` | +| pinky red | ![#fc2647](https://via.placeholder.com/15/fc2647/000000?text=+) `#fc2647` | +| bronze | ![#a87900](https://via.placeholder.com/15/a87900/000000?text=+) `#a87900` | +| pale teal | ![#82cbb2](https://via.placeholder.com/15/82cbb2/000000?text=+) `#82cbb2` | +| military green | ![#667c3e](https://via.placeholder.com/15/667c3e/000000?text=+) `#667c3e` | +| barbie pink | ![#fe46a5](https://via.placeholder.com/15/fe46a5/000000?text=+) `#fe46a5` | +| bubblegum pink | ![#fe83cc](https://via.placeholder.com/15/fe83cc/000000?text=+) `#fe83cc` | +| pea soup green | ![#94a617](https://via.placeholder.com/15/94a617/000000?text=+) `#94a617` | +| dark mustard | ![#a88905](https://via.placeholder.com/15/a88905/000000?text=+) `#a88905` | +| shit | ![#7f5f00](https://via.placeholder.com/15/7f5f00/000000?text=+) `#7f5f00` | +| medium purple | ![#9e43a2](https://via.placeholder.com/15/9e43a2/000000?text=+) `#9e43a2` | +| very dark green | ![#062e03](https://via.placeholder.com/15/062e03/000000?text=+) `#062e03` | +| dirt | ![#8a6e45](https://via.placeholder.com/15/8a6e45/000000?text=+) `#8a6e45` | +| dusky pink | ![#cc7a8b](https://via.placeholder.com/15/cc7a8b/000000?text=+) `#cc7a8b` | +| red violet | ![#9e0168](https://via.placeholder.com/15/9e0168/000000?text=+) `#9e0168` | +| lemon yellow | ![#fdff38](https://via.placeholder.com/15/fdff38/000000?text=+) `#fdff38` | +| pistachio | ![#c0fa8b](https://via.placeholder.com/15/c0fa8b/000000?text=+) `#c0fa8b` | +| dull yellow | ![#eedc5b](https://via.placeholder.com/15/eedc5b/000000?text=+) `#eedc5b` | +| dark lime green | ![#7ebd01](https://via.placeholder.com/15/7ebd01/000000?text=+) `#7ebd01` | +| denim blue | ![#3b5b92](https://via.placeholder.com/15/3b5b92/000000?text=+) `#3b5b92` | +| teal blue | ![#01889f](https://via.placeholder.com/15/01889f/000000?text=+) `#01889f` | +| lightish blue | ![#3d7afd](https://via.placeholder.com/15/3d7afd/000000?text=+) `#3d7afd` | +| purpley blue | ![#5f34e7](https://via.placeholder.com/15/5f34e7/000000?text=+) `#5f34e7` | +| light indigo | ![#6d5acf](https://via.placeholder.com/15/6d5acf/000000?text=+) `#6d5acf` | +| swamp green | ![#748500](https://via.placeholder.com/15/748500/000000?text=+) `#748500` | +| brown green | ![#706c11](https://via.placeholder.com/15/706c11/000000?text=+) `#706c11` | +| dark maroon | ![#3c0008](https://via.placeholder.com/15/3c0008/000000?text=+) `#3c0008` | +| hot purple | ![#cb00f5](https://via.placeholder.com/15/cb00f5/000000?text=+) `#cb00f5` | +| dark forest green | ![#002d04](https://via.placeholder.com/15/002d04/000000?text=+) `#002d04` | +| faded blue | ![#658cbb](https://via.placeholder.com/15/658cbb/000000?text=+) `#658cbb` | +| drab green | ![#749551](https://via.placeholder.com/15/749551/000000?text=+) `#749551` | +| light lime green | ![#b9ff66](https://via.placeholder.com/15/b9ff66/000000?text=+) `#b9ff66` | +| snot green | ![#9dc100](https://via.placeholder.com/15/9dc100/000000?text=+) `#9dc100` | +| yellowish | ![#faee66](https://via.placeholder.com/15/faee66/000000?text=+) `#faee66` | +| light blue green | ![#7efbb3](https://via.placeholder.com/15/7efbb3/000000?text=+) `#7efbb3` | +| bordeaux | ![#7b002c](https://via.placeholder.com/15/7b002c/000000?text=+) `#7b002c` | +| light mauve | ![#c292a1](https://via.placeholder.com/15/c292a1/000000?text=+) `#c292a1` | +| ocean | ![#017b92](https://via.placeholder.com/15/017b92/000000?text=+) `#017b92` | +| marigold | ![#fcc006](https://via.placeholder.com/15/fcc006/000000?text=+) `#fcc006` | +| muddy green | ![#657432](https://via.placeholder.com/15/657432/000000?text=+) `#657432` | +| dull orange | ![#d8863b](https://via.placeholder.com/15/d8863b/000000?text=+) `#d8863b` | +| steel | ![#738595](https://via.placeholder.com/15/738595/000000?text=+) `#738595` | +| electric purple | ![#aa23ff](https://via.placeholder.com/15/aa23ff/000000?text=+) `#aa23ff` | +| fluorescent green | ![#08ff08](https://via.placeholder.com/15/08ff08/000000?text=+) `#08ff08` | +| yellowish brown | ![#9b7a01](https://via.placeholder.com/15/9b7a01/000000?text=+) `#9b7a01` | +| blush | ![#f29e8e](https://via.placeholder.com/15/f29e8e/000000?text=+) `#f29e8e` | +| soft green | ![#6fc276](https://via.placeholder.com/15/6fc276/000000?text=+) `#6fc276` | +| bright orange | ![#ff5b00](https://via.placeholder.com/15/ff5b00/000000?text=+) `#ff5b00` | +| lemon | ![#fdff52](https://via.placeholder.com/15/fdff52/000000?text=+) `#fdff52` | +| purple grey | ![#866f85](https://via.placeholder.com/15/866f85/000000?text=+) `#866f85` | +| acid green | ![#8ffe09](https://via.placeholder.com/15/8ffe09/000000?text=+) `#8ffe09` | +| pale lavender | ![#eecffe](https://via.placeholder.com/15/eecffe/000000?text=+) `#eecffe` | +| violet blue | ![#510ac9](https://via.placeholder.com/15/510ac9/000000?text=+) `#510ac9` | +| light forest green | ![#4f9153](https://via.placeholder.com/15/4f9153/000000?text=+) `#4f9153` | +| burnt red | ![#9f2305](https://via.placeholder.com/15/9f2305/000000?text=+) `#9f2305` | +| khaki green | ![#728639](https://via.placeholder.com/15/728639/000000?text=+) `#728639` | +| cerise | ![#de0c62](https://via.placeholder.com/15/de0c62/000000?text=+) `#de0c62` | +| faded purple | ![#916e99](https://via.placeholder.com/15/916e99/000000?text=+) `#916e99` | +| apricot | ![#ffb16d](https://via.placeholder.com/15/ffb16d/000000?text=+) `#ffb16d` | +| dark olive green | ![#3c4d03](https://via.placeholder.com/15/3c4d03/000000?text=+) `#3c4d03` | +| grey brown | ![#7f7053](https://via.placeholder.com/15/7f7053/000000?text=+) `#7f7053` | +| green grey | ![#77926f](https://via.placeholder.com/15/77926f/000000?text=+) `#77926f` | +| true blue | ![#010fcc](https://via.placeholder.com/15/010fcc/000000?text=+) `#010fcc` | +| pale violet | ![#ceaefa](https://via.placeholder.com/15/ceaefa/000000?text=+) `#ceaefa` | +| periwinkle blue | ![#8f99fb](https://via.placeholder.com/15/8f99fb/000000?text=+) `#8f99fb` | +| light sky blue | ![#c6fcff](https://via.placeholder.com/15/c6fcff/000000?text=+) `#c6fcff` | +| blurple | ![#5539cc](https://via.placeholder.com/15/5539cc/000000?text=+) `#5539cc` | +| green brown | ![#544e03](https://via.placeholder.com/15/544e03/000000?text=+) `#544e03` | +| bluegreen | ![#017a79](https://via.placeholder.com/15/017a79/000000?text=+) `#017a79` | +| bright teal | ![#01f9c6](https://via.placeholder.com/15/01f9c6/000000?text=+) `#01f9c6` | +| brownish yellow | ![#c9b003](https://via.placeholder.com/15/c9b003/000000?text=+) `#c9b003` | +| pea soup | ![#929901](https://via.placeholder.com/15/929901/000000?text=+) `#929901` | +| forest | ![#0b5509](https://via.placeholder.com/15/0b5509/000000?text=+) `#0b5509` | +| barney purple | ![#a00498](https://via.placeholder.com/15/a00498/000000?text=+) `#a00498` | +| ultramarine | ![#2000b1](https://via.placeholder.com/15/2000b1/000000?text=+) `#2000b1` | +| purplish | ![#94568c](https://via.placeholder.com/15/94568c/000000?text=+) `#94568c` | +| puke yellow | ![#c2be0e](https://via.placeholder.com/15/c2be0e/000000?text=+) `#c2be0e` | +| bluish grey | ![#748b97](https://via.placeholder.com/15/748b97/000000?text=+) `#748b97` | +| dark periwinkle | ![#665fd1](https://via.placeholder.com/15/665fd1/000000?text=+) `#665fd1` | +| dark lilac | ![#9c6da5](https://via.placeholder.com/15/9c6da5/000000?text=+) `#9c6da5` | +| reddish | ![#c44240](https://via.placeholder.com/15/c44240/000000?text=+) `#c44240` | +| light maroon | ![#a24857](https://via.placeholder.com/15/a24857/000000?text=+) `#a24857` | +| dusty purple | ![#825f87](https://via.placeholder.com/15/825f87/000000?text=+) `#825f87` | +| terra cotta | ![#c9643b](https://via.placeholder.com/15/c9643b/000000?text=+) `#c9643b` | +| avocado | ![#90b134](https://via.placeholder.com/15/90b134/000000?text=+) `#90b134` | +| marine blue | ![#01386a](https://via.placeholder.com/15/01386a/000000?text=+) `#01386a` | +| teal green | ![#25a36f](https://via.placeholder.com/15/25a36f/000000?text=+) `#25a36f` | +| slate grey | ![#59656d](https://via.placeholder.com/15/59656d/000000?text=+) `#59656d` | +| lighter green | ![#75fd63](https://via.placeholder.com/15/75fd63/000000?text=+) `#75fd63` | +| electric green | ![#21fc0d](https://via.placeholder.com/15/21fc0d/000000?text=+) `#21fc0d` | +| dusty blue | ![#5a86ad](https://via.placeholder.com/15/5a86ad/000000?text=+) `#5a86ad` | +| golden yellow | ![#fec615](https://via.placeholder.com/15/fec615/000000?text=+) `#fec615` | +| bright yellow | ![#fffd01](https://via.placeholder.com/15/fffd01/000000?text=+) `#fffd01` | +| light lavender | ![#dfc5fe](https://via.placeholder.com/15/dfc5fe/000000?text=+) `#dfc5fe` | +| umber | ![#b26400](https://via.placeholder.com/15/b26400/000000?text=+) `#b26400` | +| poop | ![#7f5e00](https://via.placeholder.com/15/7f5e00/000000?text=+) `#7f5e00` | +| dark peach | ![#de7e5d](https://via.placeholder.com/15/de7e5d/000000?text=+) `#de7e5d` | +| jungle green | ![#048243](https://via.placeholder.com/15/048243/000000?text=+) `#048243` | +| eggshell | ![#ffffd4](https://via.placeholder.com/15/ffffd4/000000?text=+) `#ffffd4` | +| denim | ![#3b638c](https://via.placeholder.com/15/3b638c/000000?text=+) `#3b638c` | +| yellow brown | ![#b79400](https://via.placeholder.com/15/b79400/000000?text=+) `#b79400` | +| dull purple | ![#84597e](https://via.placeholder.com/15/84597e/000000?text=+) `#84597e` | +| chocolate brown | ![#411900](https://via.placeholder.com/15/411900/000000?text=+) `#411900` | +| wine red | ![#7b0323](https://via.placeholder.com/15/7b0323/000000?text=+) `#7b0323` | +| neon blue | ![#04d9ff](https://via.placeholder.com/15/04d9ff/000000?text=+) `#04d9ff` | +| dirty green | ![#667e2c](https://via.placeholder.com/15/667e2c/000000?text=+) `#667e2c` | +| light tan | ![#fbeeac](https://via.placeholder.com/15/fbeeac/000000?text=+) `#fbeeac` | +| ice blue | ![#d7fffe](https://via.placeholder.com/15/d7fffe/000000?text=+) `#d7fffe` | +| cadet blue | ![#4e7496](https://via.placeholder.com/15/4e7496/000000?text=+) `#4e7496` | +| dark mauve | ![#874c62](https://via.placeholder.com/15/874c62/000000?text=+) `#874c62` | +| very light blue | ![#d5ffff](https://via.placeholder.com/15/d5ffff/000000?text=+) `#d5ffff` | +| grey purple | ![#826d8c](https://via.placeholder.com/15/826d8c/000000?text=+) `#826d8c` | +| pastel pink | ![#ffbacd](https://via.placeholder.com/15/ffbacd/000000?text=+) `#ffbacd` | +| very light green | ![#d1ffbd](https://via.placeholder.com/15/d1ffbd/000000?text=+) `#d1ffbd` | +| dark sky blue | ![#448ee4](https://via.placeholder.com/15/448ee4/000000?text=+) `#448ee4` | +| evergreen | ![#05472a](https://via.placeholder.com/15/05472a/000000?text=+) `#05472a` | +| dull pink | ![#d5869d](https://via.placeholder.com/15/d5869d/000000?text=+) `#d5869d` | +| aubergine | ![#3d0734](https://via.placeholder.com/15/3d0734/000000?text=+) `#3d0734` | +| mahogany | ![#4a0100](https://via.placeholder.com/15/4a0100/000000?text=+) `#4a0100` | +| reddish orange | ![#f8481c](https://via.placeholder.com/15/f8481c/000000?text=+) `#f8481c` | +| deep green | ![#02590f](https://via.placeholder.com/15/02590f/000000?text=+) `#02590f` | +| vomit green | ![#89a203](https://via.placeholder.com/15/89a203/000000?text=+) `#89a203` | +| purple pink | ![#e03fd8](https://via.placeholder.com/15/e03fd8/000000?text=+) `#e03fd8` | +| dusty pink | ![#d58a94](https://via.placeholder.com/15/d58a94/000000?text=+) `#d58a94` | +| faded green | ![#7bb274](https://via.placeholder.com/15/7bb274/000000?text=+) `#7bb274` | +| camo green | ![#526525](https://via.placeholder.com/15/526525/000000?text=+) `#526525` | +| pinky purple | ![#c94cbe](https://via.placeholder.com/15/c94cbe/000000?text=+) `#c94cbe` | +| pink purple | ![#db4bda](https://via.placeholder.com/15/db4bda/000000?text=+) `#db4bda` | +| brownish red | ![#9e3623](https://via.placeholder.com/15/9e3623/000000?text=+) `#9e3623` | +| dark rose | ![#b5485d](https://via.placeholder.com/15/b5485d/000000?text=+) `#b5485d` | +| mud | ![#735c12](https://via.placeholder.com/15/735c12/000000?text=+) `#735c12` | +| brownish | ![#9c6d57](https://via.placeholder.com/15/9c6d57/000000?text=+) `#9c6d57` | +| emerald green | ![#028f1e](https://via.placeholder.com/15/028f1e/000000?text=+) `#028f1e` | +| pale brown | ![#b1916e](https://via.placeholder.com/15/b1916e/000000?text=+) `#b1916e` | +| dull blue | ![#49759c](https://via.placeholder.com/15/49759c/000000?text=+) `#49759c` | +| burnt umber | ![#a0450e](https://via.placeholder.com/15/a0450e/000000?text=+) `#a0450e` | +| medium green | ![#39ad48](https://via.placeholder.com/15/39ad48/000000?text=+) `#39ad48` | +| clay | ![#b66a50](https://via.placeholder.com/15/b66a50/000000?text=+) `#b66a50` | +| light aqua | ![#8cffdb](https://via.placeholder.com/15/8cffdb/000000?text=+) `#8cffdb` | +| light olive green | ![#a4be5c](https://via.placeholder.com/15/a4be5c/000000?text=+) `#a4be5c` | +| brownish orange | ![#cb7723](https://via.placeholder.com/15/cb7723/000000?text=+) `#cb7723` | +| dark aqua | ![#05696b](https://via.placeholder.com/15/05696b/000000?text=+) `#05696b` | +| purplish pink | ![#ce5dae](https://via.placeholder.com/15/ce5dae/000000?text=+) `#ce5dae` | +| dark salmon | ![#c85a53](https://via.placeholder.com/15/c85a53/000000?text=+) `#c85a53` | +| greenish grey | ![#96ae8d](https://via.placeholder.com/15/96ae8d/000000?text=+) `#96ae8d` | +| jade | ![#1fa774](https://via.placeholder.com/15/1fa774/000000?text=+) `#1fa774` | +| ugly green | ![#7a9703](https://via.placeholder.com/15/7a9703/000000?text=+) `#7a9703` | +| dark beige | ![#ac9362](https://via.placeholder.com/15/ac9362/000000?text=+) `#ac9362` | +| emerald | ![#01a049](https://via.placeholder.com/15/01a049/000000?text=+) `#01a049` | +| pale red | ![#d9544d](https://via.placeholder.com/15/d9544d/000000?text=+) `#d9544d` | +| light magenta | ![#fa5ff7](https://via.placeholder.com/15/fa5ff7/000000?text=+) `#fa5ff7` | +| sky | ![#82cafc](https://via.placeholder.com/15/82cafc/000000?text=+) `#82cafc` | +| light cyan | ![#acfffc](https://via.placeholder.com/15/acfffc/000000?text=+) `#acfffc` | +| yellow orange | ![#fcb001](https://via.placeholder.com/15/fcb001/000000?text=+) `#fcb001` | +| reddish purple | ![#910951](https://via.placeholder.com/15/910951/000000?text=+) `#910951` | +| reddish pink | ![#fe2c54](https://via.placeholder.com/15/fe2c54/000000?text=+) `#fe2c54` | +| orchid | ![#c875c4](https://via.placeholder.com/15/c875c4/000000?text=+) `#c875c4` | +| dirty yellow | ![#cdc50a](https://via.placeholder.com/15/cdc50a/000000?text=+) `#cdc50a` | +| orange red | ![#fd411e](https://via.placeholder.com/15/fd411e/000000?text=+) `#fd411e` | +| deep red | ![#9a0200](https://via.placeholder.com/15/9a0200/000000?text=+) `#9a0200` | +| orange brown | ![#be6400](https://via.placeholder.com/15/be6400/000000?text=+) `#be6400` | +| cobalt blue | ![#030aa7](https://via.placeholder.com/15/030aa7/000000?text=+) `#030aa7` | +| neon pink | ![#fe019a](https://via.placeholder.com/15/fe019a/000000?text=+) `#fe019a` | +| rose pink | ![#f7879a](https://via.placeholder.com/15/f7879a/000000?text=+) `#f7879a` | +| greyish purple | ![#887191](https://via.placeholder.com/15/887191/000000?text=+) `#887191` | +| raspberry | ![#b00149](https://via.placeholder.com/15/b00149/000000?text=+) `#b00149` | +| aqua green | ![#12e193](https://via.placeholder.com/15/12e193/000000?text=+) `#12e193` | +| salmon pink | ![#fe7b7c](https://via.placeholder.com/15/fe7b7c/000000?text=+) `#fe7b7c` | +| tangerine | ![#ff9408](https://via.placeholder.com/15/ff9408/000000?text=+) `#ff9408` | +| brownish green | ![#6a6e09](https://via.placeholder.com/15/6a6e09/000000?text=+) `#6a6e09` | +| red brown | ![#8b2e16](https://via.placeholder.com/15/8b2e16/000000?text=+) `#8b2e16` | +| greenish brown | ![#696112](https://via.placeholder.com/15/696112/000000?text=+) `#696112` | +| pumpkin | ![#e17701](https://via.placeholder.com/15/e17701/000000?text=+) `#e17701` | +| pine green | ![#0a481e](https://via.placeholder.com/15/0a481e/000000?text=+) `#0a481e` | +| charcoal | ![#343837](https://via.placeholder.com/15/343837/000000?text=+) `#343837` | +| baby pink | ![#ffb7ce](https://via.placeholder.com/15/ffb7ce/000000?text=+) `#ffb7ce` | +| cornflower | ![#6a79f7](https://via.placeholder.com/15/6a79f7/000000?text=+) `#6a79f7` | +| blue violet | ![#5d06e9](https://via.placeholder.com/15/5d06e9/000000?text=+) `#5d06e9` | +| chocolate | ![#3d1c02](https://via.placeholder.com/15/3d1c02/000000?text=+) `#3d1c02` | +| greyish green | ![#82a67d](https://via.placeholder.com/15/82a67d/000000?text=+) `#82a67d` | +| scarlet | ![#be0119](https://via.placeholder.com/15/be0119/000000?text=+) `#be0119` | +| green yellow | ![#c9ff27](https://via.placeholder.com/15/c9ff27/000000?text=+) `#c9ff27` | +| dark olive | ![#373e02](https://via.placeholder.com/15/373e02/000000?text=+) `#373e02` | +| sienna | ![#a9561e](https://via.placeholder.com/15/a9561e/000000?text=+) `#a9561e` | +| pastel purple | ![#caa0ff](https://via.placeholder.com/15/caa0ff/000000?text=+) `#caa0ff` | +| terracotta | ![#ca6641](https://via.placeholder.com/15/ca6641/000000?text=+) `#ca6641` | +| aqua blue | ![#02d8e9](https://via.placeholder.com/15/02d8e9/000000?text=+) `#02d8e9` | +| sage green | ![#88b378](https://via.placeholder.com/15/88b378/000000?text=+) `#88b378` | +| blood red | ![#980002](https://via.placeholder.com/15/980002/000000?text=+) `#980002` | +| deep pink | ![#cb0162](https://via.placeholder.com/15/cb0162/000000?text=+) `#cb0162` | +| grass | ![#5cac2d](https://via.placeholder.com/15/5cac2d/000000?text=+) `#5cac2d` | +| moss | ![#769958](https://via.placeholder.com/15/769958/000000?text=+) `#769958` | +| pastel blue | ![#a2bffe](https://via.placeholder.com/15/a2bffe/000000?text=+) `#a2bffe` | +| bluish green | ![#10a674](https://via.placeholder.com/15/10a674/000000?text=+) `#10a674` | +| green blue | ![#06b48b](https://via.placeholder.com/15/06b48b/000000?text=+) `#06b48b` | +| dark tan | ![#af884a](https://via.placeholder.com/15/af884a/000000?text=+) `#af884a` | +| greenish blue | ![#0b8b87](https://via.placeholder.com/15/0b8b87/000000?text=+) `#0b8b87` | +| pale orange | ![#ffa756](https://via.placeholder.com/15/ffa756/000000?text=+) `#ffa756` | +| vomit | ![#a2a415](https://via.placeholder.com/15/a2a415/000000?text=+) `#a2a415` | +| forrest green | ![#154406](https://via.placeholder.com/15/154406/000000?text=+) `#154406` | +| dark lavender | ![#856798](https://via.placeholder.com/15/856798/000000?text=+) `#856798` | +| dark violet | ![#34013f](https://via.placeholder.com/15/34013f/000000?text=+) `#34013f` | +| purple blue | ![#632de9](https://via.placeholder.com/15/632de9/000000?text=+) `#632de9` | +| dark cyan | ![#0a888a](https://via.placeholder.com/15/0a888a/000000?text=+) `#0a888a` | +| olive drab | ![#6f7632](https://via.placeholder.com/15/6f7632/000000?text=+) `#6f7632` | +| pinkish | ![#d46a7e](https://via.placeholder.com/15/d46a7e/000000?text=+) `#d46a7e` | +| cobalt | ![#1e488f](https://via.placeholder.com/15/1e488f/000000?text=+) `#1e488f` | +| neon purple | ![#bc13fe](https://via.placeholder.com/15/bc13fe/000000?text=+) `#bc13fe` | +| light turquoise | ![#7ef4cc](https://via.placeholder.com/15/7ef4cc/000000?text=+) `#7ef4cc` | +| apple green | ![#76cd26](https://via.placeholder.com/15/76cd26/000000?text=+) `#76cd26` | +| dull green | ![#74a662](https://via.placeholder.com/15/74a662/000000?text=+) `#74a662` | +| wine | ![#80013f](https://via.placeholder.com/15/80013f/000000?text=+) `#80013f` | +| powder blue | ![#b1d1fc](https://via.placeholder.com/15/b1d1fc/000000?text=+) `#b1d1fc` | +| off white | ![#ffffe4](https://via.placeholder.com/15/ffffe4/000000?text=+) `#ffffe4` | +| electric blue | ![#0652ff](https://via.placeholder.com/15/0652ff/000000?text=+) `#0652ff` | +| dark turquoise | ![#045c5a](https://via.placeholder.com/15/045c5a/000000?text=+) `#045c5a` | +| blue purple | ![#5729ce](https://via.placeholder.com/15/5729ce/000000?text=+) `#5729ce` | +| azure | ![#069af3](https://via.placeholder.com/15/069af3/000000?text=+) `#069af3` | +| bright red | ![#ff000d](https://via.placeholder.com/15/ff000d/000000?text=+) `#ff000d` | +| pinkish red | ![#f10c45](https://via.placeholder.com/15/f10c45/000000?text=+) `#f10c45` | +| cornflower blue | ![#5170d7](https://via.placeholder.com/15/5170d7/000000?text=+) `#5170d7` | +| light olive | ![#acbf69](https://via.placeholder.com/15/acbf69/000000?text=+) `#acbf69` | +| grape | ![#6c3461](https://via.placeholder.com/15/6c3461/000000?text=+) `#6c3461` | +| greyish blue | ![#5e819d](https://via.placeholder.com/15/5e819d/000000?text=+) `#5e819d` | +| purplish blue | ![#601ef9](https://via.placeholder.com/15/601ef9/000000?text=+) `#601ef9` | +| yellowish green | ![#b0dd16](https://via.placeholder.com/15/b0dd16/000000?text=+) `#b0dd16` | +| greenish yellow | ![#cdfd02](https://via.placeholder.com/15/cdfd02/000000?text=+) `#cdfd02` | +| medium blue | ![#2c6fbb](https://via.placeholder.com/15/2c6fbb/000000?text=+) `#2c6fbb` | +| dusty rose | ![#c0737a](https://via.placeholder.com/15/c0737a/000000?text=+) `#c0737a` | +| light violet | ![#d6b4fc](https://via.placeholder.com/15/d6b4fc/000000?text=+) `#d6b4fc` | +| midnight blue | ![#020035](https://via.placeholder.com/15/020035/000000?text=+) `#020035` | +| bluish purple | ![#703be7](https://via.placeholder.com/15/703be7/000000?text=+) `#703be7` | +| red orange | ![#fd3c06](https://via.placeholder.com/15/fd3c06/000000?text=+) `#fd3c06` | +| dark magenta | ![#960056](https://via.placeholder.com/15/960056/000000?text=+) `#960056` | +| greenish | ![#40a368](https://via.placeholder.com/15/40a368/000000?text=+) `#40a368` | +| ocean blue | ![#03719c](https://via.placeholder.com/15/03719c/000000?text=+) `#03719c` | +| coral | ![#fc5a50](https://via.placeholder.com/15/fc5a50/000000?text=+) `#fc5a50` | +| cream | ![#ffffc2](https://via.placeholder.com/15/ffffc2/000000?text=+) `#ffffc2` | +| reddish brown | ![#7f2b0a](https://via.placeholder.com/15/7f2b0a/000000?text=+) `#7f2b0a` | +| burnt sienna | ![#b04e0f](https://via.placeholder.com/15/b04e0f/000000?text=+) `#b04e0f` | +| brick | ![#a03623](https://via.placeholder.com/15/a03623/000000?text=+) `#a03623` | +| sage | ![#87ae73](https://via.placeholder.com/15/87ae73/000000?text=+) `#87ae73` | +| grey green | ![#789b73](https://via.placeholder.com/15/789b73/000000?text=+) `#789b73` | +| white | ![#ffffff](https://via.placeholder.com/15/ffffff/000000?text=+) `#ffffff` | +| robin's egg blue | ![#98eff9](https://via.placeholder.com/15/98eff9/000000?text=+) `#98eff9` | +| moss green | ![#658b38](https://via.placeholder.com/15/658b38/000000?text=+) `#658b38` | +| steel blue | ![#5a7d9a](https://via.placeholder.com/15/5a7d9a/000000?text=+) `#5a7d9a` | +| eggplant | ![#380835](https://via.placeholder.com/15/380835/000000?text=+) `#380835` | +| light yellow | ![#fffe7a](https://via.placeholder.com/15/fffe7a/000000?text=+) `#fffe7a` | +| leaf green | ![#5ca904](https://via.placeholder.com/15/5ca904/000000?text=+) `#5ca904` | +| light grey | ![#d8dcd6](https://via.placeholder.com/15/d8dcd6/000000?text=+) `#d8dcd6` | +| puke | ![#a5a502](https://via.placeholder.com/15/a5a502/000000?text=+) `#a5a502` | +| pinkish purple | ![#d648d7](https://via.placeholder.com/15/d648d7/000000?text=+) `#d648d7` | +| sea blue | ![#047495](https://via.placeholder.com/15/047495/000000?text=+) `#047495` | +| pale purple | ![#b790d4](https://via.placeholder.com/15/b790d4/000000?text=+) `#b790d4` | +| slate blue | ![#5b7c99](https://via.placeholder.com/15/5b7c99/000000?text=+) `#5b7c99` | +| blue grey | ![#607c8e](https://via.placeholder.com/15/607c8e/000000?text=+) `#607c8e` | +| hunter green | ![#0b4008](https://via.placeholder.com/15/0b4008/000000?text=+) `#0b4008` | +| fuchsia | ![#ed0dd9](https://via.placeholder.com/15/ed0dd9/000000?text=+) `#ed0dd9` | +| crimson | ![#8c000f](https://via.placeholder.com/15/8c000f/000000?text=+) `#8c000f` | +| pale yellow | ![#ffff84](https://via.placeholder.com/15/ffff84/000000?text=+) `#ffff84` | +| ochre | ![#bf9005](https://via.placeholder.com/15/bf9005/000000?text=+) `#bf9005` | +| mustard yellow | ![#d2bd0a](https://via.placeholder.com/15/d2bd0a/000000?text=+) `#d2bd0a` | +| light red | ![#ff474c](https://via.placeholder.com/15/ff474c/000000?text=+) `#ff474c` | +| cerulean | ![#0485d1](https://via.placeholder.com/15/0485d1/000000?text=+) `#0485d1` | +| pale pink | ![#ffcfdc](https://via.placeholder.com/15/ffcfdc/000000?text=+) `#ffcfdc` | +| deep blue | ![#040273](https://via.placeholder.com/15/040273/000000?text=+) `#040273` | +| rust | ![#a83c09](https://via.placeholder.com/15/a83c09/000000?text=+) `#a83c09` | +| light teal | ![#90e4c1](https://via.placeholder.com/15/90e4c1/000000?text=+) `#90e4c1` | +| slate | ![#516572](https://via.placeholder.com/15/516572/000000?text=+) `#516572` | +| goldenrod | ![#fac205](https://via.placeholder.com/15/fac205/000000?text=+) `#fac205` | +| dark yellow | ![#d5b60a](https://via.placeholder.com/15/d5b60a/000000?text=+) `#d5b60a` | +| dark grey | ![#363737](https://via.placeholder.com/15/363737/000000?text=+) `#363737` | +| army green | ![#4b5d16](https://via.placeholder.com/15/4b5d16/000000?text=+) `#4b5d16` | +| grey blue | ![#6b8ba4](https://via.placeholder.com/15/6b8ba4/000000?text=+) `#6b8ba4` | +| seafoam | ![#80f9ad](https://via.placeholder.com/15/80f9ad/000000?text=+) `#80f9ad` | +| puce | ![#a57e52](https://via.placeholder.com/15/a57e52/000000?text=+) `#a57e52` | +| spring green | ![#a9f971](https://via.placeholder.com/15/a9f971/000000?text=+) `#a9f971` | +| dark orange | ![#c65102](https://via.placeholder.com/15/c65102/000000?text=+) `#c65102` | +| sand | ![#e2ca76](https://via.placeholder.com/15/e2ca76/000000?text=+) `#e2ca76` | +| pastel green | ![#b0ff9d](https://via.placeholder.com/15/b0ff9d/000000?text=+) `#b0ff9d` | +| mint | ![#9ffeb0](https://via.placeholder.com/15/9ffeb0/000000?text=+) `#9ffeb0` | +| light orange | ![#fdaa48](https://via.placeholder.com/15/fdaa48/000000?text=+) `#fdaa48` | +| bright pink | ![#fe01b1](https://via.placeholder.com/15/fe01b1/000000?text=+) `#fe01b1` | +| chartreuse | ![#c1f80a](https://via.placeholder.com/15/c1f80a/000000?text=+) `#c1f80a` | +| deep purple | ![#36013f](https://via.placeholder.com/15/36013f/000000?text=+) `#36013f` | +| dark brown | ![#341c02](https://via.placeholder.com/15/341c02/000000?text=+) `#341c02` | +| taupe | ![#b9a281](https://via.placeholder.com/15/b9a281/000000?text=+) `#b9a281` | +| pea green | ![#8eab12](https://via.placeholder.com/15/8eab12/000000?text=+) `#8eab12` | +| puke green | ![#9aae07](https://via.placeholder.com/15/9aae07/000000?text=+) `#9aae07` | +| kelly green | ![#02ab2e](https://via.placeholder.com/15/02ab2e/000000?text=+) `#02ab2e` | +| seafoam green | ![#7af9ab](https://via.placeholder.com/15/7af9ab/000000?text=+) `#7af9ab` | +| blue green | ![#137e6d](https://via.placeholder.com/15/137e6d/000000?text=+) `#137e6d` | +| khaki | ![#aaa662](https://via.placeholder.com/15/aaa662/000000?text=+) `#aaa662` | +| burgundy | ![#610023](https://via.placeholder.com/15/610023/000000?text=+) `#610023` | +| dark teal | ![#014d4e](https://via.placeholder.com/15/014d4e/000000?text=+) `#014d4e` | +| brick red | ![#8f1402](https://via.placeholder.com/15/8f1402/000000?text=+) `#8f1402` | +| royal purple | ![#4b006e](https://via.placeholder.com/15/4b006e/000000?text=+) `#4b006e` | +| plum | ![#580f41](https://via.placeholder.com/15/580f41/000000?text=+) `#580f41` | +| mint green | ![#8fff9f](https://via.placeholder.com/15/8fff9f/000000?text=+) `#8fff9f` | +| gold | ![#dbb40c](https://via.placeholder.com/15/dbb40c/000000?text=+) `#dbb40c` | +| baby blue | ![#a2cffe](https://via.placeholder.com/15/a2cffe/000000?text=+) `#a2cffe` | +| yellow green | ![#c0fb2d](https://via.placeholder.com/15/c0fb2d/000000?text=+) `#c0fb2d` | +| bright purple | ![#be03fd](https://via.placeholder.com/15/be03fd/000000?text=+) `#be03fd` | +| dark red | ![#840000](https://via.placeholder.com/15/840000/000000?text=+) `#840000` | +| pale blue | ![#d0fefe](https://via.placeholder.com/15/d0fefe/000000?text=+) `#d0fefe` | +| grass green | ![#3f9b0b](https://via.placeholder.com/15/3f9b0b/000000?text=+) `#3f9b0b` | +| navy | ![#01153e](https://via.placeholder.com/15/01153e/000000?text=+) `#01153e` | +| aquamarine | ![#04d8b2](https://via.placeholder.com/15/04d8b2/000000?text=+) `#04d8b2` | +| burnt orange | ![#c04e01](https://via.placeholder.com/15/c04e01/000000?text=+) `#c04e01` | +| neon green | ![#0cff0c](https://via.placeholder.com/15/0cff0c/000000?text=+) `#0cff0c` | +| bright blue | ![#0165fc](https://via.placeholder.com/15/0165fc/000000?text=+) `#0165fc` | +| rose | ![#cf6275](https://via.placeholder.com/15/cf6275/000000?text=+) `#cf6275` | +| light pink | ![#ffd1df](https://via.placeholder.com/15/ffd1df/000000?text=+) `#ffd1df` | +| mustard | ![#ceb301](https://via.placeholder.com/15/ceb301/000000?text=+) `#ceb301` | +| indigo | ![#380282](https://via.placeholder.com/15/380282/000000?text=+) `#380282` | +| lime | ![#aaff32](https://via.placeholder.com/15/aaff32/000000?text=+) `#aaff32` | +| sea green | ![#53fca1](https://via.placeholder.com/15/53fca1/000000?text=+) `#53fca1` | +| periwinkle | ![#8e82fe](https://via.placeholder.com/15/8e82fe/000000?text=+) `#8e82fe` | +| dark pink | ![#cb416b](https://via.placeholder.com/15/cb416b/000000?text=+) `#cb416b` | +| olive green | ![#677a04](https://via.placeholder.com/15/677a04/000000?text=+) `#677a04` | +| peach | ![#ffb07c](https://via.placeholder.com/15/ffb07c/000000?text=+) `#ffb07c` | +| pale green | ![#c7fdb5](https://via.placeholder.com/15/c7fdb5/000000?text=+) `#c7fdb5` | +| light brown | ![#ad8150](https://via.placeholder.com/15/ad8150/000000?text=+) `#ad8150` | +| hot pink | ![#ff028d](https://via.placeholder.com/15/ff028d/000000?text=+) `#ff028d` | +| black | ![#000000](https://via.placeholder.com/15/000000/000000?text=+) `#000000` | +| lilac | ![#cea2fd](https://via.placeholder.com/15/cea2fd/000000?text=+) `#cea2fd` | +| navy blue | ![#001146](https://via.placeholder.com/15/001146/000000?text=+) `#001146` | +| royal blue | ![#0504aa](https://via.placeholder.com/15/0504aa/000000?text=+) `#0504aa` | +| beige | ![#e6daa6](https://via.placeholder.com/15/e6daa6/000000?text=+) `#e6daa6` | +| salmon | ![#ff796c](https://via.placeholder.com/15/ff796c/000000?text=+) `#ff796c` | +| olive | ![#6e750e](https://via.placeholder.com/15/6e750e/000000?text=+) `#6e750e` | +| maroon | ![#650021](https://via.placeholder.com/15/650021/000000?text=+) `#650021` | +| bright green | ![#01ff07](https://via.placeholder.com/15/01ff07/000000?text=+) `#01ff07` | +| dark purple | ![#35063e](https://via.placeholder.com/15/35063e/000000?text=+) `#35063e` | +| mauve | ![#ae7181](https://via.placeholder.com/15/ae7181/000000?text=+) `#ae7181` | +| forest green | ![#06470c](https://via.placeholder.com/15/06470c/000000?text=+) `#06470c` | +| aqua | ![#13eac9](https://via.placeholder.com/15/13eac9/000000?text=+) `#13eac9` | +| cyan | ![#00ffff](https://via.placeholder.com/15/00ffff/000000?text=+) `#00ffff` | +| tan | ![#d1b26f](https://via.placeholder.com/15/d1b26f/000000?text=+) `#d1b26f` | +| dark blue | ![#00035b](https://via.placeholder.com/15/00035b/000000?text=+) `#00035b` | +| lavender | ![#c79fef](https://via.placeholder.com/15/c79fef/000000?text=+) `#c79fef` | +| turquoise | ![#06c2ac](https://via.placeholder.com/15/06c2ac/000000?text=+) `#06c2ac` | +| dark green | ![#033500](https://via.placeholder.com/15/033500/000000?text=+) `#033500` | +| violet | ![#9a0eea](https://via.placeholder.com/15/9a0eea/000000?text=+) `#9a0eea` | +| light purple | ![#bf77f6](https://via.placeholder.com/15/bf77f6/000000?text=+) `#bf77f6` | +| lime green | ![#89fe05](https://via.placeholder.com/15/89fe05/000000?text=+) `#89fe05` | +| grey | ![#929591](https://via.placeholder.com/15/929591/000000?text=+) `#929591` | +| sky blue | ![#75bbfd](https://via.placeholder.com/15/75bbfd/000000?text=+) `#75bbfd` | +| yellow | ![#ffff14](https://via.placeholder.com/15/ffff14/000000?text=+) `#ffff14` | +| magenta | ![#c20078](https://via.placeholder.com/15/c20078/000000?text=+) `#c20078` | +| light green | ![#96f97b](https://via.placeholder.com/15/96f97b/000000?text=+) `#96f97b` | +| orange | ![#f97306](https://via.placeholder.com/15/f97306/000000?text=+) `#f97306` | +| teal | ![#029386](https://via.placeholder.com/15/029386/000000?text=+) `#029386` | +| light blue | ![#95d0fc](https://via.placeholder.com/15/95d0fc/000000?text=+) `#95d0fc` | +| red | ![#e50000](https://via.placeholder.com/15/e50000/000000?text=+) `#e50000` | +| brown | ![#653700](https://via.placeholder.com/15/653700/000000?text=+) `#653700` | +| pink | ![#ff81c0](https://via.placeholder.com/15/ff81c0/000000?text=+) `#ff81c0` | +| blue | ![#0343df](https://via.placeholder.com/15/0343df/000000?text=+) `#0343df` | +| green | ![#15b01a](https://via.placeholder.com/15/15b01a/000000?text=+) `#15b01a` | +| purple | ![#7e1e9c](https://via.placeholder.com/15/7e1e9c/000000?text=+) `#7e1e9c` | + +To force use xkcd color, use `xkcd:` (ie. `xkcd:light olive green`). + +*** + +### CSS4 Colors: + +| Color Name | Hex Code | +| -------------------- | ------------------------------------------------------------------------- | +| aliceblue | ![#F0F8FF](https://via.placeholder.com/15/F0F8FF/000000?text=+) `#F0F8FF` | +| antiquewhite | ![#FAEBD7](https://via.placeholder.com/15/FAEBD7/000000?text=+) `#FAEBD7` | +| aqua | ![#00FFFF](https://via.placeholder.com/15/00FFFF/000000?text=+) `#00FFFF` | +| aquamarine | ![#7FFFD4](https://via.placeholder.com/15/7FFFD4/000000?text=+) `#7FFFD4` | +| azure | ![#F0FFFF](https://via.placeholder.com/15/F0FFFF/000000?text=+) `#F0FFFF` | +| beige | ![#F5F5DC](https://via.placeholder.com/15/F5F5DC/000000?text=+) `#F5F5DC` | +| bisque | ![#FFE4C4](https://via.placeholder.com/15/FFE4C4/000000?text=+) `#FFE4C4` | +| black | ![#000000](https://via.placeholder.com/15/000000/000000?text=+) `#000000` | +| blanchedalmond | ![#FFEBCD](https://via.placeholder.com/15/FFEBCD/000000?text=+) `#FFEBCD` | +| blue | ![#0000FF](https://via.placeholder.com/15/0000FF/000000?text=+) `#0000FF` | +| blueviolet | ![#8A2BE2](https://via.placeholder.com/15/8A2BE2/000000?text=+) `#8A2BE2` | +| brown | ![#A52A2A](https://via.placeholder.com/15/A52A2A/000000?text=+) `#A52A2A` | +| burlywood | ![#DEB887](https://via.placeholder.com/15/DEB887/000000?text=+) `#DEB887` | +| cadetblue | ![#5F9EA0](https://via.placeholder.com/15/5F9EA0/000000?text=+) `#5F9EA0` | +| chartreuse | ![#7FFF00](https://via.placeholder.com/15/7FFF00/000000?text=+) `#7FFF00` | +| chocolate | ![#D2691E](https://via.placeholder.com/15/D2691E/000000?text=+) `#D2691E` | +| coral | ![#FF7F50](https://via.placeholder.com/15/FF7F50/000000?text=+) `#FF7F50` | +| cornflowerblue | ![#6495ED](https://via.placeholder.com/15/6495ED/000000?text=+) `#6495ED` | +| cornsilk | ![#FFF8DC](https://via.placeholder.com/15/FFF8DC/000000?text=+) `#FFF8DC` | +| crimson | ![#DC143C](https://via.placeholder.com/15/DC143C/000000?text=+) `#DC143C` | +| cyan | ![#00FFFF](https://via.placeholder.com/15/00FFFF/000000?text=+) `#00FFFF` | +| darkblue | ![#00008B](https://via.placeholder.com/15/00008B/000000?text=+) `#00008B` | +| darkcyan | ![#008B8B](https://via.placeholder.com/15/008B8B/000000?text=+) `#008B8B` | +| darkgoldenrod | ![#B8860B](https://via.placeholder.com/15/B8860B/000000?text=+) `#B8860B` | +| darkgray | ![#A9A9A9](https://via.placeholder.com/15/A9A9A9/000000?text=+) `#A9A9A9` | +| darkgreen | ![#006400](https://via.placeholder.com/15/006400/000000?text=+) `#006400` | +| darkgrey | ![#A9A9A9](https://via.placeholder.com/15/A9A9A9/000000?text=+) `#A9A9A9` | +| darkkhaki | ![#BDB76B](https://via.placeholder.com/15/BDB76B/000000?text=+) `#BDB76B` | +| darkmagenta | ![#8B008B](https://via.placeholder.com/15/8B008B/000000?text=+) `#8B008B` | +| darkolivegreen | ![#556B2F](https://via.placeholder.com/15/556B2F/000000?text=+) `#556B2F` | +| darkorange | ![#FF8C00](https://via.placeholder.com/15/FF8C00/000000?text=+) `#FF8C00` | +| darkorchid | ![#9932CC](https://via.placeholder.com/15/9932CC/000000?text=+) `#9932CC` | +| darkred | ![#8B0000](https://via.placeholder.com/15/8B0000/000000?text=+) `#8B0000` | +| darksalmon | ![#E9967A](https://via.placeholder.com/15/E9967A/000000?text=+) `#E9967A` | +| darkseagreen | ![#8FBC8F](https://via.placeholder.com/15/8FBC8F/000000?text=+) `#8FBC8F` | +| darkslateblue | ![#483D8B](https://via.placeholder.com/15/483D8B/000000?text=+) `#483D8B` | +| darkslategray | ![#2F4F4F](https://via.placeholder.com/15/2F4F4F/000000?text=+) `#2F4F4F` | +| darkslategrey | ![#2F4F4F](https://via.placeholder.com/15/2F4F4F/000000?text=+) `#2F4F4F` | +| darkturquoise | ![#00CED1](https://via.placeholder.com/15/00CED1/000000?text=+) `#00CED1` | +| darkviolet | ![#9400D3](https://via.placeholder.com/15/9400D3/000000?text=+) `#9400D3` | +| deeppink | ![#FF1493](https://via.placeholder.com/15/FF1493/000000?text=+) `#FF1493` | +| deepskyblue | ![#00BFFF](https://via.placeholder.com/15/00BFFF/000000?text=+) `#00BFFF` | +| dimgray | ![#696969](https://via.placeholder.com/15/696969/000000?text=+) `#696969` | +| dimgrey | ![#696969](https://via.placeholder.com/15/696969/000000?text=+) `#696969` | +| dodgerblue | ![#1E90FF](https://via.placeholder.com/15/1E90FF/000000?text=+) `#1E90FF` | +| firebrick | ![#B22222](https://via.placeholder.com/15/B22222/000000?text=+) `#B22222` | +| floralwhite | ![#FFFAF0](https://via.placeholder.com/15/FFFAF0/000000?text=+) `#FFFAF0` | +| forestgreen | ![#228B22](https://via.placeholder.com/15/228B22/000000?text=+) `#228B22` | +| fuchsia | ![#FF00FF](https://via.placeholder.com/15/FF00FF/000000?text=+) `#FF00FF` | +| gainsboro | ![#DCDCDC](https://via.placeholder.com/15/DCDCDC/000000?text=+) `#DCDCDC` | +| ghostwhite | ![#F8F8FF](https://via.placeholder.com/15/F8F8FF/000000?text=+) `#F8F8FF` | +| gold | ![#FFD700](https://via.placeholder.com/15/FFD700/000000?text=+) `#FFD700` | +| goldenrod | ![#DAA520](https://via.placeholder.com/15/DAA520/000000?text=+) `#DAA520` | +| gray | ![#808080](https://via.placeholder.com/15/808080/000000?text=+) `#808080` | +| green | ![#008000](https://via.placeholder.com/15/008000/000000?text=+) `#008000` | +| greenyellow | ![#ADFF2F](https://via.placeholder.com/15/ADFF2F/000000?text=+) `#ADFF2F` | +| grey | ![#808080](https://via.placeholder.com/15/808080/000000?text=+) `#808080` | +| honeydew | ![#F0FFF0](https://via.placeholder.com/15/F0FFF0/000000?text=+) `#F0FFF0` | +| hotpink | ![#FF69B4](https://via.placeholder.com/15/FF69B4/000000?text=+) `#FF69B4` | +| indianred | ![#CD5C5C](https://via.placeholder.com/15/CD5C5C/000000?text=+) `#CD5C5C` | +| indigo | ![#4B0082](https://via.placeholder.com/15/4B0082/000000?text=+) `#4B0082` | +| ivory | ![#FFFFF0](https://via.placeholder.com/15/FFFFF0/000000?text=+) `#FFFFF0` | +| khaki | ![#F0E68C](https://via.placeholder.com/15/F0E68C/000000?text=+) `#F0E68C` | +| lavender | ![#E6E6FA](https://via.placeholder.com/15/E6E6FA/000000?text=+) `#E6E6FA` | +| lavenderblush | ![#FFF0F5](https://via.placeholder.com/15/FFF0F5/000000?text=+) `#FFF0F5` | +| lawngreen | ![#7CFC00](https://via.placeholder.com/15/7CFC00/000000?text=+) `#7CFC00` | +| lemonchiffon | ![#FFFACD](https://via.placeholder.com/15/FFFACD/000000?text=+) `#FFFACD` | +| lightblue | ![#ADD8E6](https://via.placeholder.com/15/ADD8E6/000000?text=+) `#ADD8E6` | +| lightcoral | ![#F08080](https://via.placeholder.com/15/F08080/000000?text=+) `#F08080` | +| lightcyan | ![#E0FFFF](https://via.placeholder.com/15/E0FFFF/000000?text=+) `#E0FFFF` | +| lightgoldenrodyellow | ![#FAFAD2](https://via.placeholder.com/15/FAFAD2/000000?text=+) `#FAFAD2` | +| lightgray | ![#D3D3D3](https://via.placeholder.com/15/D3D3D3/000000?text=+) `#D3D3D3` | +| lightgreen | ![#90EE90](https://via.placeholder.com/15/90EE90/000000?text=+) `#90EE90` | +| lightgrey | ![#D3D3D3](https://via.placeholder.com/15/D3D3D3/000000?text=+) `#D3D3D3` | +| lightpink | ![#FFB6C1](https://via.placeholder.com/15/FFB6C1/000000?text=+) `#FFB6C1` | +| lightsalmon | ![#FFA07A](https://via.placeholder.com/15/FFA07A/000000?text=+) `#FFA07A` | +| lightseagreen | ![#20B2AA](https://via.placeholder.com/15/20B2AA/000000?text=+) `#20B2AA` | +| lightskyblue | ![#87CEFA](https://via.placeholder.com/15/87CEFA/000000?text=+) `#87CEFA` | +| lightslategray | ![#778899](https://via.placeholder.com/15/778899/000000?text=+) `#778899` | +| lightslategrey | ![#778899](https://via.placeholder.com/15/778899/000000?text=+) `#778899` | +| lightsteelblue | ![#B0C4DE](https://via.placeholder.com/15/B0C4DE/000000?text=+) `#B0C4DE` | +| lightyellow | ![#FFFFE0](https://via.placeholder.com/15/FFFFE0/000000?text=+) `#FFFFE0` | +| lime | ![#00FF00](https://via.placeholder.com/15/00FF00/000000?text=+) `#00FF00` | +| limegreen | ![#32CD32](https://via.placeholder.com/15/32CD32/000000?text=+) `#32CD32` | +| linen | ![#FAF0E6](https://via.placeholder.com/15/FAF0E6/000000?text=+) `#FAF0E6` | +| magenta | ![#FF00FF](https://via.placeholder.com/15/FF00FF/000000?text=+) `#FF00FF` | +| maroon | ![#800000](https://via.placeholder.com/15/800000/000000?text=+) `#800000` | +| mediumaquamarine | ![#66CDAA](https://via.placeholder.com/15/66CDAA/000000?text=+) `#66CDAA` | +| mediumblue | ![#0000CD](https://via.placeholder.com/15/0000CD/000000?text=+) `#0000CD` | +| mediumorchid | ![#BA55D3](https://via.placeholder.com/15/BA55D3/000000?text=+) `#BA55D3` | +| mediumpurple | ![#9370DB](https://via.placeholder.com/15/9370DB/000000?text=+) `#9370DB` | +| mediumseagreen | ![#3CB371](https://via.placeholder.com/15/3CB371/000000?text=+) `#3CB371` | +| mediumslateblue | ![#7B68EE](https://via.placeholder.com/15/7B68EE/000000?text=+) `#7B68EE` | +| mediumspringgreen | ![#00FA9A](https://via.placeholder.com/15/00FA9A/000000?text=+) `#00FA9A` | +| mediumturquoise | ![#48D1CC](https://via.placeholder.com/15/48D1CC/000000?text=+) `#48D1CC` | +| mediumvioletred | ![#C71585](https://via.placeholder.com/15/C71585/000000?text=+) `#C71585` | +| midnightblue | ![#191970](https://via.placeholder.com/15/191970/000000?text=+) `#191970` | +| mintcream | ![#F5FFFA](https://via.placeholder.com/15/F5FFFA/000000?text=+) `#F5FFFA` | +| mistyrose | ![#FFE4E1](https://via.placeholder.com/15/FFE4E1/000000?text=+) `#FFE4E1` | +| moccasin | ![#FFE4B5](https://via.placeholder.com/15/FFE4B5/000000?text=+) `#FFE4B5` | +| navajowhite | ![#FFDEAD](https://via.placeholder.com/15/FFDEAD/000000?text=+) `#FFDEAD` | +| navy | ![#000080](https://via.placeholder.com/15/000080/000000?text=+) `#000080` | +| oldlace | ![#FDF5E6](https://via.placeholder.com/15/FDF5E6/000000?text=+) `#FDF5E6` | +| olive | ![#808000](https://via.placeholder.com/15/808000/000000?text=+) `#808000` | +| olivedrab | ![#6B8E23](https://via.placeholder.com/15/6B8E23/000000?text=+) `#6B8E23` | +| orange | ![#FFA500](https://via.placeholder.com/15/FFA500/000000?text=+) `#FFA500` | +| orangered | ![#FF4500](https://via.placeholder.com/15/FF4500/000000?text=+) `#FF4500` | +| orchid | ![#DA70D6](https://via.placeholder.com/15/DA70D6/000000?text=+) `#DA70D6` | +| palegoldenrod | ![#EEE8AA](https://via.placeholder.com/15/EEE8AA/000000?text=+) `#EEE8AA` | +| palegreen | ![#98FB98](https://via.placeholder.com/15/98FB98/000000?text=+) `#98FB98` | +| paleturquoise | ![#AFEEEE](https://via.placeholder.com/15/AFEEEE/000000?text=+) `#AFEEEE` | +| palevioletred | ![#DB7093](https://via.placeholder.com/15/DB7093/000000?text=+) `#DB7093` | +| papayawhip | ![#FFEFD5](https://via.placeholder.com/15/FFEFD5/000000?text=+) `#FFEFD5` | +| peachpuff | ![#FFDAB9](https://via.placeholder.com/15/FFDAB9/000000?text=+) `#FFDAB9` | +| peru | ![#CD853F](https://via.placeholder.com/15/CD853F/000000?text=+) `#CD853F` | +| pink | ![#FFC0CB](https://via.placeholder.com/15/FFC0CB/000000?text=+) `#FFC0CB` | +| plum | ![#DDA0DD](https://via.placeholder.com/15/DDA0DD/000000?text=+) `#DDA0DD` | +| powderblue | ![#B0E0E6](https://via.placeholder.com/15/B0E0E6/000000?text=+) `#B0E0E6` | +| purple | ![#800080](https://via.placeholder.com/15/800080/000000?text=+) `#800080` | +| rebeccapurple | ![#663399](https://via.placeholder.com/15/663399/000000?text=+) `#663399` | +| red | ![#FF0000](https://via.placeholder.com/15/FF0000/000000?text=+) `#FF0000` | +| rosybrown | ![#BC8F8F](https://via.placeholder.com/15/BC8F8F/000000?text=+) `#BC8F8F` | +| royalblue | ![#4169E1](https://via.placeholder.com/15/4169E1/000000?text=+) `#4169E1` | +| saddlebrown | ![#8B4513](https://via.placeholder.com/15/8B4513/000000?text=+) `#8B4513` | +| salmon | ![#FA8072](https://via.placeholder.com/15/FA8072/000000?text=+) `#FA8072` | +| sandybrown | ![#F4A460](https://via.placeholder.com/15/F4A460/000000?text=+) `#F4A460` | +| seagreen | ![#2E8B57](https://via.placeholder.com/15/2E8B57/000000?text=+) `#2E8B57` | +| seashell | ![#FFF5EE](https://via.placeholder.com/15/FFF5EE/000000?text=+) `#FFF5EE` | +| sienna | ![#A0522D](https://via.placeholder.com/15/A0522D/000000?text=+) `#A0522D` | +| silver | ![#C0C0C0](https://via.placeholder.com/15/C0C0C0/000000?text=+) `#C0C0C0` | +| skyblue | ![#87CEEB](https://via.placeholder.com/15/87CEEB/000000?text=+) `#87CEEB` | +| slateblue | ![#6A5ACD](https://via.placeholder.com/15/6A5ACD/000000?text=+) `#6A5ACD` | +| slategray | ![#708090](https://via.placeholder.com/15/708090/000000?text=+) `#708090` | +| slategrey | ![#708090](https://via.placeholder.com/15/708090/000000?text=+) `#708090` | +| snow | ![#FFFAFA](https://via.placeholder.com/15/FFFAFA/000000?text=+) `#FFFAFA` | +| springgreen | ![#00FF7F](https://via.placeholder.com/15/00FF7F/000000?text=+) `#00FF7F` | +| steelblue | ![#4682B4](https://via.placeholder.com/15/4682B4/000000?text=+) `#4682B4` | +| tan | ![#D2B48C](https://via.placeholder.com/15/D2B48C/000000?text=+) `#D2B48C` | +| teal | ![#008080](https://via.placeholder.com/15/008080/000000?text=+) `#008080` | +| thistle | ![#D8BFD8](https://via.placeholder.com/15/D8BFD8/000000?text=+) `#D8BFD8` | +| tomato | ![#FF6347](https://via.placeholder.com/15/FF6347/000000?text=+) `#FF6347` | +| turquoise | ![#40E0D0](https://via.placeholder.com/15/40E0D0/000000?text=+) `#40E0D0` | +| violet | ![#EE82EE](https://via.placeholder.com/15/EE82EE/000000?text=+) `#EE82EE` | +| wheat | ![#F5DEB3](https://via.placeholder.com/15/F5DEB3/000000?text=+) `#F5DEB3` | +| white | ![#FFFFFF](https://via.placeholder.com/15/FFFFFF/000000?text=+) `#FFFFFF` | +| whitesmoke | ![#F5F5F5](https://via.placeholder.com/15/F5F5F5/000000?text=+) `#F5F5F5` | +| yellow | ![#FFFF00](https://via.placeholder.com/15/FFFF00/000000?text=+) `#FFFF00` | +| yellowgreen | ![#9ACD32](https://via.placeholder.com/15/9ACD32/000000?text=+) `#9ACD32` | + +To force use CSS4 color, use `css:` (ie. `css:thistle`). + +*** + +## Note: + +If no color group prefix is provided, the color name will be retrieved in the following order: + +* Tableau +* XKCD +* CSS4 +* Base diff --git a/old-docs/configuration-variables-config-vars.md b/old-docs/configuration-variables-config-vars.md new file mode 100644 index 0000000..27ac007 --- /dev/null +++ b/old-docs/configuration-variables-config-vars.md @@ -0,0 +1,38 @@ +# Configuration Variables (Config Vars) + +These are currently all the valid configuration variables you can change with the `config set` command. + +| Name | Description | +| --------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| account\_age | Specific time accounts must have before using modmail. (Prevents spam.) | +| activity playing, listening to, watching, streaming | You can set a custom activity for the bot using the activity command. Do \[p]activity for more info. Note: Listening MUST be followed by to, When activity type is set to streaming, you can set the linked twitch page: ?config set twitch\_url https://www.twitch.tv/somechannel/ and finally, you can clear the activity by using the command ?activity clear | +| anon\_avatar\_url | The icon URL in the anonymous reply embed (defaults to the guild's icon URL). | +| anon\_tag | Sets the tag for author section of an embed for anonreply. (Default is `Response`) | +| anon\_username | The name of the anonymous user for use with the anonreply command (defaults to be the same as mod\_tag configuration). | +| blocked\_emoji | Changes the blocked emoji (defaults to 🚫). | +| close\_emoji | Emoji used if user accidentally made a thread. Only if `disable_recipient_thread_close` is not set. (defaults to 🔒) | +| guild\_age | Specific date that member must be in guild before using modmail. | +| log\_channel\_id | Set the channel where bot logs will be sent. | +| main\_category\_id | Set the category where new threads spawn. | +| main\_color | The general color of Modmail in hexadecimal format or accepted color name (defaults to blurple - `7289da`). | +| mention | The message at the start of each thread. | +| mod\_color | The color of the mod reply embed in hexadecimal format or accepted color name (defaults to green - `2ecc71`). | +| mod\_tag | The footer text in the mod reply embed (defaults to your highest role name). | +| mod\_typing | Shows when moderator starts typing in thread channel. (default is off) | +| prefix | The prefix of the bot (defaults to `?`). | +| recipient\_color | The color of the recipient's message embed in hexadecimal format or accepted color name (defaults to gold - `f1c40f`). | +| recipient\_thread\_close | By default, the recipients can't close their ticket. Use this command to enable it. | +| reply\_without\_command | Making all non-command messaged to be forwarded to the user without command. `?reply` | +| sent\_emoji | Changes the sent emoji (defaults to ✅). | +| thread\_auto\_close | Time that has to pass after no reply from a user before the thread auto closes. If not set, thread will not auto close. | +| thread\_auto\_close\_response | Custom closing message for when a thread is auto closed. Use the `%t` variable in the message to add human time. | +| thread\_close\_footer | Footer of message that user will receive when thread is closed. | +| thread\_close\_response | Content message user will receive when the thread is closed. | +| thread\_close\_title | Title of the message the user will receive when thread is closed. | +| thread\_creation\_response | Message that shows when user has opened a thread. | +| thread\_creation\_title | Title of the message the user will receive when the thread is opened. | +| thread\_self\_close\_response | Message that the user will receive if the thread was closed by themselves. | +| twitch\_url | The twitch URL when activity\_type is set to 1 (streaming). | +| user\_typing | Shows when user starts typing to bot. (default is off) | + +Accepted color names can be found here: {% page-ref page="color-names.md" %}. diff --git a/old-docs/configure-modmail-and-logviewer.md b/old-docs/configure-modmail-and-logviewer.md new file mode 100644 index 0000000..160005f --- /dev/null +++ b/old-docs/configure-modmail-and-logviewer.md @@ -0,0 +1,59 @@ +# Configure Modmail and Logviewer + +## Log Viewer + +To be able to store data such as logs, you will need to use your own database. + +Modmail supports MongoDB, and you are required to provide a MongoDB connection URI to the bot. You can get a **free** 500MB cluster from [MongoDB Atlas](https://www.mongodb.com/cloud/atlas). (Enough to store 3 million messages) + +Upon creating an account, you will be greeted with this page: + +![Free Tier](https://i.imgur.com/shZ7Sey.png) + +Select one of the servers marked with "FREE TIER AVAILABLE" for the free option and click on "Create Cluster". + +![](https://i.imgur.com/Hem2OKc.png) ![](https://i.imgur.com/jF3nISZ.png) + +Follow the "Getting Started" tutorial on the bottom left, by creating a database user, whitelisting your IP, and connect to the cluster. When whitelisting you IP, be sure to select ALLOW ACCESS FROM ANYWHERE since Heroku does not grant a fixed IP. + +Your IP should look something like this, with `0.0.0.0/0`: + +![whitelisting](https://i.imgur.com/mILuQ5U.png') + +The last part is to generate a MongoDB URI, navigate to "Clusters" and click on "CONNECT" (as shown in "Getting Started"). From the popup, select the middle option "Connect Your Application", and then the first option "Short SRV connection string". ![](https://i.imgur.com/OMI977u.png) ![](https://i.imgur.com/2BcVMGh.png) + +This will show a URI under "Copy the SRV address:", copy that, and replace `` with the database user password (**not your account password**). The final URI should look something like this: + +``` +mongodb+srv://username:password@cluster0-abcde.mongodb.net/ +``` + +If your URI is followed by `test?retryWrites=true` or anything else, don't include it. + +## Deploying the Log Viewer + +[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/modmail-dev/logviewer) + +You will also need to deploy another separate log viewer application from [this repo](https://github.com/kyb3r/logviewer). Click on the deploy button over there and fill in the configurations upon request. This is a **separate** Heroku application from the bot and is a simple website that will be used to display your thread logs. + +## Modmail + +Star the repository before you start 😉 + +[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://github.com/modmail-dev/modmail) + +1. Input a name of your choice for your app, the Heroku app name is not important. +2. Input your bot token into the `TOKEN` field. +3. Put the [ID of your Server](https://support.discordapp.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID-) into the `GUILD_ID` field. +4. Put your own ID in the `OWNERS` field (if there are multiple owners, separate them by a comma: `123455,234567,456782`). +5. Input your MongoDB connection URI from the previous section into the `MONGO_URI` field. +6. Input the URL of your log viewer Heroku app (`https://yourlogviewerappname.herokuapp.com`) into the `LOG_URL` field. +7. Click the `deploy app` button and wait for it to finish. +8. Click `Manage App` and go into the `Resources` tab. +9. Now turn on the worker by clicking the pencil icon. +10. If you want, you can go over and check the application logs to see if everything is running smoothly. +11. Once the bot is online in your server, do `[your prefix]setup` (defaults `?`) and you are good to go! + +Your bot is ready! Head over to Discord and try it out! If you have any issues, join the [Discord server](https://discord.gg/cnUpwrnpYb). + +**Make sure to give the bot Manage Channels, Manage Messages and View Audit Logs permissions!** diff --git a/old-docs/frequently-asked-questions.md b/old-docs/frequently-asked-questions.md new file mode 100644 index 0000000..e39b59f --- /dev/null +++ b/old-docs/frequently-asked-questions.md @@ -0,0 +1,53 @@ +# Frequently Asked Questions + +> Last Updated: March 16, 2023 + +#### What is Modmail? + +Modmail is a Discord bot, similar to Reddit's Modmail feature. It serves as a shared inbox for server staff to communicate with their users - and vice versa - in a seamless way. + +#### Can I invite Modmail? + +Unfortunately, due to the nature of the bot, there is not a global invite link. Nonetheless, you can obtain a free copy of Modmail for your server. Follow the official tutorial at [https://github.com/modmail-dev/modmail/wiki/Installation](https://github.com/modmail-dev/modmail/wiki/Installation). However, if you don’t want the hassle of installing and maintaining Modmail, we offer installation, hosting, and other cool perks for [Patrons](https://patreon.com/kyber). + +#### How does Modmail work? + +Modmail uses the Discord API to interact with the platform. When someone sends a DM to the bot, it will create a new thread. Members of the moderation team can help the user and once the conversation ended, you will have access to a beautiful log of it online. + +#### Is Modmail safe? + +Your Modmail bot is safe as long as you don't share your bot's token. If you share your token, a "hacker" can take control over your bot. If you shared your bot token by mistake, regenerate a new token via the Discord Developer Portal. + +#### Where is my data stored? + +All your data including settings, blocked users, logs, installed plugins etc. are stored in your MongoDB database. The bot files only contain the stuff needed to run the bot. This means you can move your bot to a different host and still have your data intact, as long as you use the same MongoDB URI. + +#### Can I request new features? + +Modmail is an open-source project, which means you can easily add or request new features. You can make an issue or submit a pull request to the development branch on the repository. [Check out the contribution guidelines.](https://github.com/modmail-dev/modmail/blob/master/CONTRIBUTING.md) + +#### How do I become a support member? + +To join our support team, join our [Discord server](https://discord.gg/cnUpwrnpYb). One of the more experienced members will hold an interview to check if you fit the requirements. + +#### Can I add commands to the bot? + +You can add commands to the bot using plugins. All currently approved plugins can be found in the `?plugin registry` command. You can also see [this page](https://github.com/modmail-dev/modmail/wiki/Unofficial-List-of-Plugins) for an unofficial list of plugins. + +#### My bot is offline, what do I do? + +Join our [Discord server](https://discord.gg/cnUpwrnpYb) and DM Modmail. One of our support members will assist you and help you fix the issue. + +#### How can I donate the developers? + +You can support the developers on the [Patreon page](https://patreon.com/kyber). You will also receive various rewards for it. + +#### Does anyone get any info when I create my own modmail? + +There is not much information we get about your instance of modmail, The only thing what we recieve is the guild-info, For example: The guildname, The amount of members of the guild, the botname, and the bot-owner. Using this we keep track of how many modmail-instances get created on a monthly/yearly base. ( Only modmail-developers can see this ) + +*** + +#### Answer not found? + +Feel free to join our [Discord server](https://discord.gg/cnUpwrnpYb). People will gladly help you with any questions that you have! diff --git a/old-docs/installation-1.md b/old-docs/installation-1.md new file mode 100644 index 0000000..f9ab8c2 --- /dev/null +++ b/old-docs/installation-1.md @@ -0,0 +1,59 @@ +# Installation + +**If you need help beyond this tutorial please join our support server and the support team will be happy to help you** [https://discord.gg/cnUpwrnpYb](https://discord.gg/cnUpwrnpYb) + +> **Self Hosting Tutorial**: https://taaku18.github.io/modmail/local-hosting/ + +## What you'll need: + +* An internet connection and browser. +* An email account. +* A digital or physical notepad (Notepad, Notes, ... literally anything). + +## 1. Heroku Account + +In this guide, we will be using Heroku to deploy our Modmail bot. Make an account on their [website](https://www.heroku.com/) to get started. + +## 2. Discord Bot Account + +## 2.1. Create a bot + +You will need to create a bot application to interact with the Discord API. Head over to the [applications page](https://discordapp.com/developers/applications/). Log in - if you're not already - and click on `New Application`. Give it a name and click `Confirm` to register your bot. + +![Discord New Application](https://i.imgur.com/sTsk6wz.png) + +A new screen should pop up. Navigate to the `Bot` section and click on `Add Bot`. Click on `Yes, do it!` to confirm. + +![Discord Build-A-Bot](https://i.imgur.com/6MikkYq.png) + +## 2.2. Obtain a token + +After this, a dashboard for your bot will open. Give your bot a nice profile picture if you want to. It's recommended you switch off the `Public Bot` option. That way, no one except yourself will be able to add this bot to their server. Lastly, copy the token and paste this in your notepad. + +**Make sure to keep this token private, since anyone who has it can control (or "hack") your bot and potentially cause malicious damage. If you feel that your token has been leaked, click on `Regenerate` to invalidate the old one and create a new bot token.** + +![Discord Token](https://i.imgur.com/5aEtFQx.png) + +## 2.3. Enable Privileged Intents + +Enable the "Presence Intent", "Server Members" and "Message content" intent within the dashboard. + +![Intents](https://i.imgur.com/bcXccf5.png) + +## 2.4. Get an invite link + +The last thing you need to do in Discord's developer portal is to obtain an invite link for the bot. To do this, head over to the `OAuth2` tab. Scroll down a bit and select the `Bot` section. Scroll a bit further down and you will see a few permissions. Make sure to select `View Audit Log`, `Manage Channels` and `Manage Messages`. + +![Discord Invite Link](https://i.imgur.com/eK8gQbf.png) + +Before you press "copy", scroll down and select the following permissions: + +![Permissions](https://i.imgur.com/KT6thXx.png) + +## 2.5. Invite the bot + +`Copy` the link and paste it in your address bar. A new screen will open: choose your server and select all options. Click on `Authorize` and your bot should be offline in your server. + +## ![Discord Invite](https://i.imgur.com/iAQ2u0w.png) + +[**To continue the setup, head over to the second page of this guide.**](https://github.com/modmail-dev/modmail/wiki/Installation-\(cont.\)) diff --git a/old-docs/installation-continued.md b/old-docs/installation-continued.md new file mode 100644 index 0000000..576999f --- /dev/null +++ b/old-docs/installation-continued.md @@ -0,0 +1,121 @@ +# Installation (continued) + +## 3. Create a Database + +To be able to store data such as logs, you will need to use your own database. A database is required, as the database also stores configuration data for your bot. + +Modmail supports MongoDB and you are required to provide a MongoDB connection string to the bot. You can get a free 500MB cluster from [MongoDB Atlas](https://www.mongodb.com/cloud/atlas), which is enough to store around 3 million message logs. + +Upon creating an account, you will be greeted with this page. Make sure you select Starter Cluster. + +![Cluster selection](https://fle.soulmusic.pro/file/shxshx/Redtailedhawk1638.png) + +After this, you will be taken to the below screen: + +![Server selection](https://i.imgur.com/5b2Naw0.png) + +Select one of the servers marked with `FREE TIER AVAILABLE` and click on `Create Cluster`. It will only take a couple of minutes to configure everything for you. + +Follow the "Getting Started" tutorial on the bottom left. + +## 3.1. Create a database user + +Go to the `Database Access` section in the `security` tab. Click on `+ Add New User` to create a new user, whereupon a new screen will pop up. Select `Read and write to any database`, so the bot can properly store the data. Choose a username and password, but make sure they both **don't contain any special character** like `!`, `-`, `?`. Copy the password into your notepad. + +Finally, click `Add User` to finish the creation. + +![Create User](https://fle.soulmusic.pro/file/shxshx/Firefly1640.png) + +## 3.2. Whitelist all IP's + +Go to the `Network Access` section in the `security` tab. Click on `+ Add IP Address` to add an IP address, whereupon a new screen will pop up. Click the `Allow Access From Everywhere` button and `0.0.0.0/0` should appear in the `Whitelist Entry`. Otherwise, make sure to put input that manually. Finally, click `Confirm` to confirm your changes. + +![Whitelisting IPs](https://fle.soulmusic.pro/file/shxshx/Topi1641.png) + +## 3.3. Obtain a connection string + +The last part is to generate a Mongo URI. Go to the `Clusters` section in the `Atlas` tab. Click on `Connect` on the left side of your Cluster dashboard. This will open up a new screen where you have three options. For our purposes, select the middle option `Connect Your Application`. + +![Connection String](https://fle.soulmusic.pro/file/shxshx/Xuanhuaceratops1637.png) + +You need to copy the connection string, which can be easily done by clicking the `Copy` button. Remove everything past `` but keeping the `/`. Then replace `` with the password for your user and `` with your database-username, which you set earlier. Paste the URI in your notepad. + +The final URI looks similar to this: `mongodb+srv://Username:MyPassword@modmail-kjvn21.mongodb.net/`. + +![Connection String - 2](https://i.imgur.com/UIAhrZ1.png) + +## 4. How to obtain your `github_token` ( Required for the update command ) + +Note: This is not required when you are hosting using a vps. + +Start off by going to your [Github personal access tokens](https://github.com/settings/tokens) ![Personal access tokens](https://i.imgur.com/OkTue0p.png) + +Generate a new token + +Click on the Generate new token button in the top right of the view. ![Generate a new token](https://i.imgur.com/VZ4UaWa.png) + +Give the token a name, such as: `modmail github_token`. Then check the `repo` scope. ![Name your github Token](https://i.imgur.com/1vpWTSa.png) + +Click `Generate token` and GitHub will take you back to the list of tokens from before. Copy the code into your clipboard. ![Github token Copy](https://i.imgur.com/oFb2zB6.png) + +If those steps are done correctly you can use the `?update` command to update your bot to the latest version! + +## 5. Deploying the Log Viewer + +### **Click the button below to deploy the logviewer to heroku!** + +[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/modmail-dev/logviewer) + +**This is not the bot!** + +You will need to deploy a separate log viewer application from [this repository](https://github.com/modmail-dev/logviewer). This Heroku application is separate from the bot; it's a simple website that will be used to display your thread logs. + +Choose a name for your app and paste your Mongo URI (from your notepad). After you click the `Deploy App` button, it will start creating the website. + +After that's done configuring, click the `View` button. It will redirect you to the logviewer home screen. Copy the link in the address bar and paste it in Notepad. + +![Heroku Logviewer](https://i.imgur.com/tmiPfTL.png) + +## 6. Modmail + +### **Click the button below to deploy the bot to heroku.** + +**This is the second application you will be deploying** + +[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/modmail-dev/modmail) + +**6.1.** Choose any name for your app. Note: this name doesn't matter at all. + +**6.2.** Put your [bot's token](https://github.com/kyb3rr/modmail/wiki/Installation#creating-a-bot-account) in the `TOKEN` field. + +**6.3.** In the `DATABASE_TYPE` You may fillout: `mongodb` + +**6.4.** Put the [ID of your Server](https://support.discordapp.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID-) into the `GUILD_ID` field. + +**6.5.** Put your own ID in the `OWNERS` field. If there are multiple owners, separate them by a comma: `180314310298304512, 355790471219511297, 325012556940836864`. + +**6.6.** Put your Mongo connection URI from the previous section in the `CONNECTION_URI` field. + +**6.7.** Put the `github token` you just created in the `GITHUB_TOKEN` field. + +**6.8.** Put the URL of your log viewer Heroku app (`https://yourlogviewerappname.herokuapp.com`) in the `LOG_URL` field. + +**6.9.** Click the `deploy app` button and wait for it to finish. + +**6.10.** Click `Manage App` and go into the `Resources` tab, where you need to turn on the worker by clicking the pencil icon next to it. + +**6.11.** If you want, you can go over and check the application logs to see if everything is running smoothly. If any unexpected errors pop up, join our [Discord server](https://discord.gg/cnUpwrnpYb) and DM Modmail. The support members will help you figure out the issue and show you how to fix it. + +**6.12.** Once the bot is online in your server, make sure to give it `Manage Channels`, `Manage Messages` and `View Audit Logs` permissions. If your bot is not online, recheck the previous steps above. + +**6.13.** Do the `?setup` command and you are good to go! + +*** + +Congratulations! Your bot is ready! Head over to Discord and try it out! If you have any issues or questions, join the [Discord server](https://discord.gg/cnUpwrnpYb). + +Make sure to setup permissions using this [handy guide](https://github.com/modmail-dev/modmail/wiki/Permissions)! + +[Taki's Blog](https://taaku18.github.io/modmail/customization/) contains many cool customizations for the bot, so you might want to check it out! + +If you like the bot, consider giving this repository a star 😉. If you want to support the developers financially, subscribe to the [Patreon](https://www.patreon.com/kyber). diff --git a/old-docs/modmail-usage.md b/old-docs/modmail-usage.md new file mode 100644 index 0000000..072075b --- /dev/null +++ b/old-docs/modmail-usage.md @@ -0,0 +1,21 @@ +# Modmail Usage + +### Basic Usage + +Once someone DMs the bot a channel will be created for their thread. You can reply to their thread using the `[p]reply` command. Once you are done communicating you can use the `[p]close` command + +### Ease of Use + +You can configure aliases and snippets, which is highly recommended. For example, you can shorten the `reply` command to `r` (In case you want to do this you can use the command `[p]alias add r reply`) + +You can use snippets to shorten text like "Thanks for Contacting Modmail Support! How can I help you today?" to a simple command such as `[p]hi` (In case you want to do this you can use the command `[p]snippets add hi Thanks for Contacting Modmail Support! How can I help you today?`) + +### Advanced Usage + +You can use times with the close command for example `[p]close 20m Bye` to close in 20 minutes with the reason "Bye" if you don't want to close on a timer but still add a reason you can use `[p]close Bye` which will close the thread with the reason "Bye" + +### Anonymous Snippets + +\[p]alias add \[snippetname] anonreply \[snippet text] + +_Note: In this page, the meaning of `[p]` is `bot prefix` this defaults to `?` but can be changed with the `[p]prefix` command_ diff --git a/old-docs/permissions.md b/old-docs/permissions.md new file mode 100644 index 0000000..bc4d852 --- /dev/null +++ b/old-docs/permissions.md @@ -0,0 +1,41 @@ +# 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/old-docs/plugins.md b/old-docs/plugins.md new file mode 100644 index 0000000..2251102 --- /dev/null +++ b/old-docs/plugins.md @@ -0,0 +1,147 @@ +# 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/old-docs/seperate-server-setup.md b/old-docs/seperate-server-setup.md new file mode 100644 index 0000000..f30609a --- /dev/null +++ b/old-docs/seperate-server-setup.md @@ -0,0 +1,6 @@ +# 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/old-docs/the-unofficial-list-of-plugins.md b/old-docs/the-unofficial-list-of-plugins.md new file mode 100644 index 0000000..1700993 --- /dev/null +++ b/old-docs/the-unofficial-list-of-plugins.md @@ -0,0 +1,52 @@ +# 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/old-docs/updating.md b/old-docs/updating.md new file mode 100644 index 0000000..e2485ce --- /dev/null +++ b/old-docs/updating.md @@ -0,0 +1,38 @@ +# Updating + +## Updating Modmail + +You can update Modmail on your Heroku account whenever changes are made to the repository. If you want to update while hosting locally (not Heroku), simply type `git pull` in your terminal and install the requirements again with `pipenv install`. + +## Forking the repo + +Before you get started, you must [fork](https://github.com/modmail-dev/modmail/fork) the repo first if you are using Heroku and want to update the bot. + +### Syncing a fork branch from the web UI + +1. On GitHub, navigate to the main page of the forked repository that you want to sync with the upstream repository. +2. Select the Sync fork dropdown. + + ![sync-fork-dropdown](https://user-images.githubusercontent.com/70805800/194696934-5333af5d-165e-4873-b5b7-bd01f0461185.png) +3. Then click Update branch. + + ![update-branch-button](https://user-images.githubusercontent.com/70805800/194696947-68891d50-a624-4901-a03d-e49564852a23.png) + +If the changes from the upstream repository cause conflicts, GitHub will prompt you to create a pull request to resolve the conflicts. + +### I want to enable automatic updates + +1. Create a GitHub account +2. [Fork](https://github.com/modmail-dev/modmail/fork) the repository +3. Add GITHUB\_TOKEN into your configuration variables from https://github.com/settings/tokens with the repo scope ([Guide](https://github.com/modmail-dev/modmail/wiki/Installation-\(cont.\)#4-how-to-obtain-your-github\_token---required-for-the-update-command-)). +4. Link your GitHub account to heroku ![](https://i.imgur.com/qjWraS0.png) +5. Turn on automatic deploys ![](https://i.imgur.com/jgUVl7f.png) +6. Restart the bot + +### I want to update the bot once + +[Click here to create a new pull request to your fork](https://github.com/modmail-dev/modmail/pull/new/master). Select `compare across forks`, make the base repository `yourusername/modmail` and ensure the branch is set to master. Put any title you want and create the pull request. On the page that comes after this, merge the pull request. + +You then want to go to your modmail application in Heroku, connect your modmail fork via the `Deploy` tab and deploy the `master` branch. + +You can turn on auto-deploy for the master branch if you don't want to go through the process of logging into Heroku and deploying the branch every time changes to the repo are made in the future. However, you will have to make a pull request to update your fork every time. diff --git a/old-docs/video-tutorials.md b/old-docs/video-tutorials.md new file mode 100644 index 0000000..f1f70c8 --- /dev/null +++ b/old-docs/video-tutorials.md @@ -0,0 +1,3 @@ +# Video Tutorials + +> This page lists videos created by the Modmail Team or videos that are explicitly approved by the modmail team. Please do not add videos to this page without prior approval from a Core Developer or Admin. Thank you! (This allows us to ensure videos are factually correct and do not have malicious intent.) From f554e3d3c1040fdad75537c85abeba1ce98b3100 Mon Sep 17 00:00:00 2001 From: Raiden Date: Fri, 7 Apr 2023 19:03:07 +0800 Subject: [PATCH 02/33] MMM Sus --- SUMMARY.md | 26 +- installation/railway.md | 32 +- old-docs/color-names.md | 1165 ----------------- .../configuration-variables-config-vars.md | 38 - old-docs/configure-modmail-and-logviewer.md | 59 - old-docs/frequently-asked-questions.md | 53 - old-docs/installation-1.md | 59 - old-docs/installation-continued.md | 121 -- old-docs/modmail-usage.md | 21 - old-docs/permissions.md | 41 - old-docs/plugins.md | 147 --- old-docs/seperate-server-setup.md | 6 - old-docs/the-unofficial-list-of-plugins.md | 52 - old-docs/updating.md | 38 - old-docs/video-tutorials.md | 3 - 15 files changed, 29 insertions(+), 1832 deletions(-) delete mode 100644 old-docs/color-names.md delete mode 100644 old-docs/configuration-variables-config-vars.md delete mode 100644 old-docs/configure-modmail-and-logviewer.md delete mode 100644 old-docs/frequently-asked-questions.md delete mode 100644 old-docs/installation-1.md delete mode 100644 old-docs/installation-continued.md delete mode 100644 old-docs/modmail-usage.md delete mode 100644 old-docs/permissions.md delete mode 100644 old-docs/plugins.md delete mode 100644 old-docs/seperate-server-setup.md delete mode 100644 old-docs/the-unofficial-list-of-plugins.md delete mode 100644 old-docs/updating.md delete mode 100644 old-docs/video-tutorials.md diff --git a/SUMMARY.md b/SUMMARY.md index ad1c827..545f206 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -22,16 +22,16 @@ * [Permissions](usage-guide/permissions.md) * [Getting Started](getting-started.md) * [OLD DOCS](old-docs/README.md) - * [Installation](old-docs/installation-1.md) - * [Installation (continued)](old-docs/installation-continued.md) - * [Color Names](old-docs/color-names.md) - * [Configuration Variables (Config Vars)](old-docs/configuration-variables-config-vars.md) - * [Configure Modmail and Logviewer](old-docs/configure-modmail-and-logviewer.md) - * [Frequently Asked Questions](old-docs/frequently-asked-questions.md) - * [Modmail Usage](old-docs/modmail-usage.md) - * [Permissions](old-docs/permissions.md) - * [Plugins](old-docs/plugins.md) - * [Seperate Server Setup](old-docs/seperate-server-setup.md) - * [The Unofficial List of Plugins](old-docs/the-unofficial-list-of-plugins.md) - * [Updating](old-docs/updating.md) - * [Video Tutorials](old-docs/video-tutorials.md) + * [Installation](installation-1.md) + * [Installation (continued)](installation-continued.md) + * [Color Names](color-names.md) + * [Configuration Variables (Config Vars)](configuration-variables-config-vars.md) + * [Configure Modmail and Logviewer](configure-modmail-and-logviewer.md) + * [Frequently Asked Questions](frequently-asked-questions.md) + * [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](updating.md) + * [Video Tutorials](video-tutorials.md) \ No newline at end of file diff --git a/installation/railway.md b/installation/railway.md index fb21bff..b287180 100644 --- a/installation/railway.md +++ b/installation/railway.md @@ -6,7 +6,7 @@ description: Deploy Modmail on Railway PaaS. ## What is Railway? -Railway is a deployment platform where you can provision infrastructure, develop with that infrastructure locally, and then deploy to the cloud. +Railway is a deployment platform where you can provision infrastructure, develop with that infrastructure locally, and then deploy to the cloud. ## Requirements @@ -27,7 +27,7 @@ To keep your bot running 24/7, you'll need to sign up for their "Developer" plan You will need to fork our repositories to deploy onto Railway. -Make sure you're logged in to [GitHub](https://github.com/). You will need to fork **two** repositories. +Make sure you're logged in to [GitHub](https://github.com/). You will need to fork **two** repositories. First we fork the Modmail repository. Head over to [https://github.com/modmail-dev/modmail/fork](https://github.com/modmail-dev/modmail/fork), leave all the settings as default, and click **Create fork**. @@ -37,7 +37,7 @@ Next do the same for the Logviewer repository by heading over to [https://github
Screenshot of creating a Logviewer fork.

Create a GitHub fork for the Logviewer Repository.

-Next, to keep your Modmail and Logviewer up to date, you will need to install the [Pull app](https://github.com/apps/pull). Simply head over to [https://github.com/apps/pull](https://github.com/apps/pull), click **Install**, choose **Only select repositories**, then select **both** the Modmail and Logviewer repositories that you forked in the previous step. +Next, to keep your Modmail and Logviewer up to date, you will need to install the [Pull app](https://github.com/apps/pull). Simply head over to [https://github.com/apps/pull](https://github.com/apps/pull), click **Install**, choose **Only select repositories**, then select **both** the Modmail and Logviewer repositories that you forked in the previous step.
@@ -69,7 +69,9 @@ If your GitHub account is new or not reputable, you may be asked to verify your This unfortunately means that you will have to provide a credit card for verification. Click **Verify Account**, read and accept Railway's **Terms of Service**, then enter your credit card details. You may be temporary charged $1 USD to confirm the legitimacy of the card. -Screenshot of clicking verify account.Screenshot of clicking terms of service.Screenshot of clicking I agree with terms of service.Screenshot of entering your credit card details. +![Screenshot of clicking verify account.](../.gitbook/assets/RW6.png)![Screenshot of clicking terms of service.](../.gitbook/assets/RW7.png)![Screenshot of clicking I agree with terms of service.](../.gitbook/assets/RW7B.png)![Screenshot of entering your credit card details.](../.gitbook/assets/RW8.png) + + @@ -101,7 +103,7 @@ From the [**New Project**](https://railway.app/new) page, create the project by
-Click **New Variable**, set left to be **`CONNECTION_URI`**, then on the right, paste your revised MongoDB connection string from your Notepad (if this is new to you, [go back and read the initial steps](./)). +Click **New Variable**, set left to be **`CONNECTION_URI`**, then on the right, paste your revised MongoDB connection string from your Notepad (if this is new to you, [go back and read the initial steps](./)). Don't add any other variables, nor use the suggested variables section. You should see a new variable named **`CONNECTION_URI`** added under variables once you're done. @@ -127,7 +129,7 @@ Next, go to the **Deployments** tab, look at the latest deployment, is it succes -
Screenshot of the Logviewer homepage.

This URL should show the Logviewer homepage.

+
Screenshot of the Logviewer homepage.

This URL should show the Logviewer homepage.

@@ -151,27 +153,22 @@ Click **New Variable.** We will be adding 5 variables in total, so repeat this s | -------------------- | ----------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | | **`CONNECTION_URI`** | The MongoDB Connection string from your Notepad. |
mongodb+srv://modmail:elAO7wF1r07pNG6u@cluster0.example.mongodb.net
 
| -| | | | | **`TOKEN`** | The Discord bot token from your Notepad. |
MTA3Djv3IAxNjk1NDgdKD231.G1AoUjD.5z629aKP34JKHn4v1EsdNUwdDO3MvBR9ifVES4
 
| -| | | | | **`LOG_URL`** | The Logviewer URL from your Notepad. Remember to add `https://` in front! |
https://web-production-1234.up.railway.app
 
| -| | | | | **`OWNERS`** | Your Discord ID. If you have multiple owners, separate your IDs with a comma. |
718827787302791100
 
| -| | | | | **`GUILD_ID`** | The ID of the Discord server for your Modmail bot. |
109483701365508619
 
| -| | | |
Do you have a separate staff server? -If you manage a large server where you have a separate server for communication among your moderation team, Modmail supports directing threads into the staff server instead of your main (public) server. +If you manage a large server where you have a separate server for communication among your moderation team, Modmail supports directing threads into the staff server instead of your main (public) server. -Simply add an additional variable named **`MODMAIL_GUILD_ID`** and set the value to your staff server's ID. +Simply add an additional variable named **`MODMAIL_GUILD_ID`** and set the value to your staff server's ID. Note: the **`GUILD_ID`** should always be your main server's ID (not staff server's). @@ -207,7 +204,7 @@ You have 10 days to test Modmail without upgrading to the "Developer" plan. As m #### Usage-based subscription -Head over to the \*\*\*\* [**Billing Details**](https://railway.app/account/billing) page, click the **Unlock** button to unlock Developer plan. Then input your credit card details and hit **Subscribe to Developer Plan**. +Head over to the **** [**Billing Details**](https://railway.app/account/billing) page, click the **Unlock** button to unlock Developer plan. Then input your credit card details and hit **Subscribe to Developer Plan**. {% hint style="warning" %} Subscribing to the Developer plan under _usage based subscription_ **may incur you unexpected charges**. This because Railway does not provide any safe-guards or monthly spending limits. Average Modmail and Logviewer usage should be well below the free threshold. However, if you run resource-intensive code via plugins or due to other means, you credit card may be billed. @@ -261,9 +258,9 @@ There you go! Your bot should now be able to run 24/7 without interruptions. Hea How do I cancel my Developer plan subscription? -If you're subscribed under the [usage-based subscription](railway.md#usage-based-subscription) model, you can cancel your subscription by heading to the \*\*\*\* [**Billing Details**](https://railway.app/account/billing) page, click **Manage Subscription**, then click **Cancel plan**. +If you're subscribed under the [usage-based subscription](railway.md#usage-based-subscription) model, you can cancel your subscription by heading to the **** [**Billing Details**](https://railway.app/account/billing) page, click **Manage Subscription**, then click **Cancel plan**. -Screenshot of clicking manage subscription.Screenshot of clicking cancel plan. +![Screenshot of clicking manage subscription.](../.gitbook/assets/RW25.png)![Screenshot of clicking cancel plan.](../.gitbook/assets/RW26.png)
@@ -284,3 +281,6 @@ You can disable auto-updates by heading to the settings page for **both** your M Now that you've successfully set up Modmail, visit the [Getting Started](../getting-started.md) page to find information on using Modmail. You can also join our [**Discord Server**](https://discord.gg/cnUpwrnpYb) to interact with our community or get support for Modmail. + + + diff --git a/old-docs/color-names.md b/old-docs/color-names.md deleted file mode 100644 index 5fda98b..0000000 --- a/old-docs/color-names.md +++ /dev/null @@ -1,1165 +0,0 @@ -# Color Names - -## Color Names - -Color Names can be used for `mod_color`, `recipient_color`, and `main_color` configuration variables. - -*** - -### Base Colors: - -| Color Name | Hex Code | -| ---------- | ------------------------------------------------------------------------- | -| b | ![#0000ff](https://via.placeholder.com/15/0000ff/000000?text=+) `#0000ff` | -| g | ![#007f00](https://via.placeholder.com/15/007f00/000000?text=+) `#007f00` | -| r | ![#ff0000](https://via.placeholder.com/15/ff0000/000000?text=+) `#ff0000` | -| c | ![#00bfbf](https://via.placeholder.com/15/00bfbf/000000?text=+) `#00bfbf` | -| m | ![#bf00bf](https://via.placeholder.com/15/bf00bf/000000?text=+) `#bf00bf` | -| y | ![#bfbf00](https://via.placeholder.com/15/bfbf00/000000?text=+) `#bfbf00` | -| k | ![#000000](https://via.placeholder.com/15/000000/000000?text=+) `#000000` | -| w | ![#ffffff](https://via.placeholder.com/15/ffffff/000000?text=+) `#ffffff` | - -*** - -### Tableau Colors: - -| Color Name | Hex Code | -| ---------- | ------------------------------------------------------------------------- | -| blue | ![#1f77b4](https://via.placeholder.com/15/1f77b4/000000?text=+) `#1f77b4` | -| orange | ![#ff7f0e](https://via.placeholder.com/15/ff7f0e/000000?text=+) `#ff7f0e` | -| green | ![#2ca02c](https://via.placeholder.com/15/2ca02c/000000?text=+) `#2ca02c` | -| red | ![#d62728](https://via.placeholder.com/15/d62728/000000?text=+) `#d62728` | -| purple | ![#9467bd](https://via.placeholder.com/15/9467bd/000000?text=+) `#9467bd` | -| brown | ![#8c564b](https://via.placeholder.com/15/8c564b/000000?text=+) `#8c564b` | -| pink | ![#e377c2](https://via.placeholder.com/15/e377c2/000000?text=+) `#e377c2` | -| gray | ![#7f7f7f](https://via.placeholder.com/15/7f7f7f/000000?text=+) `#7f7f7f` | -| olive | ![#bcbd22](https://via.placeholder.com/15/bcbd22/000000?text=+) `#bcbd22` | -| cyan | ![#17becf](https://via.placeholder.com/15/17becf/000000?text=+) `#17becf` | - -To force use tableau color, use `tab:` (ie. `tab:red`). - -*** - -### XKCD Colors: - -| Color Name | Hex Code | -| -------------------------- | ------------------------------------------------------------------------- | -| cloudy blue | ![#acc2d9](https://via.placeholder.com/15/acc2d9/000000?text=+) `#acc2d9` | -| dark pastel green | ![#56ae57](https://via.placeholder.com/15/56ae57/000000?text=+) `#56ae57` | -| dust | ![#b2996e](https://via.placeholder.com/15/b2996e/000000?text=+) `#b2996e` | -| electric lime | ![#a8ff04](https://via.placeholder.com/15/a8ff04/000000?text=+) `#a8ff04` | -| fresh green | ![#69d84f](https://via.placeholder.com/15/69d84f/000000?text=+) `#69d84f` | -| light eggplant | ![#894585](https://via.placeholder.com/15/894585/000000?text=+) `#894585` | -| nasty green | ![#70b23f](https://via.placeholder.com/15/70b23f/000000?text=+) `#70b23f` | -| really light blue | ![#d4ffff](https://via.placeholder.com/15/d4ffff/000000?text=+) `#d4ffff` | -| tea | ![#65ab7c](https://via.placeholder.com/15/65ab7c/000000?text=+) `#65ab7c` | -| warm purple | ![#952e8f](https://via.placeholder.com/15/952e8f/000000?text=+) `#952e8f` | -| yellowish tan | ![#fcfc81](https://via.placeholder.com/15/fcfc81/000000?text=+) `#fcfc81` | -| cement | ![#a5a391](https://via.placeholder.com/15/a5a391/000000?text=+) `#a5a391` | -| dark grass green | ![#388004](https://via.placeholder.com/15/388004/000000?text=+) `#388004` | -| dusty teal | ![#4c9085](https://via.placeholder.com/15/4c9085/000000?text=+) `#4c9085` | -| grey teal | ![#5e9b8a](https://via.placeholder.com/15/5e9b8a/000000?text=+) `#5e9b8a` | -| macaroni and cheese | ![#efb435](https://via.placeholder.com/15/efb435/000000?text=+) `#efb435` | -| pinkish tan | ![#d99b82](https://via.placeholder.com/15/d99b82/000000?text=+) `#d99b82` | -| spruce | ![#0a5f38](https://via.placeholder.com/15/0a5f38/000000?text=+) `#0a5f38` | -| strong blue | ![#0c06f7](https://via.placeholder.com/15/0c06f7/000000?text=+) `#0c06f7` | -| toxic green | ![#61de2a](https://via.placeholder.com/15/61de2a/000000?text=+) `#61de2a` | -| windows blue | ![#3778bf](https://via.placeholder.com/15/3778bf/000000?text=+) `#3778bf` | -| blue blue | ![#2242c7](https://via.placeholder.com/15/2242c7/000000?text=+) `#2242c7` | -| blue with a hint of purple | ![#533cc6](https://via.placeholder.com/15/533cc6/000000?text=+) `#533cc6` | -| booger | ![#9bb53c](https://via.placeholder.com/15/9bb53c/000000?text=+) `#9bb53c` | -| bright sea green | ![#05ffa6](https://via.placeholder.com/15/05ffa6/000000?text=+) `#05ffa6` | -| dark green blue | ![#1f6357](https://via.placeholder.com/15/1f6357/000000?text=+) `#1f6357` | -| deep turquoise | ![#017374](https://via.placeholder.com/15/017374/000000?text=+) `#017374` | -| green teal | ![#0cb577](https://via.placeholder.com/15/0cb577/000000?text=+) `#0cb577` | -| strong pink | ![#ff0789](https://via.placeholder.com/15/ff0789/000000?text=+) `#ff0789` | -| bland | ![#afa88b](https://via.placeholder.com/15/afa88b/000000?text=+) `#afa88b` | -| deep aqua | ![#08787f](https://via.placeholder.com/15/08787f/000000?text=+) `#08787f` | -| lavender pink | ![#dd85d7](https://via.placeholder.com/15/dd85d7/000000?text=+) `#dd85d7` | -| light moss green | ![#a6c875](https://via.placeholder.com/15/a6c875/000000?text=+) `#a6c875` | -| light seafoam green | ![#a7ffb5](https://via.placeholder.com/15/a7ffb5/000000?text=+) `#a7ffb5` | -| olive yellow | ![#c2b709](https://via.placeholder.com/15/c2b709/000000?text=+) `#c2b709` | -| pig pink | ![#e78ea5](https://via.placeholder.com/15/e78ea5/000000?text=+) `#e78ea5` | -| deep lilac | ![#966ebd](https://via.placeholder.com/15/966ebd/000000?text=+) `#966ebd` | -| desert | ![#ccad60](https://via.placeholder.com/15/ccad60/000000?text=+) `#ccad60` | -| dusty lavender | ![#ac86a8](https://via.placeholder.com/15/ac86a8/000000?text=+) `#ac86a8` | -| purpley grey | ![#947e94](https://via.placeholder.com/15/947e94/000000?text=+) `#947e94` | -| purply | ![#983fb2](https://via.placeholder.com/15/983fb2/000000?text=+) `#983fb2` | -| candy pink | ![#ff63e9](https://via.placeholder.com/15/ff63e9/000000?text=+) `#ff63e9` | -| light pastel green | ![#b2fba5](https://via.placeholder.com/15/b2fba5/000000?text=+) `#b2fba5` | -| boring green | ![#63b365](https://via.placeholder.com/15/63b365/000000?text=+) `#63b365` | -| kiwi green | ![#8ee53f](https://via.placeholder.com/15/8ee53f/000000?text=+) `#8ee53f` | -| light grey green | ![#b7e1a1](https://via.placeholder.com/15/b7e1a1/000000?text=+) `#b7e1a1` | -| orange pink | ![#ff6f52](https://via.placeholder.com/15/ff6f52/000000?text=+) `#ff6f52` | -| tea green | ![#bdf8a3](https://via.placeholder.com/15/bdf8a3/000000?text=+) `#bdf8a3` | -| very light brown | ![#d3b683](https://via.placeholder.com/15/d3b683/000000?text=+) `#d3b683` | -| egg shell | ![#fffcc4](https://via.placeholder.com/15/fffcc4/000000?text=+) `#fffcc4` | -| eggplant purple | ![#430541](https://via.placeholder.com/15/430541/000000?text=+) `#430541` | -| powder pink | ![#ffb2d0](https://via.placeholder.com/15/ffb2d0/000000?text=+) `#ffb2d0` | -| reddish grey | ![#997570](https://via.placeholder.com/15/997570/000000?text=+) `#997570` | -| baby shit brown | ![#ad900d](https://via.placeholder.com/15/ad900d/000000?text=+) `#ad900d` | -| liliac | ![#c48efd](https://via.placeholder.com/15/c48efd/000000?text=+) `#c48efd` | -| stormy blue | ![#507b9c](https://via.placeholder.com/15/507b9c/000000?text=+) `#507b9c` | -| ugly brown | ![#7d7103](https://via.placeholder.com/15/7d7103/000000?text=+) `#7d7103` | -| custard | ![#fffd78](https://via.placeholder.com/15/fffd78/000000?text=+) `#fffd78` | -| darkish pink | ![#da467d](https://via.placeholder.com/15/da467d/000000?text=+) `#da467d` | -| deep brown | ![#410200](https://via.placeholder.com/15/410200/000000?text=+) `#410200` | -| greenish beige | ![#c9d179](https://via.placeholder.com/15/c9d179/000000?text=+) `#c9d179` | -| manilla | ![#fffa86](https://via.placeholder.com/15/fffa86/000000?text=+) `#fffa86` | -| off blue | ![#5684ae](https://via.placeholder.com/15/5684ae/000000?text=+) `#5684ae` | -| battleship grey | ![#6b7c85](https://via.placeholder.com/15/6b7c85/000000?text=+) `#6b7c85` | -| browny green | ![#6f6c0a](https://via.placeholder.com/15/6f6c0a/000000?text=+) `#6f6c0a` | -| bruise | ![#7e4071](https://via.placeholder.com/15/7e4071/000000?text=+) `#7e4071` | -| kelley green | ![#009337](https://via.placeholder.com/15/009337/000000?text=+) `#009337` | -| sickly yellow | ![#d0e429](https://via.placeholder.com/15/d0e429/000000?text=+) `#d0e429` | -| sunny yellow | ![#fff917](https://via.placeholder.com/15/fff917/000000?text=+) `#fff917` | -| azul | ![#1d5dec](https://via.placeholder.com/15/1d5dec/000000?text=+) `#1d5dec` | -| darkgreen | ![#054907](https://via.placeholder.com/15/054907/000000?text=+) `#054907` | -| green/yellow | ![#b5ce08](https://via.placeholder.com/15/b5ce08/000000?text=+) `#b5ce08` | -| lichen | ![#8fb67b](https://via.placeholder.com/15/8fb67b/000000?text=+) `#8fb67b` | -| light light green | ![#c8ffb0](https://via.placeholder.com/15/c8ffb0/000000?text=+) `#c8ffb0` | -| pale gold | ![#fdde6c](https://via.placeholder.com/15/fdde6c/000000?text=+) `#fdde6c` | -| sun yellow | ![#ffdf22](https://via.placeholder.com/15/ffdf22/000000?text=+) `#ffdf22` | -| tan green | ![#a9be70](https://via.placeholder.com/15/a9be70/000000?text=+) `#a9be70` | -| burple | ![#6832e3](https://via.placeholder.com/15/6832e3/000000?text=+) `#6832e3` | -| butterscotch | ![#fdb147](https://via.placeholder.com/15/fdb147/000000?text=+) `#fdb147` | -| toupe | ![#c7ac7d](https://via.placeholder.com/15/c7ac7d/000000?text=+) `#c7ac7d` | -| dark cream | ![#fff39a](https://via.placeholder.com/15/fff39a/000000?text=+) `#fff39a` | -| indian red | ![#850e04](https://via.placeholder.com/15/850e04/000000?text=+) `#850e04` | -| light lavendar | ![#efc0fe](https://via.placeholder.com/15/efc0fe/000000?text=+) `#efc0fe` | -| poison green | ![#40fd14](https://via.placeholder.com/15/40fd14/000000?text=+) `#40fd14` | -| baby puke green | ![#b6c406](https://via.placeholder.com/15/b6c406/000000?text=+) `#b6c406` | -| bright yellow green | ![#9dff00](https://via.placeholder.com/15/9dff00/000000?text=+) `#9dff00` | -| charcoal grey | ![#3c4142](https://via.placeholder.com/15/3c4142/000000?text=+) `#3c4142` | -| squash | ![#f2ab15](https://via.placeholder.com/15/f2ab15/000000?text=+) `#f2ab15` | -| cinnamon | ![#ac4f06](https://via.placeholder.com/15/ac4f06/000000?text=+) `#ac4f06` | -| light pea green | ![#c4fe82](https://via.placeholder.com/15/c4fe82/000000?text=+) `#c4fe82` | -| radioactive green | ![#2cfa1f](https://via.placeholder.com/15/2cfa1f/000000?text=+) `#2cfa1f` | -| raw sienna | ![#9a6200](https://via.placeholder.com/15/9a6200/000000?text=+) `#9a6200` | -| baby purple | ![#ca9bf7](https://via.placeholder.com/15/ca9bf7/000000?text=+) `#ca9bf7` | -| cocoa | ![#875f42](https://via.placeholder.com/15/875f42/000000?text=+) `#875f42` | -| light royal blue | ![#3a2efe](https://via.placeholder.com/15/3a2efe/000000?text=+) `#3a2efe` | -| orangeish | ![#fd8d49](https://via.placeholder.com/15/fd8d49/000000?text=+) `#fd8d49` | -| rust brown | ![#8b3103](https://via.placeholder.com/15/8b3103/000000?text=+) `#8b3103` | -| sand brown | ![#cba560](https://via.placeholder.com/15/cba560/000000?text=+) `#cba560` | -| swamp | ![#698339](https://via.placeholder.com/15/698339/000000?text=+) `#698339` | -| tealish green | ![#0cdc73](https://via.placeholder.com/15/0cdc73/000000?text=+) `#0cdc73` | -| burnt siena | ![#b75203](https://via.placeholder.com/15/b75203/000000?text=+) `#b75203` | -| camo | ![#7f8f4e](https://via.placeholder.com/15/7f8f4e/000000?text=+) `#7f8f4e` | -| dusk blue | ![#26538d](https://via.placeholder.com/15/26538d/000000?text=+) `#26538d` | -| fern | ![#63a950](https://via.placeholder.com/15/63a950/000000?text=+) `#63a950` | -| old rose | ![#c87f89](https://via.placeholder.com/15/c87f89/000000?text=+) `#c87f89` | -| pale light green | ![#b1fc99](https://via.placeholder.com/15/b1fc99/000000?text=+) `#b1fc99` | -| peachy pink | ![#ff9a8a](https://via.placeholder.com/15/ff9a8a/000000?text=+) `#ff9a8a` | -| rosy pink | ![#f6688e](https://via.placeholder.com/15/f6688e/000000?text=+) `#f6688e` | -| light bluish green | ![#76fda8](https://via.placeholder.com/15/76fda8/000000?text=+) `#76fda8` | -| light bright green | ![#53fe5c](https://via.placeholder.com/15/53fe5c/000000?text=+) `#53fe5c` | -| light neon green | ![#4efd54](https://via.placeholder.com/15/4efd54/000000?text=+) `#4efd54` | -| light seafoam | ![#a0febf](https://via.placeholder.com/15/a0febf/000000?text=+) `#a0febf` | -| tiffany blue | ![#7bf2da](https://via.placeholder.com/15/7bf2da/000000?text=+) `#7bf2da` | -| washed out green | ![#bcf5a6](https://via.placeholder.com/15/bcf5a6/000000?text=+) `#bcf5a6` | -| browny orange | ![#ca6b02](https://via.placeholder.com/15/ca6b02/000000?text=+) `#ca6b02` | -| nice blue | ![#107ab0](https://via.placeholder.com/15/107ab0/000000?text=+) `#107ab0` | -| sapphire | ![#2138ab](https://via.placeholder.com/15/2138ab/000000?text=+) `#2138ab` | -| greyish teal | ![#719f91](https://via.placeholder.com/15/719f91/000000?text=+) `#719f91` | -| orangey yellow | ![#fdb915](https://via.placeholder.com/15/fdb915/000000?text=+) `#fdb915` | -| parchment | ![#fefcaf](https://via.placeholder.com/15/fefcaf/000000?text=+) `#fefcaf` | -| straw | ![#fcf679](https://via.placeholder.com/15/fcf679/000000?text=+) `#fcf679` | -| very dark brown | ![#1d0200](https://via.placeholder.com/15/1d0200/000000?text=+) `#1d0200` | -| terracota | ![#cb6843](https://via.placeholder.com/15/cb6843/000000?text=+) `#cb6843` | -| ugly blue | ![#31668a](https://via.placeholder.com/15/31668a/000000?text=+) `#31668a` | -| clear blue | ![#247afd](https://via.placeholder.com/15/247afd/000000?text=+) `#247afd` | -| creme | ![#ffffb6](https://via.placeholder.com/15/ffffb6/000000?text=+) `#ffffb6` | -| foam green | ![#90fda9](https://via.placeholder.com/15/90fda9/000000?text=+) `#90fda9` | -| grey/green | ![#86a17d](https://via.placeholder.com/15/86a17d/000000?text=+) `#86a17d` | -| light gold | ![#fddc5c](https://via.placeholder.com/15/fddc5c/000000?text=+) `#fddc5c` | -| seafoam blue | ![#78d1b6](https://via.placeholder.com/15/78d1b6/000000?text=+) `#78d1b6` | -| topaz | ![#13bbaf](https://via.placeholder.com/15/13bbaf/000000?text=+) `#13bbaf` | -| violet pink | ![#fb5ffc](https://via.placeholder.com/15/fb5ffc/000000?text=+) `#fb5ffc` | -| wintergreen | ![#20f986](https://via.placeholder.com/15/20f986/000000?text=+) `#20f986` | -| yellow tan | ![#ffe36e](https://via.placeholder.com/15/ffe36e/000000?text=+) `#ffe36e` | -| dark fuchsia | ![#9d0759](https://via.placeholder.com/15/9d0759/000000?text=+) `#9d0759` | -| indigo blue | ![#3a18b1](https://via.placeholder.com/15/3a18b1/000000?text=+) `#3a18b1` | -| light yellowish green | ![#c2ff89](https://via.placeholder.com/15/c2ff89/000000?text=+) `#c2ff89` | -| pale magenta | ![#d767ad](https://via.placeholder.com/15/d767ad/000000?text=+) `#d767ad` | -| rich purple | ![#720058](https://via.placeholder.com/15/720058/000000?text=+) `#720058` | -| sunflower yellow | ![#ffda03](https://via.placeholder.com/15/ffda03/000000?text=+) `#ffda03` | -| green/blue | ![#01c08d](https://via.placeholder.com/15/01c08d/000000?text=+) `#01c08d` | -| leather | ![#ac7434](https://via.placeholder.com/15/ac7434/000000?text=+) `#ac7434` | -| racing green | ![#014600](https://via.placeholder.com/15/014600/000000?text=+) `#014600` | -| vivid purple | ![#9900fa](https://via.placeholder.com/15/9900fa/000000?text=+) `#9900fa` | -| dark royal blue | ![#02066f](https://via.placeholder.com/15/02066f/000000?text=+) `#02066f` | -| hazel | ![#8e7618](https://via.placeholder.com/15/8e7618/000000?text=+) `#8e7618` | -| muted pink | ![#d1768f](https://via.placeholder.com/15/d1768f/000000?text=+) `#d1768f` | -| booger green | ![#96b403](https://via.placeholder.com/15/96b403/000000?text=+) `#96b403` | -| canary | ![#fdff63](https://via.placeholder.com/15/fdff63/000000?text=+) `#fdff63` | -| cool grey | ![#95a3a6](https://via.placeholder.com/15/95a3a6/000000?text=+) `#95a3a6` | -| dark taupe | ![#7f684e](https://via.placeholder.com/15/7f684e/000000?text=+) `#7f684e` | -| darkish purple | ![#751973](https://via.placeholder.com/15/751973/000000?text=+) `#751973` | -| true green | ![#089404](https://via.placeholder.com/15/089404/000000?text=+) `#089404` | -| coral pink | ![#ff6163](https://via.placeholder.com/15/ff6163/000000?text=+) `#ff6163` | -| dark sage | ![#598556](https://via.placeholder.com/15/598556/000000?text=+) `#598556` | -| dark slate blue | ![#214761](https://via.placeholder.com/15/214761/000000?text=+) `#214761` | -| flat blue | ![#3c73a8](https://via.placeholder.com/15/3c73a8/000000?text=+) `#3c73a8` | -| mushroom | ![#ba9e88](https://via.placeholder.com/15/ba9e88/000000?text=+) `#ba9e88` | -| rich blue | ![#021bf9](https://via.placeholder.com/15/021bf9/000000?text=+) `#021bf9` | -| dirty purple | ![#734a65](https://via.placeholder.com/15/734a65/000000?text=+) `#734a65` | -| greenblue | ![#23c48b](https://via.placeholder.com/15/23c48b/000000?text=+) `#23c48b` | -| icky green | ![#8fae22](https://via.placeholder.com/15/8fae22/000000?text=+) `#8fae22` | -| light khaki | ![#e6f2a2](https://via.placeholder.com/15/e6f2a2/000000?text=+) `#e6f2a2` | -| warm blue | ![#4b57db](https://via.placeholder.com/15/4b57db/000000?text=+) `#4b57db` | -| dark hot pink | ![#d90166](https://via.placeholder.com/15/d90166/000000?text=+) `#d90166` | -| deep sea blue | ![#015482](https://via.placeholder.com/15/015482/000000?text=+) `#015482` | -| carmine | ![#9d0216](https://via.placeholder.com/15/9d0216/000000?text=+) `#9d0216` | -| dark yellow green | ![#728f02](https://via.placeholder.com/15/728f02/000000?text=+) `#728f02` | -| pale peach | ![#ffe5ad](https://via.placeholder.com/15/ffe5ad/000000?text=+) `#ffe5ad` | -| plum purple | ![#4e0550](https://via.placeholder.com/15/4e0550/000000?text=+) `#4e0550` | -| golden rod | ![#f9bc08](https://via.placeholder.com/15/f9bc08/000000?text=+) `#f9bc08` | -| neon red | ![#ff073a](https://via.placeholder.com/15/ff073a/000000?text=+) `#ff073a` | -| old pink | ![#c77986](https://via.placeholder.com/15/c77986/000000?text=+) `#c77986` | -| very pale blue | ![#d6fffe](https://via.placeholder.com/15/d6fffe/000000?text=+) `#d6fffe` | -| blood orange | ![#fe4b03](https://via.placeholder.com/15/fe4b03/000000?text=+) `#fe4b03` | -| grapefruit | ![#fd5956](https://via.placeholder.com/15/fd5956/000000?text=+) `#fd5956` | -| sand yellow | ![#fce166](https://via.placeholder.com/15/fce166/000000?text=+) `#fce166` | -| clay brown | ![#b2713d](https://via.placeholder.com/15/b2713d/000000?text=+) `#b2713d` | -| dark blue grey | ![#1f3b4d](https://via.placeholder.com/15/1f3b4d/000000?text=+) `#1f3b4d` | -| flat green | ![#699d4c](https://via.placeholder.com/15/699d4c/000000?text=+) `#699d4c` | -| light green blue | ![#56fca2](https://via.placeholder.com/15/56fca2/000000?text=+) `#56fca2` | -| warm pink | ![#fb5581](https://via.placeholder.com/15/fb5581/000000?text=+) `#fb5581` | -| dodger blue | ![#3e82fc](https://via.placeholder.com/15/3e82fc/000000?text=+) `#3e82fc` | -| gross green | ![#a0bf16](https://via.placeholder.com/15/a0bf16/000000?text=+) `#a0bf16` | -| ice | ![#d6fffa](https://via.placeholder.com/15/d6fffa/000000?text=+) `#d6fffa` | -| metallic blue | ![#4f738e](https://via.placeholder.com/15/4f738e/000000?text=+) `#4f738e` | -| pale salmon | ![#ffb19a](https://via.placeholder.com/15/ffb19a/000000?text=+) `#ffb19a` | -| sap green | ![#5c8b15](https://via.placeholder.com/15/5c8b15/000000?text=+) `#5c8b15` | -| algae | ![#54ac68](https://via.placeholder.com/15/54ac68/000000?text=+) `#54ac68` | -| bluey grey | ![#89a0b0](https://via.placeholder.com/15/89a0b0/000000?text=+) `#89a0b0` | -| greeny grey | ![#7ea07a](https://via.placeholder.com/15/7ea07a/000000?text=+) `#7ea07a` | -| highlighter green | ![#1bfc06](https://via.placeholder.com/15/1bfc06/000000?text=+) `#1bfc06` | -| light light blue | ![#cafffb](https://via.placeholder.com/15/cafffb/000000?text=+) `#cafffb` | -| light mint | ![#b6ffbb](https://via.placeholder.com/15/b6ffbb/000000?text=+) `#b6ffbb` | -| raw umber | ![#a75e09](https://via.placeholder.com/15/a75e09/000000?text=+) `#a75e09` | -| vivid blue | ![#152eff](https://via.placeholder.com/15/152eff/000000?text=+) `#152eff` | -| deep lavender | ![#8d5eb7](https://via.placeholder.com/15/8d5eb7/000000?text=+) `#8d5eb7` | -| dull teal | ![#5f9e8f](https://via.placeholder.com/15/5f9e8f/000000?text=+) `#5f9e8f` | -| light greenish blue | ![#63f7b4](https://via.placeholder.com/15/63f7b4/000000?text=+) `#63f7b4` | -| mud green | ![#606602](https://via.placeholder.com/15/606602/000000?text=+) `#606602` | -| pinky | ![#fc86aa](https://via.placeholder.com/15/fc86aa/000000?text=+) `#fc86aa` | -| red wine | ![#8c0034](https://via.placeholder.com/15/8c0034/000000?text=+) `#8c0034` | -| shit green | ![#758000](https://via.placeholder.com/15/758000/000000?text=+) `#758000` | -| tan brown | ![#ab7e4c](https://via.placeholder.com/15/ab7e4c/000000?text=+) `#ab7e4c` | -| darkblue | ![#030764](https://via.placeholder.com/15/030764/000000?text=+) `#030764` | -| rosa | ![#fe86a4](https://via.placeholder.com/15/fe86a4/000000?text=+) `#fe86a4` | -| lipstick | ![#d5174e](https://via.placeholder.com/15/d5174e/000000?text=+) `#d5174e` | -| pale mauve | ![#fed0fc](https://via.placeholder.com/15/fed0fc/000000?text=+) `#fed0fc` | -| claret | ![#680018](https://via.placeholder.com/15/680018/000000?text=+) `#680018` | -| dandelion | ![#fedf08](https://via.placeholder.com/15/fedf08/000000?text=+) `#fedf08` | -| orangered | ![#fe420f](https://via.placeholder.com/15/fe420f/000000?text=+) `#fe420f` | -| poop green | ![#6f7c00](https://via.placeholder.com/15/6f7c00/000000?text=+) `#6f7c00` | -| ruby | ![#ca0147](https://via.placeholder.com/15/ca0147/000000?text=+) `#ca0147` | -| dark | ![#1b2431](https://via.placeholder.com/15/1b2431/000000?text=+) `#1b2431` | -| greenish turquoise | ![#00fbb0](https://via.placeholder.com/15/00fbb0/000000?text=+) `#00fbb0` | -| pastel red | ![#db5856](https://via.placeholder.com/15/db5856/000000?text=+) `#db5856` | -| piss yellow | ![#ddd618](https://via.placeholder.com/15/ddd618/000000?text=+) `#ddd618` | -| bright cyan | ![#41fdfe](https://via.placeholder.com/15/41fdfe/000000?text=+) `#41fdfe` | -| dark coral | ![#cf524e](https://via.placeholder.com/15/cf524e/000000?text=+) `#cf524e` | -| algae green | ![#21c36f](https://via.placeholder.com/15/21c36f/000000?text=+) `#21c36f` | -| darkish red | ![#a90308](https://via.placeholder.com/15/a90308/000000?text=+) `#a90308` | -| reddy brown | ![#6e1005](https://via.placeholder.com/15/6e1005/000000?text=+) `#6e1005` | -| blush pink | ![#fe828c](https://via.placeholder.com/15/fe828c/000000?text=+) `#fe828c` | -| camouflage green | ![#4b6113](https://via.placeholder.com/15/4b6113/000000?text=+) `#4b6113` | -| lawn green | ![#4da409](https://via.placeholder.com/15/4da409/000000?text=+) `#4da409` | -| putty | ![#beae8a](https://via.placeholder.com/15/beae8a/000000?text=+) `#beae8a` | -| vibrant blue | ![#0339f8](https://via.placeholder.com/15/0339f8/000000?text=+) `#0339f8` | -| dark sand | ![#a88f59](https://via.placeholder.com/15/a88f59/000000?text=+) `#a88f59` | -| purple/blue | ![#5d21d0](https://via.placeholder.com/15/5d21d0/000000?text=+) `#5d21d0` | -| saffron | ![#feb209](https://via.placeholder.com/15/feb209/000000?text=+) `#feb209` | -| twilight | ![#4e518b](https://via.placeholder.com/15/4e518b/000000?text=+) `#4e518b` | -| warm brown | ![#964e02](https://via.placeholder.com/15/964e02/000000?text=+) `#964e02` | -| bluegrey | ![#85a3b2](https://via.placeholder.com/15/85a3b2/000000?text=+) `#85a3b2` | -| bubble gum pink | ![#ff69af](https://via.placeholder.com/15/ff69af/000000?text=+) `#ff69af` | -| duck egg blue | ![#c3fbf4](https://via.placeholder.com/15/c3fbf4/000000?text=+) `#c3fbf4` | -| greenish cyan | ![#2afeb7](https://via.placeholder.com/15/2afeb7/000000?text=+) `#2afeb7` | -| petrol | ![#005f6a](https://via.placeholder.com/15/005f6a/000000?text=+) `#005f6a` | -| royal | ![#0c1793](https://via.placeholder.com/15/0c1793/000000?text=+) `#0c1793` | -| butter | ![#ffff81](https://via.placeholder.com/15/ffff81/000000?text=+) `#ffff81` | -| dusty orange | ![#f0833a](https://via.placeholder.com/15/f0833a/000000?text=+) `#f0833a` | -| off yellow | ![#f1f33f](https://via.placeholder.com/15/f1f33f/000000?text=+) `#f1f33f` | -| pale olive green | ![#b1d27b](https://via.placeholder.com/15/b1d27b/000000?text=+) `#b1d27b` | -| orangish | ![#fc824a](https://via.placeholder.com/15/fc824a/000000?text=+) `#fc824a` | -| leaf | ![#71aa34](https://via.placeholder.com/15/71aa34/000000?text=+) `#71aa34` | -| light blue grey | ![#b7c9e2](https://via.placeholder.com/15/b7c9e2/000000?text=+) `#b7c9e2` | -| dried blood | ![#4b0101](https://via.placeholder.com/15/4b0101/000000?text=+) `#4b0101` | -| lightish purple | ![#a552e6](https://via.placeholder.com/15/a552e6/000000?text=+) `#a552e6` | -| rusty red | ![#af2f0d](https://via.placeholder.com/15/af2f0d/000000?text=+) `#af2f0d` | -| lavender blue | ![#8b88f8](https://via.placeholder.com/15/8b88f8/000000?text=+) `#8b88f8` | -| light grass green | ![#9af764](https://via.placeholder.com/15/9af764/000000?text=+) `#9af764` | -| light mint green | ![#a6fbb2](https://via.placeholder.com/15/a6fbb2/000000?text=+) `#a6fbb2` | -| sunflower | ![#ffc512](https://via.placeholder.com/15/ffc512/000000?text=+) `#ffc512` | -| velvet | ![#750851](https://via.placeholder.com/15/750851/000000?text=+) `#750851` | -| brick orange | ![#c14a09](https://via.placeholder.com/15/c14a09/000000?text=+) `#c14a09` | -| lightish red | ![#fe2f4a](https://via.placeholder.com/15/fe2f4a/000000?text=+) `#fe2f4a` | -| pure blue | ![#0203e2](https://via.placeholder.com/15/0203e2/000000?text=+) `#0203e2` | -| twilight blue | ![#0a437a](https://via.placeholder.com/15/0a437a/000000?text=+) `#0a437a` | -| violet red | ![#a50055](https://via.placeholder.com/15/a50055/000000?text=+) `#a50055` | -| yellowy brown | ![#ae8b0c](https://via.placeholder.com/15/ae8b0c/000000?text=+) `#ae8b0c` | -| carnation | ![#fd798f](https://via.placeholder.com/15/fd798f/000000?text=+) `#fd798f` | -| muddy yellow | ![#bfac05](https://via.placeholder.com/15/bfac05/000000?text=+) `#bfac05` | -| dark seafoam green | ![#3eaf76](https://via.placeholder.com/15/3eaf76/000000?text=+) `#3eaf76` | -| deep rose | ![#c74767](https://via.placeholder.com/15/c74767/000000?text=+) `#c74767` | -| dusty red | ![#b9484e](https://via.placeholder.com/15/b9484e/000000?text=+) `#b9484e` | -| grey/blue | ![#647d8e](https://via.placeholder.com/15/647d8e/000000?text=+) `#647d8e` | -| lemon lime | ![#bffe28](https://via.placeholder.com/15/bffe28/000000?text=+) `#bffe28` | -| purple/pink | ![#d725de](https://via.placeholder.com/15/d725de/000000?text=+) `#d725de` | -| brown yellow | ![#b29705](https://via.placeholder.com/15/b29705/000000?text=+) `#b29705` | -| purple brown | ![#673a3f](https://via.placeholder.com/15/673a3f/000000?text=+) `#673a3f` | -| wisteria | ![#a87dc2](https://via.placeholder.com/15/a87dc2/000000?text=+) `#a87dc2` | -| banana yellow | ![#fafe4b](https://via.placeholder.com/15/fafe4b/000000?text=+) `#fafe4b` | -| lipstick red | ![#c0022f](https://via.placeholder.com/15/c0022f/000000?text=+) `#c0022f` | -| water blue | ![#0e87cc](https://via.placeholder.com/15/0e87cc/000000?text=+) `#0e87cc` | -| brown grey | ![#8d8468](https://via.placeholder.com/15/8d8468/000000?text=+) `#8d8468` | -| vibrant purple | ![#ad03de](https://via.placeholder.com/15/ad03de/000000?text=+) `#ad03de` | -| baby green | ![#8cff9e](https://via.placeholder.com/15/8cff9e/000000?text=+) `#8cff9e` | -| barf green | ![#94ac02](https://via.placeholder.com/15/94ac02/000000?text=+) `#94ac02` | -| eggshell blue | ![#c4fff7](https://via.placeholder.com/15/c4fff7/000000?text=+) `#c4fff7` | -| sandy yellow | ![#fdee73](https://via.placeholder.com/15/fdee73/000000?text=+) `#fdee73` | -| cool green | ![#33b864](https://via.placeholder.com/15/33b864/000000?text=+) `#33b864` | -| pale | ![#fff9d0](https://via.placeholder.com/15/fff9d0/000000?text=+) `#fff9d0` | -| blue/grey | ![#758da3](https://via.placeholder.com/15/758da3/000000?text=+) `#758da3` | -| hot magenta | ![#f504c9](https://via.placeholder.com/15/f504c9/000000?text=+) `#f504c9` | -| greyblue | ![#77a1b5](https://via.placeholder.com/15/77a1b5/000000?text=+) `#77a1b5` | -| purpley | ![#8756e4](https://via.placeholder.com/15/8756e4/000000?text=+) `#8756e4` | -| baby shit green | ![#889717](https://via.placeholder.com/15/889717/000000?text=+) `#889717` | -| brownish pink | ![#c27e79](https://via.placeholder.com/15/c27e79/000000?text=+) `#c27e79` | -| dark aquamarine | ![#017371](https://via.placeholder.com/15/017371/000000?text=+) `#017371` | -| diarrhea | ![#9f8303](https://via.placeholder.com/15/9f8303/000000?text=+) `#9f8303` | -| light mustard | ![#f7d560](https://via.placeholder.com/15/f7d560/000000?text=+) `#f7d560` | -| pale sky blue | ![#bdf6fe](https://via.placeholder.com/15/bdf6fe/000000?text=+) `#bdf6fe` | -| turtle green | ![#75b84f](https://via.placeholder.com/15/75b84f/000000?text=+) `#75b84f` | -| bright olive | ![#9cbb04](https://via.placeholder.com/15/9cbb04/000000?text=+) `#9cbb04` | -| dark grey blue | ![#29465b](https://via.placeholder.com/15/29465b/000000?text=+) `#29465b` | -| greeny brown | ![#696006](https://via.placeholder.com/15/696006/000000?text=+) `#696006` | -| lemon green | ![#adf802](https://via.placeholder.com/15/adf802/000000?text=+) `#adf802` | -| light periwinkle | ![#c1c6fc](https://via.placeholder.com/15/c1c6fc/000000?text=+) `#c1c6fc` | -| seaweed green | ![#35ad6b](https://via.placeholder.com/15/35ad6b/000000?text=+) `#35ad6b` | -| sunshine yellow | ![#fffd37](https://via.placeholder.com/15/fffd37/000000?text=+) `#fffd37` | -| ugly purple | ![#a442a0](https://via.placeholder.com/15/a442a0/000000?text=+) `#a442a0` | -| medium pink | ![#f36196](https://via.placeholder.com/15/f36196/000000?text=+) `#f36196` | -| puke brown | ![#947706](https://via.placeholder.com/15/947706/000000?text=+) `#947706` | -| very light pink | ![#fff4f2](https://via.placeholder.com/15/fff4f2/000000?text=+) `#fff4f2` | -| viridian | ![#1e9167](https://via.placeholder.com/15/1e9167/000000?text=+) `#1e9167` | -| bile | ![#b5c306](https://via.placeholder.com/15/b5c306/000000?text=+) `#b5c306` | -| faded yellow | ![#feff7f](https://via.placeholder.com/15/feff7f/000000?text=+) `#feff7f` | -| very pale green | ![#cffdbc](https://via.placeholder.com/15/cffdbc/000000?text=+) `#cffdbc` | -| vibrant green | ![#0add08](https://via.placeholder.com/15/0add08/000000?text=+) `#0add08` | -| bright lime | ![#87fd05](https://via.placeholder.com/15/87fd05/000000?text=+) `#87fd05` | -| spearmint | ![#1ef876](https://via.placeholder.com/15/1ef876/000000?text=+) `#1ef876` | -| light aquamarine | ![#7bfdc7](https://via.placeholder.com/15/7bfdc7/000000?text=+) `#7bfdc7` | -| light sage | ![#bcecac](https://via.placeholder.com/15/bcecac/000000?text=+) `#bcecac` | -| yellowgreen | ![#bbf90f](https://via.placeholder.com/15/bbf90f/000000?text=+) `#bbf90f` | -| baby poo | ![#ab9004](https://via.placeholder.com/15/ab9004/000000?text=+) `#ab9004` | -| dark seafoam | ![#1fb57a](https://via.placeholder.com/15/1fb57a/000000?text=+) `#1fb57a` | -| deep teal | ![#00555a](https://via.placeholder.com/15/00555a/000000?text=+) `#00555a` | -| heather | ![#a484ac](https://via.placeholder.com/15/a484ac/000000?text=+) `#a484ac` | -| rust orange | ![#c45508](https://via.placeholder.com/15/c45508/000000?text=+) `#c45508` | -| dirty blue | ![#3f829d](https://via.placeholder.com/15/3f829d/000000?text=+) `#3f829d` | -| fern green | ![#548d44](https://via.placeholder.com/15/548d44/000000?text=+) `#548d44` | -| bright lilac | ![#c95efb](https://via.placeholder.com/15/c95efb/000000?text=+) `#c95efb` | -| weird green | ![#3ae57f](https://via.placeholder.com/15/3ae57f/000000?text=+) `#3ae57f` | -| peacock blue | ![#016795](https://via.placeholder.com/15/016795/000000?text=+) `#016795` | -| avocado green | ![#87a922](https://via.placeholder.com/15/87a922/000000?text=+) `#87a922` | -| faded orange | ![#f0944d](https://via.placeholder.com/15/f0944d/000000?text=+) `#f0944d` | -| grape purple | ![#5d1451](https://via.placeholder.com/15/5d1451/000000?text=+) `#5d1451` | -| hot green | ![#25ff29](https://via.placeholder.com/15/25ff29/000000?text=+) `#25ff29` | -| lime yellow | ![#d0fe1d](https://via.placeholder.com/15/d0fe1d/000000?text=+) `#d0fe1d` | -| mango | ![#ffa62b](https://via.placeholder.com/15/ffa62b/000000?text=+) `#ffa62b` | -| shamrock | ![#01b44c](https://via.placeholder.com/15/01b44c/000000?text=+) `#01b44c` | -| bubblegum | ![#ff6cb5](https://via.placeholder.com/15/ff6cb5/000000?text=+) `#ff6cb5` | -| purplish brown | ![#6b4247](https://via.placeholder.com/15/6b4247/000000?text=+) `#6b4247` | -| vomit yellow | ![#c7c10c](https://via.placeholder.com/15/c7c10c/000000?text=+) `#c7c10c` | -| pale cyan | ![#b7fffa](https://via.placeholder.com/15/b7fffa/000000?text=+) `#b7fffa` | -| key lime | ![#aeff6e](https://via.placeholder.com/15/aeff6e/000000?text=+) `#aeff6e` | -| tomato red | ![#ec2d01](https://via.placeholder.com/15/ec2d01/000000?text=+) `#ec2d01` | -| lightgreen | ![#76ff7b](https://via.placeholder.com/15/76ff7b/000000?text=+) `#76ff7b` | -| merlot | ![#730039](https://via.placeholder.com/15/730039/000000?text=+) `#730039` | -| night blue | ![#040348](https://via.placeholder.com/15/040348/000000?text=+) `#040348` | -| purpleish pink | ![#df4ec8](https://via.placeholder.com/15/df4ec8/000000?text=+) `#df4ec8` | -| apple | ![#6ecb3c](https://via.placeholder.com/15/6ecb3c/000000?text=+) `#6ecb3c` | -| baby poop green | ![#8f9805](https://via.placeholder.com/15/8f9805/000000?text=+) `#8f9805` | -| green apple | ![#5edc1f](https://via.placeholder.com/15/5edc1f/000000?text=+) `#5edc1f` | -| heliotrope | ![#d94ff5](https://via.placeholder.com/15/d94ff5/000000?text=+) `#d94ff5` | -| yellow/green | ![#c8fd3d](https://via.placeholder.com/15/c8fd3d/000000?text=+) `#c8fd3d` | -| almost black | ![#070d0d](https://via.placeholder.com/15/070d0d/000000?text=+) `#070d0d` | -| cool blue | ![#4984b8](https://via.placeholder.com/15/4984b8/000000?text=+) `#4984b8` | -| leafy green | ![#51b73b](https://via.placeholder.com/15/51b73b/000000?text=+) `#51b73b` | -| mustard brown | ![#ac7e04](https://via.placeholder.com/15/ac7e04/000000?text=+) `#ac7e04` | -| dusk | ![#4e5481](https://via.placeholder.com/15/4e5481/000000?text=+) `#4e5481` | -| dull brown | ![#876e4b](https://via.placeholder.com/15/876e4b/000000?text=+) `#876e4b` | -| frog green | ![#58bc08](https://via.placeholder.com/15/58bc08/000000?text=+) `#58bc08` | -| vivid green | ![#2fef10](https://via.placeholder.com/15/2fef10/000000?text=+) `#2fef10` | -| bright light green | ![#2dfe54](https://via.placeholder.com/15/2dfe54/000000?text=+) `#2dfe54` | -| fluro green | ![#0aff02](https://via.placeholder.com/15/0aff02/000000?text=+) `#0aff02` | -| kiwi | ![#9cef43](https://via.placeholder.com/15/9cef43/000000?text=+) `#9cef43` | -| seaweed | ![#18d17b](https://via.placeholder.com/15/18d17b/000000?text=+) `#18d17b` | -| navy green | ![#35530a](https://via.placeholder.com/15/35530a/000000?text=+) `#35530a` | -| ultramarine blue | ![#1805db](https://via.placeholder.com/15/1805db/000000?text=+) `#1805db` | -| iris | ![#6258c4](https://via.placeholder.com/15/6258c4/000000?text=+) `#6258c4` | -| pastel orange | ![#ff964f](https://via.placeholder.com/15/ff964f/000000?text=+) `#ff964f` | -| yellowish orange | ![#ffab0f](https://via.placeholder.com/15/ffab0f/000000?text=+) `#ffab0f` | -| perrywinkle | ![#8f8ce7](https://via.placeholder.com/15/8f8ce7/000000?text=+) `#8f8ce7` | -| tealish | ![#24bca8](https://via.placeholder.com/15/24bca8/000000?text=+) `#24bca8` | -| dark plum | ![#3f012c](https://via.placeholder.com/15/3f012c/000000?text=+) `#3f012c` | -| pear | ![#cbf85f](https://via.placeholder.com/15/cbf85f/000000?text=+) `#cbf85f` | -| pinkish orange | ![#ff724c](https://via.placeholder.com/15/ff724c/000000?text=+) `#ff724c` | -| midnight purple | ![#280137](https://via.placeholder.com/15/280137/000000?text=+) `#280137` | -| light urple | ![#b36ff6](https://via.placeholder.com/15/b36ff6/000000?text=+) `#b36ff6` | -| dark mint | ![#48c072](https://via.placeholder.com/15/48c072/000000?text=+) `#48c072` | -| greenish tan | ![#bccb7a](https://via.placeholder.com/15/bccb7a/000000?text=+) `#bccb7a` | -| light burgundy | ![#a8415b](https://via.placeholder.com/15/a8415b/000000?text=+) `#a8415b` | -| turquoise blue | ![#06b1c4](https://via.placeholder.com/15/06b1c4/000000?text=+) `#06b1c4` | -| ugly pink | ![#cd7584](https://via.placeholder.com/15/cd7584/000000?text=+) `#cd7584` | -| sandy | ![#f1da7a](https://via.placeholder.com/15/f1da7a/000000?text=+) `#f1da7a` | -| electric pink | ![#ff0490](https://via.placeholder.com/15/ff0490/000000?text=+) `#ff0490` | -| muted purple | ![#805b87](https://via.placeholder.com/15/805b87/000000?text=+) `#805b87` | -| mid green | ![#50a747](https://via.placeholder.com/15/50a747/000000?text=+) `#50a747` | -| greyish | ![#a8a495](https://via.placeholder.com/15/a8a495/000000?text=+) `#a8a495` | -| neon yellow | ![#cfff04](https://via.placeholder.com/15/cfff04/000000?text=+) `#cfff04` | -| banana | ![#ffff7e](https://via.placeholder.com/15/ffff7e/000000?text=+) `#ffff7e` | -| carnation pink | ![#ff7fa7](https://via.placeholder.com/15/ff7fa7/000000?text=+) `#ff7fa7` | -| tomato | ![#ef4026](https://via.placeholder.com/15/ef4026/000000?text=+) `#ef4026` | -| sea | ![#3c9992](https://via.placeholder.com/15/3c9992/000000?text=+) `#3c9992` | -| muddy brown | ![#886806](https://via.placeholder.com/15/886806/000000?text=+) `#886806` | -| turquoise green | ![#04f489](https://via.placeholder.com/15/04f489/000000?text=+) `#04f489` | -| buff | ![#fef69e](https://via.placeholder.com/15/fef69e/000000?text=+) `#fef69e` | -| fawn | ![#cfaf7b](https://via.placeholder.com/15/cfaf7b/000000?text=+) `#cfaf7b` | -| muted blue | ![#3b719f](https://via.placeholder.com/15/3b719f/000000?text=+) `#3b719f` | -| pale rose | ![#fdc1c5](https://via.placeholder.com/15/fdc1c5/000000?text=+) `#fdc1c5` | -| dark mint green | ![#20c073](https://via.placeholder.com/15/20c073/000000?text=+) `#20c073` | -| amethyst | ![#9b5fc0](https://via.placeholder.com/15/9b5fc0/000000?text=+) `#9b5fc0` | -| blue/green | ![#0f9b8e](https://via.placeholder.com/15/0f9b8e/000000?text=+) `#0f9b8e` | -| chestnut | ![#742802](https://via.placeholder.com/15/742802/000000?text=+) `#742802` | -| sick green | ![#9db92c](https://via.placeholder.com/15/9db92c/000000?text=+) `#9db92c` | -| pea | ![#a4bf20](https://via.placeholder.com/15/a4bf20/000000?text=+) `#a4bf20` | -| rusty orange | ![#cd5909](https://via.placeholder.com/15/cd5909/000000?text=+) `#cd5909` | -| stone | ![#ada587](https://via.placeholder.com/15/ada587/000000?text=+) `#ada587` | -| rose red | ![#be013c](https://via.placeholder.com/15/be013c/000000?text=+) `#be013c` | -| pale aqua | ![#b8ffeb](https://via.placeholder.com/15/b8ffeb/000000?text=+) `#b8ffeb` | -| deep orange | ![#dc4d01](https://via.placeholder.com/15/dc4d01/000000?text=+) `#dc4d01` | -| earth | ![#a2653e](https://via.placeholder.com/15/a2653e/000000?text=+) `#a2653e` | -| mossy green | ![#638b27](https://via.placeholder.com/15/638b27/000000?text=+) `#638b27` | -| grassy green | ![#419c03](https://via.placeholder.com/15/419c03/000000?text=+) `#419c03` | -| pale lime green | ![#b1ff65](https://via.placeholder.com/15/b1ff65/000000?text=+) `#b1ff65` | -| light grey blue | ![#9dbcd4](https://via.placeholder.com/15/9dbcd4/000000?text=+) `#9dbcd4` | -| pale grey | ![#fdfdfe](https://via.placeholder.com/15/fdfdfe/000000?text=+) `#fdfdfe` | -| asparagus | ![#77ab56](https://via.placeholder.com/15/77ab56/000000?text=+) `#77ab56` | -| blueberry | ![#464196](https://via.placeholder.com/15/464196/000000?text=+) `#464196` | -| purple red | ![#990147](https://via.placeholder.com/15/990147/000000?text=+) `#990147` | -| pale lime | ![#befd73](https://via.placeholder.com/15/befd73/000000?text=+) `#befd73` | -| greenish teal | ![#32bf84](https://via.placeholder.com/15/32bf84/000000?text=+) `#32bf84` | -| caramel | ![#af6f09](https://via.placeholder.com/15/af6f09/000000?text=+) `#af6f09` | -| deep magenta | ![#a0025c](https://via.placeholder.com/15/a0025c/000000?text=+) `#a0025c` | -| light peach | ![#ffd8b1](https://via.placeholder.com/15/ffd8b1/000000?text=+) `#ffd8b1` | -| milk chocolate | ![#7f4e1e](https://via.placeholder.com/15/7f4e1e/000000?text=+) `#7f4e1e` | -| ocher | ![#bf9b0c](https://via.placeholder.com/15/bf9b0c/000000?text=+) `#bf9b0c` | -| off green | ![#6ba353](https://via.placeholder.com/15/6ba353/000000?text=+) `#6ba353` | -| purply pink | ![#f075e6](https://via.placeholder.com/15/f075e6/000000?text=+) `#f075e6` | -| lightblue | ![#7bc8f6](https://via.placeholder.com/15/7bc8f6/000000?text=+) `#7bc8f6` | -| dusky blue | ![#475f94](https://via.placeholder.com/15/475f94/000000?text=+) `#475f94` | -| golden | ![#f5bf03](https://via.placeholder.com/15/f5bf03/000000?text=+) `#f5bf03` | -| light beige | ![#fffeb6](https://via.placeholder.com/15/fffeb6/000000?text=+) `#fffeb6` | -| butter yellow | ![#fffd74](https://via.placeholder.com/15/fffd74/000000?text=+) `#fffd74` | -| dusky purple | ![#895b7b](https://via.placeholder.com/15/895b7b/000000?text=+) `#895b7b` | -| french blue | ![#436bad](https://via.placeholder.com/15/436bad/000000?text=+) `#436bad` | -| ugly yellow | ![#d0c101](https://via.placeholder.com/15/d0c101/000000?text=+) `#d0c101` | -| greeny yellow | ![#c6f808](https://via.placeholder.com/15/c6f808/000000?text=+) `#c6f808` | -| orangish red | ![#f43605](https://via.placeholder.com/15/f43605/000000?text=+) `#f43605` | -| shamrock green | ![#02c14d](https://via.placeholder.com/15/02c14d/000000?text=+) `#02c14d` | -| orangish brown | ![#b25f03](https://via.placeholder.com/15/b25f03/000000?text=+) `#b25f03` | -| tree green | ![#2a7e19](https://via.placeholder.com/15/2a7e19/000000?text=+) `#2a7e19` | -| deep violet | ![#490648](https://via.placeholder.com/15/490648/000000?text=+) `#490648` | -| gunmetal | ![#536267](https://via.placeholder.com/15/536267/000000?text=+) `#536267` | -| blue/purple | ![#5a06ef](https://via.placeholder.com/15/5a06ef/000000?text=+) `#5a06ef` | -| cherry | ![#cf0234](https://via.placeholder.com/15/cf0234/000000?text=+) `#cf0234` | -| sandy brown | ![#c4a661](https://via.placeholder.com/15/c4a661/000000?text=+) `#c4a661` | -| warm grey | ![#978a84](https://via.placeholder.com/15/978a84/000000?text=+) `#978a84` | -| dark indigo | ![#1f0954](https://via.placeholder.com/15/1f0954/000000?text=+) `#1f0954` | -| midnight | ![#03012d](https://via.placeholder.com/15/03012d/000000?text=+) `#03012d` | -| bluey green | ![#2bb179](https://via.placeholder.com/15/2bb179/000000?text=+) `#2bb179` | -| grey pink | ![#c3909b](https://via.placeholder.com/15/c3909b/000000?text=+) `#c3909b` | -| soft purple | ![#a66fb5](https://via.placeholder.com/15/a66fb5/000000?text=+) `#a66fb5` | -| blood | ![#770001](https://via.placeholder.com/15/770001/000000?text=+) `#770001` | -| brown red | ![#922b05](https://via.placeholder.com/15/922b05/000000?text=+) `#922b05` | -| medium grey | ![#7d7f7c](https://via.placeholder.com/15/7d7f7c/000000?text=+) `#7d7f7c` | -| berry | ![#990f4b](https://via.placeholder.com/15/990f4b/000000?text=+) `#990f4b` | -| poo | ![#8f7303](https://via.placeholder.com/15/8f7303/000000?text=+) `#8f7303` | -| purpley pink | ![#c83cb9](https://via.placeholder.com/15/c83cb9/000000?text=+) `#c83cb9` | -| light salmon | ![#fea993](https://via.placeholder.com/15/fea993/000000?text=+) `#fea993` | -| snot | ![#acbb0d](https://via.placeholder.com/15/acbb0d/000000?text=+) `#acbb0d` | -| easter purple | ![#c071fe](https://via.placeholder.com/15/c071fe/000000?text=+) `#c071fe` | -| light yellow green | ![#ccfd7f](https://via.placeholder.com/15/ccfd7f/000000?text=+) `#ccfd7f` | -| dark navy blue | ![#00022e](https://via.placeholder.com/15/00022e/000000?text=+) `#00022e` | -| drab | ![#828344](https://via.placeholder.com/15/828344/000000?text=+) `#828344` | -| light rose | ![#ffc5cb](https://via.placeholder.com/15/ffc5cb/000000?text=+) `#ffc5cb` | -| rouge | ![#ab1239](https://via.placeholder.com/15/ab1239/000000?text=+) `#ab1239` | -| purplish red | ![#b0054b](https://via.placeholder.com/15/b0054b/000000?text=+) `#b0054b` | -| slime green | ![#99cc04](https://via.placeholder.com/15/99cc04/000000?text=+) `#99cc04` | -| baby poop | ![#937c00](https://via.placeholder.com/15/937c00/000000?text=+) `#937c00` | -| irish green | ![#019529](https://via.placeholder.com/15/019529/000000?text=+) `#019529` | -| pink/purple | ![#ef1de7](https://via.placeholder.com/15/ef1de7/000000?text=+) `#ef1de7` | -| dark navy | ![#000435](https://via.placeholder.com/15/000435/000000?text=+) `#000435` | -| greeny blue | ![#42b395](https://via.placeholder.com/15/42b395/000000?text=+) `#42b395` | -| light plum | ![#9d5783](https://via.placeholder.com/15/9d5783/000000?text=+) `#9d5783` | -| pinkish grey | ![#c8aca9](https://via.placeholder.com/15/c8aca9/000000?text=+) `#c8aca9` | -| dirty orange | ![#c87606](https://via.placeholder.com/15/c87606/000000?text=+) `#c87606` | -| rust red | ![#aa2704](https://via.placeholder.com/15/aa2704/000000?text=+) `#aa2704` | -| pale lilac | ![#e4cbff](https://via.placeholder.com/15/e4cbff/000000?text=+) `#e4cbff` | -| orangey red | ![#fa4224](https://via.placeholder.com/15/fa4224/000000?text=+) `#fa4224` | -| primary blue | ![#0804f9](https://via.placeholder.com/15/0804f9/000000?text=+) `#0804f9` | -| kermit green | ![#5cb200](https://via.placeholder.com/15/5cb200/000000?text=+) `#5cb200` | -| brownish purple | ![#76424e](https://via.placeholder.com/15/76424e/000000?text=+) `#76424e` | -| murky green | ![#6c7a0e](https://via.placeholder.com/15/6c7a0e/000000?text=+) `#6c7a0e` | -| wheat | ![#fbdd7e](https://via.placeholder.com/15/fbdd7e/000000?text=+) `#fbdd7e` | -| very dark purple | ![#2a0134](https://via.placeholder.com/15/2a0134/000000?text=+) `#2a0134` | -| bottle green | ![#044a05](https://via.placeholder.com/15/044a05/000000?text=+) `#044a05` | -| watermelon | ![#fd4659](https://via.placeholder.com/15/fd4659/000000?text=+) `#fd4659` | -| deep sky blue | ![#0d75f8](https://via.placeholder.com/15/0d75f8/000000?text=+) `#0d75f8` | -| fire engine red | ![#fe0002](https://via.placeholder.com/15/fe0002/000000?text=+) `#fe0002` | -| yellow ochre | ![#cb9d06](https://via.placeholder.com/15/cb9d06/000000?text=+) `#cb9d06` | -| pumpkin orange | ![#fb7d07](https://via.placeholder.com/15/fb7d07/000000?text=+) `#fb7d07` | -| pale olive | ![#b9cc81](https://via.placeholder.com/15/b9cc81/000000?text=+) `#b9cc81` | -| light lilac | ![#edc8ff](https://via.placeholder.com/15/edc8ff/000000?text=+) `#edc8ff` | -| lightish green | ![#61e160](https://via.placeholder.com/15/61e160/000000?text=+) `#61e160` | -| carolina blue | ![#8ab8fe](https://via.placeholder.com/15/8ab8fe/000000?text=+) `#8ab8fe` | -| mulberry | ![#920a4e](https://via.placeholder.com/15/920a4e/000000?text=+) `#920a4e` | -| shocking pink | ![#fe02a2](https://via.placeholder.com/15/fe02a2/000000?text=+) `#fe02a2` | -| auburn | ![#9a3001](https://via.placeholder.com/15/9a3001/000000?text=+) `#9a3001` | -| bright lime green | ![#65fe08](https://via.placeholder.com/15/65fe08/000000?text=+) `#65fe08` | -| celadon | ![#befdb7](https://via.placeholder.com/15/befdb7/000000?text=+) `#befdb7` | -| pinkish brown | ![#b17261](https://via.placeholder.com/15/b17261/000000?text=+) `#b17261` | -| poo brown | ![#885f01](https://via.placeholder.com/15/885f01/000000?text=+) `#885f01` | -| bright sky blue | ![#02ccfe](https://via.placeholder.com/15/02ccfe/000000?text=+) `#02ccfe` | -| celery | ![#c1fd95](https://via.placeholder.com/15/c1fd95/000000?text=+) `#c1fd95` | -| dirt brown | ![#836539](https://via.placeholder.com/15/836539/000000?text=+) `#836539` | -| strawberry | ![#fb2943](https://via.placeholder.com/15/fb2943/000000?text=+) `#fb2943` | -| dark lime | ![#84b701](https://via.placeholder.com/15/84b701/000000?text=+) `#84b701` | -| copper | ![#b66325](https://via.placeholder.com/15/b66325/000000?text=+) `#b66325` | -| medium brown | ![#7f5112](https://via.placeholder.com/15/7f5112/000000?text=+) `#7f5112` | -| muted green | ![#5fa052](https://via.placeholder.com/15/5fa052/000000?text=+) `#5fa052` | -| robin's egg | ![#6dedfd](https://via.placeholder.com/15/6dedfd/000000?text=+) `#6dedfd` | -| bright aqua | ![#0bf9ea](https://via.placeholder.com/15/0bf9ea/000000?text=+) `#0bf9ea` | -| bright lavender | ![#c760ff](https://via.placeholder.com/15/c760ff/000000?text=+) `#c760ff` | -| ivory | ![#ffffcb](https://via.placeholder.com/15/ffffcb/000000?text=+) `#ffffcb` | -| very light purple | ![#f6cefc](https://via.placeholder.com/15/f6cefc/000000?text=+) `#f6cefc` | -| light navy | ![#155084](https://via.placeholder.com/15/155084/000000?text=+) `#155084` | -| pink red | ![#f5054f](https://via.placeholder.com/15/f5054f/000000?text=+) `#f5054f` | -| olive brown | ![#645403](https://via.placeholder.com/15/645403/000000?text=+) `#645403` | -| poop brown | ![#7a5901](https://via.placeholder.com/15/7a5901/000000?text=+) `#7a5901` | -| mustard green | ![#a8b504](https://via.placeholder.com/15/a8b504/000000?text=+) `#a8b504` | -| ocean green | ![#3d9973](https://via.placeholder.com/15/3d9973/000000?text=+) `#3d9973` | -| very dark blue | ![#000133](https://via.placeholder.com/15/000133/000000?text=+) `#000133` | -| dusty green | ![#76a973](https://via.placeholder.com/15/76a973/000000?text=+) `#76a973` | -| light navy blue | ![#2e5a88](https://via.placeholder.com/15/2e5a88/000000?text=+) `#2e5a88` | -| minty green | ![#0bf77d](https://via.placeholder.com/15/0bf77d/000000?text=+) `#0bf77d` | -| adobe | ![#bd6c48](https://via.placeholder.com/15/bd6c48/000000?text=+) `#bd6c48` | -| barney | ![#ac1db8](https://via.placeholder.com/15/ac1db8/000000?text=+) `#ac1db8` | -| jade green | ![#2baf6a](https://via.placeholder.com/15/2baf6a/000000?text=+) `#2baf6a` | -| bright light blue | ![#26f7fd](https://via.placeholder.com/15/26f7fd/000000?text=+) `#26f7fd` | -| light lime | ![#aefd6c](https://via.placeholder.com/15/aefd6c/000000?text=+) `#aefd6c` | -| dark khaki | ![#9b8f55](https://via.placeholder.com/15/9b8f55/000000?text=+) `#9b8f55` | -| orange yellow | ![#ffad01](https://via.placeholder.com/15/ffad01/000000?text=+) `#ffad01` | -| ocre | ![#c69c04](https://via.placeholder.com/15/c69c04/000000?text=+) `#c69c04` | -| maize | ![#f4d054](https://via.placeholder.com/15/f4d054/000000?text=+) `#f4d054` | -| faded pink | ![#de9dac](https://via.placeholder.com/15/de9dac/000000?text=+) `#de9dac` | -| british racing green | ![#05480d](https://via.placeholder.com/15/05480d/000000?text=+) `#05480d` | -| sandstone | ![#c9ae74](https://via.placeholder.com/15/c9ae74/000000?text=+) `#c9ae74` | -| mud brown | ![#60460f](https://via.placeholder.com/15/60460f/000000?text=+) `#60460f` | -| light sea green | ![#98f6b0](https://via.placeholder.com/15/98f6b0/000000?text=+) `#98f6b0` | -| robin egg blue | ![#8af1fe](https://via.placeholder.com/15/8af1fe/000000?text=+) `#8af1fe` | -| aqua marine | ![#2ee8bb](https://via.placeholder.com/15/2ee8bb/000000?text=+) `#2ee8bb` | -| dark sea green | ![#11875d](https://via.placeholder.com/15/11875d/000000?text=+) `#11875d` | -| soft pink | ![#fdb0c0](https://via.placeholder.com/15/fdb0c0/000000?text=+) `#fdb0c0` | -| orangey brown | ![#b16002](https://via.placeholder.com/15/b16002/000000?text=+) `#b16002` | -| cherry red | ![#f7022a](https://via.placeholder.com/15/f7022a/000000?text=+) `#f7022a` | -| burnt yellow | ![#d5ab09](https://via.placeholder.com/15/d5ab09/000000?text=+) `#d5ab09` | -| brownish grey | ![#86775f](https://via.placeholder.com/15/86775f/000000?text=+) `#86775f` | -| camel | ![#c69f59](https://via.placeholder.com/15/c69f59/000000?text=+) `#c69f59` | -| purplish grey | ![#7a687f](https://via.placeholder.com/15/7a687f/000000?text=+) `#7a687f` | -| marine | ![#042e60](https://via.placeholder.com/15/042e60/000000?text=+) `#042e60` | -| greyish pink | ![#c88d94](https://via.placeholder.com/15/c88d94/000000?text=+) `#c88d94` | -| pale turquoise | ![#a5fbd5](https://via.placeholder.com/15/a5fbd5/000000?text=+) `#a5fbd5` | -| pastel yellow | ![#fffe71](https://via.placeholder.com/15/fffe71/000000?text=+) `#fffe71` | -| bluey purple | ![#6241c7](https://via.placeholder.com/15/6241c7/000000?text=+) `#6241c7` | -| canary yellow | ![#fffe40](https://via.placeholder.com/15/fffe40/000000?text=+) `#fffe40` | -| faded red | ![#d3494e](https://via.placeholder.com/15/d3494e/000000?text=+) `#d3494e` | -| sepia | ![#985e2b](https://via.placeholder.com/15/985e2b/000000?text=+) `#985e2b` | -| coffee | ![#a6814c](https://via.placeholder.com/15/a6814c/000000?text=+) `#a6814c` | -| bright magenta | ![#ff08e8](https://via.placeholder.com/15/ff08e8/000000?text=+) `#ff08e8` | -| mocha | ![#9d7651](https://via.placeholder.com/15/9d7651/000000?text=+) `#9d7651` | -| ecru | ![#feffca](https://via.placeholder.com/15/feffca/000000?text=+) `#feffca` | -| purpleish | ![#98568d](https://via.placeholder.com/15/98568d/000000?text=+) `#98568d` | -| cranberry | ![#9e003a](https://via.placeholder.com/15/9e003a/000000?text=+) `#9e003a` | -| darkish green | ![#287c37](https://via.placeholder.com/15/287c37/000000?text=+) `#287c37` | -| brown orange | ![#b96902](https://via.placeholder.com/15/b96902/000000?text=+) `#b96902` | -| dusky rose | ![#ba6873](https://via.placeholder.com/15/ba6873/000000?text=+) `#ba6873` | -| melon | ![#ff7855](https://via.placeholder.com/15/ff7855/000000?text=+) `#ff7855` | -| sickly green | ![#94b21c](https://via.placeholder.com/15/94b21c/000000?text=+) `#94b21c` | -| silver | ![#c5c9c7](https://via.placeholder.com/15/c5c9c7/000000?text=+) `#c5c9c7` | -| purply blue | ![#661aee](https://via.placeholder.com/15/661aee/000000?text=+) `#661aee` | -| purpleish blue | ![#6140ef](https://via.placeholder.com/15/6140ef/000000?text=+) `#6140ef` | -| hospital green | ![#9be5aa](https://via.placeholder.com/15/9be5aa/000000?text=+) `#9be5aa` | -| shit brown | ![#7b5804](https://via.placeholder.com/15/7b5804/000000?text=+) `#7b5804` | -| mid blue | ![#276ab3](https://via.placeholder.com/15/276ab3/000000?text=+) `#276ab3` | -| amber | ![#feb308](https://via.placeholder.com/15/feb308/000000?text=+) `#feb308` | -| easter green | ![#8cfd7e](https://via.placeholder.com/15/8cfd7e/000000?text=+) `#8cfd7e` | -| soft blue | ![#6488ea](https://via.placeholder.com/15/6488ea/000000?text=+) `#6488ea` | -| cerulean blue | ![#056eee](https://via.placeholder.com/15/056eee/000000?text=+) `#056eee` | -| golden brown | ![#b27a01](https://via.placeholder.com/15/b27a01/000000?text=+) `#b27a01` | -| bright turquoise | ![#0ffef9](https://via.placeholder.com/15/0ffef9/000000?text=+) `#0ffef9` | -| red pink | ![#fa2a55](https://via.placeholder.com/15/fa2a55/000000?text=+) `#fa2a55` | -| red purple | ![#820747](https://via.placeholder.com/15/820747/000000?text=+) `#820747` | -| greyish brown | ![#7a6a4f](https://via.placeholder.com/15/7a6a4f/000000?text=+) `#7a6a4f` | -| vermillion | ![#f4320c](https://via.placeholder.com/15/f4320c/000000?text=+) `#f4320c` | -| russet | ![#a13905](https://via.placeholder.com/15/a13905/000000?text=+) `#a13905` | -| steel grey | ![#6f828a](https://via.placeholder.com/15/6f828a/000000?text=+) `#6f828a` | -| lighter purple | ![#a55af4](https://via.placeholder.com/15/a55af4/000000?text=+) `#a55af4` | -| bright violet | ![#ad0afd](https://via.placeholder.com/15/ad0afd/000000?text=+) `#ad0afd` | -| prussian blue | ![#004577](https://via.placeholder.com/15/004577/000000?text=+) `#004577` | -| slate green | ![#658d6d](https://via.placeholder.com/15/658d6d/000000?text=+) `#658d6d` | -| dirty pink | ![#ca7b80](https://via.placeholder.com/15/ca7b80/000000?text=+) `#ca7b80` | -| dark blue green | ![#005249](https://via.placeholder.com/15/005249/000000?text=+) `#005249` | -| pine | ![#2b5d34](https://via.placeholder.com/15/2b5d34/000000?text=+) `#2b5d34` | -| yellowy green | ![#bff128](https://via.placeholder.com/15/bff128/000000?text=+) `#bff128` | -| dark gold | ![#b59410](https://via.placeholder.com/15/b59410/000000?text=+) `#b59410` | -| bluish | ![#2976bb](https://via.placeholder.com/15/2976bb/000000?text=+) `#2976bb` | -| darkish blue | ![#014182](https://via.placeholder.com/15/014182/000000?text=+) `#014182` | -| dull red | ![#bb3f3f](https://via.placeholder.com/15/bb3f3f/000000?text=+) `#bb3f3f` | -| pinky red | ![#fc2647](https://via.placeholder.com/15/fc2647/000000?text=+) `#fc2647` | -| bronze | ![#a87900](https://via.placeholder.com/15/a87900/000000?text=+) `#a87900` | -| pale teal | ![#82cbb2](https://via.placeholder.com/15/82cbb2/000000?text=+) `#82cbb2` | -| military green | ![#667c3e](https://via.placeholder.com/15/667c3e/000000?text=+) `#667c3e` | -| barbie pink | ![#fe46a5](https://via.placeholder.com/15/fe46a5/000000?text=+) `#fe46a5` | -| bubblegum pink | ![#fe83cc](https://via.placeholder.com/15/fe83cc/000000?text=+) `#fe83cc` | -| pea soup green | ![#94a617](https://via.placeholder.com/15/94a617/000000?text=+) `#94a617` | -| dark mustard | ![#a88905](https://via.placeholder.com/15/a88905/000000?text=+) `#a88905` | -| shit | ![#7f5f00](https://via.placeholder.com/15/7f5f00/000000?text=+) `#7f5f00` | -| medium purple | ![#9e43a2](https://via.placeholder.com/15/9e43a2/000000?text=+) `#9e43a2` | -| very dark green | ![#062e03](https://via.placeholder.com/15/062e03/000000?text=+) `#062e03` | -| dirt | ![#8a6e45](https://via.placeholder.com/15/8a6e45/000000?text=+) `#8a6e45` | -| dusky pink | ![#cc7a8b](https://via.placeholder.com/15/cc7a8b/000000?text=+) `#cc7a8b` | -| red violet | ![#9e0168](https://via.placeholder.com/15/9e0168/000000?text=+) `#9e0168` | -| lemon yellow | ![#fdff38](https://via.placeholder.com/15/fdff38/000000?text=+) `#fdff38` | -| pistachio | ![#c0fa8b](https://via.placeholder.com/15/c0fa8b/000000?text=+) `#c0fa8b` | -| dull yellow | ![#eedc5b](https://via.placeholder.com/15/eedc5b/000000?text=+) `#eedc5b` | -| dark lime green | ![#7ebd01](https://via.placeholder.com/15/7ebd01/000000?text=+) `#7ebd01` | -| denim blue | ![#3b5b92](https://via.placeholder.com/15/3b5b92/000000?text=+) `#3b5b92` | -| teal blue | ![#01889f](https://via.placeholder.com/15/01889f/000000?text=+) `#01889f` | -| lightish blue | ![#3d7afd](https://via.placeholder.com/15/3d7afd/000000?text=+) `#3d7afd` | -| purpley blue | ![#5f34e7](https://via.placeholder.com/15/5f34e7/000000?text=+) `#5f34e7` | -| light indigo | ![#6d5acf](https://via.placeholder.com/15/6d5acf/000000?text=+) `#6d5acf` | -| swamp green | ![#748500](https://via.placeholder.com/15/748500/000000?text=+) `#748500` | -| brown green | ![#706c11](https://via.placeholder.com/15/706c11/000000?text=+) `#706c11` | -| dark maroon | ![#3c0008](https://via.placeholder.com/15/3c0008/000000?text=+) `#3c0008` | -| hot purple | ![#cb00f5](https://via.placeholder.com/15/cb00f5/000000?text=+) `#cb00f5` | -| dark forest green | ![#002d04](https://via.placeholder.com/15/002d04/000000?text=+) `#002d04` | -| faded blue | ![#658cbb](https://via.placeholder.com/15/658cbb/000000?text=+) `#658cbb` | -| drab green | ![#749551](https://via.placeholder.com/15/749551/000000?text=+) `#749551` | -| light lime green | ![#b9ff66](https://via.placeholder.com/15/b9ff66/000000?text=+) `#b9ff66` | -| snot green | ![#9dc100](https://via.placeholder.com/15/9dc100/000000?text=+) `#9dc100` | -| yellowish | ![#faee66](https://via.placeholder.com/15/faee66/000000?text=+) `#faee66` | -| light blue green | ![#7efbb3](https://via.placeholder.com/15/7efbb3/000000?text=+) `#7efbb3` | -| bordeaux | ![#7b002c](https://via.placeholder.com/15/7b002c/000000?text=+) `#7b002c` | -| light mauve | ![#c292a1](https://via.placeholder.com/15/c292a1/000000?text=+) `#c292a1` | -| ocean | ![#017b92](https://via.placeholder.com/15/017b92/000000?text=+) `#017b92` | -| marigold | ![#fcc006](https://via.placeholder.com/15/fcc006/000000?text=+) `#fcc006` | -| muddy green | ![#657432](https://via.placeholder.com/15/657432/000000?text=+) `#657432` | -| dull orange | ![#d8863b](https://via.placeholder.com/15/d8863b/000000?text=+) `#d8863b` | -| steel | ![#738595](https://via.placeholder.com/15/738595/000000?text=+) `#738595` | -| electric purple | ![#aa23ff](https://via.placeholder.com/15/aa23ff/000000?text=+) `#aa23ff` | -| fluorescent green | ![#08ff08](https://via.placeholder.com/15/08ff08/000000?text=+) `#08ff08` | -| yellowish brown | ![#9b7a01](https://via.placeholder.com/15/9b7a01/000000?text=+) `#9b7a01` | -| blush | ![#f29e8e](https://via.placeholder.com/15/f29e8e/000000?text=+) `#f29e8e` | -| soft green | ![#6fc276](https://via.placeholder.com/15/6fc276/000000?text=+) `#6fc276` | -| bright orange | ![#ff5b00](https://via.placeholder.com/15/ff5b00/000000?text=+) `#ff5b00` | -| lemon | ![#fdff52](https://via.placeholder.com/15/fdff52/000000?text=+) `#fdff52` | -| purple grey | ![#866f85](https://via.placeholder.com/15/866f85/000000?text=+) `#866f85` | -| acid green | ![#8ffe09](https://via.placeholder.com/15/8ffe09/000000?text=+) `#8ffe09` | -| pale lavender | ![#eecffe](https://via.placeholder.com/15/eecffe/000000?text=+) `#eecffe` | -| violet blue | ![#510ac9](https://via.placeholder.com/15/510ac9/000000?text=+) `#510ac9` | -| light forest green | ![#4f9153](https://via.placeholder.com/15/4f9153/000000?text=+) `#4f9153` | -| burnt red | ![#9f2305](https://via.placeholder.com/15/9f2305/000000?text=+) `#9f2305` | -| khaki green | ![#728639](https://via.placeholder.com/15/728639/000000?text=+) `#728639` | -| cerise | ![#de0c62](https://via.placeholder.com/15/de0c62/000000?text=+) `#de0c62` | -| faded purple | ![#916e99](https://via.placeholder.com/15/916e99/000000?text=+) `#916e99` | -| apricot | ![#ffb16d](https://via.placeholder.com/15/ffb16d/000000?text=+) `#ffb16d` | -| dark olive green | ![#3c4d03](https://via.placeholder.com/15/3c4d03/000000?text=+) `#3c4d03` | -| grey brown | ![#7f7053](https://via.placeholder.com/15/7f7053/000000?text=+) `#7f7053` | -| green grey | ![#77926f](https://via.placeholder.com/15/77926f/000000?text=+) `#77926f` | -| true blue | ![#010fcc](https://via.placeholder.com/15/010fcc/000000?text=+) `#010fcc` | -| pale violet | ![#ceaefa](https://via.placeholder.com/15/ceaefa/000000?text=+) `#ceaefa` | -| periwinkle blue | ![#8f99fb](https://via.placeholder.com/15/8f99fb/000000?text=+) `#8f99fb` | -| light sky blue | ![#c6fcff](https://via.placeholder.com/15/c6fcff/000000?text=+) `#c6fcff` | -| blurple | ![#5539cc](https://via.placeholder.com/15/5539cc/000000?text=+) `#5539cc` | -| green brown | ![#544e03](https://via.placeholder.com/15/544e03/000000?text=+) `#544e03` | -| bluegreen | ![#017a79](https://via.placeholder.com/15/017a79/000000?text=+) `#017a79` | -| bright teal | ![#01f9c6](https://via.placeholder.com/15/01f9c6/000000?text=+) `#01f9c6` | -| brownish yellow | ![#c9b003](https://via.placeholder.com/15/c9b003/000000?text=+) `#c9b003` | -| pea soup | ![#929901](https://via.placeholder.com/15/929901/000000?text=+) `#929901` | -| forest | ![#0b5509](https://via.placeholder.com/15/0b5509/000000?text=+) `#0b5509` | -| barney purple | ![#a00498](https://via.placeholder.com/15/a00498/000000?text=+) `#a00498` | -| ultramarine | ![#2000b1](https://via.placeholder.com/15/2000b1/000000?text=+) `#2000b1` | -| purplish | ![#94568c](https://via.placeholder.com/15/94568c/000000?text=+) `#94568c` | -| puke yellow | ![#c2be0e](https://via.placeholder.com/15/c2be0e/000000?text=+) `#c2be0e` | -| bluish grey | ![#748b97](https://via.placeholder.com/15/748b97/000000?text=+) `#748b97` | -| dark periwinkle | ![#665fd1](https://via.placeholder.com/15/665fd1/000000?text=+) `#665fd1` | -| dark lilac | ![#9c6da5](https://via.placeholder.com/15/9c6da5/000000?text=+) `#9c6da5` | -| reddish | ![#c44240](https://via.placeholder.com/15/c44240/000000?text=+) `#c44240` | -| light maroon | ![#a24857](https://via.placeholder.com/15/a24857/000000?text=+) `#a24857` | -| dusty purple | ![#825f87](https://via.placeholder.com/15/825f87/000000?text=+) `#825f87` | -| terra cotta | ![#c9643b](https://via.placeholder.com/15/c9643b/000000?text=+) `#c9643b` | -| avocado | ![#90b134](https://via.placeholder.com/15/90b134/000000?text=+) `#90b134` | -| marine blue | ![#01386a](https://via.placeholder.com/15/01386a/000000?text=+) `#01386a` | -| teal green | ![#25a36f](https://via.placeholder.com/15/25a36f/000000?text=+) `#25a36f` | -| slate grey | ![#59656d](https://via.placeholder.com/15/59656d/000000?text=+) `#59656d` | -| lighter green | ![#75fd63](https://via.placeholder.com/15/75fd63/000000?text=+) `#75fd63` | -| electric green | ![#21fc0d](https://via.placeholder.com/15/21fc0d/000000?text=+) `#21fc0d` | -| dusty blue | ![#5a86ad](https://via.placeholder.com/15/5a86ad/000000?text=+) `#5a86ad` | -| golden yellow | ![#fec615](https://via.placeholder.com/15/fec615/000000?text=+) `#fec615` | -| bright yellow | ![#fffd01](https://via.placeholder.com/15/fffd01/000000?text=+) `#fffd01` | -| light lavender | ![#dfc5fe](https://via.placeholder.com/15/dfc5fe/000000?text=+) `#dfc5fe` | -| umber | ![#b26400](https://via.placeholder.com/15/b26400/000000?text=+) `#b26400` | -| poop | ![#7f5e00](https://via.placeholder.com/15/7f5e00/000000?text=+) `#7f5e00` | -| dark peach | ![#de7e5d](https://via.placeholder.com/15/de7e5d/000000?text=+) `#de7e5d` | -| jungle green | ![#048243](https://via.placeholder.com/15/048243/000000?text=+) `#048243` | -| eggshell | ![#ffffd4](https://via.placeholder.com/15/ffffd4/000000?text=+) `#ffffd4` | -| denim | ![#3b638c](https://via.placeholder.com/15/3b638c/000000?text=+) `#3b638c` | -| yellow brown | ![#b79400](https://via.placeholder.com/15/b79400/000000?text=+) `#b79400` | -| dull purple | ![#84597e](https://via.placeholder.com/15/84597e/000000?text=+) `#84597e` | -| chocolate brown | ![#411900](https://via.placeholder.com/15/411900/000000?text=+) `#411900` | -| wine red | ![#7b0323](https://via.placeholder.com/15/7b0323/000000?text=+) `#7b0323` | -| neon blue | ![#04d9ff](https://via.placeholder.com/15/04d9ff/000000?text=+) `#04d9ff` | -| dirty green | ![#667e2c](https://via.placeholder.com/15/667e2c/000000?text=+) `#667e2c` | -| light tan | ![#fbeeac](https://via.placeholder.com/15/fbeeac/000000?text=+) `#fbeeac` | -| ice blue | ![#d7fffe](https://via.placeholder.com/15/d7fffe/000000?text=+) `#d7fffe` | -| cadet blue | ![#4e7496](https://via.placeholder.com/15/4e7496/000000?text=+) `#4e7496` | -| dark mauve | ![#874c62](https://via.placeholder.com/15/874c62/000000?text=+) `#874c62` | -| very light blue | ![#d5ffff](https://via.placeholder.com/15/d5ffff/000000?text=+) `#d5ffff` | -| grey purple | ![#826d8c](https://via.placeholder.com/15/826d8c/000000?text=+) `#826d8c` | -| pastel pink | ![#ffbacd](https://via.placeholder.com/15/ffbacd/000000?text=+) `#ffbacd` | -| very light green | ![#d1ffbd](https://via.placeholder.com/15/d1ffbd/000000?text=+) `#d1ffbd` | -| dark sky blue | ![#448ee4](https://via.placeholder.com/15/448ee4/000000?text=+) `#448ee4` | -| evergreen | ![#05472a](https://via.placeholder.com/15/05472a/000000?text=+) `#05472a` | -| dull pink | ![#d5869d](https://via.placeholder.com/15/d5869d/000000?text=+) `#d5869d` | -| aubergine | ![#3d0734](https://via.placeholder.com/15/3d0734/000000?text=+) `#3d0734` | -| mahogany | ![#4a0100](https://via.placeholder.com/15/4a0100/000000?text=+) `#4a0100` | -| reddish orange | ![#f8481c](https://via.placeholder.com/15/f8481c/000000?text=+) `#f8481c` | -| deep green | ![#02590f](https://via.placeholder.com/15/02590f/000000?text=+) `#02590f` | -| vomit green | ![#89a203](https://via.placeholder.com/15/89a203/000000?text=+) `#89a203` | -| purple pink | ![#e03fd8](https://via.placeholder.com/15/e03fd8/000000?text=+) `#e03fd8` | -| dusty pink | ![#d58a94](https://via.placeholder.com/15/d58a94/000000?text=+) `#d58a94` | -| faded green | ![#7bb274](https://via.placeholder.com/15/7bb274/000000?text=+) `#7bb274` | -| camo green | ![#526525](https://via.placeholder.com/15/526525/000000?text=+) `#526525` | -| pinky purple | ![#c94cbe](https://via.placeholder.com/15/c94cbe/000000?text=+) `#c94cbe` | -| pink purple | ![#db4bda](https://via.placeholder.com/15/db4bda/000000?text=+) `#db4bda` | -| brownish red | ![#9e3623](https://via.placeholder.com/15/9e3623/000000?text=+) `#9e3623` | -| dark rose | ![#b5485d](https://via.placeholder.com/15/b5485d/000000?text=+) `#b5485d` | -| mud | ![#735c12](https://via.placeholder.com/15/735c12/000000?text=+) `#735c12` | -| brownish | ![#9c6d57](https://via.placeholder.com/15/9c6d57/000000?text=+) `#9c6d57` | -| emerald green | ![#028f1e](https://via.placeholder.com/15/028f1e/000000?text=+) `#028f1e` | -| pale brown | ![#b1916e](https://via.placeholder.com/15/b1916e/000000?text=+) `#b1916e` | -| dull blue | ![#49759c](https://via.placeholder.com/15/49759c/000000?text=+) `#49759c` | -| burnt umber | ![#a0450e](https://via.placeholder.com/15/a0450e/000000?text=+) `#a0450e` | -| medium green | ![#39ad48](https://via.placeholder.com/15/39ad48/000000?text=+) `#39ad48` | -| clay | ![#b66a50](https://via.placeholder.com/15/b66a50/000000?text=+) `#b66a50` | -| light aqua | ![#8cffdb](https://via.placeholder.com/15/8cffdb/000000?text=+) `#8cffdb` | -| light olive green | ![#a4be5c](https://via.placeholder.com/15/a4be5c/000000?text=+) `#a4be5c` | -| brownish orange | ![#cb7723](https://via.placeholder.com/15/cb7723/000000?text=+) `#cb7723` | -| dark aqua | ![#05696b](https://via.placeholder.com/15/05696b/000000?text=+) `#05696b` | -| purplish pink | ![#ce5dae](https://via.placeholder.com/15/ce5dae/000000?text=+) `#ce5dae` | -| dark salmon | ![#c85a53](https://via.placeholder.com/15/c85a53/000000?text=+) `#c85a53` | -| greenish grey | ![#96ae8d](https://via.placeholder.com/15/96ae8d/000000?text=+) `#96ae8d` | -| jade | ![#1fa774](https://via.placeholder.com/15/1fa774/000000?text=+) `#1fa774` | -| ugly green | ![#7a9703](https://via.placeholder.com/15/7a9703/000000?text=+) `#7a9703` | -| dark beige | ![#ac9362](https://via.placeholder.com/15/ac9362/000000?text=+) `#ac9362` | -| emerald | ![#01a049](https://via.placeholder.com/15/01a049/000000?text=+) `#01a049` | -| pale red | ![#d9544d](https://via.placeholder.com/15/d9544d/000000?text=+) `#d9544d` | -| light magenta | ![#fa5ff7](https://via.placeholder.com/15/fa5ff7/000000?text=+) `#fa5ff7` | -| sky | ![#82cafc](https://via.placeholder.com/15/82cafc/000000?text=+) `#82cafc` | -| light cyan | ![#acfffc](https://via.placeholder.com/15/acfffc/000000?text=+) `#acfffc` | -| yellow orange | ![#fcb001](https://via.placeholder.com/15/fcb001/000000?text=+) `#fcb001` | -| reddish purple | ![#910951](https://via.placeholder.com/15/910951/000000?text=+) `#910951` | -| reddish pink | ![#fe2c54](https://via.placeholder.com/15/fe2c54/000000?text=+) `#fe2c54` | -| orchid | ![#c875c4](https://via.placeholder.com/15/c875c4/000000?text=+) `#c875c4` | -| dirty yellow | ![#cdc50a](https://via.placeholder.com/15/cdc50a/000000?text=+) `#cdc50a` | -| orange red | ![#fd411e](https://via.placeholder.com/15/fd411e/000000?text=+) `#fd411e` | -| deep red | ![#9a0200](https://via.placeholder.com/15/9a0200/000000?text=+) `#9a0200` | -| orange brown | ![#be6400](https://via.placeholder.com/15/be6400/000000?text=+) `#be6400` | -| cobalt blue | ![#030aa7](https://via.placeholder.com/15/030aa7/000000?text=+) `#030aa7` | -| neon pink | ![#fe019a](https://via.placeholder.com/15/fe019a/000000?text=+) `#fe019a` | -| rose pink | ![#f7879a](https://via.placeholder.com/15/f7879a/000000?text=+) `#f7879a` | -| greyish purple | ![#887191](https://via.placeholder.com/15/887191/000000?text=+) `#887191` | -| raspberry | ![#b00149](https://via.placeholder.com/15/b00149/000000?text=+) `#b00149` | -| aqua green | ![#12e193](https://via.placeholder.com/15/12e193/000000?text=+) `#12e193` | -| salmon pink | ![#fe7b7c](https://via.placeholder.com/15/fe7b7c/000000?text=+) `#fe7b7c` | -| tangerine | ![#ff9408](https://via.placeholder.com/15/ff9408/000000?text=+) `#ff9408` | -| brownish green | ![#6a6e09](https://via.placeholder.com/15/6a6e09/000000?text=+) `#6a6e09` | -| red brown | ![#8b2e16](https://via.placeholder.com/15/8b2e16/000000?text=+) `#8b2e16` | -| greenish brown | ![#696112](https://via.placeholder.com/15/696112/000000?text=+) `#696112` | -| pumpkin | ![#e17701](https://via.placeholder.com/15/e17701/000000?text=+) `#e17701` | -| pine green | ![#0a481e](https://via.placeholder.com/15/0a481e/000000?text=+) `#0a481e` | -| charcoal | ![#343837](https://via.placeholder.com/15/343837/000000?text=+) `#343837` | -| baby pink | ![#ffb7ce](https://via.placeholder.com/15/ffb7ce/000000?text=+) `#ffb7ce` | -| cornflower | ![#6a79f7](https://via.placeholder.com/15/6a79f7/000000?text=+) `#6a79f7` | -| blue violet | ![#5d06e9](https://via.placeholder.com/15/5d06e9/000000?text=+) `#5d06e9` | -| chocolate | ![#3d1c02](https://via.placeholder.com/15/3d1c02/000000?text=+) `#3d1c02` | -| greyish green | ![#82a67d](https://via.placeholder.com/15/82a67d/000000?text=+) `#82a67d` | -| scarlet | ![#be0119](https://via.placeholder.com/15/be0119/000000?text=+) `#be0119` | -| green yellow | ![#c9ff27](https://via.placeholder.com/15/c9ff27/000000?text=+) `#c9ff27` | -| dark olive | ![#373e02](https://via.placeholder.com/15/373e02/000000?text=+) `#373e02` | -| sienna | ![#a9561e](https://via.placeholder.com/15/a9561e/000000?text=+) `#a9561e` | -| pastel purple | ![#caa0ff](https://via.placeholder.com/15/caa0ff/000000?text=+) `#caa0ff` | -| terracotta | ![#ca6641](https://via.placeholder.com/15/ca6641/000000?text=+) `#ca6641` | -| aqua blue | ![#02d8e9](https://via.placeholder.com/15/02d8e9/000000?text=+) `#02d8e9` | -| sage green | ![#88b378](https://via.placeholder.com/15/88b378/000000?text=+) `#88b378` | -| blood red | ![#980002](https://via.placeholder.com/15/980002/000000?text=+) `#980002` | -| deep pink | ![#cb0162](https://via.placeholder.com/15/cb0162/000000?text=+) `#cb0162` | -| grass | ![#5cac2d](https://via.placeholder.com/15/5cac2d/000000?text=+) `#5cac2d` | -| moss | ![#769958](https://via.placeholder.com/15/769958/000000?text=+) `#769958` | -| pastel blue | ![#a2bffe](https://via.placeholder.com/15/a2bffe/000000?text=+) `#a2bffe` | -| bluish green | ![#10a674](https://via.placeholder.com/15/10a674/000000?text=+) `#10a674` | -| green blue | ![#06b48b](https://via.placeholder.com/15/06b48b/000000?text=+) `#06b48b` | -| dark tan | ![#af884a](https://via.placeholder.com/15/af884a/000000?text=+) `#af884a` | -| greenish blue | ![#0b8b87](https://via.placeholder.com/15/0b8b87/000000?text=+) `#0b8b87` | -| pale orange | ![#ffa756](https://via.placeholder.com/15/ffa756/000000?text=+) `#ffa756` | -| vomit | ![#a2a415](https://via.placeholder.com/15/a2a415/000000?text=+) `#a2a415` | -| forrest green | ![#154406](https://via.placeholder.com/15/154406/000000?text=+) `#154406` | -| dark lavender | ![#856798](https://via.placeholder.com/15/856798/000000?text=+) `#856798` | -| dark violet | ![#34013f](https://via.placeholder.com/15/34013f/000000?text=+) `#34013f` | -| purple blue | ![#632de9](https://via.placeholder.com/15/632de9/000000?text=+) `#632de9` | -| dark cyan | ![#0a888a](https://via.placeholder.com/15/0a888a/000000?text=+) `#0a888a` | -| olive drab | ![#6f7632](https://via.placeholder.com/15/6f7632/000000?text=+) `#6f7632` | -| pinkish | ![#d46a7e](https://via.placeholder.com/15/d46a7e/000000?text=+) `#d46a7e` | -| cobalt | ![#1e488f](https://via.placeholder.com/15/1e488f/000000?text=+) `#1e488f` | -| neon purple | ![#bc13fe](https://via.placeholder.com/15/bc13fe/000000?text=+) `#bc13fe` | -| light turquoise | ![#7ef4cc](https://via.placeholder.com/15/7ef4cc/000000?text=+) `#7ef4cc` | -| apple green | ![#76cd26](https://via.placeholder.com/15/76cd26/000000?text=+) `#76cd26` | -| dull green | ![#74a662](https://via.placeholder.com/15/74a662/000000?text=+) `#74a662` | -| wine | ![#80013f](https://via.placeholder.com/15/80013f/000000?text=+) `#80013f` | -| powder blue | ![#b1d1fc](https://via.placeholder.com/15/b1d1fc/000000?text=+) `#b1d1fc` | -| off white | ![#ffffe4](https://via.placeholder.com/15/ffffe4/000000?text=+) `#ffffe4` | -| electric blue | ![#0652ff](https://via.placeholder.com/15/0652ff/000000?text=+) `#0652ff` | -| dark turquoise | ![#045c5a](https://via.placeholder.com/15/045c5a/000000?text=+) `#045c5a` | -| blue purple | ![#5729ce](https://via.placeholder.com/15/5729ce/000000?text=+) `#5729ce` | -| azure | ![#069af3](https://via.placeholder.com/15/069af3/000000?text=+) `#069af3` | -| bright red | ![#ff000d](https://via.placeholder.com/15/ff000d/000000?text=+) `#ff000d` | -| pinkish red | ![#f10c45](https://via.placeholder.com/15/f10c45/000000?text=+) `#f10c45` | -| cornflower blue | ![#5170d7](https://via.placeholder.com/15/5170d7/000000?text=+) `#5170d7` | -| light olive | ![#acbf69](https://via.placeholder.com/15/acbf69/000000?text=+) `#acbf69` | -| grape | ![#6c3461](https://via.placeholder.com/15/6c3461/000000?text=+) `#6c3461` | -| greyish blue | ![#5e819d](https://via.placeholder.com/15/5e819d/000000?text=+) `#5e819d` | -| purplish blue | ![#601ef9](https://via.placeholder.com/15/601ef9/000000?text=+) `#601ef9` | -| yellowish green | ![#b0dd16](https://via.placeholder.com/15/b0dd16/000000?text=+) `#b0dd16` | -| greenish yellow | ![#cdfd02](https://via.placeholder.com/15/cdfd02/000000?text=+) `#cdfd02` | -| medium blue | ![#2c6fbb](https://via.placeholder.com/15/2c6fbb/000000?text=+) `#2c6fbb` | -| dusty rose | ![#c0737a](https://via.placeholder.com/15/c0737a/000000?text=+) `#c0737a` | -| light violet | ![#d6b4fc](https://via.placeholder.com/15/d6b4fc/000000?text=+) `#d6b4fc` | -| midnight blue | ![#020035](https://via.placeholder.com/15/020035/000000?text=+) `#020035` | -| bluish purple | ![#703be7](https://via.placeholder.com/15/703be7/000000?text=+) `#703be7` | -| red orange | ![#fd3c06](https://via.placeholder.com/15/fd3c06/000000?text=+) `#fd3c06` | -| dark magenta | ![#960056](https://via.placeholder.com/15/960056/000000?text=+) `#960056` | -| greenish | ![#40a368](https://via.placeholder.com/15/40a368/000000?text=+) `#40a368` | -| ocean blue | ![#03719c](https://via.placeholder.com/15/03719c/000000?text=+) `#03719c` | -| coral | ![#fc5a50](https://via.placeholder.com/15/fc5a50/000000?text=+) `#fc5a50` | -| cream | ![#ffffc2](https://via.placeholder.com/15/ffffc2/000000?text=+) `#ffffc2` | -| reddish brown | ![#7f2b0a](https://via.placeholder.com/15/7f2b0a/000000?text=+) `#7f2b0a` | -| burnt sienna | ![#b04e0f](https://via.placeholder.com/15/b04e0f/000000?text=+) `#b04e0f` | -| brick | ![#a03623](https://via.placeholder.com/15/a03623/000000?text=+) `#a03623` | -| sage | ![#87ae73](https://via.placeholder.com/15/87ae73/000000?text=+) `#87ae73` | -| grey green | ![#789b73](https://via.placeholder.com/15/789b73/000000?text=+) `#789b73` | -| white | ![#ffffff](https://via.placeholder.com/15/ffffff/000000?text=+) `#ffffff` | -| robin's egg blue | ![#98eff9](https://via.placeholder.com/15/98eff9/000000?text=+) `#98eff9` | -| moss green | ![#658b38](https://via.placeholder.com/15/658b38/000000?text=+) `#658b38` | -| steel blue | ![#5a7d9a](https://via.placeholder.com/15/5a7d9a/000000?text=+) `#5a7d9a` | -| eggplant | ![#380835](https://via.placeholder.com/15/380835/000000?text=+) `#380835` | -| light yellow | ![#fffe7a](https://via.placeholder.com/15/fffe7a/000000?text=+) `#fffe7a` | -| leaf green | ![#5ca904](https://via.placeholder.com/15/5ca904/000000?text=+) `#5ca904` | -| light grey | ![#d8dcd6](https://via.placeholder.com/15/d8dcd6/000000?text=+) `#d8dcd6` | -| puke | ![#a5a502](https://via.placeholder.com/15/a5a502/000000?text=+) `#a5a502` | -| pinkish purple | ![#d648d7](https://via.placeholder.com/15/d648d7/000000?text=+) `#d648d7` | -| sea blue | ![#047495](https://via.placeholder.com/15/047495/000000?text=+) `#047495` | -| pale purple | ![#b790d4](https://via.placeholder.com/15/b790d4/000000?text=+) `#b790d4` | -| slate blue | ![#5b7c99](https://via.placeholder.com/15/5b7c99/000000?text=+) `#5b7c99` | -| blue grey | ![#607c8e](https://via.placeholder.com/15/607c8e/000000?text=+) `#607c8e` | -| hunter green | ![#0b4008](https://via.placeholder.com/15/0b4008/000000?text=+) `#0b4008` | -| fuchsia | ![#ed0dd9](https://via.placeholder.com/15/ed0dd9/000000?text=+) `#ed0dd9` | -| crimson | ![#8c000f](https://via.placeholder.com/15/8c000f/000000?text=+) `#8c000f` | -| pale yellow | ![#ffff84](https://via.placeholder.com/15/ffff84/000000?text=+) `#ffff84` | -| ochre | ![#bf9005](https://via.placeholder.com/15/bf9005/000000?text=+) `#bf9005` | -| mustard yellow | ![#d2bd0a](https://via.placeholder.com/15/d2bd0a/000000?text=+) `#d2bd0a` | -| light red | ![#ff474c](https://via.placeholder.com/15/ff474c/000000?text=+) `#ff474c` | -| cerulean | ![#0485d1](https://via.placeholder.com/15/0485d1/000000?text=+) `#0485d1` | -| pale pink | ![#ffcfdc](https://via.placeholder.com/15/ffcfdc/000000?text=+) `#ffcfdc` | -| deep blue | ![#040273](https://via.placeholder.com/15/040273/000000?text=+) `#040273` | -| rust | ![#a83c09](https://via.placeholder.com/15/a83c09/000000?text=+) `#a83c09` | -| light teal | ![#90e4c1](https://via.placeholder.com/15/90e4c1/000000?text=+) `#90e4c1` | -| slate | ![#516572](https://via.placeholder.com/15/516572/000000?text=+) `#516572` | -| goldenrod | ![#fac205](https://via.placeholder.com/15/fac205/000000?text=+) `#fac205` | -| dark yellow | ![#d5b60a](https://via.placeholder.com/15/d5b60a/000000?text=+) `#d5b60a` | -| dark grey | ![#363737](https://via.placeholder.com/15/363737/000000?text=+) `#363737` | -| army green | ![#4b5d16](https://via.placeholder.com/15/4b5d16/000000?text=+) `#4b5d16` | -| grey blue | ![#6b8ba4](https://via.placeholder.com/15/6b8ba4/000000?text=+) `#6b8ba4` | -| seafoam | ![#80f9ad](https://via.placeholder.com/15/80f9ad/000000?text=+) `#80f9ad` | -| puce | ![#a57e52](https://via.placeholder.com/15/a57e52/000000?text=+) `#a57e52` | -| spring green | ![#a9f971](https://via.placeholder.com/15/a9f971/000000?text=+) `#a9f971` | -| dark orange | ![#c65102](https://via.placeholder.com/15/c65102/000000?text=+) `#c65102` | -| sand | ![#e2ca76](https://via.placeholder.com/15/e2ca76/000000?text=+) `#e2ca76` | -| pastel green | ![#b0ff9d](https://via.placeholder.com/15/b0ff9d/000000?text=+) `#b0ff9d` | -| mint | ![#9ffeb0](https://via.placeholder.com/15/9ffeb0/000000?text=+) `#9ffeb0` | -| light orange | ![#fdaa48](https://via.placeholder.com/15/fdaa48/000000?text=+) `#fdaa48` | -| bright pink | ![#fe01b1](https://via.placeholder.com/15/fe01b1/000000?text=+) `#fe01b1` | -| chartreuse | ![#c1f80a](https://via.placeholder.com/15/c1f80a/000000?text=+) `#c1f80a` | -| deep purple | ![#36013f](https://via.placeholder.com/15/36013f/000000?text=+) `#36013f` | -| dark brown | ![#341c02](https://via.placeholder.com/15/341c02/000000?text=+) `#341c02` | -| taupe | ![#b9a281](https://via.placeholder.com/15/b9a281/000000?text=+) `#b9a281` | -| pea green | ![#8eab12](https://via.placeholder.com/15/8eab12/000000?text=+) `#8eab12` | -| puke green | ![#9aae07](https://via.placeholder.com/15/9aae07/000000?text=+) `#9aae07` | -| kelly green | ![#02ab2e](https://via.placeholder.com/15/02ab2e/000000?text=+) `#02ab2e` | -| seafoam green | ![#7af9ab](https://via.placeholder.com/15/7af9ab/000000?text=+) `#7af9ab` | -| blue green | ![#137e6d](https://via.placeholder.com/15/137e6d/000000?text=+) `#137e6d` | -| khaki | ![#aaa662](https://via.placeholder.com/15/aaa662/000000?text=+) `#aaa662` | -| burgundy | ![#610023](https://via.placeholder.com/15/610023/000000?text=+) `#610023` | -| dark teal | ![#014d4e](https://via.placeholder.com/15/014d4e/000000?text=+) `#014d4e` | -| brick red | ![#8f1402](https://via.placeholder.com/15/8f1402/000000?text=+) `#8f1402` | -| royal purple | ![#4b006e](https://via.placeholder.com/15/4b006e/000000?text=+) `#4b006e` | -| plum | ![#580f41](https://via.placeholder.com/15/580f41/000000?text=+) `#580f41` | -| mint green | ![#8fff9f](https://via.placeholder.com/15/8fff9f/000000?text=+) `#8fff9f` | -| gold | ![#dbb40c](https://via.placeholder.com/15/dbb40c/000000?text=+) `#dbb40c` | -| baby blue | ![#a2cffe](https://via.placeholder.com/15/a2cffe/000000?text=+) `#a2cffe` | -| yellow green | ![#c0fb2d](https://via.placeholder.com/15/c0fb2d/000000?text=+) `#c0fb2d` | -| bright purple | ![#be03fd](https://via.placeholder.com/15/be03fd/000000?text=+) `#be03fd` | -| dark red | ![#840000](https://via.placeholder.com/15/840000/000000?text=+) `#840000` | -| pale blue | ![#d0fefe](https://via.placeholder.com/15/d0fefe/000000?text=+) `#d0fefe` | -| grass green | ![#3f9b0b](https://via.placeholder.com/15/3f9b0b/000000?text=+) `#3f9b0b` | -| navy | ![#01153e](https://via.placeholder.com/15/01153e/000000?text=+) `#01153e` | -| aquamarine | ![#04d8b2](https://via.placeholder.com/15/04d8b2/000000?text=+) `#04d8b2` | -| burnt orange | ![#c04e01](https://via.placeholder.com/15/c04e01/000000?text=+) `#c04e01` | -| neon green | ![#0cff0c](https://via.placeholder.com/15/0cff0c/000000?text=+) `#0cff0c` | -| bright blue | ![#0165fc](https://via.placeholder.com/15/0165fc/000000?text=+) `#0165fc` | -| rose | ![#cf6275](https://via.placeholder.com/15/cf6275/000000?text=+) `#cf6275` | -| light pink | ![#ffd1df](https://via.placeholder.com/15/ffd1df/000000?text=+) `#ffd1df` | -| mustard | ![#ceb301](https://via.placeholder.com/15/ceb301/000000?text=+) `#ceb301` | -| indigo | ![#380282](https://via.placeholder.com/15/380282/000000?text=+) `#380282` | -| lime | ![#aaff32](https://via.placeholder.com/15/aaff32/000000?text=+) `#aaff32` | -| sea green | ![#53fca1](https://via.placeholder.com/15/53fca1/000000?text=+) `#53fca1` | -| periwinkle | ![#8e82fe](https://via.placeholder.com/15/8e82fe/000000?text=+) `#8e82fe` | -| dark pink | ![#cb416b](https://via.placeholder.com/15/cb416b/000000?text=+) `#cb416b` | -| olive green | ![#677a04](https://via.placeholder.com/15/677a04/000000?text=+) `#677a04` | -| peach | ![#ffb07c](https://via.placeholder.com/15/ffb07c/000000?text=+) `#ffb07c` | -| pale green | ![#c7fdb5](https://via.placeholder.com/15/c7fdb5/000000?text=+) `#c7fdb5` | -| light brown | ![#ad8150](https://via.placeholder.com/15/ad8150/000000?text=+) `#ad8150` | -| hot pink | ![#ff028d](https://via.placeholder.com/15/ff028d/000000?text=+) `#ff028d` | -| black | ![#000000](https://via.placeholder.com/15/000000/000000?text=+) `#000000` | -| lilac | ![#cea2fd](https://via.placeholder.com/15/cea2fd/000000?text=+) `#cea2fd` | -| navy blue | ![#001146](https://via.placeholder.com/15/001146/000000?text=+) `#001146` | -| royal blue | ![#0504aa](https://via.placeholder.com/15/0504aa/000000?text=+) `#0504aa` | -| beige | ![#e6daa6](https://via.placeholder.com/15/e6daa6/000000?text=+) `#e6daa6` | -| salmon | ![#ff796c](https://via.placeholder.com/15/ff796c/000000?text=+) `#ff796c` | -| olive | ![#6e750e](https://via.placeholder.com/15/6e750e/000000?text=+) `#6e750e` | -| maroon | ![#650021](https://via.placeholder.com/15/650021/000000?text=+) `#650021` | -| bright green | ![#01ff07](https://via.placeholder.com/15/01ff07/000000?text=+) `#01ff07` | -| dark purple | ![#35063e](https://via.placeholder.com/15/35063e/000000?text=+) `#35063e` | -| mauve | ![#ae7181](https://via.placeholder.com/15/ae7181/000000?text=+) `#ae7181` | -| forest green | ![#06470c](https://via.placeholder.com/15/06470c/000000?text=+) `#06470c` | -| aqua | ![#13eac9](https://via.placeholder.com/15/13eac9/000000?text=+) `#13eac9` | -| cyan | ![#00ffff](https://via.placeholder.com/15/00ffff/000000?text=+) `#00ffff` | -| tan | ![#d1b26f](https://via.placeholder.com/15/d1b26f/000000?text=+) `#d1b26f` | -| dark blue | ![#00035b](https://via.placeholder.com/15/00035b/000000?text=+) `#00035b` | -| lavender | ![#c79fef](https://via.placeholder.com/15/c79fef/000000?text=+) `#c79fef` | -| turquoise | ![#06c2ac](https://via.placeholder.com/15/06c2ac/000000?text=+) `#06c2ac` | -| dark green | ![#033500](https://via.placeholder.com/15/033500/000000?text=+) `#033500` | -| violet | ![#9a0eea](https://via.placeholder.com/15/9a0eea/000000?text=+) `#9a0eea` | -| light purple | ![#bf77f6](https://via.placeholder.com/15/bf77f6/000000?text=+) `#bf77f6` | -| lime green | ![#89fe05](https://via.placeholder.com/15/89fe05/000000?text=+) `#89fe05` | -| grey | ![#929591](https://via.placeholder.com/15/929591/000000?text=+) `#929591` | -| sky blue | ![#75bbfd](https://via.placeholder.com/15/75bbfd/000000?text=+) `#75bbfd` | -| yellow | ![#ffff14](https://via.placeholder.com/15/ffff14/000000?text=+) `#ffff14` | -| magenta | ![#c20078](https://via.placeholder.com/15/c20078/000000?text=+) `#c20078` | -| light green | ![#96f97b](https://via.placeholder.com/15/96f97b/000000?text=+) `#96f97b` | -| orange | ![#f97306](https://via.placeholder.com/15/f97306/000000?text=+) `#f97306` | -| teal | ![#029386](https://via.placeholder.com/15/029386/000000?text=+) `#029386` | -| light blue | ![#95d0fc](https://via.placeholder.com/15/95d0fc/000000?text=+) `#95d0fc` | -| red | ![#e50000](https://via.placeholder.com/15/e50000/000000?text=+) `#e50000` | -| brown | ![#653700](https://via.placeholder.com/15/653700/000000?text=+) `#653700` | -| pink | ![#ff81c0](https://via.placeholder.com/15/ff81c0/000000?text=+) `#ff81c0` | -| blue | ![#0343df](https://via.placeholder.com/15/0343df/000000?text=+) `#0343df` | -| green | ![#15b01a](https://via.placeholder.com/15/15b01a/000000?text=+) `#15b01a` | -| purple | ![#7e1e9c](https://via.placeholder.com/15/7e1e9c/000000?text=+) `#7e1e9c` | - -To force use xkcd color, use `xkcd:` (ie. `xkcd:light olive green`). - -*** - -### CSS4 Colors: - -| Color Name | Hex Code | -| -------------------- | ------------------------------------------------------------------------- | -| aliceblue | ![#F0F8FF](https://via.placeholder.com/15/F0F8FF/000000?text=+) `#F0F8FF` | -| antiquewhite | ![#FAEBD7](https://via.placeholder.com/15/FAEBD7/000000?text=+) `#FAEBD7` | -| aqua | ![#00FFFF](https://via.placeholder.com/15/00FFFF/000000?text=+) `#00FFFF` | -| aquamarine | ![#7FFFD4](https://via.placeholder.com/15/7FFFD4/000000?text=+) `#7FFFD4` | -| azure | ![#F0FFFF](https://via.placeholder.com/15/F0FFFF/000000?text=+) `#F0FFFF` | -| beige | ![#F5F5DC](https://via.placeholder.com/15/F5F5DC/000000?text=+) `#F5F5DC` | -| bisque | ![#FFE4C4](https://via.placeholder.com/15/FFE4C4/000000?text=+) `#FFE4C4` | -| black | ![#000000](https://via.placeholder.com/15/000000/000000?text=+) `#000000` | -| blanchedalmond | ![#FFEBCD](https://via.placeholder.com/15/FFEBCD/000000?text=+) `#FFEBCD` | -| blue | ![#0000FF](https://via.placeholder.com/15/0000FF/000000?text=+) `#0000FF` | -| blueviolet | ![#8A2BE2](https://via.placeholder.com/15/8A2BE2/000000?text=+) `#8A2BE2` | -| brown | ![#A52A2A](https://via.placeholder.com/15/A52A2A/000000?text=+) `#A52A2A` | -| burlywood | ![#DEB887](https://via.placeholder.com/15/DEB887/000000?text=+) `#DEB887` | -| cadetblue | ![#5F9EA0](https://via.placeholder.com/15/5F9EA0/000000?text=+) `#5F9EA0` | -| chartreuse | ![#7FFF00](https://via.placeholder.com/15/7FFF00/000000?text=+) `#7FFF00` | -| chocolate | ![#D2691E](https://via.placeholder.com/15/D2691E/000000?text=+) `#D2691E` | -| coral | ![#FF7F50](https://via.placeholder.com/15/FF7F50/000000?text=+) `#FF7F50` | -| cornflowerblue | ![#6495ED](https://via.placeholder.com/15/6495ED/000000?text=+) `#6495ED` | -| cornsilk | ![#FFF8DC](https://via.placeholder.com/15/FFF8DC/000000?text=+) `#FFF8DC` | -| crimson | ![#DC143C](https://via.placeholder.com/15/DC143C/000000?text=+) `#DC143C` | -| cyan | ![#00FFFF](https://via.placeholder.com/15/00FFFF/000000?text=+) `#00FFFF` | -| darkblue | ![#00008B](https://via.placeholder.com/15/00008B/000000?text=+) `#00008B` | -| darkcyan | ![#008B8B](https://via.placeholder.com/15/008B8B/000000?text=+) `#008B8B` | -| darkgoldenrod | ![#B8860B](https://via.placeholder.com/15/B8860B/000000?text=+) `#B8860B` | -| darkgray | ![#A9A9A9](https://via.placeholder.com/15/A9A9A9/000000?text=+) `#A9A9A9` | -| darkgreen | ![#006400](https://via.placeholder.com/15/006400/000000?text=+) `#006400` | -| darkgrey | ![#A9A9A9](https://via.placeholder.com/15/A9A9A9/000000?text=+) `#A9A9A9` | -| darkkhaki | ![#BDB76B](https://via.placeholder.com/15/BDB76B/000000?text=+) `#BDB76B` | -| darkmagenta | ![#8B008B](https://via.placeholder.com/15/8B008B/000000?text=+) `#8B008B` | -| darkolivegreen | ![#556B2F](https://via.placeholder.com/15/556B2F/000000?text=+) `#556B2F` | -| darkorange | ![#FF8C00](https://via.placeholder.com/15/FF8C00/000000?text=+) `#FF8C00` | -| darkorchid | ![#9932CC](https://via.placeholder.com/15/9932CC/000000?text=+) `#9932CC` | -| darkred | ![#8B0000](https://via.placeholder.com/15/8B0000/000000?text=+) `#8B0000` | -| darksalmon | ![#E9967A](https://via.placeholder.com/15/E9967A/000000?text=+) `#E9967A` | -| darkseagreen | ![#8FBC8F](https://via.placeholder.com/15/8FBC8F/000000?text=+) `#8FBC8F` | -| darkslateblue | ![#483D8B](https://via.placeholder.com/15/483D8B/000000?text=+) `#483D8B` | -| darkslategray | ![#2F4F4F](https://via.placeholder.com/15/2F4F4F/000000?text=+) `#2F4F4F` | -| darkslategrey | ![#2F4F4F](https://via.placeholder.com/15/2F4F4F/000000?text=+) `#2F4F4F` | -| darkturquoise | ![#00CED1](https://via.placeholder.com/15/00CED1/000000?text=+) `#00CED1` | -| darkviolet | ![#9400D3](https://via.placeholder.com/15/9400D3/000000?text=+) `#9400D3` | -| deeppink | ![#FF1493](https://via.placeholder.com/15/FF1493/000000?text=+) `#FF1493` | -| deepskyblue | ![#00BFFF](https://via.placeholder.com/15/00BFFF/000000?text=+) `#00BFFF` | -| dimgray | ![#696969](https://via.placeholder.com/15/696969/000000?text=+) `#696969` | -| dimgrey | ![#696969](https://via.placeholder.com/15/696969/000000?text=+) `#696969` | -| dodgerblue | ![#1E90FF](https://via.placeholder.com/15/1E90FF/000000?text=+) `#1E90FF` | -| firebrick | ![#B22222](https://via.placeholder.com/15/B22222/000000?text=+) `#B22222` | -| floralwhite | ![#FFFAF0](https://via.placeholder.com/15/FFFAF0/000000?text=+) `#FFFAF0` | -| forestgreen | ![#228B22](https://via.placeholder.com/15/228B22/000000?text=+) `#228B22` | -| fuchsia | ![#FF00FF](https://via.placeholder.com/15/FF00FF/000000?text=+) `#FF00FF` | -| gainsboro | ![#DCDCDC](https://via.placeholder.com/15/DCDCDC/000000?text=+) `#DCDCDC` | -| ghostwhite | ![#F8F8FF](https://via.placeholder.com/15/F8F8FF/000000?text=+) `#F8F8FF` | -| gold | ![#FFD700](https://via.placeholder.com/15/FFD700/000000?text=+) `#FFD700` | -| goldenrod | ![#DAA520](https://via.placeholder.com/15/DAA520/000000?text=+) `#DAA520` | -| gray | ![#808080](https://via.placeholder.com/15/808080/000000?text=+) `#808080` | -| green | ![#008000](https://via.placeholder.com/15/008000/000000?text=+) `#008000` | -| greenyellow | ![#ADFF2F](https://via.placeholder.com/15/ADFF2F/000000?text=+) `#ADFF2F` | -| grey | ![#808080](https://via.placeholder.com/15/808080/000000?text=+) `#808080` | -| honeydew | ![#F0FFF0](https://via.placeholder.com/15/F0FFF0/000000?text=+) `#F0FFF0` | -| hotpink | ![#FF69B4](https://via.placeholder.com/15/FF69B4/000000?text=+) `#FF69B4` | -| indianred | ![#CD5C5C](https://via.placeholder.com/15/CD5C5C/000000?text=+) `#CD5C5C` | -| indigo | ![#4B0082](https://via.placeholder.com/15/4B0082/000000?text=+) `#4B0082` | -| ivory | ![#FFFFF0](https://via.placeholder.com/15/FFFFF0/000000?text=+) `#FFFFF0` | -| khaki | ![#F0E68C](https://via.placeholder.com/15/F0E68C/000000?text=+) `#F0E68C` | -| lavender | ![#E6E6FA](https://via.placeholder.com/15/E6E6FA/000000?text=+) `#E6E6FA` | -| lavenderblush | ![#FFF0F5](https://via.placeholder.com/15/FFF0F5/000000?text=+) `#FFF0F5` | -| lawngreen | ![#7CFC00](https://via.placeholder.com/15/7CFC00/000000?text=+) `#7CFC00` | -| lemonchiffon | ![#FFFACD](https://via.placeholder.com/15/FFFACD/000000?text=+) `#FFFACD` | -| lightblue | ![#ADD8E6](https://via.placeholder.com/15/ADD8E6/000000?text=+) `#ADD8E6` | -| lightcoral | ![#F08080](https://via.placeholder.com/15/F08080/000000?text=+) `#F08080` | -| lightcyan | ![#E0FFFF](https://via.placeholder.com/15/E0FFFF/000000?text=+) `#E0FFFF` | -| lightgoldenrodyellow | ![#FAFAD2](https://via.placeholder.com/15/FAFAD2/000000?text=+) `#FAFAD2` | -| lightgray | ![#D3D3D3](https://via.placeholder.com/15/D3D3D3/000000?text=+) `#D3D3D3` | -| lightgreen | ![#90EE90](https://via.placeholder.com/15/90EE90/000000?text=+) `#90EE90` | -| lightgrey | ![#D3D3D3](https://via.placeholder.com/15/D3D3D3/000000?text=+) `#D3D3D3` | -| lightpink | ![#FFB6C1](https://via.placeholder.com/15/FFB6C1/000000?text=+) `#FFB6C1` | -| lightsalmon | ![#FFA07A](https://via.placeholder.com/15/FFA07A/000000?text=+) `#FFA07A` | -| lightseagreen | ![#20B2AA](https://via.placeholder.com/15/20B2AA/000000?text=+) `#20B2AA` | -| lightskyblue | ![#87CEFA](https://via.placeholder.com/15/87CEFA/000000?text=+) `#87CEFA` | -| lightslategray | ![#778899](https://via.placeholder.com/15/778899/000000?text=+) `#778899` | -| lightslategrey | ![#778899](https://via.placeholder.com/15/778899/000000?text=+) `#778899` | -| lightsteelblue | ![#B0C4DE](https://via.placeholder.com/15/B0C4DE/000000?text=+) `#B0C4DE` | -| lightyellow | ![#FFFFE0](https://via.placeholder.com/15/FFFFE0/000000?text=+) `#FFFFE0` | -| lime | ![#00FF00](https://via.placeholder.com/15/00FF00/000000?text=+) `#00FF00` | -| limegreen | ![#32CD32](https://via.placeholder.com/15/32CD32/000000?text=+) `#32CD32` | -| linen | ![#FAF0E6](https://via.placeholder.com/15/FAF0E6/000000?text=+) `#FAF0E6` | -| magenta | ![#FF00FF](https://via.placeholder.com/15/FF00FF/000000?text=+) `#FF00FF` | -| maroon | ![#800000](https://via.placeholder.com/15/800000/000000?text=+) `#800000` | -| mediumaquamarine | ![#66CDAA](https://via.placeholder.com/15/66CDAA/000000?text=+) `#66CDAA` | -| mediumblue | ![#0000CD](https://via.placeholder.com/15/0000CD/000000?text=+) `#0000CD` | -| mediumorchid | ![#BA55D3](https://via.placeholder.com/15/BA55D3/000000?text=+) `#BA55D3` | -| mediumpurple | ![#9370DB](https://via.placeholder.com/15/9370DB/000000?text=+) `#9370DB` | -| mediumseagreen | ![#3CB371](https://via.placeholder.com/15/3CB371/000000?text=+) `#3CB371` | -| mediumslateblue | ![#7B68EE](https://via.placeholder.com/15/7B68EE/000000?text=+) `#7B68EE` | -| mediumspringgreen | ![#00FA9A](https://via.placeholder.com/15/00FA9A/000000?text=+) `#00FA9A` | -| mediumturquoise | ![#48D1CC](https://via.placeholder.com/15/48D1CC/000000?text=+) `#48D1CC` | -| mediumvioletred | ![#C71585](https://via.placeholder.com/15/C71585/000000?text=+) `#C71585` | -| midnightblue | ![#191970](https://via.placeholder.com/15/191970/000000?text=+) `#191970` | -| mintcream | ![#F5FFFA](https://via.placeholder.com/15/F5FFFA/000000?text=+) `#F5FFFA` | -| mistyrose | ![#FFE4E1](https://via.placeholder.com/15/FFE4E1/000000?text=+) `#FFE4E1` | -| moccasin | ![#FFE4B5](https://via.placeholder.com/15/FFE4B5/000000?text=+) `#FFE4B5` | -| navajowhite | ![#FFDEAD](https://via.placeholder.com/15/FFDEAD/000000?text=+) `#FFDEAD` | -| navy | ![#000080](https://via.placeholder.com/15/000080/000000?text=+) `#000080` | -| oldlace | ![#FDF5E6](https://via.placeholder.com/15/FDF5E6/000000?text=+) `#FDF5E6` | -| olive | ![#808000](https://via.placeholder.com/15/808000/000000?text=+) `#808000` | -| olivedrab | ![#6B8E23](https://via.placeholder.com/15/6B8E23/000000?text=+) `#6B8E23` | -| orange | ![#FFA500](https://via.placeholder.com/15/FFA500/000000?text=+) `#FFA500` | -| orangered | ![#FF4500](https://via.placeholder.com/15/FF4500/000000?text=+) `#FF4500` | -| orchid | ![#DA70D6](https://via.placeholder.com/15/DA70D6/000000?text=+) `#DA70D6` | -| palegoldenrod | ![#EEE8AA](https://via.placeholder.com/15/EEE8AA/000000?text=+) `#EEE8AA` | -| palegreen | ![#98FB98](https://via.placeholder.com/15/98FB98/000000?text=+) `#98FB98` | -| paleturquoise | ![#AFEEEE](https://via.placeholder.com/15/AFEEEE/000000?text=+) `#AFEEEE` | -| palevioletred | ![#DB7093](https://via.placeholder.com/15/DB7093/000000?text=+) `#DB7093` | -| papayawhip | ![#FFEFD5](https://via.placeholder.com/15/FFEFD5/000000?text=+) `#FFEFD5` | -| peachpuff | ![#FFDAB9](https://via.placeholder.com/15/FFDAB9/000000?text=+) `#FFDAB9` | -| peru | ![#CD853F](https://via.placeholder.com/15/CD853F/000000?text=+) `#CD853F` | -| pink | ![#FFC0CB](https://via.placeholder.com/15/FFC0CB/000000?text=+) `#FFC0CB` | -| plum | ![#DDA0DD](https://via.placeholder.com/15/DDA0DD/000000?text=+) `#DDA0DD` | -| powderblue | ![#B0E0E6](https://via.placeholder.com/15/B0E0E6/000000?text=+) `#B0E0E6` | -| purple | ![#800080](https://via.placeholder.com/15/800080/000000?text=+) `#800080` | -| rebeccapurple | ![#663399](https://via.placeholder.com/15/663399/000000?text=+) `#663399` | -| red | ![#FF0000](https://via.placeholder.com/15/FF0000/000000?text=+) `#FF0000` | -| rosybrown | ![#BC8F8F](https://via.placeholder.com/15/BC8F8F/000000?text=+) `#BC8F8F` | -| royalblue | ![#4169E1](https://via.placeholder.com/15/4169E1/000000?text=+) `#4169E1` | -| saddlebrown | ![#8B4513](https://via.placeholder.com/15/8B4513/000000?text=+) `#8B4513` | -| salmon | ![#FA8072](https://via.placeholder.com/15/FA8072/000000?text=+) `#FA8072` | -| sandybrown | ![#F4A460](https://via.placeholder.com/15/F4A460/000000?text=+) `#F4A460` | -| seagreen | ![#2E8B57](https://via.placeholder.com/15/2E8B57/000000?text=+) `#2E8B57` | -| seashell | ![#FFF5EE](https://via.placeholder.com/15/FFF5EE/000000?text=+) `#FFF5EE` | -| sienna | ![#A0522D](https://via.placeholder.com/15/A0522D/000000?text=+) `#A0522D` | -| silver | ![#C0C0C0](https://via.placeholder.com/15/C0C0C0/000000?text=+) `#C0C0C0` | -| skyblue | ![#87CEEB](https://via.placeholder.com/15/87CEEB/000000?text=+) `#87CEEB` | -| slateblue | ![#6A5ACD](https://via.placeholder.com/15/6A5ACD/000000?text=+) `#6A5ACD` | -| slategray | ![#708090](https://via.placeholder.com/15/708090/000000?text=+) `#708090` | -| slategrey | ![#708090](https://via.placeholder.com/15/708090/000000?text=+) `#708090` | -| snow | ![#FFFAFA](https://via.placeholder.com/15/FFFAFA/000000?text=+) `#FFFAFA` | -| springgreen | ![#00FF7F](https://via.placeholder.com/15/00FF7F/000000?text=+) `#00FF7F` | -| steelblue | ![#4682B4](https://via.placeholder.com/15/4682B4/000000?text=+) `#4682B4` | -| tan | ![#D2B48C](https://via.placeholder.com/15/D2B48C/000000?text=+) `#D2B48C` | -| teal | ![#008080](https://via.placeholder.com/15/008080/000000?text=+) `#008080` | -| thistle | ![#D8BFD8](https://via.placeholder.com/15/D8BFD8/000000?text=+) `#D8BFD8` | -| tomato | ![#FF6347](https://via.placeholder.com/15/FF6347/000000?text=+) `#FF6347` | -| turquoise | ![#40E0D0](https://via.placeholder.com/15/40E0D0/000000?text=+) `#40E0D0` | -| violet | ![#EE82EE](https://via.placeholder.com/15/EE82EE/000000?text=+) `#EE82EE` | -| wheat | ![#F5DEB3](https://via.placeholder.com/15/F5DEB3/000000?text=+) `#F5DEB3` | -| white | ![#FFFFFF](https://via.placeholder.com/15/FFFFFF/000000?text=+) `#FFFFFF` | -| whitesmoke | ![#F5F5F5](https://via.placeholder.com/15/F5F5F5/000000?text=+) `#F5F5F5` | -| yellow | ![#FFFF00](https://via.placeholder.com/15/FFFF00/000000?text=+) `#FFFF00` | -| yellowgreen | ![#9ACD32](https://via.placeholder.com/15/9ACD32/000000?text=+) `#9ACD32` | - -To force use CSS4 color, use `css:` (ie. `css:thistle`). - -*** - -## Note: - -If no color group prefix is provided, the color name will be retrieved in the following order: - -* Tableau -* XKCD -* CSS4 -* Base diff --git a/old-docs/configuration-variables-config-vars.md b/old-docs/configuration-variables-config-vars.md deleted file mode 100644 index 27ac007..0000000 --- a/old-docs/configuration-variables-config-vars.md +++ /dev/null @@ -1,38 +0,0 @@ -# Configuration Variables (Config Vars) - -These are currently all the valid configuration variables you can change with the `config set` command. - -| Name | Description | -| --------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| account\_age | Specific time accounts must have before using modmail. (Prevents spam.) | -| activity playing, listening to, watching, streaming | You can set a custom activity for the bot using the activity command. Do \[p]activity for more info. Note: Listening MUST be followed by to, When activity type is set to streaming, you can set the linked twitch page: ?config set twitch\_url https://www.twitch.tv/somechannel/ and finally, you can clear the activity by using the command ?activity clear | -| anon\_avatar\_url | The icon URL in the anonymous reply embed (defaults to the guild's icon URL). | -| anon\_tag | Sets the tag for author section of an embed for anonreply. (Default is `Response`) | -| anon\_username | The name of the anonymous user for use with the anonreply command (defaults to be the same as mod\_tag configuration). | -| blocked\_emoji | Changes the blocked emoji (defaults to 🚫). | -| close\_emoji | Emoji used if user accidentally made a thread. Only if `disable_recipient_thread_close` is not set. (defaults to 🔒) | -| guild\_age | Specific date that member must be in guild before using modmail. | -| log\_channel\_id | Set the channel where bot logs will be sent. | -| main\_category\_id | Set the category where new threads spawn. | -| main\_color | The general color of Modmail in hexadecimal format or accepted color name (defaults to blurple - `7289da`). | -| mention | The message at the start of each thread. | -| mod\_color | The color of the mod reply embed in hexadecimal format or accepted color name (defaults to green - `2ecc71`). | -| mod\_tag | The footer text in the mod reply embed (defaults to your highest role name). | -| mod\_typing | Shows when moderator starts typing in thread channel. (default is off) | -| prefix | The prefix of the bot (defaults to `?`). | -| recipient\_color | The color of the recipient's message embed in hexadecimal format or accepted color name (defaults to gold - `f1c40f`). | -| recipient\_thread\_close | By default, the recipients can't close their ticket. Use this command to enable it. | -| reply\_without\_command | Making all non-command messaged to be forwarded to the user without command. `?reply` | -| sent\_emoji | Changes the sent emoji (defaults to ✅). | -| thread\_auto\_close | Time that has to pass after no reply from a user before the thread auto closes. If not set, thread will not auto close. | -| thread\_auto\_close\_response | Custom closing message for when a thread is auto closed. Use the `%t` variable in the message to add human time. | -| thread\_close\_footer | Footer of message that user will receive when thread is closed. | -| thread\_close\_response | Content message user will receive when the thread is closed. | -| thread\_close\_title | Title of the message the user will receive when thread is closed. | -| thread\_creation\_response | Message that shows when user has opened a thread. | -| thread\_creation\_title | Title of the message the user will receive when the thread is opened. | -| thread\_self\_close\_response | Message that the user will receive if the thread was closed by themselves. | -| twitch\_url | The twitch URL when activity\_type is set to 1 (streaming). | -| user\_typing | Shows when user starts typing to bot. (default is off) | - -Accepted color names can be found here: {% page-ref page="color-names.md" %}. diff --git a/old-docs/configure-modmail-and-logviewer.md b/old-docs/configure-modmail-and-logviewer.md deleted file mode 100644 index 160005f..0000000 --- a/old-docs/configure-modmail-and-logviewer.md +++ /dev/null @@ -1,59 +0,0 @@ -# Configure Modmail and Logviewer - -## Log Viewer - -To be able to store data such as logs, you will need to use your own database. - -Modmail supports MongoDB, and you are required to provide a MongoDB connection URI to the bot. You can get a **free** 500MB cluster from [MongoDB Atlas](https://www.mongodb.com/cloud/atlas). (Enough to store 3 million messages) - -Upon creating an account, you will be greeted with this page: - -![Free Tier](https://i.imgur.com/shZ7Sey.png) - -Select one of the servers marked with "FREE TIER AVAILABLE" for the free option and click on "Create Cluster". - -![](https://i.imgur.com/Hem2OKc.png) ![](https://i.imgur.com/jF3nISZ.png) - -Follow the "Getting Started" tutorial on the bottom left, by creating a database user, whitelisting your IP, and connect to the cluster. When whitelisting you IP, be sure to select ALLOW ACCESS FROM ANYWHERE since Heroku does not grant a fixed IP. - -Your IP should look something like this, with `0.0.0.0/0`: - -![whitelisting](https://i.imgur.com/mILuQ5U.png') - -The last part is to generate a MongoDB URI, navigate to "Clusters" and click on "CONNECT" (as shown in "Getting Started"). From the popup, select the middle option "Connect Your Application", and then the first option "Short SRV connection string". ![](https://i.imgur.com/OMI977u.png) ![](https://i.imgur.com/2BcVMGh.png) - -This will show a URI under "Copy the SRV address:", copy that, and replace `` with the database user password (**not your account password**). The final URI should look something like this: - -``` -mongodb+srv://username:password@cluster0-abcde.mongodb.net/ -``` - -If your URI is followed by `test?retryWrites=true` or anything else, don't include it. - -## Deploying the Log Viewer - -[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/modmail-dev/logviewer) - -You will also need to deploy another separate log viewer application from [this repo](https://github.com/kyb3r/logviewer). Click on the deploy button over there and fill in the configurations upon request. This is a **separate** Heroku application from the bot and is a simple website that will be used to display your thread logs. - -## Modmail - -Star the repository before you start 😉 - -[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://github.com/modmail-dev/modmail) - -1. Input a name of your choice for your app, the Heroku app name is not important. -2. Input your bot token into the `TOKEN` field. -3. Put the [ID of your Server](https://support.discordapp.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID-) into the `GUILD_ID` field. -4. Put your own ID in the `OWNERS` field (if there are multiple owners, separate them by a comma: `123455,234567,456782`). -5. Input your MongoDB connection URI from the previous section into the `MONGO_URI` field. -6. Input the URL of your log viewer Heroku app (`https://yourlogviewerappname.herokuapp.com`) into the `LOG_URL` field. -7. Click the `deploy app` button and wait for it to finish. -8. Click `Manage App` and go into the `Resources` tab. -9. Now turn on the worker by clicking the pencil icon. -10. If you want, you can go over and check the application logs to see if everything is running smoothly. -11. Once the bot is online in your server, do `[your prefix]setup` (defaults `?`) and you are good to go! - -Your bot is ready! Head over to Discord and try it out! If you have any issues, join the [Discord server](https://discord.gg/cnUpwrnpYb). - -**Make sure to give the bot Manage Channels, Manage Messages and View Audit Logs permissions!** diff --git a/old-docs/frequently-asked-questions.md b/old-docs/frequently-asked-questions.md deleted file mode 100644 index e39b59f..0000000 --- a/old-docs/frequently-asked-questions.md +++ /dev/null @@ -1,53 +0,0 @@ -# Frequently Asked Questions - -> Last Updated: March 16, 2023 - -#### What is Modmail? - -Modmail is a Discord bot, similar to Reddit's Modmail feature. It serves as a shared inbox for server staff to communicate with their users - and vice versa - in a seamless way. - -#### Can I invite Modmail? - -Unfortunately, due to the nature of the bot, there is not a global invite link. Nonetheless, you can obtain a free copy of Modmail for your server. Follow the official tutorial at [https://github.com/modmail-dev/modmail/wiki/Installation](https://github.com/modmail-dev/modmail/wiki/Installation). However, if you don’t want the hassle of installing and maintaining Modmail, we offer installation, hosting, and other cool perks for [Patrons](https://patreon.com/kyber). - -#### How does Modmail work? - -Modmail uses the Discord API to interact with the platform. When someone sends a DM to the bot, it will create a new thread. Members of the moderation team can help the user and once the conversation ended, you will have access to a beautiful log of it online. - -#### Is Modmail safe? - -Your Modmail bot is safe as long as you don't share your bot's token. If you share your token, a "hacker" can take control over your bot. If you shared your bot token by mistake, regenerate a new token via the Discord Developer Portal. - -#### Where is my data stored? - -All your data including settings, blocked users, logs, installed plugins etc. are stored in your MongoDB database. The bot files only contain the stuff needed to run the bot. This means you can move your bot to a different host and still have your data intact, as long as you use the same MongoDB URI. - -#### Can I request new features? - -Modmail is an open-source project, which means you can easily add or request new features. You can make an issue or submit a pull request to the development branch on the repository. [Check out the contribution guidelines.](https://github.com/modmail-dev/modmail/blob/master/CONTRIBUTING.md) - -#### How do I become a support member? - -To join our support team, join our [Discord server](https://discord.gg/cnUpwrnpYb). One of the more experienced members will hold an interview to check if you fit the requirements. - -#### Can I add commands to the bot? - -You can add commands to the bot using plugins. All currently approved plugins can be found in the `?plugin registry` command. You can also see [this page](https://github.com/modmail-dev/modmail/wiki/Unofficial-List-of-Plugins) for an unofficial list of plugins. - -#### My bot is offline, what do I do? - -Join our [Discord server](https://discord.gg/cnUpwrnpYb) and DM Modmail. One of our support members will assist you and help you fix the issue. - -#### How can I donate the developers? - -You can support the developers on the [Patreon page](https://patreon.com/kyber). You will also receive various rewards for it. - -#### Does anyone get any info when I create my own modmail? - -There is not much information we get about your instance of modmail, The only thing what we recieve is the guild-info, For example: The guildname, The amount of members of the guild, the botname, and the bot-owner. Using this we keep track of how many modmail-instances get created on a monthly/yearly base. ( Only modmail-developers can see this ) - -*** - -#### Answer not found? - -Feel free to join our [Discord server](https://discord.gg/cnUpwrnpYb). People will gladly help you with any questions that you have! diff --git a/old-docs/installation-1.md b/old-docs/installation-1.md deleted file mode 100644 index f9ab8c2..0000000 --- a/old-docs/installation-1.md +++ /dev/null @@ -1,59 +0,0 @@ -# Installation - -**If you need help beyond this tutorial please join our support server and the support team will be happy to help you** [https://discord.gg/cnUpwrnpYb](https://discord.gg/cnUpwrnpYb) - -> **Self Hosting Tutorial**: https://taaku18.github.io/modmail/local-hosting/ - -## What you'll need: - -* An internet connection and browser. -* An email account. -* A digital or physical notepad (Notepad, Notes, ... literally anything). - -## 1. Heroku Account - -In this guide, we will be using Heroku to deploy our Modmail bot. Make an account on their [website](https://www.heroku.com/) to get started. - -## 2. Discord Bot Account - -## 2.1. Create a bot - -You will need to create a bot application to interact with the Discord API. Head over to the [applications page](https://discordapp.com/developers/applications/). Log in - if you're not already - and click on `New Application`. Give it a name and click `Confirm` to register your bot. - -![Discord New Application](https://i.imgur.com/sTsk6wz.png) - -A new screen should pop up. Navigate to the `Bot` section and click on `Add Bot`. Click on `Yes, do it!` to confirm. - -![Discord Build-A-Bot](https://i.imgur.com/6MikkYq.png) - -## 2.2. Obtain a token - -After this, a dashboard for your bot will open. Give your bot a nice profile picture if you want to. It's recommended you switch off the `Public Bot` option. That way, no one except yourself will be able to add this bot to their server. Lastly, copy the token and paste this in your notepad. - -**Make sure to keep this token private, since anyone who has it can control (or "hack") your bot and potentially cause malicious damage. If you feel that your token has been leaked, click on `Regenerate` to invalidate the old one and create a new bot token.** - -![Discord Token](https://i.imgur.com/5aEtFQx.png) - -## 2.3. Enable Privileged Intents - -Enable the "Presence Intent", "Server Members" and "Message content" intent within the dashboard. - -![Intents](https://i.imgur.com/bcXccf5.png) - -## 2.4. Get an invite link - -The last thing you need to do in Discord's developer portal is to obtain an invite link for the bot. To do this, head over to the `OAuth2` tab. Scroll down a bit and select the `Bot` section. Scroll a bit further down and you will see a few permissions. Make sure to select `View Audit Log`, `Manage Channels` and `Manage Messages`. - -![Discord Invite Link](https://i.imgur.com/eK8gQbf.png) - -Before you press "copy", scroll down and select the following permissions: - -![Permissions](https://i.imgur.com/KT6thXx.png) - -## 2.5. Invite the bot - -`Copy` the link and paste it in your address bar. A new screen will open: choose your server and select all options. Click on `Authorize` and your bot should be offline in your server. - -## ![Discord Invite](https://i.imgur.com/iAQ2u0w.png) - -[**To continue the setup, head over to the second page of this guide.**](https://github.com/modmail-dev/modmail/wiki/Installation-\(cont.\)) diff --git a/old-docs/installation-continued.md b/old-docs/installation-continued.md deleted file mode 100644 index 576999f..0000000 --- a/old-docs/installation-continued.md +++ /dev/null @@ -1,121 +0,0 @@ -# Installation (continued) - -## 3. Create a Database - -To be able to store data such as logs, you will need to use your own database. A database is required, as the database also stores configuration data for your bot. - -Modmail supports MongoDB and you are required to provide a MongoDB connection string to the bot. You can get a free 500MB cluster from [MongoDB Atlas](https://www.mongodb.com/cloud/atlas), which is enough to store around 3 million message logs. - -Upon creating an account, you will be greeted with this page. Make sure you select Starter Cluster. - -![Cluster selection](https://fle.soulmusic.pro/file/shxshx/Redtailedhawk1638.png) - -After this, you will be taken to the below screen: - -![Server selection](https://i.imgur.com/5b2Naw0.png) - -Select one of the servers marked with `FREE TIER AVAILABLE` and click on `Create Cluster`. It will only take a couple of minutes to configure everything for you. - -Follow the "Getting Started" tutorial on the bottom left. - -## 3.1. Create a database user - -Go to the `Database Access` section in the `security` tab. Click on `+ Add New User` to create a new user, whereupon a new screen will pop up. Select `Read and write to any database`, so the bot can properly store the data. Choose a username and password, but make sure they both **don't contain any special character** like `!`, `-`, `?`. Copy the password into your notepad. - -Finally, click `Add User` to finish the creation. - -![Create User](https://fle.soulmusic.pro/file/shxshx/Firefly1640.png) - -## 3.2. Whitelist all IP's - -Go to the `Network Access` section in the `security` tab. Click on `+ Add IP Address` to add an IP address, whereupon a new screen will pop up. Click the `Allow Access From Everywhere` button and `0.0.0.0/0` should appear in the `Whitelist Entry`. Otherwise, make sure to put input that manually. Finally, click `Confirm` to confirm your changes. - -![Whitelisting IPs](https://fle.soulmusic.pro/file/shxshx/Topi1641.png) - -## 3.3. Obtain a connection string - -The last part is to generate a Mongo URI. Go to the `Clusters` section in the `Atlas` tab. Click on `Connect` on the left side of your Cluster dashboard. This will open up a new screen where you have three options. For our purposes, select the middle option `Connect Your Application`. - -![Connection String](https://fle.soulmusic.pro/file/shxshx/Xuanhuaceratops1637.png) - -You need to copy the connection string, which can be easily done by clicking the `Copy` button. Remove everything past `` but keeping the `/`. Then replace `` with the password for your user and `` with your database-username, which you set earlier. Paste the URI in your notepad. - -The final URI looks similar to this: `mongodb+srv://Username:MyPassword@modmail-kjvn21.mongodb.net/`. - -![Connection String - 2](https://i.imgur.com/UIAhrZ1.png) - -## 4. How to obtain your `github_token` ( Required for the update command ) - -Note: This is not required when you are hosting using a vps. - -Start off by going to your [Github personal access tokens](https://github.com/settings/tokens) ![Personal access tokens](https://i.imgur.com/OkTue0p.png) - -Generate a new token - -Click on the Generate new token button in the top right of the view. ![Generate a new token](https://i.imgur.com/VZ4UaWa.png) - -Give the token a name, such as: `modmail github_token`. Then check the `repo` scope. ![Name your github Token](https://i.imgur.com/1vpWTSa.png) - -Click `Generate token` and GitHub will take you back to the list of tokens from before. Copy the code into your clipboard. ![Github token Copy](https://i.imgur.com/oFb2zB6.png) - -If those steps are done correctly you can use the `?update` command to update your bot to the latest version! - -## 5. Deploying the Log Viewer - -### **Click the button below to deploy the logviewer to heroku!** - -[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/modmail-dev/logviewer) - -**This is not the bot!** - -You will need to deploy a separate log viewer application from [this repository](https://github.com/modmail-dev/logviewer). This Heroku application is separate from the bot; it's a simple website that will be used to display your thread logs. - -Choose a name for your app and paste your Mongo URI (from your notepad). After you click the `Deploy App` button, it will start creating the website. - -After that's done configuring, click the `View` button. It will redirect you to the logviewer home screen. Copy the link in the address bar and paste it in Notepad. - -![Heroku Logviewer](https://i.imgur.com/tmiPfTL.png) - -## 6. Modmail - -### **Click the button below to deploy the bot to heroku.** - -**This is the second application you will be deploying** - -[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/modmail-dev/modmail) - -**6.1.** Choose any name for your app. Note: this name doesn't matter at all. - -**6.2.** Put your [bot's token](https://github.com/kyb3rr/modmail/wiki/Installation#creating-a-bot-account) in the `TOKEN` field. - -**6.3.** In the `DATABASE_TYPE` You may fillout: `mongodb` - -**6.4.** Put the [ID of your Server](https://support.discordapp.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID-) into the `GUILD_ID` field. - -**6.5.** Put your own ID in the `OWNERS` field. If there are multiple owners, separate them by a comma: `180314310298304512, 355790471219511297, 325012556940836864`. - -**6.6.** Put your Mongo connection URI from the previous section in the `CONNECTION_URI` field. - -**6.7.** Put the `github token` you just created in the `GITHUB_TOKEN` field. - -**6.8.** Put the URL of your log viewer Heroku app (`https://yourlogviewerappname.herokuapp.com`) in the `LOG_URL` field. - -**6.9.** Click the `deploy app` button and wait for it to finish. - -**6.10.** Click `Manage App` and go into the `Resources` tab, where you need to turn on the worker by clicking the pencil icon next to it. - -**6.11.** If you want, you can go over and check the application logs to see if everything is running smoothly. If any unexpected errors pop up, join our [Discord server](https://discord.gg/cnUpwrnpYb) and DM Modmail. The support members will help you figure out the issue and show you how to fix it. - -**6.12.** Once the bot is online in your server, make sure to give it `Manage Channels`, `Manage Messages` and `View Audit Logs` permissions. If your bot is not online, recheck the previous steps above. - -**6.13.** Do the `?setup` command and you are good to go! - -*** - -Congratulations! Your bot is ready! Head over to Discord and try it out! If you have any issues or questions, join the [Discord server](https://discord.gg/cnUpwrnpYb). - -Make sure to setup permissions using this [handy guide](https://github.com/modmail-dev/modmail/wiki/Permissions)! - -[Taki's Blog](https://taaku18.github.io/modmail/customization/) contains many cool customizations for the bot, so you might want to check it out! - -If you like the bot, consider giving this repository a star 😉. If you want to support the developers financially, subscribe to the [Patreon](https://www.patreon.com/kyber). diff --git a/old-docs/modmail-usage.md b/old-docs/modmail-usage.md deleted file mode 100644 index 072075b..0000000 --- a/old-docs/modmail-usage.md +++ /dev/null @@ -1,21 +0,0 @@ -# Modmail Usage - -### Basic Usage - -Once someone DMs the bot a channel will be created for their thread. You can reply to their thread using the `[p]reply` command. Once you are done communicating you can use the `[p]close` command - -### Ease of Use - -You can configure aliases and snippets, which is highly recommended. For example, you can shorten the `reply` command to `r` (In case you want to do this you can use the command `[p]alias add r reply`) - -You can use snippets to shorten text like "Thanks for Contacting Modmail Support! How can I help you today?" to a simple command such as `[p]hi` (In case you want to do this you can use the command `[p]snippets add hi Thanks for Contacting Modmail Support! How can I help you today?`) - -### Advanced Usage - -You can use times with the close command for example `[p]close 20m Bye` to close in 20 minutes with the reason "Bye" if you don't want to close on a timer but still add a reason you can use `[p]close Bye` which will close the thread with the reason "Bye" - -### Anonymous Snippets - -\[p]alias add \[snippetname] anonreply \[snippet text] - -_Note: In this page, the meaning of `[p]` is `bot prefix` this defaults to `?` but can be changed with the `[p]prefix` command_ diff --git a/old-docs/permissions.md b/old-docs/permissions.md deleted file mode 100644 index bc4d852..0000000 --- a/old-docs/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/old-docs/plugins.md b/old-docs/plugins.md deleted file mode 100644 index 2251102..0000000 --- a/old-docs/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/old-docs/seperate-server-setup.md b/old-docs/seperate-server-setup.md deleted file mode 100644 index f30609a..0000000 --- a/old-docs/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/old-docs/the-unofficial-list-of-plugins.md b/old-docs/the-unofficial-list-of-plugins.md deleted file mode 100644 index 1700993..0000000 --- a/old-docs/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/old-docs/updating.md b/old-docs/updating.md deleted file mode 100644 index e2485ce..0000000 --- a/old-docs/updating.md +++ /dev/null @@ -1,38 +0,0 @@ -# Updating - -## Updating Modmail - -You can update Modmail on your Heroku account whenever changes are made to the repository. If you want to update while hosting locally (not Heroku), simply type `git pull` in your terminal and install the requirements again with `pipenv install`. - -## Forking the repo - -Before you get started, you must [fork](https://github.com/modmail-dev/modmail/fork) the repo first if you are using Heroku and want to update the bot. - -### Syncing a fork branch from the web UI - -1. On GitHub, navigate to the main page of the forked repository that you want to sync with the upstream repository. -2. Select the Sync fork dropdown. - - ![sync-fork-dropdown](https://user-images.githubusercontent.com/70805800/194696934-5333af5d-165e-4873-b5b7-bd01f0461185.png) -3. Then click Update branch. - - ![update-branch-button](https://user-images.githubusercontent.com/70805800/194696947-68891d50-a624-4901-a03d-e49564852a23.png) - -If the changes from the upstream repository cause conflicts, GitHub will prompt you to create a pull request to resolve the conflicts. - -### I want to enable automatic updates - -1. Create a GitHub account -2. [Fork](https://github.com/modmail-dev/modmail/fork) the repository -3. Add GITHUB\_TOKEN into your configuration variables from https://github.com/settings/tokens with the repo scope ([Guide](https://github.com/modmail-dev/modmail/wiki/Installation-\(cont.\)#4-how-to-obtain-your-github\_token---required-for-the-update-command-)). -4. Link your GitHub account to heroku ![](https://i.imgur.com/qjWraS0.png) -5. Turn on automatic deploys ![](https://i.imgur.com/jgUVl7f.png) -6. Restart the bot - -### I want to update the bot once - -[Click here to create a new pull request to your fork](https://github.com/modmail-dev/modmail/pull/new/master). Select `compare across forks`, make the base repository `yourusername/modmail` and ensure the branch is set to master. Put any title you want and create the pull request. On the page that comes after this, merge the pull request. - -You then want to go to your modmail application in Heroku, connect your modmail fork via the `Deploy` tab and deploy the `master` branch. - -You can turn on auto-deploy for the master branch if you don't want to go through the process of logging into Heroku and deploying the branch every time changes to the repo are made in the future. However, you will have to make a pull request to update your fork every time. diff --git a/old-docs/video-tutorials.md b/old-docs/video-tutorials.md deleted file mode 100644 index f1f70c8..0000000 --- a/old-docs/video-tutorials.md +++ /dev/null @@ -1,3 +0,0 @@ -# Video Tutorials - -> This page lists videos created by the Modmail Team or videos that are explicitly approved by the modmail team. Please do not add videos to this page without prior approval from a Core Developer or Admin. Thank you! (This allows us to ensure videos are factually correct and do not have malicious intent.) From a4aa46651abe4e74d67dc3437f9579c7bdfdd720 Mon Sep 17 00:00:00 2001 From: Raiden Date: Fri, 7 Apr 2023 11:10:13 +0000 Subject: [PATCH 03/33] GITBOOK-1: No subject --- installation/local-hosting-vps/ubuntu.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/installation/local-hosting-vps/ubuntu.md b/installation/local-hosting-vps/ubuntu.md index 0d94d25..d241fa8 100644 --- a/installation/local-hosting-vps/ubuntu.md +++ b/installation/local-hosting-vps/ubuntu.md @@ -102,7 +102,7 @@ If no error shows up, it means your bot is now running correctly. To have the bot auto-restart on crash or system reboot, we will be using systemd by making a service file for our bot. -In order to create the service file, you will first need to know two things, your Linux `username`, your Modmail repository `path` and your Pipenv `path`. +In order to create the service file, you will first need to know three things, your Linux `username`, your Modmail repository `path` and your Pipenv `path`. First, your Linux `username` can be fetched with the following command: @@ -142,13 +142,13 @@ Description=Modmail bot After=network.target [Service] -User=username -Group=username +User=username # replace this +Group=username # replace this Restart=always RestartSec=10 Type=simple -WorkingDirectory=modmail_path -ExecStart=pipenv_path run python bot.py +WorkingDirectory=modmail_path # replace this +ExecStart=pipenv_path run python bot.py # replace pipenv_path only [Install] WantedBy=multi-user.target From 485f4e26e97b7584c7c31583758d45c546f9d982 Mon Sep 17 00:00:00 2001 From: Raiden Date: Fri, 7 Apr 2023 13:57:20 +0000 Subject: [PATCH 04/33] GITBOOK-2: Specify to run all 3 lines at once --- installation/local-hosting-vps/ubuntu.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installation/local-hosting-vps/ubuntu.md b/installation/local-hosting-vps/ubuntu.md index d241fa8..2be5d28 100644 --- a/installation/local-hosting-vps/ubuntu.md +++ b/installation/local-hosting-vps/ubuntu.md @@ -33,7 +33,7 @@ sudo apt -y install software-properties-common sudo add-apt-repository -y ppa:deadsnakes/ppa ``` -Now install the pre-requirements with apt: +Now install the pre-requirements with `apt`, you can copy and run these 3 lines at once: ```bash sudo apt -y install python3.10 python3.10-dev python3.10-venv python3-pip \ From 01324480c494b147f959c495e81787df7a14d10f Mon Sep 17 00:00:00 2001 From: Zino <98627207+Zinoviya99@users.noreply.github.com> Date: Mon, 10 Apr 2023 00:58:53 -0700 Subject: [PATCH 05/33] Update configuration.md I got the moderation config options done..... adding more l8r Signed-off-by: Zino <98627207+Zinoviya99@users.noreply.github.com> --- usage-guide/configuration.md | 362 ++++++++++++++++++++++++++++++++++- 1 file changed, 361 insertions(+), 1 deletion(-) diff --git a/usage-guide/configuration.md b/usage-guide/configuration.md index f1f76af..1d0d9ad 100644 --- a/usage-guide/configuration.md +++ b/usage-guide/configuration.md @@ -1,3 +1,363 @@ --- description: Configuring and customizing modmail. ---- \ No newline at end of file +--- + +Modmail offers an assort of customizations to make your Modmail bot unique to your server. Most customizations can be set with `?config`, but some has its own special command, such as `?activity`. +You may find all of the personalizable tweaks available for Modmail below: + +{% hint style="info" %} All examples presume your prefix is `?`.{% endhint %} + +{% hint style="warning" %} Things covered in brackets are optional: `[]` +Things covered in angled brackets are required: `<>` {% endhint %} + +Moderation Configurations +====== + +Account Age ( account_age ) +------ + +***Default:*** No Age Threshold + +Set an amount of time a users account has to be created in order to open a ticket. + +***Example:*** + +- `?config set account_age P12DT3H` (stands for 12 days and 3 hours in [ISO-8601 Duration Format](https://en.wikipedia.org/wiki/ISO_8601#Durations)) +- `?config set account_age 3 days and 5 hours` (accepted readable time) + +***Note(s):*** +- To remove this restriction, do ?config del account_age. +- See also: `guild_age`. + + +Alert on Mention ( alert_on_mention ) +------ + +***Default:*** No + +Mentions all mods (mention) in mention channel when bot is mentioned + +***Example:*** + +- `?config set alert_on_mention yes` + +***Notes:*** +- See also: `mention`, `mention_channel_id` + + +Reply Without Command ( reply_without_command ) +------ + +***Default:*** Disabled + +Setting this configuration will make all non-command messages sent in the thread channel to be forwarded to the recipient without the need of `?reply`. + +***Example:*** +- `?config set reply_without_command yes` +- `?config set reply_without_command no` + +***Notes:*** +- See also: `anon_reply_without_command`, `plain_reply_without_command`. + + +Show Timestamps ( show_timestamp ) +------ + +***Default:*** Yes + +Shows timestamps on thread embeds + +***Example:*** + +- `?config set show_timestamp no` + + +Silent Alert On Commands ( silent_alert_on_mention ) +------ + +Send a message in the mention channel without mentioning all mods (mention). + +***Default:*** No + +***Example:*** +- `?config set alert_on_mention yes` + +***Notes:*** +This has no effect unless `alert_on_mention` is set to yes. +See also: `mention`, `mention_channel_id` + + +Update Channel ID ( update_channel_id ) +------ + +This is the channel where update notifications are sent to. + +***Default:*** Log Channel (normally `#bot-logs`) + +***Example:*** +- `?config set update_channel_id 9234932582312` (9234932582312 is the channel ID)` + +***Notes:*** +- This has no effect unless `disable_autoupdates` is set to no and `update_notifications` is set to yes. +- See also: `log_channel_id` + + +Update Notifications ( update_notifications ) +------ + +This is the channel where update notifications are sent to. + +***Default:*** Yes + +***Example:*** +- `?config set update_notifications no` + +***Notes:*** +- This has no effect unless `disable_autoupdates` is set to no. +- See also: `update_channel_id` + + +Fallback Category ID ( fallback_category_id ) +------ + +This is the category that will hold the threads when the main category is full.\n\nTo change the Fallback category, you will need to find the [category’s ID](https://support.discordapp.com/hc/en-us/articles/206346498). + +***Default:*** `Fallback Modmail` (created when the main category is full) + +***Example:*** +- `?config set fallback_category_id 9234932582312` (`9234932582312` is the category ID) + +***Notes:*** +- If the Fallback category ended up being non-existent/invalid, Modmail will create a new one. To fix this, set `fallback_category_id` to a valid category. +- See also: `main_category_id`. + + +Log Channel ID ( log_channel_id ) +------ + +This is the channel where all log messages will be sent (ie. thread close message, update message, etc.).\n\nTo change the log channel, you will need to find the [channel’s ID](https://support.discordapp.com/hc/en-us/articles/206346498). The channel doesn’t necessary have to be under the `main_category`. + +***Default:*** `#bot-logs` (created with `{prefix}setup`) + +***Example:*** +- `?config set log_channel_id 9234932582312` (9234932582312 is the channel ID) + +***Notes:*** +- If the Modmail logging channel ended up being non-existent/invalid, no logs will be sent. + +Main Category ID ( main_category_id ) +------ + +This is the category where all new threads will be created.\n\nTo change the Modmail category, you will need to find the [category’s ID](https://support.discordapp.com/hc/en-us/articles/206346498). + +***Default:*** `Modmail` (created with `{prefix}setup`) + +***Example:*** +- `?config set main_category_id 9234932582312` (`9234932582312` is the category ID)` + +***Notes:*** +- If the Modmail category ended up being non-existent/invalid, Modmail will break. To fix this, run `?setup` again or set `main_category_id` to a valid category. +- When the Modmail category is full, new channels will be created in the fallback category. +- See also: `fallback_category_id` + +Mod Typing ( mod_typing ) +------ + +When this is set to `yes`, whenever a moderator starts to type in the thread channel, the recipient user will see \"{bot.user.display_name} is typing…\" in their DM channel. + +***Default:*** Disabled + +***Example:*** +- `{prefix}config set mod_typing yes` +- `{prefix}config set mod_typing no` + +***Notes:*** +- See also: `mod_typing` + +User Typing ( user_typing ) +------ + +When this is set to `yes`, whenever the recipient user starts to type in their DM channel, the moderator will see “{bot.user.display_name} is typing…” in the thread channel. + +***Default:*** Enabled + +***Example:*** +- `?config set user_typing yes` +- `?config set user_typing no` + +***Notes:*** +- See also: `mod_typing`. + +Twitch URL ( twitch_url ) +------ + +This channel dictates the linked Twitch channel when the activity is set to \"Streaming\". + +***Default:*** `https://www.twitch.tv/discordmodmail/` + +***Example:*** +- `?config set twitch_url https://www.twitch.tv/yourchannelname/` + +***Notes:*** +- This has no effect when the activity is not set to \"Streaming\". +- See also: `?help activity` + +Close On Leave ( close_on_leave ) +------ + +Closes a modmail thread upon user leave automatically + +***Default:*** No + +***Example:*** +- `?config set close_on_leave yes` + +***Notes:*** +- See also: `close_on_leave_reason`. + +Confirm Thread Creation ( confirm_thread_creation ) +------ + +Ensure users confirm that they want to create a new thread + +***Default:*** No + +***Example:*** +- `?config set confirm_thread_creation yes` + +***Notes:*** +- See also: `confirm_thread_creation_title`, `confirm_thread_response`, `confirm_thread_creation_accept`, `confirm_thread_creation_deny` + +Mention ( mention ) +------ + +This is the message above user information for when a new thread is created in the channel. + +***Default:*** `@here` + +***Example:*** +- `?config set mention Yo~ Here's a new thread for ya!` +- `?mention Yo~ Here's a new thread for ya!` + +***Notes:*** +- To disable mention, use command `{prefix}mention disable`. +- See also: `{prefix}help mention`. + +Require Close Reason ( require_close_reason ) +------ + +Require a reason to close threads. + +***Default:*** No + +***Example:*** +- `?config set require_close_reason yes` + + +Thread Auto Close ( thread_auto_close ) +------ + +Setting this configuration will close threads automatically after the number of days, hours, minutes or any time-interval specified by this configuration. + +***Default:*** Never + +***Example:*** +- `?config set thread_auto_close P12DT3H` (stands for 12 days and 3 hours in [ISO-8601 Duration Format](https://en.wikipedia.org/wiki/ISO_8601#Durations)) +- `?config set thread_auto_close 3 days and 5 hours` (accepted readable time) + +***Notes:*** +- To disable auto close, do `{prefix}config del thread_auto_close`. +- To prevent a thread from auto-closing, do `{prefix}close cancel`. +- See also: `thread_auto_close_silently`, `thread_auto_close_response`. + +Thread Cooldown ( thread_cooldown ) +------ + +Specify the time required for the recipient to wait before allowed to create a new thread. + +***Default:*** Never + +***Example:*** +- `?config set thread_cooldown P12DT3H` (stands for 12 days and 3 hours in [ISO-8601 Duration Format](https://en.wikipedia.org/wiki/ISO_8601#Durations)) +- `?config set thread_cooldown 3 days and 5 hours` (accepted readable time) + +***Notes:*** +- To disable thread cooldown, do `?config del thread_cooldown`. + + +Thread Move Notify ( thread_move_notify ) +------ + +Notify the recipient if the thread was moved. + +***Default:*** No + +***Example:*** +- `?config set thread_move_notify yes` +- `?config set thread_move_notify no` + +***Notes:*** +- See also: `thread_move_title`, `thread_move_response`, `thread_move_notify_mods`. + +Thread Move Notify Mods ( thread_move_notify_mods ) +------ + +Notify mods again after the thread is moved + +***Default:*** No + +***Example:*** +- `?config set thread_move_notify_mods yes` +- `?config set thread_move_notify_mods no` + +***Notes:*** +- See also: `thread_move_title`, `thread_move_response`, `thread_move_notify`. + +Use Regex Autotrigger ( use_regex_autotrigger ) +------ + +Whether to use regex to compare in autotriggers. + +***Default:*** No + +***Example:*** +- `?config set use_regex_autotrigger yes` + +***Notes:*** + +{% hint style="danger" %} This is meant for advanced user that understand regular expressions. {% endhint %} + +- You can test it out with https://regexr.com on `PCRE (Server)` mode +- See command: `autotrigger` + +Plain Reply Without Command ( plain_reply_without_command ) +------ + +Setting this configuration will make all non-command messages sent in the thread channel to be forwarded to the recipient in a plain form without the need of `{prefix}reply`. + +***Default:*** Disabled + +***Example:*** +- `?config set plain_reply_without_command yes` +- `?config set plain_reply_without_command no` + +***Notes:*** +- See also: `reply_without_command`, `anon_reply_without_command`. + +Anonymous Snippets ( anonymous_snippets ) +------ + +Sends snippets anonymously. + +***Default:*** No + +***Example:*** +- `?config set anonymous_snippets yes` + +***Notes:*** +- See also: `anon_avatar_url`, `anon_tag`, `plain_snippets`. + +Appearance Configurations +====== + +TODO From edf5e04522de3c7e26c8e76590112636951b7250 Mon Sep 17 00:00:00 2001 From: Raiden Date: Mon, 10 Apr 2023 15:28:23 +0000 Subject: [PATCH 06/33] GITBOOK-13: Add Fedora guide --- .gitbook/assets/image (1).png | Bin 0 -> 11852 bytes .gitbook/assets/image (10).png | Bin 0 -> 21328 bytes .gitbook/assets/image (11).png | Bin 0 -> 11832 bytes .gitbook/assets/image (2).png | Bin 0 -> 25130 bytes .gitbook/assets/image (3).png | Bin 0 -> 16948 bytes .gitbook/assets/image (4).png | Bin 0 -> 26189 bytes .gitbook/assets/image (5).png | Bin 0 -> 14618 bytes .gitbook/assets/image (6).png | Bin 0 -> 30662 bytes .gitbook/assets/image (7).png | Bin 0 -> 14618 bytes .gitbook/assets/image (8).png | Bin 0 -> 61929 bytes .gitbook/assets/image (9).png | Bin 0 -> 73855 bytes .gitbook/assets/image.png | Bin 30662 -> 17697 bytes README.md | 17 +- SUMMARY.md | 5 +- installation/README.md | 110 ++++++++----- installation/community-guides.md | 8 +- installation/local-hosting-vps/README.md | 31 ++-- installation/local-hosting-vps/debian.md | 190 +++++++++++++++++++++- installation/local-hosting-vps/docker.md | 112 +++++++++++-- installation/local-hosting-vps/fedora.md | 166 ++++++++++++++++++- installation/local-hosting-vps/ubuntu.md | 32 +++- installation/local-hosting-vps/windows.md | 172 ++++++++++++++------ installation/railway.md | 32 ++-- installation/replit.md | 30 ---- 24 files changed, 723 insertions(+), 182 deletions(-) create mode 100644 .gitbook/assets/image (1).png create mode 100644 .gitbook/assets/image (10).png create mode 100644 .gitbook/assets/image (11).png create mode 100644 .gitbook/assets/image (2).png create mode 100644 .gitbook/assets/image (3).png create mode 100644 .gitbook/assets/image (4).png create mode 100644 .gitbook/assets/image (5).png create mode 100644 .gitbook/assets/image (6).png create mode 100644 .gitbook/assets/image (7).png create mode 100644 .gitbook/assets/image (8).png create mode 100644 .gitbook/assets/image (9).png delete mode 100644 installation/replit.md diff --git a/.gitbook/assets/image (1).png b/.gitbook/assets/image (1).png new file mode 100644 index 0000000000000000000000000000000000000000..8284bbe93d58e99955a6d3ff1a53904f76e652fb GIT binary patch literal 11852 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 u!p@Y`eqnd*klz?g?|a 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 literal 0 HcmV?d00001 diff --git a/.gitbook/assets/image (11).png b/.gitbook/assets/image (11).png new file mode 100644 index 0000000000000000000000000000000000000000..35e12a76edaee3c5b353f26dc3f51030a03cd23d GIT binary patch literal 11832 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 literal 0 HcmV?d00001 diff --git a/.gitbook/assets/image (3).png b/.gitbook/assets/image (3).png new file mode 100644 index 0000000000000000000000000000000000000000..cf836a96f44f28a34d5df88c661b9a15d91b1b98 GIT binary patch literal 16948 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 literal 0 HcmV?d00001 diff --git a/.gitbook/assets/image (4).png b/.gitbook/assets/image (4).png new file mode 100644 index 0000000000000000000000000000000000000000..7c81374005334484b5075d53db76861b2acf8721 GIT binary patch literal 26189 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� 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 XU0Bf^5AFfm#Na4AQI#!~dFlUO{?vV9 literal 0 HcmV?d00001 diff --git a/.gitbook/assets/image (5).png b/.gitbook/assets/image (5).png new file mode 100644 index 0000000000000000000000000000000000000000..239739c810c11d0156c1e7d5f35e5d860654495d GIT binary patch literal 14618 zcmZ9z2Q=I77e8**sM@QjQCf-$s%Gq(MNq3XD`skatf;+PdsNj7iXs$^SyHqbTdf$e zYn2dt?_adv-|v6U|D5-6IP!kReeQkT*L~e5G5R14s+(*#2?z+Nv@}(p5fBg}@xO1A zlj477hV|SaAmAp@QdKs3ZM6X-3uRP0J)FBir);DAT=h|O!9onhUZ&`5OqjUPLx&ej zBMd()cP{f*V#6tvsc${ZiKUC@FQLq^6eHkyN1~?6*lwv$n+&Teb9AmRu5Us%l{gj$ z{J{dJGjngcU#xBTpH@_E0x)pf^xG3|K8gYYcOGF_qO4U^3FL1V^oI(_=;d>-m}kIA zCAl*(^Zj4HTjAJlTGqbpax&*C6(>~7mo|7FN&Yn{hVGS4S+P2c`n%;f;f}mem&fl( zQNKGoerxO0P024OeLcyYj74!15Y6AEwG1k=y=_6fZ;%^w!iL!6@xFWe;K@ss*NG(J z+M#{%4A0c!l>YnaR67ZSIzJ&CQ%2blm^=zHQ^W16j0YoO*igy01|<%b@To(2$eF8I z5llpofROg@llfi5d~CR(Rk)C;HAvU1yxi$vYtCFzDrd~)!RvPzY}95KwA1j4+R*^r zF?Ii@njHZd$=_GI9uop=R6^=e^@G|%dBrajTXIEtPj)S^{906Hi^s9JSw{tqeMV*{cxL; z6jubs3WmHM6>Ag1z=;`v0*{ySP9&P5W28>e1g zAV*c`&5rnxhbESWx}6-pJQ8lh8O$OUs#^({(U;Q;(ha*iK=M$6>nAe&yU?7x2HI3l zyIQT~jp_Ce{yngH!`QI7`#{l$s3`Bgp$n(^h+b^c^2g`yY&WAtiT(b zQ)^g?O7~5LbC+P;a9k|*Emv?Yy``_Mz`^S)z1o8Yvy&Fj^#+L7Rx#(?K*6SYaN&{p zQ8DphE6mKrTysj&?bXHQZunbxZ)`f8_$;U&s#ZG{wp@!oggGHyv!b%;KmW5`^g}{` zlk z^4#w+G+R&d;$Nsc|EWSVTh*FsPqr2To2?#=f8Djo%MmFO7NALQ4cFk4XB9&3yzxf> zQ(|V=nlY~M8I^TOQ}i2FmO-u?32=6XR)HDNr(k4`wrf^hp;`U@-uhb9{zhlRU==b) zSN>*z!GK8sMjcur??GN+U6&$Qm7Oa3xzzVAhemDQgReu5#*{c>(Eyf>*@?E@`Z2>mRHW_&MJHZtPP{eq zb{bRKRt*LeR0M1$(>?{{AgfE=W_qYhro7P^-vEeT4`I$~Dm-jUXUk40lwEq(m4(z~ z^&hj`g9{ad=dwz*Rnr5X>NB$;tSchowy8f02i9bR(|YL)3+0|JXUpl9)raX(#KC8+ zC*JQkoA%YaJUiO)#PI+bNIkvX7T#+T6XB6IJd{@M(o(7d@>K8z?ses9yWkCmz*r8J znnM?x9up{sdwXZYPzrlUem5+!WYL#h$GRniNn*}91A*}{m?suyx!uw|jyv|fOS%>+ zNIIX#QlU-HmSWBMtx?*Oa2l>BRDs!<3wd!`E}*=l5j{^@~#p#@9c zv*m2f&KofIbF%_k1B16_BJS(Bp*VIOnKCf{WS=W82*jej@8kOWKw1sD>-`0U`z9*t zqgnJ9ATpKIQI)U*lC&k3x3e?|7fwm5nQ|)OjyJnKG?;H>Wy( zw^q(GRZ2$oT~$Q43U6H8abJ~0PfGCv!^CQo!b~``F>WbJR;9?>bub2Y2fj0>mhA&x zi6W%7zD_jTPq~B88PoIv)qA|qnhcCYd3G`G%M+H#@0;ZTK|88!UvMu@vvgf6g`HH_ z4{xg=H!xF9Y=#eWXbs*(8yPvhdVlu{fC}AW01HGW=}GM-XqZ94{5|vr_maN*!)66i z^y<_SK18|(4#fw;hE#Dn%t;y1uu7_&iX77%qiCm5;cBl1dw=1<@;zR8@=&Ej6;A~&3@h6iBDr zgW;t14p+uW1;uV`Z*i3FX8~nRUNFnpRFIb$u4VuNs9pW*YA1P$1y3C7IK|pa z8GyO<8=S(a%)h#@BLSpQzt)V3v%i!ceUI64bEVy&k9&R`&i*22gSqszP4XIH=s7-8 z{FFi=gE6+JgZ#GXz&Rs@TC!$^qDuuAsYfw41lfKFIgS6Yz_nP2X9u4xLD!m=O|xc- z?$_buN19p_=iI*M3h15}@43HXMxS|Y78JOZ49%(qWnz3hYG_&`{^sQ+cES_g&xCdI zqKHNC;a&$9gf-x4&*WSPIEi9i3HgP;XuC5^0z8gAu7|8|?O#;Q4Of|uq5FZ}#gaJI zOw9i!5i=x248Tii(aXR-pKNER-Z9;g_iEn44X$a?xYtjP8B8Q==ITe>ie1?ybmi{J z&LpUw;J1f=PIS3N5xws5PIzy@uSh9_;%gkNRyryquxnWXDJsQWANFsd{9!^9HDalA z`u#GfBNR)i5^fhQKKSa|>AUU{(IW4x={&yimoq5o5rD}C{t>S(KcW`YW@LAeC+96T z^6Lq?li5j%X>zpt!3|zBy30NrOq534(8hTJryJKRSRy9GqsN=^=B~PY4itdvoWS*( zhlSZ8n`(>yb}UU8&2j!e0<}V+g!62P8&dkm^z^{|o5Cx4`ag)6q-p+b%7~mC zv3MvM7<)4$JhoQp2ACzyEeiI}0FSOmBK${o{(mDya|HgsDUNB8w*%S-QlIC)+pDCr zAf}|Gj1YR5aDQ}UqzK{7NQK{*E|CWUn3SpivI##!`Y-A@vl)w3lS&I#ikhu&dmup( zk)+59QF@X`x-TzI4+M<6ld7t#tKau-2gEz5;R-y9w;D`G$nTC%t)pTnE#sJl&kOpT zS|I3R17l;R1P-8N;lZ0vkB%#X^i*SXn;af|#rUj^bf+UtjEtUlGP59!dZXhpYFM2) z)2eD6&&Xt&jk-k?Og0vrzBW-}-P#RRz`slL@7+ku37w$_j{pjg_K4>$6#P4>C$nYl zhejf8!DGysYn5e7=|RJ)R4bX`;Q1p<&hxR{*Y7b!y-9oOxCN>AomcC=VNXX$6u}4a+gYbj+Jlmx?l2rpn}eYOyja}6 zkn<LeZo@KjvVIE@uK#3oQPAlRs|XWwW0|`?+0^q^%AZgeHVrEJ~)dI#FHw1+Q)j= z^JE;q*GvVq9)L9@(JD9`cAW?4)4?0v1$v(Uf$2R){$iT4cDq*uduZs1p}(tEd>z+GwH%gMcvp@Jv~9k4{X4YV{( z%`?N=;P&5eOl;QpzS5r)oq=Q@BAii`G)A}B`=S=z+a2*L4)o1S7l#97*fCqRPomzA z{^$g~^tnudv>M--{KY4w=viYeZ-9;|+&pc?W-J`2D)BRx>GC9C#nzS#n-&4a2HS#A zw*{f37(Va{GskJOM3*KG!2S$uSsvF8##svsH+uN|MrT0DypzN2`Cm0%l<_vn6mLH4 zSbvdk@n$^2K>h`7MB?Vl{}_zW5eDN@p6uUZVf`lPAShXB`h~J8baw(?It3XDhhyN& zlQEI$yWz1`Mj=B%QcO-&huP7vHDW%Z&ws?^!>G!td<;IzDimomo=3x`p1<_})sIzG zFs75DN5%n~dNI zpDJ!T5p6VOe-9c&Bb#w)9L%Cy_Bw~pR7WQc<3};N(NFI)6c0Ddmj1MfYlpD?aJMU| zX?GL#Vt3M+-15!$26t>cq612i4J>V8X@L!0BidJ`K^sf_Ajn348(IJg>P+lLtfU#z zDsV6(3?~{neBrSwR&gAy9|K2%Xa*~h2Sp`$St@TI%83c1Gj@#<+;V3Cf*uSqGmOb> zVz1!?0>UEW-h=wEr&0}Dk1q;==+q+_;n4qLc~n{5#@X!NG}WvGG6MNqJ!QoVGS^9^ zku9UT5P$5G6iLli2^leO`g?|FGsR*Xr$2kU>(Xr}A#7;ZJ~7vtDGxFPy0?yL;+H~F zvD}fId48LT?JP9zpe(QGhM)y*vQDUAetb@|`Dilk!`!){8LEFXp6At>E@?t(U3XG* z<2`8bBv+l>w)q)n9DTNTtfjsEC-(+scX`da`1kl=jE21iI2ahv&5RuoM#G+@Yhb@` zZ#0s!-i4ATtGp)(rbKvob`B2@>%Vp`1Djs`8Cy#K%3M3u$Y37P-EbUolK1xXG{DgB z8p7q{lzBmbR~N8Kad2z!du-sgd9-D55Fqs+2BH&f89E~7q=X~#E{SKl(He!Z@0+OB zPmw~DQ*M4!hn}3{9d{p6S{6Ty-dp~mU_@(k3tvR3s z%9puFEKol;B+MSx$?DKi#vSLs6>cS0J-FX|j?lbjGHq(1A};fB7SEV~m0o21{@Duh zZzwnz8iRx!hrZb+QJdfjWRIiDdu^!xG6k+MqbhhDq%SE^A)IYbGx1_7q{EydIZPc& zi#+$zuf2Vp)Wf-H-(z0XkLcQ(g{(5*l+NEG<$sxidmO+H&@knT`6IxqQ4!fS}Yh{Z9LrXM}mvgK3cdI$c z!Kg)xCW$rmHHC`uNhukaUCJ$=H%T@tOLFFen}ATEP`%K>z5=qed96J|fj;~%m9vXf z(g!OTJ`cs@Y4`Y#NRNZF_56@cSzemc9+(mAE1Xwl=-&o1j4FT@;Ep>r@Q%_ZpxutNR zsL5_#yN7DF(jeHk2U3FmQeIg+<=&hL0tP8nV>oglh>5YPP`N(DiG>w~?AZ zr4}h!vPn~L%PmzasI2tnU2pJPVv6f+RqN(w2-Cyia4|_<4zQ{Jp0M|0%7x=N3rYp^ zFZY;j$8nd(i!@n4M?l)lf0iAaHH!(0O5WMGw3x&jwyKj$?SaCt=-R-hEufqc^1;em zHg7=>X4cTl%MAf9uS@4JQTo!-(k~r{E^(G~#54uFbVq~fI6y>rVG>ZF{^IZ#WTLvt z=~t5TL$}N(2YysPRdn{(8%z^eRW+8dM%|D8bml&?=z9y4g3gD5eY+cGbbPS;;*0^Qu5p$5I3_nk4*n6-{ybW$c*~I0Jb%H*ie>Z0-&mt{BbuN` zeyka&oAny>8n=Y&W=qztof+?M#JX2#yphQ0h{Qxq#k}OWc9}>Re(?TAiLaT;c@w(;=t`E#Q*P+|8qITJ zB4vh9jG7THJkYN!#_*(KU~|X%6)d<{3Ndq!3e_J;KOCy$jjyO&P=KB1I)_e7Em5vv zPi0X*mL@V~O?|7|<6u_9q(NQExNyGMT_tV{5^iWUW@o@9<)$^B#FzUTNzsL4qSo`@ zNZ{>5bzPe&;g;Ykvv+3LJ4Y{|?)Q_?6uyW6{n}04MY*I?1>gzc0JJ_fu&II9ZsEI{ zT{=ZiDKSa41_8K)4yo7roH5{P<_Lm{ro%ZPxAkmqdZe^>?x)G}@z@?!$|6}BWSeI@ z`%NYiUG7lRB3<+~VBE2NJvWVk4Xp@Pw-#bM>3Vzw9y;{n3* zu_W3|swL_DO}gpDdtdNio(kw84a4Eh13@KP*B}E%Zo>m# za>ZLX+R`oHtIhgX%)$EjfT+YfyilN;qSVszE$zs7VJza9#rcUHi<$^%$lHldf zb~&MW2>A_sN&qYdhu*yIp>UVr{qg6qtdonUSMf5mlt$s+(O=Tq zODMnKO|T>xwy*$x<}SZolROynY?YJbf)05QI%Asdy-w&(Fh_>yb$vTt2a%Ts-!;`4rHm`Ue!*6=fztui4_HXrlnKE6 z^6U)gjQRh1T%HpmdP#joD2Ot72@r8#FxXl0T$ypL%I>YR)$>28&iFI~!!R-418O|{ z@cIj=z&}@grs~gPjE~>O=~Gh&+Ka48&x%x4Dl!qtxbrn@5&Mi{s!5Z^S)*P_SK?tm z{^Tt%3(cQ*bAhyYxvPnA)^1Qr%XUQ_>NnHleL5pt1s4wPrCTn?7pY)bn?2;f+5B40 zPuF~(GkKsivSsij?%VzrYYu%Sa4XDU)jArissL{Dlg zi5DWQl&tu#g(N1RaR$m)?BIo^r7jem&*x`fGW=I4#kAhC zU+AzGt4kA-+J&djRvfD^5`7(ySSS75-S0ZtlE02wU zV+t4lW6v{B{ zGWCl8l<(}~RCqTNzjS3B{p

gkPh>3iAeBg&a|CJ+um)>DfHZK<`7IqxyA|+wMWF zTqWovN)9t=rZll{2~YqU6sQ@ra=*H!R|uG${pE&40@hBu-o$oI6$Of)=20?UnkF?@ zG)NnlQ=a;5lAHR{QMQ`0$Ap1yU;H(1k`z%es^8TG{epJP(bg<@_4T^4W{FtiJd{#r zsWc|UgvG5i&REs|AS=_*3W!ME7`BY?sy25^GBw8)JVXEd(HjJHOG$%cVwCkU8EZsL zu#DXx&=FY^MKmm7E!ZGwe0L-e9&K6gB9U2HXRc~Hu2>u#=lzESU)TC!4+QQ)-;A7p z`#tbwm9+a=!W%n-gBqgYs+p!hc>R4HJ$(=QUhd3~pK%OI){d1l+)&9B*ttK~EQgJG zK7C|dksxg~mGXz>I#=ZpD#YGX4(tW(?*%@0tK83vB??P${^W76qi(A;~R#Qjp`;H#AIjy05q?Bq&Ja?t|C)($drU)7Bk#KF;)j3?oYL zLg|x}Uh})q;;v-szuY-V2?Bxq0bIos5ZoTUz6&tP#-xsjbGEwRfrt0c_&WNIx4VC- zF|n_{N;*Z8$l7>v*@~XWhYip*I1RN))99^gT*w=TUU%H_4=X<&{b+db`puqpT3W_f zwT|{KHIMNPJgjjH4hJ}94VIjXB@)U5^vaN2F>xd+IR2X z4L;QW@z`N(<`(H+7==QnBw+9qTvakG=` z9(dT`Q~hi6=yg1M`|95P#1x^-Yob`SA(JuM3%g3@E<`(s)> zvg4J3Mbj&PcytWx^n>RnCH8e#*_>~?y{vUvXL!0)TCdMU^9%F3&fb9D;RBTc@3h{j ztXC5}t*26>!K2GGlO|Fjni}l-#lCoyidKgPx1-|XzK+iCBh9V&fzP_vKLvT3;e|U@ z9i|GS;gh;iK;9Jh=3#)~A&D`R5e541(Z-q4S04BO@F|)WXzuRG01IRQq95EfkI2vd z{q-WZ=L@~j1TE6YpU@9Rj^|DKI20p)-q?FZFOB39#rE2gEOqI4K?kTkd^!5O>7q&2 zXZhw7T1=uG$gRTzM2h?S3mmX5fUpok6l%&t?s+0>6QWP^aDm zPmxJl#QM`MoUbapCBl)U~7!Lbd#se?!)XMNV(Or9|Hi9C}%oFs4 zo)~|m&aMbP)%4v>(aIZWXyS$*R2|wlep;v?o3~DY$VNHw2tw_#`1YiMag>pKsZp3u zIX?s0HTFHG1yU4dCwHZUu??*BOAVPhmp=$9_fiXT~+DSw<^!u`&CCqlr30fCN{j{P~pt94ZGje zbK&GVWv-^Ky6qoyPW@ZPZXhBstT8Z9jt)sL;FWlHc6Y?ED$YA18>E^uoT-DxR$BXU zXu{SILP89N5mxO078eOD^6#t58aN%jP5a`Hfs%aUqLAVTuh1D~=$<%5?>s+$OSK5SF|N}HTrmwK~} ze|W4p36}8wyEi!mr?OrgB#6{vv58$q=4k`vmCbqU{C5H@-L>0xO$tBg!07@>JzM@G zY8rT~OPyQ7vlbLJIK7EwS&71i9(m_`3}2|yD&7^jp&z|^TyEnFi~mPAyzmVXL^{_< z^A&-+d{>U4Lm?jkitlUms*jd3;6wZg$?oBDMNZX0b;M~&={?Ju2#kFf@e_Sr8yg$) z&!H4}@WJw3!(VAQ*AWvFQ<&)sV`H`J5^MSNMW9ndHG1SXmU!je!LCU(OyJSq?r+#M zufCaCR=v71&SLP?;Hvh3`6lT<`6conEODKa2g(?yS zcO34kK|fQSr`RkMdp^|P8HXG6wZnRPO)M;QcB9;KO@oeoDg%$&Zb0yyZyz5G(KruCrr(xsfA0vrsLw5V4!FBz|vmMbc@=d~h zIxpGDkM9%UUFzfjrnHCeYLqEw(#PqHGCcT?k(9_!oqHNjAp-($t~1Ih-*1o?Cr9*- zv5%wgL$QKV4e}Hf#9?17Ymkwwj3J&+FCw}sI^mkvoie}02IXj&mL0!{86CDAd3Nl3 z(j4C8OB0KICR1^mtBmwzmL26^G1%y0=T~~7%$-0|%`%~k8^%-&3CZHChZx)lQ!X+ zN?HtNjVub$5nmWd+H}7UU^x4N@D^&@U}dcbkR!Am?N;s;K~?xP5`t0GDVA?ww4=+9 z@%=R(q`vfPS}=>ZT}j-mcR?Bek-AQ!#{YwyHd-_c7h^eNPIDW1dP8uG<)MDe7sV4v zd2$5hqiP0&Os8bGtYJ4n!v+lMUUlkxjG8#D+#Db(o;z8U0E}1c7~hiks)~rX|El9J z{Vf@x|MhNsm(Ab2{9t-&px4|BJCWf@0yqD`8Vd@i~V zd717yPu7?qjO3pE9?*BeHw`>Ea|dZ?^_aND{`pe}1-^Di`>qo@w*-gX#FrGgVgE{s zw|GYrO~`z*8DD(uc%ix1p7GZ9uTF(d+z|;e1)72$`51{e0 zd$ZfAjn2^E58qcl4&--Vr)63#qK|aI!^Av%J`X^opV?{PcqRfw*{<`y68C>ZkOX`{ zh8?lo{C7ib8($Nw5VKWZ&yFv_;_zh7?Ba&=bjqyN&aXprSz0*WYTyn|( zy0qM66h+2(6(IbnnwlE*f=24~-~=R()bh*9VtaafgN&tuep@shdd+0_yzo$tv4lY2 zB8$m?r7HaA?1(-x1HGC4+J=DKE>%gL2k9b7>+`Sl3dP$%;V;49PTs>uk<48CKLdn@ zmSgH%=YIH`Jr9fvxfAf4QBTDE#$VC(x{=IB2!P(_g8k&Y)p4y-a~&G>9cx5eN+QYr zH!ul)uPh{L?+O2@JFoDWSl>6P+2b5Sgt@*Q6RP@ zQfbc3>s{_jA

+?T_P+Yz*)s&q+}1O;kVGwx}H)SPF{6h-MJ8^Js?BgyKz9d8^o9 zOoK?lLK+vQpZkF&ysj zJ2M^#gQLtr@~1`Nf}JRbq8$)73##AFqPqy=w{_!6W*FbH&E<=~Xedx9(UOR!dsN%8wo_#`B2&Mq)M60<`Jj7hm8xZaPNM)hy_zK9(8V!ap#s-;)dFR$@DAUGQ($ri}gGK9ce+D~x?h527_3)QM z`AeD@91c)M91-69<+~J>-5H-g%s-~~-`H`9hOt|xzWk9G)-BD-ibw^b0X(U&pQ_)d ziytiY56R>bRC!s{8G0vH)<3ypRJKSezlHBUrSbx29q8zKLYg^Int7~5cxxMfH$r#< zH-S*#W#{KG~k zL-k$gtL>LPYD`*|qAwqrXz*0mFff*MJsm$bitOIh5lnm3oWpwR;e?ck1e8f#~DF-v0&ZIjF<0_AeREsQi3N7&9bMIyotKLd& z{!iVsw*dpN zfkC_B2WDew0#vF~q6{PTZ>YX_{iGPx{|hR$>50Pe)4!ikRmYusKiFNR_)Q_W9dAUT zs*7739|Q(ce@UQ&q1GV?w_?9p%uz8yHKzz?c%GPLC!4=F*{0%NdXOy2fC42@C-_zvt zzEb$CA*C{Z$$<}?5N_z~>nJ`6-~Hf=)2I&4+w{6b$}I!bRma_*X_Ro^cHUt87MZd} zqN1WcB5u6Fw;FVH6ShciaVg{+XZQHMCr9ih44JA&!=zmBQ+-RuBexO{H>$FrfXJd+ z=^9|ScTL2%X@TM(O}tK>fA@QPrB*86%TzTYK5)7=Kd;5_-rin$hPN0$^*6WhDIuJI z1?V!tFY39ZY0mppTf4^n<#%R$SB^Ax;U8>!MiB5Ir&l#<|6SYt9)<_t&3_^Lv$$oONH^>Fc7n29x)gQzo9o_^5`b1T4)v8B%i=$x+P`;gJTt!+*O@!L>PC9+Io>~Cv-k#|>`IKA ziQDO_G+sBUUGXK;&m%JF5*Z_@V!Q;>*QPPaR-9hf;UJ?b4x}1*IebMH|(`EmUi&P&r5j8DlM-zyRc2lcD zmfVm;LC%0adSJ_*wT7Z9a$_L7lhL>+KM6y))m#BH-3%t;46jQbTSf-bEi~vJ7k*{yhK0DpnHOc+DS@ zDM^mYdVS_xin5m3op!Y6hT?il2Kz>@beWr)N&%N8mk>cMu+%}+3S^-$iH`?KNy>!o zzR>$vPDWkW;!0Cecy>oacidI)MmF0rk<`BvQ{q-337+`&!Q}jqsp8m2Cg`yDZLL2q zQoUpv{8B=rM&vG3r1{j^nN1u34U8K)(ZQYOc?!ZV8VJX7FU~lXOfN59nYG}A%3hy) zocfCov_moTA;obb&GDQt(cIa9BbaKI24_`1w(2T9H^~1c z%!(3OD0A7e9ilqoIvW znxeh*6m`8;`aV9PQN-Vo*a|%TlkM&_5>00^+go{CrLf_Jxly107pDxCl7Nw$=0LF%P{b^BpRRVzrO zS^8IxdEmU7x6)k8{tj+pO!3lhOCbPVKPCCe=KhnP1OFR1`dXcwB&2>tzN8-pvm-GZIeE=(kveh(_TQfnuS{z zTr+o<7;63Y_+)oP_|bRYa=sD^IQhg<;caTUN3%BlNxZquttwN(nY7&9U3NXk>+>AG zL0xlc0SP(9w+VRzm`0)N=@Dv4Yk%mi@mR1AS3^oeNP8^PKJLB1{zik)^Rp`z{@i_*)5wGNC9NHn z%H74as*5x9RE@*%x!)dSzCfhnf+mqwJI%eN8@C{YS;+1=PTWPVuG{xA1npKK)t}Gt z$8)83c@6#`tAR43L!Jj2a|LV42OJjNHMP>pmUJ!FQ^x@*-rG(7YQ56u9-7)oiu|v-}xM;N86uoTvUfH=hgp-VM5t&=eM#}mwV$y-q_KV@0sh^oWYS|7wPX$j~(_S z#*S)Uv=k;{JMYvX4lZb*O25E7M~{V4-JxKq-Ig=qp*ui_+BCNT`2g{fZ;@t9%zSHC zZlk{Yzb}sXVtTIc1js+1>_}iA8mp*#j9hy%S$Jes`wb**zxe5G;&61zQAc~f83E(m zNYL65hwpSsOm}sp#rFS1l($eHROu44N>?P}4$@SwikgRgQ4J4d| z2c1i%<%L|voc!d`W_)Yq(O8$1cW+y{aR2lx!FEL?tO$o#$sLKN3Z8!J5VB8qFd1}2 zN(`Tt^buWZ<+xno#SjF^x|%xjZl(IpX4%8yqbq#Y$6Q1?b&v;>!icT6ql%(o=QP6h zLdhq^Hy_RMuPyRe?MSzNfPLHX6tQcYfl)MK#;UB{Vc&udu_ZA<=aDa4FOC`}d!!^1 zDlN%4z4cX;6u=@iOWAH*?jcu(dY}IM$~K2c_kPm;FuY2(sr?9wF&=-uG56Jj*D_>7 z@$;N|QV@n732{-^a48cm`#K}D;5Md#Q^n48gQb!am{Lz-=ox@52X+bp9juOqQ&88> zTU;$ygd3P*U1G)L1i1@$$3a9VhvT}G?9RMjBJlF{Y4iyV7xEBetH;)L{?)krbn!J4 z^3$unRkB+Cw*|q$Dhj{*#D%Rx@UV&%;PW@VH4ko}ocV92PV3=l>aYg`Cjzy3;+S_g zxX-E$v^lc4g)PZ_*~X=K>DF=}xi(4&i^$?D05xy;zfxKq+1BxNE+Y$@)i2oKnsWc1HG)BGrXvbr+X+g9SO|G)e(43s z!(Z$2Sj_)q8*Ss>?VF2DZihIq<#J1;josjs@O19VKp9S(|?ved7KYvv#a^#nt0} XvsqJzO&|ZAM*=N1kZPsM%kcjLJ(vnH literal 0 HcmV?d00001 diff --git a/.gitbook/assets/image (6).png b/.gitbook/assets/image (6).png new file mode 100644 index 0000000000000000000000000000000000000000..cb0a9668730cb023257d92c93d1574d6a4366130 GIT binary patch literal 30662 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 XvsqJzO&|ZAM*=N1kZPsM%kcjLJ(vnH literal 0 HcmV?d00001 diff --git a/.gitbook/assets/image (8).png b/.gitbook/assets/image (8).png new file mode 100644 index 0000000000000000000000000000000000000000..506b8760d76f6d73896aa7936adb1fbf66240109 GIT binary patch literal 61929 zcmV)_K!3l9P)p>?5XBKky7i{MhlN(eSV1x3*cT9#_^zL~qu%$=EYX1V|6z4IWDLJgXo(Az#{uk8Wmwy(2Q~qV~ye-=Pxp^=~znQN59V3$iP0bjeOrkQ03B+Ms zi!)l|8o9Qk9D5Jgfm{eo*kRkEYt^mnJ zqI#xTtrjVyNGCvq87ZL%HFOz86&`2%$s{V1n98lZ(z0PSih@QGs*yA*XR8^-OkkTB z0Y-ok=oJC&4Rx=Y0)&tE{5QbS97Xeil}%DMK?+&O0M+2lYBkzPQN2o3`Kb`1f()tT zr`q_6a-t3HQ6>RGVp z(Tm}lZP&mL?!6s;aL?`ViwFK&b0{B^w9rWHwP^Qwe&U%?N6;(XbWa)y)9JF(GFDlt zBngs0wRKF`@_G{#6q5D+LaIKhCv_dHyv-M^j?Y>bHnmJDcCtLRYzBx~M1_Ekc}ym_ zv$fB7_9>g593@_ZvL!}OUv*;SVz}C6HZNnnDqSN0!A>*jon4ya0eSEdij^HY`K%4efElWMe&=853&^s49!f zmcpL;&P^+ct8b6p{ju-|kNyMkYj60AeVz+bzuXM}e(!Y#Au8>y36WSC`eWr7P)myB zUoL(8F)(reZg9o-E{D7R=Pql$VF^xe$rusp0!@vP-3D51XQ^y0mu3fs<0ulL+GgBC z>f|3of$}_C;3�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

I@Y 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 literal 0 HcmV?d00001 diff --git a/.gitbook/assets/image.png b/.gitbook/assets/image.png index cb0a9668730cb023257d92c93d1574d6a4366130..fa6c2301d99418d731304d2b31ef4c53aa8a9559 100644 GIT binary patch literal 17697 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

An example of a Modmail thread.

@@ -52,11 +52,11 @@ Visit our [installation page](installation/) for detailed instructions on settin ## Supporting the project -You have various options to help the project. Giving this repository a star is greatly appreciated. You can also help people that have trouble setting up Modmail at our [Discord server](https://discord.gg/cnUpwrnpYb). +You have various options to help the project. Giving this repository a star is greatly appreciated. You can also help people that have trouble setting up Modmail at our [Discord server](https://discord.gg/cnUpwrnpYb). If you like to show your appreciation, consider supporting us on [**Patreon**](https://www.patreon.com/kyber)! -### Contributing +## Contributing Support Modmail with your contributions! Whether it be improvements to the documentation or new functionality, please feel free to make the change. Check out our [contributing guidelines](https://github.com/modmail-dev/modmail/blob/master/.github/CONTRIBUTING.md) before you get started. @@ -65,5 +65,12 @@ Support Modmail with your contributions! Whether it be improvements to the docum * Read about [installing Modmail](installation/). * Become familiar with [Modmail commands and functionalities](getting-started.md). - -{% hint style="info" %} In this guide when we refer to bot commands, we will assume the prefix to be `?` and will display them like in this example. `?help`. Optional arguments will be in [brackets], for example `?close [time] [reason] [silently].` Required arguments will be put in , for example `?permissions add ` {% endhint %} +{% hint style="info" %} +Throughout this documentation when we're referring to bot commands, we will assume the prefix of the bot to be ? and will display them like in this example: ?help.\ +\ +Optional arguments will be enclosed in square brackets:\ +Example: ?close \[time] \[reason] \[silently]\ +\ +Required arguments will be enclosed in angle brackets:\ +Example: ?contact \ +{% endhint %} diff --git a/SUMMARY.md b/SUMMARY.md index 545f206..dda94dc 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -14,13 +14,12 @@ * [Raspberry Pi](installation/local-hosting-vps/raspberry-pi.md) * [Railway](installation/railway.md) * [Heroku](installation/heroku.md) - * [Replit](installation/replit.md) * [Community Guides](installation/community-guides.md) +* [Getting Started](getting-started.md) * [Usage](usage-guide/README.md) * [Plugins](usage-guide/plugins.md) * [Configuration](usage-guide/configuration.md) * [Permissions](usage-guide/permissions.md) -* [Getting Started](getting-started.md) * [OLD DOCS](old-docs/README.md) * [Installation](installation-1.md) * [Installation (continued)](installation-continued.md) @@ -34,4 +33,4 @@ * [Seperate Server Setup](seperate-server-setup.md) * [The Unofficial List of Plugins](the-unofficial-list-of-plugins.md) * [Updating](updating.md) - * [Video Tutorials](video-tutorials.md) \ No newline at end of file + * [Video Tutorials](video-tutorials.md) diff --git a/installation/README.md b/installation/README.md index dd45d92..e60065a 100644 --- a/installation/README.md +++ b/installation/README.md @@ -4,24 +4,24 @@ description: Modmail hosting and installation guide. # Installation -Modmail is a self-hosted bot. This unfortunately means that there's **no** public bot invite. Furthermore, due to the inner workings of the bot and its highly customisable interfaces, you will need to host your own dedicated Modmail bot. +Modmail is a self-hosted bot. This unfortunately means that there's **no** public bot invite. Furthermore, due to the inner workings of the bot and its highly customisable interfaces, you will need to host your own dedicated Modmail bot. -This section provides setup instructions for Modmail on many hosting methods, both **free\* and paid**. +This section provides setup instructions for Modmail on many hosting methods, both **free\* and paid**. -\*Some free options require a credit card for verification. +\*Some free options require a credit card for verification. Here are the basic requirements for hosting your Modmail bot. You will find instructions on obtaining and using them in later sections. -* A Discord account. +* **A Discord account.** You will need to create a Discord bot under your account. -* A MongoDB database instance. +* **A MongoDB database instance.** Modmail will store its internal data to this database. -* A hosting server. +* **A hosting server.** To keep Modmail running 24/7 in your server. -* A Desktop Notepad, Notes, TextEdit, etc. +* **A Desktop Notepad, Notes, TextEdit, etc.** Anywhere you can copy and paste to temporary store some texts while we set up the bot. @@ -31,7 +31,7 @@ Here are the basic requirements for hosting your Modmail bot. You will find inst ## Create a Discord bot -The first step in setting up Modmail is to create a Discord bot. +The first step in setting up Modmail is to create a Discord bot. Head over to the [**Discord Developer Portal**](https://discordapp.com/developers/applications/) and create a new application. @@ -99,15 +99,15 @@ Navigate back to the **General Information** tab and copy the application ID.
Screenshot of copying the application ID on the general information tab.

Click Copy to copy the application ID. This is also known as your "Bot ID".

-Using the following URL as template, replace `YOUR-ID-HERE` with the ID you just copied. Do not change anything else! Open a new browser tab and go to that URL. +Using the following URL as template, replace `YOUR-ID-HERE` with the ID you just copied. Do not change anything else! Open a new browser tab and go to that URL. {% code overflow="wrap" %} -``` +```url https://discord.com/oauth2/authorize?scope=bot&permissions=416075476184&client_id=YOUR-ID-HERE ``` {% endcode %} -Discord should prompt you to choose a server to invite your bot, followed by a list of permissions. Scroll to the bottom and click **Authorize**. +Discord should prompt you to choose a server to invite your bot, followed by a list of permissions. Scroll to the bottom and click **Authorize**.
@@ -137,7 +137,7 @@ Your bot should now be **offline** in your server. Congratulations, that's as ex ## Create a MongoDB database -Modmail uses MongoDB to store its internal configurations and log histories. You must create a MongoDB database in order to use Modmail. +Modmail uses MongoDB to store its internal configurations and log histories. You must create a MongoDB database in order to use Modmail. We will be using [MongoDB Atlas](https://www.mongodb.com/atlas), which provides us with a free 512MB storage share—more than enough for Modmail. @@ -172,9 +172,9 @@ In the next step for "deploy a cloud database", choose the **Shared** option. An It's possible that you verified your email in a different browser session, or you manually signed in to MongoDB Atlas. -In this case, you can still follow the same steps below, but first click **Build a Database**: +In this case, you can still follow the same steps below, but first click **Build a Database**: -![Screenshot of homepage and click build a database.](../.gitbook/assets/Image22.png) +Screenshot of homepage and click build a database. @@ -190,7 +190,7 @@ In this case, you can still follow the same steps below, but first click **Build
-On the following **Security Quickstart** page, do the following: +On the following **Security Quickstart** page, do the following: 1. Authentication method: _Username and Password_ @@ -245,7 +245,7 @@ My MongoDB connection string: mongodb+srv://modmail:@cluster0.example. ``` {% endcode %} -Finally, you will need to combine the database password with the MongoDB connection string by **replacing** the `` (including the `<>`) with the database password. +Finally, you will need to combine the database password with the MongoDB connection string by **replacing** the `` (including the `<>`) with the database password. You also need to **remove** everything after `.mongodb.net` at the end of the MongoDB connection string. @@ -258,55 +258,85 @@ My MongoDB connection string: mongodb+srv://modmail:elAO7wF1r07pNG6u@cluster0.ex ``` {% endcode %} -You finished the MongoDB steps! At this point, your bot should still be **offline**. You can now proceed to the [next steps](./#next-steps) and start up your Modmail bot. +You finished the MongoDB steps! At this point, your bot should still be **offline**. You can now proceed to the next step which is to choose your hosting method. -## Next steps +## Preparing your Environmental Variables -Click on one of the links below to view further instructions for your preferred hosting method. +Once you have finished the previous steps, gather and save the variables listed below as they will be needed to run your bot in later steps: -### [Railway](railway.md) (free) +* `TOKEN` - The token to run your Modmail application under your Discord bot account +* `LOG_URL` **- \[Optional]** Logviewer URL that will be used to view threads in your web browser +* `GUILD_ID` - The ID of the main Discord server that your bot will operate in. +* `MODMAIL_GUILD_ID` - **\[Optional]** The ID of the Discord server that your bot will create ticket channels in. This is only needed if you want your ticket channels to be created in a separate server, for an example, Staff Server. +* `OWNERS` - The user ID of the Discord accounts you want to set as owner for the bot. Can consist of multiple users, separated by comma. +* `CONNECTION_URI` - The URI the bot will use to connect to your MongoDB instance. -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.[ **Go to guide ►**](railway.md)**** +Your finished variables should look something like this: -### [Local Hosting](local-hosting-vps/) (free) +{% code title=".env" %} +```py +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/ +``` +{% endcode %} + +## Hosting Modmail + +Your next step is to choose one of our supported hosting method that's available and preferable to you. -Do you have an old PC, a Raspberry Pi, or a Linux box that you're able to keep online 24/7? +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. -You can host Modmail on it for free (electricity fees may apply).[ **Go to guide ►**](local-hosting-vps/)**** +### [Railway](railway.md) (free/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). + +### [Northflank](https://northflank.com/) (free/paid) + +A PaaS like Railway but with more advanced UI and more features. Does require credit card for verification but has a dedicated free tier that has no hourly limit. Learn more about their free tier and pricing by clicking [here](https://northflank.com/pricing). + +### [Local Hosting](local-hosting-vps/) (free) + +If you have an old PC, a Raspberry Pi, or a Linux box that you're able to keep online 24/7, you can also host Modmail with your own machine at home. Since Modmail doesn't require intensive resources to run, you can get by with a system having as low as 1GB of RAM. Setting it up can be quite advanced but you have complete control over your bot instance. Refer to our local hosting guide supporting a few popular OSes by clicking [here](./#local-hosting-free). ### [Modmail Patreon](https://www.patreon.com/kyber) (paid) -We offer paid hosting solution for your Modmail bot. Hosting Modmail with us costs $4-5 USD per month. +We offer paid hosting solution for your Modmail bot. Hosting Modmail with us costs $4-5 USD per month. -We will also fully manage your bot hosting for you, so you don't need to worry about upgrading or setting up your own host server. [ **Go to Patreon page ►**](https://www.patreon.com/kyber)**** +We will also fully manage your bot hosting for you, so you don't need to worry about upgrading or setting up your own host server. Refer to our [Patreon Hosting here](https://www.patreon.com/kyber). ### [Heroku](heroku.md) (paid) -Another popular PaaS that's used to be free. However, their recent pricing adjustments, it now costs $5-7 USD per month. +Another popular PaaS that's used to be free. However, their recent pricing adjustments, it now costs $5-7 USD per month to host Modmail. -If you are currently a higher-education student, you may be eligible for the first year free with their [student offer](https://www.heroku.com/github-students).[ **Go to guide ►**](heroku.md)**** +If you are currently a higher-education student, you may be eligible for the first year free with their [student offer](https://www.heroku.com/github-students). Refer to our Heroku installation guide by clicking [here](heroku.md). ### [Cloud Server / VPS](local-hosting-vps/) (paid) -Apart from [Patreon hosting](./#modmail-patreon-paid), hosting on a cloud server / VPS is the most reliable hosting method. Rent a virtual server from any reputable hosting provider for roughly $4-10 USD per month (price varies), and you'll be able to install Modmail onto the server. +Apart from [Patreon hosting](./#modmail-patreon-paid), hosting on a cloud server / VPS is the most reliable hosting method. Rent a virtual server from any reputable hosting provider of your choice for roughly $4-10 USD per month (price varies), and you'll be able to install Modmail onto the server. -This method is a lot more "involved" than other solutions. If you're not comfortable with configuring remote Linux environments, we recommend you to choose a different option. [ **Go to guide ►**](local-hosting-vps/)**** +This method is a lot more "involved" than other solutions. If you're not comfortable with configuring remote Linux environments, we recommend you to choose a different option. For this method, you will need to refer to our Local hosting installation guide [here](local-hosting-vps/) and choose your desired OS. -### [Replit](replit.md) (free/paid) +### [Replit](https://replit.com/\~) (free/paid) -> The Modmail team does not recommend this hosting method. +{% hint style="warning" %} +The Modmail team does not recommend this hosting method due to their highly unstable and heavily abused environment. That said, we still decided to list this option here as a method for users with no access to valid payment cards since most hosting platforms require them for verification.\ +\ +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. [ **Go to guide ►**](replit.md)**** +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). -### Not satisfied with these options? +## Community Guides + +{% hint style="warning" %} +Community guides are not verified by the Modmail team, so use them at your own risk. +{% endhint %} -Some of our community members have created their own [installation guides](community-guides.md) for Modmail. Feel free to check them out at: +If you're not satisfied with the options listed above, some of our community members have created their own installation guides for Modmail on various other hosting platforms. Keep in mind that Modmail support staff may not be able to assist you much with community-made guides. Feel free to check them out by clicking the link below. {% content-ref url="community-guides.md" %} [community-guides.md](community-guides.md) {% endcontent-ref %} - -{% hint style="warning" %} -Community guides are not verified by the Modmail team, so use them at your own risks. -{% endhint %} - diff --git a/installation/community-guides.md b/installation/community-guides.md index 6dd8c81..b8fabeb 100644 --- a/installation/community-guides.md +++ b/installation/community-guides.md @@ -8,4 +8,10 @@ description: Unofficial installation guides created by the community. Community guides are not verified by the Modmail team, so use them at your own risks. {% endhint %} -TODO +## [Replit Guide](https://gist.github.com/anondev-sudo/24978429b85b44348bcff5c0885afe82) by AnonDev + +Insert description here + +## Northflank Guide by raidensakura + +Northflank is a Platform as a Service (PaaS) like Railway that offers abilities to run micro-services like bots, schedule jobs that run periodically and databases with a powerful UI, API and CLI. Their panel is a bit more advanced as compared to Railway but comes with the perk of more customization and features. You will need a valid payment method to verify your account, but will unlock a free tier project that's separated from paid resources. They will not charge your card if you go over resource usage as you have limited allocation per service. diff --git a/installation/local-hosting-vps/README.md b/installation/local-hosting-vps/README.md index 998044b..6a222fb 100644 --- a/installation/local-hosting-vps/README.md +++ b/installation/local-hosting-vps/README.md @@ -2,23 +2,24 @@ description: Hosting on the cloud or on your own computer. --- -# Local Hosting / VPS +# Local hosting / VPS -## Requirements +## General Requirements -* Somewhat recent hardware / software. -* Stable internet connection from hosting server. -* The hosting server remains online 24/7. -* You have completed the initial steps: [invited your bot](../#create-a-discord-bot) and [created a MongoDB database](../#create-a-mongodb-database). +* A supported hardware to comfortably run your chosen OS or a reliable VPS provider. +* Stable internet access and uptime for your machine or host. +* You have completed the initial steps in the [Installation](../) page. + +More OS-specific requirements will be listed on their specific installation page, you are free to choose a supported OS of your choice from the list below. ## Choose your Operating System -* [Windows](./windows.md) -* [MacOS](./macos.md) -* [Docker](./docker.md) -* [Ubuntu](./ubuntu.md) -* [Debian](./debian.md) -* [Fedora](./fedora.md) -* [AlmaLinux](./almalinux.md) -* [CentOS](./centos.md) -* [Raspberry Pi](./raspberry-pi.md) +* [Windows](windows.md) +* [MacOS](macos.md) +* [Docker](docker.md) +* [Ubuntu](ubuntu.md) +* [Debian](debian.md) +* [Fedora](fedora.md) +* [AlmaLinux](almalinux.md) +* [CentOS](centos.md) +* [Raspberry Pi](raspberry-pi.md) diff --git a/installation/local-hosting-vps/debian.md b/installation/local-hosting-vps/debian.md index 874c4f9..a5e361e 100644 --- a/installation/local-hosting-vps/debian.md +++ b/installation/local-hosting-vps/debian.md @@ -4,8 +4,194 @@ description: Deploy Modmail on a Debian server. # Debian -TODO - ## Prerequisites +* Root access (**`sudo`**). +* Minimum 1GB of RAM +* At least 2GB available disk space. +* Supported releases: Debian 11 Bullseye, Debian 10 Buster. + +## Dependencies + +* Python 3.9 / 3.10 +* Tools: `git`, `wget`, `nano` +* Additional Modmail requirements: `libcairo2-dev`, `libffi-dev`, `g++` + +To install these dependencies, we will be using **`apt`**. + +{% hint style="info" %} +All code blocks should be executed in bash and line by line unless specified otherwise. +{% endhint %} + +### **Debian 11 Bullseye** + +```bash +sudo apt update +sudo apt -y install python3 python3-dev python3-venv python3-pip libcairo2-dev libffi-dev g++ git wget nano +``` + +At the time of writing, this will install Python 3.9 from Debian's repository. + +### **Debian 10 Buster** + +You will need to manually compile Python 3.10 from source. Compiling Python may take a while (est. 5-10 minutes). + +```bash +sudo apt update && sudo apt upgrade -y # Update and upgrade all packages +sudo apt install -y software-properties-common \ + libcairo2-dev libffi-dev g++ \ + git wget nano \ + build-essential zlib1g-dev libncurses5-dev \ + libgdbm-dev libnss3-dev libssl-dev \ + libreadline-dev libffi-dev libsqlite3-dev libbz2-dev +wget https://www.python.org/ftp/python/3.10.9/Python-3.10.9.tgz +tar xzf Python-3.10.9.tgz +cd Python-3.10.9 +./configure --enable-optimizations +sudo make altinstall +``` + +After following this step, make sure to specify the version when running Python commands later in the guide. + +For example: + +* `pip install pipenv` to `pip3.10 install pipenv` +* `python bot.py` to `python3.10 bot.py` + +## Installing Bot + +In your home directory, clone and cd into the official Modmail repository with: + +```bash +cd ~ +git clone https://github.com/modmail-dev/modmail +cd modmail +``` + +Inside the Modmail folder, Install `pipenv` and the bot dependencies with: + +```bash +pip install pipenv +pipenv install +``` + +Create a file named `.env` with `nano` and paste all the environmental variables (secrets) needed to run the bot via right-clicking in the nano editor. Refer to the steps in the [parent Installation page](../#preparing-your-environmental-variables) to find where to obtain these. + +```bash +nano .env +``` + +
+ +After that, press `Ctrl+O` and `Enter` to save your changes. Exit the `nano` editor with `Ctrl+X`. + +{% hint style="info" %} +If using the `nano` editor is a bit of a learning curve, you can always FTP into your server using software like [WinSCP](https://winscp.net/eng/index.php) to edit the `.env` file manually with your preferred GUI-based editor like Notepad. +{% endhint %} + +After your `.env` file is ready, you can now go ahead and try running your bot with: + +```bash +pipenv run bot +``` + +If no error shows up, it means your bot is now running correctly. + +## Setting up auto-restart + +To have the bot auto-restart on crash or system reboot, we will be using systemd by making a service file for our bot. + +In order to create the service file, you will first need to know three things, your Linux `username`, your Modmail repository `path` and your Pipenv `path`. + +First, your Linux `username` can be fetched with the following command: + +```bash +whoami +``` + +If you have cloned the Modmail repo as a `root` user, your Modmail repo path should be: + +```bash +/root/modmail +``` + +Otherwise, your path should be: + +```bash +/home/$USER/modmail/ +``` + +You can get your Pipenv `path` with: + +``` +whereis pipenv +``` + +Now, using `nano`, create a service file for systemd with: + +```bash +sudo nano /etc/systemd/system/modmail.service +``` + +and paste in the contents below, replacing `username`, `modmail_path` and `pipenv_path` with yours respectively. `Ctrl+O` and `Enter` to save. `Ctrl+X` to exit the nano editor. + +{% code title="modmail.service" %} +```bash +[Unit] +Description=Modmail bot +After=network.target + +[Service] +User=username # replace this +Group=username # replace this +Restart=always +RestartSec=10 +Type=simple +WorkingDirectory=modmail_path # replace this +ExecStart=pipenv_path run python bot.py # replace pipenv_path only + +[Install] +WantedBy=multi-user.target +``` +{% endcode %} + +Now, start your Modmail bot with: + +```bash +sudo systemctl start modmail +``` + +If everything goes correctly, you should see your bot online. You can also view the logs of your systemd process with: + +```bash +sudo journalctl -eu modmail +``` + +With that said, go ahead and enable your Modmail service to auto-restart after crash and reboot with: + +```bash +sudo systemctl enable modmail +``` + +If in the future you need to stop and disable your Modmail service, you can do so with: + +```bash +sudo systemctl stop modmail +sudo systemctl disable modmail +``` + ## Updating + +Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. + +If for some reason your update command isn't working correctly, you can update your bot by going into your modmail folder and pulling the latest changes from GitHub like so: + +```bash +cd modmail && git pull +``` + +Be sure to restart your bot to apply the changes. If you followed the above instructions on setting up auto-restart, you can do so with: + +```bash +sudo systemctl restart modmail +``` diff --git a/installation/local-hosting-vps/docker.md b/installation/local-hosting-vps/docker.md index ba2d7c2..60d9a1b 100644 --- a/installation/local-hosting-vps/docker.md +++ b/installation/local-hosting-vps/docker.md @@ -4,24 +4,114 @@ description: Deploy Modmail on Docker. # Docker -TODO +{% hint style="info" %} +Docker is considered an advanced setup, it is recommended that you understand how Docker works before deciding to use this method. +{% endhint %} ## Prerequisites -- Supported OS for Docker Engine -- Docker Engine -- Docker Compose +* Supported OS for Docker +* Docker Engine +* Docker Compose ## Installing Docker Engine -Depending on which operating system you are running, you should follow the specific [guides](https://docs.docker.com/engine/install/). +Docker has their own installation page for popular Linux-based distros, read them by visiting the link below: -* [CentOS](https://docs.docker.com/engine/install/centos/) -* [Debian](https://docs.docker.com/engine/install/debian/) -* [Fedora](https://docs.docker.com/engine/install/fedora/) -* [RedHat](https://docs.docker.com/engine/install/rhel/) -* [Ubuntu](https://docs.docker.com/engine/install/ubuntu/) +{% embed url="https://docs.docker.com/engine/install/" %} -When installing, make sure you install `docker-compose-plugin` as this plugin will power the bot and additional services needed. +If you're on a desktop environment, refer to the "Desktop" section of their documentation as Docker Desktop also comes with nice GUI that you manage your deployments with. + +For VPS and servers, refer to the "Server" section as you will be needed to learn the CLI commands to run Modmail with Docker. + +After the installation process has finished, you can try running the commands below in your terminal to see if **Docker** and **Docker Compose** has been installed successfully: + +```docker +docker --version +docker compose version +``` + +{% hint style="info" %} +You may need to change your Docker Compose command to `docker-compose --version` depending on the version you have installed. +{% endhint %} + +## Running the official image for Modmail + +You can pull the latest official image from Modmail repository by using the following command: + +```docker +docker pull ghcr.io/modmail-dev/modmail:master +``` + +This will take some time depending on the speed of your network. It will also update the already existing image if you have previously pulled the same image before. + +After that, you can run the bot as a container with the following command: + +```docker +docker run -d --name modmail \ +--env-file /path/to/.env \ +--restart always ghcr.io/modmail-dev/modmail:master +``` + +Make sure to change `/path/to/.env` to the location of the `.env` file containing all the variables that you want the bot to start with. Refer to the steps in the [parent Installation page](../#preparing-your-environmental-variables) to find where to obtain these. + +After deploying, you can view the logs of your currently running Modmail container with the following command: + +```docker +docker logs modmail +``` + +You can stop your running Modmail container with: + +``` +docker stop modmail +``` + +Stopping the container does not remove the container files, so you can start it back up with: + +``` +docker start modmail +``` + +If you want to stop and remove the container completely, you can do so with: + +``` +docker rm -f modmail +``` + +The `-f` will forcefully remove and delete the container even if it's currently running. You can omit the flag if the container is already stopped. + +## Building the image locally + +You can also build the image locally on your machine if the repository files are already in your machine. In your Modmail project folder, simply run the build command below: + +``` +docker build . -t myname/modmail:latest +``` + +The `.` in the command will use the `Dockerfile` in the Modmail repository as the build steps. The `-t` flag will specify the image tag so it's easier for us to differentiate between multiple images in our system. Verify if the image is successfully built with the following command: + +``` +docker images +``` + +You should be able to see the tag we just used in the list: + +
+ +Now you can use the `docker run` command to run your bot using your locally-built image: + +```docker +docker run -d --name modmail \ +--env-file /path/to/.env \ +--restart always myname/modmail:latest +``` ## Updating + +Auto-update is disabled when running Docker as Docker container state is not persistent across restarts. To update your bot, you will need to run the `docker pull` command in the previous step: [Running the official image for Modmail](docker.md#running-the-official-image-for-modmail) if your image is based from the official repository. After that, you must recreate your container using the `docker rm` and `docker run` command again. + +If your image is created locally, simply replace the `docker pull` command with `git pull` and rebuilding your image again. + +To automate this process on Docker, you can look into running [Watchtower](https://containrrr.dev/watchtower/) which will auto-update your containers whenever a new image is pushed on the remote repository. Please refer to their documentation for guide and configuration. + diff --git a/installation/local-hosting-vps/fedora.md b/installation/local-hosting-vps/fedora.md index 8e2d2bc..87e5b01 100644 --- a/installation/local-hosting-vps/fedora.md +++ b/installation/local-hosting-vps/fedora.md @@ -4,8 +4,170 @@ description: Deploy Modmail on a Fedora server. # Fedora -TODO - ## Prerequisites +* Root access (**`sudo`**). +* Minimum 1GB of RAM +* At least 2GB available disk space. +* Supported releases: Fedora 37, Fedora 36. + +## Dependencies + +* Python 3.9 +* Tools: `git`, `wget`, `nano` +* Additional Modmail requirements: `g++` + +Fedora Linux 35 and above has all required packages available in official repositories. Install them with `dnf.` + +{% hint style="info" %} +All code blocks should be executed in bash and line by line unless specified otherwise. +{% endhint %} + +```bash +sudo dnf -y install python39 git nano g++ gtk3 +``` + +## Installing Bot + +In your home directory, clone and cd into the official Modmail repository with: + +```bash +cd ~ +git clone https://github.com/modmail-dev/modmail +cd modmail +``` + +Inside the Modmail folder, ensure `pip` is installed correctly and is defaulting to Python 3.9 with: + +```bash +python3.9 -m ensurepip --default-pip +``` + +And then, install `pipenv` and the bot dependencies with: + +```bash +pip install pipenv +pipenv install --python 3.9 +``` + +Create a file named `.env` with `nano` and paste all the environmental variables (secrets) needed to run the bot via right-clicking in the nano editor. Refer to the steps in the [parent Installation page](../#preparing-your-environmental-variables) to find where to obtain these. + +```bash +nano .env +``` + +
+ +After that, press `Ctrl+O` and `Enter` to save your changes. Exit the `nano` editor with `Ctrl+X`. + +{% hint style="info" %} +If using the `nano` editor is a bit of a learning curve, you can always FTP into your server using software like [WinSCP](https://winscp.net/eng/index.php) to edit the `.env` file manually with your preferred GUI-based editor like Notepad. +{% endhint %} + +After your `.env` file is ready, you can now go ahead and try running your bot with: + +```bash +pipenv run bot +``` + +If no error shows up, it means your bot is now running correctly. + +## Setting up auto-restart + +To have the bot auto-restart on crash or system reboot, we will be using systemd by making a service file for our bot. + +In order to create the service file, you will first need to know three things, your Linux `username`, your Modmail repository `path` and your Pipenv `path`. + +First, your Linux `username` can be fetched with the following command: + +```bash +whoami +``` + +If you have cloned the Modmail repo as a `root` user, your Modmail repo path should be: + +```bash +/root/modmail +``` + +Otherwise, your path should be: + +```bash +/home/$USER/modmail/ +``` + +You can get your Pipenv `path` with: + +``` +whereis pipenv +``` + +Now, using `nano`, create a service file for systemd with: + +```bash +sudo nano /etc/systemd/system/modmail.service +``` + +and paste in the contents below, replacing `username`, `modmail_path` and `pipenv_path` with yours respectively. `Ctrl+O` and `Enter` to save. `Ctrl+X` to exit the nano editor. + +{% code title="modmail.service" %} +```bash +[Unit] +Description=Modmail bot +After=network.target + +[Service] +User=username # replace this +Group=username # replace this +Restart=always +RestartSec=10 +Type=simple +WorkingDirectory=modmail_path # replace this +ExecStart=pipenv_path run python bot.py # replace pipenv_path only + +[Install] +WantedBy=multi-user.target +``` +{% endcode %} + +Now, start your Modmail bot with: + +```bash +sudo systemctl start modmail +``` + +If everything goes correctly, you should see your bot online. You can also view the logs of your systemd process with: + +```bash +sudo journalctl -eu modmail +``` + +With that said, go ahead and enable your Modmail service to auto-restart after crash and reboot with: + +```bash +sudo systemctl enable modmail +``` + +If in the future you need to stop and disable your Modmail service, you can do so with: + +```bash +sudo systemctl stop modmail +sudo systemctl disable modmail +``` + ## Updating + +Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. + +If for some reason your update command isn't working correctly, you can update your bot by going into your modmail folder and pulling the latest changes from GitHub like so: + +```bash +cd modmail && git pull +``` + +Be sure to restart your bot to apply the changes. If you followed the above instructions on setting up auto-restart, you can do so with: + +```bash +sudo systemctl restart modmail +``` + diff --git a/installation/local-hosting-vps/ubuntu.md b/installation/local-hosting-vps/ubuntu.md index 2be5d28..44d3bf7 100644 --- a/installation/local-hosting-vps/ubuntu.md +++ b/installation/local-hosting-vps/ubuntu.md @@ -16,10 +16,10 @@ description: Deploy Modmail on an Ubuntu server. We will be using the following dependencies: * Python 3.10 -* Tools: `git`, `wget`, `software-properties-common` +* Tools: `git`, `wget`, `nano`, `software-properties-common` * Additional Modmail requirements: `libcairo2-dev`, `libffi-dev`, `g++` -To install these dependencies, we will be using the **`apt`**. +To install these dependencies, we will be using **`apt`**. {% hint style="info" %} All code blocks should be executed in bash and line by line unless specified otherwise. @@ -51,7 +51,7 @@ You can manually compile Python instead of adding using the Deadsnakes PPA. Comp sudo apt update && sudo apt upgrade -y # Update and upgrade all packages sudo apt install -y software-properties-common \ libcairo2-dev libffi-dev g++ \ - git wget nginx \ + git wget nano \ build-essential zlib1g-dev libncurses5-dev \ libgdbm-dev libnss3-dev libssl-dev \ libreadline-dev libffi-dev libsqlite3-dev libbz2-dev @@ -62,35 +62,47 @@ cd Python-3.10.9 make altinstall ``` +After following this step, make sure to specify the version when running Python commands later in the guide. + +For example: + +* `pip install pipenv` to `pip3.10 install pipenv` +* `python bot.py` to `python3.10 bot.py` + ## Installing Bot -Clone and cd into the official Modmail repository with: +In your home directory, clone and cd into the official Modmail repository with: ```bash +cd ~ git clone https://github.com/modmail-dev/modmail cd modmail ``` -Inside the Modmail folder, Install pipenv and the bot dependencies with: +Inside the Modmail folder, Install `pipenv` and the bot dependencies with: ```bash pip install pipenv pipenv install ``` -Create a file named `.env` with `nano` and paste all the environmental variables (secrets) needed to run the bot via right-clicking in the nano editor. +Create a file named `.env` with `nano` and paste all the environmental variables (secrets) needed to run the bot via right-clicking in the nano editor. Refer to the steps in the [parent Installation page](../#preparing-your-environmental-variables) to find where to obtain these. ```bash nano .env ``` -
+
After that, press `Ctrl+O` and `Enter` to save your changes. Exit the `nano` editor with `Ctrl+X`. -You can now go ahead and try running your bot with: +{% hint style="info" %} +If using the `nano` editor is a bit of a learning curve, you can always FTP into your server using software like [WinSCP](https://winscp.net/eng/index.php) to edit the `.env` file manually with your preferred GUI-based editor like Notepad. +{% endhint %} + +After your `.env` file is ready, you can now go ahead and try running your bot with: ```bash pipenv run bot @@ -136,6 +148,7 @@ sudo nano /etc/systemd/system/modmail.service and paste in the contents below, replacing `username`, `modmail_path` and `pipenv_path` with yours respectively. `Ctrl+O` and `Enter` to save. `Ctrl+X` to exit the nano editor. +{% code title="modmail.service" %} ```bash [Unit] Description=Modmail bot @@ -153,6 +166,7 @@ ExecStart=pipenv_path run python bot.py # replace pipenv_path only [Install] WantedBy=multi-user.target ``` +{% endcode %} Now, start your Modmail bot with: @@ -183,7 +197,7 @@ sudo systemctl disable modmail Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. -If for some reason your update command isn't working correctly, you can update your bot by going into your modmail folder and pulling the latest changes from GitHub like so: +If for some reason your update command isn't working correctly, you can update your bot by going into your Modmail folder and pulling the latest changes from GitHub like so: ```bash cd modmail && git pull diff --git a/installation/local-hosting-vps/windows.md b/installation/local-hosting-vps/windows.md index 98d4c5f..59ad6c5 100644 --- a/installation/local-hosting-vps/windows.md +++ b/installation/local-hosting-vps/windows.md @@ -6,87 +6,163 @@ description: Deploy Modmail on a Windows machine. ## Prerequisites -* Somewhat recent hardware / software. -* Stable internet connection from hosting server. -* The hosting server remains online 24/7. -* You have completed the initial steps: [invited your bot](../#create-a-discord-bot) and [created a MongoDB database](../#create-a-mongodb-database). -* Windows 10 or 11 (any varient) +* Minimum 2GB of RAM**\*** +* At least 2GB available disk space. +* Supported Windows version: Windows 10 or Windows 11. -## Filling Enviornment Variables -Once you have finished the prerequsite steps, gather your: -* BotToken -* Logviewer URL (or what you plan on using if you haven't set it up yet.) -* Primary Guild (Server) ID -* Inbox Guild (Server) ID (if applicable) -* Bot Owner's ID (usually just your ID) -* Completed MongoURI +{% hint style="info" %} +Note that while it is possible to run Modmail with even less memory, Windows 10 itself recommend at least 2GB (4GB for Windows 11). This guide assumes the lowest threshold to comfortably run Modmail without possibly running into any resource bottleneck. +{% endhint %} -Once you have done so, open the file `.env.example` included in your download in your preferred raw text editor of choice (Usually Notepad or Notepad++, however others exist. *Do not use Word, WordPad, or similar*) +{% hint style="warning" %} +It is not recommended to run Modmail with previous versions of Windows such as Windows 7 or Windows 8.1 as they no longer receive important security updates, making your hosted applications significantly more prone to security vulnerabilities. +{% endhint %} +## Dependencies -Begin to fill in the information required: -``TOKEN=`` your bot’s token. +We will be using the following dependencies: +* Chocolatey +* Python 3.10 +* Additional Modmail requirements: [GTK for Windows](https://github.com/tschoonj/GTK-for-Windows-Runtime-Environment-Installer/) -``LOG_URL=`` the URL of your log viewer. +To install these dependencies, we will be using Powershell. +Search “powershell” in the Windows start menu, right-click on it and then click “Run as administrator”. -``GUILD_ID=`` the ID of the server your bot operates in. +Then run each of the following commands: +```powershell +Set-ExecutionPolicy Bypass -Scope Process -Force +[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072 +iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) +choco upgrade git --params "/GitOnlyOnPath /WindowsTerminal" -y +choco upgrade python310 -y +``` + +After the above installation has finished, download and install the **GTK runtime for Windows** by [clicking here](https://github.com/tschoonj/GTK-for-Windows-Runtime-Environment-Installer/releases/latest). + +## Installing Bot + +In any folder location of your choice, `Shift+Right Click` and click on `Open PowerShell window here`. + +In your PowerShell window, run these commands to clone the official Modmail repository locally and `cd` into the folder: + +```powershell +git clone https://github.com/modmail-dev/modmail; cd modmail +``` + +Install Pipenv and project dependencies with: + +```powershell +pip install pipenv; pipenv install +``` -``OWNERS=`` your user ID (ie. OWNERS=9821302031291298, or if multiple owners, OWNERS=9821302031291298,9781239213813229,924822913921391). +Create a new file in the modmail folder named `.env` and paste in your environmental variables needed to run Modmail. Refer to the steps in the [parent Installation page](../#preparing-your-environmental-variables) to find where to obtain these. +
-``MONGO_URI=`` your Mongo connection URI from the MongoDB setup. +Lastly, in your PowerShell window simply enter the command below to run your Modmail bot: +```powershell +pipenv run bot +``` + +If no error shows up, it means that your Modmail is now running correctly. + +## Setting up auto-restart + +To have the bot auto-restart on crash or system reboot, we will be using `nssm` by making a service for our bot application. + +First, find the Python path of your Modmail pipenv by running `pipenv shell` and `which python` in your Modmail folder. Copy the path that appears in your terminal and paste it in the first line of our next step. -Together, they should resemble something similar to the original ``.env.example`` file. +
+Second, create a file named `modmail.bat` in your modmail directory with the following contents, replacing `python_path` with the one you copied previously and `python.exe` with `activate.bat`: -Save the file as ``.env`` when done. +```batch +call python_path +call python bot.py +``` + +The finished file should look something like this: -It should look something like this: -{% code title=".env" %} -```py -TOKEN=yourbottokengoeshere -LOG_URL=https://example.logs.vodka/ -GUILD_ID=1079074933008781362 -OWNERS=188363246695219201,231595246213922828 -MONGO_URI=mongodb+srv://username:password@cluster0-abcde.mongodb.net/ +{% code title="modmail.bat" %} +```batch +call C:\Users\Raiden\.virtualenvs\modmail-oXWHQUly\Scripts\activate.bat +call python bot.py ``` {% endcode %} -## Installing Python +Third, download `nssm` by [clicking here](http://nssm.cc/download) and downloading the file under "Latest Release". + +The download will be a `.zip` file so you'll need to extract it first using your file archiver program (such as WinRAR or 7-zip). After that, find `nssm.exe` in the folder corresponding to your OS bit version (these days it should be win64) and copy it's file path: + +
+ +As `nssm` itself is only a command-line program, we'll need to use our trusty Terminal to use the application to create our service. So, search up "Powershell" in your start menu, right-click it and click "Run as Administrator". -Download Python and set up Python from official Python download page: https://www.python.org/downloads/. The pre-installed Python on your local machine is usually out of date, you need the version of Python 3.09 for Modmail. +Change directory (CD) into the folder path that you copied earlier, the command should look like something like this: -> The version of Python required may change overtime. Use the version that is recommended in this guide, and then reach out to us in the Support Server if that gives you problems. We will attempt to keep these guides as up to date as possible, however, this is the one place where a potiental version mismatch could occur. +```powershell +cd "C:\Users\Raiden\Downloads\nssm-2.24\win64" +``` + +{% hint style="info" %} +Wrapping "your folder\directory" on Windows in doublequotes is necessary to make sure spaces in our file path is parsed correctly. +{% endhint %} + +And then, proceed to create a new service for Modmail using `nssm` with: + +```powershell +.\nssm install "Modmail" +``` + +A GUI will pop up where you can fill in the details needed for your Modmail service. Replace the `Path` with the path of your `modmail.bat` script and the `Startup directory` with the path of your Modmail folder as follow: + +

Details on the "Application" tab

+ +You can fill in these extra details as you see fit as it's only for your own reference: + +

Details on the "Details" tab

+ +You can also optionally specify a log file as output and error in the `I/O` tab, just be sure to create the file beforehand so you can select it in the GUI. -## Running Modmail +

Details on the "I/O" tab

-Open Command Prompt, or "cmd". You can do this in one of two ways. +And finally, click "Install Service" to install your Modmail bot as a service on your Windows system.\ -1. Press the Windows Key, then type "cmd" and press enter. -2. Hold down the Windows Key + R, a Run Dialog will appear, type in "cmd" and press enter. -### Navigate to where you stored Modmail +
-Find the path of where you located your modmail in File Explorer, right click the folder name `modmail` or `modmail-master` and click "Copy Path". +By now you should have the service installed but not yet running. You can start it by using this command below in the open `nssm` Terminal from earlier: -Then go back to your Command Prompt, and type ``cd `` then right click and press paste. This will paste in the path of the folder you just found in File Explorer. Press enter to change to that directory. +``` +.\nssm start modmail +``` -### Install the requirements +
-Run this command: -```py -3.9 -m pip install pipenv && py -3.9 -m pipenv install``` +You should be able to see your bot running if everything goes well. You can also verify the status of your Modmail service with: -This will install the pipenv package, and then use it to install the most up-to-date list of dependencies from our dependency list. +``` +.\nssm status modmail +``` -### Start your Modmail +And if you specified the log output file in your previous step, you should be able to see your current Modmail logs like so: -To start the Modmail bot itself, run this command: -```py -3.9 -m pipenv run python bot.py``` +
-Your Modmail should now be working properly. If you are still having issues, let us know in our [support server](https://discord.gg/zmdYe3ZVHG). +And that's it! Your bot will now auto-start everytime you reboot your system. You can also additionally stop and restart your service with `.\nssm stop modmail` and `.\nssm restart modmail` respectively. Refer to [NSSM Documentation](http://nssm.cc/usage) for further customization as this guide is only meant to cover the basic needs adequate for standard Modmail usage. ## Updating + +Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. + +If for some reason your update command isn't working correctly, you can update your bot by opening PowerShell or any terminal application in your modmail folder and pulling the latest changes from GitHub like so: + +``` +git pull +``` + +After that, simply restart your bot to apply the latest changes. diff --git a/installation/railway.md b/installation/railway.md index b287180..fb21bff 100644 --- a/installation/railway.md +++ b/installation/railway.md @@ -6,7 +6,7 @@ description: Deploy Modmail on Railway PaaS. ## What is Railway? -Railway is a deployment platform where you can provision infrastructure, develop with that infrastructure locally, and then deploy to the cloud. +Railway is a deployment platform where you can provision infrastructure, develop with that infrastructure locally, and then deploy to the cloud. ## Requirements @@ -27,7 +27,7 @@ To keep your bot running 24/7, you'll need to sign up for their "Developer" plan You will need to fork our repositories to deploy onto Railway. -Make sure you're logged in to [GitHub](https://github.com/). You will need to fork **two** repositories. +Make sure you're logged in to [GitHub](https://github.com/). You will need to fork **two** repositories. First we fork the Modmail repository. Head over to [https://github.com/modmail-dev/modmail/fork](https://github.com/modmail-dev/modmail/fork), leave all the settings as default, and click **Create fork**. @@ -37,7 +37,7 @@ Next do the same for the Logviewer repository by heading over to [https://github
Screenshot of creating a Logviewer fork.

Create a GitHub fork for the Logviewer Repository.

-Next, to keep your Modmail and Logviewer up to date, you will need to install the [Pull app](https://github.com/apps/pull). Simply head over to [https://github.com/apps/pull](https://github.com/apps/pull), click **Install**, choose **Only select repositories**, then select **both** the Modmail and Logviewer repositories that you forked in the previous step. +Next, to keep your Modmail and Logviewer up to date, you will need to install the [Pull app](https://github.com/apps/pull). Simply head over to [https://github.com/apps/pull](https://github.com/apps/pull), click **Install**, choose **Only select repositories**, then select **both** the Modmail and Logviewer repositories that you forked in the previous step.
@@ -69,9 +69,7 @@ If your GitHub account is new or not reputable, you may be asked to verify your This unfortunately means that you will have to provide a credit card for verification. Click **Verify Account**, read and accept Railway's **Terms of Service**, then enter your credit card details. You may be temporary charged $1 USD to confirm the legitimacy of the card. -![Screenshot of clicking verify account.](../.gitbook/assets/RW6.png)![Screenshot of clicking terms of service.](../.gitbook/assets/RW7.png)![Screenshot of clicking I agree with terms of service.](../.gitbook/assets/RW7B.png)![Screenshot of entering your credit card details.](../.gitbook/assets/RW8.png) - - +Screenshot of clicking verify account.Screenshot of clicking terms of service.Screenshot of clicking I agree with terms of service.Screenshot of entering your credit card details. @@ -103,7 +101,7 @@ From the [**New Project**](https://railway.app/new) page, create the project by
-Click **New Variable**, set left to be **`CONNECTION_URI`**, then on the right, paste your revised MongoDB connection string from your Notepad (if this is new to you, [go back and read the initial steps](./)). +Click **New Variable**, set left to be **`CONNECTION_URI`**, then on the right, paste your revised MongoDB connection string from your Notepad (if this is new to you, [go back and read the initial steps](./)). Don't add any other variables, nor use the suggested variables section. You should see a new variable named **`CONNECTION_URI`** added under variables once you're done. @@ -129,7 +127,7 @@ Next, go to the **Deployments** tab, look at the latest deployment, is it succes -
Screenshot of the Logviewer homepage.

This URL should show the Logviewer homepage.

+
Screenshot of the Logviewer homepage.

This URL should show the Logviewer homepage.

@@ -153,22 +151,27 @@ Click **New Variable.** We will be adding 5 variables in total, so repeat this s | -------------------- | ----------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | | **`CONNECTION_URI`** | The MongoDB Connection string from your Notepad. |
mongodb+srv://modmail:elAO7wF1r07pNG6u@cluster0.example.mongodb.net
 
| +| | | | | **`TOKEN`** | The Discord bot token from your Notepad. |
MTA3Djv3IAxNjk1NDgdKD231.G1AoUjD.5z629aKP34JKHn4v1EsdNUwdDO3MvBR9ifVES4
 
| +| | | | | **`LOG_URL`** | The Logviewer URL from your Notepad. Remember to add `https://` in front! |
https://web-production-1234.up.railway.app
 
| +| | | | | **`OWNERS`** | Your Discord ID. If you have multiple owners, separate your IDs with a comma. |
718827787302791100
 
| +| | | | | **`GUILD_ID`** | The ID of the Discord server for your Modmail bot. |
109483701365508619
 
| +| | | |
Do you have a separate staff server? -If you manage a large server where you have a separate server for communication among your moderation team, Modmail supports directing threads into the staff server instead of your main (public) server. +If you manage a large server where you have a separate server for communication among your moderation team, Modmail supports directing threads into the staff server instead of your main (public) server. -Simply add an additional variable named **`MODMAIL_GUILD_ID`** and set the value to your staff server's ID. +Simply add an additional variable named **`MODMAIL_GUILD_ID`** and set the value to your staff server's ID. Note: the **`GUILD_ID`** should always be your main server's ID (not staff server's). @@ -204,7 +207,7 @@ You have 10 days to test Modmail without upgrading to the "Developer" plan. As m #### Usage-based subscription -Head over to the **** [**Billing Details**](https://railway.app/account/billing) page, click the **Unlock** button to unlock Developer plan. Then input your credit card details and hit **Subscribe to Developer Plan**. +Head over to the \*\*\*\* [**Billing Details**](https://railway.app/account/billing) page, click the **Unlock** button to unlock Developer plan. Then input your credit card details and hit **Subscribe to Developer Plan**. {% hint style="warning" %} Subscribing to the Developer plan under _usage based subscription_ **may incur you unexpected charges**. This because Railway does not provide any safe-guards or monthly spending limits. Average Modmail and Logviewer usage should be well below the free threshold. However, if you run resource-intensive code via plugins or due to other means, you credit card may be billed. @@ -258,9 +261,9 @@ There you go! Your bot should now be able to run 24/7 without interruptions. Hea How do I cancel my Developer plan subscription? -If you're subscribed under the [usage-based subscription](railway.md#usage-based-subscription) model, you can cancel your subscription by heading to the **** [**Billing Details**](https://railway.app/account/billing) page, click **Manage Subscription**, then click **Cancel plan**. +If you're subscribed under the [usage-based subscription](railway.md#usage-based-subscription) model, you can cancel your subscription by heading to the \*\*\*\* [**Billing Details**](https://railway.app/account/billing) page, click **Manage Subscription**, then click **Cancel plan**. -![Screenshot of clicking manage subscription.](../.gitbook/assets/RW25.png)![Screenshot of clicking cancel plan.](../.gitbook/assets/RW26.png) +Screenshot of clicking manage subscription.Screenshot of clicking cancel plan.
@@ -281,6 +284,3 @@ You can disable auto-updates by heading to the settings page for **both** your M Now that you've successfully set up Modmail, visit the [Getting Started](../getting-started.md) page to find information on using Modmail. You can also join our [**Discord Server**](https://discord.gg/cnUpwrnpYb) to interact with our community or get support for Modmail. - - - diff --git a/installation/replit.md b/installation/replit.md deleted file mode 100644 index dabfbb9..0000000 --- a/installation/replit.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -description: Deploy Modmail on Replit. (Not recommended) ---- - -# Replit - -{% hint style="danger" %} -This hosting method is not recommended by the Modmail team. -{% endhint %} - -## What is Replit? - -Replit is a platform for creating and sharing software. You can write your code and host it all in the same place. - -Replit often is unstable for hosting Modmail bots. Your bot may shutdown without any notice. - -## Requirements
- -* 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 - -Hosting Modmail on Replit is free. However, this requires using an exploit. If you prefer to use Replit using their officially supported method, you will need to purchase their "Hacker" plan, which costs $7 USD per month. - -## Updating - - - From 4119d90812d8be2698c54bb2b845698b09d75b8e Mon Sep 17 00:00:00 2001 From: Zino <98627207+Zinoviya99@users.noreply.github.com> Date: Mon, 10 Apr 2023 08:39:11 -0700 Subject: [PATCH 07/33] Update configuration.md Added appearance configs Signed-off-by: Zino <98627207+Zinoviya99@users.noreply.github.com> --- usage-guide/configuration.md | 166 ++++++++++++++++++++++++++++++++++- 1 file changed, 165 insertions(+), 1 deletion(-) diff --git a/usage-guide/configuration.md b/usage-guide/configuration.md index 1d0d9ad..52ead8b 100644 --- a/usage-guide/configuration.md +++ b/usage-guide/configuration.md @@ -360,4 +360,168 @@ Sends snippets anonymously. Appearance Configurations ====== -TODO +Blocked Emoji ( blocked_emoji ) +------ + +This is the emoji added to the message when when a Modmail action is invoked unsuccessfully (ie. DM Modmail when blocked, failed to reply, etc.). + +***Default:*** 🚫 + +***Example:*** +- `?config set blocked_emoji 🙅‍` + +***Notes:*** +- You can disable `blocked_emoji` with `{prefix}config set blocked_emoji disable`. +- Custom/animated emojis are also supported, however, the emoji must be added to the server. +- See also: `sent_emoji`. + +Close Emoji ( close_emoji ) +------ + +This is the emoji the recipient can click to close a thread themselves. The emoji is automatically added to the `thread_creation_response` embed. + +***Default:*** 🔒 + +***Example:*** +- `?config set close_emoji 👍‍` + +***Notes:*** +- This will only have an effect when `recipient_thread_close` is enabled. +- See also: `recipient_thread_close`. + +Confirm Thread Creation Accept ( confirm_thread_creation_accept ) +------ + +Emoji to accept thread creation + +***Default:*** \u2705 + +***Example:*** +- `?config set confirm_thread_creation_accept \u2611` + +***Notes:*** +- This has no effect unless `confirm_thread_creation` is set +- See also: `confirm_thread_creation`, `confirm_thread_creation_title`, `confirm_thread_response`, `confirm_thread_creation_deny` + +Confirm Thread Creation Deny ( confirm_thread_creation_deny ) +------ + +Emoji to cancel thread creation + +***Default:*** \uD83D\uDEAB + +***Example:*** +- `?config set confirm_thread_creation_deny \u26D4` + +***Notes:*** +- This has no effect unless `confirm_thread_creation` is set +- See also: `confirm_thread_creation`, `confirm_thread_creation_title`, `confirm_thread_response`, `confirm_thread_creation_accept` + +Name ( error_color ) +------ + +This is the color for Modmail when anything goes wrong, unsuccessful commands, or a stern warning. + +***Default:*** Discord Red [#E74C3C](https://placehold.it/100/e74c3c?text=+) + +***Example:*** +- `?config set error_color ocean blue` +- `?config set error_color ff1242` +- `?config set error_color #ff1242` +- `?config set error_color fa1` + +***Notes:*** +- Available color names can be found on [Color Options](https://docs.modmail.dev/old-docs/color-names). +- See also: `main_color`, `mod_color`, `recipient_color`. + + +Main Color ( main_color ) +------ + +This is the main color for Modmail (help/about/ping embed messages, subscribe, move, etc.). + +***Default:*** Discord Blurple [#7289DA](https://placehold.it/100/7289da?text=+) + +***Example:*** +- `?config set main_color olive green` +- `?config set main_color 12de3a` +- `?config set main_color #12de3a` +- `?config set main_color fff` + +***Notes:*** +- Available color names can be found on [Color Options](https://docs.modmail.dev/old-docs/color-names). +- See also: `error_color`, `mod_color`, `recipient_color`. + + +Mod Color ( mod_color ) +------ + +This is the color of the messages sent by the moderators, this applies to messages within in the thread channel and the DM thread messages received by the recipient. + +***Default:*** Discord Green [#2ECC71](https://placehold.it/100/2ecc71?text=+) + +***Example:*** +- `?config set mod_color dark beige` +- `?config set mod_color cb7723` +- `?config set mod_color #cb7723` +- `?config set mod_color c4k` + +***Notes:*** +- Available color names can be found on [Color Options](https://docs.modmail.dev/old-docs/color-names). +- See also: `recipient_color`, `main_color`, `error_color`. + +React To Contact Emoji ( react_to_contact_emoji ) +------ + +An emoji which is tracked in `react_to_contact_message` + +***Default:*** \u2705 + +***Example:*** +- `?config set react_to_contact_emoji \u2705` + +***Notes:*** +- See also: `react_to_contact_message \u2705` + +Recipient Color ( recipient_color ) +------ + +This is the color of the messages sent by the recipient, this applies to messages received in the thread channel. + +***Default:*** "Discord Gold [#F1C40F](https://placehold.it/100/f1c40f?text=+) + +***Example:*** +- `?config set recipient_color dark beige` +- `?config set recipient_color cb7723` +- `?config set recipient_color #cb7723` +- `?config set recipient_color c4k` + +***Notes:*** +- Available color names can be found on [Color Options](https://docs.modmail.dev/old-docs/color-names). +- See also: `mod_color`, `main_color`, `error_color`. + +Sent Emoji ( sent_emoji ) +------ + +This is the emoji added to the message when when a Modmail action is invoked successfully (ie. DM Modmail, edit message, etc.). + +***Default:*** ✅ + +***Example:*** +- `?config set sent_emoji ✨` + +***Notes:*** +- You can disable `sent_emoji` with `{prefix}config set sent_emoji disable`. +- Custom/animated emojis are also supported, however, the emoji must be added to the server. +- See also: `blocked_emoji`. + +Show Log URL Button ( show_log_url_button ) +------ + +Shows the button to open the Log URL. + +***Default:*** No + +***Example:*** +- `?config set show_log_url_button yes` + From 46ea0a46616545df47c841b41a6e0dfff00522aa Mon Sep 17 00:00:00 2001 From: Zino <98627207+Zinoviya99@users.noreply.github.com> Date: Mon, 10 Apr 2023 11:23:57 -0700 Subject: [PATCH 08/33] Update configuration.md Take 2 fixed what seb pointed out Signed-off-by: Zino <98627207+Zinoviya99@users.noreply.github.com> --- usage-guide/configuration.md | 750 ++++++++++++++++++++++++++++++++++- 1 file changed, 749 insertions(+), 1 deletion(-) diff --git a/usage-guide/configuration.md b/usage-guide/configuration.md index f1f76af..270b182 100644 --- a/usage-guide/configuration.md +++ b/usage-guide/configuration.md @@ -1,3 +1,751 @@ --- description: Configuring and customizing modmail. ---- \ No newline at end of file +--- +--- +description: Configuring and customizing modmail. +--- + +Modmail offers an assort of customizations to make your Modmail bot unique to your server. Most customizations can be set with `?config`, but some has its own special command, such as `?activity`. +You may find all of the personalizable tweaks available for Modmail below: + +{% hint style="info" %} All examples presume your prefix is `?`.{% endhint %} + +{% hint style="warning" %} Things covered in brackets are optional: `[]` +Things covered in angled brackets are required: `<>` {% endhint %} + +Moderation Configurations +====== + +Account Age ( account_age ) +------ + +***Default:*** No Age Threshold + +Set an amount of time a users account has to be created in order to open a ticket. + +***Example:*** + +- `?config set account_age P12DT3H` (stands for 12 days and 3 hours in [ISO-8601 Duration Format](https://en.wikipedia.org/wiki/ISO_8601#Durations)) +- `?config set account_age 3 days and 5 hours` (accepted readable time) + +***Note(s):*** +- To remove this restriction, do ?config del account_age. +- See also: `guild_age`. + + +Alert on Mention ( alert_on_mention ) +------ + +***Default: No*** + +Mentions all mods (mention) in mention channel when bot is mentioned + +***Example:*** + +- `?config set alert_on_mention yes` + +***Notes:*** +- See also: `mention`, `mention_channel_id` + + +Reply Without Command ( reply_without_command ) +------ + +***Default:*** Disabled + +Setting this configuration will make all non-command messages sent in the thread channel to be forwarded to the recipient without the need of `?reply`. + +***Example:*** +- `?config set reply_without_command yes` +- `?config set reply_without_command no` + +***Notes:*** +- See also: `anon_reply_without_command`, `plain_reply_without_command`. + + +Show Timestamps ( show_timestamp ) +------ + +***Default:*** Yes + +Shows timestamps on thread embeds + +***Example:*** + +- `?config set show_timestamp no` + + +Silent Alert On Commands ( silent_alert_on_mention ) +------ + +Send a message in the mention channel without mentioning all mods (mention). + +***Default:*** No + +***Example:*** +- `?config set alert_on_mention yes` + +***Notes:*** +This has no effect unless `alert_on_mention` is set to yes. +See also: `mention`, `mention_channel_id` + + +Update Channel ID ( update_channel_id ) +------ + +This is the channel where update notifications are sent to. + +***Default:*** Log Channel (normally `#bot-logs`) + +***Example:*** +- `?config set update_channel_id 9234932582312` (9234932582312 is the channel ID)` + +***Notes:*** +- This has no effect unless `disable_autoupdates` is set to no and `update_notifications` is set to yes. +- See also: `log_channel_id` + + +Update Notifications ( update_notifications ) +------ + +This is the channel where update notifications are sent to. + +***Default:*** Yes + +***Example:*** +- `?config set update_notifications no` + +***Notes:*** +- This has no effect unless `disable_autoupdates` is set to no. +- See also: `update_channel_id` + + +Fallback Category ID ( fallback_category_id ) +------ + +This is the category that will hold the threads when the main category is full.\n\nTo change the Fallback category, you will need to find the [category’s ID](https://support.discordapp.com/hc/en-us/articles/206346498). + +***Default:*** `Fallback Modmail` (created when the main category is full) + +***Example:*** +- `?config set fallback_category_id 9234932582312` (`9234932582312` is the category ID) + +***Notes:*** +- If the Fallback category ended up being non-existent/invalid, Modmail will create a new one. To fix this, set `fallback_category_id` to a valid category. +- See also: `main_category_id`. + + +Log Channel ID ( log_channel_id ) +------ + +This is the channel where all log messages will be sent (ie. thread close message, update message, etc.).\n\nTo change the log channel, you will need to find the [channel’s ID](https://support.discordapp.com/hc/en-us/articles/206346498). The channel doesn’t necessary have to be under the `main_category`. + +***Default:*** `#bot-logs` (created with `{prefix}setup`) + +***Example:*** +- `?config set log_channel_id 9234932582312` (9234932582312 is the channel ID) + +***Notes:*** +- If the Modmail logging channel ended up being non-existent/invalid, no logs will be sent. + +Main Category ID ( main_category_id ) +------ + +This is the category where all new threads will be created.\n\nTo change the Modmail category, you will need to find the [category’s ID](https://support.discordapp.com/hc/en-us/articles/206346498). + +***Default:*** `Modmail` (created with `{prefix}setup`) + +***Example:*** +- `?config set main_category_id 9234932582312` (`9234932582312` is the category ID)` + +***Notes:*** +- If the Modmail category ended up being non-existent/invalid, Modmail will break. To fix this, run `?setup` again or set `main_category_id` to a valid category. +- When the Modmail category is full, new channels will be created in the fallback category. +- See also: `fallback_category_id` + +Mod Typing ( mod_typing ) +------ + +When this is set to `yes`, whenever a moderator starts to type in the thread channel, the recipient user will see \"{bot.user.display_name} is typing…\" in their DM channel. + +***Default:*** Disabled + +***Example:*** +- `{prefix}config set mod_typing yes` +- `{prefix}config set mod_typing no` + +***Notes:*** +- See also: `mod_typing` + +User Typing ( user_typing ) +------ + +When this is set to `yes`, whenever the recipient user starts to type in their DM channel, the moderator will see “{bot.user.display_name} is typing…” in the thread channel. + +***Default:*** Enabled + +***Example:*** +- `?config set user_typing yes` +- `?config set user_typing no` + +***Notes:*** +- See also: `mod_typing`. + +Twitch URL ( twitch_url ) +------ + +This channel dictates the linked Twitch channel when the activity is set to \"Streaming\". + +***Default:*** `https://www.twitch.tv/discordmodmail/` + +***Example:*** +- `?config set twitch_url https://www.twitch.tv/yourchannelname/` + +***Notes:*** +- This has no effect when the activity is not set to \"Streaming\". +- See also: `?help activity` + +Close On Leave ( close_on_leave ) +------ + +Closes a modmail thread upon user leave automatically + +***Default:*** No + +***Example:*** +- `?config set close_on_leave yes` + +***Notes:*** +- See also: `close_on_leave_reason`. + +Confirm Thread Creation ( confirm_thread_creation ) +------ + +Ensure users confirm that they want to create a new thread + +***Default:*** No + +***Example:*** +- `?config set confirm_thread_creation yes` + +***Notes:*** +- See also: `confirm_thread_creation_title`, `confirm_thread_response`, `confirm_thread_creation_accept`, `confirm_thread_creation_deny` + +Mention ( mention ) +------ + +This is the message above user information for when a new thread is created in the channel. + +***Default:*** `@here` + +***Example:*** +- `?config set mention Yo~ Here's a new thread for ya!` +- `?mention Yo~ Here's a new thread for ya!` + +***Notes:*** +- To disable mention, use command `{prefix}mention disable`. +- See also: `{prefix}help mention`. + +Require Close Reason ( require_close_reason ) +------ + +Require a reason to close threads. + +***Default:*** No + +***Example:*** +- `?config set require_close_reason yes` + + +Thread Auto Close ( thread_auto_close ) +------ + +Setting this configuration will close threads automatically after the number of days, hours, minutes or any time-interval specified by this configuration. + +***Default:*** Never + +***Example:*** +- `?config set thread_auto_close P12DT3H` (stands for 12 days and 3 hours in [ISO-8601 Duration Format](https://en.wikipedia.org/wiki/ISO_8601#Durations)) +- `?config set thread_auto_close 3 days and 5 hours` (accepted readable time) + +***Notes:*** +- To disable auto close, do `{prefix}config del thread_auto_close`. +- To prevent a thread from auto-closing, do `{prefix}close cancel`. +- See also: `thread_auto_close_silently`, `thread_auto_close_response`. + +Thread Cooldown ( thread_cooldown ) +------ + +Specify the time required for the recipient to wait before allowed to create a new thread. + +***Default:*** Never + +***Example:*** +- `?config set thread_cooldown P12DT3H` (stands for 12 days and 3 hours in [ISO-8601 Duration Format](https://en.wikipedia.org/wiki/ISO_8601#Durations)) +- `?config set thread_cooldown 3 days and 5 hours` (accepted readable time) + +***Notes:*** +- To disable thread cooldown, do `?config del thread_cooldown`. + + +Thread Move Notify ( thread_move_notify ) +------ + +Notify the recipient if the thread was moved. + +***Default:*** No + +***Example:*** +- `?config set thread_move_notify yes` +- `?config set thread_move_notify no` + +***Notes:*** +- See also: `thread_move_title`, `thread_move_response`, `thread_move_notify_mods`. + +Thread Move Notify Mods ( thread_move_notify_mods ) +------ + +Notify mods again after the thread is moved + +***Default:*** No + +***Example:*** +- `?config set thread_move_notify_mods yes` +- `?config set thread_move_notify_mods no` + +***Notes:*** +- See also: `thread_move_title`, `thread_move_response`, `thread_move_notify`. + +Use Regex Autotrigger ( use_regex_autotrigger ) +------ + +Whether to use regex to compare in autotriggers. + +***Default:*** No + +***Example:*** +- `?config set use_regex_autotrigger yes` + +***Notes:*** + +{% hint style="danger" %} This is meant for advanced user that understand regular expressions. {% endhint %} + +- You can test it out with https://regexr.com on `PCRE (Server)` mode +- See command: `autotrigger` + +Plain Reply Without Command ( plain_reply_without_command ) +------ + +Setting this configuration will make all non-command messages sent in the thread channel to be forwarded to the recipient in a plain form without the need of `{prefix}reply`. + +***Default:*** Disabled + +***Example:*** +- `?config set plain_reply_without_command yes` +- `?config set plain_reply_without_command no` + +***Notes:*** +- See also: `reply_without_command`, `anon_reply_without_command`. + +Anonymous Snippets ( anonymous_snippets ) +------ + +Sends snippets anonymously. + +***Default:*** No + +***Example:*** +- `?config set anonymous_snippets yes` + +***Notes:*** +- See also: `anon_avatar_url`, `anon_tag`, `plain_snippets`. + +Appearance Configurations +====== + +Blocked Emoji ( blocked_emoji ) +------ + +This is the emoji added to the message when when a Modmail action is invoked unsuccessfully (ie. DM Modmail when blocked, failed to reply, etc.). + +***Default:*** 🚫 + +***Example:*** +- `?config set blocked_emoji 🙅‍` + +***Notes:*** +- You can disable `blocked_emoji` with `{prefix}config set blocked_emoji disable`. +- Custom/animated emojis are also supported, however, the emoji must be added to the server. +- See also: `sent_emoji`. + +Close Emoji ( close_emoji ) +------ + +This is the emoji the recipient can click to close a thread themselves. The emoji is automatically added to the `thread_creation_response` embed. + +***Default:*** 🔒 + +***Example:*** +- `?config set close_emoji 👍‍` + +***Notes:*** +- This will only have an effect when `recipient_thread_close` is enabled. +- See also: `recipient_thread_close`. + +Confirm Thread Creation Accept ( confirm_thread_creation_accept ) +------ + +Emoji to accept thread creation + +***Default:*** \u2705 + +***Example:*** +- `?config set confirm_thread_creation_accept \u2611` + +***Notes:*** +- This has no effect unless `confirm_thread_creation` is set +- See also: `confirm_thread_creation`, `confirm_thread_creation_title`, `confirm_thread_response`, `confirm_thread_creation_deny` + +Confirm Thread Creation Deny ( confirm_thread_creation_deny ) +------ + +Emoji to cancel thread creation + +***Default:*** \uD83D\uDEAB + +***Example:*** +- `?config set confirm_thread_creation_deny \u26D4` + +***Notes:*** +- This has no effect unless `confirm_thread_creation` is set +- See also: `confirm_thread_creation`, `confirm_thread_creation_title`, `confirm_thread_response`, `confirm_thread_creation_accept` + +Error Color ( error_color ) +------ + +This is the color for Modmail when anything goes wrong, unsuccessful commands, or a stern warning. + +***Default:*** Discord Red [#E74C3C](https://placehold.it/100/e74c3c?text=+) + +***Example:*** +- `?config set error_color ocean blue` +- `?config set error_color ff1242` +- `?config set error_color #ff1242` +- `?config set error_color fa1` + +***Notes:*** +- Available color names can be found on [Color Options](https://docs.modmail.dev/old-docs/color-names). +- See also: `main_color`, `mod_color`, `recipient_color`. + + +Main Color ( main_color ) +------ + +This is the main color for Modmail (help/about/ping embed messages, subscribe, move, etc.). + +***Default:*** Discord Blurple [#7289DA](https://placehold.it/100/7289da?text=+) + +***Example:*** +- `?config set main_color olive green` +- `?config set main_color 12de3a` +- `?config set main_color #12de3a` +- `?config set main_color fff` + +***Notes:*** +- Available color names can be found on [Color Options](https://docs.modmail.dev/old-docs/color-names). +- See also: `error_color`, `mod_color`, `recipient_color`. + + +Mod Color ( mod_color ) +------ + +This is the color of the messages sent by the moderators, this applies to messages within in the thread channel and the DM thread messages received by the recipient. + +***Default:*** Discord Green [#2ECC71](https://placehold.it/100/2ecc71?text=+) + +***Example:*** +- `?config set mod_color dark beige` +- `?config set mod_color cb7723` +- `?config set mod_color #cb7723` +- `?config set mod_color c4k` + +***Notes:*** +- Available color names can be found on [Color Options](https://docs.modmail.dev/old-docs/color-names). +- See also: `recipient_color`, `main_color`, `error_color`. + +React To Contact Emoji ( react_to_contact_emoji ) +------ + +An emoji which is tracked in `react_to_contact_message` + +***Default:*** \u2705 + +***Example:*** +- `?config set react_to_contact_emoji \u2705` + +***Notes:*** +- See also: `react_to_contact_message \u2705` + +Recipient Color ( recipient_color ) +------ + +This is the color of the messages sent by the recipient, this applies to messages received in the thread channel. + +***Default:*** "Discord Gold [#F1C40F](https://placehold.it/100/f1c40f?text=+) + +***Example:*** +- `?config set recipient_color dark beige` +- `?config set recipient_color cb7723` +- `?config set recipient_color #cb7723` +- `?config set recipient_color c4k` + +***Notes:*** +- Available color names can be found on [Color Options](https://docs.modmail.dev/old-docs/color-names). +- See also: `mod_color`, `main_color`, `error_color`. + +Sent Emoji ( sent_emoji ) +------ + +This is the emoji added to the message when when a Modmail action is invoked successfully (ie. DM Modmail, edit message, etc.). + +***Default:*** ✅ + +***Example:*** +- `?config set sent_emoji ✨` + +***Notes:*** +- You can disable `sent_emoji` with `{prefix}config set sent_emoji disable`. +- Custom/animated emojis are also supported, however, the emoji must be added to the server. +- See also: `blocked_emoji`. + +Show Log URL Button ( show_log_url_button ) +------ + +Shows the button to open the Log URL. + +***Default:*** No + +***Example:*** +- `?config set show_log_url_button yes` + + +Thread Appearance +====== + +Use Random Channel Name ( use_random_channel_name ) +------ + +When this is set to `yes`, new thread channels will be named with random characters tied to their user ID. + +***Default:*** No + +***Example:*** +- `?config set use_random_channel_name yes` +- `?config set use_random_channel_name no` + +***Notes:*** +{% hint style="warning" %} This config is suitable for servers in Server Discovery to comply with channel name restrictions. {% endhint %} +{% hint style="danger" %} This cannot be applied with `use_timestamp_channel_name`, `use_nickname_channel_name`, or `use_user_id_channel_name`. {% endhint %} +- See also: `use_timestamp_channel_name`, `use_user_id_channel_name`, `use_nickname_channel_name`. + +Use Timestamp Channel Name ( use_timestamp_channel_name ) +------ + +When this is set to `yes`, new thread channels will be named with the recipient's account creation date instead of the recipient's name. + +***Default:*** No + +***Example:*** +- `?config set use_timestamp_channel_name yes` +- `?config set use_timestamp_channel_name no` + +***Notes:*** +{% hint style="warning" %} This config is **NOT** suitable for servers in Server Discovery to comply with channel name restrictions. {% endhint %} +{% hint style="danger" %} This cannot be applied with `use_user_id_channel_name`, `use_random_channel_name` or `use_nickname_channel_name`. {% endhint %} +- See also: `use_user_id_channel_name`, `use_nickname_channel_name`, `use_random_channel_name`. + +Use User ID Channel Name ( use_user_id_channel_name ) +------ + +When this is set to `yes`, new thread channels will be named with the recipient's ID instead of the recipient's name. + +***Default:*** No + +***Example:*** +- `?config set use_user_id_channel_name yes` +- `?config set use_user_id_channel_name no` + +***Notes:*** +{% hint style="warning" %} This config is suitable for servers in Server Discovery to comply with channel name restrictions. {% endhint %} +{% hint style="danger" %} This cannot be applied with `use_timestamp_channel_name`, `use_random_channel_name` or `use_nickname_channel_name`. {% endhint %} +- See also: `use_timestamp_channel_name`, `use_nickname_channel_name`, `use_random_channel_name`. + +Use Nickname Channel Name ( use_nickname_channel_name ) +------ + +When this is set to `yes`, new thread channels will be named with the recipient's nickname instead of the recipient's name. + +***Default:*** + +***Example:*** +- `?config set use_nickname_channel_name yes` +- `?config set use_nickname_channel_name no` + +***Notes:*** +{% hint style="warning" %} This config is suitable for servers in Server Discovery to comply with channel name restrictions. {% endhint %} +{% hint style="danger" %} This cannot be applied with `use_timestamp_channel_name`, `use_random_channel_name` or `use_user_id_channel_name`. {% endhint %} +- See also: `use_timestamp_channel_name`, `use_user_id_channel_name`, `use_random_channel_name`. + +Use Hoisted Top Role ( use_hoisted_top_role ) +------ + +Controls if only hoisted roles are evaluated when finding top role. + +***Default:*** Yes + +***Example:*** +- `?config set use_hoisted_top_role yes` +- `?config set use_hoisted_top_role no` + +***Notes:*** +- Top role is displayed in embeds when replying or adding/removing users to a thread in the case mod_tag and anon_username are not set. +- If this configuration is enabled, only roles that are hoisted (displayed seperately in member list) will be used. If a user has no hoisted roles, it will return 'None'. +- If you would like to display the top role of a user regardless of if it's hoisted or not, disable `use_hoisted_top_role`. + +Thread Show Account Age ( thread_show_account_age ) +------ + +Shows account age on first message sent in thread channels to mods + +***Default:*** Yes + +***Example:*** +- `?config set thread_show_account_age no` + +***Notes:*** +- See also: `thread_show_roles`, `thread_show_join_age` + + +Thread Show Join Age ( thread_show_join_age ) +------ + +Shows join age on first message sent in thread channels to mods + +***Default:*** Yes + +***Example:*** +- `?configconfig set thread_show_join_age no` + +***Notes:*** +- See also: `thread_show_account_age`, `thread_show_roles`. + + +Thread Show Roles ( thread_show_roles ) +------ + +Shows roles on first message sent in thread channels to mods + +***Default:*** Yes + +***Example:*** +- `?config set thread_show_account_age no` + +***Notes:*** +- See also: `thread_show_roles`, `thread_show_join_age`. + + +Mod Tag ( mod_tag ) +------ + +This is the name tag in the “footer” section of the embeds sent by moderators in the recipient DM and thread channel. + +***Default:*** The moderator's highest role + +***Example:*** +- `?config set mod_tag Moderator` + +***Notes:*** +{% hint style="warning" %} When the message is sent anonymously, `anon_tag` is used instead. {% endhint %} +- See also: `anon_tag`. + +Anon Tag ( anon_tag ) +------ + +This is the name tag in the “footer” section of the embeds sent by anonymous moderators in the recipient DM. + +***Default:*** \"Response\" + +***Example:*** +- `?config set anon_tag Support Agent` + +***Notes:*** +- See also: `anon_avatar_url`, `anon_username`, `mod_tag`. + +Anon Avatar URL ( anon_avatar_url ) +------ + +This is the avatar of the embeds sent by anonymous moderators in the recipient DM. + +***Default:*** Server avatar + +***Example:*** +- `?config set anon_avatar_url https://path.to/your/avatar.png` (you will need to upload the avatar to somewhere) + +***Notes:*** +- See also: `anon_username`, `anon_tag`. + + +Anon Username ( anon_username ) +------ + +This is the name in the “author” section of the embeds sent by anonymous moderators in the recipient DM. + +***Default:*** Fallback on `mod_tag` + +***Example:*** +- `?config set anon_username Incognito Mod` + +***Notes:*** +- See also: `anon_avatar_url`, `anon_tag`. + + +Transfer Reactions ( transfer_reactions ) +------ + +Transfer users reactions to mods and vice versa +*(If someone reacts to a thread message the other party will see it.)* + +***Default:*** Yes + +***Example:*** +- `?config set transfer_reactions no` + + +Thread Responses +====== + +TODO / In Progress + +`.env` Config Options +====== +#### The following is a list of config options that can *ONLY* be added by editing the `.env` file. Please use whichever guide you followed to set up the bot to see how to add these variables. + +{% hint style="danger" %} It is recommended you avoid and ignore changing any of these you do not fully understand {% endhint %} + +| Option | Description | Required | Usage | +| ------------- |:-------------:|:-------------:|:-------------:| +| modmail_guild_id | Inbox server for tickets | No | `MODMAIL_GUILD_ID = GUILDIDHERE` | +| guild_id | Main server the bot is in | Yes | `GUILD_ID = GUILDIDHERE` | +| log_url_prefix | Default is `/logs` | Yes | `LOG_URL_PREFIX = PREFIX` | +| mongo_uri | The connection uri for the database | Yes | `MONGO_URI = mongodb+srv://Papiersnipper:mypassword123@modmail-rdm99.mongodb.net/` | +| connection_uri | The connection uri for the database | Yes | `CONNECTION_URI = mongodb+srv://Papiersnipper:mypassword123@modmail-rdm99.mongodb.net/` | +| owners | ID's of the users who will have owner perms | Yes | `OWNERS = 1234,5678,91011` | +| enable_presence_intent | Enables the presence intent, required for some plugins. Uses extra resources. | No | `ENABLE_PRESENCE_INTENT = True` | +| registry_plugins_only | Disallows the ability to download plugins that aren’t in the plugin registry. | No | `REGISTRY_PLUGINS_ONLY = True` | +| token | The bots token | Yes | `TOKEN = MTAyMjk2NTA4MzYxtewgw3eNw.thisis.afaketoken-WGjwfvQ` | +| enable_eval | Enables the eval command to run arbitrary code on the bot. | No | `ENABLE_EVAL = True` | +| github_token | Needed to use the update command | No | `GITHUB_TOKEN = ghp_ABC132gfdsg4321fds` | +| disable_autoupdates | Allows for auto updates | No | `DISABLE_AUTOUPDATES = True` | +| disable_updates | Disables updates all together | No | `DISABLE_UPDATES = True` | +| log_level | The type of information posted in the terminal, Default is `INFO` | No | `LOG_LEVEL = ERROR/WARNING/INFO/DEBUG/NOTSET` | + From 484202ab6681b556191e35653f28db74a5587343 Mon Sep 17 00:00:00 2001 From: Zino <98627207+Zinoviya99@users.noreply.github.com> Date: Mon, 10 Apr 2023 12:01:08 -0700 Subject: [PATCH 09/33] Update configuration.md Signed-off-by: Zino <98627207+Zinoviya99@users.noreply.github.com> --- usage-guide/configuration.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/usage-guide/configuration.md b/usage-guide/configuration.md index 270b182..fcf3c50 100644 --- a/usage-guide/configuration.md +++ b/usage-guide/configuration.md @@ -1,9 +1,6 @@ --- description: Configuring and customizing modmail. --- ---- -description: Configuring and customizing modmail. ---- Modmail offers an assort of customizations to make your Modmail bot unique to your server. Most customizations can be set with `?config`, but some has its own special command, such as `?activity`. You may find all of the personalizable tweaks available for Modmail below: @@ -13,6 +10,7 @@ You may find all of the personalizable tweaks available for Modmail below: {% hint style="warning" %} Things covered in brackets are optional: `[]` Things covered in angled brackets are required: `<>` {% endhint %} + Moderation Configurations ====== From b5ba00b7ad436213ed8b6b88cbc4e6acef2b74a3 Mon Sep 17 00:00:00 2001 From: Zino <98627207+Zinoviya99@users.noreply.github.com> Date: Mon, 10 Apr 2023 12:11:34 -0700 Subject: [PATCH 10/33] Update configuration.md Signed-off-by: Zino <98627207+Zinoviya99@users.noreply.github.com> --- usage-guide/configuration.md | 60 +++++++++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 11 deletions(-) diff --git a/usage-guide/configuration.md b/usage-guide/configuration.md index fcf3c50..0cbeaec 100644 --- a/usage-guide/configuration.md +++ b/usage-guide/configuration.md @@ -10,6 +10,11 @@ You may find all of the personalizable tweaks available for Modmail below: {% hint style="warning" %} Things covered in brackets are optional: `[]` Things covered in angled brackets are required: `<>` {% endhint %} +**Quick Navigation:** + +###### Moderation: +- [Prefix]() +- [Mention](./usage-guide/configuration#mention-mention) Moderation Configurations ====== @@ -46,6 +51,39 @@ Mentions all mods (mention) in mention channel when bot is mentioned - See also: `mention`, `mention_channel_id` +Prefix ( prefix ) +------ + +The prefix of the bot + +***Default:*** `?` + +***Example:*** +- `?config set prefix !` +- `?prefix !` + +This both result in commands now prefixed with !, for example: +{% hint style="success" %} !about {% endhint %} + +***Notes:*** +- If you forgot the bot prefix, Modmail will always respond to its mention (ping). +- To reset the prefix back to default: `?config del prefix` + +Guild Age ( guild_age ) +------ + +The join date of the recipient user into this server must be greater than the number of days, hours, minutes or any time-interval specified by this configuration. + +***Default:*** No age threshold + +***Example:*** +- `?config set guild_age P12DT3H` (stands for 12 days and 3 hours in [ISO-8601 Duration Format](https://en.wikipedia.org/wiki/ISO_8601#Durations)) +- `?config set guild_age 3 days and 5 hours` (accepted readable time) + +***Notes:*** +- To remove this restriction, do `{prefix}config del guild_age`. +- See also: `account_age`. + Reply Without Command ( reply_without_command ) ------ @@ -138,7 +176,7 @@ Log Channel ID ( log_channel_id ) This is the channel where all log messages will be sent (ie. thread close message, update message, etc.).\n\nTo change the log channel, you will need to find the [channel’s ID](https://support.discordapp.com/hc/en-us/articles/206346498). The channel doesn’t necessary have to be under the `main_category`. -***Default:*** `#bot-logs` (created with `{prefix}setup`) +***Default:*** `#bot-logs` (created with `?setup`) ***Example:*** - `?config set log_channel_id 9234932582312` (9234932582312 is the channel ID) @@ -151,7 +189,7 @@ Main Category ID ( main_category_id ) This is the category where all new threads will be created.\n\nTo change the Modmail category, you will need to find the [category’s ID](https://support.discordapp.com/hc/en-us/articles/206346498). -***Default:*** `Modmail` (created with `{prefix}setup`) +***Default:*** `Modmail` (created with `?setup`) ***Example:*** - `?config set main_category_id 9234932582312` (`9234932582312` is the category ID)` @@ -169,8 +207,8 @@ When this is set to `yes`, whenever a moderator starts to type in the thread cha ***Default:*** Disabled ***Example:*** -- `{prefix}config set mod_typing yes` -- `{prefix}config set mod_typing no` +- `?config set mod_typing yes` +- `?config set mod_typing no` ***Notes:*** - See also: `mod_typing` @@ -241,8 +279,8 @@ This is the message above user information for when a new thread is created in t - `?mention Yo~ Here's a new thread for ya!` ***Notes:*** -- To disable mention, use command `{prefix}mention disable`. -- See also: `{prefix}help mention`. +- To disable mention, use command `?mention disable`. +- See also: `?help mention`. Require Close Reason ( require_close_reason ) ------ @@ -267,8 +305,8 @@ Setting this configuration will close threads automatically after the number of - `?config set thread_auto_close 3 days and 5 hours` (accepted readable time) ***Notes:*** -- To disable auto close, do `{prefix}config del thread_auto_close`. -- To prevent a thread from auto-closing, do `{prefix}close cancel`. +- To disable auto close, do `?config del thread_auto_close`. +- To prevent a thread from auto-closing, do `?close cancel`. - See also: `thread_auto_close_silently`, `thread_auto_close_response`. Thread Cooldown ( thread_cooldown ) @@ -334,7 +372,7 @@ Whether to use regex to compare in autotriggers. Plain Reply Without Command ( plain_reply_without_command ) ------ -Setting this configuration will make all non-command messages sent in the thread channel to be forwarded to the recipient in a plain form without the need of `{prefix}reply`. +Setting this configuration will make all non-command messages sent in the thread channel to be forwarded to the recipient in a plain form without the need of `?reply`. ***Default:*** Disabled @@ -372,7 +410,7 @@ This is the emoji added to the message when when a Modmail action is invoked uns - `?config set blocked_emoji 🙅‍` ***Notes:*** -- You can disable `blocked_emoji` with `{prefix}config set blocked_emoji disable`. +- You can disable `blocked_emoji` with `?config set blocked_emoji disable`. - Custom/animated emojis are also supported, however, the emoji must be added to the server. - See also: `sent_emoji`. @@ -512,7 +550,7 @@ This is the emoji added to the message when when a Modmail action is invoked suc - `?config set sent_emoji ✨` ***Notes:*** -- You can disable `sent_emoji` with `{prefix}config set sent_emoji disable`. +- You can disable `sent_emoji` with `?config set sent_emoji disable`. - Custom/animated emojis are also supported, however, the emoji must be added to the server. - See also: `blocked_emoji`. From 74d94129a175e5b2c0d89b5b94ab226101fd1771 Mon Sep 17 00:00:00 2001 From: Zino <98627207+Zinoviya99@users.noreply.github.com> Date: Mon, 10 Apr 2023 12:13:39 -0700 Subject: [PATCH 11/33] Update configuration.md Removed Quick Nav For now Signed-off-by: Zino <98627207+Zinoviya99@users.noreply.github.com> --- usage-guide/configuration.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/usage-guide/configuration.md b/usage-guide/configuration.md index 0cbeaec..458f322 100644 --- a/usage-guide/configuration.md +++ b/usage-guide/configuration.md @@ -13,8 +13,6 @@ Things covered in angled brackets are required: `<>` {% endhint %} **Quick Navigation:** ###### Moderation: -- [Prefix]() -- [Mention](./usage-guide/configuration#mention-mention) Moderation Configurations ====== From 40b9343caec71734d9c043399ff4e39ac5fbc94c Mon Sep 17 00:00:00 2001 From: Zino <98627207+Zinoviya99@users.noreply.github.com> Date: Mon, 10 Apr 2023 13:22:29 -0700 Subject: [PATCH 12/33] Finished Config Page If anything is wrong wait 5 - 7 business days before telling me /s. Added everything, its all done, is pretty, is all configs. I just need to add the quick nav, which I will get to at a later point. Signed-off-by: Zino <98627207+Zinoviya99@users.noreply.github.com> --- usage-guide/configuration.md | 652 ++++++++++++++++++++++++++++++++++- 1 file changed, 651 insertions(+), 1 deletion(-) diff --git a/usage-guide/configuration.md b/usage-guide/configuration.md index 458f322..ce6a5be 100644 --- a/usage-guide/configuration.md +++ b/usage-guide/configuration.md @@ -13,6 +13,8 @@ Things covered in angled brackets are required: `<>` {% endhint %} **Quick Navigation:** ###### Moderation: +- [Prefix]() +- [Mention](./usage-guide/configuration#mention-mention) Moderation Configurations ====== @@ -758,7 +760,655 @@ Transfer users reactions to mods and vice versa Thread Responses ====== -TODO / In Progress +Close On Leave Reason ( close_on_leave_reason ) +------ + +Reason for closing the thread once member leaves + +***Default:*** The recipient has left the server. + +***Example:*** +- `?config set close_on_leave_reason Member left` + +***Notes:*** +- This has no effect unless `close_on_leave` is set. +- See also: `close_on_leave`. + +Confirm Thread Creation Title ( confirm_thread_creation_title ) +------ + +Title for the embed message sent to users to confirm a thread creation + +***Default:*** Confirm thread creation + +***Example:*** +- `?config set confirm_thread_creation_title Are you sure you want to create a new thread?` + + +***Notes:*** +- See also: `confirm_thread_creation`, `confirm_thread_response`, `confirm_thread_creation_accept`, `confirm_thread_creation_deny` + +Confirm Thread Response ( confirm_thread_response ) +------ + +Description for the embed message sent to users to confirm a thread creation + +***Default:*** React to confirm thread creation which will directly contact the moderators + +***Example:*** +- `?config set confirm_thread_response React to confirm` + + +***Notes:*** +- See also: `confirm_thread_creation`, `confirm_thread_creation_title`, `confirm_thread_creation_accept`, `confirm_thread_creation_deny` + + +Cooldown Thread Response ( cooldown_thread_response ) +------ + +The description of the message embed when the user has a cooldown before creating a new thread. + +***Default:*** Your cooldown ends {delta}. Try contacting me then. + +{% hint style="info" %} `{delta}` will be replaced with whatever time you gave it. {% endhint %} + +***Example:*** +- `?config set cooldown_thread_response Be patient! You are on cooldown, wait {delta} more.` + + +***Notes:*** +- "Only has an effect when `thread_cooldown` is set +- Must have a {delta} included which will be replaced with the duration of time. +- See also: `cooldown_thread_title`. + +Cooldown Thread Title ( cooldown_thread_title ) +------ + +The title of the message embed when the user has a cooldown before creating a new thread. + +***Default:*** Message not sent! + +***Example:*** +- `?config set cooldown_thread_title Error` + + +***Notes:*** +- Only has an effect when `thread_cooldown` is set +- See also: `cooldown_thread_response`. + +Disabled Current Thread Footer ( disabled_current_thread_footer ) +------ + +The footer of the message embed when Modmail DM is disabled and user DMs Modmail from existing thread. + +***Default:*** Please try again later... + +***Example:*** +- `?config set disabled_current_thread_footer Message back!` + +***Notes:*** +- Only has an effect when `{prefix}disable all` is set. +- See also: `disabled_current_thread_title`, `disabled_current_thread_response`, `disabled_new_thread_footer`. + +Disabled Current Thread Response ( disabled_current_thread_response ) +------ + +The body of the message embed when Modmail DM is disabled and user DMs Modmail from existing thread. + +***Default:*** We are not accepting any messages. + +***Example:*** +- `?config set disabled_current_thread_response On break right now.` + + +***Notes:*** +- Only has an effect when `{prefix}disable all` is set. +- See also: `disabled_current_thread_title`, `disabled_current_thread_footer`, `disabled_new_thread_response`. + +Disabled Current Thread Title ( disabled_current_thread_title ) +------ + +The title of the message embed when Modmail DM is disabled and user DMs Modmail from existing thread. + +***Default:*** Not Delivered. + +***Example:*** +- `?config set disabled_current_thread_title Unavailable` + + +***Notes:*** +- Only has an effect when `{prefix}disable all` is set. +- See also: `disabled_current_thread_response`, `disabled_current_thread_footer`, `disabled_new_thread_title`. + +Disabled New Thread Footer ( disabled_new_thread_footer ) +------ + +The footer of the message embed when Modmail new thread creation is disabled and user tries to create a new thread. + +***Default:*** Please try again later... + +***Example:*** +- `?config set disabled_new_thread_footer Contact us later` + + +***Notes:*** +- Only has an effect when `{prefix}disable` or `{prefix}disable all` is set. +- See also: `disabled_new_thread_title`, `disabled_new_thread_response`, `disabled_current_thread_footer`. + +Disabled New Thread Response ( disabled_new_thread_response ) +------ + +The body of the message embed when Modmail new thread creation is disabled and user tries to create a new thread. + +***Default:*** We are not accepting new threads. + +***Example:*** +- `?config set disabled_new_thread_response Our working hours is between 8am - 6pm EST.` + + +***Notes:*** +- Only has an effect when `{prefix}disable` or `{prefix}disable all` is set. +- See also: `disabled_new_thread_title`, `disabled_new_thread_footer`, `disabled_current_thread_response`. + +Disabled New Thread Title ( disabled_new_thread_title ) +------ + +The title of the message embed when Modmail new thread creation is disabled and user tries to create a new thread. + +***Default:*** Not Delivered. + +***Example:*** +- `?config set disabled_new_thread_title Closed` + + +***Notes:*** +- Only has an effect when `{prefix}disable` or `{prefix}disable all` is set. +- See also: `disabled_new_thread_response`, `disabled_new_thread_footer`, `disabled_current_thread_title`. + +Private Added To Group Description Anon ( private_added_to_group_description_anon ) +------ + +This is the message embed content sent to the recipient that is just added to a thread when adduser is used anonymously. + +***Default:*** A moderator has added you to a Modmail thread. + +***Example:*** +- `?config set private_added_to_group_description_anon Any message sent here will be sent to all other thread recipients.` + + +***Notes:*** +- When adduser (no anon) is used, `private_added_to_group_description` is used instead. +- The public_ variant is used when sending to other thread recipients. +- See also: `private_added_to_group_title`, `public_added_to_group_description_anon` + +Private Added To Group Response ( private_added_to_group_response ) +------ + +This is the message embed content sent to the recipient that is just added to a thread. + +***Default:*** \"{{moderator.name}} has added you to a Modmail thread.\" + +***Example:*** +- `?config set private_added_to_group_description Any message sent here will be sent to all otherthread recipients.` + + +***Notes:*** +- You may use the `{{moderator}}` variable for access to the [Member](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member) that added the user. +- When anonadduser is used, `private_added_to_group_description_anon` is used instead. +- The public_ variant is used when sending to other thread recipients. +- See also: `private_added_to_group_title`, `public_added_to_group_description` + +Private Added To Group Title ( private_added_to_group_title ) +------ + +This is the message embed title sent to the recipient that is just added to a thread. + +***Default:*** New Thread (Group) + +***Example:*** +- `?config set private_added_to_group_title Welcome to this new group thread!` + + +***Notes:*** +- The public_ variant is used when sending to other thread recipients. +- See also: `private_added_to_group_description`, `public_added_to_group_title` + +Private Removed From Group Description Anon ( private_removed_from_group_description_anon ) +------ + +This is the message embed content sent to the recipient that is just removed from a thread when removeuser is used anonymously. + +***Default:*** A moderator has removed you from the Modmail thread. + +***Example:*** +- `?config set private_removed_from_group_description_anon You are permenantly removed from this thread.` + +***Notes:*** +- When adduser (no anon) is used, `private_removed_from_group_description` is used instead. +- The public_ variant is used when sending to other thread recipients. +- See also: `private_removed_from_group_title`, `public_removed_from_group_description_anon` + +Private Removed From Group Response ( private_removed_from_group_response ) +------ + +This is the message embed content sent to the recipient that is just removed from a thread. + +***Default:*** \"{{moderator.name}} has removed you from the Modmail thread.\" + +***Example:*** +- `?config set private_removed_from_group_description Bye` + +***Notes:*** +- You may use the `{{moderator}}` variable for access to the [Member](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member) that added the user. +- When anonremoveuser is used, `private_removed_from_group_description_anon` is used instead. +- The public_ variant is used when sending to other thread recipients. +- See also: `private_removed_from_group_title`, `public_removed_from_group_description` + +Private Removed From Group Title ( private_removed_from_group_title ) +------ + +This is the message embed title sent to the recipient that is just removed from a thread. + +***Default:*** Removed From Thread (Group) + +***Example:*** +- `?config set private_removed_from_group_title Welcome to this new group thread!` + +***Notes:*** +- The public_ variant is used when sending to other thread recipients. +- See also: `private_removed_from_group_description`, `public_removed_from_group_title` + +Public Added To Group Description Anon ( public_added_to_group_description_anon ) +------ + +This is the message embed content sent to all other recipients when someone is added to the thread when adduser is used anonymously. + +***Default:*** \"A moderator has added {{users}} to the Modmail thread.\" + +***Example:*** +- `?config set public_added_to_group_description_anon Any message sent here will be sent to all other thread recipients.` + + +***Notes:*** +- When adduser (no anon) is used, `public_added_to_group_description` is used instead. +- The private_ variant is used when sending to the new user. +- See also: `public_added_to_group_title`, `private_added_to_group_description_anon` + +Public Added To Group Response ( public_added_to_group_response ) +------ + +This is the message embed content sent to all other recipients when someone is added to the thread. + +***Default:*** \"{{moderator.name}} has added {{users}} to the Modmail thread.\" + +***Example:*** +- `?config set public_added_to_group_response Welcome {users}!` + +***Notes:*** +- You may use the `{{moderator}}` variable for access to the [Member](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member) that added the user. +- When anonadduser is used, `public_added_to_group_description_anon` is used instead. +- The private_ variant is used when sending to the new user. +- See also: `public_added_to_group_title`, `private_added_to_group_description` + +Public Added To Group Title ( public_added_to_group_title ) +------ + +This is the message embed title sent to all other recipients when someone is added to the thread. + +***Default:*** New User + +***Example:*** +- `?config set public_added_to_group_title Welcome to our new user!` + + +***Notes:*** +- The private_ variant is used when sending to the new user. +- See also: `private_added_to_group_title`, `private_added_to_group_title` + +Public Removed From Group Description Anon ( public_removed_from_group_description_anon ) +------ + +This is the message embed content sent to all other recipients when someone is removed from the thread when removeuser is used anonymously. + +***Default:*** \"A moderator has removed {{users}} from the Modmail thread.\" + +***Example:*** +- `?config set public_removed_from_group_description_anon Goodbye {users}!` + + +***Notes:*** +- When adduser (no anon) is used, `public_removed_from_group_description` is used instead. +- The private_ variant is used when sending to the new user. +- See also: `public_removed_from_group_title`, `private_removed_from_group_description_anon` + +Public Removed From Group Response ( public_removed_from_group_response ) +------ + +This is the message embed content sent to all other recipients when someone is removed from the thread. + +***Default:*** \"{{moderator.name}} has removed {{users}} from the Modmail thread.\" + +***Example:*** +- `?config set public_removed_from_group_response Goodbye {users}!` + + +***Notes:*** +- You may use the `{{moderator}}` variable for access to the [Member](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member) that added the user. +- When anonremoveuser is used, `public_removed_from_group_description_anon` is used instead. + +Public Removed From Group Title ( public_removed_from_group_title ) +------ + +This is the message embed title sent to all other recipients when someone is removed from the thread. + +***Default:*** User Removed + +***Example:*** +- `?config set public_removed_from_group_title User is now gone!` + + +***Notes:*** +- The private_ variant is used when sending to the new user. +- See also: `private_removed_from_group_title`, `private_removed_from_group_title` + +React To Contact Message ( react_to_contact_message ) +------ + +A message ID where reactions are tracked. If the `react_to_contact_emoji` is added, the bot opens a thread with them. + +***Default:*** None + +***Example:*** +- `?config set react_to_contact_message 773575608814534717` + + +***Notes:*** +- See also: `react_to_contact_emoji` + + +Recipient Thread Close ( recipient_thread_close ) +------ + +Setting this configuration will allow recipients to use the `close_emoji` to close the thread themselves. + +***Default:*** Disabled + +***Example:*** +- `?config set recipient_thread_close yes` +- `?config set recipient_thread_close no` + + +***Notes:*** +- The close emoji is dictated by the configuration `close_emoji`. +- See also: `close_emoji`. + +Thread Auto Close Response ( thread_auto_close_response ) +------ + +This is the message to display when the thread when the thread auto-closes. + +***Default:*** \"This thread has been closed automatically due to inactivity after {{timeout}}.\" + +***Example:*** +- `?config set thread_auto_close_response Your close message here.` + + +***Notes:*** +- Its possible to use `{{timeout}}` as a placeholder for a formatted timeout text. +- This will not have an effect when `thread_auto_close_silently` is enabled. +- Discord flavoured markdown is fully supported in `thread_auto_close_response`. +- See also: `thread_auto_close`, `thread_auto_close_silently`. + +Thread Auto Close Silently ( thread_auto_close_silently ) +------ + +Setting this configuration will close silently when the thread auto-closes. + +***Default:*** No + +***Example:*** +- `?config set thread_auto_close_silently yes` +- `?config set thread_auto_close_silently no` + + +***Notes:*** +- This will only have an effect when `thread_auto_close` is set. +- See also: `thread_auto_close`. + +Thread Cancelled ( thread_cancelled ) +------ + +This is the message to display when a thread times out and creation is cancelled. + +***Default:*** \"Cancelled\" + +***Example:*** +- `?config set thread_cancelled Gone.` + + +Thread Close Footer ( thread_close_footer ) +------ + +This is the message embed footer sent to the recipient upon the closure of a thread. + +***Default:*** \"Replying will create a new thread\" + +***Example:*** +- `?config set thread_close_footer Bye!` + + +***Notes:*** +- See also: `thread_close_title`, `thread_close_response`, `thread_creation_footer`. + + +Thread Close Response ( thread_close_response ) +------ + +This is the message embed content sent to the recipient upon the closure of a thread. + +There are three variables you can use within the thread close message: + - `closer`: the discord User object of the user who closed the thread. + - `logkey`: the key for the thread logs. (ie. 51ecd946dc29) + - `loglink`: the full link URL to the thread logs. (ie. https://logviewer.herokuapp.com/logs/51ecd946dc29) + + +***Default:*** \"{{closer.mention}} has closed this Modmail thread\" + +***Example:*** +- `?config set thread_close_response Your message is appriciated!` + +To use variables in the thread close message: +- `?config set thread_close_response {closer.mention} has closed this thread, here's your log key: **`{logkey}`**.` + + +***Notes:*** +- When `recipient_thread_close` is enabled and the recipient closed their own thread, `thread_self_close_response` is used instead of this configuration. +- You may use the `{{closer}}` variable for access to the [Member](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member) that closed the thread. +- Discord flavoured markdown is fully supported in `thread_close_response`. +- See also: `thread_close_title`, `thread_close_footer`, `thread_self_close_response`, `thread_creation_response`. + +Thread Close Title ( thread_close_title ) +------ + +This is the message embed title sent to the recipient upon the closure of a thread. + +***Default:*** \"Thread Closed\" + +***Example:*** +- `?config set thread_close_title Farewell!` + + +***Notes:*** +- See also: `thread_close_response`, `thread_close_footer`, `thread_creation_title`. + + +Thread Contact Silently ( thread_contact_silently ) +------ + +Setting this configuration will always open a new thread silently in contact. + +***Default:*** No + +***Example:*** +- `?config set thread_contact_silently yes` +- `?config set thread_contact_silently no` + + +***Notes:*** +- Works like `{prefix}contact silent` for every new thread. + + +Thread Creation Contact Response ( thread_creation_contact_response ) +------ + +This is the message embed description sent to recipients when contacted by a mod. + +***Default:*** \"{{creator.name}} has opened a Modmail thread.\" + +***Example:*** +- `?config set thread_creation_contact_response New thread opened.` + + +***Notes:*** +- You may use the `{{creator}}` variable for access to the [Member](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member) that created the thread. +- `thread_creation_self_contact_response` is used when contacted by self. +- See also: `thread_creation_contact_title`, `thread_creation_self_contact_response`. + +Thread Creation Contact Title ( thread_creation_contact_title ) +------ + +This is the message embed title sent to recipients when contacted. + +***Default:*** \"New Thread\" + +***Example:*** +- `?config set thread_creation_contact_title New Message!` + +***Notes:*** +- See also: `thread_creation_self_contact_response`, `thread_creation_contact_response`. + + +Thread Creation Footer ( thread_creation_footer ) +------ + +This is the message embed footer sent to the recipient upon the creation of a new thread. + +***Default:*** \"Your message has been sent\" + +***Example:*** +- `?config set thread_creation_footer Please Hold... + + +***Notes:*** +- This is used in place of `thread_self_closable_creation_footer` when `recipient_thread_close` is enabled. +- See also: `thread_creation_title`, `thread_creation_response`, `thread_self_closable_creation_footer`, `thread_close_footer`. + +Thread Creation Response ( thread_creation_response ) +------ + +This is the message embed content sent to the recipient upon the creation of a new thread. + +***Default:*** \"The staff team will get back to you as soon as possible.\" + +***Example:*** +- `?config set thread_creation_response You will be contacted shortly.` + + +***Notes:*** +- Discord flavoured markdown is fully supported in `thread_creation_response`. +- See also: `thread_creation_title`, `thread_creation_footer`, `thread_close_response`. + +Thread Creation Self Contact Response ( thread_creation_self_contact_response ) +------ + +This is the message embed description sent to recipients when self-contacted. + +***Default:*** \"You have opened a Modmail thread.\" + +***Example:*** +- `?config set thread_creation_self_contact_response You contacted yourself.` + +***Notes:*** +- `thread_creation_contact_response` is used when contacted by another user. +- See also: `thread_creation_contact_title`, `thread_creation_contact_response`. + +Thread Creation Title ( thread_creation_title ) +------ + +This is the message embed title sent to the recipient upon the creation of a new thread. + +***Default:*** \"Thread Created\" + +***Example:*** +- `?config set thread_creation_title Hello!` + + +***Notes:*** +- See also: `thread_creation_response`, `thread_creation_footer`, `thread_close_title`. + + +Thread Move Response ( thread_move_response ) +------ + +This is the message to display to the user when the thread is moved. + +***Default:*** This thread has been moved. + +***Example:*** +- `?config set thread_move_response This thread has been moved to another category for review!` + + +***Notes:*** +- Only has an effect when `thread_move_notify` is on. +- See also: `thread_move_title`, `thread_move_notify`. + +Thread Move Title ( thread_move_title ) +------ + +The title of the message embed when a thread is moved. + +***Default:*** Thread Moved + +***Example:*** +- `?config set thread_move_title Thread transferred to another channel!` + + +***Notes:*** +-See also: `thread_move_notify`, `thread_move_notify_mods`, `thread_move_response`. + + +Thread Self Closable Creation Footer ( thread_self_closable_creation_footer ) +------ + +This is the message embed footer sent to the recipient upon the creation of a new thread. + +***Default:*** \"Click the lock to close the thread\" + +***Example:*** +- `?config set thread_self_closable_creation_footer Please Hold...` + + +***Notes:*** +- This is used in place of `thread_creation_footer` when `recipient_thread_close` is disabled. +- See also: `thread_creation_title`, `thread_creation_response`, `thread_creation_footer`. + +Thread Self Close Response ( thread_self_close_response ) +------ + +This is the message embed content sent to the recipient upon the closure of a their own thread. + +***Default:*** \"You have closed this Modmail thread.\" + +***Example:*** +- `?config set thread_self_close_response You have closed your own thread...` + + +***Notes:*** +- When `recipient_thread_close` is disabled or the thread wasn't closed by the recipient, `thread_close_response` is used instead of this configuration. +- You may use the `{{closer}}` variable for access to the [Member](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member) that closed the thread. +- `{{loglink}}` can be used as a placeholder substitute for the full URL linked to the thread in the log viewer and `{{loglink}}` for the unique key (ie. s3kf91a) of the log. +- Discord flavoured markdown is fully supported in `thread_self_close_response`. +-See also: `thread_close_title`, `thread_close_footer`, `thread_close_response`. `.env` Config Options ====== From 6b8c88482a0e8e2885837602069ce2c5c4e27d81 Mon Sep 17 00:00:00 2001 From: sebkuip Date: Thu, 30 Mar 2023 15:40:31 +0200 Subject: [PATCH 13/33] Add base logviewer instructions --- installation/local-hosting-vps/README.md | 9 +++ installation/local-hosting-vps/logviewer.md | 69 +++++++++++++++++++ .../local-hosting-vps/patreon_logviewer.md | 8 +++ 3 files changed, 86 insertions(+) create mode 100644 installation/local-hosting-vps/logviewer.md create mode 100644 installation/local-hosting-vps/patreon_logviewer.md diff --git a/installation/local-hosting-vps/README.md b/installation/local-hosting-vps/README.md index 998044b..2ea5a43 100644 --- a/installation/local-hosting-vps/README.md +++ b/installation/local-hosting-vps/README.md @@ -22,3 +22,12 @@ description: Hosting on the cloud or on your own computer. * [AlmaLinux](./almalinux.md) * [CentOS](./centos.md) * [Raspberry Pi](./raspberry-pi.md) + +## Logviewer + +You can also self-host logviewer by following the guide below. + +If you wish to self host the patreon logviewer, first follow the regular logviewer hosting setup, then follow the guide below. + +* [Logviewer](./logviewer.md) +* [Patreon logviewer](./patreon-logviewer.md) \ No newline at end of file diff --git a/installation/local-hosting-vps/logviewer.md b/installation/local-hosting-vps/logviewer.md new file mode 100644 index 0000000..d97c103 --- /dev/null +++ b/installation/local-hosting-vps/logviewer.md @@ -0,0 +1,69 @@ +--- +description: Hosting the logviewer on the cloud or on your own computer. +--- + +# Logviewer + +## Prerequisites + +This logviewer hosting tutorial is written assuming you have already set up your bot and are running Ubuntu 20.04-22.04. + +## Downloading the files + +* You must have git installed on your system. If you do not, run `sudo apt install git` to install it. + +You can download the logviewer files by running the following command: + +```bash +git clone https://github.com/modmail-dev/logviewer logviewer +``` +
+Once done, you can use `cd logviewer` to enter the directory. + +## Installing the dependencies + +* Pipenv must be installed. Since this is also used for the bot, you can skip this step if you have already installed it. + +Installing the dependencies is done by running the following command: + +```bash +pipenv install +``` +
+ +## Configuring the .env + +To configure the .env file, you can use the following command: + +```bash +cp .env.example .env +nano .env +``` +This will copy the example .env file and open it in nano. You can then edit the file with your info. +You will need to enter the same mongo URI as your bot uses. The rest of the configs can be left to the default values, unless you have a specific reason to change them. + +Then save the file and exit nano by pressing `ctrl + x`, then `y` and `enter`. + +## Running the logviewer + +Now you can start the logviewer with the following command + +```bash +sudo pipenv run logviewer +``` + +## (Optional) Keep logviewer running in the background with pm2 + +Pm2 can keep your logviewer automatically online in the background even if you close your terminal. To install pm2, run the following command: + +```bash +sudo apt install npm -y && sudo npm i pm2 -g +``` + +Once installed, you can start the logviewer with pm2 by running the following command: + +```bash +sudo pm2 start logviewer.sh --name "logviewer" && sudo pm2 save +``` + +More info on how to use pm2 can be found [on pm2's website](https://pm2.keymetrics.io/docs/usage/quick-start/). diff --git a/installation/local-hosting-vps/patreon_logviewer.md b/installation/local-hosting-vps/patreon_logviewer.md new file mode 100644 index 0000000..4c8abed --- /dev/null +++ b/installation/local-hosting-vps/patreon_logviewer.md @@ -0,0 +1,8 @@ +--- +description: Hosting the patreon logviewer on the cloud or on your own computer. +--- + +# Patreon logviewer + +Before starting, please ensure that you have first followed the regular logviewer hosting setup [here](./logviewer) + From 61e2f055518f7f9ab71458f2d6bdf7335dca28d9 Mon Sep 17 00:00:00 2001 From: sebkuip Date: Thu, 30 Mar 2023 15:56:00 +0200 Subject: [PATCH 14/33] Add a patreon logviewer hosting setup --- installation/local-hosting-vps/README.md | 4 +- .../local-hosting-vps/patreon_logviewer.md | 75 +++++++++++++++++++ 2 files changed, 76 insertions(+), 3 deletions(-) diff --git a/installation/local-hosting-vps/README.md b/installation/local-hosting-vps/README.md index 2ea5a43..b45c1f9 100644 --- a/installation/local-hosting-vps/README.md +++ b/installation/local-hosting-vps/README.md @@ -25,9 +25,7 @@ description: Hosting on the cloud or on your own computer. ## Logviewer -You can also self-host logviewer by following the guide below. - -If you wish to self host the patreon logviewer, first follow the regular logviewer hosting setup, then follow the guide below. +You can also self-host logviewer by following the guides below. * [Logviewer](./logviewer.md) * [Patreon logviewer](./patreon-logviewer.md) \ No newline at end of file diff --git a/installation/local-hosting-vps/patreon_logviewer.md b/installation/local-hosting-vps/patreon_logviewer.md index 4c8abed..7680fd1 100644 --- a/installation/local-hosting-vps/patreon_logviewer.md +++ b/installation/local-hosting-vps/patreon_logviewer.md @@ -6,3 +6,78 @@ description: Hosting the patreon logviewer on the cloud or on your own computer. Before starting, please ensure that you have first followed the regular logviewer hosting setup [here](./logviewer) +## Setting up OAuth2 + +To set up OAuth2, you need to set a few settings in your Discord Developer Portal. First, head to the [Discord Developer Portal](https://discord.com/developers/applications) and select your modmail bot application. Then go to "OAuth2" and "General" +
+ +First, copy the Client ID and Client Secret. You will need these later when filling in the .env. +Then, set a redirect URL to `https://yourlogviewer.com/callback`, with the url being changed to the url of your logviewer. +Finally, click save. +
+ +## Downloading the files + +* You must have git installed on your system. If you do not, run `sudo apt install git` to install it. + +You can download the logviewer files by running the following command: + +```bash +git clone https://github.com/modmail-dev/logviewer-premium logviewer +``` +
+Once done, you can use `cd logviewer` to enter the directory. + +## Installing the dependencies + +* Pipenv must be installed. Since this is also used for the bot, you can skip this step if you have already installed it. + +Installing the dependencies is done by running the following command: + +```bash +pipenv install +``` +
+ +## Configuring the .env + +To configure the .env file, you can use the following command: + +```bash +cp .env.example .env +nano .env +``` +This will copy the example .env file and open it in nano. You can then edit the file with your info. Besides the normal logviewer config, you will also need to add your bot's token and the client ID and secret you copied earlier. + +You will need to enter the same mongo URI as your bot uses. The rest of the configs can be left to the default values, unless you have a specific reason to change them. + +Then save the file and exit nano by pressing `ctrl + x`, then `y` and `enter`. + +## Running the logviewer + +Now you can start the logviewer with the following command + +```bash +sudo pipenv run logviewer +``` + +## Whitelisting users + +To allow people to view the logviewer, you will have to whitelist them. To do this, you can use the following command in discord where your modmail bot is: +`oauth whitelist roleID` or `oauth whitelist userID`. + +## (Optional) Keep logviewer running in the background with pm2 + +Pm2 can keep your logviewer automatically online in the background even if you close your terminal. To install pm2, run the following command: + +```bash +sudo apt install npm -y && sudo npm i pm2 -g +``` + +Once installed, you can start the logviewer with pm2 by running the following command: + +```bash +sudo pm2 start logviewer.sh --name "logviewer" && sudo pm2 save +``` + +More info on how to use pm2 can be found [on pm2's website](https://pm2.keymetrics.io/docs/usage/quick-start/). From 3097d6ef0aa3802f52bc0e4994b3d71d5f5f4a3b Mon Sep 17 00:00:00 2001 From: sebkuip Date: Thu, 30 Mar 2023 16:06:59 +0200 Subject: [PATCH 15/33] Added info on how to clone a private repo --- .../local-hosting-vps/patreon_logviewer.md | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/installation/local-hosting-vps/patreon_logviewer.md b/installation/local-hosting-vps/patreon_logviewer.md index 7680fd1..04439a1 100644 --- a/installation/local-hosting-vps/patreon_logviewer.md +++ b/installation/local-hosting-vps/patreon_logviewer.md @@ -20,12 +20,30 @@ Finally, click save. * You must have git installed on your system. If you do not, run `sudo apt install git` to install it. +Due to the logviewer premium repo being private, you will first need to set up a personal access token to clone the repo. To do this, follow the steps below. + +* Open github in your browser +* When logged in, click your name in the top right and go to 'settings' +* On the left, click 'Developer settings' +* On the left, click 'Personal access tokens' and then 'Tokens (classic)' +* Click 'Generate new token' +* Give the token a name and select the 'repo' scope +* Copy the token and save it somewhere safe + +
+
+
+
+
+ You can download the logviewer files by running the following command: ```bash git clone https://github.com/modmail-dev/logviewer-premium logviewer ``` -
+ +You will be prompted for your username and password. Enter your github username and the personal access token you just created. +
Once done, you can use `cd logviewer` to enter the directory. ## Installing the dependencies From 9d4aaa4f5ca7c639648b02af06aff1172690a28c Mon Sep 17 00:00:00 2001 From: sebkuip Date: Thu, 30 Mar 2023 16:12:15 +0200 Subject: [PATCH 16/33] Added logviewer links to summary --- SUMMARY.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SUMMARY.md b/SUMMARY.md index 1a1ed04..da865d0 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -12,6 +12,8 @@ * [AlmaLinux](installation/local-hosting-vps/almalinux.md) * [CentOS](installation/local-hosting-vps/centos.md) * [Raspberry Pi](installation/local-hosting-vps/raspberry-pi.md) + * [Logviewer](installation/logviewer.md) + * [Patreon logviewer](installation/patreon-logviewer.md) * [Railway](installation/railway.md) * [Heroku](installation/heroku.md) * [Replit](installation/replit.md) From 7373c16ca71e863279ded0f5c0282e75e749bc6b Mon Sep 17 00:00:00 2001 From: sebkuip Date: Thu, 30 Mar 2023 16:13:47 +0200 Subject: [PATCH 17/33] Fix links --- SUMMARY.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index da865d0..0ed4d1c 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -12,8 +12,8 @@ * [AlmaLinux](installation/local-hosting-vps/almalinux.md) * [CentOS](installation/local-hosting-vps/centos.md) * [Raspberry Pi](installation/local-hosting-vps/raspberry-pi.md) - * [Logviewer](installation/logviewer.md) - * [Patreon logviewer](installation/patreon-logviewer.md) + * [Logviewer](installation/local-hosting-vps/logviewer.md) + * [Patreon logviewer](installation/local-hosting-vps/patreon-logviewer.md) * [Railway](installation/railway.md) * [Heroku](installation/heroku.md) * [Replit](installation/replit.md) From eb865e21c5a17642d32af624fe3e9f9aeea818ac Mon Sep 17 00:00:00 2001 From: sebkuip Date: Thu, 30 Mar 2023 16:14:30 +0200 Subject: [PATCH 18/33] Fix patreon underscore --- SUMMARY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SUMMARY.md b/SUMMARY.md index 0ed4d1c..1d23832 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -13,7 +13,7 @@ * [CentOS](installation/local-hosting-vps/centos.md) * [Raspberry Pi](installation/local-hosting-vps/raspberry-pi.md) * [Logviewer](installation/local-hosting-vps/logviewer.md) - * [Patreon logviewer](installation/local-hosting-vps/patreon-logviewer.md) + * [Patreon logviewer](installation/local-hosting-vps/patreon_logviewer.md) * [Railway](installation/railway.md) * [Heroku](installation/heroku.md) * [Replit](installation/replit.md) From 8699e67926fca32e35780fe73eaebd2c38307142 Mon Sep 17 00:00:00 2001 From: sebkuip Date: Thu, 30 Mar 2023 16:15:41 +0200 Subject: [PATCH 19/33] Fix another underscore --- installation/local-hosting-vps/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installation/local-hosting-vps/README.md b/installation/local-hosting-vps/README.md index b45c1f9..07b2d0a 100644 --- a/installation/local-hosting-vps/README.md +++ b/installation/local-hosting-vps/README.md @@ -28,4 +28,4 @@ description: Hosting on the cloud or on your own computer. You can also self-host logviewer by following the guides below. * [Logviewer](./logviewer.md) -* [Patreon logviewer](./patreon-logviewer.md) \ No newline at end of file +* [Patreon logviewer](./patreon_logviewer.md) \ No newline at end of file From 59c4e7363e22bd90d8184c5a7b9c95655392c7ac Mon Sep 17 00:00:00 2001 From: sebkuip Date: Sat, 1 Apr 2023 00:50:15 +0200 Subject: [PATCH 20/33] Apply stephen's suggestions --- installation/local-hosting-vps/logviewer.md | 9 +++++++-- installation/local-hosting-vps/patreon_logviewer.md | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/installation/local-hosting-vps/logviewer.md b/installation/local-hosting-vps/logviewer.md index d97c103..43980e1 100644 --- a/installation/local-hosting-vps/logviewer.md +++ b/installation/local-hosting-vps/logviewer.md @@ -22,8 +22,14 @@ Once done, you can use `cd logviewer` to enter the directory. ## Installing the dependencies +First, install pipenv by running the following command: + * Pipenv must be installed. Since this is also used for the bot, you can skip this step if you have already installed it. +```bash +python -m pip install pipenv +``` + Installing the dependencies is done by running the following command: ```bash @@ -36,13 +42,12 @@ pipenv install To configure the .env file, you can use the following command: ```bash -cp .env.example .env nano .env ``` This will copy the example .env file and open it in nano. You can then edit the file with your info. You will need to enter the same mongo URI as your bot uses. The rest of the configs can be left to the default values, unless you have a specific reason to change them. -Then save the file and exit nano by pressing `ctrl + x`, then `y` and `enter`. +Then save the file and exit nano by pressing `ctrl + x`, then `y`, change the name from `.env.example` to `.env` and then `enter`. ## Running the logviewer diff --git a/installation/local-hosting-vps/patreon_logviewer.md b/installation/local-hosting-vps/patreon_logviewer.md index 04439a1..6655991 100644 --- a/installation/local-hosting-vps/patreon_logviewer.md +++ b/installation/local-hosting-vps/patreon_logviewer.md @@ -48,8 +48,14 @@ Once done, you can use `cd logviewer` to enter the directory. ## Installing the dependencies +First, install pipenv by running the following command: + * Pipenv must be installed. Since this is also used for the bot, you can skip this step if you have already installed it. +```bash +python -m pip install pipenv +``` + Installing the dependencies is done by running the following command: ```bash @@ -62,14 +68,13 @@ pipenv install To configure the .env file, you can use the following command: ```bash -cp .env.example .env nano .env ``` This will copy the example .env file and open it in nano. You can then edit the file with your info. Besides the normal logviewer config, you will also need to add your bot's token and the client ID and secret you copied earlier. You will need to enter the same mongo URI as your bot uses. The rest of the configs can be left to the default values, unless you have a specific reason to change them. -Then save the file and exit nano by pressing `ctrl + x`, then `y` and `enter`. +Then save the file and exit nano by pressing `ctrl + x`, then `y`, change the name from `.env.example` to `.env` and then `enter`. ## Running the logviewer From f09e98064a1f8044e8d644a3057ab35f2befc5d3 Mon Sep 17 00:00:00 2001 From: sebkuip Date: Sat, 1 Apr 2023 00:52:03 +0200 Subject: [PATCH 21/33] Change extra line in premium logviewer guide --- installation/local-hosting-vps/patreon_logviewer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installation/local-hosting-vps/patreon_logviewer.md b/installation/local-hosting-vps/patreon_logviewer.md index 6655991..a2548e9 100644 --- a/installation/local-hosting-vps/patreon_logviewer.md +++ b/installation/local-hosting-vps/patreon_logviewer.md @@ -4,7 +4,7 @@ description: Hosting the patreon logviewer on the cloud or on your own computer. # Patreon logviewer -Before starting, please ensure that you have first followed the regular logviewer hosting setup [here](./logviewer) +This logviewer hosting tutorial is written assuming you have already set up your bot and are running Ubuntu 20.04-22.04. ## Setting up OAuth2 From ad764f41df965d6800637fb7c019ac0b2f0571bc Mon Sep 17 00:00:00 2001 From: Sebastian Kuipers Date: Mon, 10 Apr 2023 19:57:39 +0200 Subject: [PATCH 22/33] Fix for stephen's review --- installation/local-hosting-vps/logviewer.md | 2 +- installation/local-hosting-vps/patreon_logviewer.md | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/installation/local-hosting-vps/logviewer.md b/installation/local-hosting-vps/logviewer.md index 43980e1..aec51f4 100644 --- a/installation/local-hosting-vps/logviewer.md +++ b/installation/local-hosting-vps/logviewer.md @@ -44,7 +44,7 @@ To configure the .env file, you can use the following command: ```bash nano .env ``` -This will copy the example .env file and open it in nano. You can then edit the file with your info. +This will open the example .env file in nano. You can then edit the file with your info. You will need to enter the same mongo URI as your bot uses. The rest of the configs can be left to the default values, unless you have a specific reason to change them. Then save the file and exit nano by pressing `ctrl + x`, then `y`, change the name from `.env.example` to `.env` and then `enter`. diff --git a/installation/local-hosting-vps/patreon_logviewer.md b/installation/local-hosting-vps/patreon_logviewer.md index a2548e9..252b928 100644 --- a/installation/local-hosting-vps/patreon_logviewer.md +++ b/installation/local-hosting-vps/patreon_logviewer.md @@ -11,7 +11,7 @@ This logviewer hosting tutorial is written assuming you have already set up your To set up OAuth2, you need to set a few settings in your Discord Developer Portal. First, head to the [Discord Developer Portal](https://discord.com/developers/applications) and select your modmail bot application. Then go to "OAuth2" and "General"
-First, copy the Client ID and Client Secret. You will need these later when filling in the .env. +First, copy the Client ID and Client Secret. You will need these later when filling in the `.env`. Then, set a redirect URL to `https://yourlogviewer.com/callback`, with the url being changed to the url of your logviewer. Finally, click save.
@@ -65,12 +65,12 @@ pipenv install ## Configuring the .env -To configure the .env file, you can use the following command: +To configure the `.env` file, you can use the following command: ```bash -nano .env +nano .env.example ``` -This will copy the example .env file and open it in nano. You can then edit the file with your info. Besides the normal logviewer config, you will also need to add your bot's token and the client ID and secret you copied earlier. +This will open the example .env file in nano. You can then edit the file with your info. Besides the normal logviewer config, you will also need to add your bot's token and the client ID and secret you copied earlier. You will need to enter the same mongo URI as your bot uses. The rest of the configs can be left to the default values, unless you have a specific reason to change them. @@ -87,7 +87,7 @@ sudo pipenv run logviewer ## Whitelisting users To allow people to view the logviewer, you will have to whitelist them. To do this, you can use the following command in discord where your modmail bot is: -`oauth whitelist roleID` or `oauth whitelist userID`. +`?oauth whitelist roleID` or `?oauth whitelist userID`. ## (Optional) Keep logviewer running in the background with pm2 From 9a94c4c000f9241e930917bc28e85656c029fa37 Mon Sep 17 00:00:00 2001 From: Sebastian Kuipers Date: Mon, 10 Apr 2023 19:58:18 +0200 Subject: [PATCH 23/33] Fix small oversight --- installation/local-hosting-vps/logviewer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installation/local-hosting-vps/logviewer.md b/installation/local-hosting-vps/logviewer.md index aec51f4..2923b03 100644 --- a/installation/local-hosting-vps/logviewer.md +++ b/installation/local-hosting-vps/logviewer.md @@ -42,7 +42,7 @@ pipenv install To configure the .env file, you can use the following command: ```bash -nano .env +nano .env.example ``` This will open the example .env file in nano. You can then edit the file with your info. You will need to enter the same mongo URI as your bot uses. The rest of the configs can be left to the default values, unless you have a specific reason to change them. From d6f1b47af72b640f8c187dbfbf3fea83036d2a33 Mon Sep 17 00:00:00 2001 From: Sebastian Kuipers Date: Mon, 10 Apr 2023 19:59:04 +0200 Subject: [PATCH 24/33] Fix some additional formatting --- installation/local-hosting-vps/logviewer.md | 4 ++-- installation/local-hosting-vps/patreon_logviewer.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/installation/local-hosting-vps/logviewer.md b/installation/local-hosting-vps/logviewer.md index 2923b03..292d6af 100644 --- a/installation/local-hosting-vps/logviewer.md +++ b/installation/local-hosting-vps/logviewer.md @@ -39,12 +39,12 @@ pipenv install ## Configuring the .env -To configure the .env file, you can use the following command: +To configure the `.env` file, you can use the following command: ```bash nano .env.example ``` -This will open the example .env file in nano. You can then edit the file with your info. +This will open the example `.env` file in nano. You can then edit the file with your info. You will need to enter the same mongo URI as your bot uses. The rest of the configs can be left to the default values, unless you have a specific reason to change them. Then save the file and exit nano by pressing `ctrl + x`, then `y`, change the name from `.env.example` to `.env` and then `enter`. diff --git a/installation/local-hosting-vps/patreon_logviewer.md b/installation/local-hosting-vps/patreon_logviewer.md index 252b928..918c407 100644 --- a/installation/local-hosting-vps/patreon_logviewer.md +++ b/installation/local-hosting-vps/patreon_logviewer.md @@ -70,7 +70,7 @@ To configure the `.env` file, you can use the following command: ```bash nano .env.example ``` -This will open the example .env file in nano. You can then edit the file with your info. Besides the normal logviewer config, you will also need to add your bot's token and the client ID and secret you copied earlier. +This will open the example `.env` file in nano. You can then edit the file with your info. Besides the normal logviewer config, you will also need to add your bot's token and the client ID and secret you copied earlier. You will need to enter the same mongo URI as your bot uses. The rest of the configs can be left to the default values, unless you have a specific reason to change them. From 72a89d565899fc70f65079254dbb16ac55f07098 Mon Sep 17 00:00:00 2001 From: Raiden Date: Tue, 11 Apr 2023 07:51:44 +0000 Subject: [PATCH 25/33] GITBOOK-14: Add Alma Linux guide --- SUMMARY.md | 4 +- installation/local-hosting-vps/almalinux.md | 178 +++++++++++++++++++- installation/local-hosting-vps/debian.md | 14 +- installation/local-hosting-vps/fedora.md | 14 +- installation/local-hosting-vps/ubuntu.md | 10 +- 5 files changed, 196 insertions(+), 24 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index 6e2bb18..b48e37f 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -9,11 +9,11 @@ * [Ubuntu](installation/local-hosting-vps/ubuntu.md) * [Debian](installation/local-hosting-vps/debian.md) * [Fedora](installation/local-hosting-vps/fedora.md) - * [AlmaLinux](installation/local-hosting-vps/almalinux.md) + * [Alma Linux](installation/local-hosting-vps/almalinux.md) * [CentOS](installation/local-hosting-vps/centos.md) * [Raspberry Pi](installation/local-hosting-vps/raspberry-pi.md) * [Logviewer](installation/local-hosting-vps/logviewer.md) - * [Patreon logviewer](installation/local-hosting-vps/patreon_logviewer.md) + * [Patreon logviewer](installation/local-hosting-vps/patreon\_logviewer.md) * [Railway](installation/railway.md) * [Heroku](installation/heroku.md) * [Community Guides](installation/community-guides.md) diff --git a/installation/local-hosting-vps/almalinux.md b/installation/local-hosting-vps/almalinux.md index 0aff996..0f55be6 100644 --- a/installation/local-hosting-vps/almalinux.md +++ b/installation/local-hosting-vps/almalinux.md @@ -1,11 +1,183 @@ --- -description: Deploy Modmail on a AlmaLinux server. +description: Deploy Modmail on RHEL / Alma Linux server. --- -# AlmaLinux +# Alma Linux -TODO +Alma Linux 9 and Alma Linux 8 is based on Red Hat Enterprise Linux (RHEL) 8 and 9 respectively so you can follow this guide if you're running any of the OS mentioned above. ## Prerequisites +* Root access (**`sudo`**). +* Minimum 1GB of RAM +* At least 2GB available disk space. +* Supported releases: Alma Linux 9, Alma Linux 8. + +## Dependencies + +* Python 3.9 +* Tools: `git`, `nano` + +{% hint style="info" %} +All code blocks should be executed in bash and line by line unless specified otherwise. +{% endhint %} + +### Alma Linux 9 + +Alma Linux 9 have all required packages available in official repositories. Install them with `dnf`: + +```bash +sudo dnf -y install python39 git @development nano +``` + +### Alma Linux 8.4-8.x + +```bash +sudo dnf -y update +sudo dnf -y group install development +sudo dnf -y install python39 python39-pip python39-devel nano git +``` + +## Installing Bot + +In your home directory, clone and cd into the official Modmail repository with: + +```bash +cd ~ +git clone https://github.com/modmail-dev/modmail +cd modmail +``` + +Inside the Modmail folder, ensure `pip` is installed correctly and is defaulting to Python 3.9 with: + +```bash +python3.9 -m ensurepip --default-pip +``` + +And then, install `pipenv` and the bot dependencies with: + +```bash +pip3.9 install pipenv +pipenv install --python 3.9 +``` + +Create a file named `.env` with `nano` and paste all the environmental variables (secrets) needed to run the bot via right-clicking in the nano editor. Refer to the steps in the [parent Installation page](../#preparing-your-environmental-variables) to find where to obtain these. + +```bash +nano .env +``` + +
+ +After that, press `Ctrl+O` and `Enter` to save your changes. Exit the `nano` editor with `Ctrl+X`. + +{% hint style="info" %} +If using the `nano` editor is a bit of a learning curve, you can always FTP into your server using software like [WinSCP](https://winscp.net/eng/index.php) to edit the `.env` file manually with your preferred GUI-based editor like Notepad. +{% endhint %} + +After your `.env` file is ready, you can now go ahead and try running your bot with: + +```bash +pipenv run bot +``` + +If no error shows up, it means your bot is now running correctly. + +## Setting up auto-restart + +To have the bot auto-restart on crash or system reboot, we will be using `systemd` by making a service file for our bot. + +In order to create the service file, you will first need to know three things, your Linux `username`, your Modmail repository `path` and your `pipenv_path`. + +First, your Linux `username` can be fetched with the following command: + +```bash +whoami +``` + +If you have cloned the Modmail repo as a `root` user, your Modmail repo path should be: + +```bash +/root/modmail +``` + +Otherwise, your path should be: + +```bash +/home/$USER/modmail/ +``` + +You can get your `pipenv_path` with: + +``` +whereis pipenv +``` + +Now, using `nano`, create a service file for `systemd` with: + +```bash +sudo nano /etc/systemd/system/modmail.service +``` + +and paste in the contents below, replacing `username`, `modmail_path` and `pipenv_path` with yours respectively. `Ctrl+O` and `Enter` to save. `Ctrl+X` to exit the nano editor. + +{% code title="modmail.service" %} +```bash +[Unit] +Description=Modmail bot +After=network.target + +[Service] +User=username # replace this +Group=username # replace this +Restart=always +RestartSec=10 +Type=simple +WorkingDirectory=modmail_path # replace this +ExecStart=pipenv_path run python bot.py # replace pipenv_path only + +[Install] +WantedBy=multi-user.target +``` +{% endcode %} + +Now, start your Modmail bot with: + +```bash +sudo systemctl start modmail +``` + +If everything goes correctly, you should see your bot online. You can also view the logs of your systemd process with: + +```bash +sudo journalctl -eu modmail +``` + +With that said, go ahead and enable your Modmail service to auto-restart after crash and reboot with: + +```bash +sudo systemctl enable modmail +``` + +If in the future you need to stop and disable your Modmail service, you can do so with: + +```bash +sudo systemctl stop modmail +sudo systemctl disable modmai +``` + ## Updating + +Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. + +If for some reason your update command isn't working correctly, you can update your bot by going into your modmail folder and pulling the latest changes from GitHub like so: + +```bash +cd modmail && git pull +``` + +Be sure to restart your bot to apply the changes. If you followed the above instructions on setting up auto-restart, you can do so with: + +```bash +sudo systemctl restart modmail +``` diff --git a/installation/local-hosting-vps/debian.md b/installation/local-hosting-vps/debian.md index a5e361e..73d7c11 100644 --- a/installation/local-hosting-vps/debian.md +++ b/installation/local-hosting-vps/debian.md @@ -17,12 +17,12 @@ description: Deploy Modmail on a Debian server. * Tools: `git`, `wget`, `nano` * Additional Modmail requirements: `libcairo2-dev`, `libffi-dev`, `g++` -To install these dependencies, we will be using **`apt`**. - {% hint style="info" %} All code blocks should be executed in bash and line by line unless specified otherwise. {% endhint %} +To install these dependencies, we will be using **`apt`**. + ### **Debian 11 Bullseye** ```bash @@ -51,7 +51,7 @@ cd Python-3.10.9 sudo make altinstall ``` -After following this step, make sure to specify the version when running Python commands later in the guide. +After following this step, make sure to specify the version when running user-level Python commands later in the guide. For example: @@ -99,9 +99,9 @@ If no error shows up, it means your bot is now running correctly. ## Setting up auto-restart -To have the bot auto-restart on crash or system reboot, we will be using systemd by making a service file for our bot. +To have the bot auto-restart on crash or system reboot, we will be using `systemd` by making a service file for our bot. -In order to create the service file, you will first need to know three things, your Linux `username`, your Modmail repository `path` and your Pipenv `path`. +In order to create the service file, you will first need to know three things, your Linux `username`, your Modmail repository `path` and your `pipenv_path`. First, your Linux `username` can be fetched with the following command: @@ -121,7 +121,7 @@ Otherwise, your path should be: /home/$USER/modmail/ ``` -You can get your Pipenv `path` with: +You can get your `pipenv_path` with: ``` whereis pipenv @@ -161,7 +161,7 @@ Now, start your Modmail bot with: sudo systemctl start modmail ``` -If everything goes correctly, you should see your bot online. You can also view the logs of your systemd process with: +If everything goes correctly, you should see your bot online. You can also view the logs of your `systemd` process with: ```bash sudo journalctl -eu modmail diff --git a/installation/local-hosting-vps/fedora.md b/installation/local-hosting-vps/fedora.md index 87e5b01..506b370 100644 --- a/installation/local-hosting-vps/fedora.md +++ b/installation/local-hosting-vps/fedora.md @@ -9,7 +9,7 @@ description: Deploy Modmail on a Fedora server. * Root access (**`sudo`**). * Minimum 1GB of RAM * At least 2GB available disk space. -* Supported releases: Fedora 37, Fedora 36. +* Supported releases: Fedora 37, Fedora 36, Fedora 35. ## Dependencies @@ -17,12 +17,12 @@ description: Deploy Modmail on a Fedora server. * Tools: `git`, `wget`, `nano` * Additional Modmail requirements: `g++` -Fedora Linux 35 and above has all required packages available in official repositories. Install them with `dnf.` - {% hint style="info" %} All code blocks should be executed in bash and line by line unless specified otherwise. {% endhint %} +Fedora Linux 35 and above has all required packages available in official repositories. Install them with `dnf`. + ```bash sudo dnf -y install python39 git nano g++ gtk3 ``` @@ -74,9 +74,9 @@ If no error shows up, it means your bot is now running correctly. ## Setting up auto-restart -To have the bot auto-restart on crash or system reboot, we will be using systemd by making a service file for our bot. +To have the bot auto-restart on crash or system reboot, we will be using `systemd` by making a service file for our bot. -In order to create the service file, you will first need to know three things, your Linux `username`, your Modmail repository `path` and your Pipenv `path`. +In order to create the service file, you will first need to know three things, your Linux `username`, your Modmail repository `path` and your `pipenv_path`. First, your Linux `username` can be fetched with the following command: @@ -96,13 +96,13 @@ Otherwise, your path should be: /home/$USER/modmail/ ``` -You can get your Pipenv `path` with: +You can get your `pipenv_path` with: ``` whereis pipenv ``` -Now, using `nano`, create a service file for systemd with: +Now, using `nano`, create a service file for `systemd` with: ```bash sudo nano /etc/systemd/system/modmail.service diff --git a/installation/local-hosting-vps/ubuntu.md b/installation/local-hosting-vps/ubuntu.md index 44d3bf7..36cbe26 100644 --- a/installation/local-hosting-vps/ubuntu.md +++ b/installation/local-hosting-vps/ubuntu.md @@ -19,12 +19,12 @@ We will be using the following dependencies: * Tools: `git`, `wget`, `nano`, `software-properties-common` * Additional Modmail requirements: `libcairo2-dev`, `libffi-dev`, `g++` -To install these dependencies, we will be using **`apt`**. - {% hint style="info" %} All code blocks should be executed in bash and line by line unless specified otherwise. {% endhint %} +To install these dependencies, we will be using **`apt`**. + We recommend adding the `deadsnakes` ppa to install Python 3.10: ```bash @@ -62,7 +62,7 @@ cd Python-3.10.9 make altinstall ``` -After following this step, make sure to specify the version when running Python commands later in the guide. +After following this step, make sure to specify the version when running user-level Python commands later in the guide. For example: @@ -112,7 +112,7 @@ If no error shows up, it means your bot is now running correctly. ## Setting up auto-restart -To have the bot auto-restart on crash or system reboot, we will be using systemd by making a service file for our bot. +To have the bot auto-restart on crash or system reboot, we will be using `systemd` by making a service file for our bot. In order to create the service file, you will first need to know three things, your Linux `username`, your Modmail repository `path` and your Pipenv `path`. @@ -134,7 +134,7 @@ Otherwise, your path should be: /home/$USER/modmail/ ``` -You can get your Pipenv `path` with: +You can get your `pipenv_path` with: ``` whereis pipenv From ca3b54fb0e095b0dd8e0aa194def330fd842a4cf Mon Sep 17 00:00:00 2001 From: Raiden Date: Tue, 11 Apr 2023 08:23:02 +0000 Subject: [PATCH 26/33] GITBOOK-15: Minor tweaks and correction --- SUMMARY.md | 2 - installation/local-hosting-vps/README.md | 22 +- installation/local-hosting-vps/almalinux.md | 10 +- installation/local-hosting-vps/centos.md | 11 - installation/local-hosting-vps/debian.md | 10 +- .../local-hosting-vps/raspberry-pi.md | 11 - installation/local-hosting-vps/windows.md | 2 +- installation/railway.md | 2 +- usage-guide/configuration.md | 1789 +++++++++-------- 9 files changed, 943 insertions(+), 916 deletions(-) delete mode 100644 installation/local-hosting-vps/centos.md delete mode 100644 installation/local-hosting-vps/raspberry-pi.md diff --git a/SUMMARY.md b/SUMMARY.md index b48e37f..82bab4e 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -10,8 +10,6 @@ * [Debian](installation/local-hosting-vps/debian.md) * [Fedora](installation/local-hosting-vps/fedora.md) * [Alma Linux](installation/local-hosting-vps/almalinux.md) - * [CentOS](installation/local-hosting-vps/centos.md) - * [Raspberry Pi](installation/local-hosting-vps/raspberry-pi.md) * [Logviewer](installation/local-hosting-vps/logviewer.md) * [Patreon logviewer](installation/local-hosting-vps/patreon\_logviewer.md) * [Railway](installation/railway.md) diff --git a/installation/local-hosting-vps/README.md b/installation/local-hosting-vps/README.md index 8d15890..53f3941 100644 --- a/installation/local-hosting-vps/README.md +++ b/installation/local-hosting-vps/README.md @@ -14,19 +14,19 @@ More OS-specific requirements will be listed on their specific installation page ## Choose your Operating System -* [Windows](./windows.md) -* [MacOS](./macos.md) -* [Docker](./docker.md) -* [Ubuntu](./ubuntu.md) -* [Debian](./debian.md) -* [Fedora](./fedora.md) -* [AlmaLinux](./almalinux.md) -* [CentOS](./centos.md) -* [Raspberry Pi](./raspberry-pi.md) +* [Windows](windows.md) +* [MacOS](macos.md) +* [Docker](docker.md) +* [Ubuntu](ubuntu.md) +* [Debian](debian.md) +* [Fedora](fedora.md) +* [AlmaLinux](almalinux.md) +* [CentOS](almalinux.md) +* [Raspberry Pi OS](debian.md) ## Logviewer You can also self-host logviewer by following the guides below. -* [Logviewer](./logviewer.md) -* [Patreon logviewer](./patreon_logviewer.md) +* [Logviewer](logviewer.md) +* [Patreon logviewer](patreon\_logviewer.md) diff --git a/installation/local-hosting-vps/almalinux.md b/installation/local-hosting-vps/almalinux.md index 0f55be6..5e2adc8 100644 --- a/installation/local-hosting-vps/almalinux.md +++ b/installation/local-hosting-vps/almalinux.md @@ -1,17 +1,17 @@ --- -description: Deploy Modmail on RHEL / Alma Linux server. +description: Deploy Modmail on RHEL / Alma Linux / CentOS server. --- # Alma Linux -Alma Linux 9 and Alma Linux 8 is based on Red Hat Enterprise Linux (RHEL) 8 and 9 respectively so you can follow this guide if you're running any of the OS mentioned above. +Alma Linux 8, 9 and CentOS Stream 8, 9 are based on Red Hat Enterprise Linux (RHEL) 8 and 9 respectively so you can essentially follow this guide if you're running any of the OS mentioned above. ## Prerequisites * Root access (**`sudo`**). * Minimum 1GB of RAM * At least 2GB available disk space. -* Supported releases: Alma Linux 9, Alma Linux 8. +* Supported releases: Alma Linux 9, Alma Linux 8, CentOS Stream 9, CentOS Stream 8, RHEL 9 and RHEL 8 ## Dependencies @@ -22,7 +22,7 @@ Alma Linux 9 and Alma Linux 8 is based on Red Hat Enterprise Linux (RHEL) 8 and All code blocks should be executed in bash and line by line unless specified otherwise. {% endhint %} -### Alma Linux 9 +### RHEL 9 / Alma Linux 9 / CentOS Stream 9 Alma Linux 9 have all required packages available in official repositories. Install them with `dnf`: @@ -30,7 +30,7 @@ Alma Linux 9 have all required packages available in official repositories. Inst sudo dnf -y install python39 git @development nano ``` -### Alma Linux 8.4-8.x +### RHEL 8 / Alma Linux 8 / CentOS Stream 8.4-8.x ```bash sudo dnf -y update diff --git a/installation/local-hosting-vps/centos.md b/installation/local-hosting-vps/centos.md deleted file mode 100644 index d0b4321..0000000 --- a/installation/local-hosting-vps/centos.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -description: Deploy Modmail on a CentOS server. ---- - -# CentOS - -TODO - -## Prerequisites - -## Updating diff --git a/installation/local-hosting-vps/debian.md b/installation/local-hosting-vps/debian.md index 73d7c11..eb6e63c 100644 --- a/installation/local-hosting-vps/debian.md +++ b/installation/local-hosting-vps/debian.md @@ -1,15 +1,17 @@ --- -description: Deploy Modmail on a Debian server. +description: Deploy Modmail on Debian / Raspberry Pi OS. --- # Debian +Raspberry Pi OS 11 Bullseye and Raspberry Pi OS 10 Buster are based on Debian 11 Bullseye and Debian 10 Buster respectively so you can essentially follow this guide if you're running any of the OS mentioned above. + ## Prerequisites * Root access (**`sudo`**). * Minimum 1GB of RAM * At least 2GB available disk space. -* Supported releases: Debian 11 Bullseye, Debian 10 Buster. +* Supported releases: Debian 11 Bullseye, Debian 10 Buster, Raspberry Pi OS 11 Bullseye, and Raspberry Pi OS 10 (Legacy) Buster ## Dependencies @@ -23,7 +25,7 @@ All code blocks should be executed in bash and line by line unless specified oth To install these dependencies, we will be using **`apt`**. -### **Debian 11 Bullseye** +### **Debian 11 Bullseye /** Raspberry Pi OS 11 Bullseye ```bash sudo apt update @@ -32,7 +34,7 @@ sudo apt -y install python3 python3-dev python3-venv python3-pip libcairo2-dev l At the time of writing, this will install Python 3.9 from Debian's repository. -### **Debian 10 Buster** +### **Debian 10 Buster /** Raspberry Pi OS 10 Buster You will need to manually compile Python 3.10 from source. Compiling Python may take a while (est. 5-10 minutes). diff --git a/installation/local-hosting-vps/raspberry-pi.md b/installation/local-hosting-vps/raspberry-pi.md deleted file mode 100644 index d89f975..0000000 --- a/installation/local-hosting-vps/raspberry-pi.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -description: Deploy Modmail on a Raspberry Pi. ---- - -# Raspberry Pi - -TODO - -## Prerequisites - -## Updating diff --git a/installation/local-hosting-vps/windows.md b/installation/local-hosting-vps/windows.md index 59ad6c5..efb0eba 100644 --- a/installation/local-hosting-vps/windows.md +++ b/installation/local-hosting-vps/windows.md @@ -128,7 +128,7 @@ You can fill in these extra details as you see fit as it's only for your own ref You can also optionally specify a log file as output and error in the `I/O` tab, just be sure to create the file beforehand so you can select it in the GUI. -

Details on the "I/O" tab

+

Details on the "I/O" tab

And finally, click "Install Service" to install your Modmail bot as a service on your Windows system.\ diff --git a/installation/railway.md b/installation/railway.md index fb21bff..df5543c 100644 --- a/installation/railway.md +++ b/installation/railway.md @@ -123,7 +123,7 @@ Next, go to the **Deployments** tab, look at the latest deployment, is it succes
-
Screenshot of the deployments tab, and clicking the URL.

Navigate to the Deployments tab, save and open this URL.

+
Screenshot of the deployments tab, and clicking the URL.

Navigate to the Deployments tab, save and open this URL.

diff --git a/usage-guide/configuration.md b/usage-guide/configuration.md index 43f9f48..3af1bbe 100644 --- a/usage-guide/configuration.md +++ b/usage-guide/configuration.md @@ -2,1433 +2,1482 @@ description: Configuring and customizing modmail. --- -Modmail offers an assort of customizations to make your Modmail bot unique to your server. Most customizations can be set with `?config`, but some has its own special command, such as `?activity`. -You may find all of the personalizable tweaks available for Modmail below: +# Configuration -{% hint style="info" %} All examples presume your prefix is `?`.{% endhint %} +Modmail offers an assort of customizations to make your Modmail bot unique to your server. Most customizations can be set with `?config`, but some has its own special command, such as `?activity`. You may find all of the personalizable tweaks available for Modmail below: -{% hint style="warning" %} Things covered in brackets are optional: `[]` -Things covered in angled brackets are required: `<>` {% endhint %} +{% hint style="info" %} +All examples presume your prefix is \`?\`. +{% endhint %} + +{% hint style="warning" %} +Things covered in brackets are optional: \`\[]\` Things covered in angled brackets are required: \`<>\` +{% endhint %} **Quick Navigation:** -###### Moderation: -- [Prefix]() -- [Mention](./usage-guide/configuration#mention-mention) +**Moderation:** + +* [Prefix](configuration.md) +* [Mention](usage-guide/configuration/#mention-mention) -Moderation Configurations -====== +## Moderation Configurations -Account Age ( account_age ) ------- +### Account Age ( account\_age ) -***Default:*** No Age Threshold +_**Default:**_ No Age Threshold -Set an amount of time a users account has to be created in order to open a ticket. +Set an amount of time a users account has to be created in order to open a ticket. -***Example:*** +_**Example:**_ -- `?config set account_age P12DT3H` (stands for 12 days and 3 hours in [ISO-8601 Duration Format](https://en.wikipedia.org/wiki/ISO_8601#Durations)) -- `?config set account_age 3 days and 5 hours` (accepted readable time) +* `?config set account_age P12DT3H` (stands for 12 days and 3 hours in [ISO-8601 Duration Format](https://en.wikipedia.org/wiki/ISO\_8601#Durations)) +* `?config set account_age 3 days and 5 hours` (accepted readable time) -***Note(s):*** -- To remove this restriction, do ?config del account_age. -- See also: `guild_age`. +_**Note(s):**_ +* To remove this restriction, do ?config del account\_age. +* See also: `guild_age`. -Alert on Mention ( alert_on_mention ) ------- +### Alert on Mention ( alert\_on\_mention ) -***Default:*** No +_**Default:**_ No Mentions all mods (mention) in mention channel when bot is mentioned -***Example:*** +_**Example:**_ -- `?config set alert_on_mention yes` +* `?config set alert_on_mention yes` -***Notes:*** -- See also: `mention`, `mention_channel_id` +_**Notes:**_ +* See also: `mention`, `mention_channel_id` -Prefix ( prefix ) ------- +### Prefix ( prefix ) The prefix of the bot -***Default:*** `?` +_**Default:**_ `?` + +_**Example:**_ -***Example:*** -- `?config set prefix !` -- `?prefix !` +* `?config set prefix !` +* `?prefix !` This both result in commands now prefixed with !, for example: -{% hint style="success" %} !about {% endhint %} -***Notes:*** -- If you forgot the bot prefix, Modmail will always respond to its mention (ping). -- To reset the prefix back to default: `?config del prefix` +{% hint style="success" %} +!about +{% endhint %} + +_**Notes:**_ + +* If you forgot the bot prefix, Modmail will always respond to its mention (ping). +* To reset the prefix back to default: `?config del prefix` -Guild Age ( guild_age ) ------- +### Guild Age ( guild\_age ) -The join date of the recipient user into this server must be greater than the number of days, hours, minutes or any time-interval specified by this configuration. +The join date of the recipient user into this server must be greater than the number of days, hours, minutes or any time-interval specified by this configuration. -***Default:*** No age threshold +_**Default:**_ No age threshold -***Example:*** -- `?config set guild_age P12DT3H` (stands for 12 days and 3 hours in [ISO-8601 Duration Format](https://en.wikipedia.org/wiki/ISO_8601#Durations)) -- `?config set guild_age 3 days and 5 hours` (accepted readable time) +_**Example:**_ -***Notes:*** -- To remove this restriction, do `{prefix}config del guild_age`. -- See also: `account_age`. +* `?config set guild_age P12DT3H` (stands for 12 days and 3 hours in [ISO-8601 Duration Format](https://en.wikipedia.org/wiki/ISO\_8601#Durations)) +* `?config set guild_age 3 days and 5 hours` (accepted readable time) +_**Notes:**_ -Reply Without Command ( reply_without_command ) ------- +* To remove this restriction, do `{prefix}config del guild_age`. +* See also: `account_age`. -***Default:*** Disabled +### Reply Without Command ( reply\_without\_command ) + +_**Default:**_ Disabled Setting this configuration will make all non-command messages sent in the thread channel to be forwarded to the recipient without the need of `?reply`. -***Example:*** -- `?config set reply_without_command yes` -- `?config set reply_without_command no` +_**Example:**_ -***Notes:*** -- See also: `anon_reply_without_command`, `plain_reply_without_command`. +* `?config set reply_without_command yes` +* `?config set reply_without_command no` +_**Notes:**_ -Show Timestamps ( show_timestamp ) ------- +* See also: `anon_reply_without_command`, `plain_reply_without_command`. -***Default:*** Yes +### Show Timestamps ( show\_timestamp ) -Shows timestamps on thread embeds +_**Default:**_ Yes -***Example:*** +Shows timestamps on thread embeds -- `?config set show_timestamp no` +_**Example:**_ +* `?config set show_timestamp no` -Silent Alert On Commands ( silent_alert_on_mention ) ------- +### Silent Alert On Commands ( silent\_alert\_on\_mention ) Send a message in the mention channel without mentioning all mods (mention). -***Default:*** No +_**Default:**_ No -***Example:*** -- `?config set alert_on_mention yes` +_**Example:**_ -***Notes:*** -This has no effect unless `alert_on_mention` is set to yes. -See also: `mention`, `mention_channel_id` +* `?config set alert_on_mention yes` +_**Notes:**_ This has no effect unless `alert_on_mention` is set to yes. See also: `mention`, `mention_channel_id` -Update Channel ID ( update_channel_id ) ------- +### Update Channel ID ( update\_channel\_id ) This is the channel where update notifications are sent to. -***Default:*** Log Channel (normally `#bot-logs`) +_**Default:**_ Log Channel (normally `#bot-logs`) + +_**Example:**_ -***Example:*** -- `?config set update_channel_id 9234932582312` (9234932582312 is the channel ID)` +* `?config set update_channel_id 9234932582312` (9234932582312 is the channel ID)\` -***Notes:*** -- This has no effect unless `disable_autoupdates` is set to no and `update_notifications` is set to yes. -- See also: `log_channel_id` +_**Notes:**_ +* This has no effect unless `disable_autoupdates` is set to no and `update_notifications` is set to yes. +* See also: `log_channel_id` -Update Notifications ( update_notifications ) ------- +### Update Notifications ( update\_notifications ) This is the channel where update notifications are sent to. -***Default:*** Yes +_**Default:**_ Yes -***Example:*** -- `?config set update_notifications no` +_**Example:**_ -***Notes:*** -- This has no effect unless `disable_autoupdates` is set to no. -- See also: `update_channel_id` +* `?config set update_notifications no` +_**Notes:**_ -Fallback Category ID ( fallback_category_id ) ------- +* This has no effect unless `disable_autoupdates` is set to no. +* See also: `update_channel_id` + +### Fallback Category ID ( fallback\_category\_id ) This is the category that will hold the threads when the main category is full.\n\nTo change the Fallback category, you will need to find the [category’s ID](https://support.discordapp.com/hc/en-us/articles/206346498). -***Default:*** `Fallback Modmail` (created when the main category is full) +_**Default:**_ `Fallback Modmail` (created when the main category is full) + +_**Example:**_ -***Example:*** -- `?config set fallback_category_id 9234932582312` (`9234932582312` is the category ID) +* `?config set fallback_category_id 9234932582312` (`9234932582312` is the category ID) -***Notes:*** -- If the Fallback category ended up being non-existent/invalid, Modmail will create a new one. To fix this, set `fallback_category_id` to a valid category. -- See also: `main_category_id`. +_**Notes:**_ +* If the Fallback category ended up being non-existent/invalid, Modmail will create a new one. To fix this, set `fallback_category_id` to a valid category. +* See also: `main_category_id`. -Log Channel ID ( log_channel_id ) ------- +### Log Channel ID ( log\_channel\_id ) This is the channel where all log messages will be sent (ie. thread close message, update message, etc.).\n\nTo change the log channel, you will need to find the [channel’s ID](https://support.discordapp.com/hc/en-us/articles/206346498). The channel doesn’t necessary have to be under the `main_category`. -***Default:*** `#bot-logs` (created with `?setup`) +_**Default:**_ `#bot-logs` (created with `?setup`) + +_**Example:**_ + +* `?config set log_channel_id 9234932582312` (9234932582312 is the channel ID) -***Example:*** -- `?config set log_channel_id 9234932582312` (9234932582312 is the channel ID) +_**Notes:**_ -***Notes:*** -- If the Modmail logging channel ended up being non-existent/invalid, no logs will be sent. +* If the Modmail logging channel ended up being non-existent/invalid, no logs will be sent. -Main Category ID ( main_category_id ) ------- +### Main Category ID ( main\_category\_id ) This is the category where all new threads will be created.\n\nTo change the Modmail category, you will need to find the [category’s ID](https://support.discordapp.com/hc/en-us/articles/206346498). -***Default:*** `Modmail` (created with `?setup`) +_**Default:**_ `Modmail` (created with `?setup`) + +_**Example:**_ + +* `?config set main_category_id 9234932582312` (`9234932582312` is the category ID)\` + +_**Notes:**_ + +* If the Modmail category ended up being non-existent/invalid, Modmail will break. To fix this, run `?setup` again or set `main_category_id` to a valid category. +* When the Modmail category is full, new channels will be created in the fallback category. +* See also: `fallback_category_id` -***Example:*** -- `?config set main_category_id 9234932582312` (`9234932582312` is the category ID)` +### Mod Typing ( mod\_typing ) -***Notes:*** -- If the Modmail category ended up being non-existent/invalid, Modmail will break. To fix this, run `?setup` again or set `main_category_id` to a valid category. -- When the Modmail category is full, new channels will be created in the fallback category. -- See also: `fallback_category_id` +When this is set to `yes`, whenever a moderator starts to type in the thread channel, the recipient user will see "{bot.user.display\_name} is typing…" in their DM channel. -Mod Typing ( mod_typing ) ------- +_**Default:**_ Disabled -When this is set to `yes`, whenever a moderator starts to type in the thread channel, the recipient user will see \"{bot.user.display_name} is typing…\" in their DM channel. +_**Example:**_ -***Default:*** Disabled +* `?config set mod_typing yes` +* `?config set mod_typing no` -***Example:*** -- `?config set mod_typing yes` -- `?config set mod_typing no` +_**Notes:**_ -***Notes:*** -- See also: `mod_typing` +* See also: `mod_typing` -User Typing ( user_typing ) ------- +### User Typing ( user\_typing ) -When this is set to `yes`, whenever the recipient user starts to type in their DM channel, the moderator will see “{bot.user.display_name} is typing…” in the thread channel. +When this is set to `yes`, whenever the recipient user starts to type in their DM channel, the moderator will see “{bot.user.display\_name} is typing…” in the thread channel. -***Default:*** Enabled +_**Default:**_ Enabled -***Example:*** -- `?config set user_typing yes` -- `?config set user_typing no` +_**Example:**_ -***Notes:*** -- See also: `mod_typing`. +* `?config set user_typing yes` +* `?config set user_typing no` -Twitch URL ( twitch_url ) ------- +_**Notes:**_ -This channel dictates the linked Twitch channel when the activity is set to \"Streaming\". +* See also: `mod_typing`. -***Default:*** `https://www.twitch.tv/discordmodmail/` +### Twitch URL ( twitch\_url ) -***Example:*** -- `?config set twitch_url https://www.twitch.tv/yourchannelname/` +This channel dictates the linked Twitch channel when the activity is set to "Streaming". -***Notes:*** -- This has no effect when the activity is not set to \"Streaming\". -- See also: `?help activity` +_**Default:**_ `https://www.twitch.tv/discordmodmail/` -Close On Leave ( close_on_leave ) ------- +_**Example:**_ + +* `?config set twitch_url https://www.twitch.tv/yourchannelname/` + +_**Notes:**_ + +* This has no effect when the activity is not set to "Streaming". +* See also: `?help activity` + +### Close On Leave ( close\_on\_leave ) Closes a modmail thread upon user leave automatically -***Default:*** No +_**Default:**_ No -***Example:*** -- `?config set close_on_leave yes` +_**Example:**_ -***Notes:*** -- See also: `close_on_leave_reason`. +* `?config set close_on_leave yes` -Confirm Thread Creation ( confirm_thread_creation ) ------- +_**Notes:**_ + +* See also: `close_on_leave_reason`. + +### Confirm Thread Creation ( confirm\_thread\_creation ) Ensure users confirm that they want to create a new thread -***Default:*** No +_**Default:**_ No + +_**Example:**_ + +* `?config set confirm_thread_creation yes` -***Example:*** -- `?config set confirm_thread_creation yes` +_**Notes:**_ -***Notes:*** -- See also: `confirm_thread_creation_title`, `confirm_thread_response`, `confirm_thread_creation_accept`, `confirm_thread_creation_deny` +* See also: `confirm_thread_creation_title`, `confirm_thread_response`, `confirm_thread_creation_accept`, `confirm_thread_creation_deny` -Mention ( mention ) ------- +### Mention ( mention ) This is the message above user information for when a new thread is created in the channel. -***Default:*** `@here` +_**Default:**_ `@here` -***Example:*** -- `?config set mention Yo~ Here's a new thread for ya!` -- `?mention Yo~ Here's a new thread for ya!` +_**Example:**_ -***Notes:*** -- To disable mention, use command `?mention disable`. -- See also: `?help mention`. +* `?config set mention Yo~ Here's a new thread for ya!` +* `?mention Yo~ Here's a new thread for ya!` -Require Close Reason ( require_close_reason ) ------- +_**Notes:**_ + +* To disable mention, use command `?mention disable`. +* See also: `?help mention`. + +### Require Close Reason ( require\_close\_reason ) Require a reason to close threads. -***Default:*** No +_**Default:**_ No -***Example:*** -- `?config set require_close_reason yes` +_**Example:**_ +* `?config set require_close_reason yes` -Thread Auto Close ( thread_auto_close ) ------- +### Thread Auto Close ( thread\_auto\_close ) Setting this configuration will close threads automatically after the number of days, hours, minutes or any time-interval specified by this configuration. -***Default:*** Never +_**Default:**_ Never + +_**Example:**_ + +* `?config set thread_auto_close P12DT3H` (stands for 12 days and 3 hours in [ISO-8601 Duration Format](https://en.wikipedia.org/wiki/ISO\_8601#Durations)) +* `?config set thread_auto_close 3 days and 5 hours` (accepted readable time) -***Example:*** -- `?config set thread_auto_close P12DT3H` (stands for 12 days and 3 hours in [ISO-8601 Duration Format](https://en.wikipedia.org/wiki/ISO_8601#Durations)) -- `?config set thread_auto_close 3 days and 5 hours` (accepted readable time) +_**Notes:**_ -***Notes:*** -- To disable auto close, do `?config del thread_auto_close`. -- To prevent a thread from auto-closing, do `?close cancel`. -- See also: `thread_auto_close_silently`, `thread_auto_close_response`. +* To disable auto close, do `?config del thread_auto_close`. +* To prevent a thread from auto-closing, do `?close cancel`. +* See also: `thread_auto_close_silently`, `thread_auto_close_response`. -Thread Cooldown ( thread_cooldown ) ------- +### Thread Cooldown ( thread\_cooldown ) Specify the time required for the recipient to wait before allowed to create a new thread. -***Default:*** Never +_**Default:**_ Never -***Example:*** -- `?config set thread_cooldown P12DT3H` (stands for 12 days and 3 hours in [ISO-8601 Duration Format](https://en.wikipedia.org/wiki/ISO_8601#Durations)) -- `?config set thread_cooldown 3 days and 5 hours` (accepted readable time) +_**Example:**_ -***Notes:*** -- To disable thread cooldown, do `?config del thread_cooldown`. +* `?config set thread_cooldown P12DT3H` (stands for 12 days and 3 hours in [ISO-8601 Duration Format](https://en.wikipedia.org/wiki/ISO\_8601#Durations)) +* `?config set thread_cooldown 3 days and 5 hours` (accepted readable time) +_**Notes:**_ -Thread Move Notify ( thread_move_notify ) ------- +* To disable thread cooldown, do `?config del thread_cooldown`. + +### Thread Move Notify ( thread\_move\_notify ) Notify the recipient if the thread was moved. -***Default:*** No +_**Default:**_ No + +_**Example:**_ -***Example:*** -- `?config set thread_move_notify yes` -- `?config set thread_move_notify no` +* `?config set thread_move_notify yes` +* `?config set thread_move_notify no` -***Notes:*** -- See also: `thread_move_title`, `thread_move_response`, `thread_move_notify_mods`. +_**Notes:**_ -Thread Move Notify Mods ( thread_move_notify_mods ) ------- +* See also: `thread_move_title`, `thread_move_response`, `thread_move_notify_mods`. + +### Thread Move Notify Mods ( thread\_move\_notify\_mods ) Notify mods again after the thread is moved -***Default:*** No +_**Default:**_ No + +_**Example:**_ -***Example:*** -- `?config set thread_move_notify_mods yes` -- `?config set thread_move_notify_mods no` +* `?config set thread_move_notify_mods yes` +* `?config set thread_move_notify_mods no` -***Notes:*** -- See also: `thread_move_title`, `thread_move_response`, `thread_move_notify`. +_**Notes:**_ -Use Regex Autotrigger ( use_regex_autotrigger ) ------- +* See also: `thread_move_title`, `thread_move_response`, `thread_move_notify`. + +### Use Regex Autotrigger ( use\_regex\_autotrigger ) Whether to use regex to compare in autotriggers. -***Default:*** No +_**Default:**_ No + +_**Example:**_ -***Example:*** -- `?config set use_regex_autotrigger yes` +* `?config set use_regex_autotrigger yes` -***Notes:*** +_**Notes:**_ -{% hint style="danger" %} This is meant for advanced user that understand regular expressions. {% endhint %} +{% hint style="danger" %} +This is meant for advanced user that understand regular expressions. +{% endhint %} -- You can test it out with https://regexr.com on `PCRE (Server)` mode -- See command: `autotrigger` +* You can test it out with https://regexr.com on `PCRE (Server)` mode +* See command: `autotrigger` -Plain Reply Without Command ( plain_reply_without_command ) ------- +### Plain Reply Without Command ( plain\_reply\_without\_command ) Setting this configuration will make all non-command messages sent in the thread channel to be forwarded to the recipient in a plain form without the need of `?reply`. -***Default:*** Disabled +_**Default:**_ Disabled + +_**Example:**_ -***Example:*** -- `?config set plain_reply_without_command yes` -- `?config set plain_reply_without_command no` +* `?config set plain_reply_without_command yes` +* `?config set plain_reply_without_command no` -***Notes:*** -- See also: `reply_without_command`, `anon_reply_without_command`. +_**Notes:**_ -Anonymous Snippets ( anonymous_snippets ) ------- +* See also: `reply_without_command`, `anon_reply_without_command`. + +### Anonymous Snippets ( anonymous\_snippets ) Sends snippets anonymously. -***Default:*** No +_**Default:**_ No + +_**Example:**_ -***Example:*** -- `?config set anonymous_snippets yes` +* `?config set anonymous_snippets yes` -***Notes:*** -- See also: `anon_avatar_url`, `anon_tag`, `plain_snippets`. +_**Notes:**_ -Appearance Configurations -====== +* See also: `anon_avatar_url`, `anon_tag`, `plain_snippets`. -Blocked Emoji ( blocked_emoji ) ------- +## Appearance Configurations + +### Blocked Emoji ( blocked\_emoji ) This is the emoji added to the message when when a Modmail action is invoked unsuccessfully (ie. DM Modmail when blocked, failed to reply, etc.). -***Default:*** 🚫 +_**Default:**_ 🚫 + +_**Example:**_ -***Example:*** -- `?config set blocked_emoji 🙅‍` +* `?config set blocked_emoji 🙅‍` -***Notes:*** -- You can disable `blocked_emoji` with `?config set blocked_emoji disable`. -- Custom/animated emojis are also supported, however, the emoji must be added to the server. -- See also: `sent_emoji`. +_**Notes:**_ -Close Emoji ( close_emoji ) ------- +* You can disable `blocked_emoji` with `?config set blocked_emoji disable`. +* Custom/animated emojis are also supported, however, the emoji must be added to the server. +* See also: `sent_emoji`. + +### Close Emoji ( close\_emoji ) This is the emoji the recipient can click to close a thread themselves. The emoji is automatically added to the `thread_creation_response` embed. -***Default:*** 🔒 +_**Default:**_ 🔒 + +_**Example:**_ + +* `?config set close_emoji 👍‍` + +_**Notes:**_ + +* This will only have an effect when `recipient_thread_close` is enabled. +* See also: `recipient_thread_close`. + +### Confirm Thread Creation Accept ( confirm\_thread\_creation\_accept ) + +Emoji to accept thread creation + +_**Default:**_ \u2705 + +_**Example:**_ + +* `?config set confirm_thread_creation_accept \u2611` -***Example:*** -- `?config set close_emoji 👍‍` +_**Notes:**_ -***Notes:*** -- This will only have an effect when `recipient_thread_close` is enabled. -- See also: `recipient_thread_close`. +* This has no effect unless `confirm_thread_creation` is set +* See also: `confirm_thread_creation`, `confirm_thread_creation_title`, `confirm_thread_response`, `confirm_thread_creation_deny` -Confirm Thread Creation Accept ( confirm_thread_creation_accept ) ------- +### Confirm Thread Creation Deny ( confirm\_thread\_creation\_deny ) -Emoji to accept thread creation +Emoji to cancel thread creation -***Default:*** \u2705 +_**Default:**_ \uD83D\uDEAB -***Example:*** -- `?config set confirm_thread_creation_accept \u2611` +_**Example:**_ -***Notes:*** -- This has no effect unless `confirm_thread_creation` is set -- See also: `confirm_thread_creation`, `confirm_thread_creation_title`, `confirm_thread_response`, `confirm_thread_creation_deny` +* `?config set confirm_thread_creation_deny \u26D4` -Confirm Thread Creation Deny ( confirm_thread_creation_deny ) ------- +_**Notes:**_ -Emoji to cancel thread creation +* This has no effect unless `confirm_thread_creation` is set +* See also: `confirm_thread_creation`, `confirm_thread_creation_title`, `confirm_thread_response`, `confirm_thread_creation_accept` -***Default:*** \uD83D\uDEAB +### Error Color ( error\_color ) -***Example:*** -- `?config set confirm_thread_creation_deny \u26D4` +This is the color for Modmail when anything goes wrong, unsuccessful commands, or a stern warning. -***Notes:*** -- This has no effect unless `confirm_thread_creation` is set -- See also: `confirm_thread_creation`, `confirm_thread_creation_title`, `confirm_thread_response`, `confirm_thread_creation_accept` +_**Default:**_ Discord Red [#E74C3C](https://placehold.it/100/e74c3c?text=+) -Error Color ( error_color ) ------- +_**Example:**_ -This is the color for Modmail when anything goes wrong, unsuccessful commands, or a stern warning. +* `?config set error_color ocean blue` +* `?config set error_color ff1242` +* `?config set error_color #ff1242` +* `?config set error_color fa1` -***Default:*** Discord Red [#E74C3C](https://placehold.it/100/e74c3c?text=+) +_**Notes:**_ -***Example:*** -- `?config set error_color ocean blue` -- `?config set error_color ff1242` -- `?config set error_color #ff1242` -- `?config set error_color fa1` +* Available color names can be found on [Color Options](https://docs.modmail.dev/old-docs/color-names). +* See also: `main_color`, `mod_color`, `recipient_color`. -***Notes:*** -- Available color names can be found on [Color Options](https://docs.modmail.dev/old-docs/color-names). -- See also: `main_color`, `mod_color`, `recipient_color`. +### Main Color ( main\_color ) +This is the main color for Modmail (help/about/ping embed messages, subscribe, move, etc.). -Main Color ( main_color ) ------- +_**Default:**_ Discord Blurple [#7289DA](https://placehold.it/100/7289da?text=+) -This is the main color for Modmail (help/about/ping embed messages, subscribe, move, etc.). +_**Example:**_ -***Default:*** Discord Blurple [#7289DA](https://placehold.it/100/7289da?text=+) +* `?config set main_color olive green` +* `?config set main_color 12de3a` +* `?config set main_color #12de3a` +* `?config set main_color fff` -***Example:*** -- `?config set main_color olive green` -- `?config set main_color 12de3a` -- `?config set main_color #12de3a` -- `?config set main_color fff` +_**Notes:**_ -***Notes:*** -- Available color names can be found on [Color Options](https://docs.modmail.dev/old-docs/color-names). -- See also: `error_color`, `mod_color`, `recipient_color`. +* Available color names can be found on [Color Options](https://docs.modmail.dev/old-docs/color-names). +* See also: `error_color`, `mod_color`, `recipient_color`. +### Mod Color ( mod\_color ) -Mod Color ( mod_color ) ------- +This is the color of the messages sent by the moderators, this applies to messages within in the thread channel and the DM thread messages received by the recipient. -This is the color of the messages sent by the moderators, this applies to messages within in the thread channel and the DM thread messages received by the recipient. +_**Default:**_ Discord Green [#2ECC71](https://placehold.it/100/2ecc71?text=+) -***Default:*** Discord Green [#2ECC71](https://placehold.it/100/2ecc71?text=+) +_**Example:**_ -***Example:*** -- `?config set mod_color dark beige` -- `?config set mod_color cb7723` -- `?config set mod_color #cb7723` -- `?config set mod_color c4k` +* `?config set mod_color dark beige` +* `?config set mod_color cb7723` +* `?config set mod_color #cb7723` +* `?config set mod_color c4k` -***Notes:*** -- Available color names can be found on [Color Options](https://docs.modmail.dev/old-docs/color-names). -- See also: `recipient_color`, `main_color`, `error_color`. +_**Notes:**_ -React To Contact Emoji ( react_to_contact_emoji ) ------- +* Available color names can be found on [Color Options](https://docs.modmail.dev/old-docs/color-names). +* See also: `recipient_color`, `main_color`, `error_color`. -An emoji which is tracked in `react_to_contact_message` +### React To Contact Emoji ( react\_to\_contact\_emoji ) -***Default:*** \u2705 +An emoji which is tracked in `react_to_contact_message` -***Example:*** -- `?config set react_to_contact_emoji \u2705` +_**Default:**_ \u2705 -***Notes:*** -- See also: `react_to_contact_message \u2705` +_**Example:**_ -Recipient Color ( recipient_color ) ------- +* `?config set react_to_contact_emoji \u2705` + +_**Notes:**_ + +* See also: `react_to_contact_message \u2705` + +### Recipient Color ( recipient\_color ) This is the color of the messages sent by the recipient, this applies to messages received in the thread channel. -***Default:*** "Discord Gold [#F1C40F](https://placehold.it/100/f1c40f?text=+) +_**Default:**_ "Discord Gold [#F1C40F](https://placehold.it/100/f1c40f?text=+) + +_**Example:**_ -***Example:*** -- `?config set recipient_color dark beige` -- `?config set recipient_color cb7723` -- `?config set recipient_color #cb7723` -- `?config set recipient_color c4k` +* `?config set recipient_color dark beige` +* `?config set recipient_color cb7723` +* `?config set recipient_color #cb7723` +* `?config set recipient_color c4k` -***Notes:*** -- Available color names can be found on [Color Options](https://docs.modmail.dev/old-docs/color-names). -- See also: `mod_color`, `main_color`, `error_color`. +_**Notes:**_ -Sent Emoji ( sent_emoji ) ------- +* Available color names can be found on [Color Options](https://docs.modmail.dev/old-docs/color-names). +* See also: `mod_color`, `main_color`, `error_color`. + +### Sent Emoji ( sent\_emoji ) This is the emoji added to the message when when a Modmail action is invoked successfully (ie. DM Modmail, edit message, etc.). -***Default:*** ✅ +_**Default:**_ ✅ + +_**Example:**_ -***Example:*** -- `?config set sent_emoji ✨` +* `?config set sent_emoji ✨` -***Notes:*** -- You can disable `sent_emoji` with `?config set sent_emoji disable`. -- Custom/animated emojis are also supported, however, the emoji must be added to the server. -- See also: `blocked_emoji`. +_**Notes:**_ -Show Log URL Button ( show_log_url_button ) ------- +* You can disable `sent_emoji` with `?config set sent_emoji disable`. +* Custom/animated emojis are also supported, however, the emoji must be added to the server. +* See also: `blocked_emoji`. + +### Show Log URL Button ( show\_log\_url\_button ) Shows the button to open the Log URL. -***Default:*** No +_**Default:**_ No + +_**Example:**_ + +* `?config set show_log_url_button yes` + +## Thread Appearance + +### Use Random Channel Name ( use\_random\_channel\_name ) + +When this is set to `yes`, new thread channels will be named with random characters tied to their user ID. + +_**Default:**_ No + +_**Example:**_ + +* `?config set use_random_channel_name yes` +* `?config set use_random_channel_name no` + +_**Notes:**_ -***Example:*** -- `?config set show_log_url_button yes` +{% hint style="warning" %} +This config is suitable for servers in Server Discovery to comply with channel name restrictions. +{% endhint %} -Thread Appearance -====== +{% hint style="danger" %} +This cannot be applied with \`use\_timestamp\_channel\_name\`, \`use\_nickname\_channel\_name\`, or \`use\_user\_id\_channel\_name\`. +{% endhint %} -Use Random Channel Name ( use_random_channel_name ) ------- +* See also: `use_timestamp_channel_name`, `use_user_id_channel_name`, `use_nickname_channel_name`. -When this is set to `yes`, new thread channels will be named with random characters tied to their user ID. +### Use Timestamp Channel Name ( use\_timestamp\_channel\_name ) -***Default:*** No +When this is set to `yes`, new thread channels will be named with the recipient's account creation date instead of the recipient's name. -***Example:*** -- `?config set use_random_channel_name yes` -- `?config set use_random_channel_name no` +_**Default:**_ No -***Notes:*** -{% hint style="warning" %} This config is suitable for servers in Server Discovery to comply with channel name restrictions. {% endhint %} -{% hint style="danger" %} This cannot be applied with `use_timestamp_channel_name`, `use_nickname_channel_name`, or `use_user_id_channel_name`. {% endhint %} -- See also: `use_timestamp_channel_name`, `use_user_id_channel_name`, `use_nickname_channel_name`. +_**Example:**_ -Use Timestamp Channel Name ( use_timestamp_channel_name ) ------- +* `?config set use_timestamp_channel_name yes` +* `?config set use_timestamp_channel_name no` -When this is set to `yes`, new thread channels will be named with the recipient's account creation date instead of the recipient's name. +_**Notes:**_ -***Default:*** No +{% hint style="warning" %} +This config is \*\*NOT\*\* suitable for servers in Server Discovery to comply with channel name restrictions. +{% endhint %} -***Example:*** -- `?config set use_timestamp_channel_name yes` -- `?config set use_timestamp_channel_name no` +{% hint style="danger" %} +This cannot be applied with \`use\_user\_id\_channel\_name\`, \`use\_random\_channel\_name\` or \`use\_nickname\_channel\_name\`. +{% endhint %} -***Notes:*** -{% hint style="warning" %} This config is **NOT** suitable for servers in Server Discovery to comply with channel name restrictions. {% endhint %} -{% hint style="danger" %} This cannot be applied with `use_user_id_channel_name`, `use_random_channel_name` or `use_nickname_channel_name`. {% endhint %} -- See also: `use_user_id_channel_name`, `use_nickname_channel_name`, `use_random_channel_name`. +* See also: `use_user_id_channel_name`, `use_nickname_channel_name`, `use_random_channel_name`. -Use User ID Channel Name ( use_user_id_channel_name ) ------- +### Use User ID Channel Name ( use\_user\_id\_channel\_name ) -When this is set to `yes`, new thread channels will be named with the recipient's ID instead of the recipient's name. +When this is set to `yes`, new thread channels will be named with the recipient's ID instead of the recipient's name. -***Default:*** No +_**Default:**_ No -***Example:*** -- `?config set use_user_id_channel_name yes` -- `?config set use_user_id_channel_name no` +_**Example:**_ -***Notes:*** -{% hint style="warning" %} This config is suitable for servers in Server Discovery to comply with channel name restrictions. {% endhint %} -{% hint style="danger" %} This cannot be applied with `use_timestamp_channel_name`, `use_random_channel_name` or `use_nickname_channel_name`. {% endhint %} -- See also: `use_timestamp_channel_name`, `use_nickname_channel_name`, `use_random_channel_name`. +* `?config set use_user_id_channel_name yes` +* `?config set use_user_id_channel_name no` -Use Nickname Channel Name ( use_nickname_channel_name ) ------- +_**Notes:**_ -When this is set to `yes`, new thread channels will be named with the recipient's nickname instead of the recipient's name. +{% hint style="warning" %} +This config is suitable for servers in Server Discovery to comply with channel name restrictions. +{% endhint %} -***Default:*** +{% hint style="danger" %} +This cannot be applied with \`use\_timestamp\_channel\_name\`, \`use\_random\_channel\_name\` or \`use\_nickname\_channel\_name\`. +{% endhint %} -***Example:*** -- `?config set use_nickname_channel_name yes` -- `?config set use_nickname_channel_name no` +* See also: `use_timestamp_channel_name`, `use_nickname_channel_name`, `use_random_channel_name`. -***Notes:*** -{% hint style="warning" %} This config is suitable for servers in Server Discovery to comply with channel name restrictions. {% endhint %} -{% hint style="danger" %} This cannot be applied with `use_timestamp_channel_name`, `use_random_channel_name` or `use_user_id_channel_name`. {% endhint %} -- See also: `use_timestamp_channel_name`, `use_user_id_channel_name`, `use_random_channel_name`. +### Use Nickname Channel Name ( use\_nickname\_channel\_name ) -Use Hoisted Top Role ( use_hoisted_top_role ) ------- +When this is set to `yes`, new thread channels will be named with the recipient's nickname instead of the recipient's name. -Controls if only hoisted roles are evaluated when finding top role. +_**Default:**_ -***Default:*** Yes +_**Example:**_ -***Example:*** -- `?config set use_hoisted_top_role yes` -- `?config set use_hoisted_top_role no` +* `?config set use_nickname_channel_name yes` +* `?config set use_nickname_channel_name no` -***Notes:*** -- Top role is displayed in embeds when replying or adding/removing users to a thread in the case mod_tag and anon_username are not set. -- If this configuration is enabled, only roles that are hoisted (displayed seperately in member list) will be used. If a user has no hoisted roles, it will return 'None'. -- If you would like to display the top role of a user regardless of if it's hoisted or not, disable `use_hoisted_top_role`. +_**Notes:**_ -Thread Show Account Age ( thread_show_account_age ) ------- +{% hint style="warning" %} +This config is suitable for servers in Server Discovery to comply with channel name restrictions. +{% endhint %} -Shows account age on first message sent in thread channels to mods +{% hint style="danger" %} +This cannot be applied with \`use\_timestamp\_channel\_name\`, \`use\_random\_channel\_name\` or \`use\_user\_id\_channel\_name\`. +{% endhint %} -***Default:*** Yes +* See also: `use_timestamp_channel_name`, `use_user_id_channel_name`, `use_random_channel_name`. -***Example:*** -- `?config set thread_show_account_age no` +### Use Hoisted Top Role ( use\_hoisted\_top\_role ) -***Notes:*** -- See also: `thread_show_roles`, `thread_show_join_age` +Controls if only hoisted roles are evaluated when finding top role. +_**Default:**_ Yes -Thread Show Join Age ( thread_show_join_age ) ------- +_**Example:**_ -Shows join age on first message sent in thread channels to mods +* `?config set use_hoisted_top_role yes` +* `?config set use_hoisted_top_role no` -***Default:*** Yes +_**Notes:**_ -***Example:*** -- `?configconfig set thread_show_join_age no` +* Top role is displayed in embeds when replying or adding/removing users to a thread in the case mod\_tag and anon\_username are not set. +* If this configuration is enabled, only roles that are hoisted (displayed seperately in member list) will be used. If a user has no hoisted roles, it will return 'None'. +* If you would like to display the top role of a user regardless of if it's hoisted or not, disable `use_hoisted_top_role`. -***Notes:*** -- See also: `thread_show_account_age`, `thread_show_roles`. +### Thread Show Account Age ( thread\_show\_account\_age ) +Shows account age on first message sent in thread channels to mods -Thread Show Roles ( thread_show_roles ) ------- +_**Default:**_ Yes -Shows roles on first message sent in thread channels to mods +_**Example:**_ -***Default:*** Yes +* `?config set thread_show_account_age no` -***Example:*** -- `?config set thread_show_account_age no` +_**Notes:**_ -***Notes:*** -- See also: `thread_show_roles`, `thread_show_join_age`. +* See also: `thread_show_roles`, `thread_show_join_age` +### Thread Show Join Age ( thread\_show\_join\_age ) -Mod Tag ( mod_tag ) ------- +Shows join age on first message sent in thread channels to mods -This is the name tag in the “footer” section of the embeds sent by moderators in the recipient DM and thread channel. +_**Default:**_ Yes -***Default:*** The moderator's highest role +_**Example:**_ -***Example:*** -- `?config set mod_tag Moderator` +* `?configconfig set thread_show_join_age no` -***Notes:*** -{% hint style="warning" %} When the message is sent anonymously, `anon_tag` is used instead. {% endhint %} -- See also: `anon_tag`. +_**Notes:**_ -Anon Tag ( anon_tag ) ------- +* See also: `thread_show_account_age`, `thread_show_roles`. -This is the name tag in the “footer” section of the embeds sent by anonymous moderators in the recipient DM. +### Thread Show Roles ( thread\_show\_roles ) -***Default:*** \"Response\" +Shows roles on first message sent in thread channels to mods -***Example:*** -- `?config set anon_tag Support Agent` +_**Default:**_ Yes -***Notes:*** -- See also: `anon_avatar_url`, `anon_username`, `mod_tag`. +_**Example:**_ -Anon Avatar URL ( anon_avatar_url ) ------- +* `?config set thread_show_account_age no` -This is the avatar of the embeds sent by anonymous moderators in the recipient DM. +_**Notes:**_ -***Default:*** Server avatar +* See also: `thread_show_roles`, `thread_show_join_age`. -***Example:*** -- `?config set anon_avatar_url https://path.to/your/avatar.png` (you will need to upload the avatar to somewhere) +### Mod Tag ( mod\_tag ) -***Notes:*** -- See also: `anon_username`, `anon_tag`. +This is the name tag in the “footer” section of the embeds sent by moderators in the recipient DM and thread channel. +_**Default:**_ The moderator's highest role -Anon Username ( anon_username ) ------- +_**Example:**_ -This is the name in the “author” section of the embeds sent by anonymous moderators in the recipient DM. +* `?config set mod_tag Moderator` -***Default:*** Fallback on `mod_tag` +_**Notes:**_ -***Example:*** -- `?config set anon_username Incognito Mod` +{% hint style="warning" %} +When the message is sent anonymously, \`anon\_tag\` is used instead. +{% endhint %} -***Notes:*** -- See also: `anon_avatar_url`, `anon_tag`. +* See also: `anon_tag`. +### Anon Tag ( anon\_tag ) -Transfer Reactions ( transfer_reactions ) ------- +This is the name tag in the “footer” section of the embeds sent by anonymous moderators in the recipient DM. -Transfer users reactions to mods and vice versa -*(If someone reacts to a thread message the other party will see it.)* +_**Default:**_ "Response" -***Default:*** Yes +_**Example:**_ -***Example:*** -- `?config set transfer_reactions no` +* `?config set anon_tag Support Agent` +_**Notes:**_ -Thread Responses -====== +* See also: `anon_avatar_url`, `anon_username`, `mod_tag`. -Close On Leave Reason ( close_on_leave_reason ) ------- +### Anon Avatar URL ( anon\_avatar\_url ) -Reason for closing the thread once member leaves +This is the avatar of the embeds sent by anonymous moderators in the recipient DM. -***Default:*** The recipient has left the server. +_**Default:**_ Server avatar -***Example:*** -- `?config set close_on_leave_reason Member left` +_**Example:**_ -***Notes:*** -- This has no effect unless `close_on_leave` is set. -- See also: `close_on_leave`. +* `?config set anon_avatar_url https://path.to/your/avatar.png` (you will need to upload the avatar to somewhere) -Confirm Thread Creation Title ( confirm_thread_creation_title ) ------- +_**Notes:**_ -Title for the embed message sent to users to confirm a thread creation +* See also: `anon_username`, `anon_tag`. -***Default:*** Confirm thread creation +### Anon Username ( anon\_username ) -***Example:*** -- `?config set confirm_thread_creation_title Are you sure you want to create a new thread?` +This is the name in the “author” section of the embeds sent by anonymous moderators in the recipient DM. +_**Default:**_ Fallback on `mod_tag` -***Notes:*** -- See also: `confirm_thread_creation`, `confirm_thread_response`, `confirm_thread_creation_accept`, `confirm_thread_creation_deny` +_**Example:**_ -Confirm Thread Response ( confirm_thread_response ) ------- +* `?config set anon_username Incognito Mod` -Description for the embed message sent to users to confirm a thread creation +_**Notes:**_ -***Default:*** React to confirm thread creation which will directly contact the moderators +* See also: `anon_avatar_url`, `anon_tag`. -***Example:*** -- `?config set confirm_thread_response React to confirm` +### Transfer Reactions ( transfer\_reactions ) +Transfer users reactions to mods and vice versa _(If someone reacts to a thread message the other party will see it.)_ -***Notes:*** -- See also: `confirm_thread_creation`, `confirm_thread_creation_title`, `confirm_thread_creation_accept`, `confirm_thread_creation_deny` +_**Default:**_ Yes +_**Example:**_ -Cooldown Thread Response ( cooldown_thread_response ) ------- +* `?config set transfer_reactions no` -The description of the message embed when the user has a cooldown before creating a new thread. - -***Default:*** Your cooldown ends {delta}. Try contacting me then. +## Thread Responses -{% hint style="info" %} `{delta}` will be replaced with whatever time you gave it. {% endhint %} +### Close On Leave Reason ( close\_on\_leave\_reason ) -***Example:*** -- `?config set cooldown_thread_response Be patient! You are on cooldown, wait {delta} more.` - +Reason for closing the thread once member leaves -***Notes:*** -- "Only has an effect when `thread_cooldown` is set -- Must have a {delta} included which will be replaced with the duration of time. -- See also: `cooldown_thread_title`. +_**Default:**_ The recipient has left the server. -Cooldown Thread Title ( cooldown_thread_title ) ------- +_**Example:**_ -The title of the message embed when the user has a cooldown before creating a new thread. +* `?config set close_on_leave_reason Member left` -***Default:*** Message not sent! +_**Notes:**_ -***Example:*** -- `?config set cooldown_thread_title Error` +* This has no effect unless `close_on_leave` is set. +* See also: `close_on_leave`. +### Confirm Thread Creation Title ( confirm\_thread\_creation\_title ) -***Notes:*** -- Only has an effect when `thread_cooldown` is set -- See also: `cooldown_thread_response`. +Title for the embed message sent to users to confirm a thread creation -Disabled Current Thread Footer ( disabled_current_thread_footer ) ------- +_**Default:**_ Confirm thread creation -The footer of the message embed when Modmail DM is disabled and user DMs Modmail from existing thread. +_**Example:**_ -***Default:*** Please try again later... +* `?config set confirm_thread_creation_title Are you sure you want to create a new thread?` -***Example:*** -- `?config set disabled_current_thread_footer Message back!` +_**Notes:**_ -***Notes:*** -- Only has an effect when `{prefix}disable all` is set. -- See also: `disabled_current_thread_title`, `disabled_current_thread_response`, `disabled_new_thread_footer`. +* See also: `confirm_thread_creation`, `confirm_thread_response`, `confirm_thread_creation_accept`, `confirm_thread_creation_deny` -Disabled Current Thread Response ( disabled_current_thread_response ) ------- +### Confirm Thread Response ( confirm\_thread\_response ) -The body of the message embed when Modmail DM is disabled and user DMs Modmail from existing thread. +Description for the embed message sent to users to confirm a thread creation -***Default:*** We are not accepting any messages. +_**Default:**_ React to confirm thread creation which will directly contact the moderators -***Example:*** -- `?config set disabled_current_thread_response On break right now.` +_**Example:**_ +* `?config set confirm_thread_response React to confirm` -***Notes:*** -- Only has an effect when `{prefix}disable all` is set. -- See also: `disabled_current_thread_title`, `disabled_current_thread_footer`, `disabled_new_thread_response`. +_**Notes:**_ -Disabled Current Thread Title ( disabled_current_thread_title ) ------- +* See also: `confirm_thread_creation`, `confirm_thread_creation_title`, `confirm_thread_creation_accept`, `confirm_thread_creation_deny` -The title of the message embed when Modmail DM is disabled and user DMs Modmail from existing thread. +### Cooldown Thread Response ( cooldown\_thread\_response ) -***Default:*** Not Delivered. +The description of the message embed when the user has a cooldown before creating a new thread. -***Example:*** -- `?config set disabled_current_thread_title Unavailable` +_**Default:**_ Your cooldown ends {delta}. Try contacting me then. +{% hint style="info" %} +\`{delta}\` will be replaced with whatever time you gave it. +{% endhint %} -***Notes:*** -- Only has an effect when `{prefix}disable all` is set. -- See also: `disabled_current_thread_response`, `disabled_current_thread_footer`, `disabled_new_thread_title`. +_**Example:**_ -Disabled New Thread Footer ( disabled_new_thread_footer ) ------- +* `?config set cooldown_thread_response Be patient! You are on cooldown, wait {delta} more.` -The footer of the message embed when Modmail new thread creation is disabled and user tries to create a new thread. +_**Notes:**_ -***Default:*** Please try again later... +* "Only has an effect when `thread_cooldown` is set +* Must have a {delta} included which will be replaced with the duration of time. +* See also: `cooldown_thread_title`. -***Example:*** -- `?config set disabled_new_thread_footer Contact us later` +### Cooldown Thread Title ( cooldown\_thread\_title ) +The title of the message embed when the user has a cooldown before creating a new thread. -***Notes:*** -- Only has an effect when `{prefix}disable` or `{prefix}disable all` is set. -- See also: `disabled_new_thread_title`, `disabled_new_thread_response`, `disabled_current_thread_footer`. +_**Default:**_ Message not sent! -Disabled New Thread Response ( disabled_new_thread_response ) ------- +_**Example:**_ -The body of the message embed when Modmail new thread creation is disabled and user tries to create a new thread. +* `?config set cooldown_thread_title Error` -***Default:*** We are not accepting new threads. +_**Notes:**_ -***Example:*** -- `?config set disabled_new_thread_response Our working hours is between 8am - 6pm EST.` +* Only has an effect when `thread_cooldown` is set +* See also: `cooldown_thread_response`. +### Disabled Current Thread Footer ( disabled\_current\_thread\_footer ) -***Notes:*** -- Only has an effect when `{prefix}disable` or `{prefix}disable all` is set. -- See also: `disabled_new_thread_title`, `disabled_new_thread_footer`, `disabled_current_thread_response`. +The footer of the message embed when Modmail DM is disabled and user DMs Modmail from existing thread. -Disabled New Thread Title ( disabled_new_thread_title ) ------- +_**Default:**_ Please try again later... -The title of the message embed when Modmail new thread creation is disabled and user tries to create a new thread. +_**Example:**_ -***Default:*** Not Delivered. +* `?config set disabled_current_thread_footer Message back!` -***Example:*** -- `?config set disabled_new_thread_title Closed` +_**Notes:**_ +* Only has an effect when `{prefix}disable all` is set. +* See also: `disabled_current_thread_title`, `disabled_current_thread_response`, `disabled_new_thread_footer`. -***Notes:*** -- Only has an effect when `{prefix}disable` or `{prefix}disable all` is set. -- See also: `disabled_new_thread_response`, `disabled_new_thread_footer`, `disabled_current_thread_title`. +### Disabled Current Thread Response ( disabled\_current\_thread\_response ) -Private Added To Group Description Anon ( private_added_to_group_description_anon ) ------- +The body of the message embed when Modmail DM is disabled and user DMs Modmail from existing thread. -This is the message embed content sent to the recipient that is just added to a thread when adduser is used anonymously. +_**Default:**_ We are not accepting any messages. -***Default:*** A moderator has added you to a Modmail thread. +_**Example:**_ -***Example:*** -- `?config set private_added_to_group_description_anon Any message sent here will be sent to all other thread recipients.` +* `?config set disabled_current_thread_response On break right now.` +_**Notes:**_ -***Notes:*** -- When adduser (no anon) is used, `private_added_to_group_description` is used instead. -- The public_ variant is used when sending to other thread recipients. -- See also: `private_added_to_group_title`, `public_added_to_group_description_anon` +* Only has an effect when `{prefix}disable all` is set. +* See also: `disabled_current_thread_title`, `disabled_current_thread_footer`, `disabled_new_thread_response`. -Private Added To Group Response ( private_added_to_group_response ) ------- +### Disabled Current Thread Title ( disabled\_current\_thread\_title ) -This is the message embed content sent to the recipient that is just added to a thread. +The title of the message embed when Modmail DM is disabled and user DMs Modmail from existing thread. -***Default:*** \"{{moderator.name}} has added you to a Modmail thread.\" +_**Default:**_ Not Delivered. -***Example:*** -- `?config set private_added_to_group_description Any message sent here will be sent to all otherthread recipients.` - +_**Example:**_ -***Notes:*** -- You may use the `{{moderator}}` variable for access to the [Member](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member) that added the user. -- When anonadduser is used, `private_added_to_group_description_anon` is used instead. -- The public_ variant is used when sending to other thread recipients. -- See also: `private_added_to_group_title`, `public_added_to_group_description` +* `?config set disabled_current_thread_title Unavailable` -Private Added To Group Title ( private_added_to_group_title ) ------- +_**Notes:**_ -This is the message embed title sent to the recipient that is just added to a thread. +* Only has an effect when `{prefix}disable all` is set. +* See also: `disabled_current_thread_response`, `disabled_current_thread_footer`, `disabled_new_thread_title`. -***Default:*** New Thread (Group) +### Disabled New Thread Footer ( disabled\_new\_thread\_footer ) -***Example:*** -- `?config set private_added_to_group_title Welcome to this new group thread!` +The footer of the message embed when Modmail new thread creation is disabled and user tries to create a new thread. +_**Default:**_ Please try again later... -***Notes:*** -- The public_ variant is used when sending to other thread recipients. -- See also: `private_added_to_group_description`, `public_added_to_group_title` +_**Example:**_ -Private Removed From Group Description Anon ( private_removed_from_group_description_anon ) ------- +* `?config set disabled_new_thread_footer Contact us later` -This is the message embed content sent to the recipient that is just removed from a thread when removeuser is used anonymously. +_**Notes:**_ -***Default:*** A moderator has removed you from the Modmail thread. +* Only has an effect when `{prefix}disable` or `{prefix}disable all` is set. +* See also: `disabled_new_thread_title`, `disabled_new_thread_response`, `disabled_current_thread_footer`. -***Example:*** -- `?config set private_removed_from_group_description_anon You are permenantly removed from this thread.` +### Disabled New Thread Response ( disabled\_new\_thread\_response ) -***Notes:*** -- When adduser (no anon) is used, `private_removed_from_group_description` is used instead. -- The public_ variant is used when sending to other thread recipients. -- See also: `private_removed_from_group_title`, `public_removed_from_group_description_anon` +The body of the message embed when Modmail new thread creation is disabled and user tries to create a new thread. -Private Removed From Group Response ( private_removed_from_group_response ) ------- +_**Default:**_ We are not accepting new threads. -This is the message embed content sent to the recipient that is just removed from a thread. +_**Example:**_ -***Default:*** \"{{moderator.name}} has removed you from the Modmail thread.\" +* `?config set disabled_new_thread_response Our working hours is between 8am - 6pm EST.` -***Example:*** -- `?config set private_removed_from_group_description Bye` +_**Notes:**_ -***Notes:*** -- You may use the `{{moderator}}` variable for access to the [Member](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member) that added the user. -- When anonremoveuser is used, `private_removed_from_group_description_anon` is used instead. -- The public_ variant is used when sending to other thread recipients. -- See also: `private_removed_from_group_title`, `public_removed_from_group_description` +* Only has an effect when `{prefix}disable` or `{prefix}disable all` is set. +* See also: `disabled_new_thread_title`, `disabled_new_thread_footer`, `disabled_current_thread_response`. -Private Removed From Group Title ( private_removed_from_group_title ) ------- +### Disabled New Thread Title ( disabled\_new\_thread\_title ) -This is the message embed title sent to the recipient that is just removed from a thread. +The title of the message embed when Modmail new thread creation is disabled and user tries to create a new thread. -***Default:*** Removed From Thread (Group) +_**Default:**_ Not Delivered. -***Example:*** -- `?config set private_removed_from_group_title Welcome to this new group thread!` +_**Example:**_ -***Notes:*** -- The public_ variant is used when sending to other thread recipients. -- See also: `private_removed_from_group_description`, `public_removed_from_group_title` +* `?config set disabled_new_thread_title Closed` -Public Added To Group Description Anon ( public_added_to_group_description_anon ) ------- +_**Notes:**_ -This is the message embed content sent to all other recipients when someone is added to the thread when adduser is used anonymously. +* Only has an effect when `{prefix}disable` or `{prefix}disable all` is set. +* See also: `disabled_new_thread_response`, `disabled_new_thread_footer`, `disabled_current_thread_title`. -***Default:*** \"A moderator has added {{users}} to the Modmail thread.\" +### Private Added To Group Description Anon ( private\_added\_to\_group\_description\_anon ) -***Example:*** -- `?config set public_added_to_group_description_anon Any message sent here will be sent to all other thread recipients.` +This is the message embed content sent to the recipient that is just added to a thread when adduser is used anonymously. +_**Default:**_ A moderator has added you to a Modmail thread. -***Notes:*** -- When adduser (no anon) is used, `public_added_to_group_description` is used instead. -- The private_ variant is used when sending to the new user. -- See also: `public_added_to_group_title`, `private_added_to_group_description_anon` +_**Example:**_ -Public Added To Group Response ( public_added_to_group_response ) ------- +* `?config set private_added_to_group_description_anon Any message sent here will be sent to all other thread recipients.` -This is the message embed content sent to all other recipients when someone is added to the thread. +_**Notes:**_ -***Default:*** \"{{moderator.name}} has added {{users}} to the Modmail thread.\" +* When adduser (no anon) is used, `private_added_to_group_description` is used instead. +* The public\_ variant is used when sending to other thread recipients. +* See also: `private_added_to_group_title`, `public_added_to_group_description_anon` -***Example:*** -- `?config set public_added_to_group_response Welcome {users}!` +### Private Added To Group Response ( private\_added\_to\_group\_response ) -***Notes:*** -- You may use the `{{moderator}}` variable for access to the [Member](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member) that added the user. -- When anonadduser is used, `public_added_to_group_description_anon` is used instead. -- The private_ variant is used when sending to the new user. -- See also: `public_added_to_group_title`, `private_added_to_group_description` +This is the message embed content sent to the recipient that is just added to a thread. -Public Added To Group Title ( public_added_to_group_title ) ------- +_**Default:**_ "\{{moderator.name\}} has added you to a Modmail thread." -This is the message embed title sent to all other recipients when someone is added to the thread. +_**Example:**_ -***Default:*** New User +* `?config set private_added_to_group_description Any message sent here will be sent to all otherthread recipients.` -***Example:*** -- `?config set public_added_to_group_title Welcome to our new user!` - +_**Notes:**_ -***Notes:*** -- The private_ variant is used when sending to the new user. -- See also: `private_added_to_group_title`, `private_added_to_group_title` +* You may use the `{{moderator}}` variable for access to the [Member](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member) that added the user. +* When anonadduser is used, `private_added_to_group_description_anon` is used instead. +* The public\_ variant is used when sending to other thread recipients. +* See also: `private_added_to_group_title`, `public_added_to_group_description` -Public Removed From Group Description Anon ( public_removed_from_group_description_anon ) ------- +### Private Added To Group Title ( private\_added\_to\_group\_title ) -This is the message embed content sent to all other recipients when someone is removed from the thread when removeuser is used anonymously. +This is the message embed title sent to the recipient that is just added to a thread. -***Default:*** \"A moderator has removed {{users}} from the Modmail thread.\" +_**Default:**_ New Thread (Group) -***Example:*** -- `?config set public_removed_from_group_description_anon Goodbye {users}!` +_**Example:**_ +* `?config set private_added_to_group_title Welcome to this new group thread!` -***Notes:*** -- When adduser (no anon) is used, `public_removed_from_group_description` is used instead. -- The private_ variant is used when sending to the new user. -- See also: `public_removed_from_group_title`, `private_removed_from_group_description_anon` +_**Notes:**_ -Public Removed From Group Response ( public_removed_from_group_response ) ------- +* The public\_ variant is used when sending to other thread recipients. +* See also: `private_added_to_group_description`, `public_added_to_group_title` -This is the message embed content sent to all other recipients when someone is removed from the thread. +### Private Removed From Group Description Anon ( private\_removed\_from\_group\_description\_anon ) -***Default:*** \"{{moderator.name}} has removed {{users}} from the Modmail thread.\" +This is the message embed content sent to the recipient that is just removed from a thread when removeuser is used anonymously. -***Example:*** -- `?config set public_removed_from_group_response Goodbye {users}!` +_**Default:**_ A moderator has removed you from the Modmail thread. +_**Example:**_ -***Notes:*** -- You may use the `{{moderator}}` variable for access to the [Member](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member) that added the user. -- When anonremoveuser is used, `public_removed_from_group_description_anon` is used instead. +* `?config set private_removed_from_group_description_anon You are permenantly removed from this thread.` -Public Removed From Group Title ( public_removed_from_group_title ) ------- +_**Notes:**_ -This is the message embed title sent to all other recipients when someone is removed from the thread. +* When adduser (no anon) is used, `private_removed_from_group_description` is used instead. +* The public\_ variant is used when sending to other thread recipients. +* See also: `private_removed_from_group_title`, `public_removed_from_group_description_anon` -***Default:*** User Removed +### Private Removed From Group Response ( private\_removed\_from\_group\_response ) -***Example:*** -- `?config set public_removed_from_group_title User is now gone!` +This is the message embed content sent to the recipient that is just removed from a thread. +_**Default:**_ "\{{moderator.name\}} has removed you from the Modmail thread." -***Notes:*** -- The private_ variant is used when sending to the new user. -- See also: `private_removed_from_group_title`, `private_removed_from_group_title` +_**Example:**_ -React To Contact Message ( react_to_contact_message ) ------- +* `?config set private_removed_from_group_description Bye` -A message ID where reactions are tracked. If the `react_to_contact_emoji` is added, the bot opens a thread with them. +_**Notes:**_ -***Default:*** None +* You may use the `{{moderator}}` variable for access to the [Member](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member) that added the user. +* When anonremoveuser is used, `private_removed_from_group_description_anon` is used instead. +* The public\_ variant is used when sending to other thread recipients. +* See also: `private_removed_from_group_title`, `public_removed_from_group_description` -***Example:*** -- `?config set react_to_contact_message 773575608814534717` +### Private Removed From Group Title ( private\_removed\_from\_group\_title ) +This is the message embed title sent to the recipient that is just removed from a thread. -***Notes:*** -- See also: `react_to_contact_emoji` +_**Default:**_ Removed From Thread (Group) +_**Example:**_ -Recipient Thread Close ( recipient_thread_close ) ------- +* `?config set private_removed_from_group_title Welcome to this new group thread!` -Setting this configuration will allow recipients to use the `close_emoji` to close the thread themselves. +_**Notes:**_ -***Default:*** Disabled +* The public\_ variant is used when sending to other thread recipients. +* See also: `private_removed_from_group_description`, `public_removed_from_group_title` -***Example:*** -- `?config set recipient_thread_close yes` -- `?config set recipient_thread_close no` +### Public Added To Group Description Anon ( public\_added\_to\_group\_description\_anon ) +This is the message embed content sent to all other recipients when someone is added to the thread when adduser is used anonymously. -***Notes:*** -- The close emoji is dictated by the configuration `close_emoji`. -- See also: `close_emoji`. +_**Default:**_ "A moderator has added \{{users\}} to the Modmail thread." -Thread Auto Close Response ( thread_auto_close_response ) ------- +_**Example:**_ -This is the message to display when the thread when the thread auto-closes. +* `?config set public_added_to_group_description_anon Any message sent here will be sent to all other thread recipients.` -***Default:*** \"This thread has been closed automatically due to inactivity after {{timeout}}.\" +_**Notes:**_ -***Example:*** -- `?config set thread_auto_close_response Your close message here.` +* When adduser (no anon) is used, `public_added_to_group_description` is used instead. +* The private\_ variant is used when sending to the new user. +* See also: `public_added_to_group_title`, `private_added_to_group_description_anon` +### Public Added To Group Response ( public\_added\_to\_group\_response ) -***Notes:*** -- Its possible to use `{{timeout}}` as a placeholder for a formatted timeout text. -- This will not have an effect when `thread_auto_close_silently` is enabled. -- Discord flavoured markdown is fully supported in `thread_auto_close_response`. -- See also: `thread_auto_close`, `thread_auto_close_silently`. +This is the message embed content sent to all other recipients when someone is added to the thread. -Thread Auto Close Silently ( thread_auto_close_silently ) ------- +_**Default:**_ "\{{moderator.name\}} has added \{{users\}} to the Modmail thread." -Setting this configuration will close silently when the thread auto-closes. +_**Example:**_ -***Default:*** No +* `?config set public_added_to_group_response Welcome {users}!` -***Example:*** -- `?config set thread_auto_close_silently yes` -- `?config set thread_auto_close_silently no` +_**Notes:**_ +* You may use the `{{moderator}}` variable for access to the [Member](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member) that added the user. +* When anonadduser is used, `public_added_to_group_description_anon` is used instead. +* The private\_ variant is used when sending to the new user. +* See also: `public_added_to_group_title`, `private_added_to_group_description` -***Notes:*** -- This will only have an effect when `thread_auto_close` is set. -- See also: `thread_auto_close`. +### Public Added To Group Title ( public\_added\_to\_group\_title ) -Thread Cancelled ( thread_cancelled ) ------- +This is the message embed title sent to all other recipients when someone is added to the thread. -This is the message to display when a thread times out and creation is cancelled. +_**Default:**_ New User -***Default:*** \"Cancelled\" +_**Example:**_ -***Example:*** -- `?config set thread_cancelled Gone.` +* `?config set public_added_to_group_title Welcome to our new user!` +_**Notes:**_ -Thread Close Footer ( thread_close_footer ) ------- +* The private\_ variant is used when sending to the new user. +* See also: `private_added_to_group_title`, `private_added_to_group_title` -This is the message embed footer sent to the recipient upon the closure of a thread. +### Public Removed From Group Description Anon ( public\_removed\_from\_group\_description\_anon ) -***Default:*** \"Replying will create a new thread\" +This is the message embed content sent to all other recipients when someone is removed from the thread when removeuser is used anonymously. -***Example:*** -- `?config set thread_close_footer Bye!` +_**Default:**_ "A moderator has removed \{{users\}} from the Modmail thread." +_**Example:**_ -***Notes:*** -- See also: `thread_close_title`, `thread_close_response`, `thread_creation_footer`. +* `?config set public_removed_from_group_description_anon Goodbye {users}!` +_**Notes:**_ -Thread Close Response ( thread_close_response ) ------- +* When adduser (no anon) is used, `public_removed_from_group_description` is used instead. +* The private\_ variant is used when sending to the new user. +* See also: `public_removed_from_group_title`, `private_removed_from_group_description_anon` -This is the message embed content sent to the recipient upon the closure of a thread. +### Public Removed From Group Response ( public\_removed\_from\_group\_response ) -There are three variables you can use within the thread close message: - - `closer`: the discord User object of the user who closed the thread. - - `logkey`: the key for the thread logs. (ie. 51ecd946dc29) - - `loglink`: the full link URL to the thread logs. (ie. https://logviewer.herokuapp.com/logs/51ecd946dc29) +This is the message embed content sent to all other recipients when someone is removed from the thread. +_**Default:**_ "\{{moderator.name\}} has removed \{{users\}} from the Modmail thread." -***Default:*** \"{{closer.mention}} has closed this Modmail thread\" +_**Example:**_ -***Example:*** -- `?config set thread_close_response Your message is appriciated!` +* `?config set public_removed_from_group_response Goodbye {users}!` + +_**Notes:**_ + +* You may use the `{{moderator}}` variable for access to the [Member](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member) that added the user. +* When anonremoveuser is used, `public_removed_from_group_description_anon` is used instead. + +### Public Removed From Group Title ( public\_removed\_from\_group\_title ) + +This is the message embed title sent to all other recipients when someone is removed from the thread. + +_**Default:**_ User Removed + +_**Example:**_ + +* `?config set public_removed_from_group_title User is now gone!` + +_**Notes:**_ + +* The private\_ variant is used when sending to the new user. +* See also: `private_removed_from_group_title`, `private_removed_from_group_title` + +### React To Contact Message ( react\_to\_contact\_message ) + +A message ID where reactions are tracked. If the `react_to_contact_emoji` is added, the bot opens a thread with them. + +_**Default:**_ None + +_**Example:**_ + +* `?config set react_to_contact_message 773575608814534717` + +_**Notes:**_ + +* See also: `react_to_contact_emoji` + +### Recipient Thread Close ( recipient\_thread\_close ) + +Setting this configuration will allow recipients to use the `close_emoji` to close the thread themselves. + +_**Default:**_ Disabled + +_**Example:**_ + +* `?config set recipient_thread_close yes` +* `?config set recipient_thread_close no` + +_**Notes:**_ + +* The close emoji is dictated by the configuration `close_emoji`. +* See also: `close_emoji`. + +### Thread Auto Close Response ( thread\_auto\_close\_response ) + +This is the message to display when the thread when the thread auto-closes. + +_**Default:**_ "This thread has been closed automatically due to inactivity after \{{timeout\}}." + +_**Example:**_ + +* `?config set thread_auto_close_response Your close message here.` + +_**Notes:**_ + +* Its possible to use `{{timeout}}` as a placeholder for a formatted timeout text. +* This will not have an effect when `thread_auto_close_silently` is enabled. +* Discord flavoured markdown is fully supported in `thread_auto_close_response`. +* See also: `thread_auto_close`, `thread_auto_close_silently`. + +### Thread Auto Close Silently ( thread\_auto\_close\_silently ) + +Setting this configuration will close silently when the thread auto-closes. + +_**Default:**_ No + +_**Example:**_ + +* `?config set thread_auto_close_silently yes` +* `?config set thread_auto_close_silently no` + +_**Notes:**_ + +* This will only have an effect when `thread_auto_close` is set. +* See also: `thread_auto_close`. + +### Thread Cancelled ( thread\_cancelled ) + +This is the message to display when a thread times out and creation is cancelled. + +_**Default:**_ "Cancelled" + +_**Example:**_ + +* `?config set thread_cancelled Gone.` + +### Thread Close Footer ( thread\_close\_footer ) + +This is the message embed footer sent to the recipient upon the closure of a thread. + +_**Default:**_ "Replying will create a new thread" + +_**Example:**_ + +* `?config set thread_close_footer Bye!` + +_**Notes:**_ + +* See also: `thread_close_title`, `thread_close_response`, `thread_creation_footer`. + +### Thread Close Response ( thread\_close\_response ) + +This is the message embed content sent to the recipient upon the closure of a thread. + +There are three variables you can use within the thread close message: - `closer`: the discord User object of the user who closed the thread. - `logkey`: the key for the thread logs. (ie. 51ecd946dc29) - `loglink`: the full link URL to the thread logs. (ie. https://logviewer.herokuapp.com/logs/51ecd946dc29) + +_**Default:**_ "\{{closer.mention\}} has closed this Modmail thread" + +_**Example:**_ + +* `?config set thread_close_response Your message is appriciated!` To use variables in the thread close message: -- `?config set thread_close_response {closer.mention} has closed this thread, here's your log key: **`{logkey}`**.` +* `?config set thread_close_response {closer.mention} has closed this thread, here's your log key: **`{logkey}`**.` + +_**Notes:**_ + +* When `recipient_thread_close` is enabled and the recipient closed their own thread, `thread_self_close_response` is used instead of this configuration. +* You may use the `{{closer}}` variable for access to the [Member](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member) that closed the thread. +* Discord flavoured markdown is fully supported in `thread_close_response`. +* See also: `thread_close_title`, `thread_close_footer`, `thread_self_close_response`, `thread_creation_response`. + +### Thread Close Title ( thread\_close\_title ) + +This is the message embed title sent to the recipient upon the closure of a thread. + +_**Default:**_ "Thread Closed" + +_**Example:**_ + +* `?config set thread_close_title Farewell!` + +_**Notes:**_ + +* See also: `thread_close_response`, `thread_close_footer`, `thread_creation_title`. + +### Thread Contact Silently ( thread\_contact\_silently ) + +Setting this configuration will always open a new thread silently in contact. -***Notes:*** -- When `recipient_thread_close` is enabled and the recipient closed their own thread, `thread_self_close_response` is used instead of this configuration. -- You may use the `{{closer}}` variable for access to the [Member](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member) that closed the thread. -- Discord flavoured markdown is fully supported in `thread_close_response`. -- See also: `thread_close_title`, `thread_close_footer`, `thread_self_close_response`, `thread_creation_response`. +_**Default:**_ No -Thread Close Title ( thread_close_title ) ------- +_**Example:**_ -This is the message embed title sent to the recipient upon the closure of a thread. +* `?config set thread_contact_silently yes` +* `?config set thread_contact_silently no` -***Default:*** \"Thread Closed\" +_**Notes:**_ -***Example:*** -- `?config set thread_close_title Farewell!` +* Works like `{prefix}contact silent` for every new thread. +### Thread Creation Contact Response ( thread\_creation\_contact\_response ) -***Notes:*** -- See also: `thread_close_response`, `thread_close_footer`, `thread_creation_title`. +This is the message embed description sent to recipients when contacted by a mod. +_**Default:**_ "\{{creator.name\}} has opened a Modmail thread." -Thread Contact Silently ( thread_contact_silently ) ------- +_**Example:**_ -Setting this configuration will always open a new thread silently in contact. +* `?config set thread_creation_contact_response New thread opened.` -***Default:*** No +_**Notes:**_ -***Example:*** -- `?config set thread_contact_silently yes` -- `?config set thread_contact_silently no` +* You may use the `{{creator}}` variable for access to the [Member](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member) that created the thread. +* `thread_creation_self_contact_response` is used when contacted by self. +* See also: `thread_creation_contact_title`, `thread_creation_self_contact_response`. +### Thread Creation Contact Title ( thread\_creation\_contact\_title ) -***Notes:*** -- Works like `{prefix}contact silent` for every new thread. +This is the message embed title sent to recipients when contacted. +_**Default:**_ "New Thread" -Thread Creation Contact Response ( thread_creation_contact_response ) ------- +_**Example:**_ -This is the message embed description sent to recipients when contacted by a mod. +* `?config set thread_creation_contact_title New Message!` -***Default:*** \"{{creator.name}} has opened a Modmail thread.\" +_**Notes:**_ -***Example:*** -- `?config set thread_creation_contact_response New thread opened.` +* See also: `thread_creation_self_contact_response`, `thread_creation_contact_response`. +### Thread Creation Footer ( thread\_creation\_footer ) -***Notes:*** -- You may use the `{{creator}}` variable for access to the [Member](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member) that created the thread. -- `thread_creation_self_contact_response` is used when contacted by self. -- See also: `thread_creation_contact_title`, `thread_creation_self_contact_response`. +This is the message embed footer sent to the recipient upon the creation of a new thread. -Thread Creation Contact Title ( thread_creation_contact_title ) ------- +_**Default:**_ "Your message has been sent" -This is the message embed title sent to recipients when contacted. +_**Example:**_ -***Default:*** \"New Thread\" +* \`?config set thread\_creation\_footer Please Hold... -***Example:*** -- `?config set thread_creation_contact_title New Message!` +_**Notes:**_ -***Notes:*** -- See also: `thread_creation_self_contact_response`, `thread_creation_contact_response`. +* This is used in place of `thread_self_closable_creation_footer` when `recipient_thread_close` is enabled. +* See also: `thread_creation_title`, `thread_creation_response`, `thread_self_closable_creation_footer`, `thread_close_footer`. +### Thread Creation Response ( thread\_creation\_response ) -Thread Creation Footer ( thread_creation_footer ) ------- +This is the message embed content sent to the recipient upon the creation of a new thread. -This is the message embed footer sent to the recipient upon the creation of a new thread. +_**Default:**_ "The staff team will get back to you as soon as possible." -***Default:*** \"Your message has been sent\" +_**Example:**_ -***Example:*** -- `?config set thread_creation_footer Please Hold... +* `?config set thread_creation_response You will be contacted shortly.` +_**Notes:**_ -***Notes:*** -- This is used in place of `thread_self_closable_creation_footer` when `recipient_thread_close` is enabled. -- See also: `thread_creation_title`, `thread_creation_response`, `thread_self_closable_creation_footer`, `thread_close_footer`. +* Discord flavoured markdown is fully supported in `thread_creation_response`. +* See also: `thread_creation_title`, `thread_creation_footer`, `thread_close_response`. -Thread Creation Response ( thread_creation_response ) ------- +### Thread Creation Self Contact Response ( thread\_creation\_self\_contact\_response ) -This is the message embed content sent to the recipient upon the creation of a new thread. +This is the message embed description sent to recipients when self-contacted. -***Default:*** \"The staff team will get back to you as soon as possible.\" +_**Default:**_ "You have opened a Modmail thread." -***Example:*** -- `?config set thread_creation_response You will be contacted shortly.` +_**Example:**_ +* `?config set thread_creation_self_contact_response You contacted yourself.` -***Notes:*** -- Discord flavoured markdown is fully supported in `thread_creation_response`. -- See also: `thread_creation_title`, `thread_creation_footer`, `thread_close_response`. +_**Notes:**_ -Thread Creation Self Contact Response ( thread_creation_self_contact_response ) ------- +* `thread_creation_contact_response` is used when contacted by another user. +* See also: `thread_creation_contact_title`, `thread_creation_contact_response`. -This is the message embed description sent to recipients when self-contacted. +### Thread Creation Title ( thread\_creation\_title ) -***Default:*** \"You have opened a Modmail thread.\" +This is the message embed title sent to the recipient upon the creation of a new thread. -***Example:*** -- `?config set thread_creation_self_contact_response You contacted yourself.` +_**Default:**_ "Thread Created" -***Notes:*** -- `thread_creation_contact_response` is used when contacted by another user. -- See also: `thread_creation_contact_title`, `thread_creation_contact_response`. +_**Example:**_ -Thread Creation Title ( thread_creation_title ) ------- +* `?config set thread_creation_title Hello!` -This is the message embed title sent to the recipient upon the creation of a new thread. +_**Notes:**_ -***Default:*** \"Thread Created\" +* See also: `thread_creation_response`, `thread_creation_footer`, `thread_close_title`. -***Example:*** -- `?config set thread_creation_title Hello!` +### Thread Move Response ( thread\_move\_response ) +This is the message to display to the user when the thread is moved. -***Notes:*** -- See also: `thread_creation_response`, `thread_creation_footer`, `thread_close_title`. +_**Default:**_ This thread has been moved. +_**Example:**_ -Thread Move Response ( thread_move_response ) ------- +* `?config set thread_move_response This thread has been moved to another category for review!` -This is the message to display to the user when the thread is moved. +_**Notes:**_ -***Default:*** This thread has been moved. +* Only has an effect when `thread_move_notify` is on. +* See also: `thread_move_title`, `thread_move_notify`. -***Example:*** -- `?config set thread_move_response This thread has been moved to another category for review!` +### Thread Move Title ( thread\_move\_title ) +The title of the message embed when a thread is moved. -***Notes:*** -- Only has an effect when `thread_move_notify` is on. -- See also: `thread_move_title`, `thread_move_notify`. +_**Default:**_ Thread Moved -Thread Move Title ( thread_move_title ) ------- +_**Example:**_ -The title of the message embed when a thread is moved. +* `?config set thread_move_title Thread transferred to another channel!` -***Default:*** Thread Moved +_**Notes:**_ -See also: `thread_move_notify`, `thread_move_notify_mods`, `thread_move_response`. -***Example:*** -- `?config set thread_move_title Thread transferred to another channel!` +### Thread Self Closable Creation Footer ( thread\_self\_closable\_creation\_footer ) +This is the message embed footer sent to the recipient upon the creation of a new thread. -***Notes:*** --See also: `thread_move_notify`, `thread_move_notify_mods`, `thread_move_response`. +_**Default:**_ "Click the lock to close the thread" +_**Example:**_ -Thread Self Closable Creation Footer ( thread_self_closable_creation_footer ) ------- +* `?config set thread_self_closable_creation_footer Please Hold...` -This is the message embed footer sent to the recipient upon the creation of a new thread. +_**Notes:**_ -***Default:*** \"Click the lock to close the thread\" +* This is used in place of `thread_creation_footer` when `recipient_thread_close` is disabled. +* See also: `thread_creation_title`, `thread_creation_response`, `thread_creation_footer`. -***Example:*** -- `?config set thread_self_closable_creation_footer Please Hold...` +### Thread Self Close Response ( thread\_self\_close\_response ) +This is the message embed content sent to the recipient upon the closure of a their own thread. -***Notes:*** -- This is used in place of `thread_creation_footer` when `recipient_thread_close` is disabled. -- See also: `thread_creation_title`, `thread_creation_response`, `thread_creation_footer`. +_**Default:**_ "You have closed this Modmail thread." -Thread Self Close Response ( thread_self_close_response ) ------- +_**Example:**_ -This is the message embed content sent to the recipient upon the closure of a their own thread. - -***Default:*** \"You have closed this Modmail thread.\" +* `?config set thread_self_close_response You have closed your own thread...` -***Example:*** -- `?config set thread_self_close_response You have closed your own thread...` +_**Notes:**_ +* When `recipient_thread_close` is disabled or the thread wasn't closed by the recipient, `thread_close_response` is used instead of this configuration. +* You may use the `{{closer}}` variable for access to the [Member](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member) that closed the thread. +* `{{loglink}}` can be used as a placeholder substitute for the full URL linked to the thread in the log viewer and `{{loglink}}` for the unique key (ie. s3kf91a) of the log. +* Discord flavoured markdown is fully supported in `thread_self_close_response`. -See also: `thread_close_title`, `thread_close_footer`, `thread_close_response`. -***Notes:*** -- When `recipient_thread_close` is disabled or the thread wasn't closed by the recipient, `thread_close_response` is used instead of this configuration. -- You may use the `{{closer}}` variable for access to the [Member](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member) that closed the thread. -- `{{loglink}}` can be used as a placeholder substitute for the full URL linked to the thread in the log viewer and `{{loglink}}` for the unique key (ie. s3kf91a) of the log. -- Discord flavoured markdown is fully supported in `thread_self_close_response`. --See also: `thread_close_title`, `thread_close_footer`, `thread_close_response`. +## `.env` Config Options -`.env` Config Options -====== -#### The following is a list of config options that can *ONLY* be added by editing the `.env` file. Please use whichever guide you followed to set up the bot to see how to add these variables. +**The following is a list of config options that can **_**ONLY**_** be added by editing the `.env` file. Please use whichever guide you followed to set up the bot to see how to add these variables.** -{% hint style="danger" %} It is recommended you avoid and ignore changing any of these you do not fully understand {% endhint %} +{% hint style="danger" %} +It is recommended you avoid and ignore changing any of these you do not fully understand +{% endhint %} -| Option | Description | Required | Usage | -| ------------- |:-------------:|:-------------:|:-------------:| -| modmail_guild_id | Inbox server for tickets | No | `MODMAIL_GUILD_ID = GUILDIDHERE` | -| guild_id | Main server the bot is in | Yes | `GUILD_ID = GUILDIDHERE` | -| log_url_prefix | Default is `/logs` | Yes | `LOG_URL_PREFIX = PREFIX` | -| mongo_uri | The connection uri for the database | Yes | `MONGO_URI = mongodb+srv://Papiersnipper:mypassword123@modmail-rdm99.mongodb.net/` | -| connection_uri | The connection uri for the database | Yes | `CONNECTION_URI = mongodb+srv://Papiersnipper:mypassword123@modmail-rdm99.mongodb.net/` | -| owners | ID's of the users who will have owner perms | Yes | `OWNERS = 1234,5678,91011` | -| enable_presence_intent | Enables the presence intent, required for some plugins. Uses extra resources. | No | `ENABLE_PRESENCE_INTENT = True` | -| registry_plugins_only | Disallows the ability to download plugins that aren’t in the plugin registry. | No | `REGISTRY_PLUGINS_ONLY = True` | -| token | The bots token | Yes | `TOKEN = MTAyMjk2NTA4MzYxtewgw3eNw.thisis.afaketoken-WGjwfvQ` | -| enable_eval | Enables the eval command to run arbitrary code on the bot. | No | `ENABLE_EVAL = True` | -| github_token | Needed to use the update command | No | `GITHUB_TOKEN = ghp_ABC132gfdsg4321fds` | -| disable_autoupdates | Allows for auto updates | No | `DISABLE_AUTOUPDATES = True` | -| disable_updates | Disables updates all together | No | `DISABLE_UPDATES = True` | -| log_level | The type of information posted in the terminal, Default is `INFO` | No | `LOG_LEVEL = ERROR/WARNING/INFO/DEBUG/NOTSET` | +| Option | Description | Required | Usage | +| ------------------------ | :---------------------------------------------------------------------------: | :------: | :-------------------------------------------------------------------------------------: | +| modmail\_guild\_id | Inbox server for tickets | No | `MODMAIL_GUILD_ID = GUILDIDHERE` | +| guild\_id | Main server the bot is in | Yes | `GUILD_ID = GUILDIDHERE` | +| log\_url\_prefix | Default is `/logs` | Yes | `LOG_URL_PREFIX = PREFIX` | +| mongo\_uri | The connection uri for the database | Yes | `MONGO_URI = mongodb+srv://Papiersnipper:mypassword123@modmail-rdm99.mongodb.net/` | +| connection\_uri | The connection uri for the database | Yes | `CONNECTION_URI = mongodb+srv://Papiersnipper:mypassword123@modmail-rdm99.mongodb.net/` | +| owners | ID's of the users who will have owner perms | Yes | `OWNERS = 1234,5678,91011` | +| enable\_presence\_intent | Enables the presence intent, required for some plugins. Uses extra resources. | No | `ENABLE_PRESENCE_INTENT = True` | +| registry\_plugins\_only | Disallows the ability to download plugins that aren’t in the plugin registry. | No | `REGISTRY_PLUGINS_ONLY = True` | +| token | The bots token | Yes | `TOKEN = MTAyMjk2NTA4MzYxtewgw3eNw.thisis.afaketoken-WGjwfvQ` | +| enable\_eval | Enables the eval command to run arbitrary code on the bot. | No | `ENABLE_EVAL = True` | +| github\_token | Needed to use the update command | No | `GITHUB_TOKEN = ghp_ABC132gfdsg4321fds` | +| disable\_autoupdates | Allows for auto updates | No | `DISABLE_AUTOUPDATES = True` | +| disable\_updates | Disables updates all together | No | `DISABLE_UPDATES = True` | +| log\_level | The type of information posted in the terminal, Default is `INFO` | No | `LOG_LEVEL = ERROR/WARNING/INFO/DEBUG/NOTSET` | From 47dfdb71214c3fbee5c19e1c919c43d863cf47d4 Mon Sep 17 00:00:00 2001 From: Raiden Date: Tue, 11 Apr 2023 09:00:15 +0000 Subject: [PATCH 27/33] GITBOOK-16: Update links --- installation/local-hosting-vps/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/installation/local-hosting-vps/README.md b/installation/local-hosting-vps/README.md index 53f3941..0ae116b 100644 --- a/installation/local-hosting-vps/README.md +++ b/installation/local-hosting-vps/README.md @@ -20,7 +20,7 @@ More OS-specific requirements will be listed on their specific installation page * [Ubuntu](ubuntu.md) * [Debian](debian.md) * [Fedora](fedora.md) -* [AlmaLinux](almalinux.md) +* [Alma Linux](almalinux.md) * [CentOS](almalinux.md) * [Raspberry Pi OS](debian.md) @@ -29,4 +29,4 @@ More OS-specific requirements will be listed on their specific installation page You can also self-host logviewer by following the guides below. * [Logviewer](logviewer.md) -* [Patreon logviewer](patreon\_logviewer.md) +* [Patreon Logviewer](patreon\_logviewer.md) From b3b52bd52e43fe05daa993f631843f5a5403995a Mon Sep 17 00:00:00 2001 From: Raiden Date: Tue, 11 Apr 2023 10:37:38 +0000 Subject: [PATCH 28/33] GITBOOK-17: Move auto-restart guide to its own page --- SUMMARY.md | 1 + installation/local-hosting-vps/almalinux.md | 89 +--------- installation/local-hosting-vps/debian.md | 89 +--------- installation/local-hosting-vps/fedora.md | 89 +--------- installation/local-hosting-vps/ubuntu.md | 89 +--------- installation/local-hosting-vps/windows.md | 85 ---------- setting-up-auto-restart.md | 172 ++++++++++++++++++++ 7 files changed, 177 insertions(+), 437 deletions(-) create mode 100644 setting-up-auto-restart.md diff --git a/SUMMARY.md b/SUMMARY.md index 82bab4e..2a40184 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -15,6 +15,7 @@ * [Railway](installation/railway.md) * [Heroku](installation/heroku.md) * [Community Guides](installation/community-guides.md) +* [Setting up auto-restart](setting-up-auto-restart.md) * [Getting Started](getting-started.md) * [Usage](usage-guide/README.md) * [Plugins](usage-guide/plugins.md) diff --git a/installation/local-hosting-vps/almalinux.md b/installation/local-hosting-vps/almalinux.md index 5e2adc8..dbc4298 100644 --- a/installation/local-hosting-vps/almalinux.md +++ b/installation/local-hosting-vps/almalinux.md @@ -83,89 +83,6 @@ pipenv run bot If no error shows up, it means your bot is now running correctly. -## Setting up auto-restart - -To have the bot auto-restart on crash or system reboot, we will be using `systemd` by making a service file for our bot. - -In order to create the service file, you will first need to know three things, your Linux `username`, your Modmail repository `path` and your `pipenv_path`. - -First, your Linux `username` can be fetched with the following command: - -```bash -whoami -``` - -If you have cloned the Modmail repo as a `root` user, your Modmail repo path should be: - -```bash -/root/modmail -``` - -Otherwise, your path should be: - -```bash -/home/$USER/modmail/ -``` - -You can get your `pipenv_path` with: - -``` -whereis pipenv -``` - -Now, using `nano`, create a service file for `systemd` with: - -```bash -sudo nano /etc/systemd/system/modmail.service -``` - -and paste in the contents below, replacing `username`, `modmail_path` and `pipenv_path` with yours respectively. `Ctrl+O` and `Enter` to save. `Ctrl+X` to exit the nano editor. - -{% code title="modmail.service" %} -```bash -[Unit] -Description=Modmail bot -After=network.target - -[Service] -User=username # replace this -Group=username # replace this -Restart=always -RestartSec=10 -Type=simple -WorkingDirectory=modmail_path # replace this -ExecStart=pipenv_path run python bot.py # replace pipenv_path only - -[Install] -WantedBy=multi-user.target -``` -{% endcode %} - -Now, start your Modmail bot with: - -```bash -sudo systemctl start modmail -``` - -If everything goes correctly, you should see your bot online. You can also view the logs of your systemd process with: - -```bash -sudo journalctl -eu modmail -``` - -With that said, go ahead and enable your Modmail service to auto-restart after crash and reboot with: - -```bash -sudo systemctl enable modmail -``` - -If in the future you need to stop and disable your Modmail service, you can do so with: - -```bash -sudo systemctl stop modmail -sudo systemctl disable modmai -``` - ## Updating Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. @@ -176,8 +93,4 @@ If for some reason your update command isn't working correctly, you can update y cd modmail && git pull ``` -Be sure to restart your bot to apply the changes. If you followed the above instructions on setting up auto-restart, you can do so with: - -```bash -sudo systemctl restart modmail -``` +Be sure to restart your bot to apply the uupdate. diff --git a/installation/local-hosting-vps/debian.md b/installation/local-hosting-vps/debian.md index eb6e63c..c870b72 100644 --- a/installation/local-hosting-vps/debian.md +++ b/installation/local-hosting-vps/debian.md @@ -99,89 +99,6 @@ pipenv run bot If no error shows up, it means your bot is now running correctly. -## Setting up auto-restart - -To have the bot auto-restart on crash or system reboot, we will be using `systemd` by making a service file for our bot. - -In order to create the service file, you will first need to know three things, your Linux `username`, your Modmail repository `path` and your `pipenv_path`. - -First, your Linux `username` can be fetched with the following command: - -```bash -whoami -``` - -If you have cloned the Modmail repo as a `root` user, your Modmail repo path should be: - -```bash -/root/modmail -``` - -Otherwise, your path should be: - -```bash -/home/$USER/modmail/ -``` - -You can get your `pipenv_path` with: - -``` -whereis pipenv -``` - -Now, using `nano`, create a service file for systemd with: - -```bash -sudo nano /etc/systemd/system/modmail.service -``` - -and paste in the contents below, replacing `username`, `modmail_path` and `pipenv_path` with yours respectively. `Ctrl+O` and `Enter` to save. `Ctrl+X` to exit the nano editor. - -{% code title="modmail.service" %} -```bash -[Unit] -Description=Modmail bot -After=network.target - -[Service] -User=username # replace this -Group=username # replace this -Restart=always -RestartSec=10 -Type=simple -WorkingDirectory=modmail_path # replace this -ExecStart=pipenv_path run python bot.py # replace pipenv_path only - -[Install] -WantedBy=multi-user.target -``` -{% endcode %} - -Now, start your Modmail bot with: - -```bash -sudo systemctl start modmail -``` - -If everything goes correctly, you should see your bot online. You can also view the logs of your `systemd` process with: - -```bash -sudo journalctl -eu modmail -``` - -With that said, go ahead and enable your Modmail service to auto-restart after crash and reboot with: - -```bash -sudo systemctl enable modmail -``` - -If in the future you need to stop and disable your Modmail service, you can do so with: - -```bash -sudo systemctl stop modmail -sudo systemctl disable modmail -``` - ## Updating Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. @@ -192,8 +109,4 @@ If for some reason your update command isn't working correctly, you can update y cd modmail && git pull ``` -Be sure to restart your bot to apply the changes. If you followed the above instructions on setting up auto-restart, you can do so with: - -```bash -sudo systemctl restart modmail -``` +Be sure to restart your bot to apply the update. diff --git a/installation/local-hosting-vps/fedora.md b/installation/local-hosting-vps/fedora.md index 506b370..9fc9b8c 100644 --- a/installation/local-hosting-vps/fedora.md +++ b/installation/local-hosting-vps/fedora.md @@ -72,89 +72,6 @@ pipenv run bot If no error shows up, it means your bot is now running correctly. -## Setting up auto-restart - -To have the bot auto-restart on crash or system reboot, we will be using `systemd` by making a service file for our bot. - -In order to create the service file, you will first need to know three things, your Linux `username`, your Modmail repository `path` and your `pipenv_path`. - -First, your Linux `username` can be fetched with the following command: - -```bash -whoami -``` - -If you have cloned the Modmail repo as a `root` user, your Modmail repo path should be: - -```bash -/root/modmail -``` - -Otherwise, your path should be: - -```bash -/home/$USER/modmail/ -``` - -You can get your `pipenv_path` with: - -``` -whereis pipenv -``` - -Now, using `nano`, create a service file for `systemd` with: - -```bash -sudo nano /etc/systemd/system/modmail.service -``` - -and paste in the contents below, replacing `username`, `modmail_path` and `pipenv_path` with yours respectively. `Ctrl+O` and `Enter` to save. `Ctrl+X` to exit the nano editor. - -{% code title="modmail.service" %} -```bash -[Unit] -Description=Modmail bot -After=network.target - -[Service] -User=username # replace this -Group=username # replace this -Restart=always -RestartSec=10 -Type=simple -WorkingDirectory=modmail_path # replace this -ExecStart=pipenv_path run python bot.py # replace pipenv_path only - -[Install] -WantedBy=multi-user.target -``` -{% endcode %} - -Now, start your Modmail bot with: - -```bash -sudo systemctl start modmail -``` - -If everything goes correctly, you should see your bot online. You can also view the logs of your systemd process with: - -```bash -sudo journalctl -eu modmail -``` - -With that said, go ahead and enable your Modmail service to auto-restart after crash and reboot with: - -```bash -sudo systemctl enable modmail -``` - -If in the future you need to stop and disable your Modmail service, you can do so with: - -```bash -sudo systemctl stop modmail -sudo systemctl disable modmail -``` - ## Updating Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. @@ -165,9 +82,5 @@ If for some reason your update command isn't working correctly, you can update y cd modmail && git pull ``` -Be sure to restart your bot to apply the changes. If you followed the above instructions on setting up auto-restart, you can do so with: - -```bash -sudo systemctl restart modmail -``` +Be sure to restart your bot to apply the update. diff --git a/installation/local-hosting-vps/ubuntu.md b/installation/local-hosting-vps/ubuntu.md index 36cbe26..2104a67 100644 --- a/installation/local-hosting-vps/ubuntu.md +++ b/installation/local-hosting-vps/ubuntu.md @@ -110,89 +110,6 @@ pipenv run bot If no error shows up, it means your bot is now running correctly. -## Setting up auto-restart - -To have the bot auto-restart on crash or system reboot, we will be using `systemd` by making a service file for our bot. - -In order to create the service file, you will first need to know three things, your Linux `username`, your Modmail repository `path` and your Pipenv `path`. - -First, your Linux `username` can be fetched with the following command: - -```bash -whoami -``` - -If you have cloned the Modmail repo as a `root` user, your Modmail repo path should be: - -```bash -/root/modmail -``` - -Otherwise, your path should be: - -```bash -/home/$USER/modmail/ -``` - -You can get your `pipenv_path` with: - -``` -whereis pipenv -``` - -Now, using `nano`, create a service file for systemd with: - -```bash -sudo nano /etc/systemd/system/modmail.service -``` - -and paste in the contents below, replacing `username`, `modmail_path` and `pipenv_path` with yours respectively. `Ctrl+O` and `Enter` to save. `Ctrl+X` to exit the nano editor. - -{% code title="modmail.service" %} -```bash -[Unit] -Description=Modmail bot -After=network.target - -[Service] -User=username # replace this -Group=username # replace this -Restart=always -RestartSec=10 -Type=simple -WorkingDirectory=modmail_path # replace this -ExecStart=pipenv_path run python bot.py # replace pipenv_path only - -[Install] -WantedBy=multi-user.target -``` -{% endcode %} - -Now, start your Modmail bot with: - -```bash -sudo systemctl start modmail -``` - -If everything goes correctly, you should see your bot online. You can also view the logs of your systemd process with: - -```bash -sudo journalctl -eu modmail -``` - -With that said, go ahead and enable your Modmail service to auto-restart after crash and reboot with: - -```bash -sudo systemctl enable modmail -``` - -If in the future you need to stop and disable your Modmail service, you can do so with: - -```bash -sudo systemctl stop modmail -sudo systemctl disable modmail -``` - ## Updating Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. @@ -203,8 +120,4 @@ If for some reason your update command isn't working correctly, you can update y cd modmail && git pull ``` -Be sure to restart your bot to apply the changes. If you followed the above instructions on setting up auto-restart, you can do so with: - -```bash -sudo systemctl restart modmail -``` +Be sure to restart your bot to apply the update. diff --git a/installation/local-hosting-vps/windows.md b/installation/local-hosting-vps/windows.md index efb0eba..9652e9d 100644 --- a/installation/local-hosting-vps/windows.md +++ b/installation/local-hosting-vps/windows.md @@ -70,91 +70,6 @@ pipenv run bot If no error shows up, it means that your Modmail is now running correctly. -## Setting up auto-restart - -To have the bot auto-restart on crash or system reboot, we will be using `nssm` by making a service for our bot application. - -First, find the Python path of your Modmail pipenv by running `pipenv shell` and `which python` in your Modmail folder. Copy the path that appears in your terminal and paste it in the first line of our next step. - -
- -Second, create a file named `modmail.bat` in your modmail directory with the following contents, replacing `python_path` with the one you copied previously and `python.exe` with `activate.bat`: - -```batch -call python_path -call python bot.py -``` - -The finished file should look something like this: - -{% code title="modmail.bat" %} -```batch -call C:\Users\Raiden\.virtualenvs\modmail-oXWHQUly\Scripts\activate.bat -call python bot.py -``` -{% endcode %} - -Third, download `nssm` by [clicking here](http://nssm.cc/download) and downloading the file under "Latest Release". - -The download will be a `.zip` file so you'll need to extract it first using your file archiver program (such as WinRAR or 7-zip). After that, find `nssm.exe` in the folder corresponding to your OS bit version (these days it should be win64) and copy it's file path: - -
- -As `nssm` itself is only a command-line program, we'll need to use our trusty Terminal to use the application to create our service. So, search up "Powershell" in your start menu, right-click it and click "Run as Administrator". - -Change directory (CD) into the folder path that you copied earlier, the command should look like something like this: - -```powershell -cd "C:\Users\Raiden\Downloads\nssm-2.24\win64" -``` - -{% hint style="info" %} -Wrapping "your folder\directory" on Windows in doublequotes is necessary to make sure spaces in our file path is parsed correctly. -{% endhint %} - -And then, proceed to create a new service for Modmail using `nssm` with: - -```powershell -.\nssm install "Modmail" -``` - -A GUI will pop up where you can fill in the details needed for your Modmail service. Replace the `Path` with the path of your `modmail.bat` script and the `Startup directory` with the path of your Modmail folder as follow: - -

Details on the "Application" tab

- -You can fill in these extra details as you see fit as it's only for your own reference: - -

Details on the "Details" tab

- -You can also optionally specify a log file as output and error in the `I/O` tab, just be sure to create the file beforehand so you can select it in the GUI. - -

Details on the "I/O" tab

- -And finally, click "Install Service" to install your Modmail bot as a service on your Windows system.\ - - -
- -By now you should have the service installed but not yet running. You can start it by using this command below in the open `nssm` Terminal from earlier: - -``` -.\nssm start modmail -``` - -
- -You should be able to see your bot running if everything goes well. You can also verify the status of your Modmail service with: - -``` -.\nssm status modmail -``` - -And if you specified the log output file in your previous step, you should be able to see your current Modmail logs like so: - -
- -And that's it! Your bot will now auto-start everytime you reboot your system. You can also additionally stop and restart your service with `.\nssm stop modmail` and `.\nssm restart modmail` respectively. Refer to [NSSM Documentation](http://nssm.cc/usage) for further customization as this guide is only meant to cover the basic needs adequate for standard Modmail usage. - ## Updating Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. diff --git a/setting-up-auto-restart.md b/setting-up-auto-restart.md new file mode 100644 index 0000000..1531dc2 --- /dev/null +++ b/setting-up-auto-restart.md @@ -0,0 +1,172 @@ +# Setting up auto-restart + +## Using systemd on Linux + +To have the bot auto-restart on crash or system reboot, we will be using `systemd` by making a service file for our bot. + +In order to create the service file, you will first need to know three things, your Linux `username`, your Modmail repository `path` and your Pipenv `path`. + +First, your Linux `username` can be fetched with the following command: + +```bash +whoami +``` + +If you have cloned the Modmail repo as a `root` user, your Modmail repo path should be: + +```bash +/root/modmail +``` + +Otherwise, your path should be: + +```bash +/home/$USER/modmail/ +``` + +You can get your `pipenv_path` with: + +``` +whereis pipenv +``` + +Now, using `nano`, create a service file for systemd with: + +```bash +sudo nano /etc/systemd/system/modmail.service +``` + +and paste in the contents below, replacing `username`, `modmail_path` and `pipenv_path` with yours respectively. `Ctrl+O` and `Enter` to save. `Ctrl+X` to exit the nano editor. + +{% code title="modmail.service" %} +```bash +[Unit] +Description=Modmail bot +After=network.target + +[Service] +User=username # replace this +Group=username # replace this +Restart=always +RestartSec=10 +Type=simple +WorkingDirectory=modmail_path # replace this +ExecStart=pipenv_path run python bot.py # replace pipenv_path only + +[Install] +WantedBy=multi-user.target +``` +{% endcode %} + +Now, start your Modmail bot with: + +```bash +sudo systemctl start modmail +``` + +If everything goes correctly, you should see your bot online. You can also view the logs of your systemd process with: + +```bash +sudo journalctl -eu modmail +``` + +With that said, go ahead and enable your Modmail service to auto-restart after crash and reboot with: + +```bash +sudo systemctl enable modmail +``` + +If in the future you need to stop and disable your Modmail service, you can do so with: + +```bash +sudo systemctl stop modmail +sudo systemctl disable modmail +``` + +## Using pm2 on Linux + + + +## Using nssm on Windows + +To have the bot auto-restart on crash or system reboot, we will be using `nssm` by making a service for our bot application. + +First, find the Python path of your Modmail pipenv by running `pipenv shell` and `which python` in your Modmail folder. Copy the path that appears in your terminal and paste it in the first line of our next step. + +
+ +Second, create a file named `modmail.bat` in your modmail directory with the following contents, replacing `python_path` with the one you copied previously and `python.exe` with `activate.bat`: + +```batch +call python_path +call python bot.py +``` + +The finished file should look something like this: + +{% code title="modmail.bat" %} +```batch +call C:\Users\Raiden\.virtualenvs\modmail-oXWHQUly\Scripts\activate.bat +call python bot.py +``` +{% endcode %} + +Third, download `nssm` by [clicking here](http://nssm.cc/download) and downloading the file under "Latest Release". + +The download will be a `.zip` file so you'll need to extract it first using your file archiver program (such as WinRAR or 7-zip). After that, find `nssm.exe` in the folder corresponding to your OS bit version (these days it should be win64) and copy it's file path: + +
+ +As `nssm` itself is only a command-line program, we'll need to use our trusty Terminal to use the application to create our service. So, search up "Powershell" in your start menu, right-click it and click "Run as Administrator". + +Change directory (CD) into the folder path that you copied earlier, the command should look like something like this: + +```powershell +cd "C:\Users\Raiden\Downloads\nssm-2.24\win64" +``` + +{% hint style="info" %} +Wrapping "your folder\directory" on Windows in doublequotes is necessary to make sure spaces in our file path is parsed correctly. +{% endhint %} + +And then, proceed to create a new service for Modmail using `nssm` with: + +```powershell +.\nssm install "Modmail" +``` + +A GUI will pop up where you can fill in the details needed for your Modmail service. Replace the `Path` with the path of your `modmail.bat` script and the `Startup directory` with the path of your Modmail folder as follow: + +
+ +You can fill in these extra details as you see fit as it's only for your own reference: + +
+ +You can also optionally specify a log file as output and error in the `I/O` tab, just be sure to create the file beforehand so you can select it in the GUI. + +
+ +And finally, click "Install Service" to install your Modmail bot as a service on your Windows system. + +
+ +By now you should have the service installed but not yet running. You can start it by using this command below in the open `nssm` Terminal from earlier: + +``` +.\nssm start modmail +``` + +
+ +You should be able to see your bot running if everything goes well. You can also verify the status of your Modmail service with: + +``` +.\nssm status modmail +``` + +And if you specified the log output file in your previous step, you should be able to see your current Modmail logs like so: + +
+ +And that's it! Your bot will now auto-start everytime you reboot your system. You can also additionally stop and restart your service with `.\nssm stop modmail` and `.\nssm restart modmail` respectively. Refer to [NSSM Documentation](http://nssm.cc/usage) for further customization as this guide is only meant to cover the basic needs adequate for standard Modmail usage. From 50277c1d99ee66f722ba2b5a6adb27ba3a152685 Mon Sep 17 00:00:00 2001 From: Raiden Date: Tue, 11 Apr 2023 11:08:56 +0000 Subject: [PATCH 29/33] GITBOOK-18: Add pm2 auto-restart --- setting-up-auto-restart.md | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/setting-up-auto-restart.md b/setting-up-auto-restart.md index 1531dc2..aea9de1 100644 --- a/setting-up-auto-restart.md +++ b/setting-up-auto-restart.md @@ -1,5 +1,33 @@ # Setting up auto-restart +## Using pm2 on Linux + +`pm2` is a process manager intended for Node.js but can also be used with Python applications, such as our Modmail bot and logviewer. To use `pm2`, we will need to install Node.js. + +#### Installing `pm2` Using `apt`: + +```bash +sudo apt install npm -y && sudo npm i pm2 -g +``` + +#### Installing `pm2` using `dnf`: + +```bash +sudo dnf -y install npm && sudo npm i pm2 -g +``` + +Then, in the Modmail folder, start the Modmail process with: + +``` +sudo pm2 start modmail.sh --name "modmail" +``` + +And then, to make sure that `pm2` stays active and persistent between machine restarts, run the following commands: + +```bash +pm2 save && pm2 startup +``` + ## Using systemd on Linux To have the bot auto-restart on crash or system reboot, we will be using `systemd` by making a service file for our bot. @@ -83,11 +111,7 @@ sudo systemctl stop modmail sudo systemctl disable modmail ``` -## Using pm2 on Linux - - - -## Using nssm on Windows +## Using `nssm` on Windows To have the bot auto-restart on crash or system reboot, we will be using `nssm` by making a service for our bot application. From 471d33dc5a56037039c152ad1b8561b1e5187ddb Mon Sep 17 00:00:00 2001 From: Raiden Date: Tue, 11 Apr 2023 11:17:57 +0000 Subject: [PATCH 30/33] GITBOOK-19: Add community guide description --- README.md | 6 +++--- installation/community-guides.md | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 36d6383..d0598b2 100644 --- a/README.md +++ b/README.md @@ -66,11 +66,11 @@ Support Modmail with your contributions! Whether it be improvements to the docum * Become familiar with [Modmail commands and functionalities](getting-started.md). {% hint style="info" %} -Throughout this documentation when we're referring to bot commands, we will assume the prefix of the bot to be ? and will display them like in this example: ?help.\ +Throughout this documentation when we're referring to bot commands, we will assume the prefix of the bot to be ? and will display them like in this example: ?help.\ \ Optional arguments will be enclosed in square brackets:\ -Example: ?close \[time] \[reason] \[silently]\ +Example: ?close \[time] \[reason] \[silently]\ \ Required arguments will be enclosed in angle brackets:\ -Example: ?contact \ +Example: ?contact \ {% endhint %} diff --git a/installation/community-guides.md b/installation/community-guides.md index b8fabeb..12c48f9 100644 --- a/installation/community-guides.md +++ b/installation/community-guides.md @@ -10,8 +10,8 @@ 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 -Insert description here +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. -## Northflank Guide by raidensakura +## [Northflank](https://blog.project-mei.xyz/2023/4/11/hosting-discord-modmail-with-northflank/) Guide by raidensakura Northflank is a Platform as a Service (PaaS) like Railway that offers abilities to run micro-services like bots, schedule jobs that run periodically and databases with a powerful UI, API and CLI. Their panel is a bit more advanced as compared to Railway but comes with the perk of more customization and features. You will need a valid payment method to verify your account, but will unlock a free tier project that's separated from paid resources. They will not charge your card if you go over resource usage as you have limited allocation per service. From f5421722f837ccc27b6c57b77785c5ba61f3b27a Mon Sep 17 00:00:00 2001 From: Raiden Date: Mon, 8 May 2023 06:57:55 +0800 Subject: [PATCH 31/33] Self-hosting correction and enhancement (#26) * GITBOOK-21: Fix Ubuntu guide to account for multiple python version, add FAQ page * GITBOOK-22: Specify python version, move updating guide to its own page, various minor edits * GITBOOK-23: Remove version from pip command in favor of --default-pip * GITBOOK-24: Fix a few install commands * GITBOOK-25: Add pm2 reference * GITBOOK-26: No subject * GITBOOK-28: Fix Windows guide commands * GITBOOK-29: Update Ubuntu guide * GITBOOK-30: Update Debian & Fedora guide * GITBOOK-31: Update Alma Linux guide --- ...a-docker-explanation-hd-png-1221238558.png | Bin 0 -> 25341 bytes .../assets/Screenshot 2023-04-13 224748.png | Bin 0 -> 37308 bytes SUMMARY.md | 6 +- frequently-asked-questions (1).md | 53 +++++++++++++++ frequently-asked-questions.md | 62 +++++------------- installation/community-guides.md | 2 +- installation/local-hosting-vps/almalinux.md | 47 +++++++------ installation/local-hosting-vps/debian.md | 60 +++++++++-------- installation/local-hosting-vps/docker.md | 6 +- installation/local-hosting-vps/fedora.md | 58 ++++++++-------- installation/local-hosting-vps/ubuntu.md | 61 ++++++++--------- installation/local-hosting-vps/windows.md | 35 +++++----- setting-up-auto-restart.md | 54 ++++++++------- updating (1).md | 38 +++++++++++ updating.md | 48 +++++++------- 15 files changed, 299 insertions(+), 231 deletions(-) create mode 100644 .gitbook/assets/27-272811_containerization-docker-explained-edureka-docker-explanation-hd-png-1221238558.png create mode 100644 .gitbook/assets/Screenshot 2023-04-13 224748.png create mode 100644 frequently-asked-questions (1).md create mode 100644 updating (1).md diff --git a/.gitbook/assets/27-272811_containerization-docker-explained-edureka-docker-explanation-hd-png-1221238558.png b/.gitbook/assets/27-272811_containerization-docker-explained-edureka-docker-explanation-hd-png-1221238558.png new file mode 100644 index 0000000000000000000000000000000000000000..53730352cff49d3ca0d00f7e2e28f6de3a8769c3 GIT binary patch literal 25341 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 literal 0 HcmV?d00001 diff --git a/.gitbook/assets/Screenshot 2023-04-13 224748.png b/.gitbook/assets/Screenshot 2023-04-13 224748.png new file mode 100644 index 0000000000000000000000000000000000000000..33fea16dc97323c4404baeca59b7138ff5f60b05 GIT binary patch literal 37308 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 KT-G@yGywn)T$;83 literal 0 HcmV?d00001 diff --git a/SUMMARY.md b/SUMMARY.md index 2a40184..f31376f 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -16,22 +16,24 @@ * [Heroku](installation/heroku.md) * [Community Guides](installation/community-guides.md) * [Setting up auto-restart](setting-up-auto-restart.md) +* [Updating](updating.md) * [Getting Started](getting-started.md) * [Usage](usage-guide/README.md) * [Plugins](usage-guide/plugins.md) * [Configuration](usage-guide/configuration.md) * [Permissions](usage-guide/permissions.md) +* [Frequently Asked Questions](frequently-asked-questions.md) * [OLD DOCS](old-docs/README.md) * [Installation](installation-1.md) * [Installation (continued)](installation-continued.md) * [Color Names](color-names.md) * [Configuration Variables (Config Vars)](configuration-variables-config-vars.md) * [Configure Modmail and Logviewer](configure-modmail-and-logviewer.md) - * [Frequently Asked Questions](frequently-asked-questions.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](updating.md) + * [Updating]() * [Video Tutorials](video-tutorials.md) diff --git a/frequently-asked-questions (1).md b/frequently-asked-questions (1).md new file mode 100644 index 0000000..e39b59f --- /dev/null +++ b/frequently-asked-questions (1).md @@ -0,0 +1,53 @@ +# Frequently Asked Questions + +> Last Updated: March 16, 2023 + +#### What is Modmail? + +Modmail is a Discord bot, similar to Reddit's Modmail feature. It serves as a shared inbox for server staff to communicate with their users - and vice versa - in a seamless way. + +#### Can I invite Modmail? + +Unfortunately, due to the nature of the bot, there is not a global invite link. Nonetheless, you can obtain a free copy of Modmail for your server. Follow the official tutorial at [https://github.com/modmail-dev/modmail/wiki/Installation](https://github.com/modmail-dev/modmail/wiki/Installation). However, if you don’t want the hassle of installing and maintaining Modmail, we offer installation, hosting, and other cool perks for [Patrons](https://patreon.com/kyber). + +#### How does Modmail work? + +Modmail uses the Discord API to interact with the platform. When someone sends a DM to the bot, it will create a new thread. Members of the moderation team can help the user and once the conversation ended, you will have access to a beautiful log of it online. + +#### Is Modmail safe? + +Your Modmail bot is safe as long as you don't share your bot's token. If you share your token, a "hacker" can take control over your bot. If you shared your bot token by mistake, regenerate a new token via the Discord Developer Portal. + +#### Where is my data stored? + +All your data including settings, blocked users, logs, installed plugins etc. are stored in your MongoDB database. The bot files only contain the stuff needed to run the bot. This means you can move your bot to a different host and still have your data intact, as long as you use the same MongoDB URI. + +#### Can I request new features? + +Modmail is an open-source project, which means you can easily add or request new features. You can make an issue or submit a pull request to the development branch on the repository. [Check out the contribution guidelines.](https://github.com/modmail-dev/modmail/blob/master/CONTRIBUTING.md) + +#### How do I become a support member? + +To join our support team, join our [Discord server](https://discord.gg/cnUpwrnpYb). One of the more experienced members will hold an interview to check if you fit the requirements. + +#### Can I add commands to the bot? + +You can add commands to the bot using plugins. All currently approved plugins can be found in the `?plugin registry` command. You can also see [this page](https://github.com/modmail-dev/modmail/wiki/Unofficial-List-of-Plugins) for an unofficial list of plugins. + +#### My bot is offline, what do I do? + +Join our [Discord server](https://discord.gg/cnUpwrnpYb) and DM Modmail. One of our support members will assist you and help you fix the issue. + +#### How can I donate the developers? + +You can support the developers on the [Patreon page](https://patreon.com/kyber). You will also receive various rewards for it. + +#### Does anyone get any info when I create my own modmail? + +There is not much information we get about your instance of modmail, The only thing what we recieve is the guild-info, For example: The guildname, The amount of members of the guild, the botname, and the bot-owner. Using this we keep track of how many modmail-instances get created on a monthly/yearly base. ( Only modmail-developers can see this ) + +*** + +#### Answer not found? + +Feel free to join our [Discord server](https://discord.gg/cnUpwrnpYb). People will gladly help you with any questions that you have! diff --git a/frequently-asked-questions.md b/frequently-asked-questions.md index e39b59f..a832ca8 100644 --- a/frequently-asked-questions.md +++ b/frequently-asked-questions.md @@ -1,53 +1,27 @@ -# Frequently Asked Questions - -> Last Updated: March 16, 2023 - -#### What is Modmail? - -Modmail is a Discord bot, similar to Reddit's Modmail feature. It serves as a shared inbox for server staff to communicate with their users - and vice versa - in a seamless way. - -#### Can I invite Modmail? - -Unfortunately, due to the nature of the bot, there is not a global invite link. Nonetheless, you can obtain a free copy of Modmail for your server. Follow the official tutorial at [https://github.com/modmail-dev/modmail/wiki/Installation](https://github.com/modmail-dev/modmail/wiki/Installation). However, if you don’t want the hassle of installing and maintaining Modmail, we offer installation, hosting, and other cool perks for [Patrons](https://patreon.com/kyber). - -#### How does Modmail work? - -Modmail uses the Discord API to interact with the platform. When someone sends a DM to the bot, it will create a new thread. Members of the moderation team can help the user and once the conversation ended, you will have access to a beautiful log of it online. - -#### Is Modmail safe? - -Your Modmail bot is safe as long as you don't share your bot's token. If you share your token, a "hacker" can take control over your bot. If you shared your bot token by mistake, regenerate a new token via the Discord Developer Portal. +--- +description: A list of commonly asked questions or problems related to Modmail. +--- -#### Where is my data stored? - -All your data including settings, blocked users, logs, installed plugins etc. are stored in your MongoDB database. The bot files only contain the stuff needed to run the bot. This means you can move your bot to a different host and still have your data intact, as long as you use the same MongoDB URI. - -#### Can I request new features? - -Modmail is an open-source project, which means you can easily add or request new features. You can make an issue or submit a pull request to the development branch on the repository. [Check out the contribution guidelines.](https://github.com/modmail-dev/modmail/blob/master/CONTRIBUTING.md) - -#### How do I become a support member? - -To join our support team, join our [Discord server](https://discord.gg/cnUpwrnpYb). One of the more experienced members will hold an interview to check if you fit the requirements. - -#### Can I add commands to the bot? - -You can add commands to the bot using plugins. All currently approved plugins can be found in the `?plugin registry` command. You can also see [this page](https://github.com/modmail-dev/modmail/wiki/Unofficial-List-of-Plugins) for an unofficial list of plugins. - -#### My bot is offline, what do I do? +# Frequently Asked Questions -Join our [Discord server](https://discord.gg/cnUpwrnpYb) and DM Modmail. One of our support members will assist you and help you fix the issue. +### I tried installing the dependencies with another Python version and it messed up my Pipfile! How can I get the original Pipfile back? -#### How can I donate the developers? +First remove the broken `Pipfile` and `Pipfile.lock` with: -You can support the developers on the [Patreon page](https://patreon.com/kyber). You will also receive various rewards for it. +```bash +rm Pipfile && rm Pipfile.lock +``` -#### Does anyone get any info when I create my own modmail? +Fetch in the changes from the remote repository: -There is not much information we get about your instance of modmail, The only thing what we recieve is the guild-info, For example: The guildname, The amount of members of the guild, the botname, and the bot-owner. Using this we keep track of how many modmail-instances get created on a monthly/yearly base. ( Only modmail-developers can see this ) +```bash +git fetch origin +``` -*** +And then, fetch the original files with: -#### Answer not found? +```bash +git checkout FETCH_HEAD -- Pipfile && git checkout FETCH_HEAD -- Pipfile.lock +``` -Feel free to join our [Discord server](https://discord.gg/cnUpwrnpYb). People will gladly help you with any questions that you have! +### diff --git a/installation/community-guides.md b/installation/community-guides.md index 12c48f9..64ce8f4 100644 --- a/installation/community-guides.md +++ b/installation/community-guides.md @@ -12,6 +12,6 @@ Community guides are not verified by the Modmail team, so use them at your own r 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. -## [Northflank](https://blog.project-mei.xyz/2023/4/11/hosting-discord-modmail-with-northflank/) Guide by raidensakura +## [Northflank](https://blog.project-mei.xyz/2023/04/11/hosting-discord-modmail-on-northflank/) Guide by raidensakura Northflank is a Platform as a Service (PaaS) like Railway that offers abilities to run micro-services like bots, schedule jobs that run periodically and databases with a powerful UI, API and CLI. Their panel is a bit more advanced as compared to Railway but comes with the perk of more customization and features. You will need a valid payment method to verify your account, but will unlock a free tier project that's separated from paid resources. They will not charge your card if you go over resource usage as you have limited allocation per service. diff --git a/installation/local-hosting-vps/almalinux.md b/installation/local-hosting-vps/almalinux.md index dbc4298..34301e1 100644 --- a/installation/local-hosting-vps/almalinux.md +++ b/installation/local-hosting-vps/almalinux.md @@ -4,14 +4,24 @@ description: Deploy Modmail on RHEL / Alma Linux / CentOS server. # Alma Linux +{% hint style="warning" %} +For safety reasons, **DO NOT** install Modmail with a root user. A misbehaving or malicious plugin installed on your Modmail bot can easily access your entire system. If you are unsure how to create a new user on Linux, see [DigitalOcean’s tutorial: How To Create a New Sudo-enabled User](https://www.digitalocean.com/community/tutorials/how-to-create-a-new-sudo-enabled-user-on-ubuntu-20-04-quickstart). +{% endhint %} + Alma Linux 8, 9 and CentOS Stream 8, 9 are based on Red Hat Enterprise Linux (RHEL) 8 and 9 respectively so you can essentially follow this guide if you're running any of the OS mentioned above. ## Prerequisites -* Root access (**`sudo`**). -* Minimum 1GB of RAM -* At least 2GB available disk space. -* Supported releases: Alma Linux 9, Alma Linux 8, CentOS Stream 9, CentOS Stream 8, RHEL 9 and RHEL 8 +1. Root access (**`sudo`**). +2. Minimum 1GB of RAM +3. At least 2GB available disk space. +4. Supported releases: + * Alma Linux 9 + * Alma Linux 8 + * CentOS Stream 9 + * CentOS Stream 8 + * Red Hat Enterprise Linux (RHEL) 9 + * Red Hat Enterprise Linux (RHEL) 8 ## Dependencies @@ -24,7 +34,7 @@ All code blocks should be executed in bash and line by line unless specified oth ### RHEL 9 / Alma Linux 9 / CentOS Stream 9 -Alma Linux 9 have all required packages available in official repositories. Install them with `dnf`: +RHEL 9 and its derivatives have all required packages available in official repositories. Install them with `dnf`: ```bash sudo dnf -y install python39 git @development nano @@ -32,6 +42,8 @@ sudo dnf -y install python39 git @development nano ### RHEL 8 / Alma Linux 8 / CentOS Stream 8.4-8.x +RHEL 8 and its derivatives have all required packages available in official repositories. Install them with `dnf`: + ```bash sudo dnf -y update sudo dnf -y group install development @@ -40,10 +52,9 @@ sudo dnf -y install python39 python39-pip python39-devel nano git ## Installing Bot -In your home directory, clone and cd into the official Modmail repository with: +Clone and change directory into the Modmail folder with: ```bash -cd ~ git clone https://github.com/modmail-dev/modmail cd modmail ``` @@ -51,14 +62,14 @@ cd modmail Inside the Modmail folder, ensure `pip` is installed correctly and is defaulting to Python 3.9 with: ```bash -python3.9 -m ensurepip --default-pip +python3.9 -m ensurepip --upgrade ``` And then, install `pipenv` and the bot dependencies with: ```bash -pip3.9 install pipenv -pipenv install --python 3.9 +python3.9 -m pip install pipenv +python3.9 -m pipenv install --python 3.9 ``` Create a file named `.env` with `nano` and paste all the environmental variables (secrets) needed to run the bot via right-clicking in the nano editor. Refer to the steps in the [parent Installation page](../#preparing-your-environmental-variables) to find where to obtain these. @@ -78,19 +89,7 @@ If using the `nano` editor is a bit of a learning curve, you can always FTP into After your `.env` file is ready, you can now go ahead and try running your bot with: ```bash -pipenv run bot -``` - -If no error shows up, it means your bot is now running correctly. - -## Updating - -Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. - -If for some reason your update command isn't working correctly, you can update your bot by going into your modmail folder and pulling the latest changes from GitHub like so: - -```bash -cd modmail && git pull +python3.9 -m pipenv run bot ``` -Be sure to restart your bot to apply the uupdate. +If no error shows up, it means your bot is now running correctly. You can stop the bot from running with `Ctrl+C` to continue using your terminal. diff --git a/installation/local-hosting-vps/debian.md b/installation/local-hosting-vps/debian.md index c870b72..9046ff8 100644 --- a/installation/local-hosting-vps/debian.md +++ b/installation/local-hosting-vps/debian.md @@ -4,14 +4,22 @@ description: Deploy Modmail on Debian / Raspberry Pi OS. # Debian +{% hint style="warning" %} +For safety reasons, **DO NOT** install Modmail with a root user. A misbehaving or malicious plugin installed on your Modmail bot can easily access your entire system. If you are unsure how to create a new user on Linux, see [DigitalOcean’s tutorial: How To Create a New Sudo-enabled User](https://www.digitalocean.com/community/tutorials/how-to-create-a-new-sudo-enabled-user-on-ubuntu-20-04-quickstart). +{% endhint %} + Raspberry Pi OS 11 Bullseye and Raspberry Pi OS 10 Buster are based on Debian 11 Bullseye and Debian 10 Buster respectively so you can essentially follow this guide if you're running any of the OS mentioned above. ## Prerequisites -* Root access (**`sudo`**). -* Minimum 1GB of RAM -* At least 2GB available disk space. -* Supported releases: Debian 11 Bullseye, Debian 10 Buster, Raspberry Pi OS 11 Bullseye, and Raspberry Pi OS 10 (Legacy) Buster +1. Root access (**`sudo`**). +2. Minimum 1GB of RAM +3. At least 2GB available disk space. +4. Supported releases: + * Debian 11 Bullseye + * Debian 10 Buster + * Raspberry Pi OS 11 Bullseye + * Raspberry Pi OS 10 Buster ## Dependencies @@ -36,8 +44,9 @@ At the time of writing, this will install Python 3.9 from Debian's repository. ### **Debian 10 Buster /** Raspberry Pi OS 10 Buster -You will need to manually compile Python 3.10 from source. Compiling Python may take a while (est. 5-10 minutes). +You will need to manually compile Python 3.10 from source. Compiling Python may take a while (est. 5-10 minutes). Make sure to run line 2-7 all at once. +{% code lineNumbers="true" %} ```bash sudo apt update && sudo apt upgrade -y # Update and upgrade all packages sudo apt install -y software-properties-common \ @@ -52,31 +61,36 @@ cd Python-3.10.9 ./configure --enable-optimizations sudo make altinstall ``` +{% endcode %} -After following this step, make sure to specify the version when running user-level Python commands later in the guide. +After that, ensure `pip` is installed and updated for Python 3.10 with: -For example: +``` +python3.10 -m ensurepip --upgrade +``` -* `pip install pipenv` to `pip3.10 install pipenv` -* `python bot.py` to `python3.10 bot.py` +Then **log out and log back in** to continue the installation steps. ## Installing Bot -In your home directory, clone and cd into the official Modmail repository with: +Clone and change directory into the Modmail folder with: ```bash -cd ~ git clone https://github.com/modmail-dev/modmail cd modmail ``` -Inside the Modmail folder, Install `pipenv` and the bot dependencies with: +Inside the Modmail folder, Install `pipenv` and the bot dependencies with: ```bash -pip install pipenv -pipenv install +python3.9 -m pip install pipenv +python3.9 -m pipenv install --python 3.9 ``` +{% hint style="info" %} +Replace `3.9` with `3.10` on the command above if you followed[ Debian 10 Buster](debian.md#debian-10-buster-raspberry-pi-os-10-buster) method previously. +{% endhint %} + Create a file named `.env` with `nano` and paste all the environmental variables (secrets) needed to run the bot via right-clicking in the nano editor. Refer to the steps in the [parent Installation page](../#preparing-your-environmental-variables) to find where to obtain these. ```bash @@ -94,19 +108,11 @@ If using the `nano` editor is a bit of a learning curve, you can always FTP into After your `.env` file is ready, you can now go ahead and try running your bot with: ```bash -pipenv run bot +python3.9 -m pipenv run bot ``` -If no error shows up, it means your bot is now running correctly. - -## Updating - -Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. - -If for some reason your update command isn't working correctly, you can update your bot by going into your modmail folder and pulling the latest changes from GitHub like so: - -```bash -cd modmail && git pull -``` +{% hint style="info" %} +Replace `3.9` with `3.10` on the command above if you followed[ Debian 10 Buster](debian.md#debian-10-buster-raspberry-pi-os-10-buster) method previously. +{% endhint %} -Be sure to restart your bot to apply the update. +If no error shows up, it means your bot is now running correctly. You can stop the bot from running with `Ctrl+C` to continue using your terminal. diff --git a/installation/local-hosting-vps/docker.md b/installation/local-hosting-vps/docker.md index 60d9a1b..68f65aa 100644 --- a/installation/local-hosting-vps/docker.md +++ b/installation/local-hosting-vps/docker.md @@ -8,6 +8,8 @@ description: Deploy Modmail on Docker. Docker is considered an advanced setup, it is recommended that you understand how Docker works before deciding to use this method. {% endhint %} +

A simple illustration explaining how Docker works

+ ## Prerequisites * Supported OS for Docker @@ -107,9 +109,9 @@ docker run -d --name modmail \ --restart always myname/modmail:latest ``` -## Updating +## Updating on Docker -Auto-update is disabled when running Docker as Docker container state is not persistent across restarts. To update your bot, you will need to run the `docker pull` command in the previous step: [Running the official image for Modmail](docker.md#running-the-official-image-for-modmail) if your image is based from the official repository. After that, you must recreate your container using the `docker rm` and `docker run` command again. +Auto-update is disabled when running Docker as Docker container state is not persistent across restarts. To update your bot, you will need to update the base image by running the `docker pull` command in the previous step: [Running the official image for Modmail](docker.md#running-the-official-image-for-modmail) if your image is based from the official repository. After that, you must recreate your container using the `docker rm` and `docker run` command again. If your image is created locally, simply replace the `docker pull` command with `git pull` and rebuilding your image again. diff --git a/installation/local-hosting-vps/fedora.md b/installation/local-hosting-vps/fedora.md index 9fc9b8c..a5a629b 100644 --- a/installation/local-hosting-vps/fedora.md +++ b/installation/local-hosting-vps/fedora.md @@ -4,16 +4,24 @@ description: Deploy Modmail on a Fedora server. # Fedora +{% hint style="warning" %} +For safety reasons, **DO NOT** install Modmail with a root user. A misbehaving or malicious plugin installed on your Modmail bot can easily access your entire system. If you are unsure how to create a new user on Linux, see [DigitalOcean’s tutorial: How To Create a New Sudo-enabled User](https://www.digitalocean.com/community/tutorials/how-to-create-a-new-sudo-enabled-user-on-ubuntu-20-04-quickstart). +{% endhint %} + ## Prerequisites -* Root access (**`sudo`**). -* Minimum 1GB of RAM -* At least 2GB available disk space. -* Supported releases: Fedora 37, Fedora 36, Fedora 35. +1. Root access (**`sudo`**). +2. Minimum 1GB of RAM +3. At least 2GB available disk space. +4. Supported releases: + * Fedora 38 + * Fedora 37 + * Fedora 36 + * Fedora 35 ## Dependencies -* Python 3.9 +* Python 3.10 * Tools: `git`, `wget`, `nano` * Additional Modmail requirements: `g++` @@ -24,31 +32,29 @@ All code blocks should be executed in bash and line by line unless specified oth Fedora Linux 35 and above has all required packages available in official repositories. Install them with `dnf`. ```bash -sudo dnf -y install python39 git nano g++ gtk3 +sudo dnf -y install python310 git nano g++ gtk3 ``` -## Installing Bot - -In your home directory, clone and cd into the official Modmail repository with: +And then, make sure `pip` is installed for Python 3.10 with: ```bash -cd ~ -git clone https://github.com/modmail-dev/modmail -cd modmail +python3.10 -m ensurepip --upgrade ``` -Inside the Modmail folder, ensure `pip` is installed correctly and is defaulting to Python 3.9 with: +## Installing Bot + +Clone and change directory into the Modmail folder with: ```bash -python3.9 -m ensurepip --default-pip +git clone https://github.com/modmail-dev/modmail +cd modmail ``` And then, install `pipenv` and the bot dependencies with: -```bash -pip install pipenv -pipenv install --python 3.9 -``` +
python3.10 -m pip install pipenv
+python3.10 -m pipenv install --python 3.10
+
Create a file named `.env` with `nano` and paste all the environmental variables (secrets) needed to run the bot via right-clicking in the nano editor. Refer to the steps in the [parent Installation page](../#preparing-your-environmental-variables) to find where to obtain these. @@ -67,20 +73,8 @@ If using the `nano` editor is a bit of a learning curve, you can always FTP into After your `.env` file is ready, you can now go ahead and try running your bot with: ```bash -pipenv run bot -``` - -If no error shows up, it means your bot is now running correctly. - -## Updating - -Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. - -If for some reason your update command isn't working correctly, you can update your bot by going into your modmail folder and pulling the latest changes from GitHub like so: - -```bash -cd modmail && git pull +python3.10 -m pipenv run bot ``` -Be sure to restart your bot to apply the update. +If no error shows up, it means your bot is now running correctly. You can stop the bot from running with `Ctrl+C` to continue using your terminal. diff --git a/installation/local-hosting-vps/ubuntu.md b/installation/local-hosting-vps/ubuntu.md index 2104a67..5f73513 100644 --- a/installation/local-hosting-vps/ubuntu.md +++ b/installation/local-hosting-vps/ubuntu.md @@ -4,12 +4,19 @@ description: Deploy Modmail on an Ubuntu server. # Ubuntu +{% hint style="warning" %} +For safety reasons, **DO NOT** install Modmail with a root user. A misbehaving or malicious plugin installed on your Modmail bot can easily access your entire system. If you are unsure how to create a new user on Linux, see [DigitalOcean’s tutorial: How To Create a New Sudo-enabled User](https://www.digitalocean.com/community/tutorials/how-to-create-a-new-sudo-enabled-user-on-ubuntu-20-04-quickstart). +{% endhint %} + ## Prerequisites -* Root access (**`sudo`**). -* Minimum 1GB of RAM -* At least 2GB available disk space. -* Supported releases: Ubuntu 18.04 LTS, Ubuntu 20.04 LTS, Ubuntu 22.04 LTS. +1. Root access (**`sudo`**). +2. Minimum 1GB of RAM +3. At least 2GB available disk space. +4. Supported releases: + * Ubuntu 18.04 LTS (Bionic Beaver) + * Ubuntu 20.04 LTS (Focal Fossa) + * Ubuntu 22.04 LTS (Jammy Jellyfish) ## Dependencies @@ -38,15 +45,22 @@ Now install the pre-requirements with `apt`, you can copy and run these 3 lines ```bash sudo apt -y install python3.10 python3.10-dev python3.10-venv python3-pip \ libcairo2-dev libffi-dev g++ \ - git wget nano + git nano +``` + +After that, install `pipenv` with: + +```bash +python3.10 -m pip install pipenv ```
Failed to install Python 3.10? -You can manually compile Python instead of adding using the Deadsnakes PPA. Compiling Python may take a while (est. 5-10 minutes). +You can manually compile Python instead of adding using the Deadsnakes PPA. Compiling Python may take a while (est. 5-10 minutes). Copy and run line 2-7 all at once. +{% code lineNumbers="true" %} ```bash sudo apt update && sudo apt upgrade -y # Update and upgrade all packages sudo apt install -y software-properties-common \ @@ -61,32 +75,23 @@ cd Python-3.10.9 ./configure --enable-optimizations make altinstall ``` - -After following this step, make sure to specify the version when running user-level Python commands later in the guide. - -For example: - -* `pip install pipenv` to `pip3.10 install pipenv` -* `python bot.py` to `python3.10 bot.py` +{% endcode %}
## Installing Bot -In your home directory, clone and cd into the official Modmail repository with: +Clone and change directory into the Modmail folder with: ```bash -cd ~ git clone https://github.com/modmail-dev/modmail cd modmail ``` -Inside the Modmail folder, Install `pipenv` and the bot dependencies with: +Inside the Modmail folder, Install `pipenv` and its Python packages with: -```bash -pip install pipenv -pipenv install -``` +
python3.10 -m pipenv install --python 3.10
+
Create a file named `.env` with `nano` and paste all the environmental variables (secrets) needed to run the bot via right-clicking in the nano editor. Refer to the steps in the [parent Installation page](../#preparing-your-environmental-variables) to find where to obtain these. @@ -105,19 +110,7 @@ If using the `nano` editor is a bit of a learning curve, you can always FTP into After your `.env` file is ready, you can now go ahead and try running your bot with: ```bash -pipenv run bot -``` - -If no error shows up, it means your bot is now running correctly. - -## Updating - -Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. - -If for some reason your update command isn't working correctly, you can update your bot by going into your Modmail folder and pulling the latest changes from GitHub like so: - -```bash -cd modmail && git pull +python3.10 -m pipenv run bot ``` -Be sure to restart your bot to apply the update. +If no error shows up, it means your bot is now running correctly. You can stop the bot from running with `Ctrl+C` to continue using your terminal. diff --git a/installation/local-hosting-vps/windows.md b/installation/local-hosting-vps/windows.md index 9652e9d..aa19ea1 100644 --- a/installation/local-hosting-vps/windows.md +++ b/installation/local-hosting-vps/windows.md @@ -6,9 +6,11 @@ description: Deploy Modmail on a Windows machine. ## Prerequisites -* Minimum 2GB of RAM**\*** -* At least 2GB available disk space. -* Supported Windows version: Windows 10 or Windows 11. +1. Minimum 2GB of RAM\* +2. At least 2GB available disk space. +3. Supported Windows version: + * Windows 10 + * Windows 11 {% hint style="info" %} Note that while it is possible to run Modmail with even less memory, Windows 10 itself recommend at least 2GB (4GB for Windows 11). This guide assumes the lowest threshold to comfortably run Modmail without possibly running into any resource bottleneck. @@ -40,6 +42,13 @@ choco upgrade git --params "/GitOnlyOnPath /WindowsTerminal" -y choco upgrade python310 -y ``` +After that, ensure `pip` and `pipenv` are installed and updated for Python 3.10 with: + +```powershell +py -3.10 -m ensurepip --upgrade +py -3.10 -m pip install pipenv +``` + After the above installation has finished, download and install the **GTK runtime for Windows** by [clicking here](https://github.com/tschoonj/GTK-for-Windows-Runtime-Environment-Installer/releases/latest). ## Installing Bot @@ -49,13 +58,14 @@ In any folder location of your choice, `Shift+Right Click` and click on `Open Po In your PowerShell window, run these commands to clone the official Modmail repository locally and `cd` into the folder: ```powershell -git clone https://github.com/modmail-dev/modmail; cd modmail +git clone https://github.com/modmail-dev/modmail +cd modmail ``` -Install Pipenv and project dependencies with: +Install project dependencies inside Modmail's pipenv with: ```powershell -pip install pipenv; pipenv install +py -3.10 -m pipenv install ``` Create a new file in the modmail folder named `.env` and paste in your environmental variables needed to run Modmail. Refer to the steps in the [parent Installation page](../#preparing-your-environmental-variables) to find where to obtain these. @@ -65,19 +75,8 @@ Create a new file in the modmail folder named `.env` and paste in your environme Lastly, in your PowerShell window simply enter the command below to run your Modmail bot: ```powershell -pipenv run bot +py -3.10 -m pipenv run bot ``` If no error shows up, it means that your Modmail is now running correctly. -## Updating - -Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. - -If for some reason your update command isn't working correctly, you can update your bot by opening PowerShell or any terminal application in your modmail folder and pulling the latest changes from GitHub like so: - -``` -git pull -``` - -After that, simply restart your bot to apply the latest changes. diff --git a/setting-up-auto-restart.md b/setting-up-auto-restart.md index aea9de1..287c1b7 100644 --- a/setting-up-auto-restart.md +++ b/setting-up-auto-restart.md @@ -1,25 +1,31 @@ # Setting up auto-restart -## Using pm2 on Linux +## Using PM2 on Linux -`pm2` is a process manager intended for Node.js but can also be used with Python applications, such as our Modmail bot and logviewer. To use `pm2`, we will need to install Node.js. +PM2 is a process manager originally intended for Node.js but can also be used with Python applications, such as our Modmail bot and Logviewer. To use `pm2`, we will need to install Node Package Manager (`npm`). -#### Installing `pm2` Using `apt`: +#### Installing `pm2` Using `apt` (Ubuntu, Debian, etc): ```bash sudo apt install npm -y && sudo npm i pm2 -g ``` -#### Installing `pm2` using `dnf`: +#### Installing `pm2` using `dnf` (Fedora, Alma Linux, etc): ```bash sudo dnf -y install npm && sudo npm i pm2 -g ``` -Then, in the Modmail folder, start the Modmail process with: +Then, in the Modmail folder, start the Modmail process in the background with: ``` -sudo pm2 start modmail.sh --name "modmail" +pm2 start modmail.sh --name "modmail" +``` + +You can see the logs of your Modmail process with: + +``` +pm2 logs modmail ``` And then, to make sure that `pm2` stays active and persistent between machine restarts, run the following commands: @@ -28,28 +34,28 @@ And then, to make sure that `pm2` stays active and persistent between machine re pm2 save && pm2 startup ``` -## Using systemd on Linux - -To have the bot auto-restart on crash or system reboot, we will be using `systemd` by making a service file for our bot. - -In order to create the service file, you will first need to know three things, your Linux `username`, your Modmail repository `path` and your Pipenv `path`. - -First, your Linux `username` can be fetched with the following command: +Here's some of the other PM2 commands for future reference: ```bash -whoami +pm2 restart modmail +pm2 reload modmail +pm2 stop modmail +pm2 delete modmail +pm2 list ``` -If you have cloned the Modmail repo as a `root` user, your Modmail repo path should be: +## Using systemd on Linux -```bash -/root/modmail -``` +`systemd` is a built-in service manager for most Linux systems. It's primary used to manage background applications and services and to make applications auto-restart on crash and run on system startup. -Otherwise, your path should be: +We will be using `systemd` for Modmail by making a service file for our bot. + +In order to create the service file, you will first need to know three things, your Linux `username`, your Modmail folder location as `modmail_path` and your Pipenv location as `pipenv_path`. + +First, your Linux `username` can be fetched with the following command: ```bash -/home/$USER/modmail/ +whoami ``` You can get your `pipenv_path` with: @@ -111,7 +117,11 @@ sudo systemctl stop modmail sudo systemctl disable modmail ``` -## Using `nssm` on Windows +## Using PM2 on Windows + +Todo: [https://github.com/jessety/pm2-installer](https://github.com/jessety/pm2-installer) + +## Using NSSM on Windows To have the bot auto-restart on crash or system reboot, we will be using `nssm` by making a service for our bot application. @@ -150,7 +160,7 @@ cd "C:\Users\Raiden\Downloads\nssm-2.24\win64" ``` {% hint style="info" %} -Wrapping "your folder\directory" on Windows in doublequotes is necessary to make sure spaces in our file path is parsed correctly. +Wrapping "your folder\directory" on Windows in double quotes is necessary to make sure spaces in our file path is parsed correctly. {% endhint %} And then, proceed to create a new service for Modmail using `nssm` with: diff --git a/updating (1).md b/updating (1).md new file mode 100644 index 0000000..e2485ce --- /dev/null +++ b/updating (1).md @@ -0,0 +1,38 @@ +# Updating + +## Updating Modmail + +You can update Modmail on your Heroku account whenever changes are made to the repository. If you want to update while hosting locally (not Heroku), simply type `git pull` in your terminal and install the requirements again with `pipenv install`. + +## Forking the repo + +Before you get started, you must [fork](https://github.com/modmail-dev/modmail/fork) the repo first if you are using Heroku and want to update the bot. + +### Syncing a fork branch from the web UI + +1. On GitHub, navigate to the main page of the forked repository that you want to sync with the upstream repository. +2. Select the Sync fork dropdown. + + ![sync-fork-dropdown](https://user-images.githubusercontent.com/70805800/194696934-5333af5d-165e-4873-b5b7-bd01f0461185.png) +3. Then click Update branch. + + ![update-branch-button](https://user-images.githubusercontent.com/70805800/194696947-68891d50-a624-4901-a03d-e49564852a23.png) + +If the changes from the upstream repository cause conflicts, GitHub will prompt you to create a pull request to resolve the conflicts. + +### I want to enable automatic updates + +1. Create a GitHub account +2. [Fork](https://github.com/modmail-dev/modmail/fork) the repository +3. Add GITHUB\_TOKEN into your configuration variables from https://github.com/settings/tokens with the repo scope ([Guide](https://github.com/modmail-dev/modmail/wiki/Installation-\(cont.\)#4-how-to-obtain-your-github\_token---required-for-the-update-command-)). +4. Link your GitHub account to heroku ![](https://i.imgur.com/qjWraS0.png) +5. Turn on automatic deploys ![](https://i.imgur.com/jgUVl7f.png) +6. Restart the bot + +### I want to update the bot once + +[Click here to create a new pull request to your fork](https://github.com/modmail-dev/modmail/pull/new/master). Select `compare across forks`, make the base repository `yourusername/modmail` and ensure the branch is set to master. Put any title you want and create the pull request. On the page that comes after this, merge the pull request. + +You then want to go to your modmail application in Heroku, connect your modmail fork via the `Deploy` tab and deploy the `master` branch. + +You can turn on auto-deploy for the master branch if you don't want to go through the process of logging into Heroku and deploying the branch every time changes to the repo are made in the future. However, you will have to make a pull request to update your fork every time. diff --git a/updating.md b/updating.md index e2485ce..bfb504f 100644 --- a/updating.md +++ b/updating.md @@ -1,38 +1,36 @@ -# Updating - -## Updating Modmail +--- +description: Guide on how to update the Modmail bot. +--- -You can update Modmail on your Heroku account whenever changes are made to the repository. If you want to update while hosting locally (not Heroku), simply type `git pull` in your terminal and install the requirements again with `pipenv install`. - -## Forking the repo +# Updating -Before you get started, you must [fork](https://github.com/modmail-dev/modmail/fork) the repo first if you are using Heroku and want to update the bot. +Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. -### Syncing a fork branch from the web UI +If for some reason your update command isn't working correctly, you can update your bot by going into your Modmail folder and pulling the latest changes from GitHub with the steps below. -1. On GitHub, navigate to the main page of the forked repository that you want to sync with the upstream repository. -2. Select the Sync fork dropdown. +First, determine whether you have the official Modmail repository cloned or a fork by observing the output of the command below: - ![sync-fork-dropdown](https://user-images.githubusercontent.com/70805800/194696934-5333af5d-165e-4873-b5b7-bd01f0461185.png) -3. Then click Update branch. +``` +cat .git/config +``` - ![update-branch-button](https://user-images.githubusercontent.com/70805800/194696947-68891d50-a624-4901-a03d-e49564852a23.png) +If the output shows this exact URL as shown below, -If the changes from the upstream repository cause conflicts, GitHub will prompt you to create a pull request to resolve the conflicts. +``` +[remote "origin"] + url = https://github.com/modmail-dev/modmail.git +``` -### I want to enable automatic updates +you can go ahead and run the command below to pull in the latest changes: -1. Create a GitHub account -2. [Fork](https://github.com/modmail-dev/modmail/fork) the repository -3. Add GITHUB\_TOKEN into your configuration variables from https://github.com/settings/tokens with the repo scope ([Guide](https://github.com/modmail-dev/modmail/wiki/Installation-\(cont.\)#4-how-to-obtain-your-github\_token---required-for-the-update-command-)). -4. Link your GitHub account to heroku ![](https://i.imgur.com/qjWraS0.png) -5. Turn on automatic deploys ![](https://i.imgur.com/jgUVl7f.png) -6. Restart the bot +```bash +git pull +``` -### I want to update the bot once +Else, it means that your repository is a fork and must update (aka sync) it independently. If your repository is hosted on GitHub, click on the button on your repo's GitHub URL as highlighted below: -[Click here to create a new pull request to your fork](https://github.com/modmail-dev/modmail/pull/new/master). Select `compare across forks`, make the base repository `yourusername/modmail` and ensure the branch is set to master. Put any title you want and create the pull request. On the page that comes after this, merge the pull request. +
-You then want to go to your modmail application in Heroku, connect your modmail fork via the `Deploy` tab and deploy the `master` branch. +Run the `git pull` command above locally after syncing your fork. -You can turn on auto-deploy for the master branch if you don't want to go through the process of logging into Heroku and deploying the branch every time changes to the repo are made in the future. However, you will have to make a pull request to update your fork every time. +And then, be sure to restart your bot to apply the update. From dfcfefe4738a157e0f6ee57eb6717cde610ac3ac Mon Sep 17 00:00:00 2001 From: Raiden Date: Sat, 15 Jul 2023 00:02:19 +0800 Subject: [PATCH 32/33] Small correction (#27) Signed-off-by: Raiden --- installation/local-hosting-vps/windows.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installation/local-hosting-vps/windows.md b/installation/local-hosting-vps/windows.md index aa19ea1..a93bfaf 100644 --- a/installation/local-hosting-vps/windows.md +++ b/installation/local-hosting-vps/windows.md @@ -65,7 +65,7 @@ cd modmail Install project dependencies inside Modmail's pipenv with: ```powershell -py -3.10 -m pipenv install +py -3.10 -m pipenv install --python 3.10 ``` Create a new file in the modmail folder named `.env` and paste in your environmental variables needed to run Modmail. Refer to the steps in the [parent Installation page](../#preparing-your-environmental-variables) to find where to obtain these. From 12335a3daa4c9c2bc81ba7b41155567d10aa6bdb Mon Sep 17 00:00:00 2001 From: Stephen <48072084+StephenDaDev@users.noreply.github.com> Date: Tue, 31 Oct 2023 20:02:45 -0400 Subject: [PATCH 33/33] Update windows.md (#29) Signed-off-by: Stephen <48072084+StephenDaDev@users.noreply.github.com> --- installation/local-hosting-vps/windows.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installation/local-hosting-vps/windows.md b/installation/local-hosting-vps/windows.md index a93bfaf..aa19ea1 100644 --- a/installation/local-hosting-vps/windows.md +++ b/installation/local-hosting-vps/windows.md @@ -65,7 +65,7 @@ cd modmail Install project dependencies inside Modmail's pipenv with: ```powershell -py -3.10 -m pipenv install --python 3.10 +py -3.10 -m pipenv install ``` Create a new file in the modmail folder named `.env` and paste in your environmental variables needed to run Modmail. Refer to the steps in the [parent Installation page](../#preparing-your-environmental-variables) to find where to obtain these.