AttributeError: 'Button' object has no attribute 'user'

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fcutim07
User
Beiträge: 3
Registriert: Sonntag 13. August 2023, 22:10

Ich bin gerade dabei, einen Verifizierungsbot zu erstellen, der Rollen verteilt. Er sollte diese Rollen-ID aus einer serverSetups.json lesen. So sieht diese .json derzeit aus:

Code: Alles auswählen

{
    "1139335633882579027": {
        "mute_role": 1139356364297220167,
        "member_role": 1139338847080165406,
        "invite_link": "https://discord.gg/123"
    },
    "933078112047091753": {
        "mute_role": 937777431975182376,
        "member_role": 937776349001678908,
        "invite_link": "https://discord.gg/123"
    },
    "1028973807240740904": {
        "mute_role": 1139559797268688896,
        "member_role": 1139559797268688896,
        "invite_link": "https://discord.gg/123"
    }
}


Der Bot sollte die guild_id erfassen und dann in der .json-Datei danach suchen. Wenn es eine findet, sendet es die Verify Embed. Wenn der Benutzer nun den Button drückt, sollte der Bot den „member_role“-Wert aus der .json zusammen mit der guild_id finden und dem Benutzer dann die Rolle mit dieser ID geben.

Das Problem ist nun, dass ich jedes Mal, wenn ich auf „Verify!" drücke, erscheint eine Fehlermeldung mit dieser Meldung:

2023-08-13 22:38:12 ERROR discord.ui.view Ignoring exception in view <VerifyButton timeout=None children=1> for item <Button style=<ButtonStyle.primary: 1> url=None disabled=False label='Verify!' emoji=None row=None>
Traceback (most recent call last):
File "C:\Users\Tim\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\discord\ui\view.py", line 427, in _scheduled_task
await item.callback(interaction)
File "c:\Users\Tim\OneDrive\Dokumente\Dev\Python_JS\GlobalBot\main.py", line 242, in verify
user = interaction.user
^^^^^^^^^^^^^^^^
AttributeError: 'Button' object has no attribute 'user'


Mein Aktueller Code sieht so aus:

Code: Alles auswählen

class VerifyButton(discord.ui.View):
    def __init__(self, role_id):
        super().__init__(timeout=None)
        self.role_id = role_id
 
    @discord.ui.button(label="Verify!", style=discord.ButtonStyle.blurple)
    async def verify(self, interaction: discord.Interaction, button: discord.ui.Button):
        user = interaction.user
        guild = interaction.guild
 
        role = guild.get_role(self.role_id)
        if role:
            await user.add_roles(role, reason="Button Clicked")
            embed = discord.Embed(title="Verifying successful!", description="Vielen Dank, dass du dich verifiziert hast. Du hast nun vollen Zugriff auf den Server!")
        else:
            embed = discord.Embed(title="Verifying Error!", description="Ein Fehler ist aufgetreten beim Hinzufügen der Rolle.")
 
        await interaction.response.send_message(embed=embed, ephemeral=True)
 
@bot.command()
@commands.check(is_allowed)
async def test(ctx):  
    guild_id = None
 
    if ctx.guild: 
        guild_id = ctx.guild.id
 
    if str(guild_id) in server_setups:
        setup_data = server_setups[str(guild_id)]
        if 'member_role' in setup_data:
            role_id = setup_data['member_role']
            role = ctx.guild.get_role(role_id)
            if role:
                view = VerifyButton(role_id)
                await ctx.send(embed=discord.Embed(title="Wie du dich verifizieren kannst", description="Um Zugriff auf den Server haben zu können, musst du dich verifizieren. Dies ist ganz leicht. Klicke einfach auf den Button unter dieser Nachricht, und schon bist du verifiziert."), view=view)
            else:
                await ctx.send("Rolle nicht gefunden.")
        else:
            await ctx.send("Member-Rolle nicht in den Server-Setups gefunden.")
    else:
        await ctx.send("Server-Setup wurde nicht gefunden.")


Ich habe jetzt viele Male andere Methoden verwendet, aber es tritt immer wieder der gleiche Fehler auf.

Ich habe auch noch einmal den gleichen Code, ohne dass die Rollen-ID aus der.json gelesen wird, und bereits angegeben ist, und der Fehler erscheint dort nicht, obwohl im Prinzip die gleiche Methode verwendet wird.

Dies ist der andere Code ohne die .json-Datei:

Code: Alles auswählen

class TestMenuButton(discord.ui.View):
    def __init__(self):
        super().__init__(timeout=None)
 
    @discord.ui.button(label="Verify!", style=discord.ButtonStyle.blurple)
    async def test(self, interaction: discord.Interaction, button: discord.ui.Button):
        user = interaction.user
        role_id = 1139338847080165406  # ID der Rolle, die zugewiesen werden soll
 
        role = interaction.guild.get_role(role_id)
        if role:
            await user.add_roles(role, reason="Button Clicked")
            embed = discord.Embed(title="Verifying successfull!", description="Vielen Dank das du dich verifiziert hast. Du hast nun vollen Zugriff auf den Server!")
        else:
            embed = discord.Embed(title="Verifying Error!", description="An error occurred while granting the role.")
 
        await interaction.response.send_message(embed=embed, ephemeral=True)
 
 
@bot.tree.command(name="verify")
@commands.check(is_allowed)
async def buttonmenu(interaction: discord.Interaction):
    view = TestMenuButton()
    await interaction.response.send_message(embed=discord.Embed(title="Wie du dich verifizieren kannst", description="Um Zugriff auf den Server haben zu können musst du dich Verifizieren. Dies ist ganz leicht. Klicke einfach auf den Button unter dieseer Nachricht, und schon bist du Verifiziert."), view=view)


Weiß jemand woran das liegen könnte?
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@fcutim07: Du hast da eine Methode der `interaction` und `button` übergeben wird. Und die Fehlermeldung sagt, dass `interaction` vom Typ `Button` ist. Was ist da wohl der naheliegendste Fehler‽ Kurzer Blick in die Dokumentation bestätigt das auch.

Wobei der zweite Code, der angeblich läuft, genau den gleichen Fehler hat und die gleiche Ausnahme auslöst.

Anmerkungen zum Quelltext: Konstanten schreibt man per Konvention KOMPLETT_GROSS. Also `SERVER_SETUPS`.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Fehlermeldungen in `test` sind seltsam. Wenn guild_id in server_setups nicht gefunden wird, meldest Du "Server-Setup wurde nicht gefunden.".
Statt explizit zu prüfen, ob ein Schlüssel vorhanden ist, würde man einfach auf die Exception hören:

Code: Alles auswählen

async def test(ctx):
    if ctx.guild:
        guild_id = ctx.guild.id
    else:
        guild_id = None
    try:
        setup_data = server_setups[str(guild_id)]
    except KeyError:
        await ctx.send("Server-Setup wurde nicht gefunden.")
    else:
        try:
            role_id = setup_data["member_role"]
        except KeyError:
            await ctx.send("Member-Rolle nicht in den Server-Setups gefunden.")
        else:
            role = ctx.guild.get_role(role_id)
            if role:
                view = VerifyButton(role_id)
                await ctx.send(
                    embed=discord.Embed(
                        title="Wie du dich verifizieren kannst",
                        description="Um Zugriff auf den Server haben zu können, musst du dich verifizieren. Dies ist ganz leicht. Klicke einfach auf den Button unter dieser Nachricht, und schon bist du verifiziert.",
                    ),
                    view=view,
                )
            else:
                await ctx.send("Rolle nicht gefunden.")
Antworten