【问题标题】:Only send welcome DM to users of specific server in discord.py仅向 discord.py 中特定服务器的用户发送欢迎 DM
【发布时间】:2021-01-06 05:45:18
【问题描述】:

我有一个驻留在多台服务器中的不和谐机器人,但是我想为每台服务器提供加入消息,或者确保我的机器人只向加入其中一个服务器的人发送欢迎消息。

@client.event #Send new members of the server a message
async def on_member_join(member): #Run when a member joins
    await member.create_dm() #Create a DM chat with the new user
    await member.dm_channel.send(f"Heya, {member.name}! [ETC OF WELCOME MESSAGE]")
    print(f'User DM sent:\n----------\nUser: {member.name}\n----------')

根据文档,on_member_join的唯一参数是member,所以这不可能吗? 我一直在尝试根据服务器 ID 发送 DM。 经过一番研究,我看到了ctx.author.send,但是没有用:

  File "REDACTED", line 312, in _run_event
    await coro(*args, **kwargs)
  File "REDACTED", line 34, in on_member_join
    await ctx.author.send(f"Heya, {member.name}! REDACTED")
AttributeError: 'Member' object has no attribute 'author'

这是当前形式的完整代码。

@client.event
async def on_member_join(ctx):
    current_server = ctx.guild.id
    if current_server == server_id:
        await ctx.author.send(f"Heya, {member.name}! REDACTED")
        print(f'User DM sent:\n----------\nUser: {member.name}\n----------')

【问题讨论】:

  • 为什么不能将上一个示例中的 if 与第一个示例中的 DM 代码结合起来,仅向一个服务器发送欢迎消息?
  • @mousetail 我试过了,这会产生我上面写的错误。
  • 在这种情况下您会遇到什么错误?成员没有“作者”,所以第二个例子没有意义。

标签: python discord


【解决方案1】:

文档here 提供了 on_member_join 事件的签名。因此,您可以使用事件提供的成员对象来获取加入的服务器的 id,并将其与存储的公会 id 进行比较。

对于单个服务器:

# stored_guild_id must be defined before this code appears

@client.event
async def on_member_join(member: discord.Member):
    if member.guild.id == stored_guild_id:
        await member.send(f"Welcome to the server!")

如果您有一堆服务器,您可以使用服务器列表:

# stored_guild_ids must be defined above this code. For example:
# stored_guild_ids = [id1, id2]
# where id1 and id2 are guild ids

@client.event
async def on_member_join(member: discord.Member):
    if member.guild.id in stored_guild_ids:
        await member.send(f"Welcome to the server!")

您也可以将其存储为字典,并为每个服务器设置单独的问候语。

# welcome_messages must be defined. For example:
# welcome_messages = {
#    guild_id: "Welcome there!", 
#    guild_id2: 'Hello there!'
#  }
# Again guild_id and guild_id2 are actual guild ids

@client.event
async def on_member_join(member: discord.Member):
    if member.guild.id in welcome_messages.keys():
        await member.send(welcome_messages[member.guild.id])

根据用例,这也可以扩展为将欢迎消息存储在文件中,并具有使用命令从 discord 编辑欢迎消息的命令。您还可以将消息设置为具有以下字段: welcome_messages = {my_guild_id: "Hello {0}! Welcome to server") 并使用 await member.send(welcome_messages[guild_id].format(member.mention)) 这将替换 0 并提及新用户。

【讨论】:

  • 希望这条评论不会打扰,但您建议的代码似乎已停止工作?我查看了文档,但看不到任何可以解释它的更改。你知道为什么吗?
  • 你的意思是它已经停止工作了?消息没有发送/提及不起作用/是否有任何错误?使用上述信息提出一个新问题可能会更好。
猜你喜欢
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 2021-02-24
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 2021-08-17
相关资源
最近更新 更多