This commit is contained in:
HibiKier
2023-03-19 21:05:34 +08:00
parent f8371e7330
commit 1046815d37
36 changed files with 704 additions and 582 deletions
+83 -84
View File
@@ -1,12 +1,12 @@
import asyncio
import os
import time
from datetime import datetime
from datetime import datetime, timedelta, timezone
from pathlib import Path
from typing import List
from typing import List, Union
import ujson as json
from nonebot.adapters.onebot.v11.message import MessageSegment
from nonebot.adapters.onebot.v11 import Bot, Message, MessageSegment
from configs.config import Config
from configs.path_config import DATA_PATH, IMAGE_PATH
@@ -17,7 +17,7 @@ from utils.http_utils import AsyncHttpx
from utils.image_utils import BuildImage
from utils.manager import group_manager, plugins2settings_manager, plugins_manager
from utils.message_builder import image
from utils.utils import get_bot, get_matchers
from utils.utils import get_matchers
custom_welcome_msg_json = (
Path() / "data" / "custom_welcome_msg" / "custom_welcome_msg.json"
@@ -67,7 +67,7 @@ async def group_current_status(group_id: int) -> str:
async def custom_group_welcome(
msg: str, img_list: List[str], user_id: int, group_id: int
) -> str:
) -> Union[str, Message]:
"""
说明:
替换群欢迎消息
@@ -80,8 +80,9 @@ async def custom_group_welcome(
img_result = ""
result = ""
img = img_list[0] if img_list else ""
if (DATA_PATH / f"custom_welcome_msg/{group_id}.jpg").exists():
(DATA_PATH / f"custom_welcome_msg/{group_id}.jpg").unlink()
msg_image = DATA_PATH / "custom_welcome_msg" / f"{group_id}.jpg"
if msg_image.exists():
msg_image.unlink()
data = {}
if not custom_welcome_msg_json.exists():
custom_welcome_msg_json.parent.mkdir(parents=True, exist_ok=True)
@@ -96,17 +97,15 @@ async def custom_group_welcome(
json.dump(
data, open(custom_welcome_msg_json, "w"), indent=4, ensure_ascii=False
)
logger.info(f"USER {user_id} GROUP {group_id} 更换群欢迎消息 {msg}")
logger.info(f"更换群欢迎消息 {msg}", "更换群欢迎信息", user_id, group_id)
result += msg
if img:
await AsyncHttpx.download_file(
img, DATA_PATH / "custom_welcome_msg" / f"{group_id}.jpg"
)
img_result = image(DATA_PATH / "custom_welcome_msg" / f"{group_id}.jpg")
logger.info(f"USER {user_id} GROUP {group_id} 更换群欢迎消息图片")
await AsyncHttpx.download_file(img, msg_image)
img_result = image(msg_image)
logger.info(f"更换群欢迎消息图片", "更换群欢迎信息", user_id, group_id)
except Exception as e:
logger.error(f"GROUP {group_id} 替换群消息失败 e:{e}")
return "替换群消息失败.."
logger.error(f"替换群消息失败", "更换群欢迎信息", user_id, group_id, e=e)
return "替换群消息失败..."
return f"替换群欢迎消息成功:\n{result}" + img_result
@@ -255,11 +254,8 @@ def _get_plugin_status() -> MessageSegment:
"""
rst = "\t功能\n"
flag_str = "状态".rjust(4) + "\n"
tmp_name = []
for matcher in get_matchers():
if matcher.plugin_name not in tmp_name:
tmp_name.append(matcher.plugin_name)
module = matcher.plugin_name
for matcher in get_matchers(True):
if module := matcher.plugin_name:
flag = plugins_manager.get_plugin_block_type(module)
flag = flag.upper() + " CLOSE" if flag else "OPEN"
try:
@@ -288,7 +284,9 @@ def _get_plugin_status() -> MessageSegment:
return image(b64=A.pic2bs4())
async def update_member_info(group_id: int, remind_superuser: bool = False) -> bool:
async def update_member_info(
bot: Bot, group_id: int, remind_superuser: bool = False
) -> bool:
"""
说明:
更新群成员信息
@@ -296,76 +294,77 @@ async def update_member_info(group_id: int, remind_superuser: bool = False) -> b
:param group_id: 群号
:param remind_superuser: 失败信息提醒超级用户
"""
bot = get_bot()
_group_user_list = await bot.get_group_member_list(group_id=group_id)
_error_member_list = []
_exist_member_list = []
# try:
for user_info in _group_user_list:
nickname = user_info["card"] or user_info["nickname"]
# 更新权限
if user_info["role"] in [
"owner",
"admin",
] and not await LevelUser.is_group_flag(user_info["user_id"], group_id):
await LevelUser.set_level(
user_info["user_id"],
user_info["group_id"],
Config.get_config("admin_bot_manage", "ADMIN_DEFAULT_AUTH"),
)
if str(user_info["user_id"]) in bot.config.superusers:
await LevelUser.set_level(user_info["user_id"], user_info["group_id"], 9)
user = await GroupInfoUser.get_or_none(
user_qq=user_info["user_id"], group_id=user_info["group_id"]
)
if user:
if user.user_name != nickname:
user.user_name = nickname
await user.save(update_fields=["user_name"])
logger.info(
f"用户{user_info['user_id']} 所属{user_info['group_id']} 更新群昵称成功"
admin_default_auth = Config.get_config("admin_bot_manage", "ADMIN_DEFAULT_AUTH")
if admin_default_auth is not None:
for user_info in _group_user_list:
nickname = user_info["card"] or user_info["nickname"]
# 更新权限
if user_info["role"] in [
"owner",
"admin",
] and not await LevelUser.is_group_flag(user_info["user_id"], group_id):
await LevelUser.set_level(
user_info["user_id"],
user_info["group_id"],
admin_default_auth,
)
if str(user_info["user_id"]) in bot.config.superusers:
await LevelUser.set_level(
user_info["user_id"], user_info["group_id"], 9
)
user = await GroupInfoUser.get_or_none(
user_qq=user_info["user_id"], group_id=user_info["group_id"]
)
if user:
if user.user_name != nickname:
user.user_name = nickname
await user.save(update_fields=["user_name"])
logger.debug(
f"更新群昵称成功",
"更新群组成员信息",
user_info["user_id"],
user_info["group_id"],
)
_exist_member_list.append(int(user_info["user_id"]))
continue
join_time = datetime.strptime(
time.strftime(
"%Y-%m-%d %H:%M:%S", time.localtime(user_info["join_time"])
),
"%Y-%m-%d %H:%M:%S",
)
await GroupInfoUser.update_or_create(
user_qq=user_info["user_id"],
group_id=user_info["group_id"],
defaults={
"user_name": nickname,
"user_join_time": join_time.replace(
tzinfo=timezone(timedelta(hours=8))
),
},
)
_exist_member_list.append(int(user_info["user_id"]))
continue
join_time = datetime.strptime(
time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(user_info["join_time"])),
"%Y-%m-%d %H:%M:%S",
)
user, _ = await GroupInfoUser.get_or_create(
user_qq=user_info["user_id"],
group_id=user_info["group_id"],
defaults={
"user_name": nickname,
},
)
# await GroupInfoUser.update_or_create(
# user_qq=user_info["user_id"],
# group_id=user_info["group_id"],
# defaults={
# "user_name": nickname,
# # "user_join_time": datetime.now().replace(tzinfo=None),
# },
# )
user.user_join_time = join_time
await user.save()
_exist_member_list.append(int(user_info["user_id"]))
logger.info("更新成功", "更新成员信息", user_info["user_id"], user_info["group_id"])
_del_member_list = list(
set(_exist_member_list).difference(
set(await GroupInfoUser.get_group_member_id_list(group_id))
)
)
if _del_member_list:
for del_user in _del_member_list:
await GroupInfoUser.filter(user_qq=del_user, group_id=group_id).delete()
logger.info(f"退群用户{del_user} 所属{group_id} 已删除")
if _error_member_list and remind_superuser:
result = ""
for error_user in _error_member_list:
result += error_user
await bot.send_private_msg(
user_id=int(list(bot.config.superusers)[0]), message=result[:-1]
logger.debug("更新成功", "更新成员信息", user_info["user_id"], user_info["group_id"])
_del_member_list = list(
set(_exist_member_list).difference(
set(await GroupInfoUser.get_group_member_id_list(group_id))
)
)
if _del_member_list:
for del_user in _del_member_list:
await GroupInfoUser.filter(user_qq=del_user, group_id=group_id).delete()
logger.info(f"删除已退群用户", "更新群组成员信息", del_user, group_id)
if _error_member_list and remind_superuser:
result = ""
for error_user in _error_member_list:
result += error_user
await bot.send_private_msg(
user_id=int(list(bot.config.superusers)[0]), message=result[:-1]
)
return True
+14 -9
View File
@@ -23,15 +23,20 @@ async def _(event: GroupAdminNoticeEvent):
else:
nickname = event.user_id
if event.sub_type == "set":
await LevelUser.set_level(
event.user_id,
event.group_id,
Config.get_config("admin_bot_manage", "ADMIN_DEFAULT_AUTH"),
)
logger.info(
f"为新晋管理员 {nickname}({event.user_id}) "
f"添加权限等级:{Config.get_config('admin_bot_manage', 'ADMIN_DEFAULT_AUTH')}"
)
admin_default_auth = Config.get_config("admin_bot_manage", "ADMIN_DEFAULT_AUTH")
if admin_default_auth is not None:
await LevelUser.set_level(
event.user_id,
event.group_id,
admin_default_auth,
)
logger.info(
f"为新晋管理员 {nickname}({event.user_id}) " f"添加权限等级:{admin_default_auth}"
)
else:
logger.warning(
f"配置项 MODULE: [<u><y>admin_bot_manage</y></u>] | KEY: [<u><y>ADMIN_DEFAULT_AUTH</y></u>] 为空"
)
elif event.sub_type == "unset":
await LevelUser.delete_level(event.user_id, event.group_id)
logger.info(f"将非管理员 {nickname}({event.user_id}) 取消权限等级")
@@ -1,12 +1,13 @@
from typing import List
from configs.config import Config
from nonebot import on_command
from nonebot.adapters.onebot.v11 import GroupMessageEvent, Message
from nonebot.adapters.onebot.v11.permission import GROUP
from nonebot.params import CommandArg
from configs.config import Config
from services.log import logger
from utils.depends import ImageList
from utils.depends import ImageList, OneCommand
from ._data_source import custom_group_welcome
@@ -40,7 +41,10 @@ custom_welcome = on_command(
@custom_welcome.handle()
async def _(
event: GroupMessageEvent, arg: Message = CommandArg(), img: List[str] = ImageList()
event: GroupMessageEvent,
cmd: str = OneCommand(),
arg: Message = CommandArg(),
img: List[str] = ImageList(),
):
msg = arg.extract_plain_text().strip()
if not msg and not img:
@@ -52,5 +56,7 @@ async def _(
)
logger.info(f"USER {event.user_id} GROUP {event.group_id} 自定义群欢迎消息:{msg}")
except Exception as e:
logger.error(f"自定义进群欢迎消息发生错误 {type(e)}:{e}")
logger.error(
f"自定义进群欢迎消息发生错误", cmd, event.user_id, getattr(event, "group_id", None), e=e
)
await custom_welcome.send("发生了一些未知错误...")
+5 -3
View File
@@ -1,8 +1,10 @@
import time
from nonebot.adapters.onebot.v11 import Event
from services.log import logger
from utils.manager import group_manager, plugins2settings_manager
from utils.utils import get_message_text
from services.log import logger
import time
cmd = []
@@ -49,5 +51,5 @@ def switch_rule(event: Event) -> bool:
msg = msg[0] if msg else ""
return msg in cmd
except Exception as e:
logger.error(f"检测是否为功能开关命令发生错误 {type(e)}: {e}")
logger.error(f"检测是否为功能开关命令发生错误", e=e)
return False
+36 -21
View File
@@ -1,23 +1,32 @@
from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, MessageEvent, GROUP, PrivateMessageEvent
from nonebot import on_command, on_message, on_regex
from nonebot.params import RegexGroup
from typing import Any, Tuple
from nonebot import on_command, on_message, on_regex
from nonebot.adapters.onebot.v11 import (
GROUP,
Bot,
GroupMessageEvent,
Message,
MessageEvent,
PrivateMessageEvent,
)
from nonebot.params import RegexGroup
from nonebot.permission import SUPERUSER
from configs.config import NICKNAME, Config
from services.log import logger
from utils.message_builder import image
from utils.utils import get_message_text, is_number
from ._data_source import (
change_global_task_status,
change_group_switch,
set_plugin_status,
get_plugin_status,
group_current_status,
set_group_bot_status, change_global_task_status
set_group_bot_status,
set_plugin_status,
)
from services.log import logger
from configs.config import NICKNAME, Config
from utils.utils import get_message_text, is_number
from nonebot.permission import SUPERUSER
from typing import Tuple, Any
from .rule import switch_rule
__zx_plugin_name__ = "群功能开关 [Admin]"
__plugin_usage__ = """
@@ -55,7 +64,7 @@ __plugin_version__ = 0.1
__plugin_author__ = "HibiKier"
__plugin_settings__ = {
"admin_level": Config.get_config("admin_bot_manage", "CHANGE_GROUP_SWITCH_LEVEL"),
"cmd": ["开启功能", "关闭功能", "开关"]
"cmd": ["开启功能", "关闭功能", "开关"],
}
switch_rule_matcher = on_message(rule=switch_rule, priority=4, block=True)
@@ -68,21 +77,27 @@ group_status = on_regex("^(休息吧|醒来)$", permission=GROUP, priority=5, bl
@switch_rule_matcher.handle()
async def _(bot: Bot, event: MessageEvent):
_cmd = get_message_text(event.json()).split()[0]
async def _(
bot: Bot,
event: MessageEvent,
):
msg = get_message_text(event.message).strip()
msg_split = msg.split()
_cmd = msg_split[0]
if isinstance(event, GroupMessageEvent):
await switch_rule_matcher.send(await change_group_switch(_cmd, event.group_id))
logger.info(f"USER {event.user_id} GROUP {event.group_id} 使用群功能管理命令 {_cmd}")
logger.info(f"使用群功能管理命令 {_cmd}", "功能管理", event.user_id, event.group_id)
else:
if str(event.user_id) in bot.config.superusers:
block_type = " ".join(get_message_text(event.json()).split()[1:])
block_type = " ".join(msg_split[1:])
block_type = block_type if block_type else "a"
if ("关闭被动" in _cmd or "开启被动" in _cmd) and isinstance(event, PrivateMessageEvent):
if ("关闭被动" in _cmd or "开启被动" in _cmd) and isinstance(
event, PrivateMessageEvent
):
await switch_rule_matcher.send(change_global_task_status(_cmd))
elif is_number(block_type):
if not int(block_type) in [
g["group_id"]
for g in await bot.get_group_list()
g["group_id"] for g in await bot.get_group_list()
]:
await switch_rule_matcher.finish(f"{NICKNAME}未加入群聊:{block_type}")
await change_group_switch(_cmd, int(block_type), True)
@@ -105,7 +120,7 @@ async def _(bot: Bot, event: MessageEvent):
await switch_rule_matcher.send(f"已在群聊中{_cmd[:2]}功能:{_cmd[2:]}")
else:
await switch_rule_matcher.finish("格式错误:关闭[功能] [group]/[p/g]")
logger.info(f"USER {event.user_id} 使用功能管理命令 {_cmd} | {block_type}")
logger.info(f"使用功能管理命令 {_cmd} | {block_type}", f"{_cmd}", event.user_id)
@plugins_status.handle()
@@ -126,4 +141,4 @@ async def _(event: GroupMessageEvent, reg_group: Tuple[Any, ...] = RegexGroup())
else:
msg = set_group_bot_status(event.group_id, True)
await group_status.send(msg)
logger.info(f"USER {event.user_id} GROUP {event.group_id} 使用总开关命令:{cmd}")
logger.info(f"使用总开关命令: {cmd}", cmd, event.user_id, event.group_id)
+21 -25
View File
@@ -1,8 +1,7 @@
from asyncpg.exceptions import ConnectionDoesNotExistError, UndefinedColumnError
from nonebot import get_bots
from models.group_info import GroupInfo
from services.log import logger
from utils.utils import get_bot, scheduler
from utils.utils import scheduler
from ._data_source import update_member_info
@@ -13,6 +12,23 @@ __plugin_version__ = 0.1
__plugin_author__ = "HibiKier"
async def update():
bot_list = get_bots()
if bot_list:
used_group = []
for key in bot_list:
bot = bot_list[key]
gl = await bot.get_group_list()
gl = [g["group_id"] for g in gl if g["group_id"] not in used_group]
for g in gl:
used_group.append(g)
try:
await update_member_info(bot, g) # type: ignore
logger.debug(f"更新群组成员信息成功", "自动更新群组成员信息", group_id=g)
except Exception as e:
logger.error(f"更新群组成员信息错误", "自动更新群组成员信息", group_id=g, e=e)
# 自动更新群员信息
@scheduler.scheduled_job(
"cron",
@@ -20,16 +36,7 @@ __plugin_author__ = "HibiKier"
minute=1,
)
async def _():
bot = get_bot()
if bot:
gl = await bot.get_group_list()
gl = [g["group_id"] for g in gl]
for g in gl:
try:
await update_member_info(g)
logger.info(f"更新群组 g:{g} 成功")
except Exception as e:
logger.error(f"更新群组错误 g:{g} e:{e}")
await update()
# 快速更新群员信息以及管理员权限
@@ -38,15 +45,4 @@ async def _():
minutes=5,
)
async def _():
try:
bot = get_bot()
if bot:
gl = await bot.get_group_list()
gl = [g["group_id"] for g in gl]
all_group = [x.group_id for x in await GroupInfo.all()]
for g in gl:
if g not in all_group:
await update_member_info(g, False)
logger.info(f"快速更新群信息以及权限:{g}")
except (IndexError, ConnectionDoesNotExistError, UndefinedColumnError):
pass
await update()
@@ -1,7 +1,12 @@
from nonebot import on_command, on_notice
from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, GROUP, GroupIncreaseNoticeEvent
from ._data_source import update_member_info
from nonebot.adapters.onebot.v11 import (
GROUP,
Bot,
GroupIncreaseNoticeEvent,
GroupMessageEvent,
)
from ._data_source import update_member_info
__zx_plugin_name__ = "更新群组成员列表 [Admin]"
__plugin_usage__ = """
@@ -10,10 +15,10 @@ usage:
指令:
更新群组成员列表/更新群组成员信息
""".strip()
__plugin_des__ = '更新群组成员列表'
__plugin_cmd__ = ['更新群组成员列表']
__plugin_des__ = "更新群组成员列表"
__plugin_cmd__ = ["更新群组成员列表"]
__plugin_version__ = 0.1
__plugin_author__ = 'HibiKier'
__plugin_author__ = "HibiKier"
__plugin_settings__ = {
"admin_level": 1,
}
@@ -25,8 +30,8 @@ refresh_member_group = on_command(
@refresh_member_group.handle()
async def _(event: GroupMessageEvent):
if await update_member_info(event.group_id):
async def _(bot: Bot, event: GroupMessageEvent):
if await update_member_info(bot, event.group_id):
await refresh_member_group.finish("更新群员信息成功!", at_sender=True)
else:
await refresh_member_group.finish("更新群员信息失败!", at_sender=True)
@@ -38,4 +43,4 @@ group_increase_handle = on_notice(priority=1, block=False)
@group_increase_handle.handle()
async def _(bot: Bot, event: GroupIncreaseNoticeEvent):
if event.user_id == int(bot.self_id):
await update_member_info(event.group_id)
await update_member_info(bot, event.group_id)