mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-07 04:40:00 +08:00
🎨代码优化
This commit is contained in:
@@ -1,13 +1,13 @@
|
||||
from nonebot_plugin_alconna import At
|
||||
from nonebot_plugin_alconna import At as alcAt
|
||||
from nonebot_plugin_alconna import Image
|
||||
from nonebot_plugin_alconna import Image as alcImage
|
||||
from nonebot_plugin_alconna import At as alcAt
|
||||
from nonebot_plugin_alconna import Text as alcText
|
||||
from nonebot_plugin_alconna import UniMessage, UniMsg
|
||||
from nonebot_plugin_alconna import Image as alcImage
|
||||
from nonebot_plugin_alconna import UniMsg, UniMessage
|
||||
|
||||
from zhenxun.plugins.word_bank._config import ScopeType
|
||||
from zhenxun.utils.image_utils import ImageTemplate
|
||||
from zhenxun.utils.message import MessageUtils
|
||||
from zhenxun.utils.image_utils import ImageTemplate
|
||||
from zhenxun.plugins.word_bank._config import ScopeType
|
||||
|
||||
from ._model import WordBank
|
||||
|
||||
@@ -42,9 +42,9 @@ def get_problem(message: UniMsg) -> str:
|
||||
problem = ""
|
||||
a, b = True, True
|
||||
for msg in message:
|
||||
if isinstance(msg, alcText) or isinstance(msg, str):
|
||||
if isinstance(msg, alcText | str):
|
||||
msg = str(msg)
|
||||
if "问" in str(msg) and a:
|
||||
if "问" in msg and a:
|
||||
a = False
|
||||
split_text = msg.split("问")
|
||||
if len(split_text) > 1:
|
||||
@@ -53,7 +53,7 @@ def get_problem(message: UniMsg) -> str:
|
||||
if "答" in problem:
|
||||
b = False
|
||||
problem = problem.split("答")[0]
|
||||
elif "答" in msg and b:
|
||||
elif "答" in msg:
|
||||
b = False
|
||||
# problem += "答".join(msg.split("答")[:-1])
|
||||
problem += msg.split("答")[0]
|
||||
@@ -78,7 +78,7 @@ def get_answer(message: UniMsg) -> UniMessage | None:
|
||||
index = 0
|
||||
for msg in message:
|
||||
index += 1
|
||||
if isinstance(msg, alcText) or isinstance(msg, str):
|
||||
if isinstance(msg, alcText | str):
|
||||
msg = str(msg)
|
||||
if "答" in msg:
|
||||
answer += "答".join(msg.split("答")[1:])
|
||||
@@ -90,7 +90,6 @@ def get_answer(message: UniMsg) -> UniMessage | None:
|
||||
|
||||
|
||||
class WordBankManage:
|
||||
|
||||
@classmethod
|
||||
async def update_word(
|
||||
cls,
|
||||
@@ -175,10 +174,14 @@ class WordBankManage:
|
||||
)
|
||||
if not _problem_list:
|
||||
return problem, ""
|
||||
if await WordBank.delete_group_problem(problem, group_id, aid, word_scope): # type: ignore
|
||||
return "删除词条成功!", ""
|
||||
return "词条不存在", ""
|
||||
if handle_type == "update":
|
||||
return (
|
||||
("删除词条成功!", "")
|
||||
if await WordBank.delete_group_problem(
|
||||
problem, group_id, aid, word_scope
|
||||
)
|
||||
else ("词条不存在", "")
|
||||
)
|
||||
elif handle_type == "update":
|
||||
old_problem = await WordBank.update_group_problem(
|
||||
problem, replace_problem, group_id, word_scope=word_scope
|
||||
)
|
||||
@@ -187,7 +190,10 @@ class WordBankManage:
|
||||
|
||||
@classmethod
|
||||
async def __get_problem_str(
|
||||
cls, idx: int, group_id: str | None = None, word_scope: ScopeType = ScopeType.GROUP
|
||||
cls,
|
||||
idx: int,
|
||||
group_id: str | None = None,
|
||||
word_scope: ScopeType = ScopeType.GROUP,
|
||||
) -> tuple[str, int]:
|
||||
"""通过id获取问题字符串
|
||||
|
||||
@@ -222,7 +228,7 @@ class WordBankManage:
|
||||
word_scope: 词条范围
|
||||
index: 指定回答下标
|
||||
"""
|
||||
if problem or index != None:
|
||||
if problem or index is not None:
|
||||
msg_list = []
|
||||
problem, _problem_list = await WordBank.get_problem_all_answer(
|
||||
problem, # type: ignore
|
||||
|
||||
@@ -1,31 +1,29 @@
|
||||
import random
|
||||
import re
|
||||
import time
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
import random
|
||||
from typing import Any
|
||||
|
||||
from nonebot_plugin_alconna import At as alcAt
|
||||
from nonebot_plugin_alconna import Image as alcImage
|
||||
from nonebot_plugin_alconna import Text as alcText
|
||||
from nonebot_plugin_alconna import UniMessage
|
||||
from tortoise import Tortoise, fields
|
||||
from tortoise.expressions import Q
|
||||
from datetime import datetime
|
||||
from typing_extensions import Self
|
||||
|
||||
from zhenxun.configs.path_config import DATA_PATH
|
||||
from zhenxun.services.db_context import Model
|
||||
from zhenxun.utils.http_utils import AsyncHttpx
|
||||
from zhenxun.utils.image_utils import get_img_hash
|
||||
from zhenxun.utils.message import MessageUtils
|
||||
from tortoise.expressions import Q
|
||||
from tortoise import Tortoise, fields
|
||||
from nonebot_plugin_alconna import UniMessage
|
||||
from nonebot_plugin_alconna import At as alcAt
|
||||
from nonebot_plugin_alconna import Text as alcText
|
||||
from nonebot_plugin_alconna import Image as alcImage
|
||||
|
||||
from ._config import ScopeType, WordType, int2type
|
||||
from zhenxun.services.db_context import Model
|
||||
from zhenxun.utils.message import MessageUtils
|
||||
from zhenxun.utils.http_utils import AsyncHttpx
|
||||
from zhenxun.configs.path_config import DATA_PATH
|
||||
from zhenxun.utils.image_utils import get_img_hash
|
||||
|
||||
from ._config import WordType, ScopeType, int2type
|
||||
|
||||
path = DATA_PATH / "word_bank"
|
||||
|
||||
|
||||
class WordBank(Model):
|
||||
|
||||
id = fields.IntField(pk=True, generated=True, auto_increment=True)
|
||||
"""自增id"""
|
||||
user_id = fields.CharField(255)
|
||||
@@ -57,12 +55,12 @@ class WordBank(Model):
|
||||
author = fields.CharField(255, null=True, default="")
|
||||
"""收录人"""
|
||||
|
||||
class Meta:
|
||||
class Meta: # type: ignore
|
||||
table = "word_bank2"
|
||||
table_description = "词条数据库"
|
||||
|
||||
@classmethod
|
||||
async def exists(
|
||||
async def exists( # type: ignore
|
||||
cls,
|
||||
user_id: str | None,
|
||||
group_id: str | None,
|
||||
@@ -217,7 +215,6 @@ class WordBank(Model):
|
||||
user_id: 用户id
|
||||
group_id: 群组id
|
||||
"""
|
||||
result_list = []
|
||||
if not query:
|
||||
query = await cls.get_or_none(
|
||||
problem=problem,
|
||||
@@ -228,18 +225,19 @@ class WordBank(Model):
|
||||
if not answer:
|
||||
answer = str(query.answer) # type: ignore
|
||||
if query and query.placeholder:
|
||||
type_list = re.findall(rf"\[(.*?):placeholder_.*?]", answer)
|
||||
answer_split = re.split(rf"\[.*:placeholder_.*?]", answer)
|
||||
type_list = re.findall(r"\[(.*?):placeholder_.*?]", answer)
|
||||
answer_split = re.split(r"\[.*:placeholder_.*?]", answer)
|
||||
placeholder_split = query.placeholder.split(",")
|
||||
result_list = []
|
||||
for index, ans in enumerate(answer_split):
|
||||
result_list.append(ans)
|
||||
if index < len(type_list):
|
||||
t = type_list[index]
|
||||
p = placeholder_split[index]
|
||||
if t == "image":
|
||||
result_list.append(path / p)
|
||||
elif t == "at":
|
||||
if t == "at":
|
||||
result_list.append(alcAt(flag="user", target=p))
|
||||
elif t == "image":
|
||||
result_list.append(path / p)
|
||||
return MessageUtils.build_message(result_list)
|
||||
return MessageUtils.build_message(answer)
|
||||
|
||||
@@ -282,7 +280,10 @@ class WordBank(Model):
|
||||
return data_list
|
||||
db = Tortoise.get_connection("default")
|
||||
# 模糊匹配
|
||||
sql = query.filter(word_type=1).sql() + " and POSITION(problem in $1) > 0"
|
||||
sql = (
|
||||
query.filter(word_type=WordType.FUZZY.value).sql()
|
||||
+ " and POSITION(problem in $1) > 0"
|
||||
)
|
||||
data_list = await db.execute_query_dict(sql, [problem])
|
||||
if data_list:
|
||||
return [cls(**data) for data in data_list]
|
||||
@@ -292,9 +293,7 @@ class WordBank(Model):
|
||||
+ " and $1 ~ problem;"
|
||||
)
|
||||
data_list = await db.execute_query_dict(sql, [problem])
|
||||
if data_list:
|
||||
return [cls(**data) for data in data_list]
|
||||
return None
|
||||
return [cls(**data) for data in data_list] if data_list else None
|
||||
|
||||
@classmethod
|
||||
async def get_answer(
|
||||
@@ -318,7 +317,7 @@ class WordBank(Model):
|
||||
random_answer = random.choice(data_list)
|
||||
if random_answer.word_type == WordType.REGEX:
|
||||
r = re.search(random_answer.problem, problem)
|
||||
has_placeholder = re.search(rf"\$(\d)", random_answer.answer)
|
||||
has_placeholder = re.search(r"\$(\d)", random_answer.answer)
|
||||
if r and r.groups() and has_placeholder:
|
||||
pats = re.sub(r"\$(\d)", r"\\\1", random_answer.answer)
|
||||
random_answer.answer = re.sub(random_answer.problem, pats, problem)
|
||||
@@ -575,9 +574,16 @@ class WordBank(Model):
|
||||
async def _run_script(cls):
|
||||
return [
|
||||
"ALTER TABLE word_bank2 ADD to_me varchar(255);", # 添加 to_me 字段
|
||||
"ALTER TABLE word_bank2 ALTER COLUMN create_time TYPE timestamp with time zone USING create_time::timestamp with time zone;",
|
||||
"ALTER TABLE word_bank2 ALTER COLUMN update_time TYPE timestamp with time zone USING update_time::timestamp with time zone;",
|
||||
"ALTER TABLE word_bank2 RENAME COLUMN user_qq TO user_id;", # 将user_qq改为user_id
|
||||
(
|
||||
"ALTER TABLE word_bank2 ALTER COLUMN create_time TYPE timestamp"
|
||||
" with time zone USING create_time::timestamp with time zone;"
|
||||
),
|
||||
(
|
||||
"ALTER TABLE word_bank2 ALTER COLUMN update_time TYPE timestamp"
|
||||
" with time zone USING update_time::timestamp with time zone;"
|
||||
),
|
||||
"ALTER TABLE word_bank2 RENAME COLUMN user_qq TO user_id;",
|
||||
# 将user_qq改为user_id
|
||||
"ALTER TABLE word_bank2 ALTER COLUMN user_id TYPE character varying(255);",
|
||||
"ALTER TABLE word_bank2 ALTER COLUMN group_id TYPE character varying(255);",
|
||||
"ALTER TABLE word_bank2 ADD platform varchar(255) DEFAULT 'qq';",
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
from io import BytesIO
|
||||
|
||||
import imagehash
|
||||
from nonebot.adapters import Bot, Event
|
||||
from nonebot.typing import T_State
|
||||
from nonebot_plugin_alconna import At as alcAt
|
||||
from nonebot_plugin_alconna import Text as alcText
|
||||
from nonebot_plugin_alconna import UniMsg
|
||||
from nonebot_plugin_session import EventSession
|
||||
from PIL import Image
|
||||
from nonebot.typing import T_State
|
||||
from nonebot.adapters import Bot, Event
|
||||
from nonebot_plugin_alconna import UniMsg
|
||||
from nonebot_plugin_alconna import At as alcAt
|
||||
from nonebot_plugin_session import EventSession
|
||||
from nonebot_plugin_alconna import Text as alcText
|
||||
|
||||
from zhenxun.services.log import logger
|
||||
from zhenxun.utils.http_utils import AsyncHttpx
|
||||
|
||||
from ._data_source import get_img_and_at_list
|
||||
from ._model import WordBank
|
||||
from ._data_source import get_img_and_at_list
|
||||
|
||||
|
||||
async def check(
|
||||
@@ -31,7 +31,7 @@ async def check(
|
||||
r = await AsyncHttpx.get(img_list[0])
|
||||
problem = str(imagehash.average_hash(Image.open(BytesIO(r.content))))
|
||||
except Exception as e:
|
||||
logger.warning(f"获取图片失败", "词条检测", session=session, e=e)
|
||||
logger.warning("获取图片失败", "词条检测", session=session, e=e)
|
||||
if at_list:
|
||||
temp = ""
|
||||
# TODO: 支持更多消息类型
|
||||
|
||||
@@ -2,27 +2,26 @@ import re
|
||||
from typing import Any
|
||||
|
||||
from nonebot.adapters import Bot
|
||||
from nonebot.adapters.onebot.v11 import unescape
|
||||
from nonebot.typing import T_State
|
||||
from nonebot.params import RegexGroup
|
||||
from nonebot_plugin_alconna import Image
|
||||
from nonebot.plugin import PluginMetadata
|
||||
from nonebot.exception import FinishedException
|
||||
from nonebot.internal.params import Arg, ArgStr
|
||||
from nonebot.params import RegexGroup
|
||||
from nonebot.plugin import PluginMetadata
|
||||
from nonebot.typing import T_State
|
||||
from nonebot_plugin_alconna import AlconnaQuery, Arparma
|
||||
from nonebot_plugin_alconna import Image
|
||||
from nonebot_plugin_alconna import Image as alcImage
|
||||
from nonebot_plugin_alconna import Match, Query, UniMsg
|
||||
from nonebot_plugin_session import EventSession
|
||||
from nonebot.adapters.onebot.v11 import unescape
|
||||
from nonebot_plugin_alconna import Image as alcImage
|
||||
from nonebot_plugin_alconna import Match, Query, UniMsg, Arparma, AlconnaQuery
|
||||
|
||||
from zhenxun.configs.config import Config
|
||||
from zhenxun.configs.utils import PluginExtraData
|
||||
from zhenxun.services.log import logger
|
||||
from zhenxun.configs.config import Config
|
||||
from zhenxun.utils.message import MessageUtils
|
||||
from zhenxun.configs.utils import PluginExtraData
|
||||
|
||||
from ._config import ScopeType, WordType, scope2int, type2int
|
||||
from ._data_source import WordBankManage, get_answer, get_img_and_at_list, get_problem
|
||||
from ._model import WordBank
|
||||
from ._config import WordType, ScopeType, type2int, scope2int
|
||||
from .command import _add_matcher, _del_matcher, _show_matcher, _update_matcher
|
||||
from ._data_source import WordBankManage, get_answer, get_problem, get_img_and_at_list
|
||||
|
||||
base_config = Config.get("word_bank")
|
||||
|
||||
@@ -30,7 +29,7 @@ base_config = Config.get("word_bank")
|
||||
__plugin_meta__ = PluginMetadata(
|
||||
name="词库问答",
|
||||
description="自定义词条内容随机回复",
|
||||
usage="""
|
||||
usage=r"""
|
||||
usage:
|
||||
对指定问题的随机回答,对相同问题可以设置多个不同回答
|
||||
删除词条后每个词条的id可能会变化,请查看后再删除
|
||||
@@ -63,11 +62,11 @@ __plugin_meta__ = PluginMetadata(
|
||||
查看词条 --id 2 : 查看词条序号为2的全部回答
|
||||
查看词条 谁是萝莉 --all: 查看全局词条 谁是萝莉 的全部回答
|
||||
查看词条 --id 2 --all: 查看全局词条序号为2的全部回答
|
||||
""".strip(),
|
||||
""".strip(), # noqa: E501
|
||||
extra=PluginExtraData(
|
||||
author="HibiKier & yajiwa",
|
||||
version="0.1",
|
||||
superuser_help="""
|
||||
superuser_help=r"""
|
||||
在私聊中超级用户额外设置
|
||||
指令:
|
||||
(全局|私聊)?添加词条\s*?(模糊|正则|图片)?问\s*?(\S*\s?\S*)\s*?答\s?(\S*):添加问答词条,可重复添加相同问题的不同回答
|
||||
@@ -149,7 +148,7 @@ async def _(
|
||||
group_id = session.id3 or session.id2
|
||||
try:
|
||||
if word_type == "图片":
|
||||
problem = [m for m in message if isinstance(m, alcImage)][0].url
|
||||
problem = next(m for m in message if isinstance(m, alcImage)).url
|
||||
elif word_type == "正则" and problem:
|
||||
problem = unescape(problem)
|
||||
try:
|
||||
@@ -158,7 +157,9 @@ async def _(
|
||||
await MessageUtils.build_message(
|
||||
f"添加词条失败,正则表达式 {problem} 非法!"
|
||||
).finish(reply_to=True)
|
||||
# if str(event.user_id) in bot.config.superusers and isinstance(event, PrivateMessageEvent):
|
||||
# if str(event.user_id) in bot.config.superusers and isinstance(
|
||||
# event, PrivateMessageEvent
|
||||
# ):
|
||||
# word_scope = "私聊"
|
||||
nickname = None
|
||||
if problem and bot.config.nickname:
|
||||
@@ -300,17 +301,15 @@ async def _(
|
||||
word_scope = ScopeType.GROUP if session.id3 or session.id2 else ScopeType.PRIVATE
|
||||
group_id = session.id3 or session.id2
|
||||
if all.result:
|
||||
word_scope = 0
|
||||
word_scope = ScopeType.GLOBAL
|
||||
if gid.available:
|
||||
group_id = gid.result
|
||||
if problem.available:
|
||||
if index.available:
|
||||
if index.result < 0 or index.result > len(
|
||||
await WordBank.get_problem_by_scope(word_scope)
|
||||
):
|
||||
await MessageUtils.build_message("id必须在范围内...").finish(
|
||||
reply_to=True
|
||||
)
|
||||
if index.available and (
|
||||
index.result < 0
|
||||
or index.result > len(await WordBank.get_problem_by_scope(word_scope))
|
||||
):
|
||||
await MessageUtils.build_message("id必须在范围内...").finish(reply_to=True)
|
||||
result = await WordBankManage.show_word(
|
||||
problem.result,
|
||||
index.result if index.available else None,
|
||||
|
||||
Reference in New Issue
Block a user