因此,我在这里正在做一个小项目,几乎,我想拥有一种“请在此服务器中输入频道名称”功能。
几乎,机器人要求输入频道名称,我输入例如“ #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应该“永远”保存,这意味着我不必在消息应到达的位置重新编写频道名称!
答案 0 :(得分:1)
您可以使用message.channel_mentions
。这将返回使用list
表示法提及的所有频道的#channel-name
。这样,您只需使用channel.id
即可获得他们提到的频道的id
。
但是请不要忘记检查用户 did 是否标记了频道(您也可以将其放入check
中)。我将它放在一个单独的函数中,以使此答复更具可读性,但如果您确实愿意,可以将其放入您的lambda中。
还要确保检查它是Text Channel
而不是Voice Channel
或Category 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)
。我建议这种解决方案,并且我认为它更有用。