fix make ChannelTypes an enum

This commit is contained in:
yuzu 2025-05-21 16:54:54 -05:00
parent 08728161dd
commit 61ab5564f0
5 changed files with 294 additions and 127 deletions

View File

@ -214,10 +214,12 @@ pub const FetchReq = struct {
var string = std.ArrayList(u8).init(fba.allocator());
errdefer string.deinit();
try json.stringify(object, .{}, string.writer());
try json.stringify(object, .{
.emit_null_optional_fields = true,
}, string.writer());
const result = try self.makeRequest(.POST, path, try string.toOwnedSlice());
if (result.status != .ok)
if (result.status != .ok and result.status != .created and result.status != .accepted)
return try json_helpers.parseLeft(DiscordError, T, self.allocator, try self.body.toOwnedSlice());
return try json_helpers.parseRight(DiscordError, T, self.allocator, try self.body.toOwnedSlice());
@ -244,7 +246,9 @@ pub const FetchReq = struct {
var string = std.ArrayList(u8).init(fba.allocator());
errdefer string.deinit();
try json.stringify(object, .{}, string.writer());
try json.stringify(object, .{
.emit_null_optional_fields = true,
}, string.writer());
const result = try self.makeRequestWithFiles(.POST, path, try string.toOwnedSlice(), files);
if (result.status != .ok)
@ -259,7 +263,9 @@ pub const FetchReq = struct {
var string = std.ArrayList(u8).init(fba.allocator());
errdefer string.deinit();
try json.stringify(object, .{}, string.writer());
try json.stringify(object, .{
.emit_null_optional_fields = true,
}, string.writer());
const result = try self.makeRequest(.POST, path, try string.toOwnedSlice());
if (result.status != .no_content)

View File

@ -24,6 +24,8 @@ const tls = std.crypto.tls;
const mem = std.mem;
const http = std.http;
const MAX_VALUE_LEN = 0x1000;
// todo use this to read compressed messages
const zlib = @import("zlib");
const json = std.json;
@ -199,7 +201,7 @@ inline fn _connect_ws(allocator: mem.Allocator, url: []const u8) !ws.Client {
.host = url,
});
var buf: [0x1000]u8 = undefined;
var buf: [MAX_VALUE_LEN]u8 = undefined;
const host = try std.fmt.bufPrint(&buf, "host: {s}", .{url});
conn.handshake("/?v=10&encoding=json&compress=zlib-stream", .{
@ -275,7 +277,7 @@ fn readMessage(self: *Self, _: anytype) (ReadError || SendError || ReconnectErro
const raw = try std.json.parseFromTokenSource(GatewayPayloadType, self.allocator, &scanner, .{
.ignore_unknown_fields = true,
.max_value_len = 0x1000,
.max_value_len = MAX_VALUE_LEN,
});
errdefer raw.deinit();
@ -375,7 +377,7 @@ pub fn heartbeat(self: *Self, initial_jitter: f64) SendHeartbeatError!void {
std.Thread.sleep(std.time.ns_per_ms * @as(u64, @intFromFloat(timeout)));
}
self.logif("heartbeating on shard {d}", .{self.id});
// self.logif("heartbeating on shard {d}", .{self.id});
self.rw_mutex.lock();
const last = self.heart.lastBeat;
@ -486,390 +488,390 @@ pub fn handleEvent(self: *Self, name: []const u8, payload: json.Value) !void {
if (mem.eql(u8, name, "READY")) if (self.handler.ready) |event| {
const ready = try json.parseFromValue(Types.Ready, self.allocator, payload, .{
.ignore_unknown_fields=true,
.max_value_len=0x1000,
.max_value_len=MAX_VALUE_LEN,
});
try event(self, ready.value);
};
if (mem.eql(u8, name, "APPLICATION_COMMAND_PERMISSIONS_UPDATE")) if (self.handler.application_command_permissions_update) |event| {
const acp = try json.parseFromValue(Types.ApplicationCommandPermissions, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const acp = try json.parseFromValue(Types.ApplicationCommandPermissions, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, acp.value);
};
if (mem.eql(u8, name, "CHANNEL_CREATE")) if (self.handler.channel_create) |event| {
const chan = try json.parseFromValue(Types.Channel, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const chan = try json.parseFromValue(Types.Channel, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, chan.value);
};
if (mem.eql(u8, name, "CHANNEL_UPDATE")) if (self.handler.channel_update) |event| {
const chan = try json.parseFromValue(Types.Channel, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const chan = try json.parseFromValue(Types.Channel, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, chan.value);
};
if (mem.eql(u8, name, "CHANNEL_DELETE")) if (self.handler.channel_delete) |event| {
const chan = try json.parseFromValue(Types.Channel, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const chan = try json.parseFromValue(Types.Channel, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, chan.value);
};
if (mem.eql(u8, name, "CHANNEL_PINS_UPDATE")) if (self.handler.channel_pins_update) |event| {
const chan_pins_update = try json.parseFromValue(Types.ChannelPinsUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const chan_pins_update = try json.parseFromValue(Types.ChannelPinsUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, chan_pins_update.value);
};
if (mem.eql(u8, name, "ENTITLEMENT_CREATE")) if (self.handler.entitlement_create) |event| {
const entitlement = try json.parseFromValue(Types.Entitlement, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const entitlement = try json.parseFromValue(Types.Entitlement, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, entitlement.value);
};
if (mem.eql(u8, name, "ENTITLEMENT_UPDATE")) if (self.handler.entitlement_update) |event| {
const entitlement = try json.parseFromValue(Types.Entitlement, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const entitlement = try json.parseFromValue(Types.Entitlement, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, entitlement.value);
};
if (mem.eql(u8, name, "ENTITLEMENT_DELETE")) if (self.handler.entitlement_delete) |event| {
const entitlement = try json.parseFromValue(Types.Entitlement, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const entitlement = try json.parseFromValue(Types.Entitlement, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, entitlement.value);
};
if (mem.eql(u8, name, "INTEGRATION_CREATE")) if (self.handler.integration_create) |event| {
const guild_id = try json.parseFromValue(Types.IntegrationCreateUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const guild_id = try json.parseFromValue(Types.IntegrationCreateUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, guild_id.value);
};
if (mem.eql(u8, name, "INTEGRATION_UPDATE")) if (self.handler.integration_update) |event| {
const guild_id = try json.parseFromValue(Types.IntegrationCreateUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const guild_id = try json.parseFromValue(Types.IntegrationCreateUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, guild_id.value);
};
if (mem.eql(u8, name, "INTEGRATION_DELETE")) if (self.handler.integration_delete) |event| {
const data = try json.parseFromValue(Types.IntegrationDelete, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const data = try json.parseFromValue(Types.IntegrationDelete, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, data.value);
};
if (mem.eql(u8, name, "INTERACTION_CREATE")) if (self.handler.interaction_create) |event| {
const interaction = try json.parseFromValue(Types.MessageInteraction, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const interaction = try json.parseFromValue(Types.MessageInteraction, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, interaction.value);
};
if (mem.eql(u8, name, "INVITE_CREATE")) if (self.handler.invite_create) |event| {
const data = try json.parseFromValue(Types.InviteCreate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const data = try json.parseFromValue(Types.InviteCreate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, data.value);
};
if (mem.eql(u8, name, "INVITE_DELETE")) if (self.handler.invite_delete) |event| {
const data = try json.parseFromValue(Types.InviteDelete, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const data = try json.parseFromValue(Types.InviteDelete, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, data.value);
};
if (mem.eql(u8, name, "MESSAGE_CREATE")) if (self.handler.message_create) |event| {
const message = try json.parseFromValue(Types.Message, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const message = try json.parseFromValue(Types.Message, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, message.value);
};
if (mem.eql(u8, name, "MESSAGE_DELETE")) if (self.handler.message_delete) |event| {
const data = try json.parseFromValue(Types.MessageDelete, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const data = try json.parseFromValue(Types.MessageDelete, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, data.value);
};
if (mem.eql(u8, name, "MESSAGE_UPDATE")) if (self.handler.message_update) |event| {
const message = try json.parseFromValue(Types.Message, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const message = try json.parseFromValue(Types.Message, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, message.value);
};
if (mem.eql(u8, name, "MESSAGE_DELETE_BULK")) if (self.handler.message_delete_bulk) |event| {
const data = try json.parseFromValue(Types.MessageDeleteBulk, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const data = try json.parseFromValue(Types.MessageDeleteBulk, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, data.value);
};
if (mem.eql(u8, name, "MESSAGE_REACTION_ADD")) if (self.handler.message_reaction_add) |event| {
const reaction = try json.parseFromValue(Types.MessageReactionAdd, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const reaction = try json.parseFromValue(Types.MessageReactionAdd, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, reaction.value);
};
if (mem.eql(u8, name, "MESSAGE_REACTION_REMOVE")) if (self.handler.message_reaction_remove) |event| {
const reaction = try json.parseFromValue(Types.MessageReactionRemove, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const reaction = try json.parseFromValue(Types.MessageReactionRemove, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, reaction.value);
};
if (mem.eql(u8, name, "MESSAGE_REACTION_REMOVE_ALL")) if (self.handler.message_reaction_remove_all) |event| {
const data = try json.parseFromValue(Types.MessageReactionRemoveAll, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const data = try json.parseFromValue(Types.MessageReactionRemoveAll, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, data.value);
};
if (mem.eql(u8, name, "MESSAGE_REACTION_REMOVE_EMOJI")) if (self.handler.message_reaction_remove_emoji) |event| {
const emoji = try json.parseFromValue(Types.MessageReactionRemoveEmoji, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const emoji = try json.parseFromValue(Types.MessageReactionRemoveEmoji, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, emoji.value);
};
if (mem.eql(u8, name, "GUILD_CREATE")) {
const isAvailable =
try json.parseFromValue(struct { unavailable: ?bool }, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try json.parseFromValue(struct { unavailable: ?bool }, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
if (isAvailable.value.unavailable == true) {
const guild = try json.parseFromValue(Types.Guild, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const guild = try json.parseFromValue(Types.Guild, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
if (self.handler.guild_create) |event| try event(self, guild.value);
return;
}
const guild = try json.parseFromValue(Types.UnavailableGuild, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const guild = try json.parseFromValue(Types.UnavailableGuild, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
if (self.handler.guild_create_unavailable) |event| try event(self, guild.value);
}
if (mem.eql(u8, name, "GUILD_UPDATE")) if (self.handler.guild_update) |event| {
const guild = try json.parseFromValue(Types.Guild, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const guild = try json.parseFromValue(Types.Guild, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, guild.value);
};
if (mem.eql(u8, name, "GUILD_DELETE")) if (self.handler.guild_delete) |event| {
const guild = try json.parseFromValue(Types.UnavailableGuild, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const guild = try json.parseFromValue(Types.UnavailableGuild, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, guild.value);
};
if (mem.eql(u8, name, "GUILD_SCHEDULED_EVENT_CREATE")) if (self.handler.guild_scheduled_event_create) |event| {
const s_event = try json.parseFromValue(Types.ScheduledEvent, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const s_event = try json.parseFromValue(Types.ScheduledEvent, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, s_event.value);
};
if (mem.eql(u8, name, "GUILD_SCHEDULED_EVENT_UPDATE")) if (self.handler.guild_scheduled_event_update) |event| {
const s_event = try json.parseFromValue(Types.ScheduledEvent, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const s_event = try json.parseFromValue(Types.ScheduledEvent, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, s_event.value);
};
if (mem.eql(u8, name, "GUILD_SCHEDULED_EVENT_DELETE")) if (self.handler.guild_scheduled_event_delete) |event| {
const s_event = try json.parseFromValue(Types.ScheduledEvent, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const s_event = try json.parseFromValue(Types.ScheduledEvent, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, s_event.value);
};
if (mem.eql(u8, name, "GUILD_SCHEDULED_EVENT_USER_ADD")) if (self.handler.guild_scheduled_event_user_add) |event| {
const data = try json.parseFromValue(Types.ScheduledEventUserAdd, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const data = try json.parseFromValue(Types.ScheduledEventUserAdd, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, data.value);
};
if (mem.eql(u8, name, "GUILD_SCHEDULED_EVENT_USER_REMOVE")) if (self.handler.guild_scheduled_event_user_remove) |event| {
const data = try json.parseFromValue(Types.ScheduledEventUserRemove, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const data = try json.parseFromValue(Types.ScheduledEventUserRemove, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, data.value);
};
if (mem.eql(u8, name, "GUILD_MEMBER_ADD")) if (self.handler.guild_member_add) |event| {
const guild_id = try json.parseFromValue(Types.GuildMemberAdd, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const guild_id = try json.parseFromValue(Types.GuildMemberAdd, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, guild_id.value);
};
if (mem.eql(u8, name, "GUILD_MEMBER_UPDATE")) if (self.handler.guild_member_update) |event| {
const fields = try json.parseFromValue(Types.GuildMemberUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const fields = try json.parseFromValue(Types.GuildMemberUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, fields.value);
};
if (mem.eql(u8, name, "GUILD_MEMBER_REMOVE")) if (self.handler.guild_member_remove) |event| {
const user = try json.parseFromValue(Types.GuildMemberRemove, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const user = try json.parseFromValue(Types.GuildMemberRemove, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, user.value);
};
if (mem.eql(u8, name, "GUILD_MEMBERS_CHUNK")) if (self.handler.guild_members_chunk) |event| {
const data = try json.parseFromValue(Types.GuildMembersChunk, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const data = try json.parseFromValue(Types.GuildMembersChunk, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, data.value);
};
if (mem.eql(u8, name, "GUILD_ROLE_CREATE")) if (self.handler.guild_role_create) |event| {
const role = try json.parseFromValue(Types.GuildRoleCreate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const role = try json.parseFromValue(Types.GuildRoleCreate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, role.value);
};
if (mem.eql(u8, name, "GUILD_ROLE_UPDATE")) if (self.handler.guild_role_update) |event| {
const role = try json.parseFromValue(Types.GuildRoleUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const role = try json.parseFromValue(Types.GuildRoleUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, role.value);
};
if (mem.eql(u8, name, "GUILD_ROLE_DELETE")) if (self.handler.guild_role_delete) |event| {
const role_id = try json.parseFromValue(Types.GuildRoleDelete, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const role_id = try json.parseFromValue(Types.GuildRoleDelete, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, role_id.value);
};
if (mem.eql(u8, name, "GUILD_DELETE")) if (self.handler.guild_delete) |event| {
const guild = try json.parseFromValue(Types.UnavailableGuild, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const guild = try json.parseFromValue(Types.UnavailableGuild, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, guild.value);
};
if (mem.eql(u8, name, "GUILD_BAN_ADD")) if (self.handler.guild_ban_add) |event| {
const gba = try json.parseFromValue(Types.GuildBanAddRemove, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const gba = try json.parseFromValue(Types.GuildBanAddRemove, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, gba.value);
};
if (mem.eql(u8, name, "GUILD_BAN_REMOVE")) if (self.handler.guild_ban_remove) |event| {
const gbr = try json.parseFromValue(Types.GuildBanAddRemove, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const gbr = try json.parseFromValue(Types.GuildBanAddRemove, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, gbr.value);
};
if (mem.eql(u8, name, "GUILD_EMOJIS_UPDATE")) if (self.handler.guild_emojis_update) |event| {
const emojis = try json.parseFromValue(Types.GuildEmojisUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const emojis = try json.parseFromValue(Types.GuildEmojisUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, emojis.value);
};
if (mem.eql(u8, name, "GUILD_STICKERS_UPDATE")) if (self.handler.guild_stickers_update) |event| {
const stickers = try json.parseFromValue(Types.GuildStickersUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const stickers = try json.parseFromValue(Types.GuildStickersUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, stickers.value);
};
if (mem.eql(u8, name, "GUILD_INTEGRATIONS_UPDATE")) if (self.handler.guild_integrations_update) |event| {
const guild_id = try json.parseFromValue(Types.GuildIntegrationsUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const guild_id = try json.parseFromValue(Types.GuildIntegrationsUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, guild_id.value);
};
if (mem.eql(u8, name, "THREAD_CREATE")) if (self.handler.thread_create) |event| {
const thread = try json.parseFromValue(Types.Channel, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const thread = try json.parseFromValue(Types.Channel, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, thread.value);
};
if (mem.eql(u8, name, "THREAD_UPDATE")) if (self.handler.thread_update) |event| {
const thread = try json.parseFromValue(Types.Channel, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const thread = try json.parseFromValue(Types.Channel, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, thread.value);
};
if (mem.eql(u8, name, "THREAD_DELETE")) if (self.handler.thread_delete) |event| {
const thread_data = try json.parseFromValue(Types.Partial(Types.Channel), self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const thread_data = try json.parseFromValue(Types.Partial(Types.Channel), self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, thread_data.value);
};
if (mem.eql(u8, name, "THREAD_LIST_SYNC")) if (self.handler.thread_list_sync) |event| {
const data = try json.parseFromValue(Types.ThreadListSync, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const data = try json.parseFromValue(Types.ThreadListSync, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, data.value);
};
if (mem.eql(u8, name, "THREAD_MEMBER_UPDATE")) if (self.handler.thread_member_update) |event| {
const guild_id = try json.parseFromValue(Types.ThreadMemberUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const guild_id = try json.parseFromValue(Types.ThreadMemberUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, guild_id.value);
};
if (mem.eql(u8, name, "THREAD_MEMBERS_UPDATE")) if (self.handler.thread_members_update) |event| {
const data = try json.parseFromValue(Types.ThreadMembersUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const data = try json.parseFromValue(Types.ThreadMembersUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, data.value);
};
if (mem.eql(u8, name, "TYPING_START")) if (self.handler.typing_start) |event| {
const data = try json.parseFromValue(Types.TypingStart, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const data = try json.parseFromValue(Types.TypingStart, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, data.value);
};
if (mem.eql(u8, name, "USER_UPDATE")) if (self.handler.user_update) |event| {
const user = try json.parseFromValue(Types.User, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const user = try json.parseFromValue(Types.User, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, user.value);
};
if (mem.eql(u8, name, "PRESENCE_UPDATE")) if (self.handler.presence_update) |event| {
const pu = try json.parseFromValue(Types.PresenceUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const pu = try json.parseFromValue(Types.PresenceUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, pu.value);
};
if (mem.eql(u8, name, "MESSSAGE_POLL_VOTE_ADD")) if (self.handler.message_poll_vote_add) |event| {
const data = try json.parseFromValue(Types.PollVoteAdd, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const data = try json.parseFromValue(Types.PollVoteAdd, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, data.value);
};
if (mem.eql(u8, name, "MESSSAGE_POLL_VOTE_REMOVE")) if (self.handler.message_poll_vote_remove) |event| {
const data = try json.parseFromValue(Types.PollVoteRemove, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const data = try json.parseFromValue(Types.PollVoteRemove, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, data.value);
};
if (mem.eql(u8, name, "WEBHOOKS_UPDATE")) if (self.handler.webhooks_update) |event| {
const fields = try json.parseFromValue(Types.WebhookUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const fields = try json.parseFromValue(Types.WebhookUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, fields.value);
};
if (mem.eql(u8, name, "STAGE_INSTANCE_CREATE")) if (self.handler.stage_instance_create) |event| {
const stage = try json.parseFromValue(Types.StageInstance, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const stage = try json.parseFromValue(Types.StageInstance, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, stage.value);
};
if (mem.eql(u8, name, "STAGE_INSTANCE_UPDATE")) if (self.handler.stage_instance_update) |event| {
const stage = try json.parseFromValue(Types.StageInstance, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const stage = try json.parseFromValue(Types.StageInstance, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, stage.value);
};
if (mem.eql(u8, name, "STAGE_INSTANCE_DELETE")) if (self.handler.stage_instance_delete) |event| {
const stage = try json.parseFromValue(Types.StageInstance, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const stage = try json.parseFromValue(Types.StageInstance, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, stage.value);
};
if (mem.eql(u8, name, "AUTO_MODERATION_RULE_CREATE")) if (self.handler.auto_moderation_rule_create) |event| {
const rule = try json.parseFromValue(Types.AutoModerationRule, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const rule = try json.parseFromValue(Types.AutoModerationRule, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, rule.value);
};
if (mem.eql(u8, name, "AUTO_MODERATION_RULE_UPDATE")) if (self.handler.auto_moderation_rule_update) |event| {
const rule = try json.parseFromValue(Types.AutoModerationRule, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const rule = try json.parseFromValue(Types.AutoModerationRule, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, rule.value);
};
if (mem.eql(u8, name, "AUTO_MODERATION_RULE_DELETE")) if (self.handler.auto_moderation_rule_delete) |event| {
const rule = try json.parseFromValue(Types.AutoModerationRule, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
const rule = try json.parseFromValue(Types.AutoModerationRule, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=MAX_VALUE_LEN});
try event(self, rule.value);
};
if (mem.eql(u8, name, "AUTO_MODERATION_ACTION_EXECUTION")) if (self.handler.auto_moderation_action_execution) |event| {
const ax = try json.parseFromValue(Types.AutoModerationActionExecution, self.allocator, payload, .{ .ignore_unknown_fields=true, .max_value_len = 0x1000,
const ax = try json.parseFromValue(Types.AutoModerationActionExecution, self.allocator, payload, .{ .ignore_unknown_fields=true, .max_value_len = MAX_VALUE_LEN,
});
try event(self, ax.value);

View File

@ -22,6 +22,10 @@ pub const PresenceStatus = enum {
dnd,
idle,
offline,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/resources/user#user-object-premium-types
@ -30,6 +34,10 @@ pub const PremiumTypes = enum {
NitroClassic,
Nitro,
NitroBasic,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/resources/user#user-object-user-flags
@ -522,6 +530,10 @@ pub const MessageComponentTypes = enum(u4) {
SelectMenuUsersAndRoles,
/// Select menu for channels
SelectMenuChannels,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
pub const TextStyles = enum(u4) {
@ -529,6 +541,10 @@ pub const TextStyles = enum(u4) {
Short = 1,
/// Intended for much longer inputs
Paragraph = 2,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/interactions/message-components#buttons-button-styles
@ -545,6 +561,10 @@ pub const ButtonStyles = enum(u4) {
Link,
/// A blurple button to show a Premium item in the shop
Premium,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/resources/channel#allowed-mentions-object-allowed-mention-types
@ -555,6 +575,10 @@ pub const AllowedMentionsTypes = enum {
users,
/// Controls \@everyone and \@here mentions
everyone,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/resources/webhook#webhook-object-webhook-types
@ -565,6 +589,10 @@ pub const WebhookTypes = enum(u4) {
ChannelFollower,
/// Application webhooks are webhooks used with Interactions
Application,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/resources/channel#embed-object-embed-types
@ -577,6 +605,10 @@ pub const EmbedTypes = enum {
article,
link,
poll_res,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/resources/guild#guild-object-default-message-notification-level
@ -585,6 +617,10 @@ pub const DefaultMessageNotificationLevels = enum {
AllMessages,
/// Members will receive notifications only for messages that \@mention them by default
OnlyMentions,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/resources/guild#guild-object-explicit-content-filter-level
@ -595,6 +631,10 @@ pub const ExplicitContentFilterLevels = enum {
MembersWithoutRoles,
/// Media content sent by all members will be scanned
AllMembers,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/resources/guild#guild-object-verification-level
@ -609,6 +649,10 @@ pub const VerificationLevels = enum {
High,
/// Must have a verified phone number
VeryHigh,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/resources/guild#guild-object-guild-features
@ -665,6 +709,10 @@ pub const GuildFeatures = enum {
RAID_ALERTS_DISABLED,
/// Guild is using the old permissions configuration behavior
APPLICATION_COMMAND_PERMISSIONS_V2,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/resources/guild#guild-object-mfa-level
@ -673,6 +721,10 @@ pub const MfaLevels = enum {
None,
/// Guild has a 2FA requirement for moderation actions
Elevated,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/resources/guild#guild-object-system-channel-flags
@ -722,6 +774,10 @@ pub const PremiumTiers = enum {
Tier2,
/// Guild has unlocked Server Boost level 3 perks
Tier3,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/resources/guild#guild-object-guild-nsfw-level
@ -730,67 +786,53 @@ pub const GuildNsfwLevel = enum {
Explicit,
Safe,
AgeRestricted,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/resources/channel#channel-object-channel-types
pub const ChannelTypes = packed struct {
pub fn toRaw(self: ChannelTypes) u32 {
return @bitCast(self);
}
pub fn fromRaw(raw: u32) ChannelTypes {
return @bitCast(raw);
}
pub fn jsonParse(allocator: std.mem.Allocator, src: anytype, _: std.json.ParseOptions) !@This() {
const value = try std.json.innerParse(std.json.Value, allocator, src, .{
.ignore_unknown_fields = true,
.max_value_len = 0x1000,
});
if (value != .integer) @panic("Invalid value for bitfield");
return fromRaw(@intCast(value.integer));
}
pub fn jsonParseFromValue(_: std.mem.Allocator, src: std.json.Value, _: std.json.ParseOptions) @This() {
if (src != .integer) @panic("Invalid value for bitfield");
return fromRaw(@intCast(src.integer));
}
pub const ChannelTypes = enum(u16) {
/// A text channel within a server
GuildText: bool = false,
GuildText,
/// A direct message between users
DM: bool = false,
DM,
/// A voice channel within a server
GuildVoice: bool = false,
GuildVoice,
/// A direct message between multiple users
GroupDm: bool = false,
GroupDm,
/// An organizational category that contains up to 50 channels
GuildCategory: bool = false,
GuildCategory,
/// A channel that users can follow and crosspost into their own server
GuildAnnouncement: bool = false,
_pad: u4 = 0,
GuildAnnouncement,
/// A temporary sub-channel within a GUILD_ANNOUNCEMENT channel
AnnouncementThread: bool = false,
AnnouncementThread = 10,
/// A temporary sub-channel within a GUILD_TEXT or GUILD_FORUM channel
PublicThread: bool = false,
PublicThread,
/// A temporary sub-channel within a GUILD_TEXT channel that is only viewable by those invited and those with the MANAGE_THREADS permission
PrivateThread: bool = false,
PrivateThread,
/// A voice channel for hosting events with an audience
GuildStageVoice: bool = false,
GuildStageVoice,
/// A channel in a hub containing the listed servers
GuildDirectory: bool = false,
GuildDirectory,
/// A channel which can only contains threads
GuildForum: bool = false,
GuildForum,
/// Channel that can only contain threads, similar to GUILD_FORUM channels
GuildMedia: bool = false,
_pad1: u15 = 0,
GuildMedia,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
pub const OverwriteTypes = enum {
Role,
Member,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
pub const VideoQualityModes = enum(u4) {
@ -798,6 +840,10 @@ pub const VideoQualityModes = enum(u4) {
Auto = 1,
/// 720p
Full,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/topics/gateway-events#activity-object-activity-types
@ -808,6 +854,10 @@ pub const ActivityTypes = enum(u4) {
Watching = 3,
Custom = 4,
Competing = 5,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/resources/channel#message-object-message-types
@ -849,6 +899,10 @@ pub const MessageTypes = enum(u8) {
GuildIncidentReportFalseAlarm,
PurchaseNotification = 44,
PollResult = 46,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/resources/channel#message-object-message-activity-types
@ -857,6 +911,10 @@ pub const MessageActivityTypes = enum(u4) {
Spectate = 2,
Listen = 3,
JoinRequest = 5,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/resources/sticker#sticker-object-sticker-types
@ -865,6 +923,10 @@ pub const StickerTypes = enum(u4) {
Standard = 1,
/// a sticker uploaded to a guild for the guild's members
Guild = 2,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/resources/sticker#sticker-object-sticker-format-types
@ -873,6 +935,10 @@ pub const StickerFormatTypes = enum(u4) {
APng,
Lottie,
Gif,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/interactions/slash-commands#interaction-interactiontype
@ -882,6 +948,10 @@ pub const InteractionTypes = enum(u4) {
MessageComponent = 3,
ApplicationCommandAutocomplete = 4,
ModalSubmit = 5,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/interactions/slash-commands#applicationcommandoptiontype
@ -897,6 +967,10 @@ pub const ApplicationCommandOptionTypes = enum(u4) {
Mentionable,
Number,
Attachment,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/resources/audit-log#audit-log-entry-object-audit-log-events
@ -1027,17 +1101,29 @@ pub const AuditLogEvents = enum(u4) {
HomeSettingsCreate = 190,
/// Guild Server Guide was updated
HomeSettingsUpdate,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
pub const ScheduledEventPrivacyLevel = enum(u4) {
/// the scheduled event is only accessible to guild members
GuildOnly = 2,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
pub const ScheduledEventEntityType = enum(u4) {
StageInstance = 1,
Voice,
External,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
pub const ScheduledEventStatus = enum(u4) {
@ -1045,12 +1131,20 @@ pub const ScheduledEventStatus = enum(u4) {
Active,
Completed,
Canceled,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/resources/invite#invite-object-target-user-types
pub const TargetTypes = enum(u4) {
Stream = 1,
EmbeddedApplication,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
pub const ApplicationCommandTypes = enum(u4) {
@ -1062,12 +1156,20 @@ pub const ApplicationCommandTypes = enum(u4) {
Message,
/// A UI-based command that represents the primary way to invoke an app's Activity
PrimaryEntryPoint,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
pub const ApplicationCommandPermissionTypes = enum(u4) {
Role = 1,
User,
Channel,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/topics/permissions#permissions-bitwise-permission-flags
@ -1331,6 +1433,10 @@ pub const GatewayCloseEventCodes = enum(u16) {
InvalidIntents,
/// You sent a disallowed intent for a [Gateway Intent](https://discord.com/developers/docs/topics/gateway#gateway-intents). You may have tried to specify an intent that you [have not enabled or are not approved for](https://discord.com/developers/docs/topics/gateway#privileged-intents).
DisallowedIntents,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/topics/opcodes-and-status-codes#gateway-gateway-opcodes
@ -1357,6 +1463,10 @@ pub const GatewayOpcodes = enum(u4) {
Hello,
/// Sent in response to receiving a heartbeat to acknowledge that it has been received.
HeartbeatACK,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
pub const GatewayDispatchEventNames = union(enum) {
@ -1458,6 +1568,10 @@ pub const InteractionResponseTypes = enum(u4) {
/// @remarks
/// Only available for apps with Activities enabled
LaunchActivity = 12,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
pub const SortOrderTypes = enum {
@ -1465,6 +1579,10 @@ pub const SortOrderTypes = enum {
LatestActivity,
/// Sort forum posts by creation time (from most recent to oldest)
CreationDate,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
pub const ForumLayout = enum {
@ -1474,6 +1592,10 @@ pub const ForumLayout = enum {
ListView,
/// Display posts as a collection of tiles.
GalleryView,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@intFromEnum(self)});
}
};
/// https://discord.com/developers/docs/reference#image-formatting
@ -1662,4 +1784,8 @@ pub const InteractionContextType = enum {
BotDm,
/// Interaction can be used within Group DMs and DMs other than the app's bot user
PrivateChannel,
pub fn jsonStringify(self: @This(), writer: anytype) !void {
try writer.print("{d}", .{@enumFromInt(self)});
}
};

View File

@ -17,6 +17,8 @@
const std = @import("std");
const json = std.json;
const MAX_VALUE_LEN = 0x1000;
/// a hashmap for key value pairs
/// where every key is an int
///
@ -49,7 +51,7 @@ pub fn AssociativeArray(comptime E: type, comptime V: type) type {
const value = try std.json.innerParse(std.json.Value, allocator, src, .{
.ignore_unknown_fields = true,
.max_value_len = 0x100
.max_value_len = MAX_VALUE_LEN
});
var iterator = value.object.iterator();
@ -63,7 +65,7 @@ pub fn AssociativeArray(comptime E: type, comptime V: type) type {
const val = try std.json.parseFromValueLeaky(V, allocator, v, .{
.ignore_unknown_fields = true,
.max_value_len = 0x100,
.max_value_len = MAX_VALUE_LEN,
});
map.put(@enumFromInt(int), val);
@ -98,7 +100,7 @@ pub fn DiscriminatedUnion(comptime U: type, comptime key: []const u8) type {
const value = try std.json.innerParse(std.json.Value, allocator, src, .{
.ignore_unknown_fields = true,
.max_value_len = 0x100
.max_value_len = MAX_VALUE_LEN
});
const discriminator = value.object.get(key) orelse
@ -114,7 +116,7 @@ pub fn DiscriminatedUnion(comptime U: type, comptime key: []const u8) type {
comptime std.debug.assert(@hasField(T, key));
u = @unionInit(U, field.name, try std.json.innerParse(T, allocator, src, .{
.ignore_unknown_fields = true,
.max_value_len = 0x100,
.max_value_len = MAX_VALUE_LEN,
}));
}
}
@ -131,7 +133,7 @@ pub fn Record(comptime T: type) type {
pub fn jsonParse(allocator: std.mem.Allocator, src: anytype, _: json.ParseOptions) !@This() {
const value = try std.json.innerParse(std.json.Value, allocator, src, .{
.ignore_unknown_fields = true,
.max_value_len = 0x100
.max_value_len = MAX_VALUE_LEN
});
errdefer value.object.deinit();
@ -148,7 +150,7 @@ pub fn Record(comptime T: type) type {
// errdefer v.deinit(allocator);
try map.put(allocator, k, try std.json.parseFromValue(T, allocator, v, .{
.ignore_unknown_fields = true,
.max_value_len = 0x100,
.max_value_len = MAX_VALUE_LEN,
}));
}
@ -229,12 +231,12 @@ pub fn parseRight(comptime L: type, comptime R: type, child_allocator: std.mem.A
const allocator = owned.arena.allocator();
const value = try json.parseFromSliceLeaky(json.Value, allocator, data, .{
.ignore_unknown_fields = true,
.max_value_len = 0x100,
.max_value_len = MAX_VALUE_LEN,
});
owned.value = .{ .right = try json.parseFromValueLeaky(R, allocator, value, .{
.ignore_unknown_fields = true,
.max_value_len = 0x100,
.max_value_len = MAX_VALUE_LEN,
}) };
errdefer owned.arena.deinit();
@ -252,12 +254,12 @@ pub fn parseLeft(comptime L: type, comptime R: type, child_allocator: std.mem.Al
const allocator = owned.arena.allocator();
const value = try json.parseFromSliceLeaky(json.Value, allocator, data, .{
.ignore_unknown_fields = true,
.max_value_len = 0x100,
.max_value_len = MAX_VALUE_LEN,
});
owned.value = .{ .left = try json.parseFromValueLeaky(L, allocator, value, .{
.ignore_unknown_fields = true,
.max_value_len = 0x100,
.max_value_len = MAX_VALUE_LEN,
}) };
errdefer owned.arena.deinit();

View File

@ -25,12 +25,43 @@ fn ready(_: *Shard, payload: Discord.Ready) !void {
}
fn message_create(_: *Shard, message: Discord.Message) !void {
if (message.content != null and std.ascii.eqlIgnoreCase(message.content.?, "!hi")) {
var result = try session.api.sendMessage(message.channel_id, .{ .content = "hi :)" });
defer result.deinit();
if (message.content != null) {
if (std.ascii.eqlIgnoreCase(message.content.?, "!hi")) {
var result = try session.api.sendMessage(message.channel_id, .{ .content = "hi :)" });
defer result.deinit();
const m = result.value.unwrap();
std.debug.print("sent: {?s}\n", .{m.content});
const m = result.value.unwrap();
std.debug.print("sent: {?s}\n", .{m.content});
}
if (std.ascii.eqlIgnoreCase(message.content.?, "!ping")) {
var result = try session.api.sendMessage(message.channel_id, .{ .content = "pong" });
defer result.deinit();
const m = result.value.unwrap();
std.debug.print("sent: {?s}\n", .{m.content});
}
if (std.ascii.eqlIgnoreCase(message.content.?, "!create-channel")) {
var result = try session.api.createChannel(message.guild_id.?, .{
.name = "test-channel",
.type = .GuildText,
.topic = null,
.bitrate = null,
.permission_overwrites = null,
.nsfw = false,
.default_reaction_emoji = null,
.available_tags = null,
});
defer result.deinit();
switch (result.value) {
.left => |err| {
std.debug.print("error creating channel: {any}\n", .{err});
},
.right => |channel| {
std.debug.print("created channel: {?s}\n", .{channel.name});
},
}
}
}
}