zhenxun_bot/plugins/super_cmd/__init__.py

252 lines
9.2 KiB
Python
Raw Normal View History

2021-05-20 19:25:51 +08:00
from nonebot import on_command
from nonebot.permission import SUPERUSER
from models.level_user import LevelUser
from nonebot.typing import T_State
2021-07-30 21:21:51 +08:00
from nonebot.adapters.cqhttp import Bot, MessageEvent, Message
2021-05-20 19:25:51 +08:00
from nonebot.rule import to_me
2021-08-04 15:19:45 +08:00
from utils.utils import get_message_at, get_message_text, is_number, get_bot, scheduler
2021-05-20 19:25:51 +08:00
from services.log import logger
from .data_source import open_remind, close_remind
from models.group_info import GroupInfo
from models.friend_user import FriendUser
2021-07-30 21:21:51 +08:00
from utils.message_builder import at
from configs.path_config import IMAGE_PATH
import asyncio
import os
__plugin_name__ = "超级用户指令 [Hidden]"
__plugin_usage__ = "用法"
super_cmd = on_command(
"添加管理",
aliases={"删除管理", "添加权限", "删除权限"},
rule=to_me(),
priority=1,
permission=SUPERUSER,
block=True,
)
oc_gb = on_command(
"开启广播通知",
aliases={"关闭广播通知"},
rule=to_me(),
permission=SUPERUSER,
priority=1,
block=True,
)
cls_group = on_command(
"所有群组", rule=to_me(), permission=SUPERUSER, priority=1, block=True
)
cls_friend = on_command(
"所有好友", rule=to_me(), permission=SUPERUSER, priority=1, block=True
)
del_group = on_command("退群", rule=to_me(), permission=SUPERUSER, priority=1, block=True)
update_group_info = on_command(
"更新群信息", rule=to_me(), permission=SUPERUSER, priority=1, block=True
)
update_friend_info = on_command(
"更新好友信息", rule=to_me(), permission=SUPERUSER, priority=1, block=True
)
clear_data = on_command(
"清理数据", rule=to_me(), permission=SUPERUSER, priority=1, block=True
)
2021-05-20 19:25:51 +08:00
@super_cmd.handle()
2021-06-21 09:53:33 +08:00
async def _(bot: Bot, event: MessageEvent, state: T_State):
2021-05-20 19:25:51 +08:00
try:
args = get_message_text(event.json()).strip().split(" ")
2021-06-21 09:53:33 +08:00
qq = get_message_at(event.json())
flag = -1
if not qq:
if len(args) > 2:
if is_number(args[0]) and is_number(args[1]) and is_number(args[2]):
qq = int(args[0])
group_id = int(args[1])
level = int(args[2])
flag = 1
else:
2021-07-30 21:21:51 +08:00
await super_cmd.finish("所有参数必须是数字!", at_sender=True)
2021-06-21 09:53:33 +08:00
else:
2021-07-30 21:21:51 +08:00
await super_cmd.finish(
"权限参数不完全\n\t格式:添加/删除权限 [at] [level]"
"\n\t格式:添加/删除权限 [qq] [group] [level]",
at_sender=True,
)
2021-06-21 09:53:33 +08:00
else:
qq = int(qq[0])
group_id = event.group_id
flag = 2
if is_number(args[0]):
level = int(args[0])
else:
2021-07-30 21:21:51 +08:00
await super_cmd.finish("权限等级必须是数字!", at_sender=True)
2021-05-20 19:25:51 +08:00
if state["_prefix"]["raw_command"][:2] == "添加":
2021-06-21 09:53:33 +08:00
if await LevelUser.set_level(qq, group_id, level, 1):
2021-05-20 19:25:51 +08:00
result = "添加管理成功, 权限: " + str(level)
else:
result = "管理已存在, 更新权限: " + str(level)
else:
2021-06-15 10:57:08 +08:00
if await LevelUser.delete_level(qq, event.group_id):
2021-05-20 19:25:51 +08:00
result = "删除管理成功!"
else:
result = "该账号无管理权限!"
2021-06-21 09:53:33 +08:00
if flag == 2:
await super_cmd.send(result)
elif flag == 1:
2021-07-30 21:21:51 +08:00
await bot.send_group_msg(
group_id=group_id,
message=Message(f"{at(qq)}管理员修改了你的权限" f"\n--------\n你当前的权限等级:{level}"),
)
await super_cmd.send("修改成功")
2021-05-20 19:25:51 +08:00
except Exception as e:
await super_cmd.send("执行指令失败!")
2021-07-30 21:21:51 +08:00
logger.error(f"执行指令失败 e{e}")
2021-05-20 19:25:51 +08:00
@oc_gb.handle()
2021-07-30 21:21:51 +08:00
async def _(bot: Bot, event: MessageEvent, state: T_State):
2021-05-20 19:25:51 +08:00
group = get_message_text(event.json())
if group:
if is_number(group):
group = int(group)
for g in await bot.get_group_list():
2021-07-30 21:21:51 +08:00
if g["group_id"] == group:
2021-05-20 19:25:51 +08:00
break
else:
2021-07-30 21:21:51 +08:00
await oc_gb.finish("没有加入这个群...", at_sender=True)
2021-05-20 19:25:51 +08:00
# try:
2021-07-30 21:21:51 +08:00
if state["_prefix"]["raw_command"] == "开启广播通知":
logger.info(f"USER {event.user_id} 开启了 GROUP {group} 的广播")
await oc_gb.finish(await open_remind(group, "gb"), at_sender=True)
2021-05-20 19:25:51 +08:00
else:
2021-07-30 21:21:51 +08:00
logger.info(f"USER {event.user_id} 关闭了 GROUP {group} 的广播")
await oc_gb.finish(await close_remind(group, "gb"), at_sender=True)
2021-05-20 19:25:51 +08:00
# except Exception as e:
# await oc_gb.finish(f'关闭 {group} 的广播失败', at_sender=True)
else:
2021-07-30 21:21:51 +08:00
await oc_gb.finish("请输入正确的群号", at_sender=True)
2021-05-20 19:25:51 +08:00
else:
2021-07-30 21:21:51 +08:00
await oc_gb.finish("请输入要关闭广播的群号", at_sender=True)
2021-05-20 19:25:51 +08:00
@del_group.handle()
2021-07-30 21:21:51 +08:00
async def _(bot: Bot, event: MessageEvent, state: T_State):
2021-05-20 19:25:51 +08:00
group = get_message_text(event.json())
if group:
if is_number(group):
try:
await bot.set_group_leave(group_id=int(group))
2021-07-30 21:21:51 +08:00
logger.info(f"退出群聊 {group} 成功")
await del_group.finish(f"退出群聊 {group} 成功", at_sender=True)
2021-05-20 19:25:51 +08:00
except Exception as e:
2021-07-30 21:21:51 +08:00
logger.info(f"退出群聊 {group} 失败 e:{e}")
2021-05-20 19:25:51 +08:00
else:
2021-07-30 21:21:51 +08:00
await del_group.finish(f"请输入正确的群号", at_sender=True)
2021-05-20 19:25:51 +08:00
else:
2021-07-30 21:21:51 +08:00
await del_group.finish(f"请输入群号", at_sender=True)
2021-05-20 19:25:51 +08:00
@cls_group.handle()
2021-07-30 21:21:51 +08:00
async def _(bot: Bot, event: MessageEvent, state: T_State):
gl = await bot.get_group_list(self_id=int(bot.self_id))
2021-05-20 19:25:51 +08:00
msg = ["{group_id} {group_name}".format_map(g) for g in gl]
msg = "\n".join(msg)
msg = f"bot:{bot.self_id}\n| 群号 | 群名 | 共{len(gl)}个群\n" + msg
2021-07-30 21:21:51 +08:00
await bot.send_private_msg(
self_id=int(bot.self_id),
user_id=int(list(bot.config.superusers)[0]),
message=msg,
)
2021-05-20 19:25:51 +08:00
@cls_friend.handle()
2021-07-30 21:21:51 +08:00
async def _(bot: Bot, event: MessageEvent, state: T_State):
gl = await bot.get_friend_list(self_id=int(bot.self_id))
2021-05-20 19:25:51 +08:00
msg = ["{user_id} {nickname}".format_map(g) for g in gl]
msg = "\n".join(msg)
msg = f"| QQ号 | 昵称 | 共{len(gl)}个好友\n" + msg
2021-07-30 21:21:51 +08:00
await bot.send_private_msg(
self_id=int(bot.self_id),
user_id=int(list(bot.config.superusers)[0]),
message=msg,
)
2021-05-20 19:25:51 +08:00
@update_group_info.handle()
2021-07-30 21:21:51 +08:00
async def _(bot: Bot, event: MessageEvent, state: T_State):
2021-05-20 19:25:51 +08:00
bot = get_bot()
gl = await bot.get_group_list(self_id=bot.self_id)
2021-07-30 21:21:51 +08:00
gl = [g["group_id"] for g in gl]
2021-05-20 19:25:51 +08:00
num = 0
2021-07-30 21:21:51 +08:00
rst = ""
2021-05-20 19:25:51 +08:00
for g in gl:
group_info = await bot.get_group_info(group_id=g)
2021-07-30 21:21:51 +08:00
if await GroupInfo.add_group_info(
group_info["group_id"],
group_info["group_name"],
group_info["max_member_count"],
group_info["member_count"],
):
2021-05-20 19:25:51 +08:00
num += 1
2021-07-30 21:21:51 +08:00
logger.info(f"自动更新群组 {g} 信息成功")
2021-05-20 19:25:51 +08:00
else:
2021-07-30 21:21:51 +08:00
logger.info(f"自动更新群组 {g} 信息失败")
rst += f"{g} 更新失败\n"
await update_group_info.send(f"成功更新了 {num} 个群的信息\n{rst[:-1]}")
2021-05-20 19:25:51 +08:00
@update_friend_info.handle()
2021-07-30 21:21:51 +08:00
async def _(bot: Bot, event: MessageEvent, state: T_State):
2021-05-20 19:25:51 +08:00
num = 0
2021-07-30 21:21:51 +08:00
rst = ""
2021-05-20 19:25:51 +08:00
fl = await get_bot().get_friend_list(self_id=bot.self_id)
for f in fl:
2021-07-30 21:21:51 +08:00
if await FriendUser.add_friend_info(f["user_id"], f["nickname"]):
2021-05-20 19:25:51 +08:00
logger.info(f'自动更新好友 {f["user_id"]} 信息成功')
num += 1
else:
logger.warning(f'自动更新好友 {f["user_id"]} 信息失败')
rst += f'{f["user_id"]} 更新失败\n'
2021-07-30 21:21:51 +08:00
await update_friend_info.send(f"成功更新了 {num} 个好友的信息\n{rst[:-1]}")
2021-05-20 19:25:51 +08:00
2021-07-30 21:21:51 +08:00
@clear_data.handle()
async def _(bot: Bot, event: MessageEvent, state: T_State):
await clear_data.send("开始清理临时数据....")
size = await asyncio.get_event_loop().run_in_executor(
None, _clear_data
)
await clear_data.send("共清理了 {:.2f}MB 的数据...".format(size / 1024 / 1024))
def _clear_data() -> float:
size = 0
for dir_name in ['temp', 'rar', 'r18_rar']:
dir_name = f'{IMAGE_PATH}/{dir_name}'
2021-09-05 02:21:38 +08:00
if os.path.exists(dir_name):
for file in os.listdir(dir_name):
try:
file_size = os.path.getsize(os.path.join(dir_name, file))
os.remove(os.path.join(dir_name, file))
except Exception as e:
logger.error(f"清理临时数据错误...e{e}")
file_size = 0
size += file_size
2021-07-30 21:21:51 +08:00
return float(size)
2021-08-04 15:19:45 +08:00
# 早上好
@scheduler.scheduled_job(
"cron",
hour=1,
minute=1,
)
async def _():
size = await asyncio.get_event_loop().run_in_executor(
None, _clear_data
)
logger.info('自动清理临时数据完成,' + "共清理了 {:.2f}MB 的数据...".format(size / 1024 / 1024))