Discordでチケット機能を搭載したBOTを以下の動画をほぼ丸写しの状態で作成しておりました。
下の動画で主に参考にしたのはチケット作成の部分のみで、class aclient(discord.Client):より下の部分は別の動画を参考にしながら書いていました
Transcripts | Ticketing in Discord.py (Part 4)
仕組みとしては
-
/setupでembedメッセージとチケット作成のボタンを送信
-
チケット作成ボタンをクリックでクリックした人のユーザー名のついたチャンネルを作成
といった感じです。
2のチケット作成ボタンをクリックしたときにAttributeError: 'Button' object has no attribute 'guild'とエラーを吐きます。
Pythonバージョンは3.10.7
Discord.pyバージョンは2.1.0a
Python
1import discord 2from discord import app_commands, utils 3 4guild_id = "1027044756389367859" 5 6 7#チケット作成 8class ticket_launcher(discord.ui.View): 9 def __init__(self) -> None: 10 super().__init__(timeout=None) 11 12 @discord.ui.button(label="チケットを作成する",style = discord.ButtonStyle.success, custom_id = "ticket_button") 13 async def ticket(self, button:discord.ui.button , interaction:discord.Interaction): 14 ticket = utils.get(interaction.guild.text_channels, name = f"🎫| {interaction.user.name}-{interaction.user.discriminator}") 15 if ticket is not None: await interaction.response.send_message(f"すでにチケットが存在しています {ticket.mention}",ephemeral=True) 16 else: 17 overwrites = { 18 interaction.guild.default_role: discord.PermissionOverwrite(view_channel = False), 19 interaction.user: discord.PermissionOverwrite(view_channel = True, send_message = True, attach_files = True, embed_links = True), 20 interaction.guild.me: discord.PermissionOverwrite(view_channel = True ,send_message = True, read_message_history = True) 21 } 22 channel = await interaction.guild.create_text_channel(name = f"🎫| {interaction.user.name}-{interaction.user.discriminator}",overwrites = overwrites, reason = f"🎫| {interaction.user.name}") 23 await channel.send(f"{interaction.user.mation} チケットが作成されました!") 24 await interaction.response.send_message(f"チケットが作成されました{channel.mention}", ephemeral= True) 25 26 27 28 29class aclient(discord.Client): 30 def __init__(self): 31 super().__init__(intents = discord.Intents.default()) 32 self.synced = False #we use this so the bot doesn't sync commands more than once 33 34 async def on_ready(self): 35 await self.wait_until_ready() 36 if not self.synced: #check if slash commands have been synced 37 await tree.sync(guild = discord.Object(id=guild_id)) #guild specific: leave blank if global (global registration can take 1-24 hours) 38 self.synced = True 39 print(f"{self.user}でログインしました") 40 41 42client = aclient() 43tree = app_commands.CommandTree(client) 44 45 46 47@tree.command(guild = discord.Object(id=guild_id), name = 'setup', description='セットアップを行います') #guild specific slash command 48async def setup(interaction: discord.Interaction): 49 await interaction.response.send_message(embed=embed,view=ticket_launcher()) 50 51client.run('TOKEN')

下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2022/10/18 12:27 編集
2022/10/20 05:58