Skip to content

Commit c1e22f3

Browse files
authored
feat: add banners (#9)
1 parent 61ba43a commit c1e22f3

File tree

6 files changed

+135
-0
lines changed

6 files changed

+135
-0
lines changed

MANIFEST.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ include README.rst
22
include LICENSE
33
include requirements.txt
44
include discord/bin/*.dll
5+
include discord/banner.txt
6+
include discord/ibanner.txt
57
include discord/py.typed
68

79
prune .github

discord/banner.txt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
2+
3+
${bold_white} ${reset} ${blue} ````'````````````````````````'`
4+
${bold_white} ${reset} ${bold_blue} `. `-
5+
${bold_white} O88888${reset} ${yellow}'' _
6+
${bold_white}u@@@@@@@@@@@BG! O@@@@8${reset} ${bold_yellow}_ ${reset}${bold_white}:oQ@@@@@@#Rr${reset}${bold_yellow} `-
7+
${bold_white}u@@@@@@@@@@@@@@O. O@@@@8${reset} ${red}- ${reset}${bold_white}k@@@@#dWQ@@@@D`${reset}${red} .
8+
${bold_white}u@@@@@` 'I@@@@@a`O9999r V6996u ,LaEQQQDUv. :}P$QQ8OI?. V9999L_H8Qc !y0QQRY.O@@@@8${reset} ${bold_red}- ${reset}${bold_white}Vkkk} E@@@@:${reset}${bold_red} .
9+
${bold_white}u@@@@@` :@@@@@R I@@@@Q` ^@@@@@" -M@@@@@@@@@@@q ,Q@@@@@@@@@@@V` O@@@@Q#@@@G-0@@@@@@@##@@@@8${reset} ${purple}- ${reset}${bold_white}-m3HQ@@@0r${reset}${purple} .
10+
${bold_white}u@@@@@}iYz#@@@@@) `$@@@@} O@@@@j -B@@@@Q \@@@T ,#@@@@K_`=#@@@@q O@@@@@8]*);E@@@@@V::V@@@@@8${reset} ${bold_purple}- ${reset}${bold_white}:@@@@@#$z;${reset}${bold_purple} .
11+
${bold_white}u@@@@@@@@@@@@@O! ,#@@@B.*@@@@0` L@@@@@ T@@@@@` y@@@@@: O@@@@Q` @@@@@H G@@@@8${reset} ${black}- ${reset}${bold_white}```=D@@@@P${reset}${black} .
12+
${bold_white}u@@@@@6OOOMj]! x@@@@}9@@@#! x@@@@@ }@@@@@. U@@@@@, O@@@@$ #@@@@b d@@@@8${reset} ${bold_black}- ${reset}${bold_white},####0~` :6@@@@8${reset}${bold_black} .
13+
${bold_white}u@@@@@` K@@@#@@@@x `0@@@@# /@@| .Q@@@@0r~Y@@@@@w O@@@@$ P@@@@@OxxO@@@@@8${reset} ${blue}- ${reset}${bold_white}c#@@@@@@@@@@@Q=${reset}${blue} .
14+
${bold_white}u@@@@@` `#@@@@@@g `c@@@@@@@@@@#T `M@@@@@@@@@@#) O@@@@$ `z@@@@@@@QQ@@@@8${reset} ${bold_blue}_ ${reset}${bold_white}`rz0QBBB8bV:${reset}${bold_blue} `-
15+
${bold_white}=yyyyV x@@@@@#: `~YI5MWIx! `^}m5MGwx: |yyyyv `*w33y~ )yyyyx${reset} ${yellow}.` -
16+
${bold_white}=gEB@@@@#r ${reset} ${bold_yellow} '. .`
17+
${bold_white}`g@@@@@#X_ ${reset} ${blue} '`````'''''''''''''''''''````'`
18+
${bold_white}`-":_`

discord/banners.py

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import datetime
2+
import importlib.resources
3+
import logging
4+
import logging.config
5+
import os
6+
import platform
7+
import string
8+
import sys
9+
import time
10+
import warnings
11+
from typing import Sequence
12+
from . import __version__
13+
14+
import colorlog
15+
import colorlog.escape_codes
16+
17+
__all__: Sequence[str] = ('start_logging', 'print_banner')
18+
19+
20+
day_prefixes: dict[int, str] = {
21+
1: 'st',
22+
2: 'nd',
23+
3: 'rd',
24+
4: 'th',
25+
5: 'th',
26+
6: 'th',
27+
7: 'th',
28+
8: 'th',
29+
9: 'th',
30+
0: 'th',
31+
}
32+
33+
34+
def start_logging(flavor: None | int | str | dict, debug: bool = False):
35+
if len(logging.root.handlers) != 0:
36+
return # the user is most likely using logging.basicConfig, or is being spearheaded by something else.
37+
38+
if flavor is None:
39+
flavor = logging.DEBUG if debug else logging.INFO
40+
41+
if isinstance(flavor, dict):
42+
logging.config.dictConfig(flavor)
43+
44+
if flavor.get('handler'):
45+
return
46+
47+
flavor = None
48+
49+
# things that will never be logged.
50+
logging.logThreads = None
51+
logging.logProcesses = None
52+
53+
colorlog.basicConfig(
54+
level=flavor,
55+
format='%(log_color)s%(bold)s%(levelname)-1.1s%(thin)s %(asctime)23.23s %(bold)s%(name)s: '
56+
'%(thin)s%(message)s%(reset)s',
57+
stream=sys.stderr,
58+
log_colors={
59+
'DEBUG': 'cyan',
60+
'INFO': 'green',
61+
'WARNING': 'yellow',
62+
'ERROR': 'red',
63+
'CRITICAL': 'red, bg_white',
64+
},
65+
)
66+
warnings.simplefilter('always', DeprecationWarning)
67+
logging.captureWarnings(True)
68+
69+
70+
def get_day_prefix(num: int) -> str:
71+
n = str(num)
72+
return day_prefixes[int(n[len(n) - 1])]
73+
74+
75+
def print_banner(
76+
bot_name: str = 'A bot',
77+
module: str | None = 'pycord',
78+
):
79+
banners = importlib.resources.files(module)
80+
81+
for trav in banners.iterdir():
82+
if trav.name == 'banner.txt':
83+
banner = trav.read_text()
84+
elif trav.name == 'ibanner.txt':
85+
info_banner = trav.read_text()
86+
87+
today = datetime.date.today()
88+
89+
args = {
90+
# the # prefix only works on Windows, and the - prefix only works on linux/unix systems
91+
'current_time': today.strftime(f'%B the %#d{get_day_prefix(today.day)} of %Y')
92+
if os.name == 'nt'
93+
else today.strftime(f'%B the %-d{get_day_prefix(today.day)} of %Y'),
94+
'py_version': platform.python_version(),
95+
'botname': bot_name,
96+
'version': __version__
97+
}
98+
args |= colorlog.escape_codes.escape_codes
99+
100+
sys.stdout.write(string.Template(banner).safe_substitute(args))
101+
sys.stdout.write(string.Template(info_banner).safe_substitute(args))
102+
sys.stdout.flush()
103+
time.sleep(0.162) # sleep for a bit to prevent overfill.

discord/client.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535

3636
import aiohttp
3737

38+
from discord.banners import print_banner, start_logging
39+
3840
from . import utils
3941
from .activity import ActivityTypes, BaseActivity, create_activity
4042
from .appinfo import AppInfo, PartialAppInfo
@@ -224,6 +226,9 @@ def __init__(
224226
loop: asyncio.AbstractEventLoop | None = None,
225227
**options: Any,
226228
):
229+
self._flavor = options.get("flavor", logging.INFO)
230+
self._debug = options.get("debug", False)
231+
self._banner_module = options.get("banner_module")
227232
# self.ws is set in the connect method
228233
self.ws: DiscordWebSocket = None # type: ignore
229234
self.loop: asyncio.AbstractEventLoop = (
@@ -609,6 +614,9 @@ async def login(self, token: str) -> None:
609614
data = await self.http.static_login(token.strip())
610615
self._connection.user = ClientUser(state=self._connection, data=data)
611616

617+
print_banner(bot_name=self._connection.user.display_name, module=self._banner_module or 'discord')
618+
start_logging(self._flavor, debug=self._debug)
619+
612620
async def connect(self, *, reconnect: bool = True) -> None:
613621
"""|coro|
614622

discord/ibanner.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
${bold_red}Wel${reset}${blue}come${reset} ${bold_blue}to${reset} ${yellow}Pycord v${version}${reset}
2+
${bold_white}It's currently ${current_time}, running on Python ${py_version}${reset}
3+

requirements/_.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
aiohttp>=3.6.0,<4.0
22
typing_extensions>=4,<5
3+
colorlog~=6.9.0

0 commit comments

Comments
 (0)