mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 06:12:53 +08:00
FIX BUG
This commit is contained in:
parent
f8371e7330
commit
1046815d37
@ -331,6 +331,12 @@ PS: **ARM平台** 请使用全量版 同时 **如果你的机器 RAM < 1G 可能
|
||||
|
||||
## 更新
|
||||
|
||||
### 2023/3/19
|
||||
|
||||
* 优化代码
|
||||
* 查看武器箱及皮肤添加更新次数
|
||||
* 修复添加群认证会检测群聊是否存在
|
||||
|
||||
### 2023/3/18
|
||||
|
||||
* 修复色图重复发送相同图片
|
||||
|
||||
@ -1,12 +1,12 @@
|
||||
import asyncio
|
||||
import os
|
||||
import time
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from pathlib import Path
|
||||
from typing import List
|
||||
from typing import List, Union
|
||||
|
||||
import ujson as json
|
||||
from nonebot.adapters.onebot.v11.message import MessageSegment
|
||||
from nonebot.adapters.onebot.v11 import Bot, Message, MessageSegment
|
||||
|
||||
from configs.config import Config
|
||||
from configs.path_config import DATA_PATH, IMAGE_PATH
|
||||
@ -17,7 +17,7 @@ from utils.http_utils import AsyncHttpx
|
||||
from utils.image_utils import BuildImage
|
||||
from utils.manager import group_manager, plugins2settings_manager, plugins_manager
|
||||
from utils.message_builder import image
|
||||
from utils.utils import get_bot, get_matchers
|
||||
from utils.utils import get_matchers
|
||||
|
||||
custom_welcome_msg_json = (
|
||||
Path() / "data" / "custom_welcome_msg" / "custom_welcome_msg.json"
|
||||
@ -67,7 +67,7 @@ async def group_current_status(group_id: int) -> str:
|
||||
|
||||
async def custom_group_welcome(
|
||||
msg: str, img_list: List[str], user_id: int, group_id: int
|
||||
) -> str:
|
||||
) -> Union[str, Message]:
|
||||
"""
|
||||
说明:
|
||||
替换群欢迎消息
|
||||
@ -80,8 +80,9 @@ async def custom_group_welcome(
|
||||
img_result = ""
|
||||
result = ""
|
||||
img = img_list[0] if img_list else ""
|
||||
if (DATA_PATH / f"custom_welcome_msg/{group_id}.jpg").exists():
|
||||
(DATA_PATH / f"custom_welcome_msg/{group_id}.jpg").unlink()
|
||||
msg_image = DATA_PATH / "custom_welcome_msg" / f"{group_id}.jpg"
|
||||
if msg_image.exists():
|
||||
msg_image.unlink()
|
||||
data = {}
|
||||
if not custom_welcome_msg_json.exists():
|
||||
custom_welcome_msg_json.parent.mkdir(parents=True, exist_ok=True)
|
||||
@ -96,17 +97,15 @@ async def custom_group_welcome(
|
||||
json.dump(
|
||||
data, open(custom_welcome_msg_json, "w"), indent=4, ensure_ascii=False
|
||||
)
|
||||
logger.info(f"USER {user_id} GROUP {group_id} 更换群欢迎消息 {msg}")
|
||||
logger.info(f"更换群欢迎消息 {msg}", "更换群欢迎信息", user_id, group_id)
|
||||
result += msg
|
||||
if img:
|
||||
await AsyncHttpx.download_file(
|
||||
img, DATA_PATH / "custom_welcome_msg" / f"{group_id}.jpg"
|
||||
)
|
||||
img_result = image(DATA_PATH / "custom_welcome_msg" / f"{group_id}.jpg")
|
||||
logger.info(f"USER {user_id} GROUP {group_id} 更换群欢迎消息图片")
|
||||
await AsyncHttpx.download_file(img, msg_image)
|
||||
img_result = image(msg_image)
|
||||
logger.info(f"更换群欢迎消息图片", "更换群欢迎信息", user_id, group_id)
|
||||
except Exception as e:
|
||||
logger.error(f"GROUP {group_id} 替换群消息失败 e:{e}")
|
||||
return "替换群消息失败.."
|
||||
logger.error(f"替换群消息失败", "更换群欢迎信息", user_id, group_id, e=e)
|
||||
return "替换群消息失败..."
|
||||
return f"替换群欢迎消息成功:\n{result}" + img_result
|
||||
|
||||
|
||||
@ -255,11 +254,8 @@ def _get_plugin_status() -> MessageSegment:
|
||||
"""
|
||||
rst = "\t功能\n"
|
||||
flag_str = "状态".rjust(4) + "\n"
|
||||
tmp_name = []
|
||||
for matcher in get_matchers():
|
||||
if matcher.plugin_name not in tmp_name:
|
||||
tmp_name.append(matcher.plugin_name)
|
||||
module = matcher.plugin_name
|
||||
for matcher in get_matchers(True):
|
||||
if module := matcher.plugin_name:
|
||||
flag = plugins_manager.get_plugin_block_type(module)
|
||||
flag = flag.upper() + " CLOSE" if flag else "OPEN"
|
||||
try:
|
||||
@ -288,7 +284,9 @@ def _get_plugin_status() -> MessageSegment:
|
||||
return image(b64=A.pic2bs4())
|
||||
|
||||
|
||||
async def update_member_info(group_id: int, remind_superuser: bool = False) -> bool:
|
||||
async def update_member_info(
|
||||
bot: Bot, group_id: int, remind_superuser: bool = False
|
||||
) -> bool:
|
||||
"""
|
||||
说明:
|
||||
更新群成员信息
|
||||
@ -296,76 +294,77 @@ async def update_member_info(group_id: int, remind_superuser: bool = False) -> b
|
||||
:param group_id: 群号
|
||||
:param remind_superuser: 失败信息提醒超级用户
|
||||
"""
|
||||
bot = get_bot()
|
||||
_group_user_list = await bot.get_group_member_list(group_id=group_id)
|
||||
_error_member_list = []
|
||||
_exist_member_list = []
|
||||
# try:
|
||||
for user_info in _group_user_list:
|
||||
nickname = user_info["card"] or user_info["nickname"]
|
||||
# 更新权限
|
||||
if user_info["role"] in [
|
||||
"owner",
|
||||
"admin",
|
||||
] and not await LevelUser.is_group_flag(user_info["user_id"], group_id):
|
||||
await LevelUser.set_level(
|
||||
user_info["user_id"],
|
||||
user_info["group_id"],
|
||||
Config.get_config("admin_bot_manage", "ADMIN_DEFAULT_AUTH"),
|
||||
)
|
||||
if str(user_info["user_id"]) in bot.config.superusers:
|
||||
await LevelUser.set_level(user_info["user_id"], user_info["group_id"], 9)
|
||||
user = await GroupInfoUser.get_or_none(
|
||||
user_qq=user_info["user_id"], group_id=user_info["group_id"]
|
||||
)
|
||||
if user:
|
||||
if user.user_name != nickname:
|
||||
user.user_name = nickname
|
||||
await user.save(update_fields=["user_name"])
|
||||
logger.info(
|
||||
f"用户{user_info['user_id']} 所属{user_info['group_id']} 更新群昵称成功"
|
||||
admin_default_auth = Config.get_config("admin_bot_manage", "ADMIN_DEFAULT_AUTH")
|
||||
if admin_default_auth is not None:
|
||||
for user_info in _group_user_list:
|
||||
nickname = user_info["card"] or user_info["nickname"]
|
||||
# 更新权限
|
||||
if user_info["role"] in [
|
||||
"owner",
|
||||
"admin",
|
||||
] and not await LevelUser.is_group_flag(user_info["user_id"], group_id):
|
||||
await LevelUser.set_level(
|
||||
user_info["user_id"],
|
||||
user_info["group_id"],
|
||||
admin_default_auth,
|
||||
)
|
||||
if str(user_info["user_id"]) in bot.config.superusers:
|
||||
await LevelUser.set_level(
|
||||
user_info["user_id"], user_info["group_id"], 9
|
||||
)
|
||||
user = await GroupInfoUser.get_or_none(
|
||||
user_qq=user_info["user_id"], group_id=user_info["group_id"]
|
||||
)
|
||||
if user:
|
||||
if user.user_name != nickname:
|
||||
user.user_name = nickname
|
||||
await user.save(update_fields=["user_name"])
|
||||
logger.debug(
|
||||
f"更新群昵称成功",
|
||||
"更新群组成员信息",
|
||||
user_info["user_id"],
|
||||
user_info["group_id"],
|
||||
)
|
||||
_exist_member_list.append(int(user_info["user_id"]))
|
||||
continue
|
||||
join_time = datetime.strptime(
|
||||
time.strftime(
|
||||
"%Y-%m-%d %H:%M:%S", time.localtime(user_info["join_time"])
|
||||
),
|
||||
"%Y-%m-%d %H:%M:%S",
|
||||
)
|
||||
await GroupInfoUser.update_or_create(
|
||||
user_qq=user_info["user_id"],
|
||||
group_id=user_info["group_id"],
|
||||
defaults={
|
||||
"user_name": nickname,
|
||||
"user_join_time": join_time.replace(
|
||||
tzinfo=timezone(timedelta(hours=8))
|
||||
),
|
||||
},
|
||||
)
|
||||
_exist_member_list.append(int(user_info["user_id"]))
|
||||
continue
|
||||
join_time = datetime.strptime(
|
||||
time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(user_info["join_time"])),
|
||||
"%Y-%m-%d %H:%M:%S",
|
||||
)
|
||||
user, _ = await GroupInfoUser.get_or_create(
|
||||
user_qq=user_info["user_id"],
|
||||
group_id=user_info["group_id"],
|
||||
defaults={
|
||||
"user_name": nickname,
|
||||
},
|
||||
)
|
||||
# await GroupInfoUser.update_or_create(
|
||||
# user_qq=user_info["user_id"],
|
||||
# group_id=user_info["group_id"],
|
||||
# defaults={
|
||||
# "user_name": nickname,
|
||||
# # "user_join_time": datetime.now().replace(tzinfo=None),
|
||||
# },
|
||||
# )
|
||||
user.user_join_time = join_time
|
||||
await user.save()
|
||||
_exist_member_list.append(int(user_info["user_id"]))
|
||||
logger.info("更新成功", "更新成员信息", user_info["user_id"], user_info["group_id"])
|
||||
_del_member_list = list(
|
||||
set(_exist_member_list).difference(
|
||||
set(await GroupInfoUser.get_group_member_id_list(group_id))
|
||||
)
|
||||
)
|
||||
if _del_member_list:
|
||||
for del_user in _del_member_list:
|
||||
await GroupInfoUser.filter(user_qq=del_user, group_id=group_id).delete()
|
||||
logger.info(f"退群用户{del_user} 所属{group_id} 已删除")
|
||||
if _error_member_list and remind_superuser:
|
||||
result = ""
|
||||
for error_user in _error_member_list:
|
||||
result += error_user
|
||||
await bot.send_private_msg(
|
||||
user_id=int(list(bot.config.superusers)[0]), message=result[:-1]
|
||||
logger.debug("更新成功", "更新成员信息", user_info["user_id"], user_info["group_id"])
|
||||
_del_member_list = list(
|
||||
set(_exist_member_list).difference(
|
||||
set(await GroupInfoUser.get_group_member_id_list(group_id))
|
||||
)
|
||||
)
|
||||
if _del_member_list:
|
||||
for del_user in _del_member_list:
|
||||
await GroupInfoUser.filter(user_qq=del_user, group_id=group_id).delete()
|
||||
logger.info(f"删除已退群用户", "更新群组成员信息", del_user, group_id)
|
||||
if _error_member_list and remind_superuser:
|
||||
result = ""
|
||||
for error_user in _error_member_list:
|
||||
result += error_user
|
||||
await bot.send_private_msg(
|
||||
user_id=int(list(bot.config.superusers)[0]), message=result[:-1]
|
||||
)
|
||||
return True
|
||||
|
||||
|
||||
|
||||
@ -23,15 +23,20 @@ async def _(event: GroupAdminNoticeEvent):
|
||||
else:
|
||||
nickname = event.user_id
|
||||
if event.sub_type == "set":
|
||||
await LevelUser.set_level(
|
||||
event.user_id,
|
||||
event.group_id,
|
||||
Config.get_config("admin_bot_manage", "ADMIN_DEFAULT_AUTH"),
|
||||
)
|
||||
logger.info(
|
||||
f"为新晋管理员 {nickname}({event.user_id}) "
|
||||
f"添加权限等级:{Config.get_config('admin_bot_manage', 'ADMIN_DEFAULT_AUTH')}"
|
||||
)
|
||||
admin_default_auth = Config.get_config("admin_bot_manage", "ADMIN_DEFAULT_AUTH")
|
||||
if admin_default_auth is not None:
|
||||
await LevelUser.set_level(
|
||||
event.user_id,
|
||||
event.group_id,
|
||||
admin_default_auth,
|
||||
)
|
||||
logger.info(
|
||||
f"为新晋管理员 {nickname}({event.user_id}) " f"添加权限等级:{admin_default_auth}"
|
||||
)
|
||||
else:
|
||||
logger.warning(
|
||||
f"配置项 MODULE: [<u><y>admin_bot_manage</y></u>] | KEY: [<u><y>ADMIN_DEFAULT_AUTH</y></u>] 为空"
|
||||
)
|
||||
elif event.sub_type == "unset":
|
||||
await LevelUser.delete_level(event.user_id, event.group_id)
|
||||
logger.info(f"将非管理员 {nickname}({event.user_id}) 取消权限等级")
|
||||
|
||||
@ -1,12 +1,13 @@
|
||||
from typing import List
|
||||
|
||||
from configs.config import Config
|
||||
from nonebot import on_command
|
||||
from nonebot.adapters.onebot.v11 import GroupMessageEvent, Message
|
||||
from nonebot.adapters.onebot.v11.permission import GROUP
|
||||
from nonebot.params import CommandArg
|
||||
|
||||
from configs.config import Config
|
||||
from services.log import logger
|
||||
from utils.depends import ImageList
|
||||
from utils.depends import ImageList, OneCommand
|
||||
|
||||
from ._data_source import custom_group_welcome
|
||||
|
||||
@ -40,7 +41,10 @@ custom_welcome = on_command(
|
||||
|
||||
@custom_welcome.handle()
|
||||
async def _(
|
||||
event: GroupMessageEvent, arg: Message = CommandArg(), img: List[str] = ImageList()
|
||||
event: GroupMessageEvent,
|
||||
cmd: str = OneCommand(),
|
||||
arg: Message = CommandArg(),
|
||||
img: List[str] = ImageList(),
|
||||
):
|
||||
msg = arg.extract_plain_text().strip()
|
||||
if not msg and not img:
|
||||
@ -52,5 +56,7 @@ async def _(
|
||||
)
|
||||
logger.info(f"USER {event.user_id} GROUP {event.group_id} 自定义群欢迎消息:{msg}")
|
||||
except Exception as e:
|
||||
logger.error(f"自定义进群欢迎消息发生错误 {type(e)}:{e}")
|
||||
logger.error(
|
||||
f"自定义进群欢迎消息发生错误", cmd, event.user_id, getattr(event, "group_id", None), e=e
|
||||
)
|
||||
await custom_welcome.send("发生了一些未知错误...")
|
||||
|
||||
@ -1,8 +1,10 @@
|
||||
import time
|
||||
|
||||
from nonebot.adapters.onebot.v11 import Event
|
||||
|
||||
from services.log import logger
|
||||
from utils.manager import group_manager, plugins2settings_manager
|
||||
from utils.utils import get_message_text
|
||||
from services.log import logger
|
||||
import time
|
||||
|
||||
cmd = []
|
||||
|
||||
@ -49,5 +51,5 @@ def switch_rule(event: Event) -> bool:
|
||||
msg = msg[0] if msg else ""
|
||||
return msg in cmd
|
||||
except Exception as e:
|
||||
logger.error(f"检测是否为功能开关命令发生错误 {type(e)}: {e}")
|
||||
logger.error(f"检测是否为功能开关命令发生错误", e=e)
|
||||
return False
|
||||
|
||||
@ -1,23 +1,32 @@
|
||||
from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, MessageEvent, GROUP, PrivateMessageEvent
|
||||
from nonebot import on_command, on_message, on_regex
|
||||
from nonebot.params import RegexGroup
|
||||
from typing import Any, Tuple
|
||||
|
||||
from nonebot import on_command, on_message, on_regex
|
||||
from nonebot.adapters.onebot.v11 import (
|
||||
GROUP,
|
||||
Bot,
|
||||
GroupMessageEvent,
|
||||
Message,
|
||||
MessageEvent,
|
||||
PrivateMessageEvent,
|
||||
)
|
||||
from nonebot.params import RegexGroup
|
||||
from nonebot.permission import SUPERUSER
|
||||
|
||||
from configs.config import NICKNAME, Config
|
||||
from services.log import logger
|
||||
from utils.message_builder import image
|
||||
from utils.utils import get_message_text, is_number
|
||||
|
||||
from ._data_source import (
|
||||
change_global_task_status,
|
||||
change_group_switch,
|
||||
set_plugin_status,
|
||||
get_plugin_status,
|
||||
group_current_status,
|
||||
set_group_bot_status, change_global_task_status
|
||||
set_group_bot_status,
|
||||
set_plugin_status,
|
||||
)
|
||||
from services.log import logger
|
||||
from configs.config import NICKNAME, Config
|
||||
from utils.utils import get_message_text, is_number
|
||||
from nonebot.permission import SUPERUSER
|
||||
from typing import Tuple, Any
|
||||
from .rule import switch_rule
|
||||
|
||||
|
||||
__zx_plugin_name__ = "群功能开关 [Admin]"
|
||||
|
||||
__plugin_usage__ = """
|
||||
@ -55,7 +64,7 @@ __plugin_version__ = 0.1
|
||||
__plugin_author__ = "HibiKier"
|
||||
__plugin_settings__ = {
|
||||
"admin_level": Config.get_config("admin_bot_manage", "CHANGE_GROUP_SWITCH_LEVEL"),
|
||||
"cmd": ["开启功能", "关闭功能", "开关"]
|
||||
"cmd": ["开启功能", "关闭功能", "开关"],
|
||||
}
|
||||
|
||||
switch_rule_matcher = on_message(rule=switch_rule, priority=4, block=True)
|
||||
@ -68,21 +77,27 @@ group_status = on_regex("^(休息吧|醒来)$", permission=GROUP, priority=5, bl
|
||||
|
||||
|
||||
@switch_rule_matcher.handle()
|
||||
async def _(bot: Bot, event: MessageEvent):
|
||||
_cmd = get_message_text(event.json()).split()[0]
|
||||
async def _(
|
||||
bot: Bot,
|
||||
event: MessageEvent,
|
||||
):
|
||||
msg = get_message_text(event.message).strip()
|
||||
msg_split = msg.split()
|
||||
_cmd = msg_split[0]
|
||||
if isinstance(event, GroupMessageEvent):
|
||||
await switch_rule_matcher.send(await change_group_switch(_cmd, event.group_id))
|
||||
logger.info(f"USER {event.user_id} GROUP {event.group_id} 使用群功能管理命令 {_cmd}")
|
||||
logger.info(f"使用群功能管理命令 {_cmd}", "功能管理", event.user_id, event.group_id)
|
||||
else:
|
||||
if str(event.user_id) in bot.config.superusers:
|
||||
block_type = " ".join(get_message_text(event.json()).split()[1:])
|
||||
block_type = " ".join(msg_split[1:])
|
||||
block_type = block_type if block_type else "a"
|
||||
if ("关闭被动" in _cmd or "开启被动" in _cmd) and isinstance(event, PrivateMessageEvent):
|
||||
if ("关闭被动" in _cmd or "开启被动" in _cmd) and isinstance(
|
||||
event, PrivateMessageEvent
|
||||
):
|
||||
await switch_rule_matcher.send(change_global_task_status(_cmd))
|
||||
elif is_number(block_type):
|
||||
if not int(block_type) in [
|
||||
g["group_id"]
|
||||
for g in await bot.get_group_list()
|
||||
g["group_id"] for g in await bot.get_group_list()
|
||||
]:
|
||||
await switch_rule_matcher.finish(f"{NICKNAME}未加入群聊:{block_type}")
|
||||
await change_group_switch(_cmd, int(block_type), True)
|
||||
@ -105,7 +120,7 @@ async def _(bot: Bot, event: MessageEvent):
|
||||
await switch_rule_matcher.send(f"已在群聊中{_cmd[:2]}功能:{_cmd[2:]}")
|
||||
else:
|
||||
await switch_rule_matcher.finish("格式错误:关闭[功能] [group]/[p/g]")
|
||||
logger.info(f"USER {event.user_id} 使用功能管理命令 {_cmd} | {block_type}")
|
||||
logger.info(f"使用功能管理命令 {_cmd} | {block_type}", f"{_cmd}", event.user_id)
|
||||
|
||||
|
||||
@plugins_status.handle()
|
||||
@ -126,4 +141,4 @@ async def _(event: GroupMessageEvent, reg_group: Tuple[Any, ...] = RegexGroup())
|
||||
else:
|
||||
msg = set_group_bot_status(event.group_id, True)
|
||||
await group_status.send(msg)
|
||||
logger.info(f"USER {event.user_id} GROUP {event.group_id} 使用总开关命令:{cmd}")
|
||||
logger.info(f"使用总开关命令: {cmd}", cmd, event.user_id, event.group_id)
|
||||
|
||||
@ -1,8 +1,7 @@
|
||||
from asyncpg.exceptions import ConnectionDoesNotExistError, UndefinedColumnError
|
||||
from nonebot import get_bots
|
||||
|
||||
from models.group_info import GroupInfo
|
||||
from services.log import logger
|
||||
from utils.utils import get_bot, scheduler
|
||||
from utils.utils import scheduler
|
||||
|
||||
from ._data_source import update_member_info
|
||||
|
||||
@ -13,6 +12,23 @@ __plugin_version__ = 0.1
|
||||
__plugin_author__ = "HibiKier"
|
||||
|
||||
|
||||
async def update():
|
||||
bot_list = get_bots()
|
||||
if bot_list:
|
||||
used_group = []
|
||||
for key in bot_list:
|
||||
bot = bot_list[key]
|
||||
gl = await bot.get_group_list()
|
||||
gl = [g["group_id"] for g in gl if g["group_id"] not in used_group]
|
||||
for g in gl:
|
||||
used_group.append(g)
|
||||
try:
|
||||
await update_member_info(bot, g) # type: ignore
|
||||
logger.debug(f"更新群组成员信息成功", "自动更新群组成员信息", group_id=g)
|
||||
except Exception as e:
|
||||
logger.error(f"更新群组成员信息错误", "自动更新群组成员信息", group_id=g, e=e)
|
||||
|
||||
|
||||
# 自动更新群员信息
|
||||
@scheduler.scheduled_job(
|
||||
"cron",
|
||||
@ -20,16 +36,7 @@ __plugin_author__ = "HibiKier"
|
||||
minute=1,
|
||||
)
|
||||
async def _():
|
||||
bot = get_bot()
|
||||
if bot:
|
||||
gl = await bot.get_group_list()
|
||||
gl = [g["group_id"] for g in gl]
|
||||
for g in gl:
|
||||
try:
|
||||
await update_member_info(g)
|
||||
logger.info(f"更新群组 g:{g} 成功")
|
||||
except Exception as e:
|
||||
logger.error(f"更新群组错误 g:{g} e:{e}")
|
||||
await update()
|
||||
|
||||
|
||||
# 快速更新群员信息以及管理员权限
|
||||
@ -38,15 +45,4 @@ async def _():
|
||||
minutes=5,
|
||||
)
|
||||
async def _():
|
||||
try:
|
||||
bot = get_bot()
|
||||
if bot:
|
||||
gl = await bot.get_group_list()
|
||||
gl = [g["group_id"] for g in gl]
|
||||
all_group = [x.group_id for x in await GroupInfo.all()]
|
||||
for g in gl:
|
||||
if g not in all_group:
|
||||
await update_member_info(g, False)
|
||||
logger.info(f"快速更新群信息以及权限:{g}")
|
||||
except (IndexError, ConnectionDoesNotExistError, UndefinedColumnError):
|
||||
pass
|
||||
await update()
|
||||
|
||||
@ -1,7 +1,12 @@
|
||||
from nonebot import on_command, on_notice
|
||||
from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, GROUP, GroupIncreaseNoticeEvent
|
||||
from ._data_source import update_member_info
|
||||
from nonebot.adapters.onebot.v11 import (
|
||||
GROUP,
|
||||
Bot,
|
||||
GroupIncreaseNoticeEvent,
|
||||
GroupMessageEvent,
|
||||
)
|
||||
|
||||
from ._data_source import update_member_info
|
||||
|
||||
__zx_plugin_name__ = "更新群组成员列表 [Admin]"
|
||||
__plugin_usage__ = """
|
||||
@ -10,10 +15,10 @@ usage:
|
||||
指令:
|
||||
更新群组成员列表/更新群组成员信息
|
||||
""".strip()
|
||||
__plugin_des__ = '更新群组成员列表'
|
||||
__plugin_cmd__ = ['更新群组成员列表']
|
||||
__plugin_des__ = "更新群组成员列表"
|
||||
__plugin_cmd__ = ["更新群组成员列表"]
|
||||
__plugin_version__ = 0.1
|
||||
__plugin_author__ = 'HibiKier'
|
||||
__plugin_author__ = "HibiKier"
|
||||
__plugin_settings__ = {
|
||||
"admin_level": 1,
|
||||
}
|
||||
@ -25,8 +30,8 @@ refresh_member_group = on_command(
|
||||
|
||||
|
||||
@refresh_member_group.handle()
|
||||
async def _(event: GroupMessageEvent):
|
||||
if await update_member_info(event.group_id):
|
||||
async def _(bot: Bot, event: GroupMessageEvent):
|
||||
if await update_member_info(bot, event.group_id):
|
||||
await refresh_member_group.finish("更新群员信息成功!", at_sender=True)
|
||||
else:
|
||||
await refresh_member_group.finish("更新群员信息失败!", at_sender=True)
|
||||
@ -38,4 +43,4 @@ group_increase_handle = on_notice(priority=1, block=False)
|
||||
@group_increase_handle.handle()
|
||||
async def _(bot: Bot, event: GroupIncreaseNoticeEvent):
|
||||
if event.user_id == int(bot.self_id):
|
||||
await update_member_info(event.group_id)
|
||||
await update_member_info(bot, event.group_id)
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
import nonebot
|
||||
from configs.path_config import IMAGE_PATH
|
||||
from nonebot import Driver
|
||||
|
||||
from configs.path_config import IMAGE_PATH
|
||||
from services.log import logger
|
||||
from utils.image_template import help_template
|
||||
from utils.image_utils import (BuildImage, build_sort_image, group_image,
|
||||
text2image)
|
||||
from utils.image_utils import BuildImage, build_sort_image, group_image, text2image
|
||||
from utils.manager import group_manager, plugin_data_manager
|
||||
from utils.manager.models import PluginType
|
||||
|
||||
@ -23,13 +23,6 @@ async def init_task():
|
||||
|
||||
|
||||
async def create_help_image():
|
||||
"""
|
||||
创建管理员帮助图片
|
||||
"""
|
||||
await _create_help_image()
|
||||
|
||||
|
||||
async def _create_help_image():
|
||||
"""
|
||||
创建管理员帮助图片
|
||||
"""
|
||||
@ -57,7 +50,9 @@ async def _create_help_image():
|
||||
task_list.append(plugin_data.task[x])
|
||||
except Exception as e:
|
||||
logger.warning(
|
||||
f"获取群管理员插件 {plugin_data.model}: {plugin_data.name} 设置失败... {type(e)}:{e}"
|
||||
f"获取群管理员插件 {plugin_data.model}: {plugin_data.name} 设置失败...",
|
||||
"管理员帮助",
|
||||
e=e,
|
||||
)
|
||||
task_str = "\n".join(task_list)
|
||||
task_str = "通过 开启/关闭 来控制群被动\n----------\n" + task_str
|
||||
|
||||
@ -3,8 +3,7 @@ from pathlib import Path
|
||||
from typing import List
|
||||
|
||||
import nonebot
|
||||
from nonebot import on_message
|
||||
from nonebot.adapters.onebot.v11 import ActionFailed
|
||||
from nonebot import get_bots, on_message
|
||||
|
||||
from configs.config import NICKNAME, Config
|
||||
from configs.path_config import IMAGE_PATH
|
||||
@ -12,7 +11,7 @@ from models.friend_user import FriendUser
|
||||
from models.group_info import GroupInfo
|
||||
from services.log import logger
|
||||
from utils.message_builder import image
|
||||
from utils.utils import broadcast_group, get_bot, scheduler
|
||||
from utils.utils import broadcast_group, scheduler
|
||||
|
||||
__zx_plugin_name__ = "定时任务相关 [Hidden]"
|
||||
__plugin_version__ = 0.1
|
||||
@ -58,7 +57,7 @@ cx = on_message(priority=9999, block=False, rule=lambda: False)
|
||||
async def _():
|
||||
img = image(IMAGE_PATH / "zhenxun" / "zao.jpg")
|
||||
await broadcast_group("[[_task|zwa]]早上好" + img, log_cmd="被动早晚安")
|
||||
logger.info("每日早安发送")
|
||||
logger.info("每日早安发送...")
|
||||
|
||||
|
||||
# 睡觉了
|
||||
@ -72,7 +71,7 @@ async def _():
|
||||
await broadcast_group(
|
||||
f"[[_task|zwa]]{NICKNAME}要睡觉了,你们也要早点睡呀" + img, log_cmd="被动早晚安"
|
||||
)
|
||||
logger.info("每日晚安发送")
|
||||
logger.info("每日晚安发送...")
|
||||
|
||||
|
||||
# 自动更新群组信息
|
||||
@ -100,9 +99,10 @@ async def _():
|
||||
"group_flag": 1,
|
||||
},
|
||||
)
|
||||
logger.info(f"自动更新群组信息成功", group_id=g)
|
||||
logger.debug("自动更新群组信息成功", "自动更新群组", group_id=g)
|
||||
except Exception as e:
|
||||
logger.error(f"Bot: {bot.self_id} 自动更新群组信息", e=e)
|
||||
logger.info("自动更新群组成员信息成功...")
|
||||
|
||||
|
||||
# 自动更新好友信息
|
||||
@ -112,16 +112,17 @@ async def _():
|
||||
minute=1,
|
||||
)
|
||||
async def _():
|
||||
try:
|
||||
bot = get_bot()
|
||||
fl = await bot.get_friend_list()
|
||||
for f in fl:
|
||||
await FriendUser.create(user_id=f["user_id"], user_name=f["nickname"])
|
||||
logger.info(f'自动更新好友 {f["user_id"]} 信息成功')
|
||||
# else:
|
||||
# logger.warning(f'自动更新好友 {f["user_id"]} 信息失败')
|
||||
except Exception as e:
|
||||
logger.error(f"自动更新群组信息错误 e:{e}")
|
||||
bots = nonebot.get_bots()
|
||||
for key in bots:
|
||||
try:
|
||||
bot = bots[key]
|
||||
fl = await bot.get_friend_list()
|
||||
for f in fl:
|
||||
await FriendUser.create(user_id=f["user_id"], user_name=f["nickname"])
|
||||
logger.debug(f"更新好友信息成功", "自动更新好友", f["user_id"])
|
||||
except Exception as e:
|
||||
logger.error(f"自动更新群组信息错误", e=e)
|
||||
logger.info("自动更新好友信息成功...")
|
||||
|
||||
|
||||
# 自动备份
|
||||
@ -134,22 +135,24 @@ async def _():
|
||||
if Config.get_config("_backup", "BACKUP_FLAG"):
|
||||
_backup_path = Path() / "backup"
|
||||
_backup_path.mkdir(exist_ok=True, parents=True)
|
||||
for x in Config.get_config("_backup", "BACKUP_DIR_OR_FILE"):
|
||||
try:
|
||||
path = Path(x)
|
||||
_p = _backup_path / x
|
||||
if path.exists():
|
||||
if path.is_dir():
|
||||
if _p.exists():
|
||||
shutil.rmtree(_p, ignore_errors=True)
|
||||
shutil.copytree(x, _p)
|
||||
else:
|
||||
if _p.exists():
|
||||
_p.unlink()
|
||||
shutil.copy(x, _p)
|
||||
logger.info(f"已完成自动备份:{x}")
|
||||
except Exception as e:
|
||||
logger.error(f"自动备份文件 {x} 发生错误 {type(e)}:{e}")
|
||||
if backup_dir_or_file := Config.get_config("_backup", "BACKUP_DIR_OR_FILE"):
|
||||
for path_file in backup_dir_or_file:
|
||||
try:
|
||||
path = Path(path_file)
|
||||
_p = _backup_path / path_file
|
||||
if path.exists():
|
||||
if path.is_dir():
|
||||
if _p.exists():
|
||||
shutil.rmtree(_p, ignore_errors=True)
|
||||
shutil.copytree(path_file, _p)
|
||||
else:
|
||||
if _p.exists():
|
||||
_p.unlink()
|
||||
shutil.copy(path_file, _p)
|
||||
logger.debug(f"已完成自动备份:{path_file}", "自动备份")
|
||||
except Exception as e:
|
||||
logger.error(f"自动备份文件 {path_file} 发生错误", "自动备份", e=e)
|
||||
logger.info("自动备份成功...", "自动备份")
|
||||
|
||||
# 一次性任务
|
||||
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
import asyncio
|
||||
from typing import List
|
||||
|
||||
from nonebot import on_command
|
||||
from nonebot.adapters.onebot.v11 import Bot, Message, MessageEvent
|
||||
@ -7,9 +8,9 @@ from nonebot.permission import SUPERUSER
|
||||
|
||||
from configs.config import Config
|
||||
from services.log import logger
|
||||
from utils.depends import ImageList
|
||||
from utils.manager import group_manager
|
||||
from utils.message_builder import image
|
||||
from utils.utils import get_message_img
|
||||
|
||||
__zx_plugin_name__ = "广播 [Superuser]"
|
||||
__plugin_usage__ = """
|
||||
@ -36,9 +37,13 @@ broadcast = on_command("广播-", priority=1, permission=SUPERUSER, block=True)
|
||||
|
||||
|
||||
@broadcast.handle()
|
||||
async def _(bot: Bot, event: MessageEvent, arg: Message = CommandArg()):
|
||||
async def _(
|
||||
bot: Bot,
|
||||
event: MessageEvent,
|
||||
arg: Message = CommandArg(),
|
||||
img_list: List[str] = ImageList(),
|
||||
):
|
||||
msg = arg.extract_plain_text().strip()
|
||||
img_list = get_message_img(event.json())
|
||||
rst = ""
|
||||
for img in img_list:
|
||||
rst += image(img)
|
||||
@ -58,9 +63,9 @@ async def _(bot: Bot, event: MessageEvent, arg: Message = CommandArg()):
|
||||
x += 0.25
|
||||
try:
|
||||
await bot.send_group_msg(group_id=g, message=msg + rst)
|
||||
logger.info(f"GROUP {g} 投递广播成功")
|
||||
logger.info(f"投递广播成功", "广播", group_id=g)
|
||||
except Exception as e:
|
||||
logger.error(f"GROUP {g} 投递广播失败:{type(e)}")
|
||||
logger.error(f"投递广播失败", "广播", group_id=g, e=e)
|
||||
error += f"GROUP {g} 投递广播失败:{type(e)}\n"
|
||||
await asyncio.sleep(0.5)
|
||||
await broadcast.send(f"已播报至 100% 的群聊")
|
||||
|
||||
@ -1,6 +1,9 @@
|
||||
from nonebot.adapters.onebot.v11 import Event, MessageEvent
|
||||
|
||||
from configs.config import Config
|
||||
|
||||
|
||||
def rule(event: Event) -> bool:
|
||||
return Config.get_config("chat_history", "FLAG") and isinstance(event, MessageEvent)
|
||||
return bool(
|
||||
Config.get_config("chat_history", "FLAG") and isinstance(event, MessageEvent)
|
||||
)
|
||||
|
||||
@ -68,7 +68,7 @@ add_group = on_request(priority=1, block=False)
|
||||
@group_increase_handle.handle()
|
||||
async def _(bot: Bot, event: GroupIncreaseNoticeEvent):
|
||||
if event.user_id == int(bot.self_id):
|
||||
group = await GroupInfo.filter(group_id=event.group_id).first()
|
||||
group = await GroupInfo.get_or_none(group_id=event.group_id)
|
||||
# 群聊不存在或被强制拉群,退出该群
|
||||
if (not group or group.group_flag == 0) and Config.get_config(
|
||||
"invite_manager", "flag"
|
||||
@ -80,15 +80,15 @@ async def _(bot: Bot, event: GroupIncreaseNoticeEvent):
|
||||
await bot.set_group_leave(group_id=event.group_id)
|
||||
await bot.send_private_msg(
|
||||
user_id=int(list(bot.config.superusers)[0]),
|
||||
message=f"触发强制入群保护,已成功退出群聊 {event.group_id}..",
|
||||
message=f"触发强制入群保护,已成功退出群聊 {event.group_id}...",
|
||||
)
|
||||
logger.info(f"强制拉群或未有群信息,退出群聊 {group} 成功")
|
||||
logger.info(f"强制拉群或未有群信息,退出群聊成功", "入群检测", group_id=event.group_id)
|
||||
requests_manager.remove_request("group", event.group_id)
|
||||
except Exception as e:
|
||||
logger.info(f"强制拉群或未有群信息,退出群聊 {group} 失败 e:{e}")
|
||||
logger.info(f"强制拉群或未有群信息,退出群聊失败", "入群检测", group_id=event.group_id, e=e)
|
||||
await bot.send_private_msg(
|
||||
user_id=int(list(bot.config.superusers)[0]),
|
||||
message=f"触发强制入群保护,退出群聊 {event.group_id} 失败..",
|
||||
message=f"触发强制入群保护,退出群聊 {event.group_id} 失败...",
|
||||
)
|
||||
# 默认群功能开关
|
||||
elif event.group_id not in group_manager.get_data().group_manager.keys():
|
||||
@ -96,42 +96,53 @@ async def _(bot: Bot, event: GroupIncreaseNoticeEvent):
|
||||
for plugin in data.keys():
|
||||
if not data[plugin].default_status:
|
||||
group_manager.block_plugin(plugin, event.group_id)
|
||||
admin_default_auth = Config.get_config(
|
||||
"admin_bot_manage", "ADMIN_DEFAULT_AUTH"
|
||||
)
|
||||
# 即刻刷新权限
|
||||
for user_info in await bot.get_group_member_list(group_id=event.group_id):
|
||||
if user_info["role"] in [
|
||||
"owner",
|
||||
"admin",
|
||||
] and not await LevelUser.is_group_flag(
|
||||
user_info["user_id"], event.group_id
|
||||
if (
|
||||
user_info["role"]
|
||||
in [
|
||||
"owner",
|
||||
"admin",
|
||||
]
|
||||
and not await LevelUser.is_group_flag(
|
||||
user_info["user_id"], event.group_id
|
||||
)
|
||||
and admin_default_auth is not None
|
||||
):
|
||||
await LevelUser.set_level(
|
||||
user_info["user_id"],
|
||||
user_info["group_id"],
|
||||
Config.get_config("admin_bot_manage", "ADMIN_DEFAULT_AUTH"),
|
||||
admin_default_auth,
|
||||
)
|
||||
logger.debug(
|
||||
f"添加默认群管理员权限: {admin_default_auth}",
|
||||
"入群检测",
|
||||
user_info["user_id"],
|
||||
user_info["group_id"],
|
||||
)
|
||||
if str(user_info["user_id"]) in bot.config.superusers:
|
||||
await LevelUser.set_level(
|
||||
user_info["user_id"], user_info["group_id"], 9
|
||||
)
|
||||
logger.debug(
|
||||
f"添加超级用户权限: 9",
|
||||
"入群检测",
|
||||
user_info["user_id"],
|
||||
user_info["group_id"],
|
||||
)
|
||||
else:
|
||||
join_time = datetime.now()
|
||||
user_info = await bot.get_group_member_info(
|
||||
group_id=event.group_id, user_id=event.user_id
|
||||
)
|
||||
user, _ = await GroupInfoUser.get_or_create(
|
||||
await GroupInfoUser.update_or_create(
|
||||
user_qq=user_info["user_id"],
|
||||
group_id=user_info["group_id"],
|
||||
defaults={
|
||||
"user_name": user_info["nickname"],
|
||||
},
|
||||
defaults={"user_name": user_info["nickname"], "user_join_time": join_time},
|
||||
)
|
||||
user.user_join_time = join_time
|
||||
await user.save()
|
||||
# await GroupInfoUser.update_or_create(
|
||||
# user_qq=user_info["user_id"],
|
||||
# group_id=user_info["group_id"],
|
||||
# defaults={"user_name": user_info["nickname"], "user_join_time": join_time},
|
||||
# )
|
||||
logger.info(f"用户{user_info['user_id']} 所属{user_info['group_id']} 更新成功")
|
||||
|
||||
# 群欢迎消息
|
||||
@ -147,7 +158,7 @@ async def _(bot: Bot, event: GroupIncreaseNoticeEvent):
|
||||
data = json.load(open(custom_welcome_msg_json, "r"))
|
||||
if data.get(str(event.group_id)):
|
||||
msg = data[str(event.group_id)]
|
||||
if msg.find("[at]") != -1:
|
||||
if "[at]" in msg:
|
||||
msg = msg.replace("[at]", "")
|
||||
at_flag = True
|
||||
if (DATA_PATH / "custom_welcome_msg" / f"{event.group_id}.jpg").exists():
|
||||
|
||||
@ -1,23 +1,26 @@
|
||||
from nonebot import on_command
|
||||
from nonebot.adapters.onebot.v11 import (
|
||||
Bot,
|
||||
MessageEvent,
|
||||
GroupMessageEvent,
|
||||
Message
|
||||
)
|
||||
from nonebot.params import CommandArg
|
||||
from nonebot.rule import to_me
|
||||
from configs.path_config import IMAGE_PATH, DATA_PATH
|
||||
from utils.message_builder import image
|
||||
from ._data_source import create_help_img, get_plugin_help
|
||||
from ._utils import GROUP_HELP_PATH
|
||||
import os
|
||||
|
||||
from nonebot import on_command
|
||||
from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, Message, MessageEvent
|
||||
from nonebot.params import CommandArg
|
||||
from nonebot.rule import to_me
|
||||
|
||||
from configs.path_config import DATA_PATH, IMAGE_PATH
|
||||
from services.log import logger
|
||||
from utils.message_builder import image
|
||||
|
||||
from ._data_source import create_help_img, get_plugin_help
|
||||
from ._utils import GROUP_HELP_PATH
|
||||
|
||||
__zx_plugin_name__ = "帮助"
|
||||
|
||||
__plugin_configs__ = {
|
||||
"TYPE": {"value": "normal", "help": "帮助图片样式 ['normal', 'HTML']", "default_value": "normal"}
|
||||
"TYPE": {
|
||||
"value": "normal",
|
||||
"help": "帮助图片样式 ['normal', 'HTML']",
|
||||
"default_value": "normal",
|
||||
"type": str,
|
||||
}
|
||||
}
|
||||
|
||||
simple_help_image = IMAGE_PATH / "simple_help.png"
|
||||
@ -25,7 +28,9 @@ if simple_help_image.exists():
|
||||
simple_help_image.unlink()
|
||||
|
||||
|
||||
simple_help = on_command("功能", rule=to_me(), aliases={"help", "帮助"}, priority=1, block=True)
|
||||
simple_help = on_command(
|
||||
"功能", rule=to_me(), aliases={"help", "帮助"}, priority=1, block=True
|
||||
)
|
||||
|
||||
|
||||
@simple_help.handle()
|
||||
@ -33,15 +38,18 @@ async def _(bot: Bot, event: MessageEvent, arg: Message = CommandArg()):
|
||||
msg = arg.extract_plain_text().strip()
|
||||
is_super = False
|
||||
if msg:
|
||||
if '-super' in msg:
|
||||
if "-super" in msg:
|
||||
if str(event.user_id) in bot.config.superusers:
|
||||
is_super = True
|
||||
msg = msg.replace('-super', '').strip()
|
||||
msg = msg.replace("-super", "").strip()
|
||||
msg = get_plugin_help(msg, is_super)
|
||||
if msg:
|
||||
await simple_help.send(image(b64=msg))
|
||||
else:
|
||||
await simple_help.send("没有此功能的帮助信息...")
|
||||
logger.info(
|
||||
f"查看帮助详情: {msg}", "帮助", event.user_id, getattr(event, "group_id", None)
|
||||
)
|
||||
else:
|
||||
if isinstance(event, GroupMessageEvent):
|
||||
_image_path = GROUP_HELP_PATH / f"{event.group_id}.png"
|
||||
|
||||
@ -1,14 +1,10 @@
|
||||
from typing import Optional
|
||||
|
||||
from configs.path_config import IMAGE_PATH
|
||||
from utils.image_utils import BuildImage
|
||||
from utils.manager import admin_manager, plugin_data_manager, plugins2settings_manager
|
||||
|
||||
from ._utils import HelpImageBuild
|
||||
from utils.image_utils import BuildImage
|
||||
from configs.path_config import IMAGE_PATH
|
||||
from utils.manager import (
|
||||
plugins2settings_manager,
|
||||
admin_manager,
|
||||
)
|
||||
from typing import Optional
|
||||
import nonebot
|
||||
|
||||
|
||||
random_bk_path = IMAGE_PATH / "background" / "help" / "simple_help"
|
||||
|
||||
@ -36,36 +32,25 @@ def get_plugin_help(msg: str, is_super: bool = False) -> Optional[str]:
|
||||
module = plugins2settings_manager.get_plugin_module(
|
||||
msg
|
||||
) or admin_manager.get_plugin_module(msg)
|
||||
if module:
|
||||
try:
|
||||
plugin = nonebot.plugin.get_plugin(module)
|
||||
metadata = plugin.metadata
|
||||
if plugin:
|
||||
if is_super:
|
||||
result = plugin.module.__getattribute__(
|
||||
"__plugin_superuser_usage__"
|
||||
)
|
||||
else:
|
||||
result = (
|
||||
metadata.usage
|
||||
if metadata
|
||||
else plugin.module.__getattribute__("__plugin_usage__")
|
||||
)
|
||||
if result:
|
||||
width = 0
|
||||
for x in result.split("\n"):
|
||||
_width = len(x) * 24
|
||||
width = width if width > _width else _width
|
||||
height = len(result.split("\n")) * 45
|
||||
A = BuildImage(width, height, font_size=24)
|
||||
bk = BuildImage(
|
||||
width,
|
||||
height,
|
||||
background=IMAGE_PATH / "background" / "1.png",
|
||||
)
|
||||
A.paste(bk, alpha=True)
|
||||
A.text((int(width * 0.048), int(height * 0.21)), result)
|
||||
return A.pic2bs4()
|
||||
except AttributeError:
|
||||
pass
|
||||
if module and (plugin_data := plugin_data_manager.get(module)):
|
||||
plugin_data.superuser_usage
|
||||
if is_super:
|
||||
result = plugin_data.superuser_usage
|
||||
else:
|
||||
result = plugin_data.usage
|
||||
if result:
|
||||
width = 0
|
||||
for x in result.split("\n"):
|
||||
_width = len(x) * 24
|
||||
width = width if width > _width else _width
|
||||
height = len(result.split("\n")) * 45
|
||||
A = BuildImage(width, height, font_size=24)
|
||||
bk = BuildImage(
|
||||
width,
|
||||
height,
|
||||
background=IMAGE_PATH / "background" / "1.png",
|
||||
)
|
||||
A.paste(bk, alpha=True)
|
||||
A.text((int(width * 0.048), int(height * 0.21)), result)
|
||||
return A.pic2bs4()
|
||||
return None
|
||||
|
||||
@ -51,9 +51,9 @@ class HelpImageBuild:
|
||||
for key in self._data.keys():
|
||||
plugin_data = self._data[key]
|
||||
if plugin_data.plugin_type == PluginType.NORMAL:
|
||||
if not self._sort_data.get(plugin_data.menu_type[0]):
|
||||
self._sort_data[plugin_data.menu_type[0]] = []
|
||||
self._sort_data[plugin_data.menu_type[0]].append(self._data[key])
|
||||
if not self._sort_data.get(plugin_data.menu_type[0]): # type: ignore
|
||||
self._sort_data[plugin_data.menu_type[0]] = [] # type: ignore
|
||||
self._sort_data[plugin_data.menu_type[0]].append(self._data[key]) # type: ignore
|
||||
|
||||
async def build_image(self, group_id: Optional[int]):
|
||||
if group_id:
|
||||
@ -71,6 +71,7 @@ class HelpImageBuild:
|
||||
|
||||
async def build_html_image(self, group_id: Optional[int]) -> bytes:
|
||||
from nonebot_plugin_htmlrender import template_to_pic
|
||||
|
||||
self.sort_type()
|
||||
classify = {}
|
||||
for menu in self._sort_data:
|
||||
@ -180,9 +181,12 @@ class HelpImageBuild:
|
||||
if (
|
||||
not plugin_data.plugin_status.status
|
||||
and plugin_data.plugin_status.block_type in ["group", "all"]
|
||||
) or (group_id and not group_manager.get_plugin_super_status(
|
||||
plugin_data.model, group_id
|
||||
)):
|
||||
) or (
|
||||
group_id
|
||||
and not group_manager.get_plugin_super_status(
|
||||
plugin_data.model, group_id
|
||||
)
|
||||
):
|
||||
w = curr_h + int(B.getsize(plugin_data.name)[1] / 2) + 2
|
||||
pos = (
|
||||
7,
|
||||
@ -191,7 +195,7 @@ class HelpImageBuild:
|
||||
w,
|
||||
)
|
||||
if build_type == "VV":
|
||||
name_image = await self.build_name_image(
|
||||
name_image = await self.build_name_image( # type: ignore
|
||||
max_width,
|
||||
plugin_data.name,
|
||||
"black" if not idx % 2 else "white",
|
||||
|
||||
@ -1,7 +1,5 @@
|
||||
import time
|
||||
from typing import Optional
|
||||
|
||||
import nonebot
|
||||
from nonebot.adapters.onebot.v11 import (
|
||||
Bot,
|
||||
Event,
|
||||
@ -27,12 +25,14 @@ from utils.manager import (
|
||||
StaticData,
|
||||
admin_manager,
|
||||
group_manager,
|
||||
plugin_data_manager,
|
||||
plugins2block_manager,
|
||||
plugins2cd_manager,
|
||||
plugins2count_manager,
|
||||
plugins2settings_manager,
|
||||
plugins_manager,
|
||||
)
|
||||
from utils.manager.models import PluginType
|
||||
from utils.message_builder import at
|
||||
from utils.utils import FreqLimiter
|
||||
|
||||
@ -71,17 +71,17 @@ def set_block_limit_false(event, module):
|
||||
:param module: 插件模块
|
||||
"""
|
||||
if plugins2block_manager.check_plugin_block_status(module):
|
||||
plugin_block_data = plugins2block_manager.get_plugin_block_data(module)
|
||||
check_type = plugin_block_data.check_type
|
||||
limit_type = plugin_block_data.limit_type
|
||||
if not (
|
||||
(isinstance(event, GroupMessageEvent) and check_type == "private")
|
||||
or (isinstance(event, PrivateMessageEvent) and check_type == "group")
|
||||
):
|
||||
block_type_ = event.user_id
|
||||
if limit_type == "group" and isinstance(event, GroupMessageEvent):
|
||||
block_type_ = event.group_id
|
||||
plugins2block_manager.set_false(block_type_, module)
|
||||
if plugin_block_data := plugins2block_manager.get_plugin_block_data(module):
|
||||
check_type = plugin_block_data.check_type
|
||||
limit_type = plugin_block_data.limit_type
|
||||
if not (
|
||||
(isinstance(event, GroupMessageEvent) and check_type == "private")
|
||||
or (isinstance(event, PrivateMessageEvent) and check_type == "group")
|
||||
):
|
||||
block_type_ = event.user_id
|
||||
if limit_type == "group" and isinstance(event, GroupMessageEvent):
|
||||
block_type_ = event.group_id
|
||||
plugins2block_manager.set_false(block_type_, module)
|
||||
|
||||
|
||||
async def send_msg(msg: str, bot: Bot, event: MessageEvent):
|
||||
@ -94,7 +94,7 @@ async def send_msg(msg: str, bot: Bot, event: MessageEvent):
|
||||
:param event: pass
|
||||
"""
|
||||
if "[uname]" in msg:
|
||||
uname = event.sender.card or event.sender.nickname
|
||||
uname = event.sender.card or event.sender.nickname or ""
|
||||
msg = msg.replace("[uname]", uname)
|
||||
if "[nickname]" in msg:
|
||||
if isinstance(event, GroupMessageEvent):
|
||||
@ -128,10 +128,13 @@ class AuthChecker:
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self._flmt = FreqLimiter(Config.get_config("hook", "CHECK_NOTICE_INFO_CD"))
|
||||
self._flmt_g = FreqLimiter(Config.get_config("hook", "CHECK_NOTICE_INFO_CD"))
|
||||
self._flmt_s = FreqLimiter(Config.get_config("hook", "CHECK_NOTICE_INFO_CD"))
|
||||
self._flmt_c = FreqLimiter(Config.get_config("hook", "CHECK_NOTICE_INFO_CD"))
|
||||
check_notice_info_cd = Config.get_config("hook", "CHECK_NOTICE_INFO_CD")
|
||||
if check_notice_info_cd is None or check_notice_info_cd < 0:
|
||||
raise ValueError("模块: [hook], 配置项: [CHECK_NOTICE_INFO_CD] 为空或小于0")
|
||||
self._flmt = FreqLimiter(check_notice_info_cd)
|
||||
self._flmt_g = FreqLimiter(check_notice_info_cd)
|
||||
self._flmt_s = FreqLimiter(check_notice_info_cd)
|
||||
self._flmt_c = FreqLimiter(check_notice_info_cd)
|
||||
|
||||
async def auth(self, matcher: Matcher, bot: Bot, event: Event):
|
||||
"""
|
||||
@ -142,22 +145,24 @@ class AuthChecker:
|
||||
:param bot: bot
|
||||
:param event: event
|
||||
"""
|
||||
user_id = getattr(event, "user_id", None)
|
||||
group_id = getattr(event, "group_id", None)
|
||||
try:
|
||||
if plugin_name := matcher.plugin_name:
|
||||
cost_gold = await self.auth_cost(plugin_name, bot, event)
|
||||
user_id = getattr(event, "user_id", None)
|
||||
group_id = getattr(event, "group_id", None)
|
||||
if user_id and str(user_id) not in bot.config.superusers:
|
||||
await self.auth_basic(plugin_name, bot, event)
|
||||
self.auth_group(plugin_name, bot, event)
|
||||
await self.auth_admin(plugin_name, matcher, bot, event)
|
||||
await self.auth_plugin(plugin_name, matcher, bot, event)
|
||||
await self.auth_limit(plugin_name, bot, event)
|
||||
if cost_gold:
|
||||
await BagUser.spend_gold(
|
||||
event.user_id, event.group_id, cost_gold
|
||||
)
|
||||
if cost_gold and user_id and group_id:
|
||||
await BagUser.spend_gold(user_id, group_id, cost_gold)
|
||||
logger.debug(f"调用功能花费金币: {cost_gold}", "HOOK", user_id, group_id)
|
||||
except IsSuperuserException:
|
||||
return
|
||||
logger.debug(f"超级用户或被ban跳过权限检测...", "HOOK", user_id, group_id)
|
||||
|
||||
async def auth_limit(self, plugin_name: str, bot: Bot, event: Event):
|
||||
"""
|
||||
@ -168,62 +173,79 @@ class AuthChecker:
|
||||
:param bot: bot
|
||||
:param event: event
|
||||
"""
|
||||
user_id = getattr(event, "user_id", None)
|
||||
if not user_id:
|
||||
return
|
||||
group_id = getattr(event, "group_id", None)
|
||||
if plugins2cd_manager.check_plugin_cd_status(plugin_name):
|
||||
plugin_cd_data = plugins2cd_manager.get_plugin_cd_data(plugin_name)
|
||||
check_type = plugin_cd_data.check_type
|
||||
limit_type = plugin_cd_data.limit_type
|
||||
msg = plugin_cd_data.rst
|
||||
if (
|
||||
(isinstance(event, PrivateMessageEvent) and check_type == "private")
|
||||
or (isinstance(event, GroupMessageEvent) and check_type == "group")
|
||||
or plugins2cd_manager.get_plugin_data(plugin_name).check_type == "all"
|
||||
):
|
||||
cd_type_ = event.user_id
|
||||
if limit_type == "group" and isinstance(event, GroupMessageEvent):
|
||||
cd_type_ = event.group_id
|
||||
if not plugins2cd_manager.check(plugin_name, cd_type_):
|
||||
if msg:
|
||||
await send_msg(msg, bot, event)
|
||||
raise IgnoredException(f"{plugin_name} 正在cd中...")
|
||||
else:
|
||||
plugins2cd_manager.start_cd(plugin_name, cd_type_)
|
||||
plugin_cd_data := plugins2cd_manager.get_plugin_cd_data(plugin_name)
|
||||
) and (plugin_data := plugins2cd_manager.get_plugin_data(plugin_name)):
|
||||
check_type = plugin_cd_data.check_type
|
||||
limit_type = plugin_cd_data.limit_type
|
||||
msg = plugin_cd_data.rst
|
||||
if (
|
||||
(isinstance(event, PrivateMessageEvent) and check_type == "private")
|
||||
or (isinstance(event, GroupMessageEvent) and check_type == "group")
|
||||
or plugin_data.check_type == "all"
|
||||
):
|
||||
cd_type_ = user_id
|
||||
if limit_type == "group" and isinstance(event, GroupMessageEvent):
|
||||
cd_type_ = event.group_id
|
||||
if not plugins2cd_manager.check(plugin_name, cd_type_):
|
||||
if msg:
|
||||
await send_msg(msg, bot, event) # type: ignore
|
||||
logger.debug(
|
||||
f"{plugin_name} 正在cd中...", "HOOK", user_id, group_id
|
||||
)
|
||||
raise IgnoredException(f"{plugin_name} 正在cd中...")
|
||||
else:
|
||||
plugins2cd_manager.start_cd(plugin_name, cd_type_)
|
||||
# Block
|
||||
if plugins2block_manager.check_plugin_block_status(plugin_name):
|
||||
plugin_block_data = plugins2block_manager.get_plugin_block_data(plugin_name)
|
||||
check_type = plugin_block_data.check_type
|
||||
limit_type = plugin_block_data.limit_type
|
||||
msg = plugin_block_data.rst
|
||||
if (
|
||||
(isinstance(event, PrivateMessageEvent) and check_type == "private")
|
||||
or (isinstance(event, GroupMessageEvent) and check_type == "group")
|
||||
or check_type == "all"
|
||||
if plugin_block_data := plugins2block_manager.get_plugin_block_data(
|
||||
plugin_name
|
||||
):
|
||||
block_type_ = event.user_id
|
||||
if limit_type == "group" and isinstance(event, GroupMessageEvent):
|
||||
block_type_ = event.group_id
|
||||
if plugins2block_manager.check(block_type_, plugin_name):
|
||||
if msg:
|
||||
await send_msg(msg, bot, event)
|
||||
raise IgnoredException(f"{event.user_id}正在调用{plugin_name}....")
|
||||
else:
|
||||
plugins2block_manager.set_true(block_type_, plugin_name)
|
||||
check_type = plugin_block_data.check_type
|
||||
limit_type = plugin_block_data.limit_type
|
||||
msg = plugin_block_data.rst
|
||||
if (
|
||||
(isinstance(event, PrivateMessageEvent) and check_type == "private")
|
||||
or (isinstance(event, GroupMessageEvent) and check_type == "group")
|
||||
or check_type == "all"
|
||||
):
|
||||
block_type_ = user_id
|
||||
if limit_type == "group" and isinstance(event, GroupMessageEvent):
|
||||
block_type_ = event.group_id
|
||||
if plugins2block_manager.check(block_type_, plugin_name):
|
||||
if msg:
|
||||
await send_msg(msg, bot, event) # type: ignore
|
||||
logger.debug(f"正在调用{plugin_name}...", "HOOK", user_id, group_id)
|
||||
raise IgnoredException(f"{user_id}正在调用{plugin_name}....")
|
||||
else:
|
||||
plugins2block_manager.set_true(block_type_, plugin_name)
|
||||
# Count
|
||||
if (
|
||||
plugins2count_manager.check_plugin_count_status(plugin_name)
|
||||
and event.user_id not in bot.config.superusers
|
||||
and user_id not in bot.config.superusers
|
||||
):
|
||||
plugin_count_data = plugins2count_manager.get_plugin_count_data(plugin_name)
|
||||
limit_type = plugin_count_data.limit_type
|
||||
msg = plugin_count_data.rst
|
||||
count_type_ = event.user_id
|
||||
if limit_type == "group" and isinstance(event, GroupMessageEvent):
|
||||
count_type_ = event.group_id
|
||||
if not plugins2count_manager.check(plugin_name, count_type_):
|
||||
if msg:
|
||||
await send_msg(msg, bot, event)
|
||||
raise IgnoredException(f"{plugin_name} count次数限制...")
|
||||
else:
|
||||
plugins2count_manager.increase(plugin_name, count_type_)
|
||||
if plugin_count_data := plugins2count_manager.get_plugin_count_data(
|
||||
plugin_name
|
||||
):
|
||||
limit_type = plugin_count_data.limit_type
|
||||
msg = plugin_count_data.rst
|
||||
count_type_ = user_id
|
||||
if limit_type == "group" and isinstance(event, GroupMessageEvent):
|
||||
count_type_ = event.group_id
|
||||
if not plugins2count_manager.check(plugin_name, count_type_):
|
||||
if msg:
|
||||
await send_msg(msg, bot, event) # type: ignore
|
||||
logger.debug(
|
||||
f"{plugin_name} count次数限制...", "HOOK", user_id, group_id
|
||||
)
|
||||
raise IgnoredException(f"{plugin_name} count次数限制...")
|
||||
else:
|
||||
plugins2count_manager.increase(plugin_name, count_type_)
|
||||
|
||||
async def auth_plugin(
|
||||
self, plugin_name: str, matcher: Matcher, bot: Bot, event: Event
|
||||
@ -241,66 +263,75 @@ class AuthChecker:
|
||||
1,
|
||||
999,
|
||||
]:
|
||||
user_id = getattr(event, "user_id", None)
|
||||
if not user_id:
|
||||
return
|
||||
group_id = getattr(event, "group_id", None)
|
||||
# 戳一戳单独判断
|
||||
if (
|
||||
isinstance(event, GroupMessageEvent)
|
||||
or isinstance(event, PokeNotifyEvent)
|
||||
or matcher.plugin_name in other_limit_plugins
|
||||
):
|
||||
if status_message_manager.get(event.group_id) is None:
|
||||
status_message_manager.delete(event.group_id)
|
||||
) and group_id:
|
||||
if status_message_manager.get(group_id) is None:
|
||||
status_message_manager.delete(group_id)
|
||||
if plugins2settings_manager[
|
||||
plugin_name
|
||||
].level > group_manager.get_group_level(event.group_id):
|
||||
].level > group_manager.get_group_level(group_id):
|
||||
try:
|
||||
if (
|
||||
self._flmt_g.check(event.user_id)
|
||||
self._flmt_g.check(user_id)
|
||||
and plugin_name not in ignore_rst_module
|
||||
):
|
||||
self._flmt_g.start_cd(event.user_id)
|
||||
self._flmt_g.start_cd(user_id)
|
||||
await bot.send_group_msg(
|
||||
group_id=event.group_id, message="群权限不足..."
|
||||
group_id=group_id, message="群权限不足..."
|
||||
)
|
||||
except ActionFailed:
|
||||
pass
|
||||
if event.is_tome():
|
||||
status_message_manager.add(event.group_id)
|
||||
status_message_manager.add(group_id)
|
||||
set_block_limit_false(event, plugin_name)
|
||||
logger.debug(f"{plugin_name} 群权限不足...", "HOOK", user_id, group_id)
|
||||
raise IgnoredException("群权限不足")
|
||||
# 插件状态
|
||||
if not group_manager.get_plugin_status(plugin_name, event.group_id):
|
||||
if not group_manager.get_plugin_status(plugin_name, group_id):
|
||||
try:
|
||||
if plugin_name not in ignore_rst_module and self._flmt_s.check(
|
||||
event.group_id
|
||||
group_id
|
||||
):
|
||||
self._flmt_s.start_cd(event.group_id)
|
||||
self._flmt_s.start_cd(group_id)
|
||||
await bot.send_group_msg(
|
||||
group_id=event.group_id, message="该群未开启此功能.."
|
||||
group_id=group_id, message="该群未开启此功能.."
|
||||
)
|
||||
except ActionFailed:
|
||||
pass
|
||||
if event.is_tome():
|
||||
status_message_manager.add(event.group_id)
|
||||
status_message_manager.add(group_id)
|
||||
set_block_limit_false(event, plugin_name)
|
||||
logger.debug(f"{plugin_name} 未开启此功能...", "HOOK", user_id, group_id)
|
||||
raise IgnoredException("未开启此功能...")
|
||||
# 管理员禁用
|
||||
if not group_manager.get_plugin_status(
|
||||
f"{plugin_name}:super", event.group_id
|
||||
f"{plugin_name}:super", group_id
|
||||
):
|
||||
try:
|
||||
if (
|
||||
self._flmt_s.check(event.group_id)
|
||||
self._flmt_s.check(group_id)
|
||||
and plugin_name not in ignore_rst_module
|
||||
):
|
||||
self._flmt_s.start_cd(event.group_id)
|
||||
self._flmt_s.start_cd(group_id)
|
||||
await bot.send_group_msg(
|
||||
group_id=event.group_id, message="管理员禁用了此群该功能..."
|
||||
group_id=group_id, message="管理员禁用了此群该功能..."
|
||||
)
|
||||
except ActionFailed:
|
||||
pass
|
||||
if event.is_tome():
|
||||
status_message_manager.add(event.group_id)
|
||||
status_message_manager.add(group_id)
|
||||
set_block_limit_false(event, plugin_name)
|
||||
logger.debug(
|
||||
f"{plugin_name} 管理员禁用了此群该功能...", "HOOK", user_id, group_id
|
||||
)
|
||||
raise IgnoredException("管理员禁用了此群该功能...")
|
||||
# 群聊禁用
|
||||
if not plugins_manager.get_plugin_status(
|
||||
@ -308,18 +339,21 @@ class AuthChecker:
|
||||
):
|
||||
try:
|
||||
if (
|
||||
self._flmt_c.check(event.group_id)
|
||||
self._flmt_c.check(group_id)
|
||||
and plugin_name not in ignore_rst_module
|
||||
):
|
||||
self._flmt_c.start_cd(event.group_id)
|
||||
self._flmt_c.start_cd(group_id)
|
||||
await bot.send_group_msg(
|
||||
group_id=event.group_id, message="该功能在群聊中已被禁用..."
|
||||
group_id=group_id, message="该功能在群聊中已被禁用..."
|
||||
)
|
||||
except ActionFailed:
|
||||
pass
|
||||
if event.is_tome():
|
||||
status_message_manager.add(event.group_id)
|
||||
status_message_manager.add(group_id)
|
||||
set_block_limit_false(event, plugin_name)
|
||||
logger.debug(
|
||||
f"{plugin_name} 该插件在群聊中已被禁用...", "HOOK", user_id, group_id
|
||||
)
|
||||
raise IgnoredException("该插件在群聊中已被禁用...")
|
||||
else:
|
||||
# 私聊禁用
|
||||
@ -327,16 +361,19 @@ class AuthChecker:
|
||||
plugin_name, block_type="private"
|
||||
):
|
||||
try:
|
||||
if self._flmt_c.check(event.user_id):
|
||||
self._flmt_c.start_cd(event.user_id)
|
||||
if self._flmt_c.check(user_id):
|
||||
self._flmt_c.start_cd(user_id)
|
||||
await bot.send_private_msg(
|
||||
user_id=event.user_id, message="该功能在私聊中已被禁用..."
|
||||
user_id=user_id, message="该功能在私聊中已被禁用..."
|
||||
)
|
||||
except ActionFailed:
|
||||
pass
|
||||
if event.is_tome():
|
||||
status_message_manager.add(event.user_id)
|
||||
status_message_manager.add(user_id)
|
||||
set_block_limit_false(event, plugin_name)
|
||||
logger.debug(
|
||||
f"{plugin_name} 该插件在私聊中已被禁用...", "HOOK", user_id, group_id
|
||||
)
|
||||
raise IgnoredException("该插件在私聊中已被禁用...")
|
||||
# 维护
|
||||
if not plugins_manager.get_plugin_status(plugin_name, block_type="all"):
|
||||
@ -357,18 +394,15 @@ class AuthChecker:
|
||||
)
|
||||
else:
|
||||
await bot.send_private_msg(
|
||||
user_id=event.user_id, message="此功能正在维护..."
|
||||
user_id=user_id, message="此功能正在维护..."
|
||||
)
|
||||
except ActionFailed:
|
||||
pass
|
||||
if event.is_tome():
|
||||
id_ = (
|
||||
event.group_id
|
||||
if isinstance(event, GroupMessageEvent)
|
||||
else event.user_id
|
||||
)
|
||||
id_ = group_id or user_id
|
||||
status_message_manager.add(id_)
|
||||
set_block_limit_false(event, plugin_name)
|
||||
logger.debug(f"{plugin_name} 此功能正在维护...", "HOOK", user_id, group_id)
|
||||
raise IgnoredException("此功能正在维护...")
|
||||
|
||||
async def auth_admin(
|
||||
@ -383,6 +417,10 @@ class AuthChecker:
|
||||
:param bot: bot
|
||||
:param event: event
|
||||
"""
|
||||
user_id = getattr(event, "user_id", None)
|
||||
if not user_id:
|
||||
return
|
||||
group_id = getattr(event, "group_id", None)
|
||||
if plugin_name in admin_manager.keys() and matcher.priority not in [1, 999]:
|
||||
if isinstance(event, GroupMessageEvent):
|
||||
# 个人权限
|
||||
@ -407,21 +445,23 @@ class AuthChecker:
|
||||
set_block_limit_false(event, plugin_name)
|
||||
if event.is_tome():
|
||||
status_message_manager.add(event.group_id)
|
||||
raise IgnoredException("权限不足")
|
||||
logger.debug(f"{plugin_name} 管理员权限不足...", "HOOK", user_id, group_id)
|
||||
raise IgnoredException("管理员权限不足")
|
||||
else:
|
||||
if not await LevelUser.check_level(
|
||||
event.user_id, 0, admin_manager.get_plugin_level(plugin_name)
|
||||
user_id, 0, admin_manager.get_plugin_level(plugin_name)
|
||||
):
|
||||
try:
|
||||
await bot.send_private_msg(
|
||||
user_id=event.user_id,
|
||||
user_id=user_id,
|
||||
message=f"你的权限不足喔,该功能需要的权限等级:{admin_manager.get_plugin_level(plugin_name)}",
|
||||
)
|
||||
except ActionFailed:
|
||||
pass
|
||||
set_block_limit_false(event, plugin_name)
|
||||
if event.is_tome():
|
||||
status_message_manager.add(event.user_id)
|
||||
status_message_manager.add(user_id)
|
||||
logger.debug(f"{plugin_name} 管理员权限不足...", "HOOK", user_id, group_id)
|
||||
raise IgnoredException("权限不足")
|
||||
|
||||
def auth_group(self, plugin_name: str, bot: Bot, event: Event):
|
||||
@ -433,21 +473,26 @@ class AuthChecker:
|
||||
:param bot: bot
|
||||
:param event: event
|
||||
"""
|
||||
if isinstance(event, GroupMessageEvent) or plugin_name in other_limit_plugins:
|
||||
user_id = getattr(event, "user_id", None)
|
||||
group_id = getattr(event, "group_id", None)
|
||||
if not group_id:
|
||||
return
|
||||
if (
|
||||
group_manager.get_group_level(group_id) < 0
|
||||
and str(user_id) not in bot.config.superusers
|
||||
):
|
||||
logger.debug(f"{plugin_name} 群黑名单, 群权限-1...", "HOOK", user_id, group_id)
|
||||
raise IgnoredException("群黑名单")
|
||||
if not group_manager.check_group_bot_status(group_id):
|
||||
try:
|
||||
if (
|
||||
group_manager.get_group_level(event.group_id) < 0
|
||||
and str(event.user_id) not in bot.config.superusers
|
||||
):
|
||||
raise IgnoredException("群黑名单")
|
||||
if not group_manager.check_group_bot_status(event.group_id):
|
||||
try:
|
||||
if str(event.get_message()) != "醒来":
|
||||
raise IgnoredException("功能总开关关闭状态")
|
||||
except ValueError:
|
||||
raise IgnoredException("功能总开关关闭状态")
|
||||
except AttributeError:
|
||||
pass
|
||||
if str(event.get_message()) != "醒来":
|
||||
logger.debug(
|
||||
f"{plugin_name} 功能总开关关闭状态...", "HOOK", user_id, group_id
|
||||
)
|
||||
raise IgnoredException("功能总开关关闭状态")
|
||||
except ValueError:
|
||||
logger.debug(f"{plugin_name} 功能总开关关闭状态...", "HOOK", user_id, group_id)
|
||||
raise IgnoredException("功能总开关关闭状态")
|
||||
|
||||
async def auth_basic(self, plugin_name: str, bot: Bot, event: Event):
|
||||
"""
|
||||
@ -458,32 +503,29 @@ class AuthChecker:
|
||||
:param bot: bot
|
||||
:param event: event
|
||||
"""
|
||||
try:
|
||||
user_id = getattr(event, "user_id", None)
|
||||
if not user_id:
|
||||
return
|
||||
plugin_setting = plugins2settings_manager.get_plugin_data(plugin_name)
|
||||
if (
|
||||
(
|
||||
not isinstance(event, MessageEvent)
|
||||
and plugin_name not in other_limit_plugins
|
||||
)
|
||||
or await BanUser.is_ban(user_id)
|
||||
and str(user_id) not in bot.config.superusers
|
||||
) or (
|
||||
str(user_id) in bot.config.superusers
|
||||
and plugin_setting
|
||||
and not plugin_setting.limit_superuser
|
||||
):
|
||||
raise IsSuperuserException()
|
||||
if plugin_data := plugin_data_manager.get(plugin_name):
|
||||
if (
|
||||
(
|
||||
not isinstance(event, MessageEvent)
|
||||
and plugin_name not in other_limit_plugins
|
||||
)
|
||||
or await BanUser.is_ban(event.user_id)
|
||||
and str(event.user_id) not in bot.config.superusers
|
||||
) or (
|
||||
str(event.user_id) in bot.config.superusers
|
||||
and plugins2settings_manager.get_plugin_data(plugin_name)
|
||||
and not plugins2settings_manager.get_plugin_data(
|
||||
plugin_name
|
||||
).limit_superuser
|
||||
plugin_data.plugin_type == PluginType.SUPERUSER
|
||||
and str(user_id) in bot.config.superusers
|
||||
):
|
||||
raise IsSuperuserException()
|
||||
_plugin = nonebot.plugin.get_plugin(plugin_name)
|
||||
_module = _plugin.module
|
||||
_plugin_name = _module.__getattribute__("__zx_plugin_name__")
|
||||
if (
|
||||
"[superuser]" in _plugin_name.lower()
|
||||
and str(event.user_id) in bot.config.superusers
|
||||
):
|
||||
raise IsSuperuserException()
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
async def auth_cost(self, plugin_name: str, bot: Bot, event: Event) -> int:
|
||||
"""
|
||||
@ -494,6 +536,10 @@ class AuthChecker:
|
||||
:param bot: bot
|
||||
:param event: event
|
||||
"""
|
||||
user_id = getattr(event, "user_id", None)
|
||||
if not user_id:
|
||||
return 0
|
||||
group_id = getattr(event, "group_id", None)
|
||||
cost_gold = 0
|
||||
if isinstance(event, GroupMessageEvent) and (
|
||||
psm := plugins2settings_manager.get_plugin_data(plugin_name)
|
||||
@ -504,6 +550,12 @@ class AuthChecker:
|
||||
< psm.cost_gold
|
||||
):
|
||||
await send_msg(f"金币不足..该功能需要{psm.cost_gold}金币..", bot, event)
|
||||
logger.debug(
|
||||
f"{plugin_name} 金币限制..该功能需要{psm.cost_gold}金币..",
|
||||
"HOOK",
|
||||
user_id,
|
||||
group_id,
|
||||
)
|
||||
raise IgnoredException(f"{plugin_name} 金币限制...")
|
||||
# 当插件不阻塞超级用户时,超级用户提前扣除金币
|
||||
if (
|
||||
|
||||
@ -1,17 +1,11 @@
|
||||
from nonebot.adapters.onebot.v11 import (
|
||||
ActionFailed,
|
||||
Bot,
|
||||
Event,
|
||||
GroupMessageEvent,
|
||||
MessageEvent,
|
||||
PokeNotifyEvent,
|
||||
)
|
||||
from nonebot.adapters.onebot.v11 import ActionFailed, Bot, Event, GroupMessageEvent
|
||||
from nonebot.matcher import Matcher
|
||||
from nonebot.message import IgnoredException, run_preprocessor
|
||||
from nonebot.typing import T_State
|
||||
|
||||
from configs.config import Config
|
||||
from models.ban_user import BanUser
|
||||
from services.log import logger
|
||||
from utils.message_builder import at
|
||||
from utils.utils import FreqLimiter, is_number, static_flmt
|
||||
|
||||
@ -30,26 +24,19 @@ _flmt = FreqLimiter(300)
|
||||
# 检查是否被ban
|
||||
@run_preprocessor
|
||||
async def _(matcher: Matcher, bot: Bot, event: Event, state: T_State):
|
||||
if hasattr(event, "user_id") and (
|
||||
(
|
||||
(isinstance(event, MessageEvent) or isinstance(event, PokeNotifyEvent))
|
||||
and matcher.priority not in [1, 999]
|
||||
)
|
||||
or matcher.plugin_name in other_limit_plugins
|
||||
user_id = getattr(event, "user_id", None)
|
||||
group_id = getattr(event, "group_id", None)
|
||||
if user_id and (
|
||||
matcher.priority not in [1, 999] or matcher.plugin_name in other_limit_plugins
|
||||
):
|
||||
try:
|
||||
if (
|
||||
await BanUser.is_super_ban(event.user_id)
|
||||
and str(event.user_id) not in bot.config.superusers
|
||||
):
|
||||
raise IgnoredException("用户处于超级黑名单中")
|
||||
except AttributeError:
|
||||
pass
|
||||
if (
|
||||
await BanUser.is_ban(event.user_id)
|
||||
and str(event.user_id) not in bot.config.superusers
|
||||
await BanUser.is_super_ban(user_id)
|
||||
and str(user_id) not in bot.config.superusers
|
||||
):
|
||||
time = await BanUser.check_ban_time(event.user_id)
|
||||
logger.debug(f"用户处于超级黑名单中...", "HOOK", user_id, group_id)
|
||||
raise IgnoredException("用户处于超级黑名单中")
|
||||
if await BanUser.is_ban(user_id) and str(user_id) not in bot.config.superusers:
|
||||
time = await BanUser.check_ban_time(user_id)
|
||||
if isinstance(time, int):
|
||||
time = abs(int(time))
|
||||
if time < 60:
|
||||
@ -59,40 +46,38 @@ async def _(matcher: Matcher, bot: Bot, event: Event, state: T_State):
|
||||
else:
|
||||
time = str(time) + " 分钟"
|
||||
if isinstance(event, GroupMessageEvent):
|
||||
if not static_flmt.check(event.user_id):
|
||||
if not static_flmt.check(user_id):
|
||||
logger.debug(f"用户处于黑名单中...", "HOOK", user_id, group_id)
|
||||
raise IgnoredException("用户处于黑名单中")
|
||||
static_flmt.start_cd(event.user_id)
|
||||
static_flmt.start_cd(user_id)
|
||||
if matcher.priority != 999:
|
||||
try:
|
||||
ban_result = Config.get_config("hook", "BAN_RESULT")
|
||||
if (
|
||||
ban_result
|
||||
and _flmt.check(event.user_id)
|
||||
and _flmt.check(user_id)
|
||||
and matcher.plugin_name not in ignore_rst_module
|
||||
):
|
||||
_flmt.start_cd(event.user_id)
|
||||
_flmt.start_cd(user_id)
|
||||
await bot.send_group_msg(
|
||||
group_id=event.group_id,
|
||||
message=at(event.user_id)
|
||||
message=at(user_id)
|
||||
+ ban_result
|
||||
+ f" 在..在 {time} 后才会理你喔",
|
||||
)
|
||||
except ActionFailed:
|
||||
pass
|
||||
else:
|
||||
if not static_flmt.check(event.user_id):
|
||||
if not static_flmt.check(user_id):
|
||||
logger.debug(f"用户处于黑名单中...", "HOOK", user_id, group_id)
|
||||
raise IgnoredException("用户处于黑名单中")
|
||||
static_flmt.start_cd(event.user_id)
|
||||
static_flmt.start_cd(user_id)
|
||||
if matcher.priority != 999:
|
||||
try:
|
||||
ban_result = Config.get_config("hook", "BAN_RESULT")
|
||||
if ban_result and matcher.plugin_name not in ignore_rst_module:
|
||||
await bot.send_private_msg(
|
||||
user_id=event.user_id,
|
||||
message=at(event.user_id)
|
||||
+ ban_result
|
||||
+ f" 在..在 {time}后才会理你喔",
|
||||
)
|
||||
except ActionFailed:
|
||||
pass
|
||||
ban_result = Config.get_config("hook", "BAN_RESULT")
|
||||
if ban_result and matcher.plugin_name not in ignore_rst_module:
|
||||
await bot.send_private_msg(
|
||||
user_id=user_id,
|
||||
message=at(user_id) + ban_result + f" 在..在 {time}后才会理你喔",
|
||||
)
|
||||
logger.debug(f"用户处于黑名单中...", "HOOK", user_id, group_id)
|
||||
raise IgnoredException("用户处于黑名单中")
|
||||
|
||||
@ -1,39 +1,54 @@
|
||||
from nonebot.matcher import Matcher
|
||||
from nonebot.message import run_preprocessor, IgnoredException
|
||||
from nonebot.typing import T_State
|
||||
from nonebot.adapters.onebot.v11 import (
|
||||
Bot,
|
||||
ActionFailed,
|
||||
MessageEvent,
|
||||
Bot,
|
||||
GroupMessageEvent,
|
||||
MessageEvent,
|
||||
)
|
||||
from nonebot.matcher import Matcher
|
||||
from nonebot.message import IgnoredException, run_preprocessor
|
||||
from nonebot.typing import T_State
|
||||
|
||||
from configs.config import Config
|
||||
from models.ban_user import BanUser
|
||||
from utils.utils import BanCheckLimiter
|
||||
from utils.message_builder import at
|
||||
from services.log import logger
|
||||
from utils.message_builder import at
|
||||
from utils.utils import BanCheckLimiter
|
||||
|
||||
malicious_check_time = Config.get_config("hook", "MALICIOUS_CHECK_TIME")
|
||||
malicious_ban_count = Config.get_config("hook", "MALICIOUS_BAN_COUNT")
|
||||
|
||||
if not malicious_check_time:
|
||||
raise ValueError("模块: [hook], 配置项: [MALICIOUS_CHECK_TIME] 为空或小于0")
|
||||
if not malicious_ban_count:
|
||||
raise ValueError("模块: [hook], 配置项: [MALICIOUS_BAN_COUNT] 为空或小于0")
|
||||
|
||||
_blmt = BanCheckLimiter(
|
||||
Config.get_config("hook", "MALICIOUS_CHECK_TIME"),
|
||||
Config.get_config("hook", "MALICIOUS_BAN_COUNT"),
|
||||
malicious_check_time,
|
||||
malicious_ban_count,
|
||||
)
|
||||
|
||||
|
||||
# 恶意触发命令检测
|
||||
@run_preprocessor
|
||||
async def _(matcher: Matcher, bot: Bot, event: GroupMessageEvent, state: T_State):
|
||||
user_id = getattr(event, "user_id", None)
|
||||
group_id = getattr(event, "group_id", None)
|
||||
if not isinstance(event, MessageEvent):
|
||||
return
|
||||
malicious_ban_time = Config.get_config("hook", "MALICIOUS_BAN_TIME")
|
||||
if not malicious_ban_time:
|
||||
raise ValueError("模块: [hook], 配置项: [MALICIOUS_BAN_TIME] 为空或小于0")
|
||||
if matcher.type == "message" and matcher.priority not in [1, 999]:
|
||||
if state["_prefix"]["raw_command"]:
|
||||
if _blmt.check(f'{event.user_id}{state["_prefix"]["raw_command"]}'):
|
||||
await BanUser.ban(
|
||||
event.user_id,
|
||||
9,
|
||||
Config.get_config("hook", "MALICIOUS_BAN_TIME") * 60,
|
||||
malicious_ban_time * 60,
|
||||
)
|
||||
logger.info(
|
||||
f"触发了恶意触发检测: {matcher.plugin_name}", "HOOK", user_id, group_id
|
||||
)
|
||||
logger.info(f"USER {event.user_id} 触发了恶意触发检测")
|
||||
if isinstance(event, GroupMessageEvent):
|
||||
try:
|
||||
await bot.send_group_msg(
|
||||
@ -50,5 +65,8 @@ async def _(matcher: Matcher, bot: Bot, event: GroupMessageEvent, state: T_State
|
||||
)
|
||||
except ActionFailed:
|
||||
pass
|
||||
logger.debug(
|
||||
f"触发了恶意触发检测: {matcher.plugin_name}", "HOOK", user_id, group_id
|
||||
)
|
||||
raise IgnoredException("检测到恶意触发命令")
|
||||
_blmt.add(f'{event.user_id}{state["_prefix"]["raw_command"]}')
|
||||
|
||||
@ -1,9 +1,11 @@
|
||||
from nonebot.exception import MockApiException
|
||||
from nonebot.adapters.onebot.v11 import Bot, Message
|
||||
from utils.manager import group_manager
|
||||
from services.log import logger
|
||||
from typing import Dict, Any
|
||||
import re
|
||||
from typing import Any, Dict
|
||||
|
||||
from nonebot.adapters.onebot.v11 import Bot, Message
|
||||
from nonebot.exception import MockApiException
|
||||
|
||||
from services.log import logger
|
||||
from utils.manager import group_manager
|
||||
|
||||
|
||||
@Bot.on_calling_api
|
||||
@ -40,13 +42,13 @@ async def _(bot: Bot, api: str, data: Dict[str, Any]):
|
||||
task = r.group(1)
|
||||
group_id = data["group_id"]
|
||||
except Exception as e:
|
||||
logger.error(f"TaskHook ERROR {type(e)}:{e}")
|
||||
logger.error(f"TaskHook ERROR", "HOOK", e=e)
|
||||
else:
|
||||
if task and group_id:
|
||||
if (
|
||||
group_manager.get_group_level(group_id) < 0
|
||||
or not group_manager.check_task_status(task, group_id)
|
||||
):
|
||||
if group_manager.get_group_level(
|
||||
group_id
|
||||
) < 0 or not group_manager.check_task_status(task, group_id):
|
||||
logger.debug(f"被动技能 {task} 处于关闭状态")
|
||||
raise MockApiException(f"被动技能 {task} 处于关闭状态...")
|
||||
else:
|
||||
msg = str(data["message"]).strip()
|
||||
|
||||
@ -1,10 +1,13 @@
|
||||
import asyncio
|
||||
from typing import Optional
|
||||
|
||||
from nonebot.adapters.onebot.v11 import Bot, Event
|
||||
from nonebot.matcher import Matcher
|
||||
from nonebot.message import run_postprocessor
|
||||
from typing import Optional
|
||||
from nonebot.typing import T_State
|
||||
from nonebot.adapters.onebot.v11 import Bot, Event
|
||||
|
||||
from services.log import logger
|
||||
from utils.manager import withdraw_message_manager
|
||||
import asyncio
|
||||
|
||||
|
||||
# 消息撤回
|
||||
@ -25,4 +28,5 @@ async def _(
|
||||
|
||||
async def _withdraw_message(bot: Bot, id_: int, time: int):
|
||||
await asyncio.sleep(time)
|
||||
logger.debug(f"撤回消息ID: {id_}", "HOOK")
|
||||
await bot.delete_msg(message_id=id_)
|
||||
|
||||
@ -41,7 +41,7 @@ x = on_message(priority=999, block=False, rule=lambda: False)
|
||||
@friend_req.handle()
|
||||
async def _(bot: Bot, event: FriendRequestEvent):
|
||||
if time_manager.add_user_request(event.user_id):
|
||||
logger.debug(f"收录 用户[{event.user_id}] 好友请求", "好友请求")
|
||||
logger.debug(f"收录好友请求...", "好友请求", target=event.user_id)
|
||||
user = await bot.get_stranger_info(user_id=event.user_id)
|
||||
nickname = user["nickname"]
|
||||
sex = user["sex"]
|
||||
|
||||
@ -105,7 +105,7 @@ async def uninstall_plugin(name: str) -> str:
|
||||
logger.info(f"插件 {name} 删除成功!")
|
||||
return f"插件 {name} 删除成功!"
|
||||
except Exception as e:
|
||||
logger.error(f"删除插件 {name} 失败 {type(e)}:{e}")
|
||||
logger.error(f"删除插件失败", target=name, e=e)
|
||||
return f"删除插件 {name} 失败 {type(e)}:{e}"
|
||||
|
||||
|
||||
@ -183,19 +183,18 @@ async def download_json() -> int:
|
||||
shutil.rmtree(extract_path.absolute(), ignore_errors=True)
|
||||
return 200
|
||||
except Exception as e:
|
||||
logger.error(f"下载插件库压缩包失败或解压失败 {type(e)}:{e}")
|
||||
logger.error(f"下载插件库压缩包失败或解压失败", e=e)
|
||||
return 999
|
||||
|
||||
|
||||
async def get_plugin_name(name: int) -> Tuple[str, int]:
|
||||
async def get_plugin_name(index: int) -> Tuple[str, int]:
|
||||
"""
|
||||
通过下标获取插件名
|
||||
:param name: 下标
|
||||
"""
|
||||
name = int(name)
|
||||
if not data:
|
||||
await show_plugin_repo()
|
||||
if name < 1 or name > len(data.keys()):
|
||||
if index < 1 or index > len(data.keys()):
|
||||
return "下标超过上下限!", 999
|
||||
name = list(data.keys())[name - 1]
|
||||
name = list(data.keys())[index - 1]
|
||||
return name, 200
|
||||
|
||||
@ -36,6 +36,6 @@ async def _(event: GroupMessageEvent):
|
||||
props = await BagUser.get_property(event.user_id, event.group_id)
|
||||
if props:
|
||||
await my_props.send(image(b64=await create_bag_image(props)))
|
||||
logger.info(f"USER {event.user_id} GROUP {event.group_id} 查看我的道具")
|
||||
logger.info(f"查看我的道具", "我的道具", event.user_id, event.group_id)
|
||||
else:
|
||||
await my_props.finish("您的背包里没有任何的道具噢~", at_sender=True)
|
||||
|
||||
@ -92,10 +92,10 @@ async def _(event: MessageEvent, arg: Message = CommandArg()):
|
||||
f"限时:{data.get('limit_time')}",
|
||||
at_sender=True,
|
||||
)
|
||||
logger.info(f"USER {event.user_id} 添加商品 {msg} 成功")
|
||||
logger.info(f"添加商品 {msg} 成功", "添加商品", event.user_id)
|
||||
else:
|
||||
await shop_add_goods.send(f"添加商品 {msg} 失败了...", at_sender=True)
|
||||
logger.warning(f"USER {event.user_id} 添加商品 {msg} 失败")
|
||||
logger.warning(f"添加商品 {msg} 失败", "添加商品", event.user_id)
|
||||
|
||||
|
||||
@shop_del_goods.handle()
|
||||
@ -113,10 +113,10 @@ async def _(event: MessageEvent, arg: Message = CommandArg()):
|
||||
await shop_del_goods.send(f"删除商品 {goods_name} 成功了...", at_sender=True)
|
||||
if os.path.exists(f"{IMAGE_PATH}/shop_help.png"):
|
||||
os.remove(f"{IMAGE_PATH}/shop_help.png")
|
||||
logger.info(f"USER {event.user_id} 删除商品 {goods_name} 成功")
|
||||
logger.info(f"删除商品成功", "删除商品", event.user_id, target=goods_name)
|
||||
else:
|
||||
await shop_del_goods.send(f"删除商品 {goods_name} 失败了...", at_sender=True)
|
||||
logger.info(f"USER {event.user_id} 删除商品 {goods_name} 失败")
|
||||
logger.info(f"删除商品失败", "删除商品", event.user_id, target=goods_name)
|
||||
|
||||
|
||||
@shop_update_goods.handle()
|
||||
@ -131,10 +131,10 @@ async def _(event: MessageEvent, arg: Message = CommandArg()):
|
||||
flag, name, text = await update_goods(**data)
|
||||
if flag:
|
||||
await shop_update_goods.send(f"修改商品 {name} 成功了...\n{text}", at_sender=True)
|
||||
logger.info(f"USER {event.user_id} 修改商品 {name} 数据 {text} 成功")
|
||||
logger.info(f"修改商品数据 {text} 成功", "修改商品", event.user_id, target=name)
|
||||
else:
|
||||
await shop_update_goods.send(name, at_sender=True)
|
||||
logger.info(f"USER {event.user_id} 修改商品 {name} 数据 {text} 失败")
|
||||
logger.info(f"修改商品数据 {text} 失败", "修改商品", event.user_id, target=name)
|
||||
|
||||
|
||||
@scheduler.scheduled_job(
|
||||
@ -147,7 +147,7 @@ async def _():
|
||||
await GoodsInfo.all().update(daily_purchase_limit={})
|
||||
logger.info("商品每日限购次数重置成功...")
|
||||
except Exception as e:
|
||||
logger.error(f"商品每日限购次数重置出错 {type(e)}:{e}")
|
||||
logger.error(f"商品每日限购次数重置出错", e=e)
|
||||
|
||||
|
||||
@scheduler.scheduled_job(
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
import time
|
||||
from typing import Optional, Tuple, Union
|
||||
from typing import List, Optional, Tuple, Union
|
||||
|
||||
from PIL import Image
|
||||
|
||||
@ -25,7 +25,7 @@ async def create_shop_help() -> str:
|
||||
_dc = {}
|
||||
font_h = BuildImage(0, 0).getsize("正")[1]
|
||||
h = 10
|
||||
_list = []
|
||||
_list: List[GoodsInfo] = []
|
||||
for goods in goods_lst:
|
||||
if goods.goods_limit_time == 0 or time.time() < goods.goods_limit_time:
|
||||
_list.append(goods)
|
||||
|
||||
@ -97,9 +97,7 @@ async def _(bot: Bot, event: GroupMessageEvent, arg: Message = CommandArg()):
|
||||
await use_props.send(f"使用道具 {name} {num} 次成功!", at_sender=True)
|
||||
if msg := await effect(bot, event, name, num, text, event.message):
|
||||
await use_props.send(msg, at_sender=True)
|
||||
logger.info(
|
||||
f"USER {event.user_id} GROUP {event.group_id} 使用道具 {name} {num} 次成功"
|
||||
)
|
||||
logger.info(f"使用道具 {name} {num} 次成功", event.user_id, event.group_id)
|
||||
await UserShopGoldLog.create(
|
||||
user_qq=event.user_id,
|
||||
group_id=event.group_id,
|
||||
@ -110,7 +108,7 @@ async def _(bot: Bot, event: GroupMessageEvent, arg: Message = CommandArg()):
|
||||
else:
|
||||
await use_props.send(f"使用道具 {name} {num} 次失败!", at_sender=True)
|
||||
logger.info(
|
||||
f"USER {event.user_id} GROUP {event.group_id} 使用道具 {name} {num} 次失败"
|
||||
f"使用道具 {name} {num} 次失败", "使用道具", event.user_id, event.group_id
|
||||
)
|
||||
await func_manager.run_handle(type_="after_handle", param=model, **kwargs)
|
||||
else:
|
||||
|
||||
@ -205,40 +205,31 @@ async def _(
|
||||
if not msg:
|
||||
await manager_group_whitelist.finish("请输入群号")
|
||||
error_group = []
|
||||
all_group = [g["group_id"] for g in await bot.get_group_list()]
|
||||
for group_id in msg:
|
||||
group_id = int(group_id)
|
||||
if is_number(group_id) and group_id in all_group:
|
||||
if cmd[:2] == "添加":
|
||||
try:
|
||||
group_info = await bot.get_group_info(group_id=group_id)
|
||||
await GroupInfo.update_or_create(
|
||||
group_id=group_info["group_id"],
|
||||
defaults={
|
||||
"group_flag": 1,
|
||||
"group_name": group_info["group_name"],
|
||||
"max_member_count": group_info["max_member_count"],
|
||||
"member_count": group_info["member_count"],
|
||||
},
|
||||
)
|
||||
except Exception as e:
|
||||
await group_auth.send(f"添加群认证 {group_id} 发生错误!")
|
||||
logger.error(f"添加群认证发生错误", cmd, target=group_id, e=e)
|
||||
else:
|
||||
await group_auth.send(f"已为 {group_id} {cmd[:2]}群认证..")
|
||||
logger.info(f"添加群认证成功", cmd, target=group_id)
|
||||
if cmd[:2] == "添加":
|
||||
try:
|
||||
await GroupInfo.update_or_create(
|
||||
group_id=group_id,
|
||||
defaults={
|
||||
"group_flag": 1,
|
||||
},
|
||||
)
|
||||
except Exception as e:
|
||||
await group_auth.send(f"添加群认证 {group_id} 发生错误!")
|
||||
logger.error(f"添加群认证发生错误", cmd, target=group_id, e=e)
|
||||
else:
|
||||
if group := await GroupInfo.filter(group_id=group_id).first():
|
||||
await group.update_or_create(
|
||||
group_id=group_id, defaults={"group_flag": 0}
|
||||
)
|
||||
await group_auth.send(f"已删除 {group_id} 群认证..")
|
||||
logger.info(f"删除群认证成功", cmd, target=group_id)
|
||||
else:
|
||||
await group_auth.send(f"未查找到群聊: {group_id}")
|
||||
logger.info(f"未找到群聊", cmd, target=group_id)
|
||||
await group_auth.send(f"已为 {group_id} {cmd[:2]}群认证..")
|
||||
logger.info(f"添加群认证成功", cmd, target=group_id)
|
||||
else:
|
||||
logger.debug(f"群号不合法或不存在", cmd, target=group_id)
|
||||
error_group.append(str(group_id))
|
||||
if group := await GroupInfo.filter(group_id=group_id).first():
|
||||
await group.update_or_create(
|
||||
group_id=group_id, defaults={"group_flag": 0}
|
||||
)
|
||||
await group_auth.send(f"已删除 {group_id} 群认证..")
|
||||
logger.info(f"删除群认证成功", cmd, target=group_id)
|
||||
else:
|
||||
await group_auth.send(f"未查找到群聊: {group_id}")
|
||||
logger.info(f"未找到群聊", cmd, target=group_id)
|
||||
if error_group:
|
||||
await manager_group_whitelist.send("以下群聊不合法或不存在:\n" + "\n".join(error_group))
|
||||
|
||||
@ -1,11 +1,10 @@
|
||||
|
||||
import nonebot
|
||||
from configs.path_config import IMAGE_PATH
|
||||
from nonebot import Driver
|
||||
|
||||
from configs.path_config import IMAGE_PATH
|
||||
from services.log import logger
|
||||
from utils.image_template import help_template
|
||||
from utils.image_utils import (BuildImage, build_sort_image, group_image,
|
||||
text2image)
|
||||
from utils.image_utils import BuildImage, build_sort_image, group_image, text2image
|
||||
from utils.manager import plugin_data_manager
|
||||
from utils.manager.models import PluginType
|
||||
|
||||
@ -52,13 +51,11 @@ async def create_help_image():
|
||||
task_list.append(plugin_data.task[x])
|
||||
except Exception as e:
|
||||
logger.warning(
|
||||
f"获取超级用户插件 {plugin_data.model}: {plugin_data.name} 设置失败... {type(e)}:{e}"
|
||||
f"获取超级用户插件 {plugin_data.model}: {plugin_data.name} 设置失败...", e=e
|
||||
)
|
||||
task_str = "\n".join(task_list)
|
||||
task_str = "通过私聊 开启被动/关闭被动 + [被动名称] 来控制全局被动\n----------\n" + task_str
|
||||
task_image = await text2image(
|
||||
task_str, padding=5, color=(204, 196, 151)
|
||||
)
|
||||
task_image = await text2image(task_str, padding=5, color=(204, 196, 151))
|
||||
task_image = await help_template("被动任务", task_image)
|
||||
image_list.append(task_image)
|
||||
image_group, _ = group_image(image_list)
|
||||
|
||||
@ -27,6 +27,6 @@ update_info = on_command("更新信息", aliases={"更新日志"}, priority=5, b
|
||||
@update_info.handle()
|
||||
async def _():
|
||||
if img := image("update_info.png"):
|
||||
await update_info.finish(image("update_info.png"))
|
||||
await update_info.finish(img)
|
||||
else:
|
||||
await update_info.finish("目前没有更新信息哦")
|
||||
|
||||
@ -113,5 +113,6 @@ class GroupInfoUser(Model):
|
||||
@classmethod
|
||||
async def _run_script(cls):
|
||||
return [
|
||||
"alter table group_info_users alter user_join_time drop not null;" # 允许 user_join_time 为空
|
||||
"alter table group_info_users alter user_join_time drop not null;", # 允许 user_join_time 为空
|
||||
"ALTER TABLE group_info_users ALTER COLUMN user_join_time TYPE timestamp with time zone USING user_join_time::timestamp with time zone;",
|
||||
]
|
||||
|
||||
@ -14,7 +14,7 @@ BASE_PATH = IMAGE_PATH / "csgo_cases"
|
||||
ICON_PATH = IMAGE_PATH / "_icon"
|
||||
|
||||
|
||||
async def generate_skin(skin: BuffSkin) -> Optional[BuildImage]:
|
||||
async def generate_skin(skin: BuffSkin, update_count: int) -> Optional[BuildImage]:
|
||||
"""构造皮肤图片
|
||||
|
||||
Args:
|
||||
@ -53,13 +53,19 @@ async def generate_skin(skin: BuffSkin) -> Optional[BuildImage]:
|
||||
(340, 116), str(skin.sell_min_price), (0, 255, 98), font_size=30
|
||||
)
|
||||
|
||||
price_icon = BuildImage(30, 30, background=ICON_PATH / "num_white.png")
|
||||
await case_bk.apaste(price_icon, (455, 70), True)
|
||||
update_count_icon = BuildImage(
|
||||
40, 40, background=ICON_PATH / "reload_white.png"
|
||||
)
|
||||
await case_bk.apaste(update_count_icon, (575, 10), True)
|
||||
await case_bk.atext((625, 12), str(update_count), (255, 255, 255), font_size=45)
|
||||
|
||||
num_icon = BuildImage(30, 30, background=ICON_PATH / "num_white.png")
|
||||
await case_bk.apaste(num_icon, (455, 70), True)
|
||||
await case_bk.atext((490, 75), "在售:", (255, 255, 255))
|
||||
await case_bk.atext((535, 72), str(skin.sell_num), (144, 0, 255), font_size=30)
|
||||
|
||||
price_icon = BuildImage(30, 30, background=ICON_PATH / "want_buy_white.png")
|
||||
await case_bk.apaste(price_icon, (455, 114), True)
|
||||
want_buy_icon = BuildImage(30, 30, background=ICON_PATH / "want_buy_white.png")
|
||||
await case_bk.apaste(want_buy_icon, (455, 114), True)
|
||||
await case_bk.atext((490, 120), "求购:", (255, 255, 255))
|
||||
await case_bk.atext((535, 116), str(skin.buy_num), (144, 0, 255), font_size=30)
|
||||
|
||||
@ -81,14 +87,19 @@ async def generate_skin(skin: BuffSkin) -> Optional[BuildImage]:
|
||||
235, 250, color=(25, 25, 25, 100), font_size=25, font="CJGaoDeGuo.otf"
|
||||
)
|
||||
skin_image = BuildImage(205, 153, background=file_path)
|
||||
skin_bk.paste(skin_image, (10, 30), alpha=True)
|
||||
# skin_bk.paste(circular_red, (-20, 10), True)
|
||||
skin_bk.line((10, 180, 220, 180))
|
||||
skin_bk.text((10, 10), skin.name, (255, 255, 255))
|
||||
skin_bk.text((10, 185), f"{skin.skin_name}", (255, 255, 255), "by_width")
|
||||
skin_bk.text((10, 218), "品质:", (255, 255, 255))
|
||||
skin_bk.text((55, 218), COLOR2NAME[skin.color][:2], COLOR2COLOR[skin.color])
|
||||
skin_bk.text((100, 218), "类型:", (255, 255, 255))
|
||||
skin_bk.text((145, 218), skin.weapon_type, (255, 255, 255))
|
||||
update_count_icon = BuildImage(
|
||||
35, 35, background=ICON_PATH / "reload_white.png"
|
||||
)
|
||||
await skin_bk.apaste(skin_image, (10, 30), alpha=True)
|
||||
await skin_bk.aline((10, 180, 220, 180))
|
||||
await skin_bk.atext((10, 10), skin.name, (255, 255, 255))
|
||||
await skin_bk.apaste(update_count_icon, (140, 10), True)
|
||||
await skin_bk.atext((175, 15), str(update_count), (255, 255, 255))
|
||||
await skin_bk.atext((10, 185), f"{skin.skin_name}", (255, 255, 255), "by_width")
|
||||
await skin_bk.atext((10, 218), "品质:", (255, 255, 255))
|
||||
await skin_bk.atext(
|
||||
(55, 218), COLOR2NAME[skin.color][:2], COLOR2COLOR[skin.color]
|
||||
)
|
||||
await skin_bk.atext((100, 218), "类型:", (255, 255, 255))
|
||||
await skin_bk.atext((145, 218), skin.weapon_type, (255, 255, 255))
|
||||
return skin_bk
|
||||
return None
|
||||
|
||||
@ -49,6 +49,7 @@ class BuffSkin(Model):
|
||||
class Meta:
|
||||
table = "buff_skin"
|
||||
table_description = "Buff皮肤数据表"
|
||||
unique_together = ("case_name", "name", "skin_name", "abrasion")
|
||||
|
||||
@classmethod
|
||||
async def random_skin(
|
||||
|
||||
@ -6,6 +6,7 @@ from datetime import datetime
|
||||
from typing import List, Tuple, Union
|
||||
|
||||
import nonebot
|
||||
from tortoise.functions import Count
|
||||
|
||||
from configs.config import Config
|
||||
from configs.path_config import IMAGE_PATH
|
||||
@ -273,7 +274,14 @@ async def build_case_image(case_name: str) -> Union[BuildImage, str]:
|
||||
background = random.choice(os.listdir(CASE_BACKGROUND))
|
||||
background_img = BuildImage(0, 0, background=CASE_BACKGROUND / background)
|
||||
if case_name:
|
||||
log_list = (
|
||||
await BuffSkinLog.filter(case_name=case_name)
|
||||
.annotate(count=Count("id"))
|
||||
.group_by("skin_name")
|
||||
.values_list("skin_name", "count")
|
||||
)
|
||||
skin_list_ = await BuffSkin.filter(case_name=case_name).all()
|
||||
skin2count = {item[0]: item[1] for item in log_list}
|
||||
case = None
|
||||
skin_list: List[BuffSkin] = []
|
||||
exists_name = []
|
||||
@ -287,7 +295,7 @@ async def build_case_image(case_name: str) -> Union[BuildImage, str]:
|
||||
exists_name.append(name)
|
||||
generate_img = {}
|
||||
for skin in skin_list:
|
||||
skin_img = await generate_skin(skin)
|
||||
skin_img = await generate_skin(skin, skin2count[skin.skin_name])
|
||||
if skin_img:
|
||||
if not generate_img.get(skin.color):
|
||||
generate_img[skin.color] = []
|
||||
@ -305,7 +313,7 @@ async def build_case_image(case_name: str) -> Union[BuildImage, str]:
|
||||
)
|
||||
await A.afilter("GaussianBlur", 2)
|
||||
if case:
|
||||
case_img = await generate_skin(case)
|
||||
case_img = await generate_skin(case, skin2count[f"{case_name}武器箱"])
|
||||
if case_img:
|
||||
A.paste(case_img, (25, 25), True)
|
||||
w = 25
|
||||
@ -321,10 +329,17 @@ async def build_case_image(case_name: str) -> Union[BuildImage, str]:
|
||||
await A.acrop((0, 0, A.w, h + img_h + 100))
|
||||
return A
|
||||
else:
|
||||
log_list = (
|
||||
await BuffSkinLog.filter(color="CASE")
|
||||
.annotate(count=Count("id"))
|
||||
.group_by("case_name")
|
||||
.values_list("case_name", "count")
|
||||
)
|
||||
name2count = {item[0]: item[1] for item in log_list}
|
||||
skin_list = await BuffSkin.filter(color="CASE").all()
|
||||
image_list: List[BuildImage] = []
|
||||
for skin in skin_list:
|
||||
if img := await generate_skin(skin):
|
||||
if img := await generate_skin(skin, name2count[skin.case_name]):
|
||||
image_list.append(img)
|
||||
if not image_list:
|
||||
return "未收录武器箱"
|
||||
|
||||
@ -148,7 +148,7 @@ def _generate_card(
|
||||
ratio = 1 - (next_impression - user.impression) / (
|
||||
next_impression - previous_impression
|
||||
)
|
||||
bar.resize(w=int(bar.w * ratio), h=bar.h)
|
||||
bar.resize(w=int(bar.w * ratio) or 1, h=bar.h)
|
||||
bar_bk.paste(
|
||||
bar,
|
||||
alpha=True,
|
||||
|
||||
BIN
resources/image/_icon/reload_white.png
Normal file
BIN
resources/image/_icon/reload_white.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.1 KiB |
Loading…
Reference in New Issue
Block a user