@ -3,18 +3,22 @@ from math import ceil
from nonebot import get_plugin_config
from nonebot_plugin_alconna import ( Alconna , Args , Image , Option , Query ,
Subcommand , SubcommandResult , UniMessage , on_alconna )
Subcommand , SubcommandResult , UniMessage ,
on_alconna )
from pydantic import BaseModel
from konabot . common . longtask import DepLongTaskTarget
from konabot . common . nb . exc import BotExceptionMessage
from konabot . common . nb . extract_image import download_image_bytes
from konabot . common . nb . qq_broadcast import qq_broadcast
from konabot . common . username import get_username
from konabot . plugins . kona_ph . core . image import get_image_manager
from konabot . plugins . kona_ph . core . message import ( get_puzzle_description ,
from konabot . plugins . kona_ph . core . message import ( get_puzzle_description , get_puzzle_hint_list ,
get_puzzle_info_message ,
get_submission_message )
from konabot . plugins . kona_ph . core . storage import get_today_date , p uzzle_m anager
from konabot . plugins . kona_ph . core . storage import ( Puzzle , PuzzleHint , P uzzleM anager,
get_today_date ,
puzzle_manager )
PUZZLE_PAGE_SIZE = 10
@ -36,6 +40,17 @@ def is_puzzle_admin(target: DepLongTaskTarget):
return target . target_id in config . plugin_puzzle_admin
def check_puzzle ( manager : PuzzleManager , target : DepLongTaskTarget , raw_id : str ) - > Puzzle :
if raw_id not in manager . puzzle_data :
raise BotExceptionMessage ( " 没有这个谜题 " )
puzzle = manager . puzzle_data [ raw_id ]
if is_puzzle_admin ( target ) :
return puzzle
if target . target_id != puzzle . author_id :
raise BotExceptionMessage ( " 你没有权限查看或编辑这个谜题 " )
return puzzle
def create_admin_commands ( ) :
cmd_admin = on_alconna (
Alconna (
@ -73,21 +88,21 @@ def create_admin_commands():
" add " ,
Args [ " raw_id " , str ] ,
Args [ " pattern " , str ] ,
Args [ " hint " , str ] ,
Args [ " message " , str ] ,
dest = " add " ,
) ,
Subcommand (
" list " ,
Args [ " raw_id " , str ] ,
Args [ " page? " , int ] ,
dest = " ge t" ,
dest = " lis t" ,
) ,
Subcommand (
" modify " ,
Args [ " raw_id " , str ] ,
Args [ " hint_id " , int ] ,
Option ( " --pattern " , Args [ " pattern " , str ] , alias = [ " -p " ] ) ,
Option ( " --hint " , Args [ " hint " , str ] , alias = [ " -h " ] ) ,
Option ( " --message " , Args [ " message " , str ] , alias = [ " -m " ] ) ,
Option ( " --checkpoint " , Args [ " is_checkpoint " , bool ] , alias = [ " -c " ] ) ,
dest = " modify " ,
) ,
@ -140,15 +155,7 @@ def create_admin_commands():
@cmd_admin.assign ( " ready " )
async def _ ( raw_id : str , target : DepLongTaskTarget ) :
async with puzzle_manager ( ) as manager :
if raw_id not in manager . puzzle_data :
return await target . send_message ( UniMessage . text (
" 你输入的谜题不存在!输入 `konaph my` 查看你创建的谜题 "
) )
p = manager . puzzle_data [ raw_id ]
if p . author_id != target . target_id and not is_puzzle_admin ( target ) :
return await target . send_message ( UniMessage . text (
" 这不是你的题,你没有权限编辑!输入 `konaph my` 查看你创建的谜题 "
) )
p = check_puzzle ( manager , target , raw_id )
if p . ready :
return await target . send_message ( UniMessage . text (
" 题目早就准备好啦! "
@ -161,15 +168,7 @@ def create_admin_commands():
@cmd_admin.assign ( " unready " )
async def _ ( raw_id : str , target : DepLongTaskTarget ) :
async with puzzle_manager ( ) as manager :
if raw_id not in manager . puzzle_data :
return await target . send_message ( UniMessage . text (
" 你输入的谜题不存在!输入 `konaph my` 查看你创建的谜题 "
) )
p = manager . puzzle_data [ raw_id ]
if p . author_id != target . target_id and not is_puzzle_admin ( target ) :
return await target . send_message ( UniMessage . text (
" 这不是你的题,你没有权限编辑!输入 `konaph my` 查看你创建的谜题 "
) )
p = check_puzzle ( manager , target , raw_id )
if not p . ready :
return await target . send_message ( UniMessage . text (
f " 谜题「 { p . title } 」已经是未取消状态了! "
@ -187,16 +186,7 @@ def create_admin_commands():
@cmd_admin.assign ( " info " )
async def _ ( raw_id : str , target : DepLongTaskTarget ) :
async with puzzle_manager ( ) as manager :
if raw_id not in manager . puzzle_data :
return await target . send_message ( UniMessage . text (
" 你输入的谜题不存在!输入 `konaph my` 查看你创建的谜题 "
) )
p = manager . puzzle_data [ raw_id ]
if p . author_id != target . target_id and not is_puzzle_admin ( target ) :
return await target . send_message ( UniMessage . text (
" 这不是你的题,你没有权限查看详细信息! "
) )
p = check_puzzle ( manager , target , raw_id )
await target . send_message ( get_puzzle_info_message ( manager , p ) )
@cmd_admin.assign ( " my " )
@ -232,7 +222,9 @@ def create_admin_commands():
@cmd_admin.assign ( " all " )
async def _ ( target : DepLongTaskTarget , ready : Query [ bool ] = Query ( " all.ready " ) , page : int = 1 ) :
if not is_puzzle_admin ( target ) :
return await target . send_message ( UniMessage . text ( " 你没有权限查看所有的哦 " ) )
return await target . send_message ( UniMessage . text (
" 你没有权限使用该指令 "
) )
async with puzzle_manager ( ) as manager :
puzzles = [ * manager . puzzle_data . values ( ) ]
if ready . available :
@ -314,11 +306,7 @@ def create_admin_commands():
image_manager = get_image_manager ( )
async with puzzle_manager ( ) as manager :
if raw_id not in manager . puzzle_data :
return await target . send_message ( " 没有这个谜题 " )
p = manager . puzzle_data [ raw_id ]
if not is_puzzle_admin ( target ) and target . target_id != p . author_id :
return await target . send_message ( " 你没有权限编辑这个谜题 " )
p = check_puzzle ( manager , target , raw_id )
if title is not None :
p . title = title
if description is not None :
@ -342,6 +330,10 @@ def create_admin_commands():
@cmd_admin.assign ( " publish " )
async def _ ( target : DepLongTaskTarget , raw_id : str | None = None ) :
if not is_puzzle_admin ( target ) :
return await target . send_message ( UniMessage . text (
" 你没有权限使用该指令 "
) )
today = get_today_date ( )
async with puzzle_manager ( ) as manager :
if today in manager . daily_puzzle_of_date :
@ -358,12 +350,8 @@ def create_admin_commands():
@cmd_admin.assign ( " preview " )
async def _ ( target : DepLongTaskTarget , raw_id : str ) :
async with puzzle_manager ( ) as manager :
puzzle = manager . puzzle_data . get( raw_id )
if puzzle is N one :
return await target . send_message ( " 没有这个谜题 " )
if not is_puzzle_admin ( target ) and target . target_id != puzzle . author_id :
return await target . send_message ( " 你没有权限预览这个谜题 " )
return await target . send_message ( get_puzzle_description ( puzzle ) )
p = check_ puzzle( manager , tar get, raw_id )
return await target . send_message ( get_puzzle_descripti on( p ) )
@cmd_admin.assign ( " get-submits " )
async def _ ( target : DepLongTaskTarget , raw_id : str ) :
@ -387,17 +375,10 @@ def create_admin_commands():
测试一道谜题的回答,并给出结果
"""
async with puzzle_manager ( ) as manager :
puzzle = manager . puzzle_data . get( raw_id )
if puzzle is N one :
return await target . send_message ( " 没有这个谜题 " )
if not is_puzzle_admin ( target ) and target . target_id != puzzle . author_id :
return await target . send_message ( " 你没有权限预览这个谜题 " )
result = puzzle . check_submission ( submission )
msg = get_submission_message ( puzzle , result )
return await target . send_message (
UniMessage . text ( " [测试提交] " ) + msg
)
p = check_ puzzle( manager , tar get, raw_id )
result = p . check_submission ( submissi on)
msg = get_submission_message ( p , result )
return await target . send_message ( " [测试提交] " + msg )
@cmd_admin.assign ( " subcommands.hint " )
async def _ ( target : DepLongTaskTarget , subcommands : Query [ SubcommandResult ] = Query ( " subcommands.hint " ) ) :
@ -409,15 +390,75 @@ def create_admin_commands():
. text ( " - konaph hint add <id> <pattern> <hint> \n - 添加一个提示 / 中间答案 \n " )
. text ( " - konaph hint modify <id> <hint_id> \n " )
. text ( " - --pattern <pattern> \n - 更改匹配规则 \n " )
. text ( " - --hint <hint > \n - 更改提示文本 \n " )
. text ( " - --message <message > \n - 更改提示文本 \n " )
. text ( " - --checkpoint [True|False] \n - 更改是否为中间答案 \n " )
. text ( " - konaph hint delete <id> <hint_id> \n - 删除一个提示 / 中间答案 \n " )
. text ( " \n 更多关于 pattern 和中间答案的信息,请见 man: 中间答案(7) " )
)
@cmd_admin.assign ( " hint.add " )
async def _ ( target : DepLongTaskTarget ) :
await target . send_messa ge( " 114514 " )
@cmd_admin.assign ( " subcommands. hint.add" )
async def _ (
target : DepLongTaskTar get ,
raw_id : str ,
pattern : str ,
message : str ,
) :
async with puzzle_manager ( ) as manager :
p = check_puzzle ( manager , target , raw_id )
p . hints [ p . hint_id_max + 1 ] = PuzzleHint (
pattern = pattern ,
message = message ,
is_checkpoint = False ,
)
await target . send_message ( " 创建成功! \n \n " + get_puzzle_hint_list ( p ) )
@cmd_admin.assign ( " subcommands.hint.list " )
async def _ (
target : DepLongTaskTarget ,
raw_id : str ,
) :
async with puzzle_manager ( ) as manager :
p = check_puzzle ( manager , target , raw_id )
await target . send_message ( get_puzzle_hint_list ( p ) )
@cmd_admin.assign ( " subcommands.hint.modify " )
async def _ (
target : DepLongTaskTarget ,
raw_id : str ,
hint_id : int ,
pattern : str | None = None ,
message : str | None = None ,
is_checkpoint : bool | None = None ,
) :
async with puzzle_manager ( ) as manager :
p = check_puzzle ( manager , target , raw_id )
if hint_id not in p . hints :
raise BotExceptionMessage (
f " 没有这个 hint_id。请使用 konaph hint list { raw_id } 了解 hint 清单 "
)
hint = p . hints [ hint_id ]
if pattern is not None :
hint . pattern = pattern
if message is not None :
hint . message = message
if is_checkpoint is not None :
hint . is_checkpoint = is_checkpoint
await target . send_message ( " 更改成功! \n \n " + get_puzzle_hint_list ( p ) )
@cmd_admin.assign ( " subcommands.hint.delete " )
async def _ (
target : DepLongTaskTarget ,
raw_id : str ,
hint_id : int ,
) :
async with puzzle_manager ( ) as manager :
p = check_puzzle ( manager , target , raw_id )
if hint_id not in p . hints :
raise BotExceptionMessage (
f " 没有这个 hint_id。请使用 konaph hint list { raw_id } 了解 hint 清单 "
)
del p . hints [ hint_id ]
await target . send_message ( " 删除成功! \n \n " + get_puzzle_hint_list ( p ) )
return cmd_admin