mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-14 21:52:56 +08:00
🐛 修复群组申请通知 (#2026)
Some checks are pending
检查bot是否运行正常 / bot check (push) Waiting to run
CodeQL Code Security Analysis / Analyze (${{ matrix.language }}) (none, javascript-typescript) (push) Waiting to run
CodeQL Code Security Analysis / Analyze (${{ matrix.language }}) (none, python) (push) Waiting to run
Sequential Lint and Type Check / ruff-call (push) Waiting to run
Sequential Lint and Type Check / pyright-call (push) Blocked by required conditions
Release Drafter / Update Release Draft (push) Waiting to run
Force Sync to Aliyun / sync (push) Waiting to run
Update Version / update-version (push) Waiting to run
Some checks are pending
检查bot是否运行正常 / bot check (push) Waiting to run
CodeQL Code Security Analysis / Analyze (${{ matrix.language }}) (none, javascript-typescript) (push) Waiting to run
CodeQL Code Security Analysis / Analyze (${{ matrix.language }}) (none, python) (push) Waiting to run
Sequential Lint and Type Check / ruff-call (push) Waiting to run
Sequential Lint and Type Check / pyright-call (push) Blocked by required conditions
Release Drafter / Update Release Draft (push) Waiting to run
Force Sync to Aliyun / sync (push) Waiting to run
Update Version / update-version (push) Waiting to run
* ✨ 修复一些bug - 移除不必要的定时器类,简化代码结构 - 优化好友请求处理逻辑,确保在自动同意和手动处理之间的清晰区分 - 更新缓存机制,避免重复处理相同的好友请求 - 新增判断文件是否为二进制文件的功能,提升文件处理的准确性 - 优化缓存字典的过期检查逻辑,提高性能和可读性 * ✨ 更新 get_async_client 函数,支持字符串类型的代理参数 - 修改 proxies 参数类型,允许传入字符串形式的代理地址 - 增强代理处理逻辑,将字符串代理转换为字典格式,提升灵活性和可用性
This commit is contained in:
parent
6124e217d0
commit
f9a38a26b2
@ -1,7 +1,6 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
import random
|
import random
|
||||||
import time
|
|
||||||
|
|
||||||
from nonebot import on_message, on_request
|
from nonebot import on_message, on_request
|
||||||
from nonebot.adapters.onebot.v11 import (
|
from nonebot.adapters.onebot.v11 import (
|
||||||
@ -12,7 +11,6 @@ from nonebot.adapters.onebot.v11 import (
|
|||||||
from nonebot.adapters.onebot.v11 import Bot as v11Bot
|
from nonebot.adapters.onebot.v11 import Bot as v11Bot
|
||||||
from nonebot.adapters.onebot.v12 import Bot as v12Bot
|
from nonebot.adapters.onebot.v12 import Bot as v12Bot
|
||||||
from nonebot.plugin import PluginMetadata
|
from nonebot.plugin import PluginMetadata
|
||||||
from nonebot_plugin_apscheduler import scheduler
|
|
||||||
from nonebot_plugin_session import EventSession
|
from nonebot_plugin_session import EventSession
|
||||||
|
|
||||||
from zhenxun.configs.config import BotConfig, Config
|
from zhenxun.configs.config import BotConfig, Config
|
||||||
@ -66,19 +64,6 @@ __plugin_meta__ = PluginMetadata(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class Timer:
|
|
||||||
data: dict[str, float] = {} # noqa: RUF012
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def check(cls, uid: int | str):
|
|
||||||
return True if uid not in cls.data else time.time() - cls.data[uid] > 5 * 60
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def clear(cls):
|
|
||||||
now = time.time()
|
|
||||||
cls.data = {k: v for k, v in cls.data.items() if v - now < 5 * 60}
|
|
||||||
|
|
||||||
|
|
||||||
# TODO: 其他平台请求
|
# TODO: 其他平台请求
|
||||||
|
|
||||||
friend_req = on_request(priority=5, block=True)
|
friend_req = on_request(priority=5, block=True)
|
||||||
@ -86,68 +71,70 @@ group_req = on_request(priority=5, block=True)
|
|||||||
_t = on_message(priority=999, block=False, rule=lambda: False)
|
_t = on_message(priority=999, block=False, rule=lambda: False)
|
||||||
|
|
||||||
|
|
||||||
cache = CacheRoot.cache_dict(
|
cache = CacheRoot.cache_dict("REQUEST_CACHE", 60, str)
|
||||||
"REQUEST_CACHE", (base_config.get("TIP_MESSAGE_LIMIT") or 360) * 60, str
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@friend_req.handle()
|
@friend_req.handle()
|
||||||
async def _(bot: v12Bot | v11Bot, event: FriendRequestEvent, session: EventSession):
|
async def _(bot: v12Bot | v11Bot, event: FriendRequestEvent, session: EventSession):
|
||||||
if event.user_id and Timer.check(event.user_id):
|
logger.debug("收录好友请求...", "好友请求", target=event.user_id)
|
||||||
logger.debug("收录好友请求...", "好友请求", 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"]
|
# age = str(user["age"])
|
||||||
# age = str(user["age"])
|
comment = event.comment
|
||||||
comment = event.comment
|
if base_config.get("AUTO_ADD_FRIEND"):
|
||||||
if base_config.get("AUTO_ADD_FRIEND"):
|
logger.debug(
|
||||||
logger.debug(
|
"已开启好友请求自动同意,成功通过该请求",
|
||||||
"已开启好友请求自动同意,成功通过该请求",
|
"好友请求",
|
||||||
"好友请求",
|
target=event.user_id,
|
||||||
target=event.user_id,
|
)
|
||||||
)
|
await asyncio.sleep(random.randint(1, 10))
|
||||||
await asyncio.sleep(random.randint(1, 10))
|
await bot.set_friend_add_request(flag=event.flag, approve=True)
|
||||||
await bot.set_friend_add_request(flag=event.flag, approve=True)
|
await FriendUser.create(
|
||||||
await FriendUser.create(
|
user_id=str(user["user_id"]), user_name=user["nickname"]
|
||||||
user_id=str(user["user_id"]), user_name=user["nickname"]
|
)
|
||||||
)
|
|
||||||
else:
|
|
||||||
# 旧请求全部设置为过期
|
|
||||||
await FgRequest.filter(
|
|
||||||
request_type=RequestType.FRIEND,
|
|
||||||
user_id=str(event.user_id),
|
|
||||||
handle_type__isnull=True,
|
|
||||||
).update(handle_type=RequestHandleType.EXPIRE)
|
|
||||||
f = await FgRequest.create(
|
|
||||||
request_type=RequestType.FRIEND,
|
|
||||||
platform=session.platform,
|
|
||||||
bot_id=bot.self_id,
|
|
||||||
flag=event.flag,
|
|
||||||
user_id=event.user_id,
|
|
||||||
nickname=nickname,
|
|
||||||
comment=comment,
|
|
||||||
)
|
|
||||||
cache_key = str(event.user_id)
|
|
||||||
if not cache.get(cache_key):
|
|
||||||
cache.set(cache_key, "1")
|
|
||||||
results = await PlatformUtils.send_superuser(
|
|
||||||
bot,
|
|
||||||
f"*****一份好友申请*****\n"
|
|
||||||
f"ID: {f.id}\n"
|
|
||||||
f"昵称:{nickname}({event.user_id})\n"
|
|
||||||
f"自动同意:{'√' if base_config.get('AUTO_ADD_FRIEND') else '×'}\n"
|
|
||||||
f"日期:{datetime.now().replace(microsecond=0)}\n"
|
|
||||||
f"备注:{event.comment}",
|
|
||||||
)
|
|
||||||
if message_ids := [
|
|
||||||
str(r[1].msg_ids[0]["message_id"])
|
|
||||||
for r in results
|
|
||||||
if r[1] and r[1].msg_ids
|
|
||||||
]:
|
|
||||||
f.message_ids = ",".join(message_ids)
|
|
||||||
await f.save(update_fields=["message_ids"])
|
|
||||||
else:
|
else:
|
||||||
logger.debug("好友请求五分钟内重复, 已忽略", "好友请求", target=event.user_id)
|
# 旧请求全部设置为过期
|
||||||
|
await FgRequest.filter(
|
||||||
|
request_type=RequestType.FRIEND,
|
||||||
|
user_id=str(event.user_id),
|
||||||
|
handle_type__isnull=True,
|
||||||
|
).update(handle_type=RequestHandleType.EXPIRE)
|
||||||
|
f = await FgRequest.create(
|
||||||
|
request_type=RequestType.FRIEND,
|
||||||
|
platform=session.platform,
|
||||||
|
bot_id=bot.self_id,
|
||||||
|
flag=event.flag,
|
||||||
|
user_id=event.user_id,
|
||||||
|
nickname=nickname,
|
||||||
|
comment=comment,
|
||||||
|
)
|
||||||
|
cache_key = str(event.user_id)
|
||||||
|
if not cache.get(cache_key):
|
||||||
|
cache.set(cache_key, "1")
|
||||||
|
results = await PlatformUtils.send_superuser(
|
||||||
|
bot,
|
||||||
|
f"*****一份好友申请*****\n"
|
||||||
|
f"ID: {f.id}\n"
|
||||||
|
f"昵称:{nickname}({event.user_id})\n"
|
||||||
|
f"自动同意:{'√' if base_config.get('AUTO_ADD_FRIEND') else '×'}\n"
|
||||||
|
f"日期:{datetime.now().replace(microsecond=0)}\n"
|
||||||
|
f"备注:{event.comment}",
|
||||||
|
)
|
||||||
|
if message_ids := [
|
||||||
|
str(r[1].msg_ids[0]["message_id"])
|
||||||
|
for r in results
|
||||||
|
if r[1] and r[1].msg_ids
|
||||||
|
]:
|
||||||
|
f.message_ids = ",".join(message_ids)
|
||||||
|
await f.save(update_fields=["message_ids"])
|
||||||
|
else:
|
||||||
|
tip_limit = base_config.get("TIP_MESSAGE_LIMIT") or 360
|
||||||
|
logger.debug(
|
||||||
|
f"好友请求{tip_limit}分钟内重复, 已忽略",
|
||||||
|
"好友请求",
|
||||||
|
target=cache_key,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@group_req.handle()
|
@group_req.handle()
|
||||||
@ -227,7 +214,7 @@ async def _(bot: v12Bot | v11Bot, event: GroupRequestEvent, session: EventSessio
|
|||||||
"\n在群组中 群组管理员与群主 允许使用管理员帮助"
|
"\n在群组中 群组管理员与群主 允许使用管理员帮助"
|
||||||
"(包括ban与功能开关等)\n请在群组中发送 '管理员帮助'",
|
"(包括ban与功能开关等)\n请在群组中发送 '管理员帮助'",
|
||||||
)
|
)
|
||||||
elif cache.get(f"{event.group_id}"):
|
elif not cache.get(f"{event.group_id}"):
|
||||||
cache.set(f"{event.group_id}", "1")
|
cache.set(f"{event.group_id}", "1")
|
||||||
logger.debug(
|
logger.debug(
|
||||||
f"收录 用户[{event.user_id}] 群聊[{event.group_id}] 群聊请求",
|
f"收录 用户[{event.user_id}] 群聊[{event.group_id}] 群聊请求",
|
||||||
@ -284,15 +271,3 @@ async def _(bot: v12Bot | v11Bot, event: GroupRequestEvent, session: EventSessio
|
|||||||
"群聊请求",
|
"群聊请求",
|
||||||
target=f"{event.user_id}:{event.group_id}",
|
target=f"{event.user_id}:{event.group_id}",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@scheduler.scheduled_job(
|
|
||||||
"interval",
|
|
||||||
minutes=5,
|
|
||||||
)
|
|
||||||
async def _():
|
|
||||||
Timer.clear()
|
|
||||||
|
|
||||||
|
|
||||||
async def _():
|
|
||||||
Timer.clear()
|
|
||||||
|
|||||||
7
zhenxun/services/cache/cache_containers.py
vendored
7
zhenxun/services/cache/cache_containers.py
vendored
@ -82,12 +82,7 @@ class CacheDict(Generic[T]):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
# 检查是否过期
|
# 检查是否过期
|
||||||
data = self._data[key]
|
return bool(self.expire_time(key))
|
||||||
if data.expire_time > 0 and data.expire_time < time.time():
|
|
||||||
del self._data[key]
|
|
||||||
return False
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
def get(self, key: str, default: Any = None) -> T | None:
|
def get(self, key: str, default: Any = None) -> T | None:
|
||||||
"""获取字典项,如果不存在返回默认值
|
"""获取字典项,如果不存在返回默认值
|
||||||
|
|||||||
@ -98,7 +98,7 @@ def get_client() -> AsyncClient:
|
|||||||
|
|
||||||
|
|
||||||
def get_async_client(
|
def get_async_client(
|
||||||
proxies: dict[str, str] | None = None,
|
proxies: dict[str, str] | str | None = None,
|
||||||
proxy: str | None = None,
|
proxy: str | None = None,
|
||||||
verify: bool = False,
|
verify: bool = False,
|
||||||
**kwargs,
|
**kwargs,
|
||||||
@ -109,6 +109,8 @@ def get_async_client(
|
|||||||
"""
|
"""
|
||||||
transport = kwargs.pop("transport", None) or AsyncHTTPTransport(verify=verify)
|
transport = kwargs.pop("transport", None) or AsyncHTTPTransport(verify=verify)
|
||||||
if proxies:
|
if proxies:
|
||||||
|
if isinstance(proxies, str):
|
||||||
|
proxies = {"http://": proxies, "https://": proxies}
|
||||||
http_proxy = proxies.get("http://")
|
http_proxy = proxies.get("http://")
|
||||||
https_proxy = proxies.get("https://")
|
https_proxy = proxies.get("https://")
|
||||||
return httpx.AsyncClient(
|
return httpx.AsyncClient(
|
||||||
|
|||||||
@ -64,6 +64,25 @@ class ResourceDirManager:
|
|||||||
cls.__tree_append(path, deep)
|
cls.__tree_append(path, deep)
|
||||||
|
|
||||||
|
|
||||||
|
def is_binary_file(file_path: str) -> bool:
|
||||||
|
"""判断是否为二进制文件"""
|
||||||
|
binary_extensions = {
|
||||||
|
".jpg",
|
||||||
|
".jpeg",
|
||||||
|
".png",
|
||||||
|
".gif",
|
||||||
|
".bmp",
|
||||||
|
".ico",
|
||||||
|
".pdf",
|
||||||
|
".zip",
|
||||||
|
".rar",
|
||||||
|
".7z",
|
||||||
|
".exe",
|
||||||
|
".dll",
|
||||||
|
}
|
||||||
|
return any(file_path.lower().endswith(ext) for ext in binary_extensions)
|
||||||
|
|
||||||
|
|
||||||
def cn2py(word: str) -> str:
|
def cn2py(word: str) -> str:
|
||||||
"""将字符串转化为拼音
|
"""将字符串转化为拼音
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user