Archived
1
0
Fork 0
This commit is contained in:
多羅狼 2023-06-06 11:18:43 +08:00 committed by GitHub
parent 97c6312f7b
commit 53ceb4933d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 12 additions and 106 deletions

View file

@ -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": "(请使用指定的词语回复本条消息)",

View file

@ -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 IDID 留空将会使用缺省值 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

View file

@ -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}', )

View file

@ -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'))

View file

@ -1,2 +0,0 @@
{
}