如何限制 on_message 回复(Discord Python 机器人)

2024-01-02

我正在制作一个 Discord 机器人,它可以执行各种操作,包括对提到该机器人的人做出反应,以及对某些用户在某个频道中所说的话做出反应。 我的代码(为了清楚起见缩短)是:

BOT = os.getenv('DISCORD_BOT_MENTION') 
CHANNEL = os.getenv('DISCORD_CHANNEL')
USER1 = os.getenv('DISCORD_USER1_ID')
USER2 = os.getenv('DISCORD_USER2_ID')

@bot.event 
async def on_message(message):  
    content = message.content # Did bot get mentioned?
    channel = message.channel # Where was the bot mentioned
    channel_ID = message.channel.id #
    user = message.author.name # Who mentioned the bot
    user_ID = message.author.id

    if user == client.user:
        return

    elif BOT in content:
        brankos_responses = [
            "Hello",
            "Hi",
        ]
        weights_responses = [
            15,
            10,
        ]
        response = random.choices(brankos_responses, weights_responses, k = 1)
        await asyncio.sleep(0.7) # Wait 0.7s before answering
        await channel.send(response[0])
    
    elif channel_ID == int(CHANNEL):
        if user_ID == int(USER_ID_1): 
            brankos_responses = [
                "Test Message 1 for User 1 in Channel",
                "Test Message 2 for User 1 in Channel",
            ]
            response = random.choice(brankos_responses)
            await channel.send(response)

        if user_ID == int(USER_id_2):
            brankos_responses = [
                "Test Message 1 for User 2 In Channel",
                "Test Message 2 for User 2 in Channel",
            ]
            response = random.choice(brankos_responses)
            await channel.send(response)

    else: 
        return

    await bot.process_commands(message)

然而我发现,如果你向机器人发送垃圾邮件,或者用户 1 和 2 在频道中交谈,它会继续给出回复,我想限制这一点。 在discord.py命令中很容易使用@commands.cooldown(1, 3600, commands.BucketType.user)例如,但是我拥有的不是命令,因此不能在这里使用。

我认为我可以让机器人休眠(使用await asyncio),当它注意到频道中来自其中一个用户的消息时,然后当该人在5秒内没有说什么时,它将运行代码并发送1 个回复,但这只会导致所有回复堆积起来,并在几秒钟后全部发送。

所以我的问题是:如何限制机器人给出的回复数量?

现在我正在尝试这个:

        user_list = [
            int(USER1_ID),
            int(USER2_ID),
            int(USER3_ID),
            int(USER4_ID),
        ]

        messages = 0 # Define the count
        
        if user_ID in user_list:
            messages += 1 # Add one to count
            print(messages)

            if messages > 5: # If messages is more than 5, execute code
                response = random.choice(brankos_responses)
                await channel.send(response)
                messages = 0 # Reset count

但因为它再次运行,它再次重置为 messages = 1,如果我将 messages = 0 放在函数之外,它就不起作用。


如果您的目的纯粹是让机器人及时冷却,那么您可以执行以下操作:

class StackOverflow(commands.Cog):
    def __init__(self, client):
        self.client = client
        self.last_timeStamp = datetime.datetime.utcfromtimestamp(0)

    @commands.Cog.listener()
    async def on_message(self, message):
        time_difference = (datetime.datetime.utcnow() - self.last_timeStamp).total_seconds()
        if time_difference < 120:
            # Don't do anything and return
            return

        else:
            #Do things
            self.last_timeStamp = datetime.datetime.utcnow()

这是在 Cog 中完成的,因此如果您想在 Cog 之外使用它,您可能必须进行更改。 如果您只想计算消息数,则只需使用一个 int 变量,对每条消息递增它并更改 if 语句。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何限制 on_message 回复(Discord Python 机器人) 的相关文章

  • 如何计算 pandas datetime 对象的均值和方差?

    如何计算 YYYY MM DD 形式的 python 日期时间对象的汇总统计数据 均值和标准差 我想对具有不同 ID 的不同日期时间对象组执行此操作 数据如下 import datetime as dt df pd DataFrame Da
  • 类的 IPython 表示

    我正在使用我创建的模块尝试 IPython 但它没有显示类对象的实际表示 相反 它显示类似的内容 TheClass module TheClass name I heavily在这个模块中使用元类 我有真正有意义的类表示 应该向用户显示 是
  • VSCode Settings.json 丢失

    我正在遵循教程 并尝试将 vscode 指向我为 Scrapy 设置的虚拟工作区 但是当我在 VSCode 中打开设置时 工作区设置 选项卡不在 用户设置 选项卡旁边 我还尝试通过以下方式手动转到文件 APPDATA Code User s
  • Python 内置的 super() 是否违反了 DRY?

    显然这是有原因的 但我没有足够的经验来认识到这一点 这是Python中给出的例子docs http docs python org 2 library functions html super class C B def method se
  • 如何使用 Selenium 和 ChromeDriver 解决 TypeError: 'module' object is not callable 错误 [重复]

    这个问题在这里已经有答案了 代码试验 from selenium import webdriver from selenium webdriver chrome options import Options as Chromeoptions
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 使用 python/numpy 重塑数组

    我想重塑以下数组 gt gt gt test array 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 为了得到 gt gt gt test2 array 11 12 21 22 13 14
  • Django 视图中的“请求”是什么

    在 Django 第一个应用程序的 Django 教程中 我们有 from django http import HttpResponse def index request return HttpResponse Hello world
  • 如何将 GAE 中一种 Kind 中的所有实体复制到另一种 Kind 中,而无需显式调用每个属性

    我们如何使用function clone entity 如中所述在 Python 中复制 Google App Engine 数据存储中的实体 而无需在 编译 时知道属性名称 https stackoverflow com question
  • pandas - 包含时间序列数据的堆积条形图

    我正在尝试使用时间序列数据在 pandas 中创建堆积条形图 DATE TYPE VOL 0 2010 01 01 Heavy 932 612903 1 2010 01 01 Light 370 612903 2 2010 01 01 Me
  • Pandas 组合不同索引的数据帧

    我有两个数据框df 1 and df 2具有不同的索引和列 但是 有一些索引和列重叠 我创建了一个数据框df索引和列的并集 因此不存在重复的索引或列 我想填写数据框df通过以下方式 for x in df index for y in df
  • 如何使用 AWS Lambda Python 读取 AWS S3 存储的 Word 文档(.doc 和 .docx)文件内容?

    我的场景是 我尝试使用 python 实现从 Aws Lambda 读取 AWS 存储的 S3 word 文档 doc 和 docx 文件内容 下面的代码是我使用的 我的问题是我可以获取文件名 但无法读取内容 def lambda hand
  • 为什么 csv.DictReader 给我一个无属性错误?

    我的 CSV 文件是 200 Service 我放入解释器的代码是 snav csv DictReader open screennavigation csv delimiter print snav fieldnames 200 for
  • Python:Goslate 翻译请求返回“503:服务不可用”[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们不允许提出寻求书籍 工具 软件库等推荐的问题 您可以编辑问题 以便用事实和引文来回答 这个问题似乎不是关于主要由程序员使用的特定编程问
  • 制作一份 Python 文档的 PDF 文件

    Python 官方网站提供 PDF 文档下载 但它们是按章节分隔的 我下载了源代码并构建了 PDF 文档 这些文档也是单独的 PDF 我怎么能够从源代码中的 Makefile 构建一个 PDF 文件 我认为这样阅读起来会更方便 如果连接单独
  • 等待子进程使用 os.system

    我用了很多os system在 for 循环内调用创建后台进程 如何等待所有后台进程结束 os wait告诉我没有子进程 ps 我使用的是Solaris 这是我的代码 usr bin python import subprocess imp
  • 在virtualenv中下载sqlite3

    我正在尝试使用命令创建应用程序python3 manage py startapp webapp但我收到一条错误消息 django core exceptions ImproperlyConfigured 加载时出错 pysqlite2 或
  • pandas.read_csv 将列名移动一倍

    我正在使用位于的 ALL zip 文件here http www fec gov disclosurep PDownload do 我的目标是用它创建一个 pandas DataFrame 但是 如果我跑 data pd read csv
  • 如何在 Flask 中的视图函数/会话之间传递复杂对象

    我正在编写一个 Web 应用程序 当 且仅当 用户登录时 该应用程序从第三方服务器接收大量数据 这些数据被解析为自定义对象并存储在list 现在 用户在应用程序中使用这些数据 调用不同的视图 例如发送不同的请求 我不确定什么是最好的模式在视
  • NLTK:查找单词大小为 2k 的上下文

    我有一个语料库 我有一个词 对于语料库中该单词的每次出现 我想获取一个包含该单词之前的 k 个单词和该单词之后的 k 个单词的列表 我在算法上做得很好 见下文 但我想知道 NLTK 是否提供了一些我错过的功能来满足我的需求 def size

随机推荐