diff --git a/bot.py b/bot.py index eb764c1e9..c4e7cddff 100644 --- a/bot.py +++ b/bot.py @@ -15,7 +15,6 @@ import platform import traceback from pathlib import Path from rich.traceback import install -from random import randint # maim_message imports for console input @@ -25,6 +24,9 @@ initialize_logging() from src.main import MainSystem #noqa from src.manager.async_task_manager import async_task_manager #noqa +from colorama import init, Fore +import random +from typing import List, Sequence, Optional @@ -63,17 +65,48 @@ async def request_shutdown() -> bool: logger.error(f"请求关闭程序时发生错误: {e}") return False +def weighted_choice(data: Sequence[str], + weights: Optional[List[float]] = None) -> str: + """ + 从 data 中按权重随机返回一条。 + 若 weights 为 None,则所有元素权重默认为 1。 + """ + if weights is None: + weights = [1.0] * len(data) + + if len(data) != len(weights): + raise ValueError("data 和 weights 长度必须相等") + + # 计算累计权重区间 + total = 0.0 + acc = [] + for w in weights: + total += w + acc.append(total) + + if total <= 0: + raise ValueError("总权重必须大于 0") + + # 随机落点 + r = random.random() * total + # 二分查找落点所在的区间 + left, right = 0, len(acc) - 1 + while left < right: + mid = (left + right) // 2 + if r < acc[mid]: + right = mid + else: + left = mid + 1 + return data[left] def easter_egg(): # 彩蛋 - from colorama import init, Fore - init() - a = randint(1,11) - if a<2: - text = "喵喵~你的麦麦被猫娘入侵了喵~" - else: - text = "多年以后,面对AI行刑队,张三将会回想起他2023年在会议上讨论人工智能的那个下午" + items = ["多年以后,面对AI行刑队,张三将会回想起他2023年在会议上讨论人工智能的那个下午", + "你知道吗?诺狐的耳朵很软,很好rua", + "喵喵~你的麦麦被猫娘入侵了喵~"] + w = [10, 5, 2] + text = weighted_choice(items, w) rainbow_colors = [Fore.RED, Fore.YELLOW, Fore.GREEN, Fore.CYAN, Fore.BLUE, Fore.MAGENTA] rainbow_text = "" for i, char in enumerate(text):