Compare commits

...
10 Commits
Author SHA1 Message Date
HibiKier a72f126d8f fix web_ui api 2022-04-05 13:14:29 +08:00
HibiKier 33eb1b83a8 Update README.md 2022-04-04 23:52:24 +08:00
HibiKier 2d9ebe2e6d Merge pull request #141 from yajiwa/main
Update word_bank plus
2022-04-04 23:50:34 +08:00
yajiwa 262b098dec Merge branch 'HibiKier:main' into main 2022-04-04 22:04:27 +08:00
HibiKier 79d88065aa Update README.md 2022-04-04 20:56:02 +08:00
yajiwa 610d588e34 Merge branch 'zhenxun_yajiwa' 2022-04-03 20:17:08 +08:00
yajiwa f99abb2f98 fix config 2022-04-03 20:11:00 +08:00
yajiwa b2b7560d05 Update word_bank_plus 2022-04-03 20:05:18 +08:00
yajiwa 07c16e5238 Merge pull request #1 from yajiwa/zhenxun_yajiwa
Update Modify the entry
2022-04-01 23:56:57 +08:00
yajiwa 1741ea7d26 Update Modify the entry 2022-04-01 23:54:40 +08:00
10 changed files with 338 additions and 137 deletions
+9 -5
View File
@@ -236,6 +236,10 @@ __Docker 最新版本由 [Sakuracio](https://github.com/Sakuracio) 提供__
## 更新 ## 更新
### 2022/4/5 \[v0.1.4.6]
* 修复web修改插件后帮助图片生成错误
### 2022/4/4 \[v0.1.4.5] ### 2022/4/4 \[v0.1.4.5]
* 替换了bt搜索URL * 替换了bt搜索URL
@@ -328,15 +332,15 @@ __Docker 最新版本由 [Sakuracio](https://github.com/Sakuracio) 提供__
* epic restful 替换 [@pull/119](https://github.com/HibiKier/zhenxun_bot/pull/119) * epic restful 替换 [@pull/119](https://github.com/HibiKier/zhenxun_bot/pull/119)
* fix: 修复远古时期残留的epic推送问题 [@pull/122](https://github.com/HibiKier/zhenxun_bot/pull/122) * fix: 修复远古时期残留的epic推送问题 [@pull/122](https://github.com/HibiKier/zhenxun_bot/pull/122)
### 2021/2/11 ### 2022/2/11
* 修复pix不使用反代无法下载图片 * 修复pix不使用反代无法下载图片
### 2021/2/10 \[v0.1.1] ### 2022/2/10 \[v0.1.1]
* 修复购买道具出错 * 修复购买道具出错
### 2021/2/9 \[v0.1] ### 2022/2/9 \[v0.1]
* 新增原神自动签到和手动签到 * 新增原神自动签到和手动签到
* 新增原神树脂提醒 * 新增原神树脂提醒
@@ -346,7 +350,7 @@ __Docker 最新版本由 [Sakuracio](https://github.com/Sakuracio) 提供__
* 修复修改商品时限制时间出错 * 修复修改商品时限制时间出错
* 修复超时商品依旧可以被购买 * 修复超时商品依旧可以被购买
### 2021/1/16 \[v0.0.9.0] ### 2022/1/16 \[v0.0.9.0]
* Ai提供文本敏感词过滤器 * Ai提供文本敏感词过滤器
* 疫情插件适配新版腾讯API * 疫情插件适配新版腾讯API
@@ -365,7 +369,7 @@ __Docker 最新版本由 [Sakuracio](https://github.com/Sakuracio) 提供__
* “send_success_msg”(发送成功的交互信息->即:使用道具 {name} {num} 次成功) * “send_success_msg”(发送成功的交互信息->即:使用道具 {name} {num} 次成功)
* “_max_num_limit”(该道具单次使用的最多个数,默认1) * “_max_num_limit”(该道具单次使用的最多个数,默认1)
### 2021/1/5 \[v0.0.8.2] ### 2022/1/5 \[v0.0.8.2]
* 提供金币消费hook,可在plugins2settings.yaml中配置该功能需要消费的金币 * 提供金币消费hook,可在plugins2settings.yaml中配置该功能需要消费的金币
* 商店插件将作为内置插件移动至basic_plugins * 商店插件将作为内置插件移动至basic_plugins
+1 -1
View File
@@ -1 +1 @@
__version__: v0.1.4.5 __version__: v0.1.4.6
+1 -1
View File
@@ -1,5 +1,5 @@
from configs.config import Config as gConfig from configs.config import Config as gConfig
from .manager import * from .api import *
from .auth import * from .auth import *
@@ -67,8 +67,8 @@ def _(type_: Optional[str], user: User = Depends(token_to_user)) -> Result:
if x := plugins2settings_manager.get(model): if x := plugins2settings_manager.get(model):
if x.get("cmd") and isinstance(x.get("cmd"), list): if x.get("cmd") and isinstance(x.get("cmd"), list):
x["cmd"] = ",".join(x["cmd"]) x["cmd"] = ",".join(x["cmd"])
if isinstance(x["plugin_type"], list): # if isinstance(x["plugin_type"], list):
x["plugin_type"] = x["plugin_type"][0] # x["plugin_type"] = x["plugin_type"][0]
data["plugin_settings"] = PluginSettings(**x) data["plugin_settings"] = PluginSettings(**x)
if x := plugins2cd_manager.get(model): if x := plugins2cd_manager.get(model):
data["cd_limit"] = CdLimit(**x) data["cd_limit"] = CdLimit(**x)
@@ -88,14 +88,11 @@ def _(plugin: Plugin, user: User = Depends(token_to_user)) -> Result:
修改插件信息 修改插件信息
:param plugin: 插件内容 :param plugin: 插件内容
""" """
print(plugin)
if plugin.plugin_settings: if plugin.plugin_settings:
for key, value in plugin.plugin_settings: for key, value in plugin.plugin_settings:
plugins2settings_manager.set_module_data(plugin.model, key, value) plugins2settings_manager.set_module_data(plugin.model, key, value)
if plugin.plugin_manager: if plugin.plugin_manager:
for key, value in plugin.plugin_manager: for key, value in plugin.plugin_manager:
print(key, value)
plugins_manager.set_module_data(plugin.model, key, value) plugins_manager.set_module_data(plugin.model, key, value)
return Result(code=200) return Result(code=200)
+2 -2
View File
@@ -1,4 +1,4 @@
from typing import Optional, List, Any from typing import Optional, List, Any, Union
from pydantic import BaseModel from pydantic import BaseModel
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
import nonebot import nonebot
@@ -54,7 +54,7 @@ class PluginSettings(BaseModel):
limit_superuser: Optional[bool] # 是否限制超级用户 limit_superuser: Optional[bool] # 是否限制超级用户
cmd: Optional[str] # cmd别名 cmd: Optional[str] # cmd别名
cost_gold: Optional[int] # 花费金币限制 cost_gold: Optional[int] # 花费金币限制
plugin_type: Optional[str] # 帮助类型 plugin_type: Optional[List[Union[str, int]]] # 帮助类型
class Plugin(BaseModel): class Plugin(BaseModel):
+21 -3
View File
@@ -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")
+8 -12
View File
@@ -5,7 +5,6 @@ from typing import Union
class WordBankBuilder: class WordBankBuilder:
def __init__(self, user_id: int, group_id: int, problem: str): def __init__(self, user_id: int, group_id: int, problem: str):
self._data = { self._data = {
"user_id": user_id, "user_id": user_id,
"group_id": group_id, "group_id": group_id,
@@ -37,16 +36,13 @@ class WordBankBuilder:
placeholder = self._data.get("placeholder") placeholder = self._data.get("placeholder")
await WordBank.add_problem_answer(user_id, group_id, problem, answer, placeholder) await WordBank.add_problem_answer(user_id, group_id, problem, answer, placeholder)
async def update(self, index):
user_id = self._data["user_id"]
group_id = self._data["group_id"]
problem = self._data["problem"]
answer = self._data["answer"]
placeholder = self._data.get("placeholder")
return await WordBank.update_problem_answer(user_id, group_id, problem, answer, index, placeholder)
def __str__(self): def __str__(self):
return str(self._data) return str(self._data)
+20 -11
View File
@@ -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
+101 -29
View File
@@ -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):
@@ -21,12 +22,12 @@ class WordBank(db.Model):
@classmethod @classmethod
async def add_problem_answer( async def add_problem_answer(
cls, cls,
user_id: int, user_id: int,
group_id: Optional[int], group_id: Optional[int],
problem: str, problem: str,
answer: str, answer: str,
format_: Optional[List[Tuple[int, Union[int, str]]]], format_: Optional[List[Tuple[int, Union[int, str]]]],
) -> bool: ) -> bool:
""" """
添加或新增一个问答 添加或新增一个问答
@@ -47,7 +48,7 @@ class WordBank(db.Model):
@classmethod @classmethod
async def delete_problem_answer( async def delete_problem_answer(
cls, user_id: int, group_id: Optional[int], problem: str, index: Optional[int] cls, user_id: int, group_id: Optional[int], problem: str, index: Optional[int]
) -> str: ) -> str:
""" """
删除某问题一个或全部回答 删除某问题一个或全部回答
@@ -60,9 +61,35 @@ class WordBank(db.Model):
user_id, group_id, problem, "delete", index=index user_id, group_id, problem, "delete", index=index
) )
@classmethod
async def update_problem_answer(
cls,
user_id: int,
group_id: Optional[int],
problem: str,
answer: str,
index: Optional[int],
format_: Optional[List[Tuple[int, Union[int, str]]]],
) -> str:
"""
修改某问题一个或全部回答
:param user_id: 用户id
:param group_id: 群号
:param problem: 问题
:param index: 回答下标
"""
_str = None
if format_:
_str = ""
for x, y in format_:
_str += f"{x}<_s>{y}<format>"
return await cls._problem_answer_handle(
user_id, group_id, problem, "update", answer=answer, index=index, format_=_str
)
@classmethod @classmethod
async def get_problem_answer( async def get_problem_answer(
cls, user_id: int, group_id: Optional[int], problem: str cls, user_id: int, group_id: Optional[int], problem: str
) -> List[str]: ) -> List[str]:
""" """
获取问题的所有回答 获取问题的所有回答
@@ -87,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]:
@@ -128,22 +156,41 @@ 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
async def _problem_answer_handle( async def _problem_answer_handle(
cls, cls,
user_id: int, user_id: int,
group_id: Optional[int], group_id: Optional[int],
problem: str, problem: str,
type_: str, type_: str,
*, *,
answer: Optional[str] = None, answer: Optional[str] = None,
index: Optional[int] = None, index: Optional[int] = None,
format_: Optional[str] = None, format_: Optional[str] = None,
) -> Union[List[Union[str, Tuple[str, str]]], bool, str]: ) -> Union[List[Union[str, Tuple[str, str]]], bool, str]:
""" """
添加或新增一个问答 添加或新增一个问答
@@ -174,8 +221,8 @@ class WordBank(db.Model):
problem=problem, problem=problem,
answer=answer, answer=answer,
format=format_, format=format_,
create_time=datetime.now().date(), create_time=datetime.now().replace(microsecond=0),
update_time=datetime.now().date(), update_time=datetime.now().replace(microsecond=0),
) )
return True return True
elif type_ == "delete": elif type_ == "delete":
@@ -183,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:
@@ -199,14 +242,43 @@ 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":
new_format = format_
new_answer = answer
q = await q.with_for_update().gino.all()
if q:
path = DATA_PATH / "word_bank" / f"{group_id}"
if index is not None:
q = [q[index]]
else:
q = [q[0]]
for x in q:
format_ = x.format
if format_:
for sp in format_.split("<format>")[:-1]:
_, image_name = sp.split("<_s>")
if image_name.endswith("jpg"):
_path = path / image_name
if _path.exists():
_path.unlink()
await cls.update.values(answer=new_answer,
format=new_format,
update_time=datetime.now().replace(microsecond=0), ).where(
(cls.problem == problem)
& (cls.answer == x.answer)
& (cls.group_id == group_id)
& (cls.group_id == group_id)
& (cls.update_time == x.update_time)
).gino.status()
return True
elif type_ == "get": elif type_ == "get":
q = await q.gino.all() q = await q.gino.all()
if q: if q:
return [(x.answer, x.format.split("<format>")[:-1]) for x in q] return [(x.answer, x.format.split("<format>")[:-1]) for x in q]
return False return False
+173 -68
View File
@@ -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__ = """
@@ -27,11 +29,15 @@ usage:
指令: 指令:
添加词条问...答...:添加问答词条,可重复添加相同问题的不同回答 添加词条问...答...:添加问答词条,可重复添加相同问题的不同回答
删除词条 [问题/下标] ?[下标]:删除指定词条指定或全部回答 删除词条 [问题/下标] ?[下标]:删除指定词条指定或全部回答
修改词条 [问题/下标] ?[下标/新回答] [新回答]:修改指定词条指定回答默认修改为第一条
查看词条 ?[问题/下标]:查看全部词条或对应词条回答 查看词条 ?[问题/下标]:查看全部词条或对应词条回答
示例:添加词条问谁是萝莉答是我 示例:添加词条问谁是萝莉答是我
示例:删除词条 谁是萝莉 示例:删除词条 谁是萝莉
示例:删除词条 谁是萝莉 0 示例:删除词条 谁是萝莉 0
示例:删除词条 id:0 示例:删除词条 id:0
示例:修改词条 谁是萝莉 是你
示例:修改词条 谁是萝莉 0 是你
示例:修改词条 id:0 是你
示例:查看词条 示例:查看词条
示例:查看词条 谁是萝莉 示例:查看词条 谁是萝莉
示例:查看词条 id:0 示例:查看词条 id:0
@@ -40,23 +46,25 @@ __plugin_des__ = "自定义词条内容随机回复"
__plugin_cmd__ = [ __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": ["词库问答", "添加词条", "删除词条", "修改词条", "查看词条"],
} }
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)
add_word = on_command("添加词条", priority=5, block=True) add_word = on_command("添加词条", priority=5, block=True)
delete_word = on_command("删除词条", priority=5, block=True) delete_word = on_command("删除词条", priority=5, block=True)
update_word = on_command("修改词条", priority=5, block=True)
show_word = on_command("显示词条", aliases={"查看词条"}, priority=5, block=True) show_word = on_command("显示词条", aliases={"查看词条"}, priority=5, block=True)
@@ -75,10 +83,170 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State, arg: Message = C
idx = 0 idx = 0
for n in bot.config.nickname: for n in bot.config.nickname:
if n and problem.startswith(n): if n and problem.startswith(n):
_problem = f"[_to_me|{n}]" + problem[len(n) :] _problem = f"[_to_me|{n}]" + problem[len(n):]
break break
else: else:
_problem = problem _problem = problem
_builder = await get__builder(event, _problem, answer, idx)
await _builder.save()
logger.info(f"已保存词条 问:{problem} 答:{msg}")
await add_word.send(f"已保存词条:{problem}")
@delete_word.handle()
async def _(event: GroupMessageEvent, arg: Message = CommandArg()):
msg = arg.extract_plain_text().strip()
if not msg:
await delete_word.finish("此命令之后需要跟随指定词条,通过“显示词条“查看")
index = None
_sp_msg = msg.split()
if len(_sp_msg) > 1:
if is_number(_sp_msg[-1]):
index = int(_sp_msg[-1])
msg = " ".join(_sp_msg[:-1])
problem = msg
if problem.startswith("id:"):
x = problem.split(":")[-1]
if not is_number(x) or int(x) < 0:
await delete_word.finish("id必须为数字且符合规范!")
p = await WordBank.get_group_all_problem(event.group_id)
if p:
problem = p[int(x)]
try:
if answer := await WordBank.delete_problem_answer(
event.user_id, event.group_id, problem, index
):
await delete_word.send(f"删除词条成功:{problem}\n回答:\n{answer}")
logger.info(
f"(USER {event.user_id}, GROUP "
f"{event.group_id if isinstance(event, GroupMessageEvent) else 'private'})"
f" 删除词条: {problem}"
)
else:
await delete_word.send(f"删除词条:{problem} 失败,可能该词条不存在")
except IndexError:
await delete_word.send("指定下标错误...请通过查看词条来确定..")
@update_word.handle()
async def _(bot: Bot, event: GroupMessageEvent, arg: Message = CommandArg()):
msg = str(arg)
if not msg:
await update_word.finish("此命令之后需要跟随指定词条,通过“显示词条“查看")
index = None
new_answer = None
problem = None
_sp_msg = msg.split()
len_msg = len(_sp_msg)
if 1 < len_msg:
problem = "".join(_sp_msg[0])
if len_msg == 3:
if is_number(_sp_msg[1]):
index = int(_sp_msg[1])
new_answer = "".join(_sp_msg[2:])
else:
new_answer = "".join(_sp_msg[1:])
else:
await update_word.finish("此命令之后需要跟随修改内容")
idx = 0
for n in bot.config.nickname:
if n and problem.startswith(n):
_problem = f"[_to_me|{n}]" + problem[len(n):]
break
else:
_problem = problem
_builder = await get__builder(event, _problem, new_answer, idx)
try:
if await _builder.update(index):
await update_word.send(f"修改词条成功:{problem}")
logger.info(
f"(USER {event.user_id}, GROUP "
f"{event.group_id if isinstance(event, GroupMessageEvent) else 'private'})"
f" 修改词条: {problem}"
)
else:
await update_word.send(f"修改词条:{problem} 失败,可能该词条不存在")
except IndexError:
await update_word.send("指定下标错误...请通过查看词条来确定..")
@show_word.handle()
async def _(bot: Bot, event: GroupMessageEvent, arg: Message = CommandArg()):
msg = arg.extract_plain_text().strip()
if not msg:
_problem_list = await WordBank.get_group_all_problem(event.group_id)
if not _problem_list:
await show_word.finish("该群未收录任何词条..")
_problem_list = [f"\t{i}. {x}" for i, x in enumerate(_problem_list)]
long_problem_list = len(_problem_list)
max_line = Config.get_config("word_bank", "WORD_BANK_MIX")
if long_problem_list > max_line:
pic_list = []
mes_list = []
img_nu = long_problem_list // max_line
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:
_answer_list = await WordBank.get_group_all_answer(event.group_id, msg)
if not _answer_list:
await show_word.send("未收录该词条...")
else:
# 解析图片和@
_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):
(data_dir / f"{event.group_id}").mkdir(exist_ok=True, parents=True) (data_dir / f"{event.group_id}").mkdir(exist_ok=True, parents=True)
_builder = WordBankBuilder(event.user_id, event.group_id, _problem) _builder = WordBankBuilder(event.user_id, event.group_id, _problem)
for at_ in get_message_at(event.json()): for at_ in get_message_at(event.json()):
@@ -108,67 +276,4 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State, arg: Message = C
_builder.set_placeholder(idx, f"__placeholder_{rand}_{idx}.jpg") _builder.set_placeholder(idx, f"__placeholder_{rand}_{idx}.jpg")
idx += 1 idx += 1
_builder.set_answer(answer) _builder.set_answer(answer)
await _builder.save() return _builder
logger.info(f"已保存词条 问:{problem} 答:{msg}")
await add_word.send(f"已保存词条:{problem}")
@delete_word.handle()
async def _(event: GroupMessageEvent, arg: Message = CommandArg()):
msg = arg.extract_plain_text().strip()
if not msg:
await delete_word.finish("此命令之后需要跟随指定词条,通过“显示词条“查看")
index = None
_sp_msg = msg.split()
if len(_sp_msg) > 1:
if is_number(_sp_msg[-1]):
index = int(_sp_msg[-1])
msg = " ".join(_sp_msg[:-1])
problem = msg
if problem.startswith("id:"):
x = problem.split(":")[-1]
if not is_number(x) or int(x) < 0:
await delete_word.finish("id必须为数字且符合规范!")
p = await WordBank.get_group_all_problem(event.group_id)
if p:
problem = p[int(x)]
try:
if answer := await WordBank.delete_problem_answer(
event.user_id, event.group_id, problem, index
):
await delete_word.send(f"删除词条成功:{problem}\n回答:\n{answer}")
logger.info(
f"(USER {event.user_id}, GROUP "
f"{event.group_id if isinstance(event, GroupMessageEvent) else 'private'})"
f" 删除词条: {problem}"
)
else:
await delete_word.send(f"删除词条:{problem} 失败,可能该词条不存在")
except IndexError:
await delete_word.send("指定下标错误...请通过查看词条来确定..")
@show_word.handle()
async def _(event: GroupMessageEvent, arg: Message = CommandArg()):
msg = arg.extract_plain_text().strip()
if not msg:
_problem_list = await WordBank.get_group_all_problem(event.group_id)
if not _problem_list:
await show_word.finish("该群未收录任何词条..")
_problem_list = [f"\t{i}. {x}" for i, x in enumerate(_problem_list)]
await show_word.send(
image(
b64=(await text2image(
"该群已收录的词条:\n\n" + "\n".join(_problem_list),
padding=10,
color="#f9f6f2",
)).pic2bs4()
)
)
else:
_answer_list = await WordBank.get_group_all_answer(event.group_id, msg)
if not _answer_list:
await show_word.send("未收录该词条...")
else:
_answer_list = [f"{i}. {x}" for i, x in enumerate(_answer_list)]
await show_word.send(f"词条 {msg} 回答:\n" + "\n".join(_answer_list))