Discord.py 获取频道名称并在该频道上发送消息

Discord.py 获取频道名称并在该频道上发送消息,discord.py,discord.py-rewrite,Discord.py,Discord.py Rewrite,所以我在这里做一个小项目,我想有一个“请在此服务器中键入频道名称”的功能 差不多,机器人要求一个频道名称,我输入例如“#changelog”-然后它会要求在该频道中写什么,等等。 因此需要获取通道id(我猜是这样),但我不希望用户写入id,而只写入#服务器名称。然后,每当我这样做了,机器人就会在那个频道里写东西 这是我当前的代码 class Changelog(commands.Cog): def __init__(self, client): self.client

所以我在这里做一个小项目,我想有一个“请在此服务器中键入频道名称”的功能

差不多,机器人要求一个频道名称,我输入例如“#changelog”-然后它会要求在该频道中写什么,等等。 因此需要获取通道id(我猜是这样),但我不希望用户写入id,而只写入#服务器名称。然后,每当我这样做了,机器人就会在那个频道里写东西

这是我当前的代码

class Changelog(commands.Cog):

    def __init__(self, client):
        self.client = client

    @commands.Cog.listener()
    async def on_ready(self):
        print('Changelog is loaded')

    @commands.command()
    async def clhook(self, ctx):
        await ctx.send('Write text-channel: ')
        text_channel = await self.client.wait_for("message", check=lambda message: message.author == ctx.author, timeout=300)
        clhook = self.client.get_channel(text_channel)


def setup(client):
    client.add_cog(Changelog(client))
编辑:
频道ID将被保存为“永远”,这意味着我不必在消息应该去的地方重新写入频道名称

您可以使用
消息。频道提到
。这将返回使用
#频道名称
符号提及的所有频道的
列表。这样,您就可以使用
channel.id
获取他们提到的频道的
id

但是,不要忘记检查用户是否确实标记了频道(您也可以将其放入
检查中)。我把它放在一个单独的函数中,为了这个回复,使它更具可读性,但是如果你真的想,你可以把它放在你的lambda中

另外,确保检查它是否是
文本频道
,而不是
语音频道
类别频道

@commands.command()
async def clhook(self, ctx):

    def check(self, message):
        author_ok = message.author == ctx.author  # Sent by the same author
        mentioned_channel = len(message.channel_mentions) == 1 and isinstance(message.channel_mentions[0], discord.TextChannel)
        return author_ok and mentioned_channel

    await ctx.send("Write text-channel: ")
    text_channel = await self.client.wait_for("message", check=check)
    chlhook = text_channel.channel_mentions[0]

我在前面提到的
通道上设置了两个条件,因为如果第一个条件失败,第二个条件可能导致索引器。或者,您也可以使用
if语句
在该位置更快地返回以解决相同的问题。

您可以使用
消息。channel_提到
。这将返回使用
#频道名称
符号提及的所有频道的
列表。这样,您就可以使用
channel.id
获取他们提到的频道的
id

但是,不要忘记检查用户是否确实标记了频道(您也可以将其放入
检查中)。我把它放在一个单独的函数中,为了这个回复,使它更具可读性,但是如果你真的想,你可以把它放在你的lambda中

另外,确保检查它是否是
文本频道
,而不是
语音频道
类别频道

@commands.command()
async def clhook(self, ctx):

    def check(self, message):
        author_ok = message.author == ctx.author  # Sent by the same author
        mentioned_channel = len(message.channel_mentions) == 1 and isinstance(message.channel_mentions[0], discord.TextChannel)
        return author_ok and mentioned_channel

    await ctx.send("Write text-channel: ")
    text_channel = await self.client.wait_for("message", check=check)
    chlhook = text_channel.channel_mentions[0]

我在前面提到的
通道上设置了两个条件,因为如果第一个条件失败,第二个条件可能导致索引器。或者,您也可以使用
if语句
在该位置更快地返回,以解决相同的问题。

您可以使用
discord.utils.get()
处理此示例:

text\u channel=wait self.client.wait\u for(“message”,check=lambda message:message.author==ctx.author,超时=300)
channel=discord.utils.get(ctx.guild.text\u channels,name=text\u channel)
等待频道发送('Bla-Bla')
因此,当您键入
(prefix)clhook
时,仅频道名称,例如general,它将
Bla Bla
发送到名为general的频道

还有另一种方法可以做到这一点,我认为它比第一种方法简单,如下所示:

@commands.command()
异步def clhook(self、ctx、channel:discord.TextChannel):
等待频道发送('Bla-Bla')

因此,在这个命令中,用法被更改。您可以将其与以下内容一起使用:
(前缀)clhook#general(提及频道)
。我建议使用此解决方案,而且我认为它更有用。

您可以使用
discord.utils.get()
和以下示例:

text\u channel=wait self.client.wait\u for(“message”,check=lambda message:message.author==ctx.author,超时=300)
channel=discord.utils.get(ctx.guild.text\u channels,name=text\u channel)
等待频道发送('Bla-Bla')
因此,当您键入
(prefix)clhook
时,仅频道名称,例如general,它将
Bla Bla
发送到名为general的频道

还有另一种方法可以做到这一点,我认为它比第一种方法简单,如下所示:

@commands.command()
异步def clhook(self、ctx、channel:discord.TextChannel):
等待频道发送('Bla-Bla')

因此,在这个命令中,用法被更改。您可以将其与以下内容一起使用:
(前缀)clhook#general(提及频道)
。我建议使用这个解决方案,我认为它更有用。

Ahhh我明白了,但是对于
chlhook
,频道名称是否会存储在那里?或者我如何像“test”一样向该频道发送消息?不,它不存储
名称
,但您将实际的
频道
实例从列表中拉出,因此您可以只执行
clhook.send()
向其发送消息,或者使用
clhook.id
获取其id。这样,您就不必使用
utils.get()
查找频道对象,因为您已经有了它。不过你可能想重新命名它,因为它可能会把事情搞砸(它与你的函数同名)。啊,我明白了,但是对于
chlhook
,频道名会被“存储”在那里吗?或者我如何像“test”一样向该频道发送消息?不,它不存储
名称
,但您将实际的
频道
实例从列表中拉出,因此您可以只执行
clhook.send()
向其发送消息,或者使用
clhook.id
获取其id。这样,您就不必使用
utils.get()
查找频道对象,因为您已经有了它。你可能想重新命名它,因为它可能会把事情搞砸(它和你的函数同名)。好吧,让我们看看我是否得到了这个。第一个错误是,
'NoneType'对象没有属性send
,这是一个cog。
self
是否必须包含在某个地方?或者这个错误是什么意思?它意味着通道不存在或者可能与自我有关。你试过第二个了吗