mirror of
https://github.com/TriM-Organization/LiteyukiBot-TriM.git
synced 2026-06-15 17:12:30 +00:00
@@ -1,6 +1,7 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
from asyncio import TimerHandle
|
from asyncio import TimerHandle
|
||||||
from typing import Any, Dict
|
from typing import Any, Dict
|
||||||
|
from typing_extensions import Annotated
|
||||||
|
|
||||||
import nonebot
|
import nonebot
|
||||||
from nonebot import on_regex, require, on_command
|
from nonebot import on_regex, require, on_command
|
||||||
@@ -10,7 +11,8 @@ from nonebot.plugin import PluginMetadata, inherit_supported_adapters
|
|||||||
from nonebot.rule import to_me
|
from nonebot.rule import to_me
|
||||||
from nonebot.utils import run_sync
|
from nonebot.utils import run_sync
|
||||||
from nonebot.permission import SUPERUSER
|
from nonebot.permission import SUPERUSER
|
||||||
from typing_extensions import Annotated
|
|
||||||
|
import json
|
||||||
|
|
||||||
require("nonebot_plugin_alconna")
|
require("nonebot_plugin_alconna")
|
||||||
require("nonebot_plugin_session")
|
require("nonebot_plugin_session")
|
||||||
@@ -30,9 +32,19 @@ from nonebot_plugin_alconna import (
|
|||||||
)
|
)
|
||||||
from nonebot_plugin_session import SessionId, SessionIdType
|
from nonebot_plugin_session import SessionId, SessionIdType
|
||||||
|
|
||||||
|
from src.utils.base.ly_typing import T_Bot
|
||||||
|
|
||||||
from .config import Config, handle_config
|
from .config import Config, handle_config
|
||||||
from .data_source import GuessResult, Handle
|
from .data_source import GuessResult, Handle
|
||||||
from .utils import random_idiom
|
from .utils import (
|
||||||
|
random_idiom,
|
||||||
|
HANDLE_ANSWER_PHRASES,
|
||||||
|
HANDLE_HARD_ANSWER_PHRASES,
|
||||||
|
HANDLE_LEGAL_PHRASES,
|
||||||
|
handle_answer_hard_path,
|
||||||
|
handle_answer_path,
|
||||||
|
handle_idiom_path,
|
||||||
|
)
|
||||||
|
|
||||||
__plugin_meta__ = PluginMetadata(
|
__plugin_meta__ = PluginMetadata(
|
||||||
name="猜成语",
|
name="猜成语",
|
||||||
@@ -103,26 +115,6 @@ handle_stop = on_alconna(
|
|||||||
priority=13,
|
priority=13,
|
||||||
)
|
)
|
||||||
|
|
||||||
handle_answer = on_alconna(
|
|
||||||
Alconna(
|
|
||||||
"答案",
|
|
||||||
Option(
|
|
||||||
"-g|--group",
|
|
||||||
default="Now",
|
|
||||||
args=Args["group", str, "Now"],
|
|
||||||
),
|
|
||||||
Option(
|
|
||||||
"-l|--list",
|
|
||||||
default=False,
|
|
||||||
action=store_true,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
# rule=game_is_running,
|
|
||||||
use_cmd_start=True,
|
|
||||||
permission=SUPERUSER,
|
|
||||||
block=True,
|
|
||||||
priority=13,
|
|
||||||
)
|
|
||||||
|
|
||||||
# handle_update = on_alconna(
|
# handle_update = on_alconna(
|
||||||
# "更新词库",
|
# "更新词库",
|
||||||
@@ -241,17 +233,129 @@ async def _(matcher: Matcher, user_id: UserId, matched: Dict[str, Any] = RegexDi
|
|||||||
await UniMessage.image(raw=await run_sync(game.draw)()).send()
|
await UniMessage.image(raw=await run_sync(game.draw)()).send()
|
||||||
|
|
||||||
|
|
||||||
|
handle_update_idiom = on_alconna(
|
||||||
|
Alconna(
|
||||||
|
"新成语",
|
||||||
|
Option(
|
||||||
|
"-e|--explanation",
|
||||||
|
default="",
|
||||||
|
args=Args["explanation", str, "未提供该成语的解释说明"],
|
||||||
|
),
|
||||||
|
Option(
|
||||||
|
"-d|--hard",
|
||||||
|
default=False,
|
||||||
|
action=store_true,
|
||||||
|
),
|
||||||
|
Args["idiom", str, ""],
|
||||||
|
),
|
||||||
|
aliases=("新增成语", "猜成语新增成语"),
|
||||||
|
use_cmd_start=True,
|
||||||
|
permission=SUPERUSER,
|
||||||
|
block=True,
|
||||||
|
priority=13,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@handle_update_idiom.handle()
|
||||||
|
async def _(
|
||||||
|
result: Arparma,
|
||||||
|
matcher: Matcher,
|
||||||
|
user_id: UserId,
|
||||||
|
bot: T_Bot,
|
||||||
|
):
|
||||||
|
|
||||||
|
try:
|
||||||
|
if result.options["explanation"].args["explanation"]:
|
||||||
|
explanation = result.options["explanation"].args["explanation"]
|
||||||
|
else:
|
||||||
|
nonebot.logger.info("!!!!这里永远不可能被执行到")
|
||||||
|
explanation = "未提供该成语的解释说明"
|
||||||
|
except:
|
||||||
|
explanation = None
|
||||||
|
|
||||||
|
if hard := result.options["hard"].value:
|
||||||
|
if not explanation:
|
||||||
|
explanation = "未提供该成语的解释说明"
|
||||||
|
|
||||||
|
if not (idiom := result.main_args["idiom"]):
|
||||||
|
await handle_update_idiom.finish("请在命令后带上你要增加的成语")
|
||||||
|
|
||||||
|
HANDLE_LEGAL_PHRASES.append(idiom)
|
||||||
|
json.dump(
|
||||||
|
HANDLE_LEGAL_PHRASES,
|
||||||
|
handle_idiom_path.open("w", encoding="utf-8"),
|
||||||
|
ensure_ascii=False,
|
||||||
|
indent=4,
|
||||||
|
sort_keys=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
if explanation:
|
||||||
|
if hard:
|
||||||
|
HANDLE_HARD_ANSWER_PHRASES.append(
|
||||||
|
{"word": idiom, "explanation": explanation}
|
||||||
|
)
|
||||||
|
json.dump(
|
||||||
|
HANDLE_HARD_ANSWER_PHRASES,
|
||||||
|
handle_answer_hard_path.open("w", encoding="utf-8"),
|
||||||
|
ensure_ascii=False,
|
||||||
|
indent=4,
|
||||||
|
sort_keys=True,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
HANDLE_ANSWER_PHRASES.append({"word": idiom, "explanation": explanation})
|
||||||
|
json.dump(
|
||||||
|
HANDLE_ANSWER_PHRASES,
|
||||||
|
handle_answer_path.open("w", encoding="utf-8"),
|
||||||
|
ensure_ascii=False,
|
||||||
|
indent=4,
|
||||||
|
sort_keys=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
await handle_update_idiom.finish(
|
||||||
|
"新增成功,当前词库总数:{}个\n可用普通模式成语:{}个\n可用困难模式成语:{}个".format(
|
||||||
|
len(HANDLE_LEGAL_PHRASES),
|
||||||
|
len(HANDLE_ANSWER_PHRASES),
|
||||||
|
len(HANDLE_HARD_ANSWER_PHRASES),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
handle_answer = on_alconna(
|
||||||
|
Alconna(
|
||||||
|
"成语答案",
|
||||||
|
Option(
|
||||||
|
"-g|--group",
|
||||||
|
default="Now",
|
||||||
|
args=Args["group", str, "Now"],
|
||||||
|
),
|
||||||
|
Option(
|
||||||
|
"-l|--list",
|
||||||
|
default=False,
|
||||||
|
action=store_true,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
aliases=("handle-answer", "猜成语答案"),
|
||||||
|
# rule=game_is_running,
|
||||||
|
use_cmd_start=True,
|
||||||
|
permission=SUPERUSER,
|
||||||
|
block=True,
|
||||||
|
priority=13,
|
||||||
|
)
|
||||||
@handle_answer.handle()
|
@handle_answer.handle()
|
||||||
async def _(
|
async def _(
|
||||||
result: Arparma,
|
result: Arparma,
|
||||||
matcher: Matcher,
|
matcher: Matcher,
|
||||||
user_id: UserId,
|
user_id: UserId,
|
||||||
|
bot: T_Bot,
|
||||||
):
|
):
|
||||||
|
|
||||||
if result.options["list"].value:
|
if result.options["list"].value:
|
||||||
await handle_answer.finish(
|
await handle_answer.finish(
|
||||||
UniMessage.text(
|
UniMessage.text(
|
||||||
"\n".join("{}-{}".format(i, j.idiom) for i, j in games.items())
|
"\n".join(
|
||||||
|
"群{},答案“{}”".format(i.split("_")[-1], j.idiom)
|
||||||
|
for i, j in games.items()
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
@@ -260,8 +364,8 @@ async def _(
|
|||||||
if result.options["group"].args["group"] == "Now":
|
if result.options["group"].args["group"] == "Now":
|
||||||
session_numstr = user_id
|
session_numstr = user_id
|
||||||
else:
|
else:
|
||||||
session_numstr = "qq_OneBot V11_2378756507_{}".format(
|
session_numstr = "qq_OneBot V11_{}_{}".format(
|
||||||
result.options["group"].args["group"]
|
bot.self_id, result.options["group"].args["group"]
|
||||||
)
|
)
|
||||||
except:
|
except:
|
||||||
session_numstr = user_id
|
session_numstr = user_id
|
||||||
@@ -272,3 +376,5 @@ async def _(
|
|||||||
await handle_answer.finish(
|
await handle_answer.finish(
|
||||||
UniMessage.text("{} 不存在开局的游戏".format(session_numstr))
|
UniMessage.text("{} 不存在开局的游戏".format(session_numstr))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -15,19 +15,19 @@ from pypinyin import Style, pinyin
|
|||||||
resource_dir = Path(__file__).parent / "resources"
|
resource_dir = Path(__file__).parent / "resources"
|
||||||
fonts_dir = resource_dir / "fonts"
|
fonts_dir = resource_dir / "fonts"
|
||||||
data_dir = resource_dir / "data"
|
data_dir = resource_dir / "data"
|
||||||
idiom_path = data_dir / "idioms.txt"
|
handle_idiom_path = data_dir / "idioms.json"
|
||||||
answer_path = data_dir / "answers.json"
|
handle_answer_path = data_dir / "answers.json"
|
||||||
answer_hard_path = data_dir / "answers_hard.json"
|
handle_answer_hard_path = data_dir / "answers_hard.json"
|
||||||
|
|
||||||
|
|
||||||
LEGAL_PHRASES = [
|
HANDLE_LEGAL_PHRASES: List[str] = json.load(
|
||||||
idiom.strip() for idiom in idiom_path.open("r", encoding="utf-8").readlines()
|
handle_idiom_path.open("r", encoding="utf-8")
|
||||||
]
|
|
||||||
ANSWER_PHRASES: List[Dict[str, str]] = json.load(
|
|
||||||
answer_path.open("r", encoding="utf-8")
|
|
||||||
)
|
)
|
||||||
HARD_ANSWER_PHRASES: List[Dict[str, str]] = json.load(
|
HANDLE_ANSWER_PHRASES: List[Dict[str, str]] = json.load(
|
||||||
answer_hard_path.open("r", encoding="utf-8")
|
handle_answer_path.open("r", encoding="utf-8")
|
||||||
|
)
|
||||||
|
HANDLE_HARD_ANSWER_PHRASES: List[Dict[str, str]] = json.load(
|
||||||
|
handle_answer_hard_path.open("r", encoding="utf-8")
|
||||||
)
|
)
|
||||||
|
|
||||||
# class LegalPhrasesModifiedHandler(FileSystemEventHandler):
|
# class LegalPhrasesModifiedHandler(FileSystemEventHandler):
|
||||||
@@ -59,11 +59,13 @@ HARD_ANSWER_PHRASES: List[Dict[str, str]] = json.load(
|
|||||||
|
|
||||||
|
|
||||||
def legal_idiom(word: str) -> bool:
|
def legal_idiom(word: str) -> bool:
|
||||||
return word in LEGAL_PHRASES
|
return word in HANDLE_LEGAL_PHRASES
|
||||||
|
|
||||||
|
|
||||||
def random_idiom(is_hard: bool = False) -> Tuple[str, str]:
|
def random_idiom(is_hard: bool = False) -> Tuple[str, str]:
|
||||||
answer = random.choice(HARD_ANSWER_PHRASES if is_hard else ANSWER_PHRASES)
|
answer = random.choice(
|
||||||
|
HANDLE_HARD_ANSWER_PHRASES if is_hard else HANDLE_ANSWER_PHRASES
|
||||||
|
)
|
||||||
return answer["word"], answer["explanation"]
|
return answer["word"], answer["explanation"]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user