获取频道名称并通过该频道发送消息

时间:2020-09-26 22:43:26

标签: discord.py discord.py-rewrite

因此,我在这里正在做一个小项目,几乎,我想拥有一种“请在此服务器中输入频道名称”功能。

几乎,机器人要求输入频道名称,我输入例如“ #changelog”-然后它将询问在该频道中应写的内容,等等。 因此,需要获取通道ID(我猜是这样),但我不希望用户写ID,而只写#server-name。然后,每当我这样做时,该bot就会在该通道中编写。

这是我当前的代码!

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应该“永远”保存,这意味着我不必在消息应到达的位置重新编写频道名称!

2 个答案:

答案 0 :(得分:1)

您可以使用message.channel_mentions。这将返回使用list表示法提及的所有频道的#channel-name。这样,您只需使用channel.id即可获得他们提到的频道的id

但是请不要忘记检查用户 did 是否标记了频道(您也可以将其放入check中)。我将它放在一个单独的函数中,以使此答复更具可读性,但如果您确实愿意,可以将其放入您的lambda中。

还要确保检查它是Text Channel而不是Voice ChannelCategory Channel

@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]

我在mentioned_channel行上放置了两个条件,因为如果第一个条件失败,第二个条件可能会导致IndexError。另外,您也可以使用if-statement尽快返回该位置以解决相同的问题。

答案 1 :(得分:1)

您可以在此示例中使用discord.utils.get()

text_channel = await self.client.wait_for("message", check=lambda message: message.author == ctx.author, timeout=300)
channel = discord.utils.get(ctx.guild.text_channels, name=text_channel)
await channel.send('Bla Bla')

因此,当您输入(prefix)clhook时,只有频道名称(例如 general )会把Bla Bla发送到名为 general 的频道。

还有另一种方法,我认为这比第一种方法简单,这里是:

@commands.command()
async def clhook(self, ctx, channel: discord.TextChannel):
    await channel.send('Bla Bla')

因此,在此命令中,用法已更改。您可以将其与此结合使用:(prefix)clhook #general(mention the channel)。我建议这种解决方案,并且我认为它更有用。