diff --git a/.idea/dictionaries/romain.xml b/.idea/dictionaries/romain.xml
index f471c50..4f304c1 100644
--- a/.idea/dictionaries/romain.xml
+++ b/.idea/dictionaries/romain.xml
@@ -1,11 +1,15 @@
+ commandstats
ipinfo
iplocalise
localiseip
postgresql
+ socketstats
splt
+ tutux
+ webhooks
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 3fe55d9..b4233a9 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -1,17 +1,19 @@
-
-
+
+
+
+
+
-
+
+
-
-
@@ -29,6 +31,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -42,20 +65,23 @@
-
+
-
+
+
+
+
@@ -69,7 +95,7 @@
1589922546510
- 1590880224598
+ 1590958395349
@@ -88,27 +114,29 @@
+
-
-
+
+
+ 1591054207986
- https://trello.com/c/lpMrzLET/17-ping
-
-
- 1590880232278
-
-
+ https://trello.com/c/vK0cBbF2/38-i18n
+
+
+ 1591049955763
+
+
+
-
-
+
+
+ 1591054207986
- https://trello.com/c/A5f7QCk2/11-iplocalise
-
-
- 1590880232278
-
-
-
+ https://trello.com/c/SafaMBht/40-core
+
+
+ 1591049955763
+
@@ -148,22 +176,22 @@
-
+
-
+
-
+
-
-
+
+
-
+
@@ -192,10 +220,10 @@
-
+
-
+
diff --git a/app.py b/app.py
index 01ed3e0..1dbf4f0 100644
--- a/app.py
+++ b/app.py
@@ -6,14 +6,25 @@ from typing import List
import aiohttp
import discord
+from colorama import Fore, Style, init
from discord.ext import commands
-from tortoise import Tortoise
from configs.bot import settings
+from utils.functions.cli import bordered
from utils.functions.extra import ContextPlus, get_prefix, \
get_owners, get_blacklist
+from version import __version__
log = logging.getLogger(__name__)
+init()
+
+NAME = r"""
+ _____ _ _ _ _
+ |_ _| ___ _| |__ ___ | |_ | |__ ___ | |_
+ | || | | \ \/ / '_ \ / _ \| __|____| '_ \ / _ \| __|
+ | || |_| |> <| |_) | (_) | ||_____| |_) | (_) | |_
+ |_| \__,_/_/\_\_.__/ \___/ \__| |_.__/ \___/ \__|
+"""
l_extensions: List[str] = [
"jishaku",
@@ -32,44 +43,60 @@ class TuxBot(commands.AutoShardedBot):
def __init__(self):
self.uptime = datetime.datetime.utcnow()
- self.config = settings
+ self._config = settings
+ self.locale = self._config.default_locale
+
super().__init__(
command_prefix=get_prefix,
case_insensitive=True
)
self.logs_channels = {
- "dm": self.config.logs["dm"],
- "mentions": self.config.logs["mentions"],
- "guilds": self.config.logs["guilds"],
- "errors": self.config.logs["errors"],
+ "dm": self._config.logs["dm"],
+ "mentions": self._config.logs["mentions"],
+ "guilds": self._config.logs["guilds"],
+ "errors": self._config.logs["errors"],
+ "gateway": self._config.logs["gateway"],
}
- print("\n"*2)
-
for extension in l_extensions:
try:
self.load_extension(extension)
- print(extension, "loaded !")
except Exception as e:
- print(f"{type(e).__name__ }:", e)
-
- print("\n"*2)
+ log.warning(f"{type(e).__name__}: {e}")
async def is_owner(self, user: discord.User):
return user.id in get_owners()
async def on_ready(self):
- print(f"Connected !\n"
- f"\n"
- f"==> info: bot username {self.user}\n"
- f" info: bot id {self.user.id}\n"
- f" info: bot prefix {self.command_prefix}\n"
- f"==> info: guild count {len(self.guilds)}\n"
- f" info: member count {len(list(self.get_all_members()))}\n"
- f" info: channel count {len(list(self.get_all_channels()))}")
+ INFO = {
+ 'title': "INFO",
+ 'rows': [
+ str(self.user),
+ f"Prefixes: {', '.join(self._config.prefixes)}",
+ f"Language: {self.locale}",
+ f"Tuxbot Version: {__version__}",
+ f"Discord.py Version: {discord.__version__}",
+ f"Shards: {self.shard_count}",
+ f"Servers: {len(self.guilds)}",
+ f"Users: {len(self.users)}"
+ ]
+ }
- print(f"\n{'='*118}\n\n")
+ COGS = {
+ 'title': "COGS",
+ 'rows': []
+ }
+ for extension in l_extensions:
+ COGS['rows'].append(
+ f"[{'X' if extension in self.extensions else ' '}] {extension}"
+ )
+
+ print(Fore.LIGHTBLUE_EX + NAME)
+ print(Style.RESET_ALL)
+ print(bordered(INFO, COGS))
+
+ print(f"\n{'=' * 118}\n\n")
async def on_resumed(self):
print(f"resumed... {self.uptime}")
@@ -98,21 +125,23 @@ class TuxBot(commands.AutoShardedBot):
async def bot_start(self):
self.session = aiohttp.ClientSession(loop=self.loop)
- await self.login(self.config.token, bot=True)
+ await self.login(self._config.token, bot=True)
await self.connect()
def run(self):
loop = self.loop
- loop.run_until_complete(Tortoise.init(
- db_url=self.config.postgresql,
- modules={
- "models": [
- "models.__init__"
- ]
- }
- ))
- loop.run_until_complete(Tortoise.generate_schemas())
+ # loop.run_until_complete(
+ # Tortoise.init(
+ # db_url=self._config.postgresql,
+ # modules={
+ # "models": [
+ # "models.__init__"
+ # ]
+ # }
+ # )
+ # )
+ # loop.run_until_complete(Tortoise.generate_schemas())
try:
loop.run_until_complete(self.bot_start())
@@ -129,7 +158,7 @@ def setup_logging():
logger.setLevel(logging.INFO)
try:
- handler = logging.FileHandler(filename='logs/tuxbot.log',
+ handler = logging.FileHandler(filename='tuxbot.log',
encoding='utf-8', mode='w')
fmt = logging.Formatter('[{levelname:<7}] [{asctime}]'
' {name}: {message}',
diff --git a/cogs/Logs.py b/cogs/Logs.py
index 070ca63..ae49164 100644
--- a/cogs/Logs.py
+++ b/cogs/Logs.py
@@ -293,7 +293,8 @@ class Logs(commands.Cog):
total = sum(self.bot.socket_stats.values())
cpm = total / minutes
await ctx.send(
- f'{total} socket events observed ({cpm:.2f}/minute):\n{self.bot.socket_stats}')
+ f'{total} socket events observed ({cpm:.2f}/minute):\n'
+ f'{self.bot.socket_stats}')
@commands.command('uptime')
async def _uptime(self, ctx):
diff --git a/cogs/Network.py b/cogs/Network.py
index b4ee2ce..2611c8e 100644
--- a/cogs/Network.py
+++ b/cogs/Network.py
@@ -60,7 +60,7 @@ class Network(commands.Cog, name="Useless"):
ip_info = obj.lookup()
try:
- handler = ipinfo.getHandler(self.bot.config.ipinfo)
+ handler = ipinfo.getHandler(self.bot._config.ipinfo)
details = handler.getDetails(target)
api_result = True
except (RequestQuotaExceededError, HTTPError):
diff --git a/configs/bot/settings.py.example b/configs/bot/settings.py.example
index 20efa53..84df70b 100644
--- a/configs/bot/settings.py.example
+++ b/configs/bot/settings.py.example
@@ -1,5 +1,6 @@
token = ""
-prefix = "drw."
+prefixes = ["drw."]
+default_locale = "en-US"
main_guild = int
diff --git a/requirements.txt b/requirements.txt
index 177da83..c47fc47 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,28 +1,11 @@
-aiofiles==0.5.0
-aiohttp==3.6.2
-aiosqlite==0.13.0
-astunparse==1.6.3
-async-timeout==3.0.1
-# asyncpg==0.20.1
-attrs==19.3.0
-braceexpand==0.1.5
-chardet==3.0.4
-ciso8601==2.1.3
-discord-flags==2.1.1
-discord.py==1.3.3
-humanize==2.4.0
-idna==2.9
-import-expression==1.1.2
-jishaku==1.18.2.188
-mpmath==1.1.0
-multidict==4.7.6
-Pillow==7.1.2
-psutil==5.7.0
-PyPika==0.37.6
-six==1.14.0
-# tortoise-orm==0.16.11
-typing-extensions==3.7.4.2
-websockets==8.1
-yarl==1.4.2
-ipinfo==3.0.0
-ipwhois==1.1.0
\ No newline at end of file
+discord.py
+discord-flags
+asyncpg
+tortoise-orm
+requests
+ipinfo
+ipwhois
+humanize
+psutil
+aiohttp
+colorama
\ No newline at end of file
diff --git a/utils/functions/cli.py b/utils/functions/cli.py
new file mode 100644
index 0000000..3763a21
--- /dev/null
+++ b/utils/functions/cli.py
@@ -0,0 +1,89 @@
+import codecs
+import itertools
+import sys
+
+
+def bordered(*columns: dict) -> str:
+ """
+ credits to https://github.com/Cog-Creators/Red-DiscordBot/blob/V3/develop/redbot/core/utils/chat_formatting.py
+
+ Get two blocks of text in a borders.
+
+ Note
+ ----
+ This will only work with a monospaced font.
+
+ Parameters
+ ----------
+ *columns : `sequence` of `str`
+ The columns of text, each being a list of lines in that column.
+
+ Returns
+ -------
+ str
+ The bordered text.
+
+ """
+ encoder = codecs.getencoder(sys.stdout.encoding)
+ try:
+ encoder("┌┐└┘─│") # border symbols
+ except UnicodeEncodeError:
+ ascii_border = True
+ else:
+ ascii_border = False
+
+ borders = {
+ "TL": "+" if ascii_border else "┌", # Top-left
+ "TR": "+" if ascii_border else "┐", # Top-right
+ "BL": "+" if ascii_border else "└", # Bottom-left
+ "BR": "+" if ascii_border else "┘", # Bottom-right
+ "HZ": "-" if ascii_border else "─", # Horizontal
+ "VT": "|" if ascii_border else "│", # Vertical
+ }
+
+ sep = " " * 4 # Separator between boxes
+ widths = tuple(
+ max(
+ len(row) for row in column.get('rows')
+ ) + 9
+ for column in columns
+ ) # width of each col
+ cols_done = [False] * len(columns) # whether or not each column is done
+ lines = [""]
+
+ for i, column in enumerate(columns):
+ lines[0] += "{TL}" + "{HZ}" + column.get('title') \
+ + "{HZ}" * (widths[i] - len(column.get('title')) - 1) \
+ + "{TR}" + sep
+
+ for line in itertools.zip_longest(
+ *[column.get('rows') for column in columns]
+ ):
+ row = []
+ for colidx, column in enumerate(line):
+ width = widths[colidx]
+ done = cols_done[colidx]
+ if column is None:
+ if not done:
+ # bottom border of column
+ column = "{HZ}" * width
+ row.append("{BL}" + column + "{BR}")
+ cols_done[colidx] = True # mark column as done
+ else:
+ # leave empty
+ row.append(" " * (width + 2))
+ else:
+ column += " " * (width - len(column)) # append padded spaces
+ row.append("{VT}" + column + "{VT}")
+
+ lines.append(sep.join(row))
+
+ final_row = []
+ for width, done in zip(widths, cols_done):
+ if not done:
+ final_row.append("{BL}" + "{HZ}" * width + "{BR}")
+ else:
+ final_row.append(" " * (width + 2))
+ lines.append(sep.join(final_row))
+
+ return "\n".join(lines).format(**borders)
diff --git a/utils/functions/extra.py b/utils/functions/extra.py
index 25d5a87..6783211 100644
--- a/utils/functions/extra.py
+++ b/utils/functions/extra.py
@@ -7,7 +7,7 @@ import discord
from discord.ext import commands, flags
from configs.bot.protected import protected
-from configs.bot.settings import prefix
+from configs.bot.settings import prefixes
class ContextPlus(commands.Context):
@@ -89,7 +89,7 @@ def group_extra(*args, **kwargs):
async def get_prefix(bot, message):
- custom_prefix = [prefix]
+ custom_prefix = prefixes
if message.guild:
path = f"configs/guilds/{str(message.guild.id)}.json"
diff --git a/version.py b/version.py
new file mode 100644
index 0000000..104307b
--- /dev/null
+++ b/version.py
@@ -0,0 +1,14 @@
+import subprocess
+from collections import namedtuple
+
+build = subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD'])\
+ .decode()
+
+VersionInfo = namedtuple('VersionInfo', 'major minor micro releaselevel build')
+version_info = VersionInfo(
+ major=3, minor=0, micro=0,
+ releaselevel='alpha', build=build
+)
+
+__version__ = "v{}.{}.{}"\
+ .format(version_info.major, version_info.minor, version_info.micro)
\ No newline at end of file