Skip to content

Commit

Permalink
feat: 使用 nonebot-plugin-alconna 0.46.1 版本新特性实现 no_space 配置
Browse files Browse the repository at this point in the history
  • Loading branch information
WindowsSov8forUs committed May 21, 2024
1 parent 9ae8c6f commit 9b968bc
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 52 deletions.
78 changes: 28 additions & 50 deletions nonebot_plugin_tsugu_bangdream_bot/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Any, List, Tuple, Union, Optional
from typing import Any, List, Tuple, Union

from nonebot.log import logger
from nonebot.adapters import Bot, Event, Message
Expand All @@ -8,9 +8,8 @@

require("nonebot_plugin_alconna")

from nonebot.typing import T_State
from nonebot_plugin_alconna import Command, Extension, store_true
from nonebot_plugin_alconna import Match, Query, Alconna, load_builtin_plugin
from nonebot_plugin_alconna import Command, Extension, store_true, CommandMeta
from nonebot_plugin_alconna.uniseg import At, Text, Image, Reply, Segment, UniMessage

load_builtin_plugin("help")
Expand All @@ -20,7 +19,7 @@
from nonebot_plugin_userinfo import get_user_info

from .config import Config
from ._utils import USAGES, COMMAND_KEYWORDS, server_name_to_id, tier_list_of_server_to_string
from ._utils import USAGES, server_name_to_id, tier_list_of_server_to_string
from ._commands import (
platform,
room_list,
Expand Down Expand Up @@ -74,31 +73,9 @@ def priority(self) -> int:
def id(self) -> str:
return "TsuguExtension"

def __init__(self, reply: bool, at: bool, no_space: bool) -> None:
def __init__(self, reply: bool, at: bool) -> None:
self.reply = reply
self.at = at
self.no_space = no_space

async def message_provider(self, event: Event, state: T_State, bot: Bot, use_origin: bool = False) -> Optional[Union[Message, UniMessage]]:
msg = await super().message_provider(event, state, bot, use_origin)

if msg is None:
return None

if self.no_space:
msg = msg.extract_plain_text().strip()
for keyword in COMMAND_KEYWORDS:
if msg.startswith(keyword):
if not msg.startswith(keyword + " "):
print(msg)
msg = msg.replace(keyword, keyword + " ", 1)
print(msg)

break

return UniMessage(msg)
else:
return msg

async def permission_check(self, bot: Bot, event: Event, command: Alconna) -> bool:
# 规避机器人自身的消息
Expand Down Expand Up @@ -147,7 +124,8 @@ async def send_wrapper(self, bot: Bot, event: Event, send: Union[str, Message, U
tsugu_api_async.settings.userdata_backend_proxy = config.tsugu_data_backend_proxy
tsugu_api_async.settings.timeout = config.tsugu_timeout

extension = TsuguExtension(config.tsugu_reply, config.tsugu_at, config.tsugu_no_space)
extension = TsuguExtension(config.tsugu_reply, config.tsugu_at)
meta = CommandMeta(compact=config.tsugu_no_space)

car_forwarding = on_regex(r"(^(\d{5,6})(.*)$)")

Expand Down Expand Up @@ -182,22 +160,22 @@ async def _(bot: Bot, event: Event, group: Tuple[Any, ...] = RegexGroup()) -> No
if is_forwarded:
logger.debug(f"Submitted room number: {group[0]}")

open_forward = Command("开启车牌转发", "开启车牌转发").build(auto_send_output=True, aliases=config.tsugu_open_forward_aliases, extensions=[extension], use_cmd_start=True)
open_forward = Command("开启车牌转发", "开启车牌转发", meta=meta).build(auto_send_output=True, aliases=config.tsugu_open_forward_aliases, extensions=[extension], use_cmd_start=True)

@open_forward.handle()
async def _(event: Event) -> None:
user_id = event.get_user_id()
await open_forward.send(await switch_forward(user_id, True))

close_forward = Command("关闭车牌转发", "关闭车牌转发").build(auto_send_output=True, aliases=config.tsugu_close_forward_aliases, extensions=[extension], use_cmd_start=True)
close_forward = Command("关闭车牌转发", "关闭车牌转发", meta=meta).build(auto_send_output=True, aliases=config.tsugu_close_forward_aliases, extensions=[extension], use_cmd_start=True)

@close_forward.handle()
async def _(event: Event) -> None:
user_id = event.get_user_id()
await close_forward.send(await switch_forward(user_id, False))

bind_player = (
Command("绑定玩家 [server_name:str]", "绑定玩家信息")
Command("绑定玩家 [server_name:str]", "绑定玩家信息", meta=meta)
.usage('开始玩家数据绑定流程,请不要在"绑定玩家"指令后添加玩家ID。省略服务器名时,默认为绑定到你当前的主服务器。请在获得临时验证数字后,将玩家签名改为该数字,并回复你的玩家ID')
.build(auto_send_output=True, aliases=config.tsugu_bind_player_aliases, extensions=[extension], use_cmd_start=True)
)
Expand Down Expand Up @@ -233,7 +211,7 @@ async def _(event: Event, player_id: str = ArgPlainText()) -> None:
await bind_player.finish(response["data"])

unbind_player = (
Command("解除绑定 [server_name:str]", "解除当前服务器的玩家绑定").alias("解绑玩家")
Command("解除绑定 [server_name:str]", "解除当前服务器的玩家绑定", meta=meta).alias("解绑玩家")
.usage("解除指定服务器的玩家数据绑定。省略服务器名时,默认为当前的主服务器")
.build(auto_send_output=True, aliases=config.tsugu_unbind_player_aliases, extensions=[extension], use_cmd_start=True)
)
Expand Down Expand Up @@ -270,7 +248,7 @@ async def _(event: Event) -> None:
await unbind_player.finish(response["data"])

main_server = (
Command("主服务器 <server_name:str>", "设置主服务器")
Command("主服务器 <server_name:str>", "设置主服务器", meta=meta)
.alias("服务器模式").alias("切换服务器")
.usage("将指定的服务器设置为你的主服务器")
.example("主服务器 cn : 将国服设置为主服务器")
Expand All @@ -291,7 +269,7 @@ async def _(server_name: Match[str], event: Event) -> None:
await main_server.finish("错误: 未指定服务器")

default_servers = (
Command("设置默认服务器 <server_list:str*>", "设定信息显示中的默认服务器排序")
Command("设置默认服务器 <server_list:str*>", "设定信息显示中的默认服务器排序", meta=meta)
.alias("默认服务器")
.usage("使用空格分隔服务器列表")
.example("设置默认服务器 国服 日服 : 将国服设置为第一服务器,日服设置为第二服务器")
Expand All @@ -318,7 +296,7 @@ async def _(server_list: List[str], event: Event) -> None:
await default_servers.finish("错误: 请指定至少一个服务器")

player_status = (
Command("玩家状态 [server_name:str]", "查询自己的玩家状态")
Command("玩家状态 [server_name:str]", "查询自己的玩家状态", meta=meta)
.shortcut(r"^(.+服)玩家状态$", {"args": ["{0}"]})
.build(auto_send_output=True, aliases=config.tsugu_player_status_aliases, extensions=[extension], use_cmd_start=True)
)
Expand All @@ -344,7 +322,7 @@ async def _(server_name: Match[str], event: Event) -> None:
await player_status.finish(UniMessage(segments))

ycm = (
Command("ycm <keyword:str*>", "获取车牌")
Command("ycm <keyword:str*>", "获取车牌", meta=meta)
.alias("有车吗").alias("车来")
.usage("获取所有车牌车牌,可以通过关键词过滤")
.example("ycm : 获取所有车牌").example('ycm 大分: 获取所有车牌,其中包含"大分"关键词的车牌')
Expand Down Expand Up @@ -373,7 +351,7 @@ async def _(keyword: List[str]) -> None:
await ycm.finish(UniMessage(segments))

player_search = (
Command("查玩家 <player_id:int> [server_name:str]", "查询玩家信息")
Command("查玩家 <player_id:int> [server_name:str]", "查询玩家信息", meta=meta)
.alias("查询玩家")
.usage("查询指定ID玩家的信息。省略服务器名时,默认从你当前的主服务器查询")
.example("查玩家 10000000 : 查询你当前默认服务器中,玩家ID为10000000的玩家信息")
Expand Down Expand Up @@ -405,7 +383,7 @@ async def _(player_id: Match[int], server_name: Match[str], event: Event) -> Non
await player_search.finish(UniMessage(segments))

card_search = (
Command("查卡 <word:str*>", "查卡").alias("查卡牌")
Command("查卡 <word:str*>", "查卡", meta=meta).alias("查卡牌")
.usage("根据关键词或卡牌ID查询卡片信息,请使用空格隔开所有参数")
.example("查卡 1399 :返回1399号卡牌的信息")
.example("查卡 绿 tsugu :返回所有属性为pure的羽泽鸫的卡牌列表")
Expand All @@ -429,7 +407,7 @@ async def _(word: List[str], event: Event) -> None:
await card_search.finish(UniMessage(segments))

card_illustration = (
Command("查卡面 <card_id:int>", "查卡面").alias("查卡插画").alias("查插画")
Command("查卡面 <card_id:int>", "查卡面", meta=meta).alias("查卡插画").alias("查插画")
.usage("根据卡片ID查询卡片插画").example("查卡面 1399 :返回1399号卡牌的插画")
.build(auto_send_output=True, aliases=config.tsugu_card_illustration_aliases, extensions=[extension], use_cmd_start=True)
)
Expand All @@ -454,7 +432,7 @@ async def _(card_id: Match[int]) -> None:
await card_illustration.finish(UniMessage(segments))

character_search = (
Command("查角色 <word:str*>", "查角色").usage("根据关键词或角色ID查询角色信息")
Command("查角色 <word:str*>", "查角色", meta=meta).usage("根据关键词或角色ID查询角色信息")
.example("查角色 10 :返回10号角色的信息").example("查角色 吉他 :返回所有角色模糊搜索标签中包含吉他的角色列表")
.build(auto_send_output=True, aliases=config.tsugu_search_character_aliases, extensions=[extension], use_cmd_start=True)
)
Expand All @@ -476,7 +454,7 @@ async def _(word: List[str], event: Event) -> None:
await character_search.finish(UniMessage(segments))

event_search = (
Command("查活动 <word:str*>", "查活动").usage("根据关键词或活动ID查询活动信息")
Command("查活动 <word:str*>", "查活动", meta=meta).usage("根据关键词或活动ID查询活动信息")
.example("查活动 177 :返回177号活动的信息").example("查活动 绿 tsugu :返回所有属性加成为pure,且活动加成角色中包括羽泽鸫的活动列表")
.build(auto_send_output=True, aliases=config.tsugu_search_event_aliases, extensions=[extension], use_cmd_start=True)
)
Expand All @@ -498,7 +476,7 @@ async def _(word: List[str], event: Event) -> None:
await event_search.finish(UniMessage(segments))

song_search = (
Command("查曲 <word:str*>", "查曲").usage("根据关键词或曲目ID查询曲目信息")
Command("查曲 <word:str*>", "查曲", meta=meta).usage("根据关键词或曲目ID查询曲目信息")
.example("查曲 1 :返回1号曲的信息").example("查曲 ag lv27 :返回所有难度为27的ag曲列表")
.build(auto_send_output=True, aliases=config.tsugu_search_song_aliases, extensions=[extension], use_cmd_start=True)
)
Expand All @@ -520,7 +498,7 @@ async def _(word: List[str], event: Event) -> None:
await song_search.finish(UniMessage(segments))

chart_search = (
Command("查谱面 <song_id:int> [difficulty:str]", "查谱面").usage("根据曲目ID与难度查询谱面信息")
Command("查谱面 <song_id:int> [difficulty:str]", "查谱面", meta=meta).usage("根据曲目ID与难度查询谱面信息")
.example("查谱面 1 :返回1号曲的所有谱面").example("查谱面 1 expert :返回1号曲的expert难度谱面")
.build(auto_send_output=True, aliases=config.tsugu_song_chart_aliases, extensions=[extension], use_cmd_start=True)
)
Expand All @@ -545,7 +523,7 @@ async def _(song_id: Match[int], event: Event, difficulty: str = "expert") -> No
await chart_search.finish(UniMessage(segments))

meta_search = (
Command("查询分数表 <word:str>", "查询分数表").usage("查询指定服务器的歌曲分数表,如果没有服务器名的话,服务器为用户的默认服务器")
Command("查询分数表 <word:str>", "查询分数表", meta=meta).usage("查询指定服务器的歌曲分数表,如果没有服务器名的话,服务器为用户的默认服务器")
.alias("查分数表").alias("查询分数榜").alias("查分数榜")
.example("查询分数表 cn :返回国服的歌曲分数表")
.build(auto_send_output=True, aliases=config.tsugu_song_meta_aliases, extensions=[extension], use_cmd_start=True)
Expand Down Expand Up @@ -576,7 +554,7 @@ async def _(word: Match[str], event: Event) -> None:
await meta_search.finish(UniMessage(segments))

stage_search = (
Command("查试炼 [event_id:int]", "查试炼").usage("查询当前服务器当前活动试炼信息\n可以自定义活动ID\n参数:-m 显示歌曲meta(相对效率)")
Command("查试炼 [event_id:int]", "查试炼", meta=meta).usage("查询当前服务器当前活动试炼信息\n可以自定义活动ID\n参数:-m 显示歌曲meta(相对效率)")
.alias("查stage").alias("查舞台").alias("查festival").alias("查5v5")
.example("查试炼 157 -m :返回157号活动的试炼信息,包含歌曲meta")
.example("查试炼 -m :返回当前活动的试炼信息,包含歌曲meta")
Expand Down Expand Up @@ -607,7 +585,7 @@ async def _(event_id: Match[int], event: Event, meta: Query[bool]=Query("meta.va
await stage_search.finish(UniMessage(segments))

gacha_search = (
Command("查卡池 <gacha_id:int>", "查卡池").usage("根据卡池ID查询卡池信息")
Command("查卡池 <gacha_id:int>", "查卡池", meta=meta).usage("根据卡池ID查询卡池信息")
.build(auto_send_output=True, aliases=config.tsugu_search_gacha_aliases, extensions=[extension], use_cmd_start=True)
)

Expand All @@ -631,7 +609,7 @@ async def _(gacha_id: Match[int], event: Event) -> None:
await gacha_search.finish(UniMessage(segments))

ycx = (
Command("ycx <tier:int> [event_id:int] [server_name:str]", "查询指定档位的预测线")
Command("ycx <tier:int> [event_id:int] [server_name:str]", "查询指定档位的预测线", meta=meta)
.usage(f"查询指定档位的预测线,如果没有服务器名的话,服务器为用户的默认服务器。如果没有活动ID的话,活动为当前活动\n可用档线:\n{tier_list_of_server_to_string()}")
.example("ycx 1000 :返回默认服务器当前活动1000档位的档线与预测线")
.example("ycx 1000 177 jp:返回日服177号活动1000档位的档线与预测线")
Expand Down Expand Up @@ -671,7 +649,7 @@ async def _(tier: Match[int], event_id: Match[int], server_name: Match[str], eve
await ycx.finish(UniMessage(segments))

ycx_all = (
Command("ycxall [event_id:int] [server_name:str]", "查询所有档位的预测线")
Command("ycxall [event_id:int] [server_name:str]", "查询所有档位的预测线", meta=meta)
.usage(f"查询所有档位的预测线,如果没有服务器名的话,服务器为用户的默认服务器。如果没有活动ID的话,活动为当前活动\n可用档线:\n{tier_list_of_server_to_string()}")
.alias("myycx")
.build(auto_send_output=True, aliases=config.tsugu_ycx_all_aliases, extensions=[extension], use_cmd_start=True)
Expand Down Expand Up @@ -707,7 +685,7 @@ async def _(event_id: Match[int], server_name: Match[str], event: Event) -> None
await ycx_all.finish(UniMessage(segments))

lsycx = (
Command("lsycx <tier:int> [event_id:int] [server_name:str]", "查询指定档位的预测线")
Command("lsycx <tier:int> [event_id:int] [server_name:str]", "查询指定档位的预测线", meta=meta)
.usage(f"查询指定档位的预测线,与最近的4期活动类型相同的活动的档线数据,如果没有服务器名的话,服务器为用户的默认服务器。如果没有活动ID的话,活动为当前活动\n可用档线:\n{tier_list_of_server_to_string()}")
.example("lsycx 1000 :返回默认服务器当前活动的档线与预测线,与最近的4期活动类型相同的活动的档线数据")
.example("lsycx 1000 177 jp:返回日服177号活动1000档位档线与最近的4期活动类型相同的活动的档线数据")
Expand Down Expand Up @@ -747,7 +725,7 @@ async def _(tier: Match[int], event_id: Match[int], server_name: Match[str], eve
await lsycx.finish(UniMessage(segments))

gacha_simulate = (
Command("抽卡模拟 [times:int] [gacha_id:int]").usage("模拟抽卡,如果没有卡池ID的话,卡池为当前活动的卡池")
Command("抽卡模拟 [times:int] [gacha_id:int]", meta=meta).usage("模拟抽卡,如果没有卡池ID的话,卡池为当前活动的卡池")
.example("抽卡模拟:模拟抽卡10次").example("抽卡模拟 300 922 :模拟抽卡300次,卡池为922号卡池")
.build(auto_send_output=True, aliases=config.tsugu_gacha_simulate_aliases, extensions=[extension], use_cmd_start=True)
)
Expand Down
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
[project]
name = "nonebot-plugin-tsugu-bangdream-bot"
version = "0.1.6"
version = "0.1.7"
description = "Koishi-Plugin-Tsugu-BanGDream-Bot 的 NoneBot2 实现"
authors = [
{name = "WindowsSov8forUs", email = "[email protected]"},
]
dependencies = [
"nonebot2>=2.2.1",
"nonebot-plugin-alconna>=0.42.4",
"nonebot-plugin-alconna>=0.46.1",
"tsugu-api-python>=1.2.0",
"nonebot-plugin-userinfo>=0.2.4",
]
Expand Down

0 comments on commit 9b968bc

Please sign in to comment.