Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat #20

Merged
merged 2 commits into from
Jul 26, 2023
Merged

feat #20

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
14 changes: 13 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -145,9 +145,18 @@ LEAF_REPEATER_LIMIT=[2, 6]
# 打断概率,范围 `0` ~ `100`,`0` 关闭打断
LEAF_INTERRUPT=20

# 词库回复匹配模式,`0` 是精确匹配,`1` 是关键词匹配
# 打断复读后,群友继续复读达到指定次数时是否继续参与复读或打断
LEAF_INTERRUPT_CONTINUE=True

# 词库回复匹配模式,
# `0` 是整句话精确匹配关键词(不推荐);
# `1` 是按从长到短的顺序遍历词库中的关键词,遇到匹配的就停止遍历并选取对应回复;
# `2` 与 `1` 的遍历方式相同,但是会遍历所有词库中的关键词,然后从匹配到的所有项目中随机选取一个回复
LEAF_MATCH_PATTERN=1

# 当 `LEAF_MATCH_PATTERN` >= 1 时,消息长度大于此数值则不从词库中匹配回复,设为 `0` 则禁用此功能
LEAF_SEARCH_MAX=20

# 词库回复是否需要 @机器人 或包含机器人昵称
LEAF_NEED_AT=True

Expand Down Expand Up @@ -262,7 +271,10 @@ LEAF_LOAD_BUILTIN_SPECIAL=True
- 编写:支持了一些变量
- 配置项的增加与修改(详见 [配置](#%EF%B8%8F-配置)):
- 修改 `LEAF_IGNORE`:修改类型为 `Set[str]`,配置书写方式不变
- 修改 `LEAF_MATCH_PATTERN`:新增模式 `2`
- 修改 `LEAF_AT_MOD`:更名为 `LEAF_NEED_AT`,修改类型为 `bool`
- 增加 `LEAF_INTERRUPT_CONTINUE`
- 增加 `LEAF_SEARCH_MAX`
- 增加 `LEAF_TRIGGER_PERCENT`
- 增加 `LEAF_POKE_ACTION_DELAY`
- 增加 `LEAF_LOAD_BUILTIN_DICT`
Expand Down
16 changes: 8 additions & 8 deletions nonebot_plugin_kawaii_robot/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,8 @@
finish_multi_msg,
format_sender_username,
format_username_from_event,
full_match_search,
get_username_by_id,
keyword_search,
search_reply_dict,
transform_message,
)

Expand Down Expand Up @@ -71,18 +70,15 @@ async def talk_matcher_handler(matcher: Matcher, event: MessageEvent):
user_id = event.get_user_id()
username = format_username_from_event(event)

# 如果是光艾特bot(没消息返回),就回复以下内容
# 如果是光艾特 bot (没消息返回),就回复以下内容
if (not msg) and event.is_tome():
await finish_multi_msg(
matcher,
choice_reply(LOADED_HELLO_REPLY, user_id, username),
)

# 从词库中获取回复
search_function = (
keyword_search if config.leaf_match_pattern == 1 else full_match_search
)
if reply_list := search_function(LOADED_REPLY_DICT, msg):
if reply_list := search_reply_dict(LOADED_REPLY_DICT, msg):
await finish_multi_msg(
matcher,
choice_reply(reply_list, user_id, username),
Expand Down Expand Up @@ -173,7 +169,10 @@ async def repeat_rule(event: GroupMessageEvent) -> bool:

async def repeater_matcher_handler(matcher: Matcher, event: GroupMessageEvent):
if check_percentage(config.leaf_interrupt):
msg_times[event.group_id] = 0 # 让下次复读计入次数统计,以便再次打断或复读
if config.leaf_interrupt_continue:
# 让下次复读计入次数统计,以便再次打断或复读
msg_times[event.group_id] = 0

await finish_multi_msg(
matcher,
choice_reply(
Expand All @@ -182,6 +181,7 @@ async def repeater_matcher_handler(matcher: Matcher, event: GroupMessageEvent):
format_username_from_event(event),
),
)

await matcher.finish(transform_message(event.message))


Expand Down
15 changes: 13 additions & 2 deletions nonebot_plugin_kawaii_robot/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,19 @@ class ConfigModel(BaseModel, extra=Extra.ignore):
leaf_interrupt: int = 20
"""打断复读概率,范围 `0` ~ `100`"""

leaf_match_pattern: Literal[0, 1] = 1
"""词库回复匹配模式,`0` 是精确匹配,`1` 是关键词匹配"""
leaf_interrupt_continue: bool = True
"""打断复读后,群友继续复读达到指定次数时是否继续参与复读或打断"""

leaf_match_pattern: Literal[0, 1, 2] = 1
"""
词库回复匹配模式,
`0` 是整句话精确匹配关键词(不推荐);
`1` 是按从长到短的顺序遍历词库中的关键词,遇到匹配的就停止遍历并选取对应回复;
`2` 与 `1` 的遍历方式相同,但是会遍历所有词库中的关键词,然后从匹配到的所有项目中随机选取一个回复
"""

leaf_search_max: int = 20
"""当 `LEAF_MATCH_PATTERN` >= 1 时,消息长度大于此数值则不从词库中匹配回复,设为 `0` 则禁用此功能"""

leaf_need_at: bool = True
"""词库回复是否需要 `to_me`"""
Expand Down
38 changes: 18 additions & 20 deletions nonebot_plugin_kawaii_robot/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,13 @@
from .const import NICKNAME, ReplyDictType


def flatten_list(li: Iterable[Iterable[str]]) -> List[str]:
"""
展平二维列表
"""
return [x for y in li for x in y]


def full_to_half(text: str) -> str:
"""
全角转半角
Expand All @@ -19,25 +26,23 @@ def full_to_half(text: str) -> str:
)


def full_match_search(resource: ReplyDictType, text: str) -> Optional[List[str]]:
def search_reply_dict(reply_dict: ReplyDictType, text: str) -> Optional[List[str]]:
"""
从 resource 中获取回应:精确查找
在词库中搜索回复
"""
return resource.get(full_to_half(text.lower()), None)
text = full_to_half(text.lower())

if config.leaf_match_pattern == 0:
return reply_dict.get(text)

def keyword_search(resource: ReplyDictType, text: str) -> Optional[List[str]]:
"""
从 resource 中获取回应:关键词查找
"""
if len(text) > 20:
if config.leaf_search_max > 0 and len(text) > config.leaf_search_max:
return None

text = full_to_half(text.lower())
return next(
(resource[key] for key in resource if key in text),
None,
)
generator = (reply_dict[key] for key in reply_dict if key in text)
if config.leaf_match_pattern == 1:
return next(generator, None)

return flatten_list(list(generator)) or None


def format_vars(string: str, user_id: str, username: str, **kwargs) -> List[str]:
Expand Down Expand Up @@ -124,10 +129,3 @@ async def finish_multi_msg(matcher: Matcher, msg_list: List[Message]):
await matcher.send(msg)

await matcher.finish()


def flatten_list(li: Iterable[Iterable[str]]) -> List[str]:
"""
展平二维列表
"""
return [x for y in li for x in y]