feat(meta): Implement meta commands.
This commit is contained in:
@@ -12,6 +12,8 @@ ALSO_READ = config/emojis.conf, config/secrets.conf, config/gui.conf
|
|||||||
asset_path = assets
|
asset_path = assets
|
||||||
|
|
||||||
support_guild =
|
support_guild =
|
||||||
|
invite_bot =
|
||||||
|
|
||||||
|
|
||||||
[ENDPOINTS]
|
[ENDPOINTS]
|
||||||
guild_log =
|
guild_log =
|
||||||
|
|||||||
@@ -1,13 +1,19 @@
|
|||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
import gc
|
||||||
|
import sys
|
||||||
import asyncio
|
import asyncio
|
||||||
|
|
||||||
import discord
|
import discord
|
||||||
from discord.ext import commands as cmds
|
from discord.ext import commands as cmds
|
||||||
from discord import app_commands as appcmds
|
from discord import app_commands as appcmds
|
||||||
|
from data.queries import ORDER
|
||||||
|
from utils.lib import tabulate
|
||||||
|
|
||||||
from wards import low_management
|
from wards import low_management
|
||||||
from meta import LionBot, LionCog, LionContext
|
from meta import LionBot, LionCog, LionContext
|
||||||
|
from data import Table
|
||||||
from utils.ui import AButton, AsComponents
|
from utils.ui import AButton, AsComponents
|
||||||
|
from utils.lib import utc_now
|
||||||
|
|
||||||
from . import babel
|
from . import babel
|
||||||
from .helpui import HelpUI
|
from .helpui import HelpUI
|
||||||
@@ -15,6 +21,9 @@ from .helpui import HelpUI
|
|||||||
_p = babel._p
|
_p = babel._p
|
||||||
|
|
||||||
|
|
||||||
|
created = utc_now()
|
||||||
|
|
||||||
|
|
||||||
class MetaCog(LionCog):
|
class MetaCog(LionCog):
|
||||||
def __init__(self, bot: LionBot):
|
def __init__(self, bot: LionBot):
|
||||||
self.bot = bot
|
self.bot = bot
|
||||||
@@ -27,6 +36,8 @@ class MetaCog(LionCog):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
async def help_cmd(self, ctx: LionContext):
|
async def help_cmd(self, ctx: LionContext):
|
||||||
|
if not ctx.interaction:
|
||||||
|
return
|
||||||
await ctx.interaction.response.defer(thinking=True, ephemeral=True)
|
await ctx.interaction.response.defer(thinking=True, ephemeral=True)
|
||||||
ui = HelpUI(
|
ui = HelpUI(
|
||||||
ctx.bot,
|
ctx.bot,
|
||||||
@@ -35,3 +46,297 @@ class MetaCog(LionCog):
|
|||||||
show_admin=await low_management(ctx.bot, ctx.author, ctx.guild),
|
show_admin=await low_management(ctx.bot, ctx.author, ctx.guild),
|
||||||
)
|
)
|
||||||
await ui.run(ctx.interaction)
|
await ui.run(ctx.interaction)
|
||||||
|
|
||||||
|
@cmds.hybrid_command(
|
||||||
|
name=_p('cmd:invite', "invite"),
|
||||||
|
description=_p(
|
||||||
|
'cmd:invite|desc',
|
||||||
|
"Invite LionBot to your own server."
|
||||||
|
)
|
||||||
|
)
|
||||||
|
async def invite_cmd(self, ctx: LionContext):
|
||||||
|
t = self.bot.translator.t
|
||||||
|
|
||||||
|
embed = discord.Embed(
|
||||||
|
colour=discord.Colour.orange(),
|
||||||
|
description=t(_p(
|
||||||
|
'cmd:invite|embed|desc',
|
||||||
|
"[Click here]({invite_link}) to add me to your server."
|
||||||
|
)).format(
|
||||||
|
invite_link=self.bot.config.bot.invite_bot,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
embed.add_field(
|
||||||
|
name=t(_p(
|
||||||
|
'cmd:invite|embed|field:tips|name',
|
||||||
|
"Setup Tips"
|
||||||
|
)),
|
||||||
|
value=t(_p(
|
||||||
|
'cmd:invite|embed|field:tips|value',
|
||||||
|
"Remember to check out {help_cmd} for the important command list,"
|
||||||
|
" including the admin page which displays the hidden admin-level"
|
||||||
|
" configuration commands like {dashboard}!\n"
|
||||||
|
"Also, if you have any issues or questions,"
|
||||||
|
" you can join our [support server]({support_link}) to talk to our friendly"
|
||||||
|
" support team!"
|
||||||
|
)).format(
|
||||||
|
help_cmd=self.bot.core.mention_cmd('help'),
|
||||||
|
dashboard=self.bot.core.mention_cmd('dashboard'),
|
||||||
|
support_link=self.bot.config.bot.support_guild,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
await ctx.reply(embed=embed, ephemeral=True)
|
||||||
|
|
||||||
|
@cmds.hybrid_command(
|
||||||
|
name=_p('cmd:support', "support"),
|
||||||
|
description=_p(
|
||||||
|
'cmd:support|desc',
|
||||||
|
"Have an issue or a question? Speak to my friendly support team here."
|
||||||
|
)
|
||||||
|
)
|
||||||
|
async def support_cmd(self, ctx: LionContext):
|
||||||
|
t = self.bot.translator.t
|
||||||
|
await ctx.reply(
|
||||||
|
t(_p(
|
||||||
|
'cmd:support|response',
|
||||||
|
"Speak to my friendly support team by joining this server and making a ticket"
|
||||||
|
" in the support channel!\n"
|
||||||
|
"{support_link}"
|
||||||
|
)).format(support_link=self.bot.config.bot.support_guild),
|
||||||
|
ephemeral=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
@cmds.hybrid_command(
|
||||||
|
name=_p('cmd:nerd', "nerd"),
|
||||||
|
description=_p(
|
||||||
|
'cmd:nerd|desc',
|
||||||
|
"View hidden details and statistics about me ('nerd statistics')",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
async def nerd_cmd(self, ctx: LionContext):
|
||||||
|
t = self.bot.translator.t
|
||||||
|
|
||||||
|
if ctx.interaction:
|
||||||
|
await ctx.interaction.response.defer(thinking=True)
|
||||||
|
|
||||||
|
embed = discord.Embed(
|
||||||
|
colour=discord.Colour.orange(),
|
||||||
|
title=t(_p(
|
||||||
|
'cmd:nerd|title',
|
||||||
|
"Nerd Statistics"
|
||||||
|
)),
|
||||||
|
)
|
||||||
|
if ctx.guild:
|
||||||
|
embed.set_footer(
|
||||||
|
text=f"Your guildid: {ctx.guild.id}"
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
embed.set_footer(
|
||||||
|
text="Sent from direct message"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Bot Stats
|
||||||
|
bot_stats_lines = []
|
||||||
|
|
||||||
|
# Currently {n} people active in {m} rooms of {n} guilds
|
||||||
|
query = await Table('voice_sessions_ongoing').bind(self.bot.db).select_one_where(
|
||||||
|
).select(
|
||||||
|
total_users='COUNT(userid)',
|
||||||
|
total_rooms='COUNT(channelid)',
|
||||||
|
total_guilds='COUNT(guildid)',
|
||||||
|
)
|
||||||
|
bot_stats_lines.append((
|
||||||
|
t(_p('cmd:nerd|field:currently|name', "Currently")),
|
||||||
|
t(_p(
|
||||||
|
'cmd:nerd|field:currently|value',
|
||||||
|
"`{people}` people active in `{rooms}` rooms of `{guilds}` guilds."
|
||||||
|
)).format(
|
||||||
|
people=query['total_users'],
|
||||||
|
rooms=query['total_rooms'],
|
||||||
|
guilds=query['total_guilds']
|
||||||
|
)
|
||||||
|
))
|
||||||
|
|
||||||
|
# Recorded {h} voice hours from {n} people across {n} sessions
|
||||||
|
query = await Table('voice_sessions').bind(self.bot.db).select_one_where(
|
||||||
|
).select(
|
||||||
|
total_hours='SUM(duration) / 3600',
|
||||||
|
total_users='COUNT(userid)',
|
||||||
|
total_sessions='COUNT(*)',
|
||||||
|
)
|
||||||
|
bot_stats_lines.append((
|
||||||
|
t(_p('cmd:nerd|field:recorded|name', "Recorded")),
|
||||||
|
t(_p(
|
||||||
|
'cmd:nerd|field:recorded|value',
|
||||||
|
"`{hours}` voice hours from `{users}` people across `{sessions}` sessions."
|
||||||
|
)).format(
|
||||||
|
hours=query['total_hours'],
|
||||||
|
users=query['total_users'],
|
||||||
|
sessions=query['total_sessions'],
|
||||||
|
)
|
||||||
|
))
|
||||||
|
|
||||||
|
# Registered {n} users and {m} guilds
|
||||||
|
query1 = await Table('user_config').bind(self.bot.db).select_one_where(
|
||||||
|
).select(total_users='COUNT(*)')
|
||||||
|
query2 = await Table('guild_config').bind(self.bot.db).select_one_where(
|
||||||
|
).select(total_guilds='COUNT(*)')
|
||||||
|
bot_stats_lines.append((
|
||||||
|
t(_p('cmd:nerd|field:registered|name', "Registered")),
|
||||||
|
t(_p(
|
||||||
|
'cmd:nerd|field:registered|value',
|
||||||
|
"`{users}` users and `{guilds}` guilds."
|
||||||
|
)).format(
|
||||||
|
users=query1['total_users'],
|
||||||
|
guilds=query2['total_guilds'],
|
||||||
|
)
|
||||||
|
))
|
||||||
|
|
||||||
|
# {n} tasks completed out of {m}
|
||||||
|
query = await Table('tasklist').bind(self.bot.db).select_one_where(
|
||||||
|
).select(
|
||||||
|
total_tasks='COUNT(*)',
|
||||||
|
total_completed='COUNT(*) filter (WHERE completed_at IS NOT NULL)',
|
||||||
|
)
|
||||||
|
bot_stats_lines.append((
|
||||||
|
t(_p('cmd:nerd|field:tasks|name', "Tasks")),
|
||||||
|
t(_p(
|
||||||
|
'cmd:nerd|field:tasks|value',
|
||||||
|
"`{tasks}` tasks completed out of `{total}`."
|
||||||
|
)).format(
|
||||||
|
tasks=query['total_completed'], total=query['total_tasks']
|
||||||
|
)
|
||||||
|
))
|
||||||
|
|
||||||
|
# {m} timers running across {n} guilds
|
||||||
|
query = await Table('timers').bind(self.bot.db).select_one_where(
|
||||||
|
).select(
|
||||||
|
total_timers='COUNT(*)',
|
||||||
|
guilds='COUNT(guildid)'
|
||||||
|
)
|
||||||
|
bot_stats_lines.append((
|
||||||
|
t(_p('cmd:nerd|field:timers|name', "Timers")),
|
||||||
|
t(_p(
|
||||||
|
'cmd:nerd|field:timers|value',
|
||||||
|
"`{timers}` timers running across `{guilds}` guilds."
|
||||||
|
)).format(
|
||||||
|
timers=query['total_timers'],
|
||||||
|
guilds=query['guilds'],
|
||||||
|
)
|
||||||
|
))
|
||||||
|
|
||||||
|
bot_stats_section = '\n'.join(tabulate(*bot_stats_lines))
|
||||||
|
embed.add_field(
|
||||||
|
name=t(_p('cmd:nerd|section:bot_stats|name', "Bot Stats")),
|
||||||
|
value=bot_stats_section,
|
||||||
|
inline=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
# ----- Process -----
|
||||||
|
process_lines = []
|
||||||
|
|
||||||
|
# Shard {n} of {n}
|
||||||
|
process_lines.append((
|
||||||
|
t(_p('cmd:nerd|field:shard|name', "Shard")),
|
||||||
|
t(_p(
|
||||||
|
'cmd:nerd|field:shard|value',
|
||||||
|
"`{shard_number}` of `{shard_count}`"
|
||||||
|
)).format(shard_number=self.bot.shard_id, shard_count=self.bot.shard_count)
|
||||||
|
))
|
||||||
|
|
||||||
|
# Guilds
|
||||||
|
process_lines.append((
|
||||||
|
t(_p('cmd:nerd|field:guilds|name', "Guilds")),
|
||||||
|
t(_p(
|
||||||
|
'cmd:nerd|field:guilds|value',
|
||||||
|
"`{guilds}` guilds with `{count}` total members."
|
||||||
|
)).format(
|
||||||
|
guilds=len(self.bot.guilds),
|
||||||
|
count=sum(guild.member_count or 0 for guild in self.bot.guilds)
|
||||||
|
)
|
||||||
|
))
|
||||||
|
|
||||||
|
# Version
|
||||||
|
version = await self.bot.db.version()
|
||||||
|
process_lines.append((
|
||||||
|
t(_p('cmd:nerd|field:version|name', "Leo Version")),
|
||||||
|
t(_p(
|
||||||
|
'cmd:nerd|field:version|value',
|
||||||
|
"`v{version}`, last updated {timestamp} from `{reason}`."
|
||||||
|
)).format(
|
||||||
|
version=version.version,
|
||||||
|
timestamp=discord.utils.format_dt(version.time, 'D'),
|
||||||
|
reason=version.author,
|
||||||
|
)
|
||||||
|
))
|
||||||
|
|
||||||
|
# Py version
|
||||||
|
py_version = sys.version.split()[0]
|
||||||
|
dpy_version = discord.__version__
|
||||||
|
process_lines.append((
|
||||||
|
t(_p('cmd:nerd|field:py_version|name', "Py Version")),
|
||||||
|
t(_p(
|
||||||
|
'cmd:nerd|field:py_version|value',
|
||||||
|
"`{py_version}` running discord.py `{dpy_version}`"
|
||||||
|
)).format(
|
||||||
|
py_version=py_version, dpy_version=dpy_version,
|
||||||
|
)
|
||||||
|
))
|
||||||
|
|
||||||
|
process_section = '\n'.join(tabulate(*process_lines))
|
||||||
|
embed.add_field(
|
||||||
|
name=t(_p('cmd:nerd|section:process_section|name', "Process")),
|
||||||
|
value=process_section,
|
||||||
|
inline=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
# ----- Shard Statistics -----
|
||||||
|
shard_lines = []
|
||||||
|
|
||||||
|
# Handling `n` events
|
||||||
|
shard_lines.append((
|
||||||
|
t(_p('cmd:nerd|field:handling|name', "Handling")),
|
||||||
|
t(_p(
|
||||||
|
'cmd:nerd|field:handling|name',
|
||||||
|
"`{events}` active commands and events."
|
||||||
|
)).format(
|
||||||
|
events=len(self.bot._running_events)
|
||||||
|
),
|
||||||
|
))
|
||||||
|
|
||||||
|
# Working on n background tasks
|
||||||
|
shard_lines.append((
|
||||||
|
t(_p('cmd:nerd|field:working|name', "Working On")),
|
||||||
|
t(_p(
|
||||||
|
'cmd:nerd|field:working|value',
|
||||||
|
"`{tasks}` background tasks."
|
||||||
|
)).format(tasks=len(asyncio.all_tasks()))
|
||||||
|
))
|
||||||
|
|
||||||
|
# Count objects in memory
|
||||||
|
shard_lines.append((
|
||||||
|
t(_p('cmd:nerd|field:objects|name', "Objects")),
|
||||||
|
t(_p(
|
||||||
|
'cmd:nerd|field:objects|value',
|
||||||
|
"`{objects}` loaded in memory."
|
||||||
|
)).format(objects=gc.get_count())
|
||||||
|
))
|
||||||
|
|
||||||
|
# Uptime
|
||||||
|
uptime = int((utc_now() - created).total_seconds())
|
||||||
|
uptimestr = (
|
||||||
|
f"`{uptime // (24 * 3600)}` days, `{uptime // 3600 % 24:02}:{uptime // 60 % 60:02}:{uptime % 60:02}`"
|
||||||
|
)
|
||||||
|
shard_lines.append((
|
||||||
|
t(_p('cmd:nerd|field:uptime|name', "Uptime")),
|
||||||
|
uptimestr,
|
||||||
|
))
|
||||||
|
|
||||||
|
shard_section = '\n'.join(tabulate(*shard_lines))
|
||||||
|
embed.add_field(
|
||||||
|
name=t(_p('cmd:nerd|section:shard_section|name', "Shard Statistics")),
|
||||||
|
value=shard_section,
|
||||||
|
inline=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
await ctx.reply(embed=embed)
|
||||||
|
|||||||
Reference in New Issue
Block a user