mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-06 04:10:02 +08:00
🎨 修复bug,移除plugins文件夹
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
from zhenxun.models.task_info import TaskInfo
|
||||
from zhenxun.models.ban_console import BanConsole
|
||||
from zhenxun.models.group_console import GroupConsole
|
||||
|
||||
|
||||
class CommonUtils:
|
||||
|
||||
@classmethod
|
||||
async def is_block(cls, module: str, group_id: str | None) -> bool:
|
||||
"""判断被动技能是否可以发送
|
||||
|
||||
参数:
|
||||
module: 被动技能模块名
|
||||
group_id: 群组id
|
||||
|
||||
返回:
|
||||
bool: 是否可以发送
|
||||
"""
|
||||
if task := await TaskInfo.get_or_none(module=module):
|
||||
"""被动全局状态"""
|
||||
if not task.status:
|
||||
return True
|
||||
if group_id:
|
||||
if await GroupConsole.is_block_task(group_id, module):
|
||||
"""群组是否禁用被动"""
|
||||
return True
|
||||
if g := await GroupConsole.get_or_none(
|
||||
group_id=group_id, channel_id__isnull=True
|
||||
):
|
||||
"""群组权限是否小于0"""
|
||||
if g.level < 0:
|
||||
return True
|
||||
if await BanConsole.is_ban(None, group_id):
|
||||
"""群组是否被ban"""
|
||||
return True
|
||||
return False
|
||||
@@ -1,8 +1,8 @@
|
||||
from typing import Any, Callable, Dict
|
||||
from collections.abc import Callable
|
||||
|
||||
from nonebot.adapters.onebot.v11 import Message, MessageSegment
|
||||
from nonebot.plugin import require
|
||||
from pydantic import BaseModel
|
||||
from nonebot.plugin import require
|
||||
from nonebot.adapters.onebot.v11 import Message, MessageSegment
|
||||
|
||||
from zhenxun.models.goods_info import GoodsInfo
|
||||
|
||||
@@ -19,7 +19,7 @@ class Goods(BaseModel):
|
||||
icon: str | None = None
|
||||
is_passive: bool
|
||||
func: Callable
|
||||
kwargs: Dict[str, str] = {}
|
||||
kwargs: dict[str, str] = {}
|
||||
send_success_msg: bool
|
||||
max_num_limit: int
|
||||
|
||||
@@ -27,8 +27,8 @@ class Goods(BaseModel):
|
||||
class ShopRegister(dict):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(ShopRegister, self).__init__(*args, **kwargs)
|
||||
self._data: Dict[str, Goods] = {}
|
||||
super().__init__(*args, **kwargs)
|
||||
self._data: dict[str, Goods] = {}
|
||||
self._flag = True
|
||||
|
||||
def before_handle(self, name: str | tuple[str, ...], load_status: bool = True):
|
||||
@@ -42,7 +42,7 @@ class ShopRegister(dict):
|
||||
def register_before_handle(name_list: tuple[str, ...], func: Callable):
|
||||
if load_status:
|
||||
for name_ in name_list:
|
||||
if goods := self._data.get(name_):
|
||||
if self._data.get(name_):
|
||||
self._data[name_].before_handle.append(func)
|
||||
|
||||
_name = (name,) if isinstance(name, str) else name
|
||||
@@ -59,7 +59,7 @@ class ShopRegister(dict):
|
||||
def register_after_handle(name_list: tuple[str, ...], func: Callable):
|
||||
if load_status:
|
||||
for name_ in name_list:
|
||||
if goods := self._data.get(name_):
|
||||
if self._data.get(name_):
|
||||
self._data[name_].after_handle.append(func)
|
||||
|
||||
_name = (name,) if isinstance(name, str) else name
|
||||
@@ -99,7 +99,7 @@ class ShopRegister(dict):
|
||||
def add_register_item(func: Callable):
|
||||
if name in self._data.keys():
|
||||
raise ValueError("该商品已注册,请替换其他名称!")
|
||||
for n, p, d, dd, l, s, dl, pa, i, ssm, mnl in zip(
|
||||
for n, p, d, dd, lmt, s, dl, pa, i, ssm, mnl in zip(
|
||||
name,
|
||||
price,
|
||||
des,
|
||||
@@ -123,7 +123,7 @@ class ShopRegister(dict):
|
||||
price=p,
|
||||
des=d,
|
||||
discount=dd,
|
||||
limit_time=l,
|
||||
limit_time=lmt,
|
||||
daily_limit=dl,
|
||||
is_passive=pa,
|
||||
func=func,
|
||||
@@ -133,7 +133,7 @@ class ShopRegister(dict):
|
||||
goods.price = p
|
||||
goods.des = d
|
||||
goods.discount = dd
|
||||
goods.limit_time = l
|
||||
goods.limit_time = lmt
|
||||
goods.daily_limit = dl
|
||||
goods.icon = i
|
||||
goods.is_passive = pa
|
||||
@@ -216,7 +216,8 @@ class ShopRegister(dict):
|
||||
_current_len = len(x)
|
||||
if _current_len != len(x):
|
||||
raise ValueError(
|
||||
f"注册商品 {name} 中 name,price,des,discount,limit_time,load_status,daily_limit 数量不符!"
|
||||
f"注册商品 {name} 中 name,price,des,discount,limit_time,"
|
||||
"load_status,daily_limit 数量不符!"
|
||||
)
|
||||
_current_len = _current_len if _current_len > -1 else 1
|
||||
_name = self.__get(name, _current_len)
|
||||
@@ -249,7 +250,7 @@ class ShopRegister(dict):
|
||||
return (
|
||||
value
|
||||
if isinstance(value, tuple)
|
||||
else tuple([value for _ in range(_current_len)])
|
||||
else tuple(value for _ in range(_current_len))
|
||||
)
|
||||
|
||||
def __setitem__(self, key, value):
|
||||
|
||||
+87
-114
@@ -1,23 +1,25 @@
|
||||
import random
|
||||
from typing import Awaitable, Callable, Literal, Set
|
||||
from typing import Literal
|
||||
from collections.abc import Callable, Awaitable
|
||||
|
||||
import httpx
|
||||
import nonebot
|
||||
from pydantic import BaseModel
|
||||
from nonebot.adapters import Bot
|
||||
from nonebot.adapters.discord import Bot as DiscordBot
|
||||
from nonebot.utils import is_coroutine_callable
|
||||
from nonebot.adapters.dodo import Bot as DodoBot
|
||||
from nonebot.adapters.kaiheila import Bot as KaiheilaBot
|
||||
from nonebot.adapters.onebot.v11 import Bot as v11Bot
|
||||
from nonebot.adapters.onebot.v12 import Bot as v12Bot
|
||||
from nonebot.utils import is_coroutine_callable
|
||||
from nonebot_plugin_alconna.uniseg import Receipt, Target, UniMessage
|
||||
from pydantic import BaseModel
|
||||
from nonebot.adapters.discord import Bot as DiscordBot
|
||||
from nonebot.adapters.kaiheila import Bot as KaiheilaBot
|
||||
from nonebot_plugin_alconna.uniseg import Target, Receipt, UniMessage
|
||||
|
||||
from zhenxun.models.friend_user import FriendUser
|
||||
from zhenxun.models.group_console import GroupConsole
|
||||
from zhenxun.services.log import logger
|
||||
from zhenxun.utils.exception import NotFindSuperuser
|
||||
from zhenxun.configs.config import BotConfig
|
||||
from zhenxun.utils.message import MessageUtils
|
||||
from zhenxun.models.friend_user import FriendUser
|
||||
from zhenxun.utils.exception import NotFindSuperuser
|
||||
from zhenxun.models.group_console import GroupConsole
|
||||
|
||||
|
||||
class UserData(BaseModel):
|
||||
@@ -78,11 +80,11 @@ class PlatformUtils:
|
||||
Receipt | None: Receipt
|
||||
"""
|
||||
if not superuser_id:
|
||||
platform = cls.get_platform(bot)
|
||||
platform_superusers = bot.config.PLATFORM_SUPERUSERS.get(platform) or []
|
||||
if not platform_superusers:
|
||||
raise NotFindSuperuser()
|
||||
superuser_id = random.choice(platform_superusers)
|
||||
if platform := cls.get_platform(bot):
|
||||
if platform_superusers := BotConfig.get_superuser(platform):
|
||||
superuser_id = random.choice(platform_superusers)
|
||||
else:
|
||||
raise NotFindSuperuser()
|
||||
if isinstance(message, str):
|
||||
message = MessageUtils.build_message(message)
|
||||
return await cls.send_message(bot, superuser_id, None, message)
|
||||
@@ -128,25 +130,23 @@ class PlatformUtils:
|
||||
):
|
||||
max_id = result_data.max_id
|
||||
result_list = result_data.list
|
||||
data_list = []
|
||||
while max_id == 100:
|
||||
result_data = await bot.get_member_list(
|
||||
island_source_id=group_id, page_size=100, max_id=0
|
||||
)
|
||||
result_list += result_data.list
|
||||
max_id = result_data.max_id
|
||||
for user in result_list:
|
||||
data_list.append(
|
||||
UserData(
|
||||
name=user.nick_name,
|
||||
card=user.personal_nick_name,
|
||||
avatar_url=user.avatar_url,
|
||||
user_id=user.dodo_source_id,
|
||||
group_id=user.island_source_id,
|
||||
join_time=int(user.join_time.timestamp()),
|
||||
)
|
||||
return [
|
||||
UserData(
|
||||
name=user.nick_name,
|
||||
card=user.personal_nick_name,
|
||||
avatar_url=user.avatar_url,
|
||||
user_id=user.dodo_source_id,
|
||||
group_id=user.island_source_id,
|
||||
join_time=int(user.join_time.timestamp()),
|
||||
)
|
||||
return data_list
|
||||
for user in result_list
|
||||
]
|
||||
if isinstance(bot, KaiheilaBot):
|
||||
if result_data := await bot.guild_userList(guild_id=group_id):
|
||||
if result_data.users:
|
||||
@@ -165,9 +165,6 @@ class PlatformUtils:
|
||||
)
|
||||
)
|
||||
return data_list
|
||||
if isinstance(bot, DiscordBot):
|
||||
# TODO: discord获取用户
|
||||
pass
|
||||
return []
|
||||
|
||||
@classmethod
|
||||
@@ -197,15 +194,14 @@ class PlatformUtils:
|
||||
role=user["role"],
|
||||
join_time=user["join_time"],
|
||||
)
|
||||
else:
|
||||
if friend_list := await bot.get_friend_list():
|
||||
for f in friend_list:
|
||||
if f["user_id"] == int(user_id):
|
||||
return UserData(
|
||||
name=f["nickname"],
|
||||
card=f["remark"],
|
||||
user_id=f["user_id"],
|
||||
)
|
||||
elif friend_list := await bot.get_friend_list():
|
||||
for f in friend_list:
|
||||
if f["user_id"] == int(user_id):
|
||||
return UserData(
|
||||
name=f["nickname"],
|
||||
card=f["remark"],
|
||||
user_id=f["user_id"],
|
||||
)
|
||||
if isinstance(bot, v12Bot):
|
||||
if group_id:
|
||||
if user := await bot.get_group_member_info(
|
||||
@@ -217,50 +213,36 @@ class PlatformUtils:
|
||||
user_id=user["user_id"],
|
||||
group_id=group_id,
|
||||
)
|
||||
else:
|
||||
if friend_list := await bot.get_friend_list():
|
||||
for f in friend_list:
|
||||
if f["user_id"] == int(user_id):
|
||||
return UserData(
|
||||
name=f["user_name"],
|
||||
card=f["user_remark"],
|
||||
user_id=f["user_id"],
|
||||
)
|
||||
if isinstance(bot, DodoBot):
|
||||
if group_id:
|
||||
if user := await bot.get_member_info(
|
||||
island_source_id=group_id, dodo_source_id=user_id
|
||||
):
|
||||
return UserData(
|
||||
name=user.nick_name,
|
||||
card=user.personal_nick_name,
|
||||
avatar_url=user.avatar_url,
|
||||
user_id=user.dodo_source_id,
|
||||
group_id=user.island_source_id,
|
||||
join_time=int(user.join_time.timestamp()),
|
||||
)
|
||||
else:
|
||||
# TODO: DoDo个人数据
|
||||
pass
|
||||
if isinstance(bot, KaiheilaBot):
|
||||
if group_id:
|
||||
if user := await bot.user_view(guild_id=group_id, user_id=user_id):
|
||||
second = None
|
||||
if user.joined_at:
|
||||
second = int(user.joined_at / 1000)
|
||||
return UserData(
|
||||
name=user.nickname or "",
|
||||
avatar_url=user.avatar,
|
||||
user_id=user_id,
|
||||
group_id=group_id,
|
||||
join_time=second,
|
||||
)
|
||||
else:
|
||||
# TODO: kaiheila用户详情
|
||||
pass
|
||||
if isinstance(bot, DiscordBot):
|
||||
# TODO: discord获取用户
|
||||
pass
|
||||
elif friend_list := await bot.get_friend_list():
|
||||
for f in friend_list:
|
||||
if f["user_id"] == int(user_id):
|
||||
return UserData(
|
||||
name=f["user_name"],
|
||||
card=f["user_remark"],
|
||||
user_id=f["user_id"],
|
||||
)
|
||||
if isinstance(bot, DodoBot) and group_id:
|
||||
if user := await bot.get_member_info(
|
||||
island_source_id=group_id, dodo_source_id=user_id
|
||||
):
|
||||
return UserData(
|
||||
name=user.nick_name,
|
||||
card=user.personal_nick_name,
|
||||
avatar_url=user.avatar_url,
|
||||
user_id=user.dodo_source_id,
|
||||
group_id=user.island_source_id,
|
||||
join_time=int(user.join_time.timestamp()),
|
||||
)
|
||||
if isinstance(bot, KaiheilaBot) and group_id:
|
||||
if user := await bot.user_view(guild_id=group_id, user_id=user_id):
|
||||
second = int(user.joined_at / 1000) if user.joined_at else None
|
||||
return UserData(
|
||||
name=user.nickname or "",
|
||||
avatar_url=user.avatar,
|
||||
user_id=user_id,
|
||||
group_id=group_id,
|
||||
join_time=second,
|
||||
)
|
||||
return None
|
||||
|
||||
@classmethod
|
||||
@@ -277,15 +259,13 @@ class PlatformUtils:
|
||||
for _ in range(3):
|
||||
try:
|
||||
return (await client.get(url)).content
|
||||
except Exception as e:
|
||||
except Exception:
|
||||
logger.error(
|
||||
"获取用户头像错误",
|
||||
"Util",
|
||||
target=user_id,
|
||||
platform=platform,
|
||||
)
|
||||
else:
|
||||
pass
|
||||
return None
|
||||
|
||||
@classmethod
|
||||
@@ -302,12 +282,10 @@ class PlatformUtils:
|
||||
for _ in range(3):
|
||||
try:
|
||||
return (await client.get(url)).content
|
||||
except Exception as e:
|
||||
except Exception:
|
||||
logger.error(
|
||||
"获取群头像错误", "Util", target=gid, platform=platform
|
||||
)
|
||||
else:
|
||||
pass
|
||||
return None
|
||||
|
||||
@classmethod
|
||||
@@ -364,12 +342,12 @@ class PlatformUtils:
|
||||
target=f"{group.group_id}:{group.channel_id}",
|
||||
)
|
||||
else:
|
||||
_group = [
|
||||
_group = next(
|
||||
g
|
||||
for g in db_group
|
||||
if g.group_id == group.group_id
|
||||
and g.channel_id == group.channel_id
|
||||
][0]
|
||||
)
|
||||
_group.group_name = group.group_name
|
||||
_group.max_member_count = group.max_member_count
|
||||
_group.member_count = group.member_count
|
||||
@@ -392,15 +370,13 @@ class PlatformUtils:
|
||||
返回:
|
||||
str | None: 平台
|
||||
"""
|
||||
if isinstance(bot, (v11Bot, v12Bot)):
|
||||
if isinstance(bot, v11Bot | v12Bot):
|
||||
return "qq"
|
||||
# if isinstance(bot, DodoBot):
|
||||
# return "dodo"
|
||||
# if isinstance(bot, KaiheilaBot):
|
||||
# return "kaiheila"
|
||||
# if isinstance(bot, DiscordBot):
|
||||
# return "discord"
|
||||
return None
|
||||
if isinstance(bot, DodoBot):
|
||||
return "dodo"
|
||||
if isinstance(bot, KaiheilaBot):
|
||||
return "kaiheila"
|
||||
return "discord" if isinstance(bot, DiscordBot) else None
|
||||
|
||||
@classmethod
|
||||
async def get_group_list(cls, bot: Bot) -> tuple[list[GroupConsole], str]:
|
||||
@@ -466,9 +442,6 @@ class PlatformUtils:
|
||||
if c.type != 0
|
||||
]
|
||||
return group_list, "kaiheila"
|
||||
if isinstance(bot, DiscordBot):
|
||||
# TODO: discord群组列表
|
||||
pass
|
||||
return [], ""
|
||||
|
||||
@classmethod
|
||||
@@ -518,15 +491,15 @@ class PlatformUtils:
|
||||
)
|
||||
for f in friend_list
|
||||
], "qq"
|
||||
if isinstance(bot, DodoBot):
|
||||
# TODO: dodo好友列表
|
||||
pass
|
||||
if isinstance(bot, KaiheilaBot):
|
||||
# TODO: kaiheila好友列表
|
||||
pass
|
||||
if isinstance(bot, DiscordBot):
|
||||
# TODO: discord好友列表
|
||||
pass
|
||||
# if isinstance(bot, DodoBot):
|
||||
# # TODO: dodo好友列表
|
||||
# pass
|
||||
# if isinstance(bot, KaiheilaBot):
|
||||
# # TODO: kaiheila好友列表
|
||||
# pass
|
||||
# if isinstance(bot, DiscordBot):
|
||||
# # TODO: discord好友列表
|
||||
# pass
|
||||
return [], ""
|
||||
|
||||
@classmethod
|
||||
@@ -549,12 +522,12 @@ class PlatformUtils:
|
||||
target: 对应平台Target
|
||||
"""
|
||||
target = None
|
||||
if isinstance(bot, (v11Bot, v12Bot)):
|
||||
if isinstance(bot, v11Bot | v12Bot):
|
||||
if group_id:
|
||||
target = Target(group_id)
|
||||
elif user_id:
|
||||
target = Target(user_id, private=True)
|
||||
elif isinstance(bot, (DodoBot, KaiheilaBot)):
|
||||
elif isinstance(bot, DodoBot | KaiheilaBot):
|
||||
if group_id and channel_id:
|
||||
target = Target(channel_id, parent_id=group_id, channel=True)
|
||||
elif user_id:
|
||||
@@ -565,8 +538,8 @@ class PlatformUtils:
|
||||
async def broadcast_group(
|
||||
message: str | UniMessage,
|
||||
bot: Bot | list[Bot] | None = None,
|
||||
bot_id: str | Set[str] | None = None,
|
||||
ignore_group: Set[int] | None = None,
|
||||
bot_id: str | set[str] | None = None,
|
||||
ignore_group: set[int] | None = None,
|
||||
check_func: Callable[[str], Awaitable] | None = None,
|
||||
log_cmd: str | None = None,
|
||||
platform: Literal["qq", "dodo", "kaiheila"] | None = None,
|
||||
|
||||
+10
-13
@@ -1,16 +1,16 @@
|
||||
import os
|
||||
import time
|
||||
from collections import defaultdict
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
from pathlib import Path
|
||||
from datetime import datetime
|
||||
from collections import defaultdict
|
||||
|
||||
import pytz
|
||||
import httpx
|
||||
import pypinyin
|
||||
import pytz
|
||||
|
||||
from zhenxun.configs.config import Config
|
||||
from zhenxun.services.log import logger
|
||||
from zhenxun.configs.config import Config
|
||||
|
||||
|
||||
class ResourceDirManager:
|
||||
@@ -18,7 +18,7 @@ class ResourceDirManager:
|
||||
临时文件管理器
|
||||
"""
|
||||
|
||||
temp_path = []
|
||||
temp_path = [] # noqa: RUF012
|
||||
|
||||
@classmethod
|
||||
def __tree_append(cls, path: Path):
|
||||
@@ -69,7 +69,7 @@ class CountLimiter:
|
||||
if day != self.today:
|
||||
self.today = day
|
||||
self.count.clear()
|
||||
return bool(self.count[key] < self.max)
|
||||
return self.count[key] < self.max
|
||||
|
||||
def get_num(self, key):
|
||||
return self.count[key]
|
||||
@@ -130,10 +130,7 @@ def cn2py(word: str) -> str:
|
||||
参数:
|
||||
word: 文本
|
||||
"""
|
||||
temp = ""
|
||||
for i in pypinyin.pinyin(word, style=pypinyin.NORMAL):
|
||||
temp += "".join(i)
|
||||
return temp
|
||||
return "".join("".join(i) for i in pypinyin.pinyin(word, style=pypinyin.NORMAL))
|
||||
|
||||
|
||||
async def get_user_avatar(uid: int | str) -> bytes | None:
|
||||
@@ -147,7 +144,7 @@ async def get_user_avatar(uid: int | str) -> bytes | None:
|
||||
for _ in range(3):
|
||||
try:
|
||||
return (await client.get(url)).content
|
||||
except Exception as e:
|
||||
except Exception:
|
||||
logger.error("获取用户头像错误", "Util", target=uid)
|
||||
return None
|
||||
|
||||
@@ -163,7 +160,7 @@ async def get_group_avatar(gid: int | str) -> bytes | None:
|
||||
for _ in range(3):
|
||||
try:
|
||||
return (await client.get(url)).content
|
||||
except Exception as e:
|
||||
except Exception:
|
||||
logger.error("获取群头像错误", "Util", target=gid)
|
||||
return None
|
||||
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
import asyncio
|
||||
|
||||
from nonebot.adapters import Bot
|
||||
from ruamel.yaml.comments import CommentedSeq
|
||||
from nonebot_plugin_session import EventSession
|
||||
|
||||
# from nonebot.adapters.discord import Bot as DiscordBot
|
||||
# from nonebot.adapters.dodo import Bot as DodoBot
|
||||
# from nonebot.adapters.kaiheila import Bot as KaiheilaBot
|
||||
from nonebot.adapters.onebot.v11 import Bot as v11Bot
|
||||
from nonebot.adapters.onebot.v12 import Bot as v12Bot
|
||||
from nonebot_plugin_session import EventSession
|
||||
from ruamel.yaml.comments import CommentedSeq
|
||||
|
||||
from zhenxun.services.log import logger
|
||||
|
||||
|
||||
class WithdrawManager:
|
||||
|
||||
_data = {}
|
||||
_data = {} # noqa: RUF012
|
||||
_index = 0
|
||||
|
||||
@classmethod
|
||||
@@ -34,7 +34,7 @@ class WithdrawManager:
|
||||
return True
|
||||
if withdraw_time[1] == 1 and (session.id2 or session.id3):
|
||||
return True
|
||||
if withdraw_time[1] == 0 and not (session.id2 or session.id3):
|
||||
if withdraw_time[1] == 0 and not session.id2 and not session.id3:
|
||||
return True
|
||||
return False
|
||||
|
||||
@@ -82,7 +82,7 @@ class WithdrawManager:
|
||||
if time:
|
||||
gid = None
|
||||
_time = 1
|
||||
if isinstance(time, (tuple, CommentedSeq)):
|
||||
if isinstance(time, tuple | CommentedSeq):
|
||||
if time[0] == 0:
|
||||
return
|
||||
if session:
|
||||
|
||||
Reference in New Issue
Block a user