PagerMaid-Discord/pagermaid/modules/system.py
2021-07-25 18:19:48 +08:00

118 lines
4.2 KiB
Python

""" The system module. """
import sys
from platform import uname
import discord
from discord.ext import commands
from subprocess import run, PIPE
from requests import head
from requests.exceptions import MissingSchema, InvalidURL, ConnectionError
from pagermaid import color, des_handler, par_handler, redis_status
from pagermaid.utils import process_command
class Info(commands.Cog):
def __init__(self, bot):
self.bot = bot
@commands.command()
async def info(self, ctx):
git_hash = run("git rev-parse --short HEAD", stdout=PIPE, shell=True).stdout.decode().strip()
get_hash_link = f"https://github.com/Xtao-Labs/PagerMaid-Discord/commit/{git_hash}"
dpy_repo = "https://github.com/Rapptz/discord.py"
python_url = "https://www.python.org/"
app_info = await self.bot.application_info()
if app_info.team:
owner = app_info.team.name
else:
owner = app_info.owner
dpy_version = "[{}]({})".format(discord.__version__, dpy_repo)
python_version = "[{}.{}.{}]({})".format(*sys.version_info[:3], python_url)
git_version = "[{}]({})".format(git_hash, get_hash_link)
database = '在线' if redis_status() else '离线'
embed = discord.Embed(title="PagerMaid-Discord 运行状态", color=color)
embed.add_field(name="实例创建者", value=str(owner))
embed.add_field(name="Python", value=python_version)
embed.add_field(name="discord.py", value=dpy_version)
embed.add_field(name="Git commit", value=git_version)
embed.add_field(name="主机名", value=uname().node)
embed.add_field(name="主机平台", value=sys.platform)
embed.add_field(name="Kernel", value=uname().release)
embed.add_field(name="数据库", value=database)
embed.add_field(name="服务器数", value=str(len(self.bot.guilds)))
embed.add_field(name="交流群", value='[点击加入](https://discord.gg/A4mWpa83e6)')
embed.add_field(name="邀请", value=f'[点击邀请](https://discord.com/oauth2/authorize'
f'?client_id={app_info.id}&scope=bot)')
await ctx.send(embed=embed)
@commands.command()
async def trace(self, context):
message = process_command(context)
if len(message.parameters) == 1:
url = message.arguments
if url.startswith("https://") or url.startswith("http://"):
pass
else:
url = "https://" + url
msg = await context.reply('跟踪重定向中...')
result = str("")
for url in url_tracer(url):
count = 0
if result:
result += "\n" + url
else:
result = url
if count == 128:
result += f"\n\n重定向超过 128 次,已停止追踪。"
break
if result:
if len(result) > 2000:
result = result[:2000]
await msg.edit(content=f"跟踪重定向:\n"
f"{result}")
else:
await msg.edit(content='服务器连接失败。')
else:
await context.reply('您好像输入了一个无效的参数。')
@commands.command()
async def servers(self, context):
guilds = sorted(self.bot.guilds, key=lambda s: s.name.lower())
msg = "\n".join(f"{guild.name} (`{guild.id}`)" for guild in guilds)
await context.send(msg)
des_handler('info', '查看程序信息。')
par_handler('info', '')
des_handler('trace', '追踪重定向。')
par_handler('trace', '<url>')
des_handler('servers', '列出所有服务器。')
par_handler('servers', '')
def setup(bot):
bot.add_cog(Info(bot))
def url_tracer(url):
""" Method to trace URL redirects. """
while True:
yield url
try:
response = head(url)
except MissingSchema:
break
except InvalidURL:
break
except ConnectionError:
break
if 300 < response.status_code < 400:
url = response.headers['location']
else:
break