You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为discord.ui.Select中的单个选项设置冷却时间?

为Discord.py选择菜单的单个选项设置冷却时间

因为@commands.cooldown装饰器作用于整个回调方法,会对所有选项生效,所以需要手动为特定选项实现冷却逻辑,用commands.CooldownMapping单独管理目标选项的冷却状态:

  1. 在Balselect类的初始化方法中,创建专属的冷却映射:
from discord.ext import commands

class Balselect(discord.ui.View):
    def __init__(self, roles):
        super().__init__()
        self.roles = roles
        # 初始化冷却规则:1次/3600秒,按用户维度区分
        self.collect_cooldown = commands.CooldownMapping.from_cooldown(1, 3600, commands.BucketType.user)
  1. 修改回调方法,移除全局的冷却装饰器,在内部针对目标选项做冷却检查:
@discord.ui.select(
        placeholder="Выберите действие",
        min_values=1,
        max_values=1,
        options=[
            discord.SelectOption(
                label="Собрать Коллект",
                description="Получить доход вашего гос-ва"
            ),
            discord.SelectOption(
                label="Экономика",
                description="Меняйте уровень экономики страны"
            ),
            discord.SelectOption(
                label="Уровень жизни",
                description = "Развивайте вашу страну"
            ),
            discord.SelectOption(
                label="Магазин",
                description="Покупайте военное оборудование"
            ),
            discord.SelectOption(
                label="Управление страной",
                description="Распоряжайтесь вашим гос-вом"
            ),
            discord.SelectOption(
                label="Инвентарь",
                description="Просмотрите ваш инвентарь"
            )
        ]
    )
    async def balselect(self, interaction, select):
        global inf, inf1, inf2, med, med1, med2, ind, ind1, ind2, res, res1, res2, tech, tech1, tech2, bruh, bruuh, cost, bemz, beemz, infrole1, medrole1, indrole1, resrole1, techrole1, infrole2, medrole2, indrole2, resrole2, techrole2
        
        selected_option = select.values[0]
        if selected_option == "Собрать Коллект":
            # 获取当前用户的冷却桶
            bucket = self.collect_cooldown.get_bucket(interaction)
            # 检查冷却状态
            retry_after = bucket.update_rate_limit()
            if retry_after:
                await interaction.response.send_message(
                    f"Подождите {int(retry_after)} секунд, прежде чем снова собирать коллект!",
                    ephemeral=True
                )
                return
            # 此处编写"Собрать Коллект"的业务逻辑
            # ...
        else:
            # 其他选项不受冷却限制,正常执行对应逻辑
            if selected_option == "Экономика":
                # ...
            elif selected_option == "Уровень жизни":
                # ...
            # 其他选项分支处理

核心说明

  • CooldownMapping会自动按用户维护冷却状态,无需手动记录用户冷却信息
  • bucket.update_rate_limit()返回None表示不在冷却中,返回数值则为剩余冷却时长(秒)
  • 使用ephemeral=True发送仅用户可见的提示,避免频道刷屏

内容的提问来源于stack exchange,提问作者Werfay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 07:23:27