如何在discord.py中使用客户端(在选择回调中)获取一个频道对象?

huangapple go评论124阅读模式
英文:

How to get a channel object using the client (in select callback) discord.py

问题

我在选择回调中遇到了获取频道对象(使用客户端)的问题。我不想使用公会ID进行获取,因为一个用户可能在DM频道中(此命令必须适用于一个用户在普通频道中,另一个用户在文本频道中)。

  1. @discord.ui.button(label="确认", custom_id='confirm', style=discord.ButtonStyle.green)
  2. async def confirm(self, interaction: discord.Interaction, button: discord.ui.Button):
  3. initialize_trade(self.user.id, interaction.user.id, self.user_channel, interaction.channel.id, self.user_message, self.own_message)
  4. inventory = get_inventory(interaction.user.id)
  5. user1_inv, user2_inv = [], []
  6. formatted_inventory = []
  7. count_dict = {}
  8. for item in inventory:
  9. count_dict[item] = count_dict.get(item, 0) + 1
  10. formatted_inventory.append(f"{item} ({count_dict[item]})" if count_dict[item] > 1 else item)
  11. await interaction.response.edit_message(content='交易已确认!', view=TradeView(self.user, 2, formatted_inventory, user1_inv, user2_inv))
  1. class TradeView(discord.ui.View):
  2. def __init__(self, other_user: discord.User, usertype, inventory, user1inv, user2inv):
  3. super().__init__(timeout=60)
  4. self.other_user = other_user
  5. self.inventory = inventory
  6. self.user1inv = user1inv
  7. self.user2inv = user2inv
  8. self.usertype = usertype
  9. self.select_callback.options = [discord.SelectOption(label=item) for item in inventory]
  10. self.select_callback.max_values = len(inventory)
  11. @discord.ui.select(placeholder="选择要交易的物品", min_values=1, options=[])
  12. async def select_callback(self, interaction: discord.Interaction, select):
  13. if self.usertype == 1:
  14. configure_user1_inv(interaction.user.id, self.other_user.id, select.values)
  15. channel_id, msg_id = get_user2_message(interaction.user.id, self.other_user.id)
  16. else:
  17. configure_user2_inv(interaction.user.id, self.other_user.id, select.values)
  18. channel_id, msg_id = get_user1_message(self.other_user.id, interaction.user.id)
  19. channel = self.bot.get_channel(channel_id)
  20. message = await channel.fetch_message(msg_id)
  21. await message.edit(content=f'编辑的消息!{select.values}')
  22. await interaction.response.edit_message(content=f"{select.values}")
英文:

I have an issue getting a channel object (using the client) within a select callback. I don't want to fetch using a guild id because one user will be in a DM channel (this command will have to work for one user in a normal channel, and the other in a text channel).

  1. @discord.ui.button(label="Confirm", custom_id='confirm', style=discord.ButtonStyle.green)
  2. async def confirm(self, interaction: discord.Interaction, button: discord.ui.Button):
  3. initialize_trade(self.user.id, interaction.user.id, self.user_channel, interaction.channel.id, self.user_message, self.own_message)
  4. inventory = get_inventory(interaction.user.id)
  5. user1_inv, user2_inv = [], []
  6. formatted_inventory = []
  7. count_dict = {}
  8. for item in inventory:
  9. count_dict[item] = count_dict.get(item, 0) + 1
  10. formatted_inventory.append(f"{item} ({count_dict[item]})" if count_dict[item] > 1 else item)
  11. await interaction.response.edit_message(content='Trade confirmed!', view=TradeView(self.user, 2, formatted_inventory, user1_inv, user2_inv))
  1. class TradeView(discord.ui.View):
  2. def __init__(self, other_user: discord.User, usertype, inventory, user1inv, user2inv):
  3. super().__init__(timeout=60)
  4. self.other_user = other_user
  5. self.inventory = inventory
  6. self.user1inv = user1inv
  7. self.user2inv = user2inv
  8. self.usertype = usertype
  9. self.select_callback.options = [discord.SelectOption(label=item) for item in inventory]
  10. self.select_callback.max_values = len(inventory)
  11. @discord.ui.select(placeholder="Select Items to Trade", min_values=1, options=[])
  12. async def select_callback(self, interaction: discord.Interaction, select):
  13. if self.usertype == 1:
  14. configure_user1_inv(interaction.user.id, self.other_user.id, select.values)
  15. channel_id, msg_id = get_user2_message(interaction.user.id, self.other_user.id)
  16. else:
  17. configure_user2_inv(interaction.user.id, self.other_user.id, select.values)
  18. channel_id, msg_id = get_user1_message(self.other_user.id, interaction.user.id)
  19. channel = self.bot.get_channel(channel_id)
  20. message = await channel.fetch_message(msg_id)
  21. await message.edit(content=f'EDITED MESSAGE! {select.values}')
  22. await interaction.response.edit_message(content=f"{select.values}")

Anything helps :)! Sorry if this is a little confusing/not clear.

答案1

得分: 2

你可以简单地将机器人传递给__init__方法的另一个参数中:

  1. class TradeView(discord.ui.View):
  2. def __init__(self, other_user: discord.User, usertype, inventory, user1inv, user2inv, bot):
  3. super().__init__(timeout=60)
  4. self.bot = bot
  5. self.other_user = other_user
  6. self.inventory = inventory
  7. self.user1inv = user1inv
  8. self.user2inv = user2inv
  9. self.usertype = usertype
  10. self.select_callback.options = [discord.SelectOption(label=item) for item in inventory]
  11. self.select_callback.max_values = len(inventory)
  12. # ...其余的代码

然后在创建视图时简单地传递机器人实例:

  1. @discord.ui.button(label="确认", custom_id='confirm', style=discord.ButtonStyle.green)
  2. async def confirm(self, interaction: discord.Interaction, button: discord.ui.Button):
  3. initialize_trade(self.user.id, interaction.user.id, self.user_channel, interaction.channel.id, self.user_message, self.own_message)
  4. inventory = get_inventory(interaction.user.id)
  5. user1_inv, user2_inv = [], []
  6. formatted_inventory = []
  7. count_dict = {}
  8. for item in inventory:
  9. count_dict[item] = count_dict.get(item, 0) + 1
  10. formatted_inventory.append(f"{item} ({count_dict[item]})" if count_dict[item] > 1 else item)
  11. await interaction.response.edit_message(
  12. content='交易确认!',
  13. view=TradeView(
  14. self.user, 2, formatted_inventory, user1_inv, user2_inv, interaction.client # 重要
  15. )
  16. )
英文:

You can simply pass the bot into another argument of the __init__ method:

  1. class TradeView(discord.ui.View):
  2. def __init__(self, other_user: discord.User, usertype, inventory, user1inv, user2inv, bot):
  3. super().__init__(timeout=60)
  4. self.bot = bot
  5. self.other_user = other_user
  6. self.inventory = inventory
  7. self.user1inv = user1inv
  8. self.user2inv = user2inv
  9. self.usertype = usertype
  10. self.select_callback.options = [discord.SelectOption(label=item) for item in inventory]
  11. self.select_callback.max_values = len(inventory)
  12. # ...rest of the code

And simply pass the bot instance when creating the view:

  1. @discord.ui.button(label="Confirm", custom_id='confirm', style=discord.ButtonStyle.green)
  2. async def confirm(self, interaction: discord.Interaction, button: discord.ui.Button):
  3. initialize_trade(self.user.id, interaction.user.id, self.user_channel, interaction.channel.id, self.user_message, self.own_message)
  4. inventory = get_inventory(interaction.user.id)
  5. user1_inv, user2_inv = [], []
  6. formatted_inventory = []
  7. count_dict = {}
  8. for item in inventory:
  9. count_dict[item] = count_dict.get(item, 0) + 1
  10. formatted_inventory.append(f"{item} ({count_dict[item]})" if count_dict[item] > 1 else item)
  11. await interaction.response.edit_message(
  12. content='Trade confirmed!',
  13. view=TradeView(
  14. self.user, 2, formatted_inventory, user1_inv, user2_inv, interaction.client # important
  15. )
  16. )

huangapple
  • 本文由 发表于 2023年6月22日 04:05:09
  • 转载请务必保留本文链接:https://go.coder-hub.com/76526772.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定