Compare commits

..

1 Commits

Author SHA1 Message Date
molanp
cc2a2380b9
Merge d32a6fbdd4 into 6124e217d0 2025-08-19 01:44:48 +08:00
4 changed files with 90 additions and 81 deletions

View File

@ -1,6 +1,7 @@
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 (
@ -11,6 +12,7 @@ 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
@ -64,6 +66,19 @@ __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)
@ -71,70 +86,68 @@ 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("REQUEST_CACHE", 60, str) cache = CacheRoot.cache_dict(
"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):
logger.debug("收录好友请求...", "好友请求", target=event.user_id) if event.user_id and Timer.check(event.user_id):
user = await bot.get_stranger_info(user_id=event.user_id) logger.debug("收录好友请求...", "好友请求", target=event.user_id)
nickname = user["nickname"] user = await bot.get_stranger_info(user_id=event.user_id)
# sex = user["sex"] nickname = user["nickname"]
# age = str(user["age"]) # sex = user["sex"]
comment = event.comment # age = str(user["age"])
if base_config.get("AUTO_ADD_FRIEND"): comment = event.comment
logger.debug( if base_config.get("AUTO_ADD_FRIEND"):
"已开启好友请求自动同意,成功通过该请求",
"好友请求",
target=event.user_id,
)
await asyncio.sleep(random.randint(1, 10))
await bot.set_friend_add_request(flag=event.flag, approve=True)
await FriendUser.create(
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:
tip_limit = base_config.get("TIP_MESSAGE_LIMIT") or 360
logger.debug( logger.debug(
f"好友请求{tip_limit}分钟内重复, 已忽略", "已开启好友请求自动同意,成功通过该请求",
"好友请求", "好友请求",
target=cache_key, target=event.user_id,
) )
await asyncio.sleep(random.randint(1, 10))
await bot.set_friend_add_request(flag=event.flag, approve=True)
await FriendUser.create(
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:
logger.debug("好友请求五分钟内重复, 已忽略", "好友请求", target=event.user_id)
@group_req.handle() @group_req.handle()
@ -214,7 +227,7 @@ async def _(bot: v12Bot | v11Bot, event: GroupRequestEvent, session: EventSessio
"\n在群组中 群组管理员与群主 允许使用管理员帮助" "\n在群组中 群组管理员与群主 允许使用管理员帮助"
"包括ban与功能开关等\n请在群组中发送 '管理员帮助'", "包括ban与功能开关等\n请在群组中发送 '管理员帮助'",
) )
elif not cache.get(f"{event.group_id}"): elif 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}] 群聊请求",
@ -271,3 +284,15 @@ 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()

View File

@ -82,7 +82,12 @@ class CacheDict(Generic[T]):
return False return False
# 检查是否过期 # 检查是否过期
return bool(self.expire_time(key)) data = self._data[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:
"""获取字典项,如果不存在返回默认值 """获取字典项,如果不存在返回默认值

View File

@ -98,7 +98,7 @@ def get_client() -> AsyncClient:
def get_async_client( def get_async_client(
proxies: dict[str, str] | str | None = None, proxies: dict[str, str] | None = None,
proxy: str | None = None, proxy: str | None = None,
verify: bool = False, verify: bool = False,
**kwargs, **kwargs,
@ -109,8 +109,6 @@ 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(

View File

@ -64,25 +64,6 @@ 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:
"""将字符串转化为拼音 """将字符串转化为拼音