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