mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-08 21:30:01 +08:00
Merge branch 'zhenxun_yajiwa'
This commit is contained in:
@@ -1,7 +1,6 @@
|
|||||||
from configs.config import Config
|
from configs.config import Config
|
||||||
import nonebot
|
import nonebot
|
||||||
|
|
||||||
|
|
||||||
Config.add_plugin_config(
|
Config.add_plugin_config(
|
||||||
"word_bank",
|
"word_bank",
|
||||||
"WORD_BANK_LEVEL [LEVEL]",
|
"WORD_BANK_LEVEL [LEVEL]",
|
||||||
@@ -11,6 +10,25 @@ Config.add_plugin_config(
|
|||||||
default_value=5
|
default_value=5
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Config.add_plugin_config(
|
||||||
|
"word_bank",
|
||||||
|
"WORD_BANK_FUZZY",
|
||||||
|
False,
|
||||||
|
help_="模糊匹配",
|
||||||
|
default_value=False
|
||||||
|
)
|
||||||
|
Config.add_plugin_config(
|
||||||
|
"word_bank",
|
||||||
|
"WORD_BANK_KEY",
|
||||||
|
True,
|
||||||
|
help_="关键字匹配",
|
||||||
|
default_value=True
|
||||||
|
)
|
||||||
|
Config.add_plugin_config(
|
||||||
|
"word_bank",
|
||||||
|
"WORD_BANK_MIX",
|
||||||
|
25,
|
||||||
|
help_="查看词条时图片内最多显示条数",
|
||||||
|
default_value=25
|
||||||
|
)
|
||||||
nonebot.load_plugins("plugins/word_bank")
|
nonebot.load_plugins("plugins/word_bank")
|
||||||
|
|
||||||
|
|||||||
@@ -5,36 +5,40 @@ from configs.path_config import DATA_PATH
|
|||||||
from nonebot.adapters.onebot.v11 import GroupMessageEvent
|
from nonebot.adapters.onebot.v11 import GroupMessageEvent
|
||||||
from utils.utils import get_message_text
|
from utils.utils import get_message_text
|
||||||
from nonebot import on_message
|
from nonebot import on_message
|
||||||
|
from models.group_member_info import GroupInfoUser
|
||||||
|
|
||||||
__zx_plugin_name__ = "词库问答回复操作 [Hidden]"
|
__zx_plugin_name__ = "词库问答回复操作 [Hidden]"
|
||||||
|
|
||||||
|
|
||||||
data_dir = DATA_PATH / "word_bank"
|
data_dir = DATA_PATH / "word_bank"
|
||||||
data_dir.mkdir(parents=True, exist_ok=True)
|
data_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
message_handle = on_message(priority=6, block=True, rule=check)
|
||||||
message_handle = on_message(priority=5, block=True, rule=check)
|
|
||||||
|
|
||||||
|
|
||||||
@message_handle.handle()
|
@message_handle.handle()
|
||||||
async def _(event: GroupMessageEvent):
|
async def _(event: GroupMessageEvent):
|
||||||
path = data_dir / f"{event.group_id}"
|
|
||||||
q = await WordBank.check(
|
q = await WordBank.check(
|
||||||
event.group_id, get_message_text(event.json()), event.is_tome()
|
event.group_id, get_message_text(event.json()), event.is_tome()
|
||||||
)
|
)
|
||||||
|
await message_handle.send(await get_one_answer(event, q.format, q.answer))
|
||||||
|
|
||||||
|
|
||||||
|
# 处理单条回答
|
||||||
|
async def get_one_answer(event, format, _answer, all=1):
|
||||||
|
path = data_dir / f"{event.group_id}"
|
||||||
placeholder_list = (
|
placeholder_list = (
|
||||||
[
|
[
|
||||||
(x.split("<_s>")[0], x.split("<_s>")[1])
|
(x.split("<_s>")[0], x.split("<_s>")[1])
|
||||||
for x in q.format.split("<format>")[:-1]
|
for x in format.split("<format>")[:-1]
|
||||||
]
|
]
|
||||||
if q.format
|
if format
|
||||||
else []
|
else []
|
||||||
)
|
)
|
||||||
answer = ""
|
answer = ""
|
||||||
_a = q.answer
|
_a = _answer
|
||||||
if not placeholder_list:
|
if not placeholder_list:
|
||||||
answer = _a
|
answer = _a
|
||||||
|
return answer
|
||||||
else:
|
else:
|
||||||
for idx, placeholder in placeholder_list:
|
for idx, placeholder in placeholder_list:
|
||||||
if placeholder.endswith("jpg"):
|
if placeholder.endswith("jpg"):
|
||||||
@@ -42,6 +46,11 @@ async def _(event: GroupMessageEvent):
|
|||||||
path / placeholder
|
path / placeholder
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
answer += _a[: _a.find(f"[__placeholder_{idx}]")] + at(placeholder)
|
if all == 1:
|
||||||
_a = _a[_a.find(f"[__placeholder_{idx}]") + len(f"[__placeholder_{idx}]") :]
|
answer += _a[: _a.find(f"[__placeholder_{idx}]")] + at(placeholder)
|
||||||
await message_handle.send(answer)
|
else:
|
||||||
|
q = await GroupInfoUser.get_member_info(
|
||||||
|
int(placeholder), event.group_id)
|
||||||
|
answer += _a[: _a.find(f"[__placeholder_{idx}]")] + "@" + q.user_name
|
||||||
|
_a = _a[_a.find(f"[__placeholder_{idx}]") + len(f"[__placeholder_{idx}]"):]
|
||||||
|
return answer + _a
|
||||||
|
|||||||
+31
-15
@@ -5,6 +5,7 @@ from pathlib import Path
|
|||||||
from configs.path_config import DATA_PATH
|
from configs.path_config import DATA_PATH
|
||||||
import re
|
import re
|
||||||
import random
|
import random
|
||||||
|
from configs.config import Config
|
||||||
|
|
||||||
|
|
||||||
class WordBank(db.Model):
|
class WordBank(db.Model):
|
||||||
@@ -83,7 +84,7 @@ class WordBank(db.Model):
|
|||||||
for x, y in format_:
|
for x, y in format_:
|
||||||
_str += f"{x}<_s>{y}<format>"
|
_str += f"{x}<_s>{y}<format>"
|
||||||
return await cls._problem_answer_handle(
|
return await cls._problem_answer_handle(
|
||||||
user_id, group_id, problem, "update", answer=answer,index=index, format_=_str
|
user_id, group_id, problem, "update", answer=answer, index=index, format_=_str
|
||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@@ -113,7 +114,8 @@ class WordBank(db.Model):
|
|||||||
q = await cls.query.where(
|
q = await cls.query.where(
|
||||||
(cls.group_id == group_id) & (cls.problem == problem)
|
(cls.group_id == group_id) & (cls.problem == problem)
|
||||||
).gino.all()
|
).gino.all()
|
||||||
return [x.answer for x in q] if q else None
|
|
||||||
|
return [(x.answer, x.format) for x in q] if q else None
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def get_group_all_problem(cls, group_id: int) -> List[str]:
|
async def get_group_all_problem(cls, group_id: int) -> List[str]:
|
||||||
@@ -154,9 +156,28 @@ class WordBank(db.Model):
|
|||||||
return x
|
return x
|
||||||
return None
|
return None
|
||||||
else:
|
else:
|
||||||
q = await cls.query.where(
|
if problem:
|
||||||
(cls.group_id == group_id) & (cls.problem == problem)
|
FUZZY = Config.get_config("word_bank", "WORD_BANK_FUZZY")
|
||||||
).gino.all()
|
KEY = Config.get_config("word_bank", "WORD_BANK_KEY")
|
||||||
|
if KEY and FUZZY:
|
||||||
|
q_fuzzy = await cls.query.where(
|
||||||
|
(cls.group_id == group_id) & (cls.problem.contains(f'{problem}'))).gino.all()
|
||||||
|
q_key = await cls.query.where(cls.group_id == group_id).gino.all()
|
||||||
|
q_key = [x for x in q_key if str(x.problem) in (problem)]
|
||||||
|
q = q_fuzzy + q_key
|
||||||
|
elif FUZZY:
|
||||||
|
q = await cls.query.where(
|
||||||
|
(cls.group_id == group_id) & (cls.problem.contains(f'{problem}'))).gino.all()
|
||||||
|
elif KEY:
|
||||||
|
q = await cls.query.where(cls.group_id == group_id).gino.all()
|
||||||
|
q = [x for x in q if str(x.problem) in (problem)]
|
||||||
|
else:
|
||||||
|
q = await cls.query.where(
|
||||||
|
(cls.group_id == group_id) & (cls.problem == problem)
|
||||||
|
).gino.all()
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
return random.choice(q) if q else None
|
return random.choice(q) if q else None
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@@ -209,10 +230,6 @@ class WordBank(db.Model):
|
|||||||
if q:
|
if q:
|
||||||
path = DATA_PATH / "word_bank" / f"{group_id}"
|
path = DATA_PATH / "word_bank" / f"{group_id}"
|
||||||
if index is not None:
|
if index is not None:
|
||||||
_q = [x.problem for x in q]
|
|
||||||
_q.sort()
|
|
||||||
prob = _q[index]
|
|
||||||
index = [x.problem for x in q].index(prob)
|
|
||||||
q = [q[index]]
|
q = [q[index]]
|
||||||
answer = "\n".join([x.answer for x in q])
|
answer = "\n".join([x.answer for x in q])
|
||||||
for x in q:
|
for x in q:
|
||||||
@@ -225,22 +242,19 @@ class WordBank(db.Model):
|
|||||||
if _path.exists():
|
if _path.exists():
|
||||||
_path.unlink()
|
_path.unlink()
|
||||||
await cls.delete.where(
|
await cls.delete.where(
|
||||||
(cls.problem == problem)
|
(cls.update_time == x.update_time)
|
||||||
|
& (cls.problem == problem)
|
||||||
& (cls.answer == x.answer)
|
& (cls.answer == x.answer)
|
||||||
& (cls.group_id == group_id)
|
& (cls.group_id == group_id)
|
||||||
).gino.status()
|
).gino.status()
|
||||||
return answer
|
return answer
|
||||||
elif type_ == "update":
|
elif type_ == "update":
|
||||||
new_format =format_
|
new_format = format_
|
||||||
new_answer = answer
|
new_answer = answer
|
||||||
q = await q.with_for_update().gino.all()
|
q = await q.with_for_update().gino.all()
|
||||||
if q:
|
if q:
|
||||||
path = DATA_PATH / "word_bank" / f"{group_id}"
|
path = DATA_PATH / "word_bank" / f"{group_id}"
|
||||||
if index is not None:
|
if index is not None:
|
||||||
_q = [x.problem for x in q]
|
|
||||||
_q.sort()
|
|
||||||
prob = _q[index]
|
|
||||||
index = [x.problem for x in q].index(prob)
|
|
||||||
q = [q[index]]
|
q = [q[index]]
|
||||||
else:
|
else:
|
||||||
q = [q[0]]
|
q = [q[0]]
|
||||||
@@ -259,6 +273,8 @@ class WordBank(db.Model):
|
|||||||
(cls.problem == problem)
|
(cls.problem == problem)
|
||||||
& (cls.answer == x.answer)
|
& (cls.answer == x.answer)
|
||||||
& (cls.group_id == group_id)
|
& (cls.group_id == group_id)
|
||||||
|
& (cls.group_id == group_id)
|
||||||
|
& (cls.update_time == x.update_time)
|
||||||
).gino.status()
|
).gino.status()
|
||||||
return True
|
return True
|
||||||
elif type_ == "get":
|
elif type_ == "get":
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ from ._data_source import WordBankBuilder
|
|||||||
from configs.config import Config
|
from configs.config import Config
|
||||||
from utils.message_builder import image
|
from utils.message_builder import image
|
||||||
from utils.image_utils import text2image
|
from utils.image_utils import text2image
|
||||||
|
from .message_handle import get_one_answer
|
||||||
from .model import WordBank
|
from .model import WordBank
|
||||||
from nonebot.adapters.onebot.v11 import (
|
from nonebot.adapters.onebot.v11 import (
|
||||||
Bot,
|
Bot,
|
||||||
@@ -18,6 +19,7 @@ from nonebot import on_command
|
|||||||
import random
|
import random
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
from configs.config import NICKNAME, Config
|
||||||
|
|
||||||
__zx_plugin_name__ = "词库问答 [Admin]"
|
__zx_plugin_name__ = "词库问答 [Admin]"
|
||||||
__plugin_usage__ = """
|
__plugin_usage__ = """
|
||||||
@@ -50,7 +52,7 @@ __plugin_cmd__ = [
|
|||||||
__plugin_version__ = 0.1
|
__plugin_version__ = 0.1
|
||||||
__plugin_author__ = "HibiKier"
|
__plugin_author__ = "HibiKier"
|
||||||
__plugin_settings__ = {
|
__plugin_settings__ = {
|
||||||
"admin_level": Config.get_config("word_bank", "WORD_BANK_LEVEL"),
|
"admin_level": Config.get_config("word_bank", "WORD_BANK_LEVEL [LEVEL]"),
|
||||||
"cmd": ["词库问答", "添加词条", "删除词条", "修改词条", "查看词条"],
|
"cmd": ["词库问答", "添加词条", "删除词条", "修改词条", "查看词条"],
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,29 +172,78 @@ async def _(bot: Bot, event: GroupMessageEvent, arg: Message = CommandArg()):
|
|||||||
|
|
||||||
|
|
||||||
@show_word.handle()
|
@show_word.handle()
|
||||||
async def _(event: GroupMessageEvent, arg: Message = CommandArg()):
|
async def _(bot: Bot, event: GroupMessageEvent, arg: Message = CommandArg()):
|
||||||
msg = arg.extract_plain_text().strip()
|
msg = arg.extract_plain_text().strip()
|
||||||
if not msg:
|
if not msg:
|
||||||
_problem_list = await WordBank.get_group_all_problem(event.group_id)
|
_problem_list = await WordBank.get_group_all_problem(event.group_id)
|
||||||
if not _problem_list:
|
if not _problem_list:
|
||||||
await show_word.finish("该群未收录任何词条..")
|
await show_word.finish("该群未收录任何词条..")
|
||||||
_problem_list = [f"\t{i}. {x}" for i, x in enumerate(_problem_list)]
|
_problem_list = [f"\t{i}. {x}" for i, x in enumerate(_problem_list)]
|
||||||
await show_word.send(
|
long_problem_list = len(_problem_list)
|
||||||
image(
|
max_line = Config.get_config("word_bank", "WORD_BANK_MIX")
|
||||||
b64=(await text2image(
|
if long_problem_list > max_line:
|
||||||
"该群已收录的词条:\n\n" + "\n".join(_problem_list),
|
pic_list = []
|
||||||
padding=10,
|
mes_list = []
|
||||||
color="#f9f6f2",
|
img_nu = long_problem_list // max_line
|
||||||
)).pic2bs4()
|
one_msg = "该群已收录的词条:"
|
||||||
|
await show_word.send(one_msg)
|
||||||
|
for i in range(img_nu + 1):
|
||||||
|
if _problem_list:
|
||||||
|
one_img = image(
|
||||||
|
b64=(await text2image("\n".join(_problem_list[:max_line]),
|
||||||
|
padding=10,
|
||||||
|
color="#f9f6f2",
|
||||||
|
)).pic2bs4()
|
||||||
|
)
|
||||||
|
if img_nu > 2:
|
||||||
|
pic_list.append(one_img)
|
||||||
|
else:
|
||||||
|
await show_word.send(one_img)
|
||||||
|
del _problem_list[:max_line]
|
||||||
|
if pic_list:
|
||||||
|
for img in pic_list:
|
||||||
|
data = {
|
||||||
|
"type": "node",
|
||||||
|
"data": {"name": f"{NICKNAME}", "uin": f"{bot.self_id}", "content": img},
|
||||||
|
}
|
||||||
|
mes_list.append(data)
|
||||||
|
await bot.send_group_forward_msg(group_id=event.group_id, messages=mes_list)
|
||||||
|
else:
|
||||||
|
await show_word.send(
|
||||||
|
image(
|
||||||
|
b64=(await text2image(
|
||||||
|
"该群已收录的词条:\n\n" + "\n".join(_problem_list),
|
||||||
|
padding=10,
|
||||||
|
color="#f9f6f2",
|
||||||
|
)).pic2bs4()
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
_answer_list = await WordBank.get_group_all_answer(event.group_id, msg)
|
_answer_list = await WordBank.get_group_all_answer(event.group_id, msg)
|
||||||
if not _answer_list:
|
if not _answer_list:
|
||||||
await show_word.send("未收录该词条...")
|
await show_word.send("未收录该词条...")
|
||||||
|
|
||||||
else:
|
else:
|
||||||
_answer_list = [f"{i}. {x}" for i, x in enumerate(_answer_list)]
|
|
||||||
await show_word.send(f"词条 {msg} 回答:\n" + "\n".join(_answer_list))
|
# 解析图片和@
|
||||||
|
_answer_img_nu_list = [await get_one_answer(event, format, answer, 0) for answer, format in _answer_list]
|
||||||
|
word_nu = len(_answer_img_nu_list)
|
||||||
|
img_nu = 0
|
||||||
|
answer = f"词条 {msg} 回答:"
|
||||||
|
for i, x, in enumerate(_answer_img_nu_list):
|
||||||
|
r = re.findall(rf"\[CQ:image,file=", str(x))
|
||||||
|
if r:
|
||||||
|
img_nu += len(r)
|
||||||
|
answer += "\n" + f"{i}." + x
|
||||||
|
if (img_nu > 2 and word_nu > 5) or word_nu > 10 or img_nu > 4:
|
||||||
|
data = {
|
||||||
|
"type": "node",
|
||||||
|
"data": {"name": f"{NICKNAME}", "uin": f"{bot.self_id}", "content": answer},
|
||||||
|
}
|
||||||
|
await bot.send_group_forward_msg(group_id=event.group_id, messages=data)
|
||||||
|
else:
|
||||||
|
await show_word.send(answer)
|
||||||
|
# await show_word.send(f"词条 {msg} 回答:\n" + "\n".join(_answer_list))
|
||||||
|
|
||||||
|
|
||||||
async def get__builder(event, _problem, answer, idx):
|
async def get__builder(event, _problem, answer, idx):
|
||||||
|
|||||||
Reference in New Issue
Block a user