Add prefix and alias plugin

This commit is contained in:
iwumingz 2022-04-08 22:01:22 +08:00
parent 77ee959821
commit baf3b8e1dc
2 changed files with 153 additions and 3 deletions

View File

@ -2,16 +2,19 @@ import asyncio
import sys import sys
from core import command from core import command
from loguru import logger
from pyrogram import Client from pyrogram import Client
from pyrogram.types import Message from pyrogram.types import Message
from tools.constants import SYCGRAM, SYCGRAM_ERROR, SYCGRAM_INFO, SYCGRAM_WARNING, UPDATE_CMD from tools.constants import (SYCGRAM, SYCGRAM_ERROR, SYCGRAM_INFO,
from tools.helpers import basher SYCGRAM_WARNING, UPDATE_CMD)
from tools.helpers import Parameters, basher, get_cmd_error
from tools.updates import get_alias_of_cmds, reset_cmd_alias, update_cmd_alias, update_cmd_prefix
@Client.on_message(command("restart")) @Client.on_message(command("restart"))
async def restart(_: Client, msg: Message): async def restart(_: Client, msg: Message):
"""重启容器""" """重启容器"""
text = f"**{SYCGRAM_INFO}**\n> # `The {SYCGRAM} is restarting......`" text = f"**{SYCGRAM_INFO}**\n> # `Restarting {SYCGRAM} ......`"
await msg.edit_text(text=text, parse_mode='md') await msg.edit_text(text=text, parse_mode='md')
sys.exit() sys.exit()
@ -31,3 +34,72 @@ async def update(_: Client, msg: Message):
text = f"**{SYCGRAM_INFO}**\n> # `Your {SYCGRAM} version is the latest.`" text = f"**{SYCGRAM_INFO}**\n> # `Your {SYCGRAM} version is the latest.`"
finally: finally:
await msg.edit_text(text, parse_mode='md') await msg.edit_text(text, parse_mode='md')
@Client.on_message(command("prefix"))
async def prefix(_: Client, msg: Message):
"""更改所有指令的前缀"""
_, pfx = Parameters.get(msg)
punctuation = list("""!#$%&*+,-./:;=?@^~!?。,;·\\""")
if len(pfx) == 0 or len(pfx) > 1 or pfx not in punctuation:
text = f"**{SYCGRAM_WARNING}**\n> # `Prefix must be one of {' '.join(punctuation)}`"
await msg.edit_text(text, parse_mode='md')
return
try:
update_cmd_prefix(pfx)
except Exception as e:
text = f"**{SYCGRAM_ERROR}**\n> # `{e}`"
logger.error(e)
await msg.edit_text(text, parse_mode='md')
else:
text = f"**{SYCGRAM_INFO}**\n> # `Restarting {SYCGRAM} prefix of all commands.`"
await msg.edit_text(text, parse_mode='md')
sys.exit()
@Client.on_message(command("alias"))
async def alias(_: Client, msg: Message):
"""
cmd: alias
format: -alias <set> <source> <to> or -alias <reset> <source> or -alias <list>
usage: 修改指令别名
"""
cmd, args = Parameters.get_more(msg)
if len(args) == 3 and args[0] == 'set':
_, source, to = args
try:
update_cmd_alias(source, to)
except Exception as e:
text = f"**{SYCGRAM_ERROR}**\n> # `{e}`"
logger.error(e)
await msg.edit_text(text, parse_mode='md')
else:
text = f"**{SYCGRAM_INFO}**\n> # `Updating alias of <{source}> to <{to}> ...`"
await msg.edit_text(text, parse_mode='md')
sys.exit()
elif len(args) == 2 and args[0] == 'reset':
_, source = args
try:
reset_cmd_alias(source)
except Exception as e:
text = f"**{SYCGRAM_ERROR}**\n> # `{e}`"
logger.error(e)
await msg.edit_text(text, parse_mode='md')
else:
text = f"**{SYCGRAM_INFO}**\n> # `Reset alias of <{source}> ...`"
await msg.edit_text(text, parse_mode='md')
sys.exit()
elif len(args) == 1 and args[0] == 'list':
try:
text = get_alias_of_cmds()
except Exception as e:
text = f"**{SYCGRAM_ERROR}**\n> # `{e}`"
logger.error(e)
await msg.edit_text(text, parse_mode='md')
else:
await msg.edit_text(text, parse_mode='md')
else:
await msg.edit_text(get_cmd_error(cmd))

78
tools/updates.py Normal file
View File

@ -0,0 +1,78 @@
import re
from typing import Any, Dict
import yaml
from tools.constants import COMMAND_YML
def update_cmd_yml(cmd_yml: Dict[str, Any]):
with open(COMMAND_YML, 'w', encoding='utf-8') as f:
yaml.dump(cmd_yml, f, allow_unicode=True)
def modify_cmd_prefix(pfx: str) -> Dict[str, Any]:
with open(COMMAND_YML, "rb") as f:
cmd_yml: Dict[str, Any] = yaml.full_load(f)
old_pfx = cmd_yml['help']['all_prefixes']
cmd_yml['help']['all_prefixes'] = pfx
# 读取每个指令的kv
for every_cmd in cmd_yml.values():
get_cmd = every_cmd['cmd']
old_cmd = rf"[{old_pfx}]{get_cmd}"
new_cmd = f"{pfx}{get_cmd}"
every_cmd['format'] = re.sub(old_cmd, new_cmd, every_cmd['format'])
# 返回已修改过所有指令前缀的一个大字典
return cmd_yml
def update_cmd_prefix(pfx: str) -> None:
try:
cmd_yml = modify_cmd_prefix(pfx)
except Exception as e:
raise e
else:
update_cmd_yml(cmd_yml=cmd_yml)
def modify_cmd_alias(source: str, new_cmd: str) -> Dict[str, Any]:
with open(COMMAND_YML, "rb") as f:
cmd_yml: Dict[str, Any] = yaml.full_load(f)
if not cmd_yml.get(source):
raise ValueError(f"The {source} Command Not Found")
pfx = cmd_yml.get('help').get('all_prefixes')
old_cmd = cmd_yml[source]['cmd']
old_fmt = rf"[{pfx}]{old_cmd}"
new_fmt = f"{pfx}{new_cmd}"
cmd_yml[source]['cmd'] = new_cmd
cmd_yml[source]['format'] = re.sub(
old_fmt, new_fmt, cmd_yml[source]['format'])
return cmd_yml
def update_cmd_alias(source: str, new_cmd: str) -> None:
try:
cmd_yml = modify_cmd_alias(source, new_cmd)
except Exception as e:
raise e
else:
update_cmd_yml(cmd_yml=cmd_yml)
def reset_cmd_alias(source: str) -> None:
try:
cmd_yml = modify_cmd_alias(source, new_cmd=source)
except Exception as e:
raise e
else:
update_cmd_yml(cmd_yml=cmd_yml)
def get_alias_of_cmds() -> str:
with open(COMMAND_YML, "rb") as f:
cmd_yml: Dict[str, Dict[str, str]] = yaml.full_load(f)
tmp = ''.join(
f"`{k}` | `{v.get('cmd')}`\n" for k, v in cmd_yml.items()
)
return f"**⭐️ 指令别名:**\n**源名** | **别名**\n{tmp}"