Skip to content

Commit b045dfb

Browse files
committed
Merge branch 'master' of https://github.com/ooliver1/botbase
2 parents b511ef0 + 3b9eb47 commit b045dfb

File tree

6 files changed

+183
-30
lines changed

6 files changed

+183
-30
lines changed

CHANGELOG.md

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,89 @@
11
# Changelog
22

3+
## [1.22.2](https://github.com/ooliver1/botbase/compare/v1.22.1...v1.22.2) (2022-10-22)
4+
5+
6+
### Bug Fixes
7+
8+
* **botbase:** use str.join because windows ([48554dd](https://github.com/ooliver1/botbase/commit/48554ddd31eefaf19799af546a70a9557b264693))
9+
10+
## [1.22.1](https://github.com/ooliver1/botbase/compare/v1.22.0...v1.22.1) (2022-10-03)
11+
12+
13+
### Bug Fixes
14+
15+
* only sync if ready ([39a752a](https://github.com/ooliver1/botbase/commit/39a752a04d2c1d9991c228e9bb6fdcd8e7b82845))
16+
17+
## [1.22.0](https://github.com/ooliver1/botbase/compare/v1.21.7...v1.22.0) (2022-10-03)
18+
19+
20+
### Features
21+
22+
* add console handlers ([2aff21b](https://github.com/ooliver1/botbase/commit/2aff21b4ef20c4114ee02ba61d15a712c8bcd62f))
23+
24+
## [1.21.7](https://github.com/ooliver1/botbase/compare/v1.21.6...v1.21.7) (2022-10-03)
25+
26+
27+
### Bug Fixes
28+
29+
* istg ([d34b34b](https://github.com/ooliver1/botbase/commit/d34b34bfef0427050d134d2f0f1d151ef930d15a))
30+
31+
## [1.21.6](https://github.com/ooliver1/botbase/compare/v1.21.5...v1.21.6) (2022-10-03)
32+
33+
34+
### Bug Fixes
35+
36+
* oh ([9810669](https://github.com/ooliver1/botbase/commit/9810669d7a85fc015059c47539965146bd455563))
37+
38+
## [1.21.5](https://github.com/ooliver1/botbase/compare/v1.21.4...v1.21.5) (2022-10-03)
39+
40+
41+
### Bug Fixes
42+
43+
* **botbase:** actually fix close and startup ([ab8a243](https://github.com/ooliver1/botbase/commit/ab8a243c58333ae53ac6f0516191177c8bf10149))
44+
45+
## [1.21.4](https://github.com/ooliver1/botbase/compare/v1.21.3...v1.21.4) (2022-09-11)
46+
47+
48+
### Bug Fixes
49+
50+
* **botbase:** support db port ([41bedd1](https://github.com/ooliver1/botbase/commit/41bedd1d2a65ed113065139a6ed6126e7841ca16))
51+
52+
## [1.21.3](https://github.com/ooliver1/botbase/compare/v1.21.2...v1.21.3) (2022-09-10)
53+
54+
55+
### Bug Fixes
56+
57+
* what ([fdf2390](https://github.com/ooliver1/botbase/commit/fdf2390c94b0cb158eec2fb3e6b71c4c9cb75cbb))
58+
59+
## [1.21.2](https://github.com/ooliver1/botbase/compare/v1.21.1...v1.21.2) (2022-09-10)
60+
61+
62+
### Bug Fixes
63+
64+
* **botbase:** cogs are very painful ([1bb9ab9](https://github.com/ooliver1/botbase/commit/1bb9ab918d0d941a15ae85d892ab673e38110b46))
65+
66+
## [1.21.1](https://github.com/ooliver1/botbase/compare/v1.21.0...v1.21.1) (2022-09-10)
67+
68+
69+
### Bug Fixes
70+
71+
* dont import removed emptyembed sentinel ([959fcae](https://github.com/ooliver1/botbase/commit/959fcae2cb99c2cc180726a79f42d09737d9abde))
72+
73+
## [1.21.0](https://github.com/ooliver1/botbase/compare/v1.20.8...v1.21.0) (2022-09-10)
74+
75+
76+
### Features
77+
78+
* **botbase:** add helpers for cogs ([78b2b91](https://github.com/ooliver1/botbase/commit/78b2b91bd3181f4d3ba8a57df262c2806482afcc))
79+
80+
## [1.20.8](https://github.com/ooliver1/botbase/compare/v1.20.7...v1.20.8) (2022-08-02)
81+
82+
83+
### Bug Fixes
84+
85+
* use desc not description pt.2 ([1401519](https://github.com/ooliver1/botbase/commit/1401519b3c38567383b639b0399c4489844ba1aa))
86+
387
## [1.20.7](https://github.com/ooliver1/botbase/compare/v1.20.6...v1.20.7) (2022-08-02)
488

589

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,4 @@ This is a bot base project for Discord python bots made with [nextcord](https://
2424
| `emojiset` | `Emojis[str, str]` | `Emojis[]` |
2525
| `logchannel` | `int` | `None` |
2626
| `guild_ids` | `list[int]` | `None` |
27+
| `name` | `str` | `None` |

botbase/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from .wraps import *
88
from .models import *
99

10-
__version__ = "1.20.7" # x-release-please-version
10+
__version__ = "1.22.2" # x-release-please-version
1111

1212

1313
getLogger(__name__).addHandler(NullHandler())

botbase/botbase.py

Lines changed: 92 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,27 @@
11
from __future__ import annotations
22

3+
from asyncio import TimeoutError as AsyncTimeoutError
4+
from asyncio import sleep, wait_for
5+
from contextlib import suppress
36
from importlib import import_module
4-
from logging import CRITICAL, INFO, Formatter, getLogger
7+
from logging import CRITICAL, INFO, Formatter, getLogger, StreamHandler
58
from logging.handlers import RotatingFileHandler
69
from pathlib import Path
710
from random import choice
811
from sys import modules
912
from textwrap import dedent
13+
from types import ModuleType
1014
from typing import TYPE_CHECKING
1115

1216
from aiohttp import ClientSession
1317
from asyncpg import create_pool
1418
from nextcord import Embed, Interaction, Member, Thread, User, abc
15-
from nextcord.ext.commands import AutoShardedBot, when_mentioned, when_mentioned_or
19+
from nextcord.ext.commands import (
20+
AutoShardedBot,
21+
ExtensionNotFound,
22+
when_mentioned,
23+
when_mentioned_or,
24+
)
1625

1726
from .blacklist import Blacklist
1827
from .emojis import Emojis
@@ -26,7 +35,7 @@
2635
)
2736

2837
if TYPE_CHECKING:
29-
from typing import Any, Callable, Optional, Union
38+
from typing import Any, Callable, Mapping, Optional, Union
3039

3140
from asyncpg import Pool
3241
from nextcord import Guild, Message, PartialMessageable
@@ -72,21 +81,23 @@
7281
"""
7382

7483

75-
def get_handler():
84+
def get_handlers():
85+
formatter = Formatter(
86+
"%(levelname)-7s %(asctime)s %(filename)12s:%(funcName)-28s: %(message)s",
87+
datefmt="%H:%M:%S %d/%m/%Y",
88+
)
7689
h = RotatingFileHandler(
7790
"./logs/bot/io.log",
7891
maxBytes=1000000,
7992
backupCount=5,
8093
encoding="utf-8",
8194
)
82-
h.setFormatter(
83-
Formatter(
84-
"%(levelname)-7s %(asctime)s %(filename)12s:%(funcName)-28s: %(message)s",
85-
datefmt="%H:%M:%S %d/%m/%Y",
86-
)
87-
)
95+
i = StreamHandler()
96+
97+
i.setFormatter(formatter)
98+
h.setFormatter(formatter)
8899
h.namer = lambda name: name.replace(".log", "") + ".log"
89-
return h
100+
return h, i
90101

91102

92103
class BotBase(AutoShardedBot):
@@ -141,9 +152,10 @@ def __init__(self, *args, config_module: str = "config", **kwargs) -> None:
141152
log = getLogger()
142153
log.handlers = []
143154
log.setLevel(INFO)
144-
h = get_handler()
155+
h, i = get_handlers()
145156

146157
log.addHandler(h)
158+
log.addHandler(i)
147159
getLogger("asyncio").setLevel(CRITICAL)
148160

149161
self.loop.set_exception_handler(self.asyncio_handler)
@@ -158,9 +170,8 @@ def __init__(self, *args, config_module: str = "config", **kwargs) -> None:
158170
self.db_enabled = True
159171
self.db_args = (db_url,)
160172
self.db_kwargs = {}
161-
elif (
162-
(db_name := getattr(config, "db_name", None))
163-
and (db_user := getattr(config, "db_user", "ooliver"))
173+
elif (db_name := getattr(config, "db_name", None)) and (
174+
db_user := getattr(config, "db_user", "ooliver")
164175
):
165176
self.db_enabled = True
166177
self.db_args = ()
@@ -169,6 +180,8 @@ def __init__(self, *args, config_module: str = "config", **kwargs) -> None:
169180
"user": db_user,
170181
"host": getattr(config, "db_host", None),
171182
}
183+
if port := getattr(config, "db_port", None):
184+
self.db_kwargs["port"] = port
172185
else:
173186
self.db_enabled = False
174187
self.db_args = ()
@@ -191,6 +204,7 @@ def __init__(self, *args, config_module: str = "config", **kwargs) -> None:
191204
self.logchannel: int | None = getattr(config, "logchannel", None)
192205
self.guild_ids: list[int] | None = getattr(config, "guild_ids", None)
193206
self.database_init: str = initialise + getattr(config, "database_init", "")
207+
self.name: Optional[str] = getattr(config, "name", None)
194208

195209
self._single_events: dict[str, Callable] = {
196210
"on_message": self.get_wrapped_message,
@@ -231,11 +245,18 @@ def asyncio_handler(self, _, context: dict) -> None:
231245
)
232246
)
233247

234-
async def startup(self) -> None:
248+
async def start(self, *args, **kwargs) -> None:
235249
if self.db_enabled:
236-
db = await create_pool(*self.db_args, **self.db_kwargs)
237-
assert db is not None
238-
self.db = db
250+
for tries in range(5):
251+
try:
252+
db = await create_pool(*self.db_args, **self.db_kwargs)
253+
assert db is not None
254+
self.db = db
255+
except AssertionError:
256+
await sleep(2.5 * tries + 1)
257+
else:
258+
break
259+
239260
await self.db.execute(self.database_init)
240261

241262
if self.aiohttp_enabled:
@@ -244,9 +265,9 @@ async def startup(self) -> None:
244265
if self.blacklist_enabled and self.db_enabled:
245266
self.blacklist = Blacklist(self.db)
246267

247-
def run(self, *args, **kwargs) -> None:
248-
self.loop.create_task(self.startup())
268+
await super().start(*args, **kwargs)
249269

270+
def run(self, *args, **kwargs) -> None:
250271
cog_dir = f"{self.mod}/cogs" if self.mod else "./cogs"
251272
cogs = Path(cog_dir)
252273

@@ -255,17 +276,21 @@ def run(self, *args, **kwargs) -> None:
255276
if "extras" in ext.parts or any(part.startswith("_") for part in ext.parts):
256277
continue
257278
if ext.suffix == ".py":
258-
a = str(ext).replace("/", ".")[:-3]
279+
a = ".".join(ext.parts).removesuffix(".py")
259280
log.info("Loading ext %s", a)
260281
self.load_extension(a)
261282
log.info("Loaded ext %s", a)
262283

263284
super().run(*args, **kwargs)
264285

265286
async def close(self, *args, **kwargs) -> None:
266-
if self.aiohttp_enabled:
287+
if self.aiohttp_enabled and hasattr(self, "session"):
267288
await self.session.close()
268289

290+
if self.db_enabled and hasattr(self, "db"):
291+
with suppress(AsyncTimeoutError):
292+
await wait_for(self.db.close(), timeout=5)
293+
269294
await super().close(*args, **kwargs)
270295

271296
@staticmethod
@@ -531,3 +556,47 @@ async def on_guild_remove(self, guild: Guild):
531556
await self.get_channel(self.logchannel).send(embed=embed) # type: ignore
532557
except AttributeError:
533558
pass
559+
560+
def load_extension(
561+
self, name: str, *, extras: Optional[dict[str, Any]] = None
562+
) -> None:
563+
ext = f"{self.name}.cogs.{name}" if self.name else name
564+
565+
try:
566+
super().load_extension(ext, extras=extras)
567+
except (ExtensionNotFound, ModuleNotFoundError):
568+
super().load_extension(name, extras=extras)
569+
570+
if self.is_ready():
571+
self.loop.create_task(self.sync_all_application_commands())
572+
573+
def reload_extension(self, name: str) -> None:
574+
ext = f"{self.name}.cogs.{name}" if self.name else name
575+
576+
try:
577+
super().reload_extension(ext)
578+
except (ExtensionNotFound, ModuleNotFoundError):
579+
super().reload_extension(name)
580+
581+
if self.is_ready():
582+
self.loop.create_task(self.sync_all_application_commands())
583+
584+
def unload_extension(self, name: str) -> None:
585+
ext = f"{self.name}.cogs.{name}" if self.name else name
586+
587+
try:
588+
super().unload_extension(ext)
589+
except (ExtensionNotFound, ModuleNotFoundError):
590+
super().unload_extension(name)
591+
592+
self.loop.create_task(self.sync_all_application_commands())
593+
594+
@property
595+
def extensions(self) -> Mapping[str, ModuleType]:
596+
if not self.name:
597+
return super().extensions
598+
599+
return {
600+
k.removeprefix(f"{self.name}.cogs."): v
601+
for k, v in super().extensions.items()
602+
} | super().extensions

botbase/wraps/wrap.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
)
1414
from nextcord.abc import Messageable
1515
from nextcord.utils import utcnow
16-
from nextcord.embeds import _EmptyEmbed
1716

1817
if TYPE_CHECKING:
1918
from typing import Any
@@ -61,8 +60,8 @@ async def send_author_embed(self, text: str, **kwargs):
6160

6261
async def send_embed(
6362
self,
64-
title: str | _EmptyEmbed = Embed.Empty,
65-
desc: str | _EmptyEmbed = Embed.Empty,
63+
title: str | None = None,
64+
desc: str | None = None,
6665
*,
6766
author: str | None = None,
6867
image: str | None = None,

pyproject.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "ooliver-botbase"
3-
version = "1.20.7"
3+
version = "1.22.2"
44
description = "A personal nextcord bot base package for bots."
55
authors = ["ooliver1 <oliverwilkes2006@icloud.com>"]
66
license = "MIT"
@@ -19,8 +19,8 @@ botbase = "botbase.cli:main"
1919

2020
[tool.poetry.dependencies]
2121
python = "^3.8"
22-
asyncpg = ">=0.25.0<0.26.0"
23-
nextcord = ">=2.0.0-beta.2<3.0.0"
22+
asyncpg = ">=0.25,<0.27"
23+
nextcord = "^2.0.0"
2424
nextcord-ext-menus = "^1.5.2"
2525
jishaku = "2.4.0"
2626
psutil = "^5.9.0"

0 commit comments

Comments
 (0)