upd
This commit is contained in:
parent
97c6312f7b
commit
53ceb4933d
5 changed files with 12 additions and 106 deletions
|
@ -22,13 +22,6 @@
|
|||
"error.prompt.report": "执行命令时发生错误,请报告机器人开发者:\n${err_msg}\n错误汇报地址:",
|
||||
"error.request.api.timeout": "请求 API 超时。",
|
||||
"example": "你好世界!",
|
||||
"game.message.running": "当前有一局游戏正在进行中。",
|
||||
"game.message.running.others": "当前有其他游戏正在进行中。",
|
||||
"game.stop.help": "停止当前的游戏。",
|
||||
"game.stop.message": "已停止。",
|
||||
"game.stop.message.none": "当前没有游戏在进行中。",
|
||||
"game.message.correct": "回答正确。",
|
||||
"game.message.incorrect": "回答错误。",
|
||||
"i18n.prompt.fallback.failed": "(如果你看到了这条奇怪的字符串,说明我们又搞错了什么东西!\n请将问题反馈至\n${url}\n以便我们快速解决此问题。)",
|
||||
"language": "简体中文",
|
||||
"message.reply.prompt": "(请使用指定的词语回复本条消息)",
|
||||
|
|
|
@ -109,10 +109,10 @@ async def _(msg: Bot.MessageSession):
|
|||
|
||||
@ccode.command('stop {{chemical_code.stop.help}}')
|
||||
async def s(msg: Bot.MessageSession):
|
||||
state = play_state.get(msg.target.targetId, False) # 尝试获取 play_state 中是否有此对象的游戏状态
|
||||
state = play_state.get(msg.target.targetId, {}).get('ccode', False) # 尝试获取 play_state 中是否有此对象的游戏状态
|
||||
if state: # 若有
|
||||
if state['active']: # 检查是否为活跃状态
|
||||
play_state[msg.target.targetId]['active'] = False # 标记为非活跃状态
|
||||
play_state[msg.target.targetId]['ccode']['active'] = False # 标记为非活跃状态
|
||||
await msg.sendMessage(
|
||||
msg.locale.t('chemical_code.stop.message', answer=play_state[msg.target.targetId]["answer"]),
|
||||
quote=False) # 发送存储于 play_state 中的答案
|
||||
|
@ -134,14 +134,14 @@ async def chemical_code_by_id(msg: Bot.MessageSession):
|
|||
async def chemical_code(msg: Bot.MessageSession, id=None, captcha_mode=False):
|
||||
# 要求传入消息会话和 ChemSpider ID,ID 留空将会使用缺省值 None
|
||||
if msg.target.targetId in play_state and play_state[msg.target.targetId][
|
||||
'active']: # 检查对象(群组或私聊)是否在 play_state 中有记录及是否为活跃状态
|
||||
'ccode']['active']: # 检查对象(群组或私聊)是否在 play_state 中有记录及是否为活跃状态
|
||||
await msg.finish(msg.locale.t('chemical_code.message.running'))
|
||||
play_state.update({msg.target.targetId: {'active': True}}) # 若无,则创建一个新的记录并标记为活跃状态
|
||||
play_state.update({msg.target.targetId: {'ccode':{'active': True}}}) # 若无,则创建一个新的记录并标记为活跃状态
|
||||
try:
|
||||
csr = await search_csr(id) # 尝试获取 ChemSpider ID 对应的化学式列表
|
||||
except Exception as e: # 意外情况
|
||||
traceback.print_exc() # 打印错误信息
|
||||
play_state[msg.target.targetId]['active'] = False # 将对象标记为非活跃状态
|
||||
play_state[msg.target.targetId]['ccode']['active'] = False # 将对象标记为非活跃状态
|
||||
return await msg.finish(msg.locale.t('chemical_code.message.error'))
|
||||
# print(csr)
|
||||
play_state[msg.target.targetId]['answer'] = csr['name'] # 将正确答案标记于 play_state 中存储的对象中
|
||||
|
@ -170,7 +170,7 @@ async def chemical_code(msg: Bot.MessageSession, id=None, captcha_mode=False):
|
|||
|
||||
async def ans(msg: Bot.MessageSession, answer): # 定义回答函数的功能
|
||||
wait = await msg.waitAnyone() # 等待对象内的任意人回答
|
||||
if play_state[msg.target.targetId]['active']: # 检查对象是否为活跃状态
|
||||
if play_state[msg.target.targetId]['ccode']['active']: # 检查对象是否为活跃状态
|
||||
if (wait_text := wait.asDisplay(text_only=True)) != answer: # 如果回答不正确
|
||||
if re.match(r'^[A-Za-z0-9]+$', wait_text):
|
||||
try:
|
||||
|
@ -219,14 +219,14 @@ async def chemical_code(msg: Bot.MessageSession, id=None, captcha_mode=False):
|
|||
return await ans(wait, answer) # 进行下一轮检查
|
||||
else:
|
||||
await wait.sendMessage(wait.locale.t('chemical_code.message.correct'))
|
||||
play_state[msg.target.targetId]['active'] = False # 将对象标记为非活跃状态
|
||||
play_state[msg.target.targetId]['ccode']['active'] = False # 将对象标记为非活跃状态
|
||||
|
||||
async def timer(start): # 计时器函数
|
||||
if play_state[msg.target.targetId]['active']: # 检查对象是否为活跃状态
|
||||
if play_state[msg.target.targetId]['ccode']['active']: # 检查对象是否为活跃状态
|
||||
if datetime.now().timestamp() - start > 60 * set_timeout: # 如果超过2分钟
|
||||
await msg.sendMessage(
|
||||
msg.locale.t('chemical_code.message.timeup', answer=play_state[msg.target.targetId]["answer"]))
|
||||
play_state[msg.target.targetId]['active'] = False
|
||||
play_state[msg.target.targetId]['ccode']['active'] = False
|
||||
else: # 如果未超时
|
||||
await asyncio.sleep(1) # 等待1秒
|
||||
await timer(start) # 重新调用计时器函数
|
||||
|
@ -240,10 +240,10 @@ async def chemical_code(msg: Bot.MessageSession, id=None, captcha_mode=False):
|
|||
else:
|
||||
result = await msg.waitNextMessage(
|
||||
[Image(newpath), Plain(msg.locale.t('chemical_code.message.captcha', times=set_timeout))])
|
||||
if play_state[msg.target.targetId]['active']: # 检查对象是否为活跃状态
|
||||
if play_state[msg.target.targetId]['ccode']['active']: # 检查对象是否为活跃状态
|
||||
if result.asDisplay(text_only=True) == csr['name']:
|
||||
await result.sendMessage(msg.locale.t('chemical_code.message.correct'))
|
||||
else:
|
||||
await result.sendMessage(
|
||||
msg.locale.t('chemical_code.message.incorrect', answer=play_state[msg.target.targetId]["answer"]))
|
||||
play_state[msg.target.targetId]['active'] = False
|
||||
play_state[msg.target.targetId]['ccode']['active'] = False
|
||||
|
|
|
@ -5,7 +5,7 @@ import uuid
|
|||
from core.builtins import Bot
|
||||
from core.component import module
|
||||
|
||||
r = module('random', alias={'rand': 'random', 'rng': 'random'},
|
||||
r = module('random', alias=['rand', 'rng'],
|
||||
developers=['Dianliang233', 'DoroWolf'], desc='{random.help.desc}', )
|
||||
|
||||
|
||||
|
|
|
@ -1,85 +0,0 @@
|
|||
import random
|
||||
import itertools
|
||||
|
||||
from core.builtins import Bot
|
||||
from core.component import module
|
||||
from simpleeval import seval
|
||||
|
||||
def calc(expression):
|
||||
try:
|
||||
return seval(expression)
|
||||
except:
|
||||
return None
|
||||
|
||||
def is_valid(expression):
|
||||
operators = ['+', '-', '*', '/']
|
||||
numbers = [str(i) for i in range(1, 10)]
|
||||
return all(char in numbers + operators + ['(', ')'] for char in expression)
|
||||
|
||||
def has_solution(numbers):
|
||||
permutations = list(itertools.permutations(numbers))
|
||||
operators = ['+', '-', '*', '/']
|
||||
expressions = list(itertools.product(operators, repeat=3))
|
||||
|
||||
for perm in permutations:
|
||||
for expr in expressions:
|
||||
exp = '((( {} {} {} ) {} {} ) {} {} )'.format(perm[0], expr[0], perm[1], expr[1], perm[2], expr[2], perm[3])
|
||||
if calc(exp) == 24:
|
||||
return True
|
||||
exp = '(( {} {} {} ) {} ( {} {} {} ))'.format(perm[0], expr[0], perm[1], expr[1], perm[2], expr[2], perm[3])
|
||||
if calc(exp) == 24:
|
||||
return True
|
||||
exp = '( {} {} ( {} {} ( {} {} {} )))'.format(perm[0], expr[0], perm[1], expr[1], perm[2], expr[2], perm[3])
|
||||
if calc(exp) == 24:
|
||||
return True
|
||||
return False
|
||||
|
||||
tf = module('twenty_four', alias=['twentyfour', '24'],
|
||||
desc='{twenty_four.help.desc}', developers=['DoroWolf'])
|
||||
play_state = {}
|
||||
|
||||
|
||||
@tf.command('{{twenty_four.help}}')
|
||||
async def _(msg: Bot.MessageSession):
|
||||
if msg.target.targetId in play_state and play_state[msg.target.targetId][
|
||||
'active']:
|
||||
if play_state[msg.target.targetId]['game'] == '24':
|
||||
await msg.finish(msg.locale.t('twenty_four.message.running'))
|
||||
else:
|
||||
await msg.finish(msg.locale.t('twenty_four.message.running.others'))
|
||||
play_state.update({msg.target.targetId: {'game': '24', 'active': True}})
|
||||
|
||||
numbers = [random.randint(1, 13) for _ in range(4)]
|
||||
has_solution_flag = has_solution(numbers)
|
||||
|
||||
answer = await msg.waitNextMessage(msg.locale.t('twenty_four.message', numbers=numbers))
|
||||
expression = answer.asDisplay(text_only=True)
|
||||
if play_state[msg.target.targetId]['game'] == '24' and play_state[msg.target.targetId]['active']:
|
||||
if expression.lower() in ['无解', 'none']:
|
||||
if has_solution_flag:
|
||||
await answer.sendMessage(msg.locale.t('twenty_four.message.incorrect.have_solution'))
|
||||
else:
|
||||
await answer.sendMessage(msg.locale.t('twenty_four.message.correct'))
|
||||
elif is_valid(expression):
|
||||
result = calc(expression)
|
||||
if result == 24:
|
||||
await answer.sendMessage(msg.locale.t('twenty_four.message.correct'))
|
||||
else:
|
||||
await answer.sendMessage(msg.locale.t('twenty_four.message.incorrect'))
|
||||
else:
|
||||
await answer.sendMessage(msg.locale.t('twenty_four.message.incorrect.error'))
|
||||
play_state[msg.target.targetId]['active'] = False
|
||||
|
||||
|
||||
|
||||
@tf.command('stop {{twenty_four.stop.help}}')
|
||||
async def s(msg: Bot.MessageSession):
|
||||
state = play_state.get(msg.target.targetId, False)
|
||||
if state:
|
||||
if state['active']:
|
||||
play_state[msg.target.targetId]['active'] = False
|
||||
await msg.sendMessage(msg.locale.t('twenty_four.stop.message'))
|
||||
else:
|
||||
await msg.sendMessage(msg.locale.t('twenty_four.stop.message.other'))
|
||||
else:
|
||||
await msg.sendMessage(msg.locale.t('twenty_four.stop.message.none'))
|
|
@ -1,2 +0,0 @@
|
|||
{
|
||||
}
|
Reference in a new issue