feat(cli|ui): add ~~beautiful~~ useless UI when launching bot

This commit is contained in:
Romain J 2020-06-02 01:47:24 +02:00
parent 2e76379c87
commit 28d1d71c5a
10 changed files with 247 additions and 98 deletions

View file

@ -1,11 +1,15 @@
<component name="ProjectDictionaryState"> <component name="ProjectDictionaryState">
<dictionary name="romain"> <dictionary name="romain">
<words> <words>
<w>commandstats</w>
<w>ipinfo</w> <w>ipinfo</w>
<w>iplocalise</w> <w>iplocalise</w>
<w>localiseip</w> <w>localiseip</w>
<w>postgresql</w> <w>postgresql</w>
<w>socketstats</w>
<w>splt</w> <w>splt</w>
<w>tutux</w>
<w>webhooks</w>
</words> </words>
</dictionary> </dictionary>
</component> </component>

View file

@ -1,17 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="a3206292-bb22-4c8b-9df5-9120f30ba1d3" name="5ed033fd0a73a530ba05810d iplocalise" comment=""> <list default="true" id="c97c8a30-7573-4dcd-a0d4-5bf94b8ddbbd" name="5ed57ed9960f35191182a924 core" comment="">
<change beforePath="$PROJECT_DIR$/configs/bot/protected.py" beforeDir="false" afterPath="$PROJECT_DIR$/configs/bot/protected.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/app.py" beforeDir="false" afterPath="$PROJECT_DIR$/app.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/cogs/Logs.py" beforeDir="false" afterPath="$PROJECT_DIR$/cogs/Logs.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/cogs/Network.py" beforeDir="false" afterPath="$PROJECT_DIR$/cogs/Network.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/configs/bot/settings.py.example" beforeDir="false" afterPath="$PROJECT_DIR$/configs/bot/settings.py.example" afterDir="false" /> <change beforePath="$PROJECT_DIR$/configs/bot/settings.py.example" beforeDir="false" afterPath="$PROJECT_DIR$/configs/bot/settings.py.example" afterDir="false" />
<change beforePath="$PROJECT_DIR$/requirements.txt" beforeDir="false" afterPath="$PROJECT_DIR$/requirements.txt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/utils/functions/extra.py" beforeDir="false" afterPath="$PROJECT_DIR$/utils/functions/extra.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/utils/functions/extra.py" beforeDir="false" afterPath="$PROJECT_DIR$/utils/functions/extra.py" afterDir="false" />
</list> </list>
<list id="77afe056-bf99-4d17-ac12-b340599c2650" name="5ed03423d0f94b557e83cafb ping" comment=""> <list id="a3abf5c0-7587-46e4-8f09-88e34a1ab8a4" name="5ed41911b012e33f68a07e7a i18n" comment="">
<change beforePath="$PROJECT_DIR$/.idea/dictionaries/romain.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/dictionaries/romain.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app.py" beforeDir="false" afterPath="$PROJECT_DIR$/app.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/app.py" beforeDir="false" afterPath="$PROJECT_DIR$/app.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/requirements.txt" beforeDir="false" afterPath="$PROJECT_DIR$/requirements.txt" afterDir="false" />
</list> </list>
<list id="6566fca1-2e90-48bb-9e74-dd3badbaca99" name="Default Changelist" comment=""> <list id="6566fca1-2e90-48bb-9e74-dd3badbaca99" name="Default Changelist" comment="">
<change beforePath="$PROJECT_DIR$/.idea/discord.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/discord.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
@ -29,6 +31,27 @@
<component name="Git.Settings"> <component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" /> <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component> </component>
<component name="LineStatusTrackerManager">
<file path="$PROJECT_DIR$/app.py">
<ranges>
<range start1="8" end1="8" start2="8" end2="9" changelist="c97c8a30-7573-4dcd-a0d4-5bf94b8ddbbd" />
<range start1="9" end1="10" start2="10" end2="10" changelist="c97c8a30-7573-4dcd-a0d4-5bf94b8ddbbd" />
<range start1="12" end1="12" start2="12" end2="13" changelist="c97c8a30-7573-4dcd-a0d4-5bf94b8ddbbd" />
<range start1="14" end1="14" start2="15" end2="16" changelist="c97c8a30-7573-4dcd-a0d4-5bf94b8ddbbd" />
<range start1="16" end1="16" start2="18" end2="27" changelist="c97c8a30-7573-4dcd-a0d4-5bf94b8ddbbd" />
<range start1="34" end1="35" start2="45" end2="48" changelist="c97c8a30-7573-4dcd-a0d4-5bf94b8ddbbd" />
<range start1="41" end1="45" start2="54" end2="59" changelist="c97c8a30-7573-4dcd-a0d4-5bf94b8ddbbd" />
<range start1="46" end1="48" start2="60" end2="60" changelist="c97c8a30-7573-4dcd-a0d4-5bf94b8ddbbd" />
<range start1="52" end1="53" start2="64" end2="64" changelist="c97c8a30-7573-4dcd-a0d4-5bf94b8ddbbd" />
<range start1="54" end1="57" start2="65" end2="66" changelist="c97c8a30-7573-4dcd-a0d4-5bf94b8ddbbd" />
<range start1="62" end1="70" start2="71" end2="97" changelist="c97c8a30-7573-4dcd-a0d4-5bf94b8ddbbd" />
<range start1="71" end1="72" start2="98" end2="99" changelist="c97c8a30-7573-4dcd-a0d4-5bf94b8ddbbd" />
<range start1="100" end1="101" start2="127" end2="128" changelist="c97c8a30-7573-4dcd-a0d4-5bf94b8ddbbd" />
<range start1="106" end1="115" start2="133" end2="144" changelist="c97c8a30-7573-4dcd-a0d4-5bf94b8ddbbd" />
<range start1="131" end1="132" start2="160" end2="161" changelist="a3abf5c0-7587-46e4-8f09-88e34a1ab8a4" />
</ranges>
</file>
</component>
<component name="ProjectId" id="1c8uTCADTYzyrek4IjGPAZUYsa9" /> <component name="ProjectId" id="1c8uTCADTYzyrek4IjGPAZUYsa9" />
<component name="ProjectLevelVcsManager" settingsEditedManually="true"> <component name="ProjectLevelVcsManager" settingsEditedManually="true">
<ConfirmationsSetting value="1" id="Add" /> <ConfirmationsSetting value="1" id="Add" />
@ -42,20 +65,23 @@
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true" /> <property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" /> <property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" /> <property name="WebServerToolWindowFactoryState" value="false" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/cogs" /> <property name="last_opened_file_path" value="/Volumes/Cache/tmp/Red-DiscordBot" />
<property name="node.js.detected.package.eslint" value="true" /> <property name="node.js.detected.package.eslint" value="true" />
<property name="node.js.detected.package.tslint" value="true" /> <property name="node.js.detected.package.tslint" value="true" />
<property name="node.js.path.for.package.eslint" value="project" /> <property name="node.js.path.for.package.eslint" value="project" />
<property name="node.js.path.for.package.tslint" value="project" /> <property name="node.js.path.for.package.tslint" value="project" />
<property name="node.js.selected.package.eslint" value="(autodetect)" /> <property name="node.js.selected.package.eslint" value="(autodetect)" />
<property name="node.js.selected.package.tslint" value="(autodetect)" /> <property name="node.js.selected.package.tslint" value="(autodetect)" />
<property name="settings.editor.selected.configurable" value="preferences.startup.tasks" /> <property name="settings.editor.selected.configurable" value="reference.settings.ide.settings.uml" />
<property name="tasks.open.task.update.state.enabled" value="false" />
</component> </component>
<component name="RecentsManager"> <component name="RecentsManager">
<key name="MoveFile.RECENT_KEYS"> <key name="MoveFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$" />
<recent name="$PROJECT_DIR$/cogs" /> <recent name="$PROJECT_DIR$/cogs" />
</key> </key>
<key name="CopyFile.RECENT_KEYS"> <key name="CopyFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/utils/locales" />
<recent name="$PROJECT_DIR$/cogs" /> <recent name="$PROJECT_DIR$/cogs" />
<recent name="$PROJECT_DIR$/configs/bot" /> <recent name="$PROJECT_DIR$/configs/bot" />
</key> </key>
@ -69,7 +95,7 @@
<created>1589922546510</created> <created>1589922546510</created>
<option name="number" value="Default" /> <option name="number" value="Default" />
<option name="presentableId" value="Default" /> <option name="presentableId" value="Default" />
<updated>1590880224598</updated> <updated>1590958395349</updated>
<workItem from="1589922559463" duration="2090000" /> <workItem from="1589922559463" duration="2090000" />
<workItem from="1589925987600" duration="7107000" /> <workItem from="1589925987600" duration="7107000" />
<workItem from="1589991138257" duration="2797000" /> <workItem from="1589991138257" duration="2797000" />
@ -88,27 +114,29 @@
<workItem from="1590755733508" duration="16000" /> <workItem from="1590755733508" duration="16000" />
<workItem from="1590878235258" duration="1205000" /> <workItem from="1590878235258" duration="1205000" />
<workItem from="1590880221861" duration="3000" /> <workItem from="1590880221861" duration="3000" />
<workItem from="1590958284823" duration="111000" />
</task> </task>
<task id="5ed03423d0f94b557e83cafb" summary="ping"> <task id="5ed41911b012e33f68a07e7a" summary="i18n">
<changelist id="77afe056-bf99-4d17-ac12-b340599c2650" name="5ed03423d0f94b557e83cafb ping" comment="" /> <changelist id="a3abf5c0-7587-46e4-8f09-88e34a1ab8a4" name="5ed41911b012e33f68a07e7a i18n" comment="" />
<created>1591054207986</created>
<option name="issue" value="true" /> <option name="issue" value="true" />
<url>https://trello.com/c/lpMrzLET/17-ping</url> <url>https://trello.com/c/vK0cBbF2/38-i18n</url>
<option name="number" value="17" /> <option name="number" value="38" />
<option name="presentableId" value="5ed03423d0f94b557e83cafb" /> <option name="presentableId" value="5ed41911b012e33f68a07e7a" />
<updated>1590880232278</updated> <updated>1591049955763</updated>
<workItem from="1590879444660" duration="777000" /> <workItem from="1590958395790" duration="2831000" />
<workItem from="1590880224862" duration="8000" /> <workItem from="1591015705338" duration="610000" />
<workItem from="1591040701796" duration="3916000" />
</task> </task>
<task active="true" id="5ed033fd0a73a530ba05810d" summary="iplocalise"> <task active="true" id="5ed57ed9960f35191182a924" summary="core">
<changelist id="a3206292-bb22-4c8b-9df5-9120f30ba1d3" name="5ed033fd0a73a530ba05810d iplocalise" comment="" /> <changelist id="c97c8a30-7573-4dcd-a0d4-5bf94b8ddbbd" name="5ed57ed9960f35191182a924 core" comment="" />
<created>1591054207986</created>
<option name="issue" value="true" /> <option name="issue" value="true" />
<url>https://trello.com/c/A5f7QCk2/11-iplocalise</url> <url>https://trello.com/c/SafaMBht/40-core</url>
<option name="number" value="11" /> <option name="number" value="40" />
<option name="presentableId" value="5ed033fd0a73a530ba05810d" /> <option name="presentableId" value="5ed57ed9960f35191182a924" />
<updated>1590880232278</updated> <updated>1591049955763</updated>
<workItem from="1590880232865" duration="2379000" /> <workItem from="1591049956280" duration="4910000" />
<workItem from="1590938725549" duration="4995000" />
<workItem from="1590957507554" duration="497000" />
</task> </task>
<option name="localTasksCounter" value="2" /> <option name="localTasksCounter" value="2" />
<option name="createBranch" value="false" /> <option name="createBranch" value="false" />
@ -148,22 +176,22 @@
<screen x="1920" y="0" width="1920" height="1080" /> <screen x="1920" y="0" width="1920" height="1080" />
</state> </state>
<state x="2629" y="379" width="462" height="333" key="#com.intellij.tools.ToolEditorDialog/1920.0.1920.1080/0.29.1920.1051@1920.0.1920.1080" timestamp="1590878943253" /> <state x="2629" y="379" width="462" height="333" key="#com.intellij.tools.ToolEditorDialog/1920.0.1920.1080/0.29.1920.1051@1920.0.1920.1080" timestamp="1590878943253" />
<state x="2663" y="313" width="428" height="484" key="FileChooserDialogImpl" timestamp="1590755745934"> <state x="2663" y="313" width="428" height="484" key="FileChooserDialogImpl" timestamp="1591044999557">
<screen x="1920" y="0" width="1920" height="1080" /> <screen x="1920" y="0" width="1920" height="1080" />
</state> </state>
<state x="2663" y="313" width="428" height="484" key="FileChooserDialogImpl/1920.0.1920.1080/0.29.1920.1051@1920.0.1920.1080" timestamp="1590755745934" /> <state x="2663" y="313" width="428" height="484" key="FileChooserDialogImpl/1920.0.1920.1080/0.29.1920.1051@1920.0.1920.1080" timestamp="1591044999557" />
<state x="2666" y="239" width="421" height="633" key="RollbackChangesDialog" timestamp="1589983513390"> <state x="2666" y="239" width="421" height="633" key="RollbackChangesDialog" timestamp="1589983513390">
<screen x="1920" y="0" width="1920" height="1080" /> <screen x="1920" y="0" width="1920" height="1080" />
</state> </state>
<state x="2666" y="239" width="421" height="633" key="RollbackChangesDialog/1920.0.1920.1080/0.29.1920.1051@1920.0.1920.1080" timestamp="1589983513390" /> <state x="2666" y="239" width="421" height="633" key="RollbackChangesDialog/1920.0.1920.1080/0.29.1920.1051@1920.0.1920.1080" timestamp="1589983513390" />
<state x="2362" y="183" key="SettingsEditor" timestamp="1590879331835"> <state x="2362" y="183" key="SettingsEditor" timestamp="1590959187656">
<screen x="1920" y="0" width="1920" height="1080" /> <screen x="1920" y="0" width="1920" height="1080" />
</state> </state>
<state x="2362" y="183" key="SettingsEditor/1920.0.1920.1080/0.29.1920.1051@1920.0.1920.1080" timestamp="1590879331835" /> <state x="2362" y="183" key="SettingsEditor/1920.0.1920.1080/0.29.1920.1051@1920.0.1920.1080" timestamp="1590959187656" />
<state x="2656" y="388" width="499" height="366" key="SimpleOpenTaskDialog" timestamp="1590880232304"> <state x="2656" y="388" width="499" height="366" key="SimpleOpenTaskDialog" timestamp="1591049955869">
<screen x="1920" y="0" width="1920" height="1080" /> <screen x="1920" y="0" width="1920" height="1080" />
</state> </state>
<state x="2656" y="388" width="499" height="366" key="SimpleOpenTaskDialog/1920.0.1920.1080/0.29.1920.1051@1920.0.1920.1080" timestamp="1590880232304" /> <state x="2656" y="388" width="499" height="366" key="SimpleOpenTaskDialog/1920.0.1920.1080/0.29.1920.1051@1920.0.1920.1080" timestamp="1591049955869" />
<state x="2727" y="471" width="299" height="169" key="VCS.ChangelistChooser" timestamp="1589983445998"> <state x="2727" y="471" width="299" height="169" key="VCS.ChangelistChooser" timestamp="1589983445998">
<screen x="1920" y="0" width="1920" height="1080" /> <screen x="1920" y="0" width="1920" height="1080" />
</state> </state>
@ -192,10 +220,10 @@
<screen x="1920" y="0" width="1920" height="1080" /> <screen x="1920" y="0" width="1920" height="1080" />
</state> </state>
<state x="2527" y="274" width="700" height="530" key="recent.locations.popup/1920.0.1920.1080/0.29.1920.1051@1920.0.1920.1080" timestamp="1589983638292" /> <state x="2527" y="274" width="700" height="530" key="recent.locations.popup/1920.0.1920.1080/0.29.1920.1051@1920.0.1920.1080" timestamp="1589983638292" />
<state x="2543" y="261" width="672" height="678" key="search.everywhere.popup" timestamp="1590943531475"> <state x="2543" y="261" width="672" height="678" key="search.everywhere.popup" timestamp="1591052733133">
<screen x="1920" y="0" width="1920" height="1080" /> <screen x="1920" y="0" width="1920" height="1080" />
</state> </state>
<state x="2543" y="261" width="672" height="678" key="search.everywhere.popup/1920.0.1920.1080/0.29.1920.1051@1920.0.1920.1080" timestamp="1590943531475" /> <state x="2543" y="261" width="672" height="678" key="search.everywhere.popup/1920.0.1920.1080/0.29.1920.1051@1920.0.1920.1080" timestamp="1591052733133" />
</component> </component>
<component name="XDebuggerManager"> <component name="XDebuggerManager">
<breakpoint-manager> <breakpoint-manager>

91
app.py
View file

@ -6,14 +6,25 @@ from typing import List
import aiohttp import aiohttp
import discord import discord
from colorama import Fore, Style, init
from discord.ext import commands from discord.ext import commands
from tortoise import Tortoise
from configs.bot import settings from configs.bot import settings
from utils.functions.cli import bordered
from utils.functions.extra import ContextPlus, get_prefix, \ from utils.functions.extra import ContextPlus, get_prefix, \
get_owners, get_blacklist get_owners, get_blacklist
from version import __version__
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
init()
NAME = r"""
_____ _ _ _ _
|_ _| ___ _| |__ ___ | |_ | |__ ___ | |_
| || | | \ \/ / '_ \ / _ \| __|____| '_ \ / _ \| __|
| || |_| |> <| |_) | (_) | ||_____| |_) | (_) | |_
|_| \__,_/_/\_\_.__/ \___/ \__| |_.__/ \___/ \__|
"""
l_extensions: List[str] = [ l_extensions: List[str] = [
"jishaku", "jishaku",
@ -32,42 +43,58 @@ class TuxBot(commands.AutoShardedBot):
def __init__(self): def __init__(self):
self.uptime = datetime.datetime.utcnow() self.uptime = datetime.datetime.utcnow()
self.config = settings self._config = settings
self.locale = self._config.default_locale
super().__init__( super().__init__(
command_prefix=get_prefix, command_prefix=get_prefix,
case_insensitive=True case_insensitive=True
) )
self.logs_channels = { self.logs_channels = {
"dm": self.config.logs["dm"], "dm": self._config.logs["dm"],
"mentions": self.config.logs["mentions"], "mentions": self._config.logs["mentions"],
"guilds": self.config.logs["guilds"], "guilds": self._config.logs["guilds"],
"errors": self.config.logs["errors"], "errors": self._config.logs["errors"],
"gateway": self._config.logs["gateway"],
} }
print("\n"*2)
for extension in l_extensions: for extension in l_extensions:
try: try:
self.load_extension(extension) self.load_extension(extension)
print(extension, "loaded !")
except Exception as e: except Exception as e:
print(f"{type(e).__name__ }:", e) log.warning(f"{type(e).__name__}: {e}")
print("\n"*2)
async def is_owner(self, user: discord.User): async def is_owner(self, user: discord.User):
return user.id in get_owners() return user.id in get_owners()
async def on_ready(self): async def on_ready(self):
print(f"Connected !\n" INFO = {
f"\n" 'title': "INFO",
f"==> info: bot username {self.user}\n" 'rows': [
f" info: bot id {self.user.id}\n" str(self.user),
f" info: bot prefix {self.command_prefix}\n" f"Prefixes: {', '.join(self._config.prefixes)}",
f"==> info: guild count {len(self.guilds)}\n" f"Language: {self.locale}",
f" info: member count {len(list(self.get_all_members()))}\n" f"Tuxbot Version: {__version__}",
f" info: channel count {len(list(self.get_all_channels()))}") f"Discord.py Version: {discord.__version__}",
f"Shards: {self.shard_count}",
f"Servers: {len(self.guilds)}",
f"Users: {len(self.users)}"
]
}
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") print(f"\n{'=' * 118}\n\n")
@ -98,21 +125,23 @@ class TuxBot(commands.AutoShardedBot):
async def bot_start(self): async def bot_start(self):
self.session = aiohttp.ClientSession(loop=self.loop) 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() await self.connect()
def run(self): def run(self):
loop = self.loop loop = self.loop
loop.run_until_complete(Tortoise.init( # loop.run_until_complete(
db_url=self.config.postgresql, # Tortoise.init(
modules={ # db_url=self._config.postgresql,
"models": [ # modules={
"models.__init__" # "models": [
] # "models.__init__"
} # ]
)) # }
loop.run_until_complete(Tortoise.generate_schemas()) # )
# )
# loop.run_until_complete(Tortoise.generate_schemas())
try: try:
loop.run_until_complete(self.bot_start()) loop.run_until_complete(self.bot_start())
@ -129,7 +158,7 @@ def setup_logging():
logger.setLevel(logging.INFO) logger.setLevel(logging.INFO)
try: try:
handler = logging.FileHandler(filename='logs/tuxbot.log', handler = logging.FileHandler(filename='tuxbot.log',
encoding='utf-8', mode='w') encoding='utf-8', mode='w')
fmt = logging.Formatter('[{levelname:<7}] [{asctime}]' fmt = logging.Formatter('[{levelname:<7}] [{asctime}]'
' {name}: {message}', ' {name}: {message}',

View file

@ -293,7 +293,8 @@ class Logs(commands.Cog):
total = sum(self.bot.socket_stats.values()) total = sum(self.bot.socket_stats.values())
cpm = total / minutes cpm = total / minutes
await ctx.send( 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') @commands.command('uptime')
async def _uptime(self, ctx): async def _uptime(self, ctx):

View file

@ -60,7 +60,7 @@ class Network(commands.Cog, name="Useless"):
ip_info = obj.lookup() ip_info = obj.lookup()
try: try:
handler = ipinfo.getHandler(self.bot.config.ipinfo) handler = ipinfo.getHandler(self.bot._config.ipinfo)
details = handler.getDetails(target) details = handler.getDetails(target)
api_result = True api_result = True
except (RequestQuotaExceededError, HTTPError): except (RequestQuotaExceededError, HTTPError):

View file

@ -1,5 +1,6 @@
token = "" token = ""
prefix = "drw." prefixes = ["drw."]
default_locale = "en-US"
main_guild = int main_guild = int

View file

@ -1,28 +1,11 @@
aiofiles==0.5.0 discord.py
aiohttp==3.6.2 discord-flags
aiosqlite==0.13.0 asyncpg
astunparse==1.6.3 tortoise-orm
async-timeout==3.0.1 requests
# asyncpg==0.20.1 ipinfo
attrs==19.3.0 ipwhois
braceexpand==0.1.5 humanize
chardet==3.0.4 psutil
ciso8601==2.1.3 aiohttp
discord-flags==2.1.1 colorama
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

89
utils/functions/cli.py Normal file
View file

@ -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)

View file

@ -7,7 +7,7 @@ import discord
from discord.ext import commands, flags from discord.ext import commands, flags
from configs.bot.protected import protected from configs.bot.protected import protected
from configs.bot.settings import prefix from configs.bot.settings import prefixes
class ContextPlus(commands.Context): class ContextPlus(commands.Context):
@ -89,7 +89,7 @@ def group_extra(*args, **kwargs):
async def get_prefix(bot, message): async def get_prefix(bot, message):
custom_prefix = [prefix] custom_prefix = prefixes
if message.guild: if message.guild:
path = f"configs/guilds/{str(message.guild.id)}.json" path = f"configs/guilds/{str(message.guild.id)}.json"

14
version.py Normal file
View file

@ -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)