serenity-rs / serenity

A Rust library for the Discord API.
https://discord.gg/serenity-rs
ISC License
4.65k stars 571 forks source link

Message Command fails on messages with reactions (Unknown Event) #2910

Closed WallyOxen closed 2 months ago

WallyOxen commented 2 months ago

Serenity version: 0.12.2

Rust version (rustc -V): 1.77.0

Backtrace (make sure to run RUST_BACKTRACE=1): N/A

Minimal test case if possible: I added a message command to my guild that works as long as the message has no reactions. As soon as the message has a reaction my bot doesn't get any sort of InteractionCreate event. I figured out how to log the raw event data and discovered that when calling a message command on the same message with a reaction the Event from the raw_event function says that it received an unknown event (even though the unknown event is of kind: "INTERACTION_CREATE"). But if I remove the reaction and try the message command again it comes through as the proper InteractionCreate event.

use serenity::{
    all::{
        CommandType, Context, CreateCommand, CreateInteractionResponse,
        CreateInteractionResponseMessage, Event, EventHandler, GatewayIntents, GuildId,
        Interaction, RawEventHandler, Ready,
    },
    async_trait, Client,
};
struct Bot {}

#[async_trait]
impl EventHandler for Bot {
    async fn interaction_create(&self, ctx: Context, interaction: Interaction) {
        println!("Got interaction!");

        match interaction {
            Interaction::Command(command) => {
                println!("Command interaction: {}", command.data.name);
                let data = CreateInteractionResponseMessage::new()
                    .content("Success")
                    .ephemeral(true);
                let builder = CreateInteractionResponse::Message(data);
                if let Err(why) = command.create_response(&ctx.http, builder).await {
                    println!("Cannot respond to slash command: {why}");
                }
            }
            _ => {
                println!("Unable to respond to interaction");
            }
        }
    }

    async fn ready(&self, ctx: Context, ready: Ready) {
        println!("{} is connected!", ready.user.name);

        let guild_id = GuildId::new(
            std::env::var("GUILD_ID")
                .expect("Expected GUILD_ID in the environment or .env file")
                .parse()
                .expect("GUILD_ID must be an integer"),
        );

        let commands = guild_id
            .set_commands(
                &ctx.http,
                vec![CreateCommand::new("message_command_test").kind(CommandType::Message)],
            )
            .await;

        println!("I now have the following guild slash commandssss: {commands:#?}");
    }
}

#[async_trait]
impl RawEventHandler for Bot {
    async fn raw_event(&self, _ctx: Context, ev: Event) {
        println!("{:#?}", ev);
    }
}

#[tokio::main]
async fn main() {
    dotenv::dotenv().ok();

    let bot = Bot {};

    let mut client = Client::builder(
        std::env::var("DISCORD_TOKEN")
            .expect("Expected DISCORD_TOKEN in the environment or .env file"),
        GatewayIntents::all(),
    )
    // .event_handler(bot)
    .raw_event_handler(bot)
    .await
    .expect("Error creating client");

    if let Err(why) = client.start().await {
        println!("Client error: {:?}", why);
    }
}

The raw event data for a message command successfully run on a message without a reaction

InteractionCreate(
    InteractionCreateEvent {
        interaction: Command(
            CommandInteraction {
                id: InteractionId(
                    XXXXXXXXXXXXXXXXXXX,
                ),
                application_id: ApplicationId(
                    XXXXXXXXXXXXXXXXXXX,
                ),
                data: CommandData {
                    id: CommandId(
                        XXXXXXXXXXXXXXXXXXX,
                    ),
                    name: "message_command_test",
                    kind: Message,
                    resolved: CommandDataResolved {
                        users: {},
                        members: {},
                        roles: {},
                        channels: {},
                        messages: {
                            MessageId(
                                XXXXXXXXXXXXXXXXXXX,
                            ): Message {
                                id: MessageId(
                                    XXXXXXXXXXXXXXXXXXX,
                                ),
                                channel_id: ChannelId(
                                    XXXXXXXXXXXXXXXXXX,
                                ),
                                author: User {
                                    id: UserId(
                                        XXXXXXXXXXXXXXXXXX,
                                    ),
                                    name: "wallyoxen",
                                    discriminator: None,
                                    global_name: Some(
                                        "Wally",
                                    ),
                                    avatar: Some(
                                        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
                                    ),
                                    bot: false,
                                    system: false,
                                    mfa_enabled: false,
                                    banner: None,
                                    accent_colour: None,
                                    locale: None,
                                    verified: None,
                                    email: None,
                                    flags: UserPublicFlags(
                                        0,
                                    ),
                                    premium_type: None,
                                    public_flags: Some(
                                        UserPublicFlags(
                                            0,
                                        ),
                                    ),
                                    member: None,
                                },
                                content: "test",
                                timestamp: Timestamp(
                                    2024-06-24 17:16:38.478 +00:00:00,
                                ),
                                edited_timestamp: None,
                                tts: false,
                                mention_everyone: false,
                                mentions: [],
                                mention_roles: [],
                                mention_channels: [],
                                attachments: [],
                                embeds: [],
                                reactions: [],
                                nonce: None,
                                pinned: false,
                                webhook_id: None,
                                kind: Regular,
                                activity: None,
                                application: None,
                                application_id: None,
                                message_reference: None,
                                flags: Some(
                                    MessageFlags(
                                        0,
                                    ),
                                ),
                                referenced_message: None,
                                interaction: None,
                                thread: None,
                                components: [],
                                sticker_items: [],
                                position: None,
                                role_subscription_data: None,
                                guild_id: None,
                                member: None,
                                poll: None,
                            },
                        },
                        attachments: {},
                    },
                    options: [],
                    guild_id: Some(
                        GuildId(
                            XXXXXXXXXXXXXXXXXX,
                        ),
                    ),
                    target_id: Some(
                        TargetId(
                            XXXXXXXXXXXXXXXXXXX,
                        ),
                    ),
                },
                guild_id: Some(
                    GuildId(
                        XXXXXXXXXXXXXXXXXX,
                    ),
                ),
                channel: Some(
                    PartialChannel {
                        id: ChannelId(
                            XXXXXXXXXXXXXXXXXX,
                        ),
                        name: Some(
                            "test",
                        ),
                        kind: Text,
                        permissions: Some(
                            Permissions(
                                XXXXXXXXXXXXXXX,
                            ),
                        ),
                        thread_metadata: None,
                        parent_id: None,
                    },
                ),
                channel_id: ChannelId(
                    XXXXXXXXXXXXXXXXXX,
                ),
                member: Some(
                    Member {
                        user: User {
                            id: UserId(
                                XXXXXXXXXXXXXXXXXX,
                            ),
                            name: "wallyoxen",
                            discriminator: None,
                            global_name: Some(
                                "Wally",
                            ),
                            avatar: Some(
                                "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
                            ),
                            bot: false,
                            system: false,
                            mfa_enabled: false,
                            banner: None,
                            accent_colour: None,
                            locale: None,
                            verified: None,
                            email: None,
                            flags: UserPublicFlags(
                                0,
                            ),
                            premium_type: None,
                            public_flags: Some(
                                UserPublicFlags(
                                    0,
                                ),
                            ),
                            member: None,
                        },
                        nick: None,
                        avatar: None,
                        roles: [
                            RoleId(
                                XXXXXXXXXXXXXXXXXX,
                            ),
                            RoleId(
                                XXXXXXXXXXXXXXXXXX,
                            ),
                        ],
                        joined_at: Some(
                            Timestamp(
                                2017-08-03 1:12:26.919 +00:00:00,
                            ),
                        ),
                        premium_since: None,
                        deaf: false,
                        mute: false,
                        flags: GuildMemberFlags(
                            0,
                        ),
                        pending: false,
                        permissions: Some(
                            Permissions(
                                XXXXXXXXXXXXXXX,
                            ),
                        ),
                        communication_disabled_until: None,
                        guild_id: GuildId(
                            XXXXXXXXXXXXXXXXXX,
                        ),
                        unusual_dm_activity_until: None,
                    },
                ),
                user: User {
                    id: UserId(
                        XXXXXXXXXXXXXXXXXX,
                    ),
                    name: "wallyoxen",
                    discriminator: None,
                    global_name: Some(
                        "Wally",
                    ),
                    avatar: Some(
                        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
                    ),
                    bot: false,
                    system: false,
                    mfa_enabled: false,
                    banner: None,
                    accent_colour: None,
                    locale: None,
                    verified: None,
                    email: None,
                    flags: UserPublicFlags(
                        0,
                    ),
                    premium_type: None,
                    public_flags: Some(
                        UserPublicFlags(
                            0,
                        ),
                    ),
                    member: None,
                },
                token: "",
                version: 1,
                app_permissions: Some(
                    Permissions(
                        XXXXXXXXXXXXXXX,
                    ),
                ),
                locale: "en-US",
                guild_locale: Some(
                    "en-US",
                ),
                entitlements: [],
            },
        ),
    },
)

Raw event data for a message command on the same message after adding a reaction

Unknown(
    UnknownEvent {
        kind: "INTERACTION_CREATE",
        value: Object {
            "app_permissions": String("XXXXXXXXXXXXXXXX"),
            "application_id": String("XXXXXXXXXXXXXXXXXXX"),
            "authorizing_integration_owners": Object {
                "0": String("XXXXXXXXXXXXXXXXXX"),
            },
            "channel": Object {
                "flags": Number(0),
                "guild_id": String("XXXXXXXXXXXXXXXXXX"),
                "id": String("XXXXXXXXXXXXXXXXXX"),
                "last_message_id": String("XXXXXXXXXXXXXXXXXXX"),
                "name": String("test"),
                "nsfw": Bool(false),
                "parent_id": Null,
                "permissions": String("XXXXXXXXXXXXXXXX"),
                "position": Number(5),
                "rate_limit_per_user": Number(0),
                "topic": Null,
                "type": Number(0),
            },
            "channel_id": String("XXXXXXXXXXXXXXXXXX"),
            "context": Number(0),
            "data": Object {
                "guild_id": String("XXXXXXXXXXXXXXXXXX"),
                "id": String("XXXXXXXXXXXXXXXXXXX"),
                "name": String("message_command_test"),
                "resolved": Object {
                    "messages": Object {
                        "XXXXXXXXXXXXXXXXXXX": Object {
                            "attachments": Array [],
                            "author": Object {
                                "avatar": String("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"),
                                "avatar_decoration_data": Null,
                                "clan": Null,
                                "discriminator": String("0"),
                                "global_name": String("Wally"),
                                "id": String("XXXXXXXXXXXXXXXXXX"),
                                "public_flags": Number(0),
                                "username": String("wallyoxen"),
                            },
                            "channel_id": String("XXXXXXXXXXXXXXXXX"),
                            "components": Array [],
                            "content": String("test"),
                            "edited_timestamp": Null,
                            "embeds": Array [],
                            "flags": Number(0),
                            "id": String("XXXXXXXXXXXXXXXXXX"),
                            "mention_everyone": Bool(false),
                            "mention_roles": Array [],
                            "mentions": Array [],
                            "pinned": Bool(false),
                            "reactions": Array [
                                Object {
                                    "burst_colors": Array [],
                                    "burst_count": Number(0),
                                    "burst_me": Bool(false),
                                    "count": Number(1),
                                    "count_details": Object {
                                        "burst": Number(0),
                                        "normal": Number(1),
                                    },
                                    "emoji": Object {
                                        "id": Null,
                                        "name": String("😂"),
                                    },
                                    "me": Bool(true),
                                    "me_burst": Bool(false),
                                },
                            ],
                            "timestamp": String("2024-06-24T17:16:38.478000+00:00"),
                            "tts": Bool(false),
                            "type": Number(0),
                        },
                    },
                },
                "target_id": String("XXXXXXXXXXXXXXXXXXX"),
                "type": Number(3),
            },
            "entitlement_sku_ids": Array [],
            "entitlements": Array [],
            "guild": Object {
                "features": Array [],
                "id": String("XXXXXXXXXXXXXXXXX"),
                "locale": String("en-US"),
            },
            "guild_id": String("XXXXXXXXXXXXXXXXXX"),
            "guild_locale": String("en-US"),
            "id": String("XXXXXXXXXXXXXXXXXX"),
            "locale": String("en-US"),
            "member": Object {
                "avatar": Null,
                "communication_disabled_until": Null,
                "deaf": Bool(false),
                "flags": Number(0),
                "joined_at": String("2017-08-03T01:12:26.919000+00:00"),
                "mute": Bool(false),
                "nick": Null,
                "pending": Bool(false),
                "permissions": String("XXXXXXXXXXXXXXX"),
                "premium_since": Null,
                "roles": Array [
                    String("XXXXXXXXXXXXXXXXXX"),
                    String("XXXXXXXXXXXXXXXXXX"),
                ],
                "unusual_dm_activity_until": Null,
                "user": Object {
                    "avatar": String("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"),
                    "avatar_decoration_data": Null,
                    "clan": Null,
                    "discriminator": String("0"),
                    "global_name": String("Wally"),
                    "id": String("XXXXXXXXXXXXXXXXX"),
                    "public_flags": Number(0),
                    "username": String("wallyoxen"),
                },
            },
            "token": String(""),
            "type": Number(2),
            "version": Number(1),
        },
    },
)
jamesbt365 commented 2 months ago

Duplicate of #2892.