【问题标题】:discord.py - How do i send a message on a just created channel?discord.py - 我如何在刚刚创建的频道上发送消息?
【发布时间】:2022-04-05 22:21:09
【问题描述】:

我正在构建一个票务机器人,每次有人对“票证”类别中的消息做出反应时,它都会创建一个频道,如何获取频道 obj 以便机器人可以在那里发送消息?

我有这个:

@client.event
async def on_raw_reaction_add(payload):
    channel = client.get_channel(payload.channel_id)
    client.get_channel(payload.message_id)
    msg = await channel.fetch_message(payload.message_id)
    guild = client.get_guild(payload.guild_id)
    f = open("ticket_nums.txt", "w+")
    overwrites = {
        guild.default_role: discord.PermissionOverwrite(read_messages=False),
        payload.member: discord.PermissionOverwrite(read_messages=True)
    }
    if True: #r_msg_id == "720708414107287724": commented out because it doesn't work idk why
        if not payload.user_id == "718528256365559829":
            await msg.remove_reaction("\U0001f4e8", discord.Object(id=user_id))
            await client.get_channel(719621258106372219).create_text_channel(r"ticket#" , overwrites=overwrites) 

在打开应该包含票数的ticket_nums文件时,它总是给我这个错误:(每次我尝试打开文件时都会给它)

Traceback (most recent call last):
  File "C:\Users\giaco\Desktop\Bot\Discord Bot\bot_discord.py", line 216, in on_raw_reaction_add
    f = open("ticket_nums.txt", "w+")
PermissionError: [Errno 13] Permission denied: 'ticket_nums.txt'

【问题讨论】:

    标签: python discord discord.py


    【解决方案1】:

    对于在新创建的频道中发送消息,您可以在创建频道时设置一个变量。

    ticket_channel = await category.create_text_channel(r"ticket#" , overwrites=overwrites)
    

    然后你可以使用普通的TextChannel.send() 方法。

    【讨论】:

      【解决方案2】:

      创建通道时,它会返回通道对象。多亏了这个,你可以把它放到一个变量中,然后send()它:

      channel = await category.create_text_channel(...)
      await channel.send("Hey! I just created this channel!")
      

      至于您的Permission denied 错误,我怀疑您需要提升帐户的权限。要让程序拥有必要的权限,您可以以管理员身份运行您正在使用的任何 IDE:

      右键单击 > 以管理员身份运行 > 允许 > 运行您的脚本


      参考资料:

      【讨论】:

      • 使用您已有的代码,您只需从我的答案中写下一行。如果您在我添加的两行中都添加了,它将创建两个通道。只需在您的await category.create_text_channel(... 前面添加channel = ,它就会如您所愿。要么这样,要么你有两个正在运行的机器人实例。
      • 那么我怀疑你有两个机器人实例正在运行。如果您没有使用像 PyCharm 这样可以轻松停止脚本的 IDE(或者如果您在任务管理器中找不到它),那么您可能需要重新启动 PC。 (仅供参考,您为频道提供的变量名称 new_ticket = 与您的 await new_channel.send(...) 不匹配。
      • get_channel() takes an ID,你给它一个通道对象。另外,new_ticket_obj是通道对象,所以不需要使用get_channe()。只需await new_ticket_obj.say(....) 就足够了。
      • 在new_ticket 之后不需要.channel,因为new_ticket 是频道。它有 send() 协程。只需await new_ticket.send(...) 就足够了。见here。
      • 如果您愿意,可以发送成员标签,我只是将括号打开以显示协程的语法。 await new_ticket.send(membertag, embed=embed) 仍然有效。
      猜你喜欢
      • 2012-12-19
      • 1970-01-01
      • 2018-12-15
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多