From 13ae2005bb12fac579f1bc0b6194e083468fdd32 Mon Sep 17 00:00:00 2001 From: Raiden Date: Mon, 22 May 2023 21:13:15 +0800 Subject: [PATCH] Add new mention_message config, black + ruff --- .github/workflows/docker-image.yml | 4 +- .github/workflows/lints.yml | 8 +- CHANGELOG.md | 1 + Pipfile | 2 +- Pipfile.lock | 122 ++++++----------------------- bot.py | 7 +- cogs/modmail.py | 10 +-- cogs/plugins.py | 5 +- cogs/utility.py | 39 ++++++--- core/clients.py | 7 +- core/config.py | 8 +- core/models.py | 5 +- core/paginator.py | 4 +- core/thread.py | 31 +++++--- core/time.py | 10 ++- core/utils.py | 1 - pyproject.toml | 17 +++- 17 files changed, 119 insertions(+), 162 deletions(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 484cf5e1ba..9c353dbcb9 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -1,10 +1,10 @@ -name: Create and publish a Docker image +name: Docker Image on: push: branches: - - 'main' + - 'stable' - 'develop' tags: - 'v*' diff --git a/.github/workflows/lints.yml b/.github/workflows/lints.yml index b839483821..1b5b3e9ed2 100644 --- a/.github/workflows/lints.yml +++ b/.github/workflows/lints.yml @@ -1,4 +1,4 @@ -name: Modmail Workflow +name: Checks on: [push, pull_request] @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.9', '3.10'] + python-version: ['3.10'] name: Python ${{ matrix.python-version }} on ubuntu-latest @@ -22,8 +22,8 @@ jobs: run: | python -m pip install --upgrade pip pipenv pipenv install --dev --system - - name: Pylint - run: pylint ./bot.py cogs/*.py core/*.py --exit-zero -r y + - name: Ruff + run: ruff . --no-fix continue-on-error: true - name: Black run: | diff --git a/CHANGELOG.md b/CHANGELOG.md index de8dbcfa94..6246cb88aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ however, insignificant breaking changes do not guarantee a major version bump, s - New .env config option: `REGISTRY_PLUGINS_ONLY`, restricts to only allow adding registry plugins. ([PR #3247](https://github.com/modmail-dev/modmail/pull/3247)) - Added custom database name detection in `CONNECTION_URI` - Added dpy and python version info in `?about` embed and credit for contributors +- New config option: `mention_message`, this will include an additional configurable message next to role mention on thread creation. Defaults to None. ### Changed - Guild icons in embed footers and author urls now have a fixed size of 128. ([PR #3261](https://github.com/modmail-dev/modmail/pull/3261)) diff --git a/Pipfile b/Pipfile index fc7e0c4a7c..005f92933c 100644 --- a/Pipfile +++ b/Pipfile @@ -5,8 +5,8 @@ verify_ssl = true [dev-packages] black = "==22.3.0" -pylint = "~=2.9.3" typing-extensions = "==4.2.0" +ruff = "*" [packages] aiohttp = "==3.8.1" diff --git a/Pipfile.lock b/Pipfile.lock index f592797421..2ff00239bd 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "085a80eac599fd2914a45d3898b50cf40b4ff9bfe6f9cffbb85d16a38eb19270" + "sha256": "f075765f2e309b131c30e8469fdc65a9636061687e1826849a7fce4fe21e5c49" }, "pipfile-spec": 6, "requires": {}, @@ -827,14 +827,6 @@ } }, "develop": { - "astroid": { - "hashes": [ - "sha256:3975a0bd5373bdce166e60c851cfcbaf21ee96de80ec518c1f4cb3e94c3fb334", - "sha256:ab7f36e8a78b8e54a62028ba6beef7561db4cdb6f2a5009ecc44a6f42b5697ef" - ], - "markers": "python_version ~= '3.6'", - "version": "==2.6.6" - }, "black": { "hashes": [ "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b", @@ -880,63 +872,6 @@ "index": "pypi", "version": "==0.4.6" }, - "isort": { - "hashes": [ - "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504", - "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6" - ], - "markers": "python_full_version >= '3.8.0'", - "version": "==5.12.0" - }, - "lazy-object-proxy": { - "hashes": [ - "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382", - "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82", - "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9", - "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494", - "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46", - "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30", - "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63", - "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4", - "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae", - "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be", - "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701", - "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd", - "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006", - "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a", - "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586", - "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8", - "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821", - "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07", - "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b", - "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171", - "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b", - "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2", - "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7", - "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4", - "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8", - "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e", - "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f", - "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda", - "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4", - "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e", - "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671", - "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11", - "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455", - "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734", - "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb", - "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59" - ], - "markers": "python_version >= '3.7'", - "version": "==1.9.0" - }, - "mccabe": { - "hashes": [ - "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", - "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" - ], - "version": "==0.6.1" - }, "mypy-extensions": { "hashes": [ "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", @@ -955,35 +890,34 @@ }, "platformdirs": { "hashes": [ - "sha256:47692bc24c1958e8b0f13dd727307cff1db103fca36399f457da8e05f222fdc4", - "sha256:7954a68d0ba23558d753f73437c55f89027cf8f5108c19844d4b82e5af396335" + "sha256:412dae91f52a6f84830f39a8078cecd0e866cb72294a5c66808e74d5e88d251f", + "sha256:e2378146f1964972c03c085bb5662ae80b2b8c06226c54b2ff4aa9483e8a13a5" ], "markers": "python_version >= '3.7'", - "version": "==3.5.0" - }, - "pylint": { - "hashes": [ - "sha256:2e1a0eb2e8ab41d6b5dbada87f066492bb1557b12b76c47c2ee8aa8a11186594", - "sha256:8b838c8983ee1904b2de66cce9d0b96649a91901350e956d78f289c3bc87b48e" + "version": "==3.5.1" + }, + "ruff": { + "hashes": [ + "sha256:03ff42bc91ceca58e0f0f072cb3f9286a9208f609812753474e799a997cdad1a", + "sha256:11ddcfbab32cf5c420ea9dd5531170ace5a3e59c16d9251c7bd2581f7b16f602", + "sha256:1f19f59ca3c28742955241fb452f3346241ddbd34e72ac5cb3d84fadebcf6bc8", + "sha256:3569bcdee679045c09c0161fabc057599759c49219a08d9a4aad2cc3982ccba3", + "sha256:374b161753a247904aec7a32d45e165302b76b6e83d22d099bf3ff7c232c888f", + "sha256:3f5dc7aac52c58e82510217e3c7efd80765c134c097c2815d59e40face0d1fe6", + "sha256:56347da63757a56cbce7d4b3d6044ca4f1941cd1bbff3714f7554360c3361f83", + "sha256:5a20658f0b97d207c7841c13d528f36d666bf445b00b01139f28a8ccb80093bb", + "sha256:6da8ee25ef2f0cc6cc8e6e20942c1d44d25a36dce35070d7184655bc14f63f63", + "sha256:9ca0a1ddb1d835b5f742db9711c6cf59f213a1ad0088cb1e924a005fd399e7d8", + "sha256:a374434e588e06550df0f8dcb74777290f285678de991fda4e1063c367ab2eb2", + "sha256:bbeb857b1e508a4487bdb02ca1e6d41dd8d5ac5335a5246e25de8a3dff38c1ff", + "sha256:bd81b8e681b9eaa6cf15484f3985bd8bd97c3d114e95bff3e8ea283bf8865062", + "sha256:cec2f4b84a14b87f1b121488649eb5b4eaa06467a2387373f750da74bdcb5679", + "sha256:e131b4dbe798c391090c6407641d6ab12c0fa1bb952379dde45e5000e208dabb", + "sha256:f062059b8289a4fab7f6064601b811d447c2f9d3d432a17f689efe4d68988450", + "sha256:f3b59ccff57b21ef0967ea8021fd187ec14c528ec65507d8bcbe035912050776" ], "index": "pypi", - "version": "==2.9.6" - }, - "setuptools": { - "hashes": [ - "sha256:23aaf86b85ca52ceb801d32703f12d77517b2556af839621c641fca11287952b", - "sha256:f104fa03692a2602fa0fec6c6a9e63b6c8a968de13e17c026957dd1f53d80990" - ], - "markers": "python_version >= '3.7'", - "version": "==67.7.2" - }, - "toml": { - "hashes": [ - "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", - "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.10.2" + "version": "==0.0.269" }, "tomli": { "hashes": [ @@ -1000,12 +934,6 @@ ], "index": "pypi", "version": "==4.2.0" - }, - "wrapt": { - "hashes": [ - "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7" - ], - "version": "==1.12.1" } } } diff --git a/bot.py b/bot.py index c73ae4d54b..6855bd9cb8 100644 --- a/bot.py +++ b/bot.py @@ -6,11 +6,11 @@ import hashlib import logging import os +import platform import re import string import struct import sys -import platform import typing from datetime import datetime, timezone from subprocess import PIPE @@ -18,14 +18,13 @@ import discord import isodate -from aiohttp import ClientSession, ClientResponseError +from aiohttp import ClientResponseError, ClientSession from discord.ext import commands, tasks -from discord.ext.commands.view import StringView from discord.ext.commands import MemberConverter +from discord.ext.commands.view import StringView from emoji import UNICODE_EMOJI from pkg_resources import parse_version - try: # noinspection PyUnresolvedReferences from colorama import init diff --git a/cogs/modmail.py b/cogs/modmail.py index d72d053b36..d673fce4ba 100644 --- a/cogs/modmail.py +++ b/cogs/modmail.py @@ -1,19 +1,18 @@ import asyncio import re -from datetime import datetime, timezone +from datetime import timezone from itertools import zip_longest -from typing import Optional, Union, List, Tuple, Literal from types import SimpleNamespace +from typing import List, Literal, Optional, Tuple, Union import discord +from dateutil import parser from discord.ext import commands -from discord.ext.commands.view import StringView from discord.ext.commands.cooldowns import BucketType +from discord.ext.commands.view import StringView from discord.role import Role from discord.utils import escape_markdown -from dateutil import parser - from core import checks from core.models import DMDisabled, PermissionLevel, SimilarCategoryConverter, getLogger from core.paginator import EmbedPaginatorSession @@ -1647,7 +1646,6 @@ async def blocked(self, ctx): roles = [] users = [] - now = ctx.message.created_at blocked_users = list(self.bot.blocked_users.items()) for id_, reason in blocked_users: diff --git a/cogs/plugins.py b/cogs/plugins.py index 7baf5b51e1..bd6e041c9b 100644 --- a/cogs/plugins.py +++ b/cogs/plugins.py @@ -6,8 +6,8 @@ import sys import typing import zipfile -from importlib import invalidate_caches from difflib import get_close_matches +from importlib import invalidate_caches from pathlib import Path, PurePath from re import match from site import USER_SITE @@ -15,13 +15,12 @@ import discord from discord.ext import commands - from pkg_resources import parse_version from core import checks from core.models import PermissionLevel, getLogger from core.paginator import EmbedPaginatorSession -from core.utils import truncate, trigger_typing +from core.utils import trigger_typing, truncate logger = getLogger(__name__) diff --git a/cogs/utility.py b/cogs/utility.py index 35fd81cf3a..576d8e5820 100644 --- a/cogs/utility.py +++ b/cogs/utility.py @@ -3,8 +3,8 @@ import os import random import re -import traceback import sys +import traceback from contextlib import redirect_stdout from difflib import get_close_matches from io import BytesIO, StringIO @@ -24,16 +24,9 @@ from core import checks, utils from core.changelog import Changelog -from core.models import ( - HostingMethod, - InvalidConfigError, - PermissionLevel, - UnseenFormatter, - getLogger, -) -from core.utils import trigger_typing, truncate +from core.models import HostingMethod, InvalidConfigError, PermissionLevel, UnseenFormatter, getLogger from core.paginator import EmbedPaginatorSession, MessagePaginatorSession - +from core.utils import trigger_typing, truncate logger = getLogger(__name__) @@ -333,7 +326,6 @@ async def about(self, ctx): desc += "an organised manner." embed.description = desc - repo_url = "https://github.com/modmail-dev/modmail/graphs/contributors" python_version = "{}.{}.{}".format(*sys.version_info[:3]) dpy_version = discord.__version__ @@ -710,6 +702,13 @@ async def mention(self, ctx, *user_or_role: Union[discord.Role, discord.Member, Do not ping `@everyone` to set mention to everyone, use "everyone" or "all" instead. + You can also additionally configure a custom message to show after the mention. + You can use `[prefix]` as placeholder for bot prefix. + + Examples: + - `{prefix}mention message Use [prefix]reply to reply` + - `{prefix}mention message disable` + Notes: - Type only `{prefix}mention` to retrieve your current "mention" message. - `{prefix}mention disable` to disable mention. @@ -720,6 +719,24 @@ async def mention(self, ctx, *user_or_role: Union[discord.Role, discord.Member, embed = discord.Embed( title="Current mention:", color=self.bot.main_color, description=str(current) ) + elif isinstance(user_or_role[0], str) and user_or_role[0].lower() in ("message", "msg"): + option = user_or_role[1].lower() + if option == "disable": + embed = discord.Embed( + description="Disabled mention message on thread creation.", + color=self.bot.main_color, + ) + self.bot.config["mention_message"] = None + else: + msg = " ".join(user_or_role[1:]) + mention_msg = msg.replace("[prefix]", self.bot.prefix) + embed = discord.Embed( + title="Changed mention message!", + description=f'On thread creation the bot now says "{current} {mention_msg}".', + color=self.bot.main_color, + ) + self.bot.config["mention_message"] = msg + await self.bot.config.update() elif ( len(user_or_role) == 1 and isinstance(user_or_role[0], str) diff --git a/core/clients.py b/core/clients.py index ad10b66709..4530d41bee 100644 --- a/core/clients.py +++ b/core/clients.py @@ -1,13 +1,12 @@ import secrets import sys from json import JSONDecodeError -from typing import Any, Dict, Union, Optional +from typing import Any, Dict, Optional, Union import discord -from discord import Member, DMChannel, TextChannel, Message +from aiohttp import ClientResponse, ClientResponseError +from discord import DMChannel, Member, Message, TextChannel from discord.ext import commands - -from aiohttp import ClientResponseError, ClientResponse from motor.motor_asyncio import AsyncIOMotorClient from pymongo.errors import ConfigurationError from pymongo.uri_parser import parse_uri diff --git a/core/config.py b/core/config.py index c3cf1d9140..4c1d2fb91f 100644 --- a/core/config.py +++ b/core/config.py @@ -5,14 +5,13 @@ import typing from copy import deepcopy -from dotenv import load_dotenv -import isodate - import discord +import isodate from discord.ext.commands import BadArgument +from dotenv import load_dotenv from core._color_data import ALL_COLORS -from core.models import DMDisabled, InvalidConfigError, Default, getLogger +from core.models import Default, DMDisabled, InvalidConfigError, getLogger from core.time import UserFriendlyTime from core.utils import strtobool @@ -29,6 +28,7 @@ class ConfigManager: "fallback_category_id": None, "prefix": "?", "mention": "@here", + "mention_message": None, "main_color": str(discord.Color.blurple()), "error_color": str(discord.Color.red()), "user_typing": False, diff --git a/core/models.py b/core/models.py index 4c6f956e82..0bb3690de8 100644 --- a/core/models.py +++ b/core/models.py @@ -1,17 +1,16 @@ import logging +import os import re import sys -import os from difflib import get_close_matches from enum import IntEnum from logging.handlers import RotatingFileHandler from string import Formatter +import _string import discord from discord.ext import commands -import _string - try: from colorama import Fore, Style except ImportError: diff --git a/core/paginator.py b/core/paginator.py index 5a6844f382..4a40bd83c7 100644 --- a/core/paginator.py +++ b/core/paginator.py @@ -1,9 +1,9 @@ import typing import discord -from discord import Message, Embed, ButtonStyle, Interaction -from discord.ui import View, Button, Select +from discord import ButtonStyle, Embed, Interaction, Message from discord.ext import commands +from discord.ui import Button, Select, View class PaginatorSession: diff --git a/core/thread.py b/core/thread.py index 09c5df46ee..658a27f3c1 100644 --- a/core/thread.py +++ b/core/thread.py @@ -11,27 +11,25 @@ from datetime import timedelta from types import SimpleNamespace -import isodate - import discord -from discord.ext.commands import MissingRequiredArgument, CommandError -from lottie.importers import importers as l_importers +import isodate +from discord.ext.commands import CommandError, MissingRequiredArgument from lottie.exporters import exporters as l_exporters +from lottie.importers import importers as l_importers from core.models import DMDisabled, DummyMessage, getLogger -from core.time import human_timedelta from core.utils import ( + AcceptButton, + ConfirmThreadCreationView, + DenyButton, + create_thread_channel, + get_joint_id, + get_top_role, is_image_url, - parse_channel_topic, match_title, match_user_id, + parse_channel_topic, truncate, - get_top_role, - create_thread_channel, - get_joint_id, - AcceptButton, - DenyButton, - ConfirmThreadCreationView, ) logger = getLogger(__name__) @@ -200,6 +198,10 @@ async def setup(self, *, creator=None, category=None, initial_message=None): self.ready = True + mention_msg = self.bot.config["mention_message"] + if mention_msg: + mention_msg = mention_msg.replace("[prefix]", self.bot.prefix) + if creator is not None and creator != recipient: mention = None else: @@ -208,7 +210,10 @@ async def setup(self, *, creator=None, category=None, initial_message=None): async def send_genesis_message(): info_embed = self._format_info_embed(recipient, log_url, log_count, self.bot.main_color) try: - msg = await channel.send(mention, embed=info_embed) + if mention_msg: + msg = await channel.send((mention + " " + mention_msg), embed=info_embed) + else: + msg = await channel.send(mention, embed=info_embed) self.bot.loop.create_task(msg.pin()) self._genesis_message = msg except Exception: diff --git a/core/time.py b/core/time.py index c56c7264e2..f5abd7658d 100644 --- a/core/time.py +++ b/core/time.py @@ -6,14 +6,16 @@ from __future__ import annotations import datetime -import discord +import re from typing import TYPE_CHECKING, Any, Optional, Union + +import discord import parsedatetime as pdt from dateutil.relativedelta import relativedelta -from .utils import human_join -from discord.ext import commands from discord import app_commands -import re +from discord.ext import commands + +from .utils import human_join # Monkey patch mins and secs into the units units = pdt.pdtLocales["en_US"].units diff --git a/core/utils.py b/core/utils.py index 0e9f090d12..00c423940e 100644 --- a/core/utils.py +++ b/core/utils.py @@ -13,7 +13,6 @@ from core.models import getLogger - __all__ = [ "strtobool", "User", diff --git a/pyproject.toml b/pyproject.toml index 389c24e3d5..6d4da9fe67 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,6 +19,20 @@ extend-exclude = ''' ) ''' +[tool.ruff] +target-version = "py310" +line-length = 110 +select = ["C90", "E", "F", "I001", "PGH004", "RUF100"] +ignore = ["F405", "E741", "C901", "F403", "E501"] +fix = true +fixable = ["I001"] +isort.combine-as-imports = true +force-exclude = true + +[tool.ruff.mccabe] +# Unlike Flake8, default to a complexity level of 10. +max-complexity = 25 + [tool.poetry] name = 'Modmail' version = '4.0.2' @@ -33,6 +47,3 @@ readme = 'README.md' repository = 'https://github.com/modmail-dev/modmail' homepage = 'https://github.com/modmail-dev/modmail' keywords = ['discord', 'modmail'] - -[tool.pylint.format] -max-line-length = "110"