如何将机器人消息发送到一台服务器中的多个通道(阅读正文以获取更多信息)
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_error
或 on_error
? (在您的项目中搜索def on_command_error
和def on_command
。如果是这样,您可能不会收到错误,因为异常已传递给该函数,因此您需要确保在不处理时重新引发异常. 如果您需要更多信息,请告诉我:D以上是关于如何将机器人消息发送到一台服务器中的多个通道(阅读正文以获取更多信息)的主要内容,如果未能解决你的问题,请参考以下文章
大开测试:性能- 如何解决负载均衡将压力作用到一台机器(连载15)