From a5069e1989f3b33b68fb3dd0c46be25103d4e23e Mon Sep 17 00:00:00 2001 From: Yuzu Date: Thu, 5 Dec 2024 00:13:43 -0500 Subject: [PATCH] added all events --- src/internal.zig | 70 ++++++------- src/shard.zig | 205 +++++++++++++++++++++++++++++++++++++- src/structures/events.zig | 13 ++- 3 files changed, 250 insertions(+), 38 deletions(-) diff --git a/src/internal.zig b/src/internal.zig index 467255b..85b4a7a 100644 --- a/src/internal.zig +++ b/src/internal.zig @@ -257,7 +257,7 @@ pub const Bucket = struct { pub fn GatewayDispatchEvent(comptime T: type) type { return struct { - // TODO: implement // application_command_permissions_update: null = null, + application_command_permissions_update: ?*const fn (save: T, application_command_permissions: Types.ApplicationCommandPermissions) anyerror!void = undefined, // TODO: implement // auto_moderation_rule_create: null = null, // TODO: implement // auto_moderation_rule_update: null = null, // TODO: implement // auto_moderation_rule_delete: null = null, @@ -266,13 +266,14 @@ pub fn GatewayDispatchEvent(comptime T: type) type { channel_update: ?*const fn (save: T, chan: Types.Channel) anyerror!void = undefined, /// this isn't send when the channel is not relevant to you channel_delete: ?*const fn (save: T, chan: Types.Channel) anyerror!void = undefined, - // TODO: implement // channel_pins_update: null = null, - // TODO: implement // thread_create: null = null, - // TODO: implement // thread_update: null = null, - // TODO: implement // thread_delete: null = null, - // TODO: implement // thread_list_sync: null = null, - // TODO: implement // thread_member_update: null = null, - // TODO: implement // thread_members_update: null = null, + channel_pins_update: ?*const fn (save: T, chan_pins_update: Types.ChannelPinsUpdate) anyerror!void = undefined, + thread_create: ?*const fn (save: T, thread: Types.Channel) anyerror!void = undefined, + thread_update: ?*const fn (save: T, thread: Types.Channel) anyerror!void = undefined, + /// has `id`, `guild_id`, `parent_id`, and `type` fields. + thread_delete: ?*const fn (save: T, thread: Types.Partial(Types.Channel)) anyerror!void = undefined, + thread_list_sync: ?*const fn (save: T, data: Types.ThreadListSync) anyerror!void = undefined, + thread_member_update: ?*const fn (save: T, guild_id: Types.ThreadMemberUpdate) anyerror!void = undefined, + thread_members_update: ?*const fn (save: T, thread_data: Types.ThreadMembersUpdate) anyerror!void = undefined, // TODO: implement // guild_audit_log_entry_create: null = null, guild_create: ?*const fn (save: T, guild: Types.Guild) anyerror!void = undefined, guild_create_unavailable: ?*const fn (save: T, guild: Types.UnavailableGuild) anyerror!void = undefined, @@ -282,25 +283,25 @@ pub fn GatewayDispatchEvent(comptime T: type) type { guild_delete: ?*const fn (save: T, guild: Types.UnavailableGuild) anyerror!void = undefined, guild_ban_add: ?*const fn (save: T, gba: Types.GuildBanAddRemove) anyerror!void = undefined, guild_ban_remove: ?*const fn (save: T, gbr: Types.GuildBanAddRemove) anyerror!void = undefined, - // TODO: implement // guild_emojis_update: null = null, - // TODO: implement // guild_stickers_update: null = null, - // TODO: implement // guild_integrations_update: null = null, + guild_emojis_update: ?*const fn (save: T, fields: Types.GuildEmojisUpdate) anyerror!void = undefined, + guild_stickers_update: ?*const fn (save: T, fields: Types.GuildStickersUpdate) anyerror!void = undefined, + guild_integrations_update: ?*const fn (save: T, fields: Types.GuildIntegrationsUpdate) anyerror!void = undefined, guild_member_add: ?*const fn (save: T, guild_id: Types.GuildMemberAdd) anyerror!void = undefined, guild_member_update: ?*const fn (save: T, fields: Types.GuildMemberUpdate) anyerror!void = undefined, guild_member_remove: ?*const fn (save: T, user: Types.GuildMemberRemove) anyerror!void = undefined, - // TODO: implement // guild_members_chunk: null = null, + guild_members_chunk: ?*const fn (save: T, data: Types.GuildMembersChunk) anyerror!void = undefined, guild_role_create: ?*const fn (save: T, role: Types.GuildRoleCreate) anyerror!void = undefined, guild_role_delete: ?*const fn (save: T, role: Types.GuildRoleDelete) anyerror!void = undefined, guild_role_update: ?*const fn (save: T, role: Types.GuildRoleUpdate) anyerror!void = undefined, - // TODO: implement // guild_scheduled_event_create: null = null, - // TODO: implement // guild_scheduled_event_update: null = null, - // TODO: implement // guild_scheduled_event_delete: null = null, - // TODO: implement // guild_scheduled_event_user_add: null = null, - // TODO: implement // guild_scheduled_event_user_remove: null = null, - // TODO: implement // integration_create: null = null, - // TODO: implement // integration_update: null = null, - // TODO: implement // integration_delete: null = null, - // TODO: implement // interaction_create: null = null, + guild_scheduled_event_create: ?*const fn (save: T, s_event: Types.ScheduledEvent) anyerror!void = undefined, + guild_scheduled_event_update: ?*const fn (save: T, s_event: Types.ScheduledEvent) anyerror!void = undefined, + guild_scheduled_event_delete: ?*const fn (save: T, s_event: Types.ScheduledEvent) anyerror!void = undefined, + guild_scheduled_event_user_add: ?*const fn (save: T, data: Types.ScheduledEventUserAdd) anyerror!void = undefined, + guild_scheduled_event_user_remove: ?*const fn (save: T, data: Types.ScheduledEventUserRemove) anyerror!void = undefined, + integration_create: ?*const fn (save: T, guild_id: Types.IntegrationCreateUpdate) anyerror!void = undefined, + integration_update: ?*const fn (save: T, guild_id: Types.IntegrationCreateUpdate) anyerror!void = undefined, + integration_delete: ?*const fn (save: T, guild_id: Types.IntegrationDelete) anyerror!void = undefined, + interaction_create: ?*const fn (save: T, interaction: Types.MessageInteraction) anyerror!void = undefined, invite_create: ?*const fn (save: T, data: Types.InviteCreate) anyerror!void = undefined, invite_delete: ?*const fn (save: T, data: Types.InviteDelete) anyerror!void = undefined, message_create: ?*const fn (save: T, message: Types.Message) anyerror!void = undefined, @@ -308,25 +309,26 @@ pub fn GatewayDispatchEvent(comptime T: type) type { message_delete: ?*const fn (save: T, log: Types.MessageDelete) anyerror!void = undefined, message_delete_bulk: ?*const fn (save: T, log: Types.MessageDeleteBulk) anyerror!void = undefined, message_reaction_add: ?*const fn (save: T, log: Types.MessageReactionAdd) anyerror!void = undefined, - // TODO: implement // message_reaction_remove: null = null, - // TODO: implement // message_reaction_remove_all: null = null, - // TODO: implement // message_reaction_remove_emoji: null = null, - // TODO: implement // presence_update: null = null, - // TODO: implement // stage_instance_create: null = null, - // TODO: implement // stage_instance_update: null = null, - // TODO: implement // stage_instance_delete: null = null, + message_reaction_remove_all: ?*const fn (save: T, data: Types.MessageReactionRemoveAll) anyerror!void = undefined, + message_reaction_remove: ?*const fn (save: T, data: Types.MessageReactionRemove) anyerror!void = undefined, + message_reaction_remove_emoji: ?*const fn (save: T, data: Types.MessageReactionRemoveEmoji) anyerror!void = undefined, + presence_update: ?*const fn (save: T, presence: Types.PresenceUpdate) anyerror!void = undefined, + stage_instance_create: ?*const fn (save: T, stage_instance: Types.StageInstance) anyerror!void = undefined, + stage_instance_update: ?*const fn (save: T, stage_instance: Types.StageInstance) anyerror!void = undefined, + stage_instance_delete: ?*const fn (save: T, stage_instance: Types.StageInstance) anyerror!void = undefined, typing_start: ?*const fn (save: T, data: Types.TypingStart) anyerror!void = undefined, /// remember this is only sent when you change your profile yourself/your bot does user_update: ?*const fn (save: T, user: Types.User) anyerror!void = undefined, // TODO: implement // voice_channel_effect_send: null = null, // TODO: implement // voice_state_update: null = null, // TODO: implement // voice_server_update: null = null, - // TODO: implement // webhooks_update: null = null, - // TODO: implement // entitlement_create: null = null, - // TODO: implement // entitlement_update: null = null, - // TODO: implement // entitlement_delete: null = null, - // TODO: implement // message_poll_vote_add: null = null, - // TODO: implement // message_poll_vote_remove: null = null, + webhooks_update: ?*const fn (save: T, fields: Types.WebhookUpdate) anyerror!void = undefined, + entitlement_create: ?*const fn (save: T, entitlement: Types.Entitlement) anyerror!void = undefined, + entitlement_update: ?*const fn (save: T, entitlement: Types.Entitlement) anyerror!void = undefined, + /// discord claims this is infrequent, therefore not throughoutly tested - Yuzu + entitlement_delete: ?*const fn (save: T, entitlement: Types.Entitlement) anyerror!void = undefined, + message_poll_vote_add: ?*const fn (save: T, poll: Types.PollVoteAdd) anyerror!void = undefined, + message_poll_vote_remove: ?*const fn (save: T, poll: Types.PollVoteRemove) anyerror!void = undefined, ready: ?*const fn (save: T, data: Types.Ready) anyerror!void = undefined, // TODO: implement // resumed: null = null, diff --git a/src/shard.zig b/src/shard.zig index fa6fc3e..4af7a20 100644 --- a/src/shard.zig +++ b/src/shard.zig @@ -386,6 +386,12 @@ pub fn handleEvent(self: *Self, name: []const u8, payload: []const u8) !void { if (self.handler.ready) |event| try event(self, ready.value.d.?); } + if (mem.eql(u8, name, "APPLICATION_COMMAND_PERMISSIONS_UPDATE")) { + const acp = try zjson.parse(GatewayPayload(Types.ApplicationCommandPermissions), self.allocator, payload); + + if (self.handler.application_command_permissions_update) |event| try event(self, acp.value.d.?); + } + if (mem.eql(u8, name, "CHANNEL_CREATE")) { const chan = try zjson.parse(GatewayPayload(Types.Channel), self.allocator, payload); @@ -404,6 +410,54 @@ pub fn handleEvent(self: *Self, name: []const u8, payload: []const u8) !void { if (self.handler.channel_delete) |event| try event(self, chan.value.d.?); } + if (mem.eql(u8, name, "CHANNEL_PINS_UPDATE")) { + const chan_pins_update = try zjson.parse(GatewayPayload(Types.ChannelPinsUpdate), self.allocator, payload); + + if (self.handler.channel_pins_update) |event| try event(self, chan_pins_update.value.d.?); + } + + if (mem.eql(u8, name, "ENTITLEMENT_CREATE")) { + const entitlement = try zjson.parse(GatewayPayload(Types.Entitlement), self.allocator, payload); + + if (self.handler.entitlement_create) |event| try event(self, entitlement.value.d.?); + } + + if (mem.eql(u8, name, "ENTITLEMENT_UPDATE")) { + const entitlement = try zjson.parse(GatewayPayload(Types.Entitlement), self.allocator, payload); + + if (self.handler.entitlement_update) |event| try event(self, entitlement.value.d.?); + } + + if (mem.eql(u8, name, "ENTITLEMENT_DELETE")) { + const entitlement = try zjson.parse(GatewayPayload(Types.Entitlement), self.allocator, payload); + + if (self.handler.entitlement_delete) |event| try event(self, entitlement.value.d.?); + } + + if (mem.eql(u8, name, "INTEGRATION_CREATE")) { + const guild_id = try zjson.parse(GatewayPayload(Types.IntegrationCreateUpdate), self.allocator, payload); + + if (self.handler.integration_create) |event| try event(self, guild_id.value.d.?); + } + + if (mem.eql(u8, name, "INTEGRATION_UPDATE")) { + const guild_id = try zjson.parse(GatewayPayload(Types.IntegrationCreateUpdate), self.allocator, payload); + + if (self.handler.integration_update) |event| try event(self, guild_id.value.d.?); + } + + if (mem.eql(u8, name, "INTEGRATION_DELETE")) { + const data = try zjson.parse(GatewayPayload(Types.IntegrationDelete), self.allocator, payload); + + if (self.handler.integration_delete) |event| try event(self, data.value.d.?); + } + + if (mem.eql(u8, name, "INTERACTION_CREATE")) { + const interaction = try zjson.parse(GatewayPayload(Types.MessageInteraction), self.allocator, payload); + + if (self.handler.interaction_create) |event| try event(self, interaction.value.d.?); + } + if (mem.eql(u8, name, "INVITE_CREATE")) { const data = try zjson.parse(GatewayPayload(Types.InviteCreate), self.allocator, payload); @@ -441,9 +495,27 @@ pub fn handleEvent(self: *Self, name: []const u8, payload: []const u8) !void { } if (mem.eql(u8, name, "MESSAGE_REACTION_ADD")) { - const data = try zjson.parse(GatewayPayload(Types.MessageReactionAdd), self.allocator, payload); + const reaction = try zjson.parse(GatewayPayload(Types.MessageReactionAdd), self.allocator, payload); - if (self.handler.message_reaction_add) |event| try event(self, data.value.d.?); + if (self.handler.message_reaction_add) |event| try event(self, reaction.value.d.?); + } + + if (mem.eql(u8, name, "MESSAGE_REACTION_REMOVE")) { + const reaction = try zjson.parse(GatewayPayload(Types.MessageReactionRemove), self.allocator, payload); + + if (self.handler.message_reaction_remove) |event| try event(self, reaction.value.d.?); + } + + if (mem.eql(u8, name, "MESSAGE_REACTION_REMOVE_ALL")) { + const data = try zjson.parse(GatewayPayload(Types.MessageReactionRemoveAll), self.allocator, payload); + + if (self.handler.message_reaction_remove_all) |event| try event(self, data.value.d.?); + } + + if (mem.eql(u8, name, "MESSAGE_REACTION_REMOVE_EMOJI")) { + const emoji = try zjson.parse(GatewayPayload(Types.MessageReactionRemoveEmoji), self.allocator, payload); + + if (self.handler.message_reaction_remove_emoji) |event| try event(self, emoji.value.d.?); } if (mem.eql(u8, name, "GUILD_CREATE")) { @@ -474,6 +546,36 @@ pub fn handleEvent(self: *Self, name: []const u8, payload: []const u8) !void { if (self.handler.guild_delete) |event| try event(self, guild.value.d.?); } + if (mem.eql(u8, name, "GUILD_SCHEDULED_EVENT_CREATE")) { + const s_event = try zjson.parse(GatewayPayload(Types.ScheduledEvent), self.allocator, payload); + + if (self.handler.guild_scheduled_event_create) |event| try event(self, s_event.value.d.?); + } + + if (mem.eql(u8, name, "GUILD_SCHEDULED_EVENT_UPDATE")) { + const s_event = try zjson.parse(GatewayPayload(Types.ScheduledEvent), self.allocator, payload); + + if (self.handler.guild_scheduled_event_update) |event| try event(self, s_event.value.d.?); + } + + if (mem.eql(u8, name, "GUILD_SCHEDULED_EVENT_DELETE")) { + const s_event = try zjson.parse(GatewayPayload(Types.ScheduledEvent), self.allocator, payload); + + if (self.handler.guild_scheduled_event_delete) |event| try event(self, s_event.value.d.?); + } + + if (mem.eql(u8, name, "GUILD_SCHEDULED_EVENT_USER_ADD")) { + const data = try zjson.parse(GatewayPayload(Types.ScheduledEventUserAdd), self.allocator, payload); + + if (self.handler.guild_scheduled_event_user_add) |event| try event(self, data.value.d.?); + } + + if (mem.eql(u8, name, "GUILD_SCHEDULED_EVENT_USER_REMOVE")) { + const data = try zjson.parse(GatewayPayload(Types.ScheduledEventUserRemove), self.allocator, payload); + + if (self.handler.guild_scheduled_event_user_remove) |event| try event(self, data.value.d.?); + } + if (mem.eql(u8, name, "GUILD_MEMBER_ADD")) { const guild_id = try zjson.parse(GatewayPayload(Types.GuildMemberAdd), self.allocator, payload); @@ -492,6 +594,12 @@ pub fn handleEvent(self: *Self, name: []const u8, payload: []const u8) !void { if (self.handler.guild_member_remove) |event| try event(self, user.value.d.?); } + if (mem.eql(u8, name, "GUILD_MEMBERS_CHUNK")) { + const data = try zjson.parse(GatewayPayload(Types.GuildMembersChunk), self.allocator, payload); + + if (self.handler.guild_members_chunk) |event| try event(self, data.value.d.?); + } + if (mem.eql(u8, name, "GUILD_ROLE_CREATE")) { const role = try zjson.parse(GatewayPayload(Types.GuildRoleCreate), self.allocator, payload); @@ -528,6 +636,57 @@ pub fn handleEvent(self: *Self, name: []const u8, payload: []const u8) !void { if (self.handler.guild_ban_remove) |event| try event(self, gbr.value.d.?); } + if (mem.eql(u8, name, "GUILD_EMOJIS_UPDATE")) { + const emojis = try zjson.parse(GatewayPayload(Types.GuildEmojisUpdate), self.allocator, payload); + + if (self.handler.guild_emojis_update) |event| try event(self, emojis.value.d.?); + } + + if (mem.eql(u8, name, "GUILD_STICKERS_UPDATE")) { + const stickers = try zjson.parse(GatewayPayload(Types.GuildStickersUpdate), self.allocator, payload); + + if (self.handler.guild_stickers_update) |event| try event(self, stickers.value.d.?); + } + + if (mem.eql(u8, name, "GUILD_INTEGRATIONS_UPDATE")) { + const guild_id = try zjson.parse(GatewayPayload(Types.GuildIntegrationsUpdate), self.allocator, payload); + + if (self.handler.guild_integrations_update) |event| try event(self, guild_id.value.d.?); + } + + if (mem.eql(u8, name, "THREAD_CREATE")) { + const thread = try zjson.parse(GatewayPayload(Types.Channel), self.allocator, payload); + + if (self.handler.thread_create) |event| try event(self, thread.value.d.?); + } + if (mem.eql(u8, name, "THREAD_UPDATE")) { + const thread = try zjson.parse(GatewayPayload(Types.Channel), self.allocator, payload); + + if (self.handler.thread_update) |event| try event(self, thread.value.d.?); + } + if (mem.eql(u8, name, "THREAD_DELETE")) { + const thread_data = try zjson.parse(GatewayPayload(Types.Partial(Types.Channel)), self.allocator, payload); + + if (self.handler.thread_delete) |event| try event(self, thread_data.value.d.?); + } + if (mem.eql(u8, name, "THREAD_LIST_SYNC")) { + const data = try zjson.parse(GatewayPayload(Types.ThreadListSync), self.allocator, payload); + + if (self.handler.thread_list_sync) |event| try event(self, data.value.d.?); + } + + if (mem.eql(u8, name, "THREAD_MEMBER_UPDATE")) { + const guild_id = try zjson.parse(GatewayPayload(Types.ThreadMemberUpdate), self.allocator, payload); + + if (self.handler.thread_member_update) |event| try event(self, guild_id.value.d.?); + } + + if (mem.eql(u8, name, "THREAD_MEMBERS_UPDATE")) { + const data = try zjson.parse(GatewayPayload(Types.ThreadMembersUpdate), self.allocator, payload); + + if (self.handler.thread_members_update) |event| try event(self, data.value.d.?); + } + if (mem.eql(u8, name, "TYPING_START")) { const data = try zjson.parse(GatewayPayload(Types.TypingStart), self.allocator, payload); @@ -540,6 +699,48 @@ pub fn handleEvent(self: *Self, name: []const u8, payload: []const u8) !void { if (self.handler.user_update) |event| try event(self, user.value.d.?); } + if (mem.eql(u8, name, "PRESENCE_UPDATE")) { + const pu = try zjson.parse(GatewayPayload(Types.PresenceUpdate), self.allocator, payload); + + if (self.handler.presence_update) |event| try event(self, pu.value.d.?); + } + + if (mem.eql(u8, name, "MESSSAGE_POLL_VOTE_ADD")) { + const data = try zjson.parse(GatewayPayload(Types.PollVoteAdd), self.allocator, payload); + + if (self.handler.message_poll_vote_add) |event| try event(self, data.value.d.?); + } + + if (mem.eql(u8, name, "MESSSAGE_POLL_VOTE_REMOVE")) { + const data = try zjson.parse(GatewayPayload(Types.PollVoteRemove), self.allocator, payload); + + if (self.handler.message_poll_vote_remove) |event| try event(self, data.value.d.?); + } + + if (mem.eql(u8, name, "WEBHOOKS_UPDATE")) { + const fields = try zjson.parse(GatewayPayload(Types.WebhookUpdate), self.allocator, payload); + + if (self.handler.webhooks_update) |event| try event(self, fields.value.d.?); + } + + if (mem.eql(u8, name, "STAGE_INSTANCE_CREATE")) { + const stage = try zjson.parse(GatewayPayload(Types.StageInstance), self.allocator, payload); + + if (self.handler.stage_instance_create) |event| try event(self, stage.value.d.?); + } + + if (mem.eql(u8, name, "STAGE_INSTANCE_UPDATE")) { + const stage = try zjson.parse(GatewayPayload(Types.StageInstance), self.allocator, payload); + + if (self.handler.stage_instance_update) |event| try event(self, stage.value.d.?); + } + + if (mem.eql(u8, name, "STAGE_INSTANCE_DELETE")) { + const stage = try zjson.parse(GatewayPayload(Types.StageInstance), self.allocator, payload); + + if (self.handler.stage_instance_delete) |event| try event(self, stage.value.d.?); + } + if (self.handler.any) |anyEvent| try anyEvent(self, payload); } diff --git a/src/structures/events.zig b/src/structures/events.zig index cd7a128..db32fc2 100644 --- a/src/structures/events.zig +++ b/src/structures/events.zig @@ -380,7 +380,11 @@ pub const GuildMemberUpdate = struct { }; /// https://discord.com/developers/docs/topics/gateway#message-reaction-remove-all -pub const MessageReactionRemoveAll = null; +pub const MessageReactionRemoveAll = struct { + channel_id: Snowflake, + message_id: Snowflake, + guild_id: ?Snowflake, +}; /// https://discord.com/developers/docs/topics/gateway#guild-role-update pub const GuildRoleUpdate = struct { @@ -400,7 +404,12 @@ pub const ScheduledEventUserAdd = struct { }; /// https://discord.com/developers/docs/topics/gateway#message-reaction-remove-emoji -pub const MessageReactionRemoveEmoji = null; +pub const MessageReactionRemoveEmoji = struct { + channel_id: Snowflake, + message_id: Snowflake, + guild_id: ?Snowflake, + emoji: Emoji, +}; /// https://discord.com/developers/docs/topics/gateway#guild-member-remove pub const GuildMemberRemove = struct {