refactor(nickname): 使用 nonebot_plugin_alconna 重构昵称设置功能

- 替换 on_regex 为 on_alconna,实现更灵活的命令解析
- 重构 CheckNickname 函数,改为异步函数并直接处理逻辑
- 更新昵称设置流程,提高代码可读性和维护性
- 优化消息回复逻辑,提升用户体验
- 优化昵称设置命令,防止误触发
This commit is contained in:
molanp 2025-06-30 14:22:29 +08:00
parent 8b9ae7255b
commit 6bb9a15634

View File

@ -1,12 +1,18 @@
import random import random
from typing import Any
from nonebot import on_regex
from nonebot.adapters import Bot from nonebot.adapters import Bot
from nonebot.params import Depends, RegexGroup from nonebot.params import Depends
from nonebot.plugin import PluginMetadata from nonebot.plugin import PluginMetadata
from nonebot.rule import to_me from nonebot.rule import to_me
from nonebot_plugin_alconna import Alconna, Option, on_alconna, store_true from nonebot_plugin_alconna import (
Alconna,
Args,
Arparma,
CommandMeta,
Option,
on_alconna,
store_true,
)
from nonebot_plugin_uninfo import Uninfo from nonebot_plugin_uninfo import Uninfo
from zhenxun.configs.config import BotConfig, Config from zhenxun.configs.config import BotConfig, Config
@ -54,15 +60,22 @@ __plugin_meta__ = PluginMetadata(
).to_dict(), ).to_dict(),
) )
_nickname_matcher = on_regex( _nickname_matcher = on_alconna(
"(?:以后)?(?:叫我|请叫我|称呼我)(.*)", Alconna(
"re:(?:以后)?(?:叫我|请叫我|称呼我)",
Args["name?", str],
meta=CommandMeta(compact=True),
),
rule=to_me(), rule=to_me(),
priority=5, priority=5,
block=True, block=True,
) )
_global_nickname_matcher = on_regex( _global_nickname_matcher = on_alconna(
"设置全局昵称(.*)", rule=to_me(), priority=5, block=True Alconna("设置全局昵称", Args["name?", str], meta=CommandMeta(compact=True)),
rule=to_me(),
priority=5,
block=True,
) )
_matcher = on_alconna( _matcher = on_alconna(
@ -117,34 +130,32 @@ CANCEL = [
] ]
def CheckNickname(): async def CheckNickname(
bot: Bot,
session: Uninfo,
params: Arparma,
):
""" """
检查名称是否合法 检查名称是否合法
""" """
black_word = Config.get_config("nickname", "BLACK_WORD")
async def dependency( name = params.query("name")
bot: Bot, logger.debug(f"昵称检查: {name}", "昵称设置", session=session)
session: Uninfo, if not name:
reg_group: tuple[Any, ...] = RegexGroup(), await MessageUtils.build_message("叫你空白?叫你虚空?叫你无名??").finish(
): at_sender=True
black_word = Config.get_config("nickname", "BLACK_WORD") )
(name,) = reg_group if session.user.id in bot.config.superusers:
logger.debug(f"昵称检查: {name}", "昵称设置", session=session) logger.debug(
if not name: f"超级用户设置昵称, 跳过合法检测: {name}", "昵称设置", session=session
await MessageUtils.build_message("叫你空白?叫你虚空?叫你无名??").finish( )
at_sender=True else:
)
if session.user.id in bot.config.superusers:
logger.debug(
f"超级用户设置昵称, 跳过合法检测: {name}", "昵称设置", session=session
)
return
if len(name) > 20: if len(name) > 20:
await MessageUtils.build_message("昵称可不能超过20个字!").finish( await MessageUtils.build_message("昵称可不能超过20个字!").finish(
at_sender=True at_sender=True
) )
if name in bot.config.nickname: if name in bot.config.nickname:
await MessageUtils.build_message("笨蛋!休想占用我的名字! #").finish( await MessageUtils.build_message("笨蛋!休想占用我的名字! ").finish(
at_sender=True at_sender=True
) )
if black_word: if black_word:
@ -162,17 +173,17 @@ def CheckNickname():
await MessageUtils.build_message( await MessageUtils.build_message(
f"字符 [{word}] 为禁止字符!" f"字符 [{word}] 为禁止字符!"
).finish(at_sender=True) ).finish(at_sender=True)
return name
return Depends(dependency)
@_nickname_matcher.handle(parameterless=[CheckNickname()]) @_nickname_matcher.handle()
async def _( async def _(
bot: Bot,
session: Uninfo, session: Uninfo,
name_: Arparma,
uname: str = UserName(), uname: str = UserName(),
reg_group: tuple[Any, ...] = RegexGroup(),
): ):
(name,) = reg_group name = await CheckNickname(bot, session, name_)
if len(name) < 5 and random.random() < 0.3: if len(name) < 5 and random.random() < 0.3:
name = "~".join(name) name = "~".join(name)
group_id = None group_id = None
@ -200,13 +211,14 @@ async def _(
) )
@_global_nickname_matcher.handle(parameterless=[CheckNickname()]) @_global_nickname_matcher.handle()
async def _( async def _(
bot: Bot,
session: Uninfo, session: Uninfo,
name_: Arparma,
nickname: str = UserName(), nickname: str = UserName(),
reg_group: tuple[Any, ...] = RegexGroup(),
): ):
(name,) = reg_group name = await CheckNickname(bot, session, name_)
await FriendUser.set_user_nickname( await FriendUser.set_user_nickname(
session.user.id, session.user.id,
name, name,
@ -227,15 +239,14 @@ async def _(session: Uninfo, uname: str = UserName()):
group_id = session.group.parent.id if session.group.parent else session.group.id group_id = session.group.parent.id if session.group.parent else session.group.id
if group_id: if group_id:
nickname = await GroupInfoUser.get_user_nickname(session.user.id, group_id) nickname = await GroupInfoUser.get_user_nickname(session.user.id, group_id)
card = uname
else: else:
nickname = await FriendUser.get_user_nickname(session.user.id) nickname = await FriendUser.get_user_nickname(session.user.id)
card = uname
if nickname: if nickname:
await MessageUtils.build_message(random.choice(REMIND).format(nickname)).finish( await MessageUtils.build_message(random.choice(REMIND).format(nickname)).finish(
reply_to=True reply_to=True
) )
else: else:
card = uname
await MessageUtils.build_message( await MessageUtils.build_message(
random.choice( random.choice(
[ [