如何将机器人消息发送到一台服务器中的多个通道(阅读正文以获取更多信息)

Posted

技术标签:

【中文标题】如何将机器人消息发送到一台服务器中的多个通道(阅读正文以获取更多信息)【英文标题】:How to sent a bot message to multiple channels in one server (Read the body for more information) 【发布时间】:2022-01-23 05:09:03 【问题描述】:

这是关于向不同的不和谐服务器发出警报,所以我向这台服务器发送一个命令,它将发送到我的机器人所在的所有服务器,在一个特定的频道中并 ping 一个特定的角色。 但我的新问题是我希望我的机器人同时在 3 个不同通道上的这 1 个特定服务器中发出警报,但它不起作用。它仅向每个服务器中的一个通道发出警报。 (**更新!这是我找到的替代方案,看起来机器人正在运行,但命令不起作用,我什至没有收到任何错误)

如果您感到困惑,#Bangers Den(服务器名称)/Low Float、Bangers Mid Large、Bangers Forex(这些是频道名称)。 #Banger 警报也是如此(不同的服务器)

这是我当前的代码! :)

@commands.has_permissions(kick_members=True)
async def alert(ctx, *, msg):#ALERT
    
    data = 
  922874978528034886 : [922875504959295579, 922874978528034888], #Banger Alerts / Server ID, Channel Name, Role ID
  884931761610563595 : [921234942405525504, 884974424468623411], #Bangers Den / Low Float
  884931761610563595 : [921890822100758528, 884974424468623411], #Bangers Den / Bangers Mid Large
  884931761610563595 : [921907840967397476, 884974424468623411], #Bangers Den / Bangers Forex
  

    for guild_id in data.keys():
        
        guild = discord.utils.get(client.guilds, id=guild_id)
        channel = discord.utils.get(guild.channels, id=data [guild_id][0])
        role = discord.utils.get(guild.roles, id=data [guild_id][1])  
        one = Button(style=ButtonStyle.URL, label='Twitter', url="https://twitter.com/Wafaduck")
        embed=discord.Embed(title= ':moneybag: **Alert** :moneybag:', description= (msg), color=0x00FF00, timestamp=datetime.datetime.utcnow())
        embed.set_thumbnail(url='https://cdn.discordapp.com/attachments/872295537544679484/922881014852898826/IMG_20211221_001839.jpg')
        embed.set_footer(icon_url = ctx.author.avatar_url, text='Powered by Duck Programming',)
        await channel.send(content=f"role.mention")                 
        await channel.send(embed=embed)```

**UPDATED**
Here's the updated one where I'm facing an issue that the bot runs but the commands wouldn't work,  I don't even get any error.
```@client.command() #v1
@commands.has_permissions(kick_members=True)
async def alert(ctx, *, msg):#ALERT
    
    data = 
  884931761610563595 : [[921234942405525504, 884974424468623411, 922895552155357214], #Bangers Den / Low Float / Premium / 2 roles 
                        [921890822100758528, 884974424468623411, 922895552155357214], #Bangers Den / Mid Large / Premium / 2 roles 
                        [921907840967397476, 884974424468623411, 922895552155357214]],#Bangers Den / Forex / Premium  / 2 roles
  875629371824697384 : [[923064332156276756, 900029600028033074]] #Different server with one role.
  
       

    for guild_id, entries in data.items():
        for channel_id, role_ids in entries:
            guild = discord.utils.get(client.guilds, id=guild_id)
            channel = discord.utils.get(guild.channels, id=channel_id)
            role = (discord.utils.get(guild.roles, id=role_id).mention for role_id in role_ids) 
            embed=discord.Embed(title= '???? **Alert** ????', description= (msg),color=0x00FF00, timestamp=datetime.datetime.utcnow())
            embed.set_thumbnail(url='https://cdn.discordapp.com/attachments/872295537544679484/922881014852898826/IMG_20211221_001839.jpg')
            embed.set_footer(icon_url = ctx.author.avatar_url, text='Powered by Duck Programming',)
            await channel.send(content=f"role")                 
            await channel.send(embed=embed)```

【问题讨论】:

【参考方案1】:

您面临的问题是字典(您的数据变量)将使用相同的键压缩其所有内容。

您可以通过在定义变量数据后立即打印它来看到它

>>> data = 
...   922874978528034886 : [922875504959295579, 922874978528034888], #Banger Alerts / Server ID, Channel Name, Role ID
...   884931761610563595 : [921234942405525504, 884974424468623411], #Bangers Den / Low Float
...   884931761610563595 : [921890822100758528, 884974424468623411], #Bangers Den / Bangers Mid Large
...   884931761610563595 : [921907840967397476, 884974424468623411], #Bangers Den / Bangers Forex
...   
>>> data
922874978528034886: [922875504959295579, 922874978528034888], 884931761610563595: [921907840967397476, 884974424468623411]
>>> data.keys()
dict_keys([922874978528034886, 884931761610563595])

你看到 data.keys() 只是一个包含 2 个元素的列表

你将不得不重新考虑你的 data 变量结构,也许也可以使用 JSON,它可能会很有用:)

【讨论】:

你好!是的,我意识到使用 dict 和 data 我应该有一组唯一的键。所以我确实尝试将它切换到这个(哎呀,我想我不能在这里发布整个代码。查看我上面的主要帖子^我为你编辑并更新了帖子。) @Wafaduck 你有没有机会在你的机器人中重新定义函数 on_command_erroron_error ? (在您的项目中搜索def on_command_errordef on_command。如果是这样,您可能不会收到错误,因为异常已传递给该函数,因此您需要确保在不处理时重新引发异常. 如果您需要更多信息,请告诉我:D

以上是关于如何将机器人消息发送到一台服务器中的多个通道(阅读正文以获取更多信息)的主要内容,如果未能解决你的问题,请参考以下文章

如何制作一个侦听消息并将它们发送到另一台服务器的机器人?

大开测试:性能- 如何解决负载均衡将压力作用到一台机器(连载15)

尝试向多个 Discord 频道发送消息

消息中间件

使用电报机器人 api、python 3 和 JobQueue 将消息发送到通道的方法

添加到其他人服务器的 Discord Bot 如何获取他们希望它发送消息的通道 ID?