Skip to content

Commit c236b60

Browse files
committed
3.3.0-dev
1 parent 1340d73 commit c236b60

12 files changed

+1753
-1744
lines changed

CHANGELOG.md

+13
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,19 @@ however, insignificant breaking changes does not guarantee a major version bump,
1212
### Changed
1313

1414
- `?contact` no longer send the "thread created" message to where the command is ran, instead, it's now sent to the newly created thread channel. (Thanks to DAzVise)
15+
- Plugins update (mostly internal).
16+
- `git` is no longer used to install plugins, it now downloads through zip files.
17+
- `?plugins enabled` renamed to `?plugins loaded` while `enabled` is still an alias to that command.
18+
- Reorganised plugins folder structure.
19+
- Logging / plugin-related messages changes.
20+
- Updating one plugin will not update all other plugins (plugins are no longer separated by repos, but the plugin name itself).
21+
- Help command is in alphabetical order grouped by permissions.
22+
23+
### Internal
24+
25+
- Reworked `config.get` and `config.set`, it feeds through the converters before setting/getting.
26+
- To get/set the raw value, access through `config[]`.
27+
- Prerelease naming scheme is now `x.x.x-dev`.
1528

1629
# v3.2.2
1730

Dockerfile

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
FROM python:3.7.4-alpine
2-
RUN apk add --no-cache git
32
WORKDIR /modmailbot
43
COPY . /modmailbot
54
RUN pip install --no-cache-dir -r requirements.min.txt

bot.py

+35-97
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version__ = "3.2.3-pre"
1+
__version__ = "3.3.0-dev"
22

33
import asyncio
44
import logging
@@ -19,6 +19,7 @@
1919
from aiohttp import ClientSession
2020
from emoji import UNICODE_EMOJI
2121
from motor.motor_asyncio import AsyncIOMotorClient
22+
from pkg_resources import parse_version
2223
from pymongo.errors import ConfigurationError
2324

2425
try:
@@ -32,7 +33,7 @@
3233
from core import checks
3334
from core.clients import ApiClient, PluginDatabaseClient
3435
from core.config import ConfigManager
35-
from core.utils import human_join, strtobool, parse_alias
36+
from core.utils import human_join, parse_alias
3637
from core.models import PermissionLevel, ModmailLogger, SafeFormatter
3738
from core.thread import ThreadManager
3839
from core.time import human_timedelta
@@ -70,6 +71,7 @@ def __init__(self):
7071
self._api = None
7172
self.metadata_loop = None
7273
self.formatter = SafeFormatter()
74+
self.loaded_cogs = ['cogs.modmail', 'cogs.plugins', 'cogs.utility']
7375

7476
self._connected = asyncio.Event()
7577
self.start_time = datetime.utcnow()
@@ -97,17 +99,7 @@ def __init__(self):
9799
sys.exit(0)
98100

99101
self.plugin_db = PluginDatabaseClient(self)
100-
101-
logger.line()
102-
logger.info("┌┬┐┌─┐┌┬┐┌┬┐┌─┐┬┬")
103-
logger.info("││││ │ │││││├─┤││")
104-
logger.info("┴ ┴└─┘─┴┘┴ ┴┴ ┴┴┴─┘")
105-
logger.info("v%s", __version__)
106-
logger.info("Authors: kyb3r, fourjr, Taaku18")
107-
logger.line()
108-
109-
self._load_extensions()
110-
logger.line()
102+
self.startup()
111103

112104
@property
113105
def uptime(self) -> str:
@@ -123,6 +115,24 @@ def uptime(self) -> str:
123115

124116
return self.formatter.format(fmt, d=days, h=hours, m=minutes, s=seconds)
125117

118+
def startup(self):
119+
logger.line()
120+
logger.info("┌┬┐┌─┐┌┬┐┌┬┐┌─┐┬┬")
121+
logger.info("││││ │ │││││├─┤││")
122+
logger.info("┴ ┴└─┘─┴┘┴ ┴┴ ┴┴┴─┘")
123+
logger.info("v%s", __version__)
124+
logger.info("Authors: kyb3r, fourjr, Taaku18")
125+
logger.line()
126+
127+
for cog in self.loaded_cogs:
128+
logger.info("Loading %s.", cog)
129+
try:
130+
self.load_extension(cog)
131+
logger.info("Successfully loaded %s.", cog)
132+
except Exception:
133+
logger.exception("Failed to load %s.", cog)
134+
logger.line()
135+
126136
def _configure_logging(self):
127137
level_text = self.config["log_level"].upper()
128138
logging_levels = {
@@ -161,8 +171,8 @@ def _configure_logging(self):
161171
logger.debug("Successfully configured logging.")
162172

163173
@property
164-
def version(self) -> str:
165-
return __version__
174+
def version(self):
175+
return parse_version(__version__)
166176

167177
@property
168178
def session(self) -> ClientSession:
@@ -179,18 +189,6 @@ def api(self):
179189
async def get_prefix(self, message=None):
180190
return [self.prefix, f"<@{self.user.id}> ", f"<@!{self.user.id}> "]
181191

182-
def _load_extensions(self):
183-
"""Adds commands automatically"""
184-
for file in os.listdir("cogs"):
185-
if not file.endswith(".py"):
186-
continue
187-
cog = f"cogs.{file[:-3]}"
188-
logger.info("Loading %s.", cog)
189-
try:
190-
self.load_extension(cog)
191-
except Exception:
192-
logger.exception("Failed to load %s.", cog)
193-
194192
def run(self, *args, **kwargs):
195193
try:
196194
self.loop.run_until_complete(self.start(self.token))
@@ -366,25 +364,17 @@ def blocked_whitelisted_users(self) -> typing.List[str]:
366364
def prefix(self) -> str:
367365
return str(self.config["prefix"])
368366

369-
def _parse_color(self, conf_name):
370-
color = self.config[conf_name]
371-
try:
372-
return int(color.lstrip("#"), base=16)
373-
except ValueError:
374-
logger.error("Invalid %s provided.", conf_name)
375-
return int(self.config.remove(conf_name).lstrip("#"), base=16)
376-
377367
@property
378368
def mod_color(self) -> int:
379-
return self._parse_color("mod_color")
369+
return self.config.get("mod_color")
380370

381371
@property
382372
def recipient_color(self) -> int:
383-
return self._parse_color("recipient_color")
373+
return self.config.get("recipient_color")
384374

385375
@property
386376
def main_color(self) -> int:
387-
return self._parse_color("main_color")
377+
return self.config.get("main_color")
388378

389379
def command_perm(self, command_name: str) -> PermissionLevel:
390380
level = self.config["override_command_level"].get(command_name)
@@ -518,7 +508,6 @@ async def on_ready(self):
518508
loop=None,
519509
)
520510
self.metadata_loop.before_loop(self.before_post_metadata)
521-
self.metadata_loop.after_loop(self.after_post_metadata)
522511
self.metadata_loop.start()
523512

524513
async def convert_emoji(self, name: str) -> str:
@@ -574,38 +563,14 @@ async def _process_blocked(self, message: discord.Message) -> bool:
574563

575564
now = datetime.utcnow()
576565

577-
account_age = self.config["account_age"]
578-
guild_age = self.config["guild_age"]
566+
account_age = self.config.get("account_age")
567+
guild_age = self.config.get("guild_age")
579568

580569
if account_age is None:
581570
account_age = isodate.Duration()
582571
if guild_age is None:
583572
guild_age = isodate.Duration()
584573

585-
if not isinstance(account_age, isodate.Duration):
586-
try:
587-
account_age = isodate.parse_duration(account_age)
588-
except isodate.ISO8601Error:
589-
logger.warning(
590-
"The account age limit needs to be a "
591-
"ISO-8601 duration formatted duration string "
592-
'greater than 0 days, not "%s".',
593-
str(account_age),
594-
)
595-
account_age = self.config.remove("account_age")
596-
597-
if not isinstance(guild_age, isodate.Duration):
598-
try:
599-
guild_age = isodate.parse_duration(guild_age)
600-
except isodate.ISO8601Error:
601-
logger.warning(
602-
"The guild join age limit needs to be a "
603-
"ISO-8601 duration formatted duration string "
604-
'greater than 0 days, not "%s".',
605-
str(guild_age),
606-
)
607-
guild_age = self.config.remove("guild_age")
608-
609574
reason = self.blocked_users.get(str(message.author.id)) or ""
610575
min_guild_age = min_account_age = now
611576

@@ -860,14 +825,7 @@ async def process_commands(self, message):
860825

861826
thread = await self.threads.find(channel=ctx.channel)
862827
if thread is not None:
863-
try:
864-
reply_without_command = strtobool(
865-
self.config["reply_without_command"]
866-
)
867-
except ValueError:
868-
reply_without_command = self.config.remove("reply_without_command")
869-
870-
if reply_without_command:
828+
if self.config.get('reply_without_command'):
871829
await thread.reply(message)
872830
else:
873831
await self.api.append_log(message, type_="internal")
@@ -887,23 +845,15 @@ async def _void(*_args, **_kwargs):
887845
pass
888846

889847
if isinstance(channel, discord.DMChannel):
890-
try:
891-
user_typing = strtobool(self.config["user_typing"])
892-
except ValueError:
893-
user_typing = self.config.remove("user_typing")
894-
if not user_typing:
848+
if not self.config.get("user_typing"):
895849
return
896850

897851
thread = await self.threads.find(recipient=user)
898852

899853
if thread:
900854
await thread.channel.trigger_typing()
901855
else:
902-
try:
903-
mod_typing = strtobool(self.config["mod_typing"])
904-
except ValueError:
905-
mod_typing = self.config.remove("mod_typing")
906-
if not mod_typing:
856+
if not self.config.get('mod_typing'):
907857
return
908858

909859
thread = await self.threads.find(channel=channel)
@@ -941,15 +891,7 @@ async def on_raw_reaction_add(self, payload):
941891

942892
if isinstance(channel, discord.DMChannel):
943893
if str(reaction) == str(close_emoji): # closing thread
944-
try:
945-
recipient_thread_close = strtobool(
946-
self.config["recipient_thread_close"]
947-
)
948-
except ValueError:
949-
recipient_thread_close = self.config.remove(
950-
"recipient_thread_close"
951-
)
952-
if not recipient_thread_close:
894+
if not self.config.get('recipient_thread_close'):
953895
return
954896
thread = await self.threads.find(recipient=user)
955897
ts = message.embeds[0].timestamp if message.embeds else None
@@ -1146,7 +1088,7 @@ async def post_metadata(self):
11461088
"member_count": len(self.guild.members),
11471089
"uptime": (datetime.utcnow() - self.start_time).total_seconds(),
11481090
"latency": f"{self.ws.latency * 1000:.4f}",
1149-
"version": self.version,
1091+
"version": str(self.version),
11501092
"selfhosted": True,
11511093
"last_updated": str(datetime.utcnow()),
11521094
}
@@ -1161,10 +1103,6 @@ async def before_post_metadata(self):
11611103
if not self.guild:
11621104
self.metadata_loop.cancel()
11631105

1164-
@staticmethod
1165-
async def after_post_metadata():
1166-
logger.info("Metadata loop has been cancelled.")
1167-
11681106

11691107
if __name__ == "__main__":
11701108
try:

0 commit comments

Comments
 (0)