diff --git a/modules/dice/__init__.py b/modules/dice/__init__.py index 04b1ec63..d2ba30ba 100644 --- a/modules/dice/__init__.py +++ b/modules/dice/__init__.py @@ -26,6 +26,18 @@ async def _(msg: Bot.MessageSession): await msg.finish(await process_expression(msg, f'{groups[0]}D{dice_type}', int(roll_time), None)) +@dice.command('set {{dice.help.set}}', required_admin=True) +async def _(msg: Bot.MessageSession, face: int): + if face > 0: + msg.data.edit_option('dice_default_face', face) + await msg.finish(msg.locale.t("success")) + elif face == 0: + msg.data.edit_option('dice_default_face', None) + await msg.finish(msg.locale.t("none")) + else: + await msg.finish(msg.locale.t("dice.message.error.value.n.invalid")) + + @dice.command('rule {{dice.help.rule}}', required_admin=True) async def _(msg: Bot.MessageSession): dc_rule = msg.data.options.get('dice_dc_reversed') @@ -35,4 +47,4 @@ async def _(msg: Bot.MessageSession): await msg.finish(msg.locale.t("dice.message.rule.disable")) else: msg.data.edit_option('dice_dc_reversed', True) - await msg.finish(msg.locale.t("dice.message.rule.enable")) + await msg.finish(msg.locale.t("dice.message.rule.enable")) \ No newline at end of file diff --git a/modules/dice/dice.py b/modules/dice/dice.py index c7ab5820..6717160d 100644 --- a/modules/dice/dice.py +++ b/modules/dice/dice.py @@ -85,9 +85,10 @@ class Dice(DiceItemBase): def GetArgs(self, msg): dice_code = self.code.upper() # 便于识别 + dice_code = dice_code.replace("D%", "D100") # 百分骰别名 dice_count = '1' # 骰子数量 advantage = '0' # 保留的骰子量 - if re.search(r'[^0-9DKQ]', dice_code): + if re.search(r'[^0-9DKQ\%]', dice_code): raise DiceSyntaxError(msg, msg.locale.t("dice.message.error.invalid")) temp = dice_code.split('D') if len(temp[0]): @@ -200,7 +201,7 @@ class FateDice(DiceItemBase): def Roll(self, msg, use_markdown=False): output = '' result = 0 - output += self.code + ' = ' + output += self.code + '=' dice_results = ['-', '-', '0', '0', '+', '+'] selected_results = [secrets.choice(dice_results) for _ in range(self.count)] @@ -212,7 +213,7 @@ class FateDice(DiceItemBase): elif res == '+': result += 1 - self.detail = output + f" = {result}" + self.detail = output + f"={result}" self.result = result def GetArgs(self, msg): @@ -233,21 +234,22 @@ async def process_expression(msg, expr: str, times: int, dc): def parse_dice_expression(msg, dices): dice_item_list = [] patterns = [ - r'((?:\d+)?D\d+(?:(?:K|Q)?(?:\d+)?)?)', # 普通骰子 + r'((?:\d+)?D(?:\d+|\%)?(?:(?:K|Q)?(?:\d+)?)?)', # 普通骰子 r'((?:\d+)?D?F)', # 命运骰子 r'(\d+)', # 数字 r'(\(|\))', # 括号 ] errmsg = None - if re.search(r'[^0-9+\-\*/()DFKQ]', dices.upper()): + if re.search(r'[^0-9+\-\*/\%()DFKQ]', dices.upper()): return None, None, DiceSyntaxError(msg, msg.locale.t('dice.message.error.invalid')).message - if dices.count('(') != dices.count(')'): - return None, None, DiceSyntaxError(msg, msg.locale.t('dice.message.error.parentheses')).message # 切分骰子表达式 dice_expr_list = re.split('|'.join(patterns), dices, flags=re.I) - dice_expr_list = [item for item in dice_expr_list if item] # 清除空白字符串 - Logger.debug(dice_expr_list) + dice_expr_list = [item for item in dice_expr_list if item] # 清除空白元素 + for item in range(len(dice_expr_list)): + if dice_expr_list[item][-1].upper() == 'D' and msg.data.options.get('dice_default_face'): + dice_expr_list[item] += str(msg.data.options.get('dice_default_face')) + Logger.info(dice_expr_list) for item in dice_expr_list: for pattern in patterns: @@ -332,6 +334,8 @@ def generate_dice_message(msg, expr, dice_expr_list, dice_count, times, dc, use_ Logger.debug(dice_res_list) try: result = int(simple_eval(''.join(dice_res_list))) + except SyntaxError: + return DiceSyntaxError(msg, msg.locale.t('dice.message.error.syntax')).message except Exception as e: return DiceValueError(msg, msg.locale.t('dice.message.error') + '\n' + str(e)).message output_line += '=' + str(result) diff --git a/modules/dice/locales/en_us.json b/modules/dice/locales/en_us.json index 13cb7e5a..a3ac5b43 100644 --- a/modules/dice/locales/en_us.json +++ b/modules/dice/locales/en_us.json @@ -3,23 +3,24 @@ "dice.help.desc": "Random dice. You can specify the number of dice rolls and DC check.", "dice.help.regex.desc": "(扔|投|掷|丢)个[面]骰子 Roll the specified dice.", "dice.help.rule": "Modify the check rule of DC.", + "dice.help.set": "Set the default sides number of dice.", "dice.message.dc.check": "▷ Success: ${success} Failure: ${failed}", "dice.message.dc.failed": " Failed!", "dice.message.dc.invalid": "Invalid DC: ", "dice.message.dc.success": " Success!", "dice.message.error": "Unable to parse the dice expression: ", "dice.message.error.invalid": "Unrecognized characters in dice expression.", - "dice.message.error.parentheses": "Parentheses in dice expression not closed.", "dice.message.error.prompt": "Item ${i} occurs: ", + "dice.message.error.syntax": "Invalid dice expression.", "dice.message.error.value": "Input \"${value}\". ", "dice.message.error.value.k.invalid": "Invalid advantages and disadvantages.", "dice.message.error.value.k.out_of_range": "The number of advantage and disadvantage dice is greater than the total number of dice.", "dice.message.error.value.m.invalid": "Invalid number of dice.", "dice.message.error.value.n.d1": "D1?", - "dice.message.error.value.n.invalid": "Invalid number of sides of the die.", - "dice.message.error.value.n.less_2": "The number of sides of the die cannot be less than 2.", + "dice.message.error.value.n.invalid": "Invalid sides number of dice.", + "dice.message.error.value.n.less_2": "The sides number of dice cannot be less than 2.", + "dice.message.error.value.N.out_of_range": "The number of dice roll cannot be less than 1 or greater than ${max}.", "dice.message.error.value.n.out_of_range": "The number of dice cannot be less than 1 or greater than ${max}.", - "dice.message.error.value.N.out_of_range": "The number of die rolls cannot be less than 1 or greater than ${max}.", "dice.message.error.value.too_long": "The number of items in the dice expression exceeds the limit.", "dice.message.error.value.y.invalid": "Invalid adjustment value.", "dice.message.error.value.y.out_of_range": "The adjustment value cannot be less than ${min} or greater than ${max}.", diff --git a/modules/dice/locales/zh_cn.json b/modules/dice/locales/zh_cn.json index 4a496201..99c23645 100644 --- a/modules/dice/locales/zh_cn.json +++ b/modules/dice/locales/zh_cn.json @@ -3,14 +3,15 @@ "dice.help.desc": "随机骰子,可指定投骰次数与 DC 判断判定。", "dice.help.regex.desc": "(扔|投|掷|丢)个[面]骰子[次] 投掷指定骰子。", "dice.help.rule": "修改 DC 的判定规则。", + "dice.help.set": "设置默认骰子面数。", "dice.message.dc.check": "▷ 判定成功数量:${success} 判定失败数量:${failed}", "dice.message.dc.failed": " 判定失败!", "dice.message.dc.invalid": "无效的 DC:", "dice.message.dc.success": " 判定成功!", "dice.message.error": "无法解析骰子表达式:", - "dice.message.error.prompt": "第 ${i} 项发生:", "dice.message.error.invalid": "骰子表达式中存在无法识别的字符。", - "dice.message.error.parentheses": "骰子表达式中的括号未闭合。", + "dice.message.error.prompt": "第 ${i} 项发生:", + "dice.message.error.syntax": "无效的骰子表达式。", "dice.message.error.value": "输入为“${value}”,", "dice.message.error.value.k.invalid": "无效的优劣势。", "dice.message.error.value.k.out_of_range": "优劣势骰数大于总骰子数。", diff --git a/modules/dice/locales/zh_tw.json b/modules/dice/locales/zh_tw.json index 1bddefe6..e4a25def 100644 --- a/modules/dice/locales/zh_tw.json +++ b/modules/dice/locales/zh_tw.json @@ -3,23 +3,24 @@ "dice.help.desc": "隨機骰子,可指定投骰次數與 DC 判斷判定。", "dice.help.regex.desc": "(扔|投|擲|丟)個[面]骰子[次] 投擲指定骰子。", "dice.help.rule": "修改 DC 的判定規則。", + "dice.help.set": "设置默认骰子面数。", "dice.message.dc.check": "▷ 判定成功數量:${success} 判定失敗數量:${failed}", "dice.message.dc.failed": " 判定失敗!", "dice.message.dc.invalid": "無效的 DC:", "dice.message.dc.success": " 判定成功!", "dice.message.error": "無法解析骰子運算式:", - "dice.message.error.prompt": "第 ${i} 項發生:", "dice.message.error.invalid": "骰子語句中存在無法辨識的字元。", + "dice.message.error.prompt": "第 ${i} 項發生:", + "dice.message.error.syntax": "無效的骰子運算式。", "dice.message.error.value": "輸入為「${value}」,", "dice.message.error.value.k.invalid": "無效的優劣勢。", - "dice.message.error.parentheses": "骰子運算式中的括號未關閉。", "dice.message.error.value.k.out_of_range": "優劣势骰數大於總骰子數。", "dice.message.error.value.m.invalid": "無效的骰子數量。", "dice.message.error.value.n.d1": "1 面的骰子?", "dice.message.error.value.n.invalid": "無效的骰子面數。", "dice.message.error.value.n.less_2": "骰子面數不得小於 2。", - "dice.message.error.value.N.out_of_range": "投骰次數不得小於 1 或大於 ${max}。", "dice.message.error.value.n.out_of_range": "骰子數量不得小於 1 或大於 ${max}。", + "dice.message.error.value.N.out_of_range": "投骰次數不得小於 1 或大於 ${max}。", "dice.message.error.value.too_long": "骰子運算式項數超過限制。", "dice.message.error.value.y.invalid": "無效的調整值項。", "dice.message.error.value.y.out_of_range": "調整值不得小於 ${min} 或大於 ${max}。",