finally finished

This commit is contained in:
Yuzu 2025-04-11 22:21:20 -05:00
parent b56b7062cf
commit f57bbdcf5d
33 changed files with 6045 additions and 5752 deletions

View File

@ -355,6 +355,6 @@ pub fn GatewayDispatchEvent(comptime T: type) type {
ready: ?*const fn (save: T, data: Types.Ready) anyerror!void = undefined,
// TODO: implement // resumed: null = null,
any: ?*const fn (save: T, data: []const u8) anyerror!void = undefined,
any: ?*const fn (save: T, data: std.json.Value) anyerror!void = undefined,
};
}

View File

@ -48,6 +48,7 @@ pub fn AssociativeArray(comptime E: type, comptime V: type) type {
var map: std.EnumMap(E, V) = .{};
const value = try std.json.innerParse(std.json.Value, allocator, src, .{
.ignore_unknown_fields = true,
.max_value_len = 0x100
});
@ -60,7 +61,10 @@ pub fn AssociativeArray(comptime E: type, comptime V: type) type {
// eg: enum(u8) would be @"enum".tag_type where tag_type is a u8
const int = std.fmt.parseInt(@typeInfo(E).@"enum".tag_type, k, 10) catch unreachable;
const val = try std.json.parseFromValueLeaky(V, allocator, v, .{.max_value_len = 0x100});
const val = try std.json.parseFromValueLeaky(V, allocator, v, .{
.ignore_unknown_fields = true,
.max_value_len = 0x100,
});
map.put(@enumFromInt(int), val);
}
@ -93,6 +97,7 @@ pub fn DiscriminatedUnion(comptime U: type, comptime key: []const u8) type {
// and should have a key "type" or whichever key might be
const value = try std.json.innerParse(std.json.Value, allocator, src, .{
.ignore_unknown_fields = true,
.max_value_len = 0x100
});
@ -107,7 +112,10 @@ pub fn DiscriminatedUnion(comptime U: type, comptime key: []const u8) type {
if (field.value == tag) {
const T = comptime std.meta.fields(U)[field.value].type;
comptime std.debug.assert(@hasField(T, key));
u = @unionInit(U, field.name, try std.json.innerParse(T, allocator, src, .{.max_value_len = 0x100}));
u = @unionInit(U, field.name, try std.json.innerParse(T, allocator, src, .{
.ignore_unknown_fields = true,
.max_value_len = 0x100,
}));
}
}
@ -122,6 +130,7 @@ pub fn Record(comptime T: type) type {
map: std.StringHashMapUnmanaged(T),
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
});
@ -137,7 +146,10 @@ pub fn Record(comptime T: type) type {
// might leak because std.json is retarded
// errdefer allocator.free(k);
// errdefer v.deinit(allocator);
try map.put(allocator, k, try std.json.parseFromValue(T, allocator, v, .{ .max_value_len =0x100}));
try map.put(allocator, k, try std.json.parseFromValue(T, allocator, v, .{
.ignore_unknown_fields = true,
.max_value_len = 0x100,
}));
}
return .{ .map = map };
@ -216,10 +228,14 @@ pub fn parseRight(comptime L: type, comptime R: type, child_allocator: std.mem.A
owned.arena.* = .init(child_allocator);
const allocator = owned.arena.allocator();
const value = try json.parseFromSliceLeaky(json.Value, allocator, data, .{
.ignore_unknown_fields = true,
.max_value_len = 0x100,
});
owned.value = .{ .right = try json.parseFromValueLeaky(R, allocator, value, .{.max_value_len = 0x100}) };
owned.value = .{ .right = try json.parseFromValueLeaky(R, allocator, value, .{
.ignore_unknown_fields = true,
.max_value_len = 0x100,
}) };
errdefer owned.arena.deinit();
return owned;
@ -235,10 +251,14 @@ pub fn parseLeft(comptime L: type, comptime R: type, child_allocator: std.mem.Al
owned.arena.* = .init(child_allocator);
const allocator = owned.arena.allocator();
const value = try json.parseFromSliceLeaky(json.Value, allocator, data, .{
.ignore_unknown_fields = true,
.max_value_len = 0x100,
});
owned.value = .{ .left = try json.parseFromValueLeaky(L, allocator, value, .{.max_value_len = 0x100}) };
owned.value = .{ .left = try json.parseFromValueLeaky(L, allocator, value, .{
.ignore_unknown_fields = true,
.max_value_len = 0x100,
}) };
errdefer owned.arena.deinit();
return owned;

View File

@ -43,7 +43,6 @@ const Bucket = @import("internal.zig").Bucket;
const default_identify_properties = @import("internal.zig").default_identify_properties;
const Types = @import("./structures/types.zig");
const GatewayPayload = Types.GatewayPayload;
const Opcode = Types.GatewayOpcodes;
const Intents = Types.Intents;
@ -200,7 +199,7 @@ inline fn _connect_ws(allocator: mem.Allocator, url: []const u8) !ws.Client {
.host = url,
});
var buf: [0x100]u8 = undefined;
var buf: [0x1000]u8 = undefined;
const host = try std.fmt.bufPrint(&buf, "host: {s}", .{url});
conn.handshake("/?v=10&encoding=json&compress=zlib-stream", .{
@ -234,28 +233,41 @@ fn readMessage(self: *Self, _: anytype) !void {
const decompressed = try self.inflator.decompressAllAlloc(buf);
defer self.allocator.free(decompressed);
// we use std.json here because I believe it'll perform better
const raw = try std.json.parseFromSlice(struct {
// std.debug.print("Decompressed: {s}\n", .{decompressed});
std.debug.assert(std.json.validate(self.allocator, decompressed) catch
@panic("Invalid JSON"));
// for some reason std.json breaks when you use a generic
const GatewayPayloadType = struct{
/// opcode for the payload
op: isize,
d: std.json.Value,
s: ?i64,
t: ?[]const u8,
}, self.allocator, decompressed, .{});
defer raw.deinit();
/// Event data
d: ?std.json.Value = null,
/// Sequence isize, used for resuming sessions and heartbeats
s: ?isize = null,
/// The event name for this payload
t: ?[]const u8 = null,
};
const raw = try std.json.parseFromSlice(GatewayPayloadType, self.allocator, decompressed, .{
.ignore_unknown_fields = true,
.max_value_len = 0x1000,
});
errdefer raw.deinit();
const payload = raw.value;
switch (@as(Opcode, @enumFromInt(payload.op))) {
.Dispatch => {
// maybe use threads and call it instead from there
if (payload.t) |name| {
self.sequence.store(payload.s orelse 0, .monotonic);
try self.handleEvent(name, decompressed);
try self.handleEvent(name, payload.d.?);
}
},
.Hello => {
const HelloPayload = struct { heartbeat_interval: u64, _trace: [][]const u8 };
const parsed = try std.json.parseFromValue(HelloPayload, self.allocator, payload.d, .{});
const parsed = try std.json.parseFromValue(HelloPayload, self.allocator, payload.d.?, .{});
defer parsed.deinit();
const helloPayload = parsed.value;
@ -300,7 +312,7 @@ fn readMessage(self: *Self, _: anytype) !void {
session_id: []const u8,
seq: ?isize,
};
const parsed = try std.json.parseFromValue(WithSequence, self.allocator, payload.d, .{});
const parsed = try std.json.parseFromValue(WithSequence, self.allocator, payload.d.?, .{});
defer parsed.deinit();
const resume_payload = parsed.value;
@ -396,398 +408,402 @@ pub fn send(self: *Self, _: bool, data: anytype) SendError!void {
try self.client.write(try string.toOwnedSlice());
}
pub fn handleEvent(self: *Self, name: []const u8, payload: []const u8) !void {
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.parseFromSlice(GatewayPayload(Types.Ready), self.allocator, payload, .{.max_value_len=0x100});
const ready = try json.parseFromValue(Types.Ready, self.allocator, payload, .{
.ignore_unknown_fields=true,
.max_value_len=0x1000,
});
try event(self, ready.value.d.?);
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.parseFromSlice(GatewayPayload(Types.ApplicationCommandPermissions), self.allocator, payload, .{.max_value_len=0x100});
const acp = try json.parseFromValue(Types.ApplicationCommandPermissions, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, acp.value.d.?);
try event(self, acp.value);
};
if (mem.eql(u8, name, "CHANNEL_CREATE")) if (self.handler.channel_create) |event| {
const chan = try json.parseFromSlice(GatewayPayload(Types.Channel), self.allocator, payload, .{.max_value_len=0x100});
const chan = try json.parseFromValue(Types.Channel, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, chan.value.d.?);
try event(self, chan.value);
};
if (mem.eql(u8, name, "CHANNEL_UPDATE")) if (self.handler.channel_update) |event| {
const chan = try json.parseFromSlice(GatewayPayload(Types.Channel), self.allocator, payload, .{.max_value_len=0x100});
const chan = try json.parseFromValue(Types.Channel, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, chan.value.d.?);
try event(self, chan.value);
};
if (mem.eql(u8, name, "CHANNEL_DELETE")) if (self.handler.channel_delete) |event| {
const chan = try json.parseFromSlice(GatewayPayload(Types.Channel), self.allocator, payload, .{.max_value_len=0x100});
const chan = try json.parseFromValue(Types.Channel, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, chan.value.d.?);
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.parseFromSlice(GatewayPayload(Types.ChannelPinsUpdate), self.allocator, payload, .{.max_value_len=0x100});
const chan_pins_update = try json.parseFromValue(Types.ChannelPinsUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, chan_pins_update.value.d.?);
try event(self, chan_pins_update.value);
};
if (mem.eql(u8, name, "ENTITLEMENT_CREATE")) if (self.handler.entitlement_create) |event| {
const entitlement = try json.parseFromSlice(GatewayPayload(Types.Entitlement), self.allocator, payload, .{.max_value_len=0x100});
const entitlement = try json.parseFromValue(Types.Entitlement, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, entitlement.value.d.?);
try event(self, entitlement.value);
};
if (mem.eql(u8, name, "ENTITLEMENT_UPDATE")) if (self.handler.entitlement_update) |event| {
const entitlement = try json.parseFromSlice(GatewayPayload(Types.Entitlement), self.allocator, payload, .{.max_value_len=0x100});
const entitlement = try json.parseFromValue(Types.Entitlement, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, entitlement.value.d.?);
try event(self, entitlement.value);
};
if (mem.eql(u8, name, "ENTITLEMENT_DELETE")) if (self.handler.entitlement_delete) |event| {
const entitlement = try json.parseFromSlice(GatewayPayload(Types.Entitlement), self.allocator, payload, .{.max_value_len=0x100});
const entitlement = try json.parseFromValue(Types.Entitlement, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, entitlement.value.d.?);
try event(self, entitlement.value);
};
if (mem.eql(u8, name, "INTEGRATION_CREATE")) if (self.handler.integration_create) |event| {
const guild_id = try json.parseFromSlice(GatewayPayload(Types.IntegrationCreateUpdate), self.allocator, payload, .{.max_value_len=0x100});
const guild_id = try json.parseFromValue(Types.IntegrationCreateUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, guild_id.value.d.?);
try event(self, guild_id.value);
};
if (mem.eql(u8, name, "INTEGRATION_UPDATE")) if (self.handler.integration_update) |event| {
const guild_id = try json.parseFromSlice(GatewayPayload(Types.IntegrationCreateUpdate), self.allocator, payload, .{.max_value_len=0x100});
const guild_id = try json.parseFromValue(Types.IntegrationCreateUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, guild_id.value.d.?);
try event(self, guild_id.value);
};
if (mem.eql(u8, name, "INTEGRATION_DELETE")) if (self.handler.integration_delete) |event| {
const data = try json.parseFromSlice(GatewayPayload(Types.IntegrationDelete), self.allocator, payload, .{.max_value_len=0x100});
const data = try json.parseFromValue(Types.IntegrationDelete, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, data.value.d.?);
try event(self, data.value);
};
if (mem.eql(u8, name, "INTERACTION_CREATE")) if (self.handler.interaction_create) |event| {
const interaction = try json.parseFromSlice(GatewayPayload(Types.MessageInteraction), self.allocator, payload, .{.max_value_len=0x100});
const interaction = try json.parseFromValue(Types.MessageInteraction, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, interaction.value.d.?);
try event(self, interaction.value);
};
if (mem.eql(u8, name, "INVITE_CREATE")) if (self.handler.invite_create) |event| {
const data = try json.parseFromSlice(GatewayPayload(Types.InviteCreate), self.allocator, payload, .{.max_value_len=0x100});
const data = try json.parseFromValue(Types.InviteCreate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, data.value.d.?);
try event(self, data.value);
};
if (mem.eql(u8, name, "INVITE_DELETE")) if (self.handler.invite_delete) |event| {
const data = try json.parseFromSlice(GatewayPayload(Types.InviteDelete), self.allocator, payload, .{.max_value_len=0x100});
const data = try json.parseFromValue(Types.InviteDelete, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, data.value.d.?);
try event(self, data.value);
};
if (mem.eql(u8, name, "MESSAGE_CREATE")) if (self.handler.message_create) |event| {
const message = try json.parseFromSlice(GatewayPayload(Types.Message), self.allocator, payload, .{.max_value_len=0x100});
const message = try json.parseFromValue(Types.Message, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, message.value.d.?);
try event(self, message.value);
};
if (mem.eql(u8, name, "MESSAGE_DELETE")) if (self.handler.message_delete) |event| {
const data = try json.parseFromSlice(GatewayPayload(Types.MessageDelete), self.allocator, payload, .{.max_value_len=0x100});
const data = try json.parseFromValue(Types.MessageDelete, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, data.value.d.?);
try event(self, data.value);
};
if (mem.eql(u8, name, "MESSAGE_UPDATE")) if (self.handler.message_update) |event| {
const message = try json.parseFromSlice(GatewayPayload(Types.Message), self.allocator, payload, .{.max_value_len=0x100});
const message = try json.parseFromValue(Types.Message, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, message.value.d.?);
try event(self, message.value);
};
if (mem.eql(u8, name, "MESSAGE_DELETE_BULK")) if (self.handler.message_delete_bulk) |event| {
const data = try json.parseFromSlice(GatewayPayload(Types.MessageDeleteBulk), self.allocator, payload, .{.max_value_len=0x100});
const data = try json.parseFromValue(Types.MessageDeleteBulk, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, data.value.d.?);
try event(self, data.value);
};
if (mem.eql(u8, name, "MESSAGE_REACTION_ADD")) if (self.handler.message_reaction_add) |event| {
const reaction = try json.parseFromSlice(GatewayPayload(Types.MessageReactionAdd), self.allocator, payload, .{.max_value_len=0x100});
const reaction = try json.parseFromValue(Types.MessageReactionAdd, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, reaction.value.d.?);
try event(self, reaction.value);
};
if (mem.eql(u8, name, "MESSAGE_REACTION_REMOVE")) if (self.handler.message_reaction_remove) |event| {
const reaction = try json.parseFromSlice(GatewayPayload(Types.MessageReactionRemove), self.allocator, payload, .{.max_value_len=0x100});
const reaction = try json.parseFromValue(Types.MessageReactionRemove, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, reaction.value.d.?);
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.parseFromSlice(GatewayPayload(Types.MessageReactionRemoveAll), self.allocator, payload, .{.max_value_len=0x100});
const data = try json.parseFromValue(Types.MessageReactionRemoveAll, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, data.value.d.?);
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.parseFromSlice(GatewayPayload(Types.MessageReactionRemoveEmoji), self.allocator, payload, .{.max_value_len=0x100});
const emoji = try json.parseFromValue(Types.MessageReactionRemoveEmoji, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, emoji.value.d.?);
try event(self, emoji.value);
};
if (mem.eql(u8, name, "GUILD_CREATE")) {
const isAvailable =
try json.parseFromSlice(GatewayPayload(struct { unavailable: ?bool }), self.allocator, payload, .{.max_value_len=0x100});
try json.parseFromValue(struct { unavailable: ?bool }, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
if (isAvailable.value.d.?.unavailable == true) {
const guild = try json.parseFromSlice(GatewayPayload(Types.Guild), self.allocator, payload, .{.max_value_len=0x100});
if (isAvailable.value.unavailable == true) {
const guild = try json.parseFromValue(Types.Guild, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
if (self.handler.guild_create) |event| try event(self, guild.value.d.?);
if (self.handler.guild_create) |event| try event(self, guild.value);
return;
}
const guild = try json.parseFromSlice(GatewayPayload(Types.UnavailableGuild), self.allocator, payload, .{.max_value_len=0x100});
const guild = try json.parseFromValue(Types.UnavailableGuild, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
if (self.handler.guild_create_unavailable) |event| try event(self, guild.value.d.?);
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.parseFromSlice(GatewayPayload(Types.Guild), self.allocator, payload, .{.max_value_len=0x100});
const guild = try json.parseFromValue(Types.Guild, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, guild.value.d.?);
try event(self, guild.value);
};
if (mem.eql(u8, name, "GUILD_DELETE")) if (self.handler.guild_delete) |event| {
const guild = try json.parseFromSlice(GatewayPayload(Types.UnavailableGuild), self.allocator, payload, .{.max_value_len=0x100});
const guild = try json.parseFromValue(Types.UnavailableGuild, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, guild.value.d.?);
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.parseFromSlice(GatewayPayload(Types.ScheduledEvent), self.allocator, payload, .{.max_value_len=0x100});
const s_event = try json.parseFromValue(Types.ScheduledEvent, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, s_event.value.d.?);
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.parseFromSlice(GatewayPayload(Types.ScheduledEvent), self.allocator, payload, .{.max_value_len=0x100});
const s_event = try json.parseFromValue(Types.ScheduledEvent, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, s_event.value.d.?);
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.parseFromSlice(GatewayPayload(Types.ScheduledEvent), self.allocator, payload, .{.max_value_len=0x100});
const s_event = try json.parseFromValue(Types.ScheduledEvent, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, s_event.value.d.?);
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.parseFromSlice(GatewayPayload(Types.ScheduledEventUserAdd), self.allocator, payload, .{.max_value_len=0x100});
const data = try json.parseFromValue(Types.ScheduledEventUserAdd, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, data.value.d.?);
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.parseFromSlice(GatewayPayload(Types.ScheduledEventUserRemove), self.allocator, payload, .{.max_value_len=0x100});
const data = try json.parseFromValue(Types.ScheduledEventUserRemove, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, data.value.d.?);
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.parseFromSlice(GatewayPayload(Types.GuildMemberAdd), self.allocator, payload, .{.max_value_len=0x100});
const guild_id = try json.parseFromValue(Types.GuildMemberAdd, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, guild_id.value.d.?);
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.parseFromSlice(GatewayPayload(Types.GuildMemberUpdate), self.allocator, payload, .{.max_value_len=0x100});
const fields = try json.parseFromValue(Types.GuildMemberUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, fields.value.d.?);
try event(self, fields.value);
};
if (mem.eql(u8, name, "GUILD_MEMBER_REMOVE")) if (self.handler.guild_member_remove) |event| {
const user = try json.parseFromSlice(GatewayPayload(Types.GuildMemberRemove), self.allocator, payload, .{.max_value_len=0x100});
const user = try json.parseFromValue(Types.GuildMemberRemove, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, user.value.d.?);
try event(self, user.value);
};
if (mem.eql(u8, name, "GUILD_MEMBERS_CHUNK")) if (self.handler.guild_members_chunk) |event| {
const data = try json.parseFromSlice(GatewayPayload(Types.GuildMembersChunk), self.allocator, payload, .{.max_value_len=0x100});
const data = try json.parseFromValue(Types.GuildMembersChunk, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, data.value.d.?);
try event(self, data.value);
};
if (mem.eql(u8, name, "GUILD_ROLE_CREATE")) if (self.handler.guild_role_create) |event| {
const role = try json.parseFromSlice(GatewayPayload(Types.GuildRoleCreate), self.allocator, payload, .{.max_value_len=0x100});
const role = try json.parseFromValue(Types.GuildRoleCreate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, role.value.d.?);
try event(self, role.value);
};
if (mem.eql(u8, name, "GUILD_ROLE_UPDATE")) if (self.handler.guild_role_update) |event| {
const role = try json.parseFromSlice(GatewayPayload(Types.GuildRoleUpdate), self.allocator, payload, .{.max_value_len=0x100});
const role = try json.parseFromValue(Types.GuildRoleUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, role.value.d.?);
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.parseFromSlice(GatewayPayload(Types.GuildRoleDelete), self.allocator, payload, .{.max_value_len=0x100});
const role_id = try json.parseFromValue(Types.GuildRoleDelete, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, role_id.value.d.?);
try event(self, role_id.value);
};
if (mem.eql(u8, name, "GUILD_DELETE")) if (self.handler.guild_delete) |event| {
const guild = try json.parseFromSlice(GatewayPayload(Types.UnavailableGuild), self.allocator, payload, .{.max_value_len=0x100});
const guild = try json.parseFromValue(Types.UnavailableGuild, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, guild.value.d.?);
try event(self, guild.value);
};
if (mem.eql(u8, name, "GUILD_BAN_ADD")) if (self.handler.guild_ban_add) |event| {
const gba = try json.parseFromSlice(GatewayPayload(Types.GuildBanAddRemove), self.allocator, payload, .{.max_value_len=0x100});
const gba = try json.parseFromValue(Types.GuildBanAddRemove, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, gba.value.d.?);
try event(self, gba.value);
};
if (mem.eql(u8, name, "GUILD_BAN_REMOVE")) if (self.handler.guild_ban_remove) |event| {
const gbr = try json.parseFromSlice(GatewayPayload(Types.GuildBanAddRemove), self.allocator, payload, .{.max_value_len=0x100});
const gbr = try json.parseFromValue(Types.GuildBanAddRemove, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, gbr.value.d.?);
try event(self, gbr.value);
};
if (mem.eql(u8, name, "GUILD_EMOJIS_UPDATE")) if (self.handler.guild_emojis_update) |event| {
const emojis = try json.parseFromSlice(GatewayPayload(Types.GuildEmojisUpdate), self.allocator, payload, .{.max_value_len=0x100});
const emojis = try json.parseFromValue(Types.GuildEmojisUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, emojis.value.d.?);
try event(self, emojis.value);
};
if (mem.eql(u8, name, "GUILD_STICKERS_UPDATE")) if (self.handler.guild_stickers_update) |event| {
const stickers = try json.parseFromSlice(GatewayPayload(Types.GuildStickersUpdate), self.allocator, payload, .{.max_value_len=0x100});
const stickers = try json.parseFromValue(Types.GuildStickersUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, stickers.value.d.?);
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.parseFromSlice(GatewayPayload(Types.GuildIntegrationsUpdate), self.allocator, payload, .{.max_value_len=0x100});
const guild_id = try json.parseFromValue(Types.GuildIntegrationsUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, guild_id.value.d.?);
try event(self, guild_id.value);
};
if (mem.eql(u8, name, "THREAD_CREATE")) if (self.handler.thread_create) |event| {
const thread = try json.parseFromSlice(GatewayPayload(Types.Channel), self.allocator, payload, .{.max_value_len=0x100});
const thread = try json.parseFromValue(Types.Channel, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, thread.value.d.?);
try event(self, thread.value);
};
if (mem.eql(u8, name, "THREAD_UPDATE")) if (self.handler.thread_update) |event| {
const thread = try json.parseFromSlice(GatewayPayload(Types.Channel), self.allocator, payload, .{.max_value_len=0x100});
const thread = try json.parseFromValue(Types.Channel, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, thread.value.d.?);
try event(self, thread.value);
};
if (mem.eql(u8, name, "THREAD_DELETE")) if (self.handler.thread_delete) |event| {
const thread_data = try json.parseFromSlice(GatewayPayload(Types.Partial(Types.Channel)), self.allocator, payload, .{.max_value_len=0x100});
const thread_data = try json.parseFromValue(Types.Partial(Types.Channel), self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, thread_data.value.d.?);
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.parseFromSlice(GatewayPayload(Types.ThreadListSync), self.allocator, payload, .{.max_value_len=0x100});
const data = try json.parseFromValue(Types.ThreadListSync, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, data.value.d.?);
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.parseFromSlice(GatewayPayload(Types.ThreadMemberUpdate), self.allocator, payload, .{.max_value_len=0x100});
const guild_id = try json.parseFromValue(Types.ThreadMemberUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, guild_id.value.d.?);
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.parseFromSlice(GatewayPayload(Types.ThreadMembersUpdate), self.allocator, payload, .{.max_value_len=0x100});
const data = try json.parseFromValue(Types.ThreadMembersUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, data.value.d.?);
try event(self, data.value);
};
if (mem.eql(u8, name, "TYPING_START")) if (self.handler.typing_start) |event| {
const data = try json.parseFromSlice(GatewayPayload(Types.TypingStart), self.allocator, payload, .{.max_value_len=0x100});
const data = try json.parseFromValue(Types.TypingStart, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, data.value.d.?);
try event(self, data.value);
};
if (mem.eql(u8, name, "USER_UPDATE")) if (self.handler.user_update) |event| {
const user = try json.parseFromSlice(GatewayPayload(Types.User), self.allocator, payload, .{.max_value_len=0x100});
const user = try json.parseFromValue(Types.User, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, user.value.d.?);
try event(self, user.value);
};
if (mem.eql(u8, name, "PRESENCE_UPDATE")) if (self.handler.presence_update) |event| {
const pu = try json.parseFromSlice(GatewayPayload(Types.PresenceUpdate), self.allocator, payload, .{.max_value_len=0x100});
const pu = try json.parseFromValue(Types.PresenceUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, pu.value.d.?);
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.parseFromSlice(GatewayPayload(Types.PollVoteAdd), self.allocator, payload, .{.max_value_len=0x100});
const data = try json.parseFromValue(Types.PollVoteAdd, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, data.value.d.?);
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.parseFromSlice(GatewayPayload(Types.PollVoteRemove), self.allocator, payload, .{.max_value_len=0x100});
const data = try json.parseFromValue(Types.PollVoteRemove, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, data.value.d.?);
try event(self, data.value);
};
if (mem.eql(u8, name, "WEBHOOKS_UPDATE")) if (self.handler.webhooks_update) |event| {
const fields = try json.parseFromSlice(GatewayPayload(Types.WebhookUpdate), self.allocator, payload, .{.max_value_len=0x100});
const fields = try json.parseFromValue(Types.WebhookUpdate, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, fields.value.d.?);
try event(self, fields.value);
};
if (mem.eql(u8, name, "STAGE_INSTANCE_CREATE")) if (self.handler.stage_instance_create) |event| {
const stage = try json.parseFromSlice(GatewayPayload(Types.StageInstance), self.allocator, payload, .{.max_value_len=0x100});
const stage = try json.parseFromValue(Types.StageInstance, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, stage.value.d.?);
try event(self, stage.value);
};
if (mem.eql(u8, name, "STAGE_INSTANCE_UPDATE")) if (self.handler.stage_instance_update) |event| {
const stage = try json.parseFromSlice(GatewayPayload(Types.StageInstance), self.allocator, payload, .{.max_value_len=0x100});
const stage = try json.parseFromValue(Types.StageInstance, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, stage.value.d.?);
try event(self, stage.value);
};
if (mem.eql(u8, name, "STAGE_INSTANCE_DELETE")) if (self.handler.stage_instance_delete) |event| {
const stage = try json.parseFromSlice(GatewayPayload(Types.StageInstance), self.allocator, payload, .{.max_value_len=0x100});
const stage = try json.parseFromValue(Types.StageInstance, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, stage.value.d.?);
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.parseFromSlice(GatewayPayload(Types.AutoModerationRule), self.allocator, payload, .{.max_value_len=0x100});
const rule = try json.parseFromValue(Types.AutoModerationRule, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, rule.value.d.?);
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.parseFromSlice(GatewayPayload(Types.AutoModerationRule), self.allocator, payload, .{.max_value_len=0x100});
const rule = try json.parseFromValue(Types.AutoModerationRule, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, rule.value.d.?);
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.parseFromSlice(GatewayPayload(Types.AutoModerationRule), self.allocator, payload, .{.max_value_len=0x100});
const rule = try json.parseFromValue(Types.AutoModerationRule, self.allocator, payload, .{.ignore_unknown_fields=true, .max_value_len=0x1000});
try event(self, rule.value.d.?);
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.parseFromSlice(GatewayPayload(Types.AutoModerationActionExecution), self.allocator, payload, .{.max_value_len = 0x100});
const ax = try json.parseFromValue(Types.AutoModerationActionExecution, self.allocator, payload, .{ .ignore_unknown_fields=true, .max_value_len = 0x1000,
});
try event(self, ax.value.d.?);
try event(self, ax.value);
};
// default handler for whoever wants it
if (self.handler.any) |anyEvent|
try anyEvent(self, payload);
//if (self.handler.any) |anyEvent|
//try anyEvent(self, payload);
}
pub const RequestFailedError = MakeRequestError || error{FailedRequest} || json.ParseError(json.Scanner);

View File

@ -30,116 +30,116 @@ pub const Application = struct {
/// The description of the app
description: []const u8,
/// An array of rpc origin urls, if rpc is enabled
rpc_origins: ?[][]const u8,
/// The url of the app's terms of service
terms_of_service_url: ?[]const u8,
/// The url of the app's privacy policy
privacy_policy_url: ?[]const u8,
/// The hex encoded key for verification in interactions and the GameSDK's GetTicket
verify_key: []const u8,
///If this application is a game sold on , this field will be the id of the "Game SKU" that is created, if exists
primary_sku_id: ?Snowflake,
///If this application is a game sold on , this field will be the URL slug that links to the store page
slug: ?[]const u8,
/// The application's public flags
flags: ?ApplicationFlags,
/// The id of the app
id: Snowflake,
/// The icon hash of the app
icon: ?[]const u8,
/// When false only app owner can join the app's bot to guilds
bot_public: bool,
/// When true the app's bot will only join upon completion of the full oauth2 code grant flow
bot_require_code_grant: bool,
/// Partial user object containing info on the owner of the application
owner: ?Partial(User),
/// If the application belongs to a team, this will be a list of the members of that team
team: ?Team,
/// Guild associated with the app. For example, a developer support server.
guild_id: ?Snowflake,
/// A partial object of the associated guild
guild: ?Partial(Guild),
///If this application is a game sold on , this field will be the hash of the image on store embeds
cover_image: ?[]const u8,
/// up to 5 tags describing the content and functionality of the application
tags: ?[][]const u8,
/// settings for the application's default in-app authorization link, if enabled
install_params: ?InstallParams,
// Default scopes and permissions for each supported installation context.
integration_types_config: ?AssociativeArray(ApplicationIntegrationType, ApplicationIntegrationTypeConfiguration),
/// the application's default custom authorization link, if enabled
custom_install_url: ?[]const u8,
/// the application's role connection verification entry point, which when configured will render the app as a verification method in the guild role verification configuration
role_connections_verification_url: ?[]const u8,
/// An approximate count of the app's guild membership.
approximate_guild_count: ?isize,
/// Approximate count of users that have installed the app.
approximate_user_install_count: ?isize,
/// Partial user object for the bot user associated with the app
bot: ?Partial(User),
/// Array of redirect URIs for the app
redirect_uris: ?[][]const u8,
/// Interactions endpoint URL for the app
interactions_endpoint_url: ?[]const u8,
};
rpc_origins: ?[][]const u8 = null,
/// The url of the app's terms of service
terms_of_service_url: ?[]const u8 = null,
/// The url of the app's privacy policy
privacy_policy_url: ?[]const u8 = null,
/// The hex encoded key for verification in interactions and the GameSDK's GetTicket
verify_key: []const u8,
///If this application is a game sold on , this field will be the id of the "Game SKU" that is created, if exists
primary_sku_id: ?Snowflake = null,
///If this application is a game sold on , this field will be the URL slug that links to the store page
slug: ?[]const u8 = null,
/// The application's public flags
flags: ?ApplicationFlags = null,
/// The id of the app
id: Snowflake,
/// The icon hash of the app
icon: ?[]const u8 = null,
/// When false only app owner can join the app's bot to guilds
bot_public: bool,
/// When true the app's bot will only join upon completion of the full oauth2 code grant flow
bot_require_code_grant: bool,
/// Partial user object containing info on the owner of the application
owner: ?Partial(User) = null,
/// If the application belongs to a team, this will be a list of the members of that team
team: ?Team = null,
/// Guild associated with the app. For example, a developer support server.
guild_id: ?Snowflake = null,
/// A partial object of the associated guild
guild: ?Partial(Guild) = null,
///If this application is a game sold on , this field will be the hash of the image on store embeds
cover_image: ?[]const u8 = null,
/// up to 5 tags describing the content and functionality of the application
tags: ?[][]const u8 = null,
/// settings for the application's default in-app authorization link, if enabled
install_params: ?InstallParams = null,
// Default scopes and permissions for each supported installation context.
integration_types_config: ?AssociativeArray(ApplicationIntegrationType, ApplicationIntegrationTypeConfiguration) = null,
/// the application's default custom authorization link, if enabled
custom_install_url: ?[]const u8 = null,
/// the application's role connection verification entry point, which when configured will render the app as a verification method in the guild role verification configuration
role_connections_verification_url: ?[]const u8 = null,
/// An approximate count of the app's guild membership.
approximate_guild_count: ?isize = null,
/// Approximate count of users that have installed the app.
approximate_user_install_count: ?isize = null,
/// Partial user object for the bot user associated with the app
bot: ?Partial(User) = null,
/// Array of redirect URIs for the app
redirect_uris: ?[][]const u8 = null,
/// Interactions endpoint URL for the app
interactions_endpoint_url: ?[]const u8 = null,
};
/// https://discord.com/developers/docs/resources/application#application-object-application-integration-type-configuration-object
pub const ApplicationIntegrationTypeConfiguration = struct {
///
/// Install params for each installation context's default in-app authorization link
///
/// https://discord.com/developers/docs/resources/application#install-params-object-install-params-structure
///
oauth2_install_params: ?InstallParams,
};
/// https://discord.com/developers/docs/resources/application#application-object-application-integration-type-configuration-object
pub const ApplicationIntegrationTypeConfiguration = struct {
///
/// Install params for each installation context's default in-app authorization link
///
/// https://discord.com/developers/docs/resources/application#install-params-object-install-params-structure
///
oauth2_install_params: ?InstallParams = null,
};
pub const ApplicationIntegrationType = enum(u4) {
/// App is installable to servers
GuildInstall = 0,
/// App is installable to users
UserInstall = 1,
};
pub const ApplicationIntegrationType = enum(u4) {
/// App is installable to servers
GuildInstall = 0,
/// App is installable to users
UserInstall = 1,
};
pub const InstallParams = struct {
/// Scopes to add the application to the server with
scopes: []OAuth2Scope,
/// Permissions to request for the bot role
permissions: []const u8,
};
pub const InstallParams = struct {
/// Scopes to add the application to the server with
scopes: []OAuth2Scope,
/// Permissions to request for the bot role
permissions: []const u8,
};
pub const ModifyApplication = struct {
/// Default custom authorization URL for the app, if enabled
custom_install_url: ?[]const u8,
/// Description of the app
description: ?[]const u8,
/// Role connection verification URL for the app
role_connections_verification_url: ?[]const u8,
/// Settings for the app's default in-app authorization link, if enabled
install_params: ?InstallParams,
/// Default scopes and permissions for each supported installation context.
integration_types_config: ?ApplicationIntegrationType,
/// App's public flags
/// @remarks
/// Only limited intent flags (`GATEWAY_PRESENCE_LIMITED`, `GATEWAY_GUILD_MEMBERS_LIMITED`, and `GATEWAY_MESSAGE_CONTENT_LIMITED`) can be updated via the API.
flags: ?ApplicationFlags,
/// Icon for the app
icon: ?[]const u8,
/// Default rich presence invite cover image for the app
cover_image: ?[]const u8,
/// Interactions endpoint URL for the app
/// @remarks
/// To update an Interactions endpoint URL via the API, the URL must be valid
interaction_endpoint_url: ?[]const u8,
/// List of tags describing the content and functionality of the app (max of 20 characters per tag)
/// @remarks
/// There can only be a max of 5 tags
tags: ?[][]const u8,
/// Event webhook URL for the app to receive webhook events
event_webhooks_url: ?[]const u8,
/// If webhook events are enabled for the app. 1 to disable, and 2 to enable.
event_webhooks_status: ?ApplicationEventWebhookStatus,
/// List of Webhook event types the app subscribes to
event_webhooks_types: ?[]WebhookEventType,
pub const ModifyApplication = struct {
/// Default custom authorization URL for the app, if enabled
custom_install_url: ?[]const u8 = null,
/// Description of the app
description: ?[]const u8 = null,
/// Role connection verification URL for the app
role_connections_verification_url: ?[]const u8 = null,
/// Settings for the app's default in-app authorization link, if enabled
install_params: ?InstallParams = null,
/// Default scopes and permissions for each supported installation context.
integration_types_config: ?ApplicationIntegrationType = null,
/// App's public flags
/// @remarks
/// Only limited intent flags (`GATEWAY_PRESENCE_LIMITED`, `GATEWAY_GUILD_MEMBERS_LIMITED`, and `GATEWAY_MESSAGE_CONTENT_LIMITED`) can be updated via the API.
flags: ?ApplicationFlags = null,
/// Icon for the app
icon: ?[]const u8 = null,
/// Default rich presence invite cover image for the app
cover_image: ?[]const u8 = null,
/// Interactions endpoint URL for the app
/// @remarks
/// To update an Interactions endpoint URL via the API, the URL must be valid
interaction_endpoint_url: ?[]const u8 = null,
/// List of tags describing the content and functionality of the app (max of 20 characters per tag)
/// @remarks
/// There can only be a max of 5 tags
tags: ?[][]const u8 = null,
/// Event webhook URL for the app to receive webhook events
event_webhooks_url: ?[]const u8 = null,
/// If webhook events are enabled for the app. 1 to disable, and 2 to enable.
event_webhooks_status: ?ApplicationEventWebhookStatus = null,
/// List of Webhook event types the app subscribes to
event_webhooks_types: ?[]WebhookEventType = null,
};
pub const ApplicationEventWebhookStatus = enum(u8) {

View File

@ -1,50 +1,50 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const Snowflake = @import("snowflake.zig").Snowflake;
const AttachmentFlags = @import("shared.zig").AttachmentFlags;
const Snowflake = @import("snowflake.zig").Snowflake;
const AttachmentFlags = @import("shared.zig").AttachmentFlags;
/// https://discord.com/developers/docs/resources/channel#attachment-object
pub const Attachment = struct {
/// Name of file attached
filename: []const u8,
/// The title of the file
title: ?[]const u8,
/// The attachment's [media type](https://en.wikipedia.org/wiki/Media_type)
content_type: ?[]const u8,
/// Size of file in bytes
size: isize,
/// Source url of file
url: []const u8,
/// A proxied url of file
proxy_url: []const u8,
/// Attachment id
id: Snowflake,
/// description for the file (max 1024 characters)
description: ?[]const u8,
/// Height of file (if image)
height: ?isize,
/// Width of file (if image)
width: ?isize,
/// whether this attachment is ephemeral. Ephemeral attachments will automatically be removed after a set period of time. Ephemeral attachments on messages are guaranteed to be available as long as the message itself exists.
ephemeral: ?bool,
/// The duration of the audio file for a voice message
duration_secs: ?isize,
/// A base64 encoded bytearray representing a sampled waveform for a voice message
waveform: ?[]const u8,
/// Attachment flags combined as a bitfield
flags: ?AttachmentFlags,
/// https://discord.com/developers/docs/resources/channel#attachment-object
pub const Attachment = struct {
/// Name of file attached
filename: []const u8,
/// The title of the file
title: ?[]const u8 = null,
/// The attachment's [media type](https://en.wikipedia.org/wiki/Media_type)
content_type: ?[]const u8 = null,
/// Size of file in bytes
size: isize,
/// Source url of file
url: []const u8,
/// A proxied url of file
proxy_url: []const u8,
/// Attachment id
id: Snowflake,
/// description for the file (max 1024 characters)
description: ?[]const u8 = null,
/// Height of file (if image)
height: ?isize = null,
/// Width of file (if image)
width: ?isize = null,
/// whether this attachment is ephemeral. Ephemeral attachments will automatically be removed after a set period of time. Ephemeral attachments on messages are guaranteed to be available as long as the message itself exists.
ephemeral: ?bool = null,
/// The duration of the audio file for a voice message
duration_secs: ?isize = null,
/// A base64 encoded bytearray representing a sampled waveform for a voice message
waveform: ?[]const u8 = null,
/// Attachment flags combined as a bitfield
flags: ?AttachmentFlags = null,
};

View File

@ -1,148 +1,148 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const Webhook = @import("webhook.zig").Webhook;
const User = @import("user.zig").User;
const Channel = @import("channel.zig").Channel;
const ScheduledEvent = @import("scheduled_event.zig").ScheduledEvent;
const AutoModerationRule = @import("automod.zig").AutoModerationRule;
const Integration = @import("integration.zig").Integration;
const Snowflake = @import("snowflake.zig").Snowflake;
const AuditLogEvents = @import("shared.zig").AuditLogEvents;
const Partial = @import("partial.zig").Partial;
const ApplicationCommand = @import("command.zig").ApplicationCommand;
const Webhook = @import("webhook.zig").Webhook;
const User = @import("user.zig").User;
const Channel = @import("channel.zig").Channel;
const ScheduledEvent = @import("scheduled_event.zig").ScheduledEvent;
const AutoModerationRule = @import("automod.zig").AutoModerationRule;
const Integration = @import("integration.zig").Integration;
const Snowflake = @import("snowflake.zig").Snowflake;
const AuditLogEvents = @import("shared.zig").AuditLogEvents;
const Partial = @import("partial.zig").Partial;
const ApplicationCommand = @import("command.zig").ApplicationCommand;
/// https://discord.com/developers/docs/resources/audit-log#audit-log-object
pub const AuditLog = struct {
/// List of webhooks found in the audit log
webhooks: []Webhook,
/// List of users found in the audit log
users: []User,
/// List of audit log entries, sorted from most to least recent
audit_log_entries: []AuditLogEntry,
/// List of partial integration objects
integrations: []Partial(Integration),
///
/// List of threads found in the audit log.
/// Threads referenced in `THREAD_CREATE` and `THREAD_UPDATE` events are included in the threads map since archived threads might not be kept in memory by clients.
///
threads: []Channel,
/// List of guild scheduled events found in the audit log
guild_scheduled_events: ?[]ScheduledEvent,
/// List of auto moderation rules referenced in the audit log
auto_moderation_rules: ?[]AutoModerationRule,
/// List of application commands referenced in the audit log
application_commands: []ApplicationCommand,
};
/// https://discord.com/developers/docs/resources/audit-log#audit-log-entry-object-audit-log-entry-structure
pub const AuditLogEntry = struct {
/// ID of the affected entity (webhook, user, role, etc.)
target_id: ?Snowflake,
/// Changes made to the `target_id`
/// TODO: change this
changes: ?[]AuditLogChange(noreturn),
/// User or app that made the changes
user_id: ?Snowflake,
/// ID of the entry
id: Snowflake,
/// Type of action that occurred
action_type: AuditLogEvents,
/// Additional info for certain event types
options: ?OptionalAuditEntryInfo,
/// Reason for the change (1-512 characters)
reason: ?[]const u8,
};
pub fn AuditLogChange(comptime T: type) type {
return T;
}
/// https://discord.com/developers/docs/resources/audit-log#audit-log-entry-object-optional-audit-entry-info
pub const OptionalAuditEntryInfo = struct {
///
/// ID of the app whose permissions were targeted.
///
/// Event types: `APPLICATION_COMMAND_PERMISSION_UPDATE`,
///
application_id: ?Snowflake,
///
/// Name of the Auto Moderation rule that was triggered.
///
/// Event types: `AUTO_MODERATION_BLOCK_MESSAGE`, `AUTO_MODERATION_FLAG_TO_CHANNEL`, `AUTO_MODERATION_USER_COMMUNICATION_DISABLED`,
///
auto_moderation_rule_name: ?[]const u8,
///
/// Trigger type of the Auto Moderation rule that was triggered.
///
/// Event types: `AUTO_MODERATION_BLOCK_MESSAGE`, `AUTO_MODERATION_FLAG_TO_CHANNEL`, `AUTO_MODERATION_USER_COMMUNICATION_DISABLED`,
///
auto_moderation_rule_trigger_type: ?[]const u8,
///
/// Channel in which the entities were targeted.
///
/// Event types: `MEMBER_MOVE`, `MESSAGE_PIN`, `MESSAGE_UNPIN`, `MESSAGE_DELETE`, `STAGE_INSTANCE_CREATE`, `STAGE_INSTANCE_UPDATE`, `STAGE_INSTANCE_DELETE`,
///
channel_id: ?Snowflake,
///
/// isize of entities that were targeted.
///
/// Event types: `MESSAGE_DELETE`, `MESSAGE_BULK_DELETE`, `MEMBER_DISCONNECT`, `MEMBER_MOVE`,
///
count: ?[]const u8,
///
/// isize of days after which inactive members were kicked.
///
/// Event types: `MEMBER_PRUNE`,
///
delete_member_days: ?[]const u8,
///
/// ID of the overwritten entity.
///
/// Event types: `CHANNEL_OVERWRITE_CREATE`, `CHANNEL_OVERWRITE_UPDATE`, `CHANNEL_OVERWRITE_DELETE`,
///
id: ?Snowflake,
///
/// isize of members removed by the prune.
///
/// Event types: `MEMBER_PRUNE`,
///
members_removed: ?[]const u8,
///
/// ID of the message that was targeted.
///
/// Event types: `MESSAGE_PIN`, `MESSAGE_UNPIN`, `STAGE_INSTANCE_CREATE`, `STAGE_INSTANCE_UPDATE`, `STAGE_INSTANCE_DELETE`,
///
message_id: ?Snowflake,
///
/// Name of the role if type is "0" (not present if type is "1").
///
/// Event types: `CHANNEL_OVERWRITE_CREATE`, `CHANNEL_OVERWRITE_UPDATE`, `CHANNEL_OVERWRITE_DELETE`,
///
role_name: ?[]const u8,
///
/// Type of overwritten entity - "0", for "role", or "1" for "member".
///
/// Event types: `CHANNEL_OVERWRITE_CREATE`, `CHANNEL_OVERWRITE_UPDATE`, `CHANNEL_OVERWRITE_DELETE`,
///
type: ?[]const u8,
///
/// The type of integration which performed the action
///
/// Event types: `MEMBER_KICK`, `MEMBER_ROLE_UPDATE`,
///
integration_type: ?[]const u8,
/// https://discord.com/developers/docs/resources/audit-log#audit-log-object
pub const AuditLog = struct {
/// List of webhooks found in the audit log
webhooks: []Webhook,
/// List of users found in the audit log
users: []User,
/// List of audit log entries, sorted from most to least recent
audit_log_entries: []AuditLogEntry,
/// List of partial integration objects
integrations: []Partial(Integration),
///
/// List of threads found in the audit log.
/// Threads referenced in `THREAD_CREATE` and `THREAD_UPDATE` events are included in the threads map since archived threads might not be kept in memory by clients.
///
threads: []Channel,
/// List of guild scheduled events found in the audit log
guild_scheduled_events: ?[]ScheduledEvent = null,
/// List of auto moderation rules referenced in the audit log
auto_moderation_rules: ?[]AutoModerationRule = null,
/// List of application commands referenced in the audit log
application_commands: []ApplicationCommand,
};
/// https://discord.com/developers/docs/resources/audit-log#audit-log-entry-object-audit-log-entry-structure
pub const AuditLogEntry = struct {
/// ID of the affected entity (webhook, user, role, etc.)
target_id: ?Snowflake = null,
/// Changes made to the `target_id`
/// TODO: change this
changes: ?[]AuditLogChange(noreturn) = null,
/// User or app that made the changes
user_id: ?Snowflake = null,
/// ID of the entry
id: Snowflake,
/// Type of action that occurred
action_type: AuditLogEvents,
/// Additional info for certain event types
options: ?OptionalAuditEntryInfo = null,
/// Reason for the change (1-512 characters)
reason: ?[]const u8 = null,
};
pub fn AuditLogChange(comptime T: type) type {
return T;
}
/// https://discord.com/developers/docs/resources/audit-log#audit-log-entry-object-optional-audit-entry-info
pub const OptionalAuditEntryInfo = struct {
///
/// ID of the app whose permissions were targeted.
///
/// Event types: `APPLICATION_COMMAND_PERMISSION_UPDATE`,
///
application_id: ?Snowflake = null,
///
/// Name of the Auto Moderation rule that was triggered.
///
/// Event types: `AUTO_MODERATION_BLOCK_MESSAGE`, `AUTO_MODERATION_FLAG_TO_CHANNEL`, `AUTO_MODERATION_USER_COMMUNICATION_DISABLED`,
///
auto_moderation_rule_name: ?[]const u8 = null,
///
/// Trigger type of the Auto Moderation rule that was triggered.
///
/// Event types: `AUTO_MODERATION_BLOCK_MESSAGE`, `AUTO_MODERATION_FLAG_TO_CHANNEL`, `AUTO_MODERATION_USER_COMMUNICATION_DISABLED`,
///
auto_moderation_rule_trigger_type: ?[]const u8 = null,
///
/// Channel in which the entities were targeted.
///
/// Event types: `MEMBER_MOVE`, `MESSAGE_PIN`, `MESSAGE_UNPIN`, `MESSAGE_DELETE`, `STAGE_INSTANCE_CREATE`, `STAGE_INSTANCE_UPDATE`, `STAGE_INSTANCE_DELETE`,
///
channel_id: ?Snowflake = null,
///
/// isize of entities that were targeted.
///
/// Event types: `MESSAGE_DELETE`, `MESSAGE_BULK_DELETE`, `MEMBER_DISCONNECT`, `MEMBER_MOVE`,
///
count: ?[]const u8 = null,
///
/// isize of days after which inactive members were kicked.
///
/// Event types: `MEMBER_PRUNE`,
///
delete_member_days: ?[]const u8 = null,
///
/// ID of the overwritten entity.
///
/// Event types: `CHANNEL_OVERWRITE_CREATE`, `CHANNEL_OVERWRITE_UPDATE`, `CHANNEL_OVERWRITE_DELETE`,
///
id: ?Snowflake = null,
///
/// isize of members removed by the prune.
///
/// Event types: `MEMBER_PRUNE`,
///
members_removed: ?[]const u8 = null,
///
/// ID of the message that was targeted.
///
/// Event types: `MESSAGE_PIN`, `MESSAGE_UNPIN`, `STAGE_INSTANCE_CREATE`, `STAGE_INSTANCE_UPDATE`, `STAGE_INSTANCE_DELETE`,
///
message_id: ?Snowflake = null,
///
/// Name of the role if type is "0" (not present if type is "1").
///
/// Event types: `CHANNEL_OVERWRITE_CREATE`, `CHANNEL_OVERWRITE_UPDATE`, `CHANNEL_OVERWRITE_DELETE`,
///
role_name: ?[]const u8 = null,
///
/// Type of overwritten entity - "0", for "role", or "1" for "member".
///
/// Event types: `CHANNEL_OVERWRITE_CREATE`, `CHANNEL_OVERWRITE_UPDATE`, `CHANNEL_OVERWRITE_DELETE`,
///
type: ?[]const u8 = null,
///
/// The type of integration which performed the action
///
/// Event types: `MEMBER_KICK`, `MEMBER_ROLE_UPDATE`,
///
integration_type: ?[]const u8 = null,
};

View File

@ -1,186 +1,186 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const Snowflake = @import("snowflake.zig").Snowflake;
const Snowflake = @import("snowflake.zig").Snowflake;
/// https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-rule-object
pub const AutoModerationRule = struct {
/// The id of this rule
id: Snowflake,
/// The guild id of the rule
guild_id: Snowflake,
/// The name of the rule
name: []const u8,
/// The id of the user who created this rule.
creator_id: Snowflake,
/// Indicates in what event context a rule should be checked.
event_type: AutoModerationEventTypes,
/// The type of trigger for this rule
trigger_type: AutoModerationTriggerTypes,
/// The metadata used to determine whether a rule should be triggered.
trigger_metadata: AutoModerationRuleTriggerMetadata,
/// Actions which will execute whenever a rule is triggered.
actions: []AutoModerationAction,
/// Whether the rule is enabled.
enabled: bool,
/// The role ids that are whitelisted. Max 20.
exempt_roles: [][]const u8,
/// The channel ids that are whitelisted. Max 50.
exempt_channels: [][]const u8,
};
pub const AutoModerationEventTypes = enum(u4) {
/// When a user sends a message
MessageSend = 1,
/// Wen a member edits their profile
MemberUpdate,
};
pub const AutoModerationTriggerTypes = enum(u4) {
/// Check if content contains words from a user defined list of keywords. Max 6 per guild
Keyword = 1,
/// Check if content represents generic spam. Max 1 per guild
Spam = 3,
/// Check if content contains words from internal pre-defined word sets. Max 1 per guild
KeywordPreset,
/// Check if content contains more unique mentions than allowed. Max 1 per guild
MentionSpam,
/// Check if member profile contains words from a user defined list of keywords. Max 1 per guild
MemberProfile,
};
pub const AutoModerationRuleTriggerMetadata = struct {
///
/// The keywords needed to match.
///
/// @remarks
/// Only present with {@link AutoModerationTriggerTypes.Keyword}; and {@link AutoModerationTriggerTypes.MemberProfile};.
///
/// Can have up to 1000 elements in the array and each []const u8 can have up to 60 characters
///
keyword_filter: ?[][]const u8,
///
/// Regular expression patterns which will be matched against content.
///
/// @remarks
/// Only present with {@link AutoModerationTriggerTypes.Keyword}; and {@link AutoModerationTriggerTypes.MemberProfile};.
///
/// Can have up to 10 elements in the array and each []const u8 can have up to 260 characters
///
regex_patterns: [][]const u8,
///
/// The pre-defined lists of words to match from.
///
/// @remarks
/// Only present with {@link AutoModerationTriggerTypes.KeywordPreset};.
///
presets: ?[]AutoModerationRuleTriggerMetadataPresets,
///
/// The substrings which will exempt from triggering the preset trigger type.
///
/// @remarks
/// Only present with {@link AutoModerationTriggerTypes.Keyword};, {@link AutoModerationTriggerTypes.KeywordPreset}; and {@link AutoModerationTriggerTypes.MemberProfile};.
///
/// When used with {@link AutoModerationTriggerTypes.Keyword}; and {@link AutoModerationTriggerTypes.MemberProfile}; there can have up to 100 elements in the array and each []const u8 can have up to 60 characters.
/// When used with {@link AutoModerationTriggerTypes.KeywordPreset}; there can have up to 1000 elements in the array and each []const u8 can have up to 60 characters.
///
allow_list: ?[][]const u8,
///
/// Total isize of mentions (role & user) allowed per message.
///
/// @remarks
/// Only present with {@link AutoModerationTriggerTypes.MentionSpam};.
///
/// Maximum of 50
///
mention_total_limit: ?isize,
///
/// Whether to automatically detect mention raids.
///
/// @remarks
/// Only present with {@link AutoModerationTriggerTypes.MentionSpam};.
///
mention_raid_protection_enabled: ?bool,
};
pub const AutoModerationRuleTriggerMetadataPresets = enum(u4) {
/// Words that may be considered forms of swearing or cursing
Profanity = 1,
/// Words that refer to sexually explicit behavior or activity
SexualContent,
/// Personal insults or words that may be considered hate speech
Slurs,
};
pub const AutoModerationAction = struct {
/// The type of action to take when a rule is triggered
type: AutoModerationActionType,
/// additional metadata needed during execution for this specific action type
metadata: AutoModerationActionMetadata,
};
pub const AutoModerationActionType = enum(u4) {
/// Blocks the content of a message according to the rule
BlockMessage = 1,
/// Logs user content to a specified channel
SendAlertMessage,
///
/// Times out user for specified duration
///
/// @remarks
/// A timeout action can only be set up for {@link AutoModerationTriggerTypes.Keyword}; and {@link AutoModerationTriggerTypes.MentionSpam}; rules.
///
/// The `MODERATE_MEMBERS` permission is required to use the timeout action type.
///
Timeout,
/// prevents a member from using text, voice, or other interactions
BlockMemberInteraction,
};
pub const AutoModerationActionMetadata = struct {
/// The id of channel to which user content should be logged. Only in ActionType.SendAlertMessage
channel_id: ?Snowflake,
/// Additional explanation that will be shown to members whenever their message is blocked. Maximum of 150 characters. Only supported for AutoModerationActionType.BlockMessage
custom_message: ?[]const u8,
/// Timeout duration in seconds maximum of 2419200 seconds (4 weeks). Only supported for TriggerType.Keyword && Only in ActionType.Timeout
duration_seconds: ?isize,
};
/// https://discord.com/developers/docs/topics/gateway-events#auto-moderation-action-execution-auto-moderation-action-execution-event-fields
pub const AutoModerationActionExecution = struct {
/// The id of the guild
guild_id: Snowflake,
/// The id of the rule that was executed
rule_id: Snowflake,
/// The id of the user which generated the content which triggered the rule
user_id: Snowflake,
/// The content from the user
content: []const u8,
/// Action which was executed
action: AutoModerationAction,
/// The trigger type of the rule that was executed.
rule_trigger_type: AutoModerationTriggerTypes,
/// The id of the channel in which user content was posted
channel_id: ?Snowflake,
/// The id of the message. Will not exist if message was blocked by automod or content was not part of any message
message_id: ?Snowflake,
/// The id of any system auto moderation messages posted as a result of this action
alert_system_message_id: ?Snowflake,
/// The word or phrase that triggerred the rule.
matched_keyword: ?[]const u8,
/// The substring in content that triggered the rule
matched_content: ?[]const u8,
/// https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-rule-object
pub const AutoModerationRule = struct {
/// The id of this rule
id: Snowflake,
/// The guild id of the rule
guild_id: Snowflake,
/// The name of the rule
name: []const u8,
/// The id of the user who created this rule.
creator_id: Snowflake,
/// Indicates in what event context a rule should be checked.
event_type: AutoModerationEventTypes,
/// The type of trigger for this rule
trigger_type: AutoModerationTriggerTypes,
/// The metadata used to determine whether a rule should be triggered.
trigger_metadata: AutoModerationRuleTriggerMetadata,
/// Actions which will execute whenever a rule is triggered.
actions: []AutoModerationAction,
/// Whether the rule is enabled.
enabled: bool,
/// The role ids that are whitelisted. Max 20.
exempt_roles: [][]const u8,
/// The channel ids that are whitelisted. Max 50.
exempt_channels: [][]const u8,
};
pub const AutoModerationEventTypes = enum(u4) {
/// When a user sends a message
MessageSend = 1,
/// Wen a member edits their profile
MemberUpdate,
};
pub const AutoModerationTriggerTypes = enum(u4) {
/// Check if content contains words from a user defined list of keywords. Max 6 per guild
Keyword = 1,
/// Check if content represents generic spam. Max 1 per guild
Spam = 3,
/// Check if content contains words from internal pre-defined word sets. Max 1 per guild
KeywordPreset,
/// Check if content contains more unique mentions than allowed. Max 1 per guild
MentionSpam,
/// Check if member profile contains words from a user defined list of keywords. Max 1 per guild
MemberProfile,
};
pub const AutoModerationRuleTriggerMetadata = struct {
///
/// The keywords needed to match.
///
/// @remarks
/// Only present with {@link AutoModerationTriggerTypes.Keyword}; and {@link AutoModerationTriggerTypes.MemberProfile};.
///
/// Can have up to 1000 elements in the array and each []const u8 can have up to 60 characters
///
keyword_filter: ?[][]const u8 = null,
///
/// Regular expression patterns which will be matched against content.
///
/// @remarks
/// Only present with {@link AutoModerationTriggerTypes.Keyword}; and {@link AutoModerationTriggerTypes.MemberProfile};.
///
/// Can have up to 10 elements in the array and each []const u8 can have up to 260 characters
///
regex_patterns: [][]const u8,
///
/// The pre-defined lists of words to match from.
///
/// @remarks
/// Only present with {@link AutoModerationTriggerTypes.KeywordPreset};.
///
presets: ?[]AutoModerationRuleTriggerMetadataPresets = null,
///
/// The substrings which will exempt from triggering the preset trigger type.
///
/// @remarks
/// Only present with {@link AutoModerationTriggerTypes.Keyword};, {@link AutoModerationTriggerTypes.KeywordPreset}; and {@link AutoModerationTriggerTypes.MemberProfile};.
///
/// When used with {@link AutoModerationTriggerTypes.Keyword}; and {@link AutoModerationTriggerTypes.MemberProfile}; there can have up to 100 elements in the array and each []const u8 can have up to 60 characters.
/// When used with {@link AutoModerationTriggerTypes.KeywordPreset}; there can have up to 1000 elements in the array and each []const u8 can have up to 60 characters.
///
allow_list: ?[][]const u8 = null,
///
/// Total isize of mentions (role & user) allowed per message.
///
/// @remarks
/// Only present with {@link AutoModerationTriggerTypes.MentionSpam};.
///
/// Maximum of 50
///
mention_total_limit: ?isize = null,
///
/// Whether to automatically detect mention raids.
///
/// @remarks
/// Only present with {@link AutoModerationTriggerTypes.MentionSpam};.
///
mention_raid_protection_enabled: ?bool = null,
};
pub const AutoModerationRuleTriggerMetadataPresets = enum(u4) {
/// Words that may be considered forms of swearing or cursing
Profanity = 1,
/// Words that refer to sexually explicit behavior or activity
SexualContent,
/// Personal insults or words that may be considered hate speech
Slurs,
};
pub const AutoModerationAction = struct {
/// The type of action to take when a rule is triggered
type: AutoModerationActionType,
/// additional metadata needed during execution for this specific action type
metadata: AutoModerationActionMetadata,
};
pub const AutoModerationActionType = enum(u4) {
/// Blocks the content of a message according to the rule
BlockMessage = 1,
/// Logs user content to a specified channel
SendAlertMessage,
///
/// Times out user for specified duration
///
/// @remarks
/// A timeout action can only be set up for {@link AutoModerationTriggerTypes.Keyword}; and {@link AutoModerationTriggerTypes.MentionSpam}; rules.
///
/// The `MODERATE_MEMBERS` permission is required to use the timeout action type.
///
Timeout,
/// prevents a member from using text, voice, or other interactions
BlockMemberInteraction,
};
pub const AutoModerationActionMetadata = struct {
/// The id of channel to which user content should be logged. Only in ActionType.SendAlertMessage
channel_id: ?Snowflake = null,
/// Additional explanation that will be shown to members whenever their message is blocked. Maximum of 150 characters. Only supported for AutoModerationActionType.BlockMessage
custom_message: ?[]const u8 = null,
/// Timeout duration in seconds maximum of 2419200 seconds (4 weeks). Only supported for TriggerType.Keyword && Only in ActionType.Timeout
duration_seconds: ?isize = null,
};
/// https://discord.com/developers/docs/topics/gateway-events#auto-moderation-action-execution-auto-moderation-action-execution-event-fields
pub const AutoModerationActionExecution = struct {
/// The id of the guild
guild_id: Snowflake,
/// The id of the rule that was executed
rule_id: Snowflake,
/// The id of the user which generated the content which triggered the rule
user_id: Snowflake,
/// The content from the user
content: []const u8,
/// Action which was executed
action: AutoModerationAction,
/// The trigger type of the rule that was executed.
rule_trigger_type: AutoModerationTriggerTypes,
/// The id of the channel in which user content was posted
channel_id: ?Snowflake = null,
/// The id of the message. Will not exist if message was blocked by automod or content was not part of any message
message_id: ?Snowflake = null,
/// The id of any system auto moderation messages posted as a result of this action
alert_system_message_id: ?Snowflake = null,
/// The word or phrase that triggerred the rule.
matched_keyword: ?[]const u8 = null,
/// The substring in content that triggered the rule
matched_content: ?[]const u8 = null,
};

View File

@ -1,234 +1,234 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const Snowflake = @import("snowflake.zig").Snowflake;
const Member = @import("member.zig").Member;
const Snowflake = @import("snowflake.zig").Snowflake;
const Member = @import("member.zig").Member;
const AllowedMentionsTypes = @import("shared.zig").AllowedMentionsTypes;
const ChannelTypes = @import("shared.zig").ChannelTypes;
const OverwriteTypes = @import("shared.zig").OverwriteTypes;
const ChannelFlags = @import("shared.zig").ChannelFlags;
const TargetTypes = @import("shared.zig").TargetTypes;
const VideoQualityModes = @import("shared.zig").VideoQualityModes;
const SortOrderTypes = @import("shared.zig").SortOrderTypes;
const User = @import("user.zig").User;
const ThreadMetadata = @import("thread.zig").ThreadMetadata;
const ThreadMember = @import("thread.zig").ThreadMember;
const ForumLayout = @import("shared.zig").ForumLayout;
const AllowedMentionsTypes = @import("shared.zig").AllowedMentionsTypes;
const ChannelTypes = @import("shared.zig").ChannelTypes;
const OverwriteTypes = @import("shared.zig").OverwriteTypes;
const ChannelFlags = @import("shared.zig").ChannelFlags;
const TargetTypes = @import("shared.zig").TargetTypes;
const VideoQualityModes = @import("shared.zig").VideoQualityModes;
const SortOrderTypes = @import("shared.zig").SortOrderTypes;
const User = @import("user.zig").User;
const ThreadMetadata = @import("thread.zig").ThreadMetadata;
const ThreadMember = @import("thread.zig").ThreadMember;
const ForumLayout = @import("shared.zig").ForumLayout;
/// https://discord.com/developers/docs/resources/channel#allowed-mentions-object
pub const AllowedMentions = struct {
/// An array of allowed mention types to parse from the content.
parse: ?[]AllowedMentionsTypes,
/// For replies, whether to mention the author of the message being replied to (default false)
replied_user: ?bool,
/// Array of role_ids to mention (Max size of 100)
roles: ?[][]const u8,
/// Array of user_ids to mention (Max size of 100)
users: ?[][]const u8,
};
/// https://discord.com/developers/docs/topics/gateway#typing-start
pub const TypingStart = struct {
/// Unix time (in seconds) of when the user started typing
timestamp: isize,
/// id of the channel
channel_id: Snowflake,
/// id of the guild
guild_id: ?Snowflake,
/// id of the user
user_id: Snowflake,
/// The member who started typing if this happened in a guild
member: ?Member,
};
/// https://discord.com/developers/docs/resources/channel#channel-object
pub const Channel = struct {
/// The id of the channel
id: Snowflake,
/// The type of channel
type: ChannelTypes,
/// The id of the guild
guild_id: ?Snowflake,
/// Sorting position of the channel (channels with the same position are sorted by id)
position: ?isize,
/// Explicit permission overwrites for members and roles
permission_overwrites: ?[]Overwrite,
/// The name of the channel (1-100 characters)
name: ?[]const u8,
/// The channel topic (0-4096 characters for GUILD_FORUM channels, 0-1024 characters for all others)
topic: ?[]const u8,
/// Whether the channel is nsfw
nsfw: ?bool,
/// The id of the last message sent in this channel (may not point to an existing or valid message)
last_message_id: ?Snowflake,
/// The bitrate (in bits) of the voice or stage channel
bitrate: ?isize,
/// The user limit of the voice or stage channel
user_limit: ?isize,
/// Amount of seconds a user has to wait before sending another message (0-21600); bots, as well as users with the permission `manage_messages` or `manage_channel`, are unaffected
rate_limit_per_user: ?isize,
/// the recipients of the DM
recipients: ?[]User,
/// icon hash of the group DM
icon: ?[]const u8,
/// Id of the creator of the thread
owner_id: ?Snowflake,
/// Application id of the group DM creator if it is bot-created
application_id: ?Snowflake,
/// For group DM channels: whether the channel is managed by an application via the `gdm.join` OAuth2 scope.,
managed: ?bool,
/// For guild channels: Id of the parent category for a channel (each parent category can contain up to 50 channels), for threads: id of the text channel this thread was created,
parent_id: ?Snowflake,
/// When the last pinned message was pinned. This may be null in events such as GUILD_CREATE when a message is not pinned.
last_pin_timestamp: ?[]const u8,
/// Voice region id for the voice or stage channel, automatic when set to null
rtc_region: ?[]const u8,
/// The camera video quality mode of the voice channel, 1 when not present
video_quality_mode: ?VideoQualityModes,
/// An approximate count of messages in a thread, stops counting at 50
message_count: ?isize,
/// An approximate count of users in a thread, stops counting at 50
member_count: ?isize,
/// Thread-specific fields not needed by other channels
thread_metadata: ?ThreadMetadata,
/// Thread member object for the current user, if they have joined the thread, only included on certain API endpoints
member: ?ThreadMember,
/// Default duration for newly created threads, in minutes, to automatically archive the thread after recent activity, can be set to: 60, 1440, 4320, 10080,
default_auto_archive_duration: ?isize,
/// computed permissions for the invoking user in the channel, including overwrites, only included when part of the resolved data received on a slash command interaction. This does not include implicit permissions, which may need to be checked separately.
permissions: ?[]const u8,
/// The flags of the channel
flags: ?ChannelFlags,
/// isize of messages ever sent in a thread, it's similar to `message_count` on message creation, but will not decrement the isize when a message is deleted
total_message_sent: ?isize,
/// The set of tags that can be used in a GUILD_FORUM channel
available_tags: ?[]ForumTag,
/// The IDs of the set of tags that have been applied to a thread in a GUILD_FORUM channel
applied_tags: ?[][]const u8,
/// the emoji to show in the add reaction button on a thread in a GUILD_FORUM channel
default_reaction_emoji: ?DefaultReactionEmoji,
/// the initial rate_limit_per_user to set on newly created threads in a channel. this field is copied to the thread at creation time and does not live update.
default_thread_rate_limit_per_user: ?isize,
/// the default sort order type used to order posts in GUILD_FORUM channels. Defaults to null, which indicates a preferred sort order hasn't been set by a channel admin
default_sort_order: ?SortOrderTypes,
/// the default forum layout view used to display posts in `GUILD_FORUM` channels. Defaults to `0`, which indicates a layout view has not been set by a channel admin
default_forum_layout: ?ForumLayout,
/// When a thread is created this will be true on that channel payload for the thread.
newly_created: ?bool,
};
/// https://discord.com/developers/docs/resources/guild#welcome-screen-object-welcome-screen-structure
pub const WelcomeScreen = struct {
/// The server description shown in the welcome screen
description: ?[]const u8,
/// The channels shown in the welcome screen, up to 5
welcome_channels: []WelcomeScreenChannel,
};
/// https://discord.com/developers/docs/resources/guild#welcome-screen-object-welcome-screen-channel-structure
pub const WelcomeScreenChannel = struct {
/// The description shown for the channel
description: []const u8,
/// The channel's id
channel_id: Snowflake,
/// The emoji id, if the emoji is custom
emoji_id: ?Snowflake,
/// The emoji name if custom, the unicode character if standard, or `null` if no emoji is set
emoji_name: ?[]const u8,
};
/// https://discord.com/developers/docs/resources/stage-instance#auto-closing-stage-instance-structure
pub const StageInstance = struct {
/// The topic of the Stage instance (1-120 characters)
topic: []const u8,
/// The id of this Stage instance
id: Snowflake,
/// The guild id of the associated Stage channel
guild_id: Snowflake,
/// The id of the associated Stage channel
channel_id: Snowflake,
/// The id of the scheduled event for this Stage instance
guild_scheduled_event_id: ?Snowflake,
};
pub const Overwrite = struct {
/// Either 0 (role) or 1 (member)
type: OverwriteTypes,
/// Role or user id
id: Snowflake,
/// Permission bit set
allow: ?[]const u8,
/// Permission bit set
deny: ?[]const u8,
};
/// https://discord.com/developers/docs/resources/channel#followed-channel-object
pub const FollowedChannel = struct {
/// Source message id
channel_id: Snowflake,
/// Created target webhook id
webhook_id: Snowflake,
};
pub const ForumTag = struct {
/// The id of the tag
id: Snowflake,
/// The name of the tag (0-20 characters)
name: []const u8,
/// Whether this tag can only be added to or removed from threads by a member with the MANAGE_THREADS permission
moderated: bool,
/// The id of a guild's custom emoji At most one of emoji_id and emoji_name may be set.
emoji_id: Snowflake,
/// The unicode character of the emoji
emoji_name: ?[]const u8,
};
pub const DefaultReactionEmoji = struct {
/// The id of a guild's custom emoji
emoji_id: Snowflake,
/// The unicode character of the emoji
emoji_name: ?[]const u8,
};
/// https://discord.com/developers/docs/resources/guild#modify-guild-channel-positions
pub const ModifyGuildChannelPositions = struct {
/// Channel id
id: Snowflake,
/// Sorting position of the channel (channels with the same position are sorted by id)
position: ?isize,
/// Syncs the permission overwrites with the new parent, if moving to a new category
lock_positions: ?bool,
/// The new parent ID for the channel that is moved
parent_id: ?Snowflake,
};
pub const CreateChannelInvite = struct {
/// Duration of invite in seconds before expiry, or 0 for never. Between 0 and 604800 (7 days). Default: 86400 (24 hours)
max_age: ?isize,
/// Max number of users or 0 for unlimited. Between 0 and 100. Default: 0
max_uses: ?isize,
/// Whether this invite only grants temporary membership. Default: false
temporary: ?bool,
/// If true, don't try to reuse similar invite (useful for creating many unique one time use invites). Default: false
unique: ?bool,
/// The type of target for this voice channel invite
target_type: ?TargetTypes,
/// The id of the user whose stream to display for this invite, required if `target_type` is 1, the user must be streaming in the channel
target_user_id: ?Snowflake,
/// The id of the embedded application to open for this invite, required if `target_type` is 2, the application must have the `EMBEDDED` flag
target_application_id: ?Snowflake,
/// https://discord.com/developers/docs/resources/channel#allowed-mentions-object
pub const AllowedMentions = struct {
/// An array of allowed mention types to parse from the content.
parse: ?[]AllowedMentionsTypes = null,
/// For replies, whether to mention the author of the message being replied to (default false)
replied_user: ?bool = null,
/// Array of role_ids to mention (Max size of 100)
roles: ?[][]const u8 = null,
/// Array of user_ids to mention (Max size of 100)
users: ?[][]const u8 = null,
};
/// https://discord.com/developers/docs/topics/gateway#typing-start
pub const TypingStart = struct {
/// Unix time (in seconds) of when the user started typing
timestamp: isize,
/// id of the channel
channel_id: Snowflake,
/// id of the guild
guild_id: ?Snowflake = null,
/// id of the user
user_id: Snowflake,
/// The member who started typing if this happened in a guild
member: ?Member = null,
};
/// https://discord.com/developers/docs/resources/channel#channel-object
pub const Channel = struct {
/// The id of the channel
id: Snowflake,
/// The type of channel
type: ChannelTypes,
/// The id of the guild
guild_id: ?Snowflake = null,
/// Sorting position of the channel (channels with the same position are sorted by id)
position: ?isize = null,
/// Explicit permission overwrites for members and roles
permission_overwrites: ?[]Overwrite = null,
/// The name of the channel (1-100 characters)
name: ?[]const u8 = null,
/// The channel topic (0-4096 characters for GUILD_FORUM channels, 0-1024 characters for all others)
topic: ?[]const u8 = null,
/// Whether the channel is nsfw
nsfw: ?bool = null,
/// The id of the last message sent in this channel (may not point to an existing or valid message)
last_message_id: ?Snowflake = null,
/// The bitrate (in bits) of the voice or stage channel
bitrate: ?isize = null,
/// The user limit of the voice or stage channel
user_limit: ?isize = null,
/// Amount of seconds a user has to wait before sending another message (0-21600); bots, as well as users with the permission `manage_messages` or `manage_channel`, are unaffected
rate_limit_per_user: ?isize = null,
/// the recipients of the DM
recipients: ?[]User = null,
/// icon hash of the group DM
icon: ?[]const u8 = null,
/// Id of the creator of the thread
owner_id: ?Snowflake = null,
/// Application id of the group DM creator if it is bot-created
application_id: ?Snowflake = null,
/// For group DM channels: whether the channel is managed by an application via the `gdm.join` OAuth2 scope.,
managed: ?bool = null,
/// For guild channels: Id of the parent category for a channel (each parent category can contain up to 50 channels), for threads: id of the text channel this thread was created,
parent_id: ?Snowflake = null,
/// When the last pinned message was pinned. This may be null in events such as GUILD_CREATE when a message is not pinned.
last_pin_timestamp: ?[]const u8 = null,
/// Voice region id for the voice or stage channel, automatic when set to null
rtc_region: ?[]const u8 = null,
/// The camera video quality mode of the voice channel, 1 when not present
video_quality_mode: ?VideoQualityModes = null,
/// An approximate count of messages in a thread, stops counting at 50
message_count: ?isize = null,
/// An approximate count of users in a thread, stops counting at 50
member_count: ?isize = null,
/// Thread-specific fields not needed by other channels
thread_metadata: ?ThreadMetadata = null,
/// Thread member object for the current user, if they have joined the thread, only included on certain API endpoints
member: ?ThreadMember = null,
/// Default duration for newly created threads, in minutes, to automatically archive the thread after recent activity, can be set to: 60, 1440, 4320, 10080,
default_auto_archive_duration: ?isize = null,
/// computed permissions for the invoking user in the channel, including overwrites, only included when part of the resolved data received on a slash command interaction. This does not include implicit permissions, which may need to be checked separately.
permissions: ?[]const u8 = null,
/// The flags of the channel
flags: ?ChannelFlags = null,
/// isize of messages ever sent in a thread, it's similar to `message_count` on message creation, but will not decrement the isize when a message is deleted
total_message_sent: ?isize = null,
/// The set of tags that can be used in a GUILD_FORUM channel
available_tags: ?[]ForumTag = null,
/// The IDs of the set of tags that have been applied to a thread in a GUILD_FORUM channel
applied_tags: ?[][]const u8 = null,
/// the emoji to show in the add reaction button on a thread in a GUILD_FORUM channel
default_reaction_emoji: ?DefaultReactionEmoji = null,
/// the initial rate_limit_per_user to set on newly created threads in a channel. this field is copied to the thread at creation time and does not live update.
default_thread_rate_limit_per_user: ?isize = null,
/// the default sort order type used to order posts in GUILD_FORUM channels. Defaults to null, which indicates a preferred sort order hasn't been set by a channel admin
default_sort_order: ?SortOrderTypes = null,
/// the default forum layout view used to display posts in `GUILD_FORUM` channels. Defaults to `0`, which indicates a layout view has not been set by a channel admin
default_forum_layout: ?ForumLayout = null,
/// When a thread is created this will be true on that channel payload for the thread.
newly_created: ?bool = null,
};
/// https://discord.com/developers/docs/resources/guild#welcome-screen-object-welcome-screen-structure
pub const WelcomeScreen = struct {
/// The server description shown in the welcome screen
description: ?[]const u8 = null,
/// The channels shown in the welcome screen, up to 5
welcome_channels: []WelcomeScreenChannel,
};
/// https://discord.com/developers/docs/resources/guild#welcome-screen-object-welcome-screen-channel-structure
pub const WelcomeScreenChannel = struct {
/// The description shown for the channel
description: []const u8,
/// The channel's id
channel_id: Snowflake,
/// The emoji id, if the emoji is custom
emoji_id: ?Snowflake = null,
/// The emoji name if custom, the unicode character if standard, or `null` if no emoji is set
emoji_name: ?[]const u8 = null,
};
/// https://discord.com/developers/docs/resources/stage-instance#auto-closing-stage-instance-structure
pub const StageInstance = struct {
/// The topic of the Stage instance (1-120 characters)
topic: []const u8,
/// The id of this Stage instance
id: Snowflake,
/// The guild id of the associated Stage channel
guild_id: Snowflake,
/// The id of the associated Stage channel
channel_id: Snowflake,
/// The id of the scheduled event for this Stage instance
guild_scheduled_event_id: ?Snowflake = null,
};
pub const Overwrite = struct {
/// Either 0 (role) or 1 (member)
type: OverwriteTypes,
/// Role or user id
id: Snowflake,
/// Permission bit set
allow: ?[]const u8 = null,
/// Permission bit set
deny: ?[]const u8 = null,
};
/// https://discord.com/developers/docs/resources/channel#followed-channel-object
pub const FollowedChannel = struct {
/// Source message id
channel_id: Snowflake,
/// Created target webhook id
webhook_id: Snowflake,
};
pub const ForumTag = struct {
/// The id of the tag
id: Snowflake,
/// The name of the tag (0-20 characters)
name: []const u8,
/// Whether this tag can only be added to or removed from threads by a member with the MANAGE_THREADS permission
moderated: bool,
/// The id of a guild's custom emoji At most one of emoji_id and emoji_name may be set.
emoji_id: Snowflake,
/// The unicode character of the emoji
emoji_name: ?[]const u8 = null,
};
pub const DefaultReactionEmoji = struct {
/// The id of a guild's custom emoji
emoji_id: Snowflake,
/// The unicode character of the emoji
emoji_name: ?[]const u8 = null,
};
/// https://discord.com/developers/docs/resources/guild#modify-guild-channel-positions
pub const ModifyGuildChannelPositions = struct {
/// Channel id
id: Snowflake,
/// Sorting position of the channel (channels with the same position are sorted by id)
position: ?isize = null,
/// Syncs the permission overwrites with the new parent, if moving to a new category
lock_positions: ?bool = null,
/// The new parent ID for the channel that is moved
parent_id: ?Snowflake = null,
};
pub const CreateChannelInvite = struct {
/// Duration of invite in seconds before expiry, or 0 for never. Between 0 and 604800 (7 days). Default: 86400 (24 hours)
max_age: ?isize = null,
/// Max number of users or 0 for unlimited. Between 0 and 100. Default: 0
max_uses: ?isize = null,
/// Whether this invite only grants temporary membership. Default: false
temporary: ?bool = null,
/// If true, don't try to reuse similar invite (useful for creating many unique one time use invites). Default: false
unique: ?bool = null,
/// The type of target for this voice channel invite
target_type: ?TargetTypes = null,
/// The id of the user whose stream to display for this invite, required if `target_type` is 1, the user must be streaming in the channel
target_user_id: ?Snowflake = null,
/// The id of the embedded application to open for this invite, required if `target_type` is 2, the application must have the `EMBEDDED` flag
target_application_id: ?Snowflake = null,
};

View File

@ -1,243 +1,243 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const ApplicationCommandTypes = @import("shared.zig").ApplicationCommandTypes;
const InteractionContextType = @import("integration.zig").InteractionContextType;
const Snowflake = @import("snowflake.zig").Snowflake;
const ApplicationCommandPermissionTypes = @import("shared.zig").ApplicationCommandPermissionTypes;
const ApplicationIntegrationType = @import("application.zig").ApplicationIntegrationType;
const ApplicationCommandOptionTypes = @import("shared.zig").ApplicationCommandOptionTypes;
const ChannelTypes = @import("shared.zig").ChannelTypes;
const ApplicationCommandTypes = @import("shared.zig").ApplicationCommandTypes;
const InteractionContextType = @import("integration.zig").InteractionContextType;
const Snowflake = @import("snowflake.zig").Snowflake;
const ApplicationCommandPermissionTypes = @import("shared.zig").ApplicationCommandPermissionTypes;
const ApplicationIntegrationType = @import("application.zig").ApplicationIntegrationType;
const ApplicationCommandOptionTypes = @import("shared.zig").ApplicationCommandOptionTypes;
const ChannelTypes = @import("shared.zig").ChannelTypes;
/// https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-structure
pub const ApplicationCommand = struct {
/// Type of command, defaults to `ApplicationCommandTypes.ChatInput`
type: ?ApplicationCommandTypes,
///
/// Name of command, 1-32 characters.
/// `ApplicationCommandTypes.ChatInput` command names must match the following regex `^[-_\p{L};\p{N};\p{sc=Deva};\p{sc=Thai};]{1,32};$` with the unicode flag set.
/// If there is a lowercase variant of any letters used, you must use those.
/// Characters with no lowercase variants and/or uncased letters are still allowed.
/// ApplicationCommandTypes.User` and `ApplicationCommandTypes.Message` commands may be mixed case and can include spaces.
///
name: []const u8,
/// Localization object for `name` field. Values follow the same restrictions as `name`
name_localizations: ?[]const u8, //?Localization,
/// Description for `ApplicationCommandTypes.ChatInput` commands, 1-100 characters.
description: ?[]const u8,
/// Localization object for `description` field. Values follow the same restrictions as `description`
description_localizations: ?[]const u8, //?Localization,
/// Parameters for the command, max of 25
options: ?[]ApplicationCommandOption,
/// Set of permissions represented as a bit set
default_member_permissions: ?[]const u8,
///
/// Installation contexts where the command is available
///
/// @remarks
/// This value is available only for globally-scoped commands
/// Defaults to the application configured contexts
///
integration_types: ?[]ApplicationIntegrationType,
///
/// Interaction context(s) where the command can be used
///
/// @remarks
/// This value is available only for globally-scoped commands
/// By default, all interaction context types included for new commands.
///
contexts: ?[]InteractionContextType,
///
/// Indicates whether the command is available in DMs with the app, only for globally-scoped commands. By default, commands are visible.
///
/// @deprecated use {@link contexts}; instead
///
dm_permission: ?bool,
/// Indicates whether the command is age-restricted, defaults to false
nsfw: ?bool,
/// Auto incrementing version identifier updated during substantial record changes
version: ?[]const u8,
///
///Determines whether the interaction is handled by the app's interactions handler or by
///
/// @remarks
/// This can only be set for application commands of type `PRIMARY_ENTRY_POINT` for applications with the `EMBEDDED` flag (i.e. applications that have an Activity).
///
handler: ?InteractionEntryPointCommandHandlerType,
/// Unique ID of command
id: Snowflake,
/// ID of the parent application
application_id: Snowflake,
/// Guild id of the command, if not global
guild_id: ?Snowflake,
};
/// https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-structure
pub const ApplicationCommand = struct {
/// Type of command, defaults to `ApplicationCommandTypes.ChatInput`
type: ?ApplicationCommandTypes = null,
///
/// Name of command, 1-32 characters.
/// `ApplicationCommandTypes.ChatInput` command names must match the following regex `^[-_\p{L};\p{N};\p{sc=Deva};\p{sc=Thai};]{1,32};$` with the unicode flag set.
/// If there is a lowercase variant of any letters used, you must use those.
/// Characters with no lowercase variants and/or uncased letters are still allowed.
/// ApplicationCommandTypes.User` and `ApplicationCommandTypes.Message` commands may be mixed case and can include spaces.
///
name: []const u8,
/// Localization object for `name` field. Values follow the same restrictions as `name`
name_localizations: ?[]const u8, //?Localization = null,
/// Description for `ApplicationCommandTypes.ChatInput` commands, 1-100 characters.
description: ?[]const u8 = null,
/// Localization object for `description` field. Values follow the same restrictions as `description`
description_localizations: ?[]const u8, //?Localization = null,
/// Parameters for the command, max of 25
options: ?[]ApplicationCommandOption = null,
/// Set of permissions represented as a bit set
default_member_permissions: ?[]const u8 = null,
///
/// Installation contexts where the command is available
///
/// @remarks
/// This value is available only for globally-scoped commands
/// Defaults to the application configured contexts
///
integration_types: ?[]ApplicationIntegrationType = null,
///
/// Interaction context(s) where the command can be used
///
/// @remarks
/// This value is available only for globally-scoped commands
/// By default, all interaction context types included for new commands.
///
contexts: ?[]InteractionContextType = null,
///
/// Indicates whether the command is available in DMs with the app, only for globally-scoped commands. By default, commands are visible.
///
/// @deprecated use {@link contexts}; instead
///
dm_permission: ?bool = null,
/// Indicates whether the command is age-restricted, defaults to false
nsfw: ?bool = null,
/// Auto incrementing version identifier updated during substantial record changes
version: ?[]const u8 = null,
///
///Determines whether the interaction is handled by the app's interactions handler or by
///
/// @remarks
/// This can only be set for application commands of type `PRIMARY_ENTRY_POINT` for applications with the `EMBEDDED` flag (i.e. applications that have an Activity).
///
handler: ?InteractionEntryPointCommandHandlerType = null,
/// Unique ID of command
id: Snowflake,
/// ID of the parent application
application_id: Snowflake,
/// Guild id of the command, if not global
guild_id: ?Snowflake = null,
};
pub const CreateApplicationCommand = struct {
/// Type of command, defaults to `ApplicationCommandTypes.ChatInput`
type: ?ApplicationCommandTypes,
///
/// Name of command, 1-32 characters.
/// `ApplicationCommandTypes.ChatInput` command names must match the following regex `^[-_\p{L};\p{N};\p{sc=Deva};\p{sc=Thai};]{1,32};$` with the unicode flag set.
/// If there is a lowercase variant of any letters used, you must use those.
/// Characters with no lowercase variants and/or uncased letters are still allowed.
/// ApplicationCommandTypes.User` and `ApplicationCommandTypes.Message` commands may be mixed case and can include spaces.
///
name: []const u8,
/// Localization object for `name` field. Values follow the same restrictions as `name`
name_localizations: []const u8, //?Localization,
/// Description for `ApplicationCommandTypes.ChatInput` commands, 1-100 characters.
description: ?[]const u8,
/// Localization object for `description` field. Values follow the same restrictions as `description`
description_localizations: []const u8, //?Localization,
/// Parameters for the command, max of 25
options: ?[]ApplicationCommandOption,
/// Set of permissions represented as a bit set
default_member_permissions: ?[]const u8,
///
/// Installation contexts where the command is available
///
/// @remarks
/// This value is available only for globally-scoped commands
/// Defaults to the application configured contexts
///
integration_types: ?[]ApplicationIntegrationType,
///
/// Interaction context(s) where the command can be used
///
/// @remarks
/// This value is available only for globally-scoped commands
/// By default, all interaction context types included for new commands.
///
contexts: ?[]InteractionContextType,
///
/// Indicates whether the command is available in DMs with the app, only for globally-scoped commands. By default, commands are visible.
///
/// @deprecated use {@link contexts}; instead
///
dm_permission: ?bool,
/// Indicates whether the command is age-restricted, defaults to false
nsfw: ?bool,
/// Auto incrementing version identifier updated during substantial record changes
version: ?[]const u8,
///
///Determines whether the interaction is handled by the app's interactions handler or by
///
/// @remarks
/// This can only be set for application commands of type `PRIMARY_ENTRY_POINT` for applications with the `EMBEDDED` flag (i.e. applications that have an Activity).
///
handler: ?InteractionEntryPointCommandHandlerType,
};
pub const CreateApplicationCommand = struct {
/// Type of command, defaults to `ApplicationCommandTypes.ChatInput`
type: ?ApplicationCommandTypes = null,
///
/// Name of command, 1-32 characters.
/// `ApplicationCommandTypes.ChatInput` command names must match the following regex `^[-_\p{L};\p{N};\p{sc=Deva};\p{sc=Thai};]{1,32};$` with the unicode flag set.
/// If there is a lowercase variant of any letters used, you must use those.
/// Characters with no lowercase variants and/or uncased letters are still allowed.
/// ApplicationCommandTypes.User` and `ApplicationCommandTypes.Message` commands may be mixed case and can include spaces.
///
name: []const u8,
/// Localization object for `name` field. Values follow the same restrictions as `name`
name_localizations: []const u8, //?Localization,
/// Description for `ApplicationCommandTypes.ChatInput` commands, 1-100 characters.
description: ?[]const u8 = null,
/// Localization object for `description` field. Values follow the same restrictions as `description`
description_localizations: []const u8, //?Localization,
/// Parameters for the command, max of 25
options: ?[]ApplicationCommandOption = null,
/// Set of permissions represented as a bit set
default_member_permissions: ?[]const u8 = null,
///
/// Installation contexts where the command is available
///
/// @remarks
/// This value is available only for globally-scoped commands
/// Defaults to the application configured contexts
///
integration_types: ?[]ApplicationIntegrationType = null,
///
/// Interaction context(s) where the command can be used
///
/// @remarks
/// This value is available only for globally-scoped commands
/// By default, all interaction context types included for new commands.
///
contexts: ?[]InteractionContextType = null,
///
/// Indicates whether the command is available in DMs with the app, only for globally-scoped commands. By default, commands are visible.
///
/// @deprecated use {@link contexts}; instead
///
dm_permission: ?bool = null,
/// Indicates whether the command is age-restricted, defaults to false
nsfw: ?bool = null,
/// Auto incrementing version identifier updated during substantial record changes
version: ?[]const u8 = null,
///
///Determines whether the interaction is handled by the app's interactions handler or by
///
/// @remarks
/// This can only be set for application commands of type `PRIMARY_ENTRY_POINT` for applications with the `EMBEDDED` flag (i.e. applications that have an Activity).
///
handler: ?InteractionEntryPointCommandHandlerType = null,
};
pub const InteractionEntryPointCommandHandlerType = enum(u4) {
/// The app handles the interaction using an interaction token
AppHandler = 1,
/// handles the interaction by launching an Activity and sending a follow-up message without coordinating with the app
LaunchActivity = 2,
};
pub const InteractionEntryPointCommandHandlerType = enum(u4) {
/// The app handles the interaction using an interaction token
AppHandler = 1,
/// handles the interaction by launching an Activity and sending a follow-up message without coordinating with the app
LaunchActivity = 2,
};
/// https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-option-structure
pub const ApplicationCommandOption = struct {
/// Type of option
type: ApplicationCommandOptionTypes,
///
/// Name of command, 1-32 characters.
///
/// @remarks
///This value should be unique within an array of {@link ApplicationCommandOption};
///
/// {@link ApplicationCommandTypes.ChatInput | ChatInput}; command names must match the following regex `^[-_\p{L};\p{N};\p{sc=Deva};\p{sc=Thai};]{1,32};$` with the unicode flag set.
/// If there is a lowercase variant of any letters used, you must use those.
/// Characters with no lowercase variants and/or uncased letters are still allowed.
///
/// {@link ApplicationCommandTypes.User | User}; and {@link ApplicationCommandTypes.Message | Message}; commands may be mixed case and can include spaces.
///
name: []const u8,
/// Localization object for the `name` field. Values follow the same restrictions as `name`
name_localizations: []const u4, //?Localization,
/// 1-100 character description
description: []const u8,
/// Localization object for the `description` field. Values follow the same restrictions as `description`
description_localizations: ?[]const u8, //?Localization,
///
/// If the parameter is required or optional. default `false`
///
/// @remarks
/// Valid in all option types except {@link ApplicationCommandOptionTypes.SubCommand | SubCommand}; and {@link ApplicationCommandOptionTypes.SubCommandGroup | SubCommandGroup};
///
required: ?bool,
///
/// Choices for the option from which the user can choose, max 25
///
/// @remarks
/// Only valid in options of type {@link ApplicationCommandOptionTypes.[]const u8 | []const u8};, {@link ApplicationCommandOptionTypes.Integer | Integer};, or {@link ApplicationCommandOptionTypes.isize | isize};
///
/// If you provide an array of choices, they will be the ONLY accepted values for this option
///
choices: ?[]ApplicationCommandOptionChoice,
///
/// If the option is a subcommand or subcommand group type, these nested options will be the parameters
///
/// @remarks
/// Only valid in option of type {@link ApplicationCommandOptionTypes.SubCommand | SubCommand}; or {@link ApplicationCommandOptionTypes.SubCommandGroup | SubCommandGroup};
///
options: ?[]ApplicationCommandOption,
///
/// If autocomplete interactions are enabled for this option.
///
/// @remarks
/// Only valid in options of type {@link ApplicationCommandOptionTypes.[]const u8 | []const u8};, {@link ApplicationCommandOptionTypes.Integer | Integer};, or {@link ApplicationCommandOptionTypes.isize | isize};
///
///When {@link ApplicationCommandOption.choices | choices}; are provided, this may not be set to true
///
autocomplete: ?bool,
///
/// The channels shown will be restricted to these types
///
/// @remarks
/// Only valid in option of type {@link ApplicationCommandOptionTypes.Channel | Channel};
///
channel_types: ?[]ChannelTypes,
///
/// The minimum permitted value
///
/// @remarks
/// Only valid in options of type {@link ApplicationCommandOptionTypes.Integer | Integer}; or {@link ApplicationCommandOptionTypes.isize | isize};
///
min_value: ?isize,
///
/// The maximum permitted value
///
/// @remarks
/// Only valid in options of type {@link ApplicationCommandOptionTypes.Integer | Integer}; or {@link ApplicationCommandOptionTypes.isize | isize};
///
max_value: ?isize,
///
/// The minimum permitted length, should be in the range of from 0 to 600
///
/// @remarks
/// Only valid in options of type {@link ApplicationCommandOptionTypes.[]const u8 | []const u8};
///
min_length: ?isize,
///
/// The maximum permitted length, should be in the range of from 0 to 600
///
/// @remarks
/// Only valid in options of type {@link ApplicationCommandOptionTypes.[]const u8 | []const u8};
///
max_length: ?isize,
/// https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-option-structure
pub const ApplicationCommandOption = struct {
/// Type of option
type: ApplicationCommandOptionTypes,
///
/// Name of command, 1-32 characters.
///
/// @remarks
///This value should be unique within an array of {@link ApplicationCommandOption};
///
/// {@link ApplicationCommandTypes.ChatInput | ChatInput}; command names must match the following regex `^[-_\p{L};\p{N};\p{sc=Deva};\p{sc=Thai};]{1,32};$` with the unicode flag set.
/// If there is a lowercase variant of any letters used, you must use those.
/// Characters with no lowercase variants and/or uncased letters are still allowed.
///
/// {@link ApplicationCommandTypes.User | User}; and {@link ApplicationCommandTypes.Message | Message}; commands may be mixed case and can include spaces.
///
name: []const u8,
/// Localization object for the `name` field. Values follow the same restrictions as `name`
name_localizations: []const u4, //?Localization,
/// 1-100 character description
description: []const u8,
/// Localization object for the `description` field. Values follow the same restrictions as `description`
description_localizations: ?[]const u8, //?Localization = null,
///
/// If the parameter is required or optional. default `false`
///
/// @remarks
/// Valid in all option types except {@link ApplicationCommandOptionTypes.SubCommand | SubCommand}; and {@link ApplicationCommandOptionTypes.SubCommandGroup | SubCommandGroup};
///
required: ?bool = null,
///
/// Choices for the option from which the user can choose, max 25
///
/// @remarks
/// Only valid in options of type {@link ApplicationCommandOptionTypes.[]const u8 | []const u8};, {@link ApplicationCommandOptionTypes.Integer | Integer};, or {@link ApplicationCommandOptionTypes.isize | isize};
///
/// If you provide an array of choices, they will be the ONLY accepted values for this option
///
choices: ?[]ApplicationCommandOptionChoice = null,
///
/// If the option is a subcommand or subcommand group type, these nested options will be the parameters
///
/// @remarks
/// Only valid in option of type {@link ApplicationCommandOptionTypes.SubCommand | SubCommand}; or {@link ApplicationCommandOptionTypes.SubCommandGroup | SubCommandGroup};
///
options: ?[]ApplicationCommandOption = null,
///
/// If autocomplete interactions are enabled for this option.
///
/// @remarks
/// Only valid in options of type {@link ApplicationCommandOptionTypes.[]const u8 | []const u8};, {@link ApplicationCommandOptionTypes.Integer | Integer};, or {@link ApplicationCommandOptionTypes.isize | isize};
///
///When {@link ApplicationCommandOption.choices | choices}; are provided, this may not be set to true
///
autocomplete: ?bool = null,
///
/// The channels shown will be restricted to these types
///
/// @remarks
/// Only valid in option of type {@link ApplicationCommandOptionTypes.Channel | Channel};
///
channel_types: ?[]ChannelTypes = null,
///
/// The minimum permitted value
///
/// @remarks
/// Only valid in options of type {@link ApplicationCommandOptionTypes.Integer | Integer}; or {@link ApplicationCommandOptionTypes.isize | isize};
///
min_value: ?isize = null,
///
/// The maximum permitted value
///
/// @remarks
/// Only valid in options of type {@link ApplicationCommandOptionTypes.Integer | Integer}; or {@link ApplicationCommandOptionTypes.isize | isize};
///
max_value: ?isize = null,
///
/// The minimum permitted length, should be in the range of from 0 to 600
///
/// @remarks
/// Only valid in options of type {@link ApplicationCommandOptionTypes.[]const u8 | []const u8};
///
min_length: ?isize = null,
///
/// The maximum permitted length, should be in the range of from 0 to 600
///
/// @remarks
/// Only valid in options of type {@link ApplicationCommandOptionTypes.[]const u8 | []const u8};
///
max_length: ?isize = null,
};
/// https://discord.com/developers/docs/interactions/application-commands#application-command-permissions-object

View File

@ -1,208 +1,224 @@
const Partial = @import("partial.zig").Partial;
const Snowflake = @import("snowflake.zig").Snowflake;
const Emoji = @import("emoji.zig").Emoji;
const ButtonStyles = @import("shared.zig").ButtonStyles;
const ChannelTypes = @import("shared.zig").ChannelTypes;
const MessageComponentTypes = @import("shared.zig").MessageComponentTypes;
const Partial = @import("partial.zig").Partial;
const Snowflake = @import("snowflake.zig").Snowflake;
const Emoji = @import("emoji.zig").Emoji;
const ButtonStyles = @import("shared.zig").ButtonStyles;
const ChannelTypes = @import("shared.zig").ChannelTypes;
const MessageComponentTypes = @import("shared.zig").MessageComponentTypes;
const std = @import("std");
const std = @import("std");
/// https://discord.com/developers/docs/interactions/message-components#buttons
pub const Button = struct {
/// 2 for a button
type: MessageComponentTypes,
/// A button style
style: ButtonStyles,
/// Text that appears on the button; max 80 characters
label: ?[]const u8,
/// name, id, and animated
emoji: Partial(Emoji),
/// Developer-defined identifier for the button; max 100 characters
custom_id: ?[]const u8,
/// Identifier for a purchasable SKU, only available when using premium-style buttons
sku_id: ?Snowflake,
/// URL for link-style buttons
url: ?[]const u8,
/// Whether the button is disabled (defaults to false)
disabled: ?bool,
};
/// https://discord.com/developers/docs/interactions/message-components#buttons
pub const Button = struct {
/// 2 for a button
type: MessageComponentTypes,
/// A button style
style: ButtonStyles,
/// Text that appears on the button; max 80 characters
label: ?[]const u8 = null,
/// name, id, and animated
emoji: Partial(Emoji),
/// Developer-defined identifier for the button; max 100 characters
custom_id: ?[]const u8 = null,
/// Identifier for a purchasable SKU, only available when using premium-style buttons
sku_id: ?Snowflake = null,
/// URL for link-style buttons
url: ?[]const u8 = null,
/// Whether the button is disabled (defaults to false)
disabled: ?bool = null,
};
pub const SelectOption = struct {
/// User-facing name of the option; max 100 characters
label: []const u8,
/// Dev-defined value of the option; max 100 characters
value: []const u8,
/// Additional description of the option; max 100 characters
description: ?[]const u8,
/// id, name, and animated
emoji: ?Partial(Emoji),
/// Will show this option as selected by default
default: ?bool,
};
pub const SelectOption = struct {
/// User-facing name of the option; max 100 characters
label: []const u8,
/// Dev-defined value of the option; max 100 characters
value: []const u8,
/// Additional description of the option; max 100 characters
description: ?[]const u8 = null,
/// id, name, and animated
emoji: ?Partial(Emoji) = null,
/// Will show this option as selected by default
default: ?bool = null,
};
pub const DefaultValue = struct {
/// ID of a user, role, or channel
id: Snowflake,
/// Type of value that id represents. Either "user", "role", or "channel"
type: union(enum) { user, role, channel },
};
pub const DefaultValue = struct {
/// ID of a user, role, or channel
id: Snowflake,
/// Type of value that id represents. Either "user", "role", or "channel"
type: union(enum) { user, role, channel },
};
/// https://discord.com/developers/docs/interactions/message-components#select-menus
pub const SelectMenuString = struct {
/// Type of select menu component (text: 3, user: 5, role: 6, mentionable: 7, channels: 8)
type: MessageComponentTypes,
/// ID for the select menu; max 100 characters
custom_id: []const u8,
/// Specified choices in a select menu (only required and available for string selects (type 3); max 25
/// * options is required for string select menus (component type 3), and unavailable for all other select menu components.
options: ?[]SelectOption,
/// Placeholder text if nothing is selected; max 150 characters
placeholder: ?[]const u8,
/// Minimum number of items that must be chosen (defaults to 1); min 0, max 25
min_values: ?usize,
/// Maximum number of items that can be chosen (defaults to 1); max 25
max_values: ?usize,
/// Whether select menu is disabled (defaults to false)
disabled: ?bool,
};
/// https://discord.com/developers/docs/interactions/message-components#select-menus
pub const SelectMenuString = struct {
/// Type of select menu component (text: 3, user: 5, role: 6, mentionable: 7, channels: 8)
type: MessageComponentTypes,
/// ID for the select menu; max 100 characters
custom_id: []const u8,
/// Specified choices in a select menu (only required and available for string selects (type 3); max 25
/// * options is required for string select menus (component type 3), and unavailable for all other select menu components.
options: ?[]SelectOption = null,
/// Placeholder text if nothing is selected; max 150 characters
placeholder: ?[]const u8 = null,
/// Minimum number of items that must be chosen (defaults to 1); min 0, max 25
min_values: ?usize = null,
/// Maximum number of items that can be chosen (defaults to 1); max 25
max_values: ?usize = null,
/// Whether select menu is disabled (defaults to false)
disabled: ?bool = null,
};
/// https://discord.com/developers/docs/interactions/message-components#select-menus
pub const SelectMenuUsers = struct {
/// Type of select menu component (text: 3, user: 5, role: 6, mentionable: 7, channels: 8)
type: MessageComponentTypes,
/// ID for the select menu; max 100 characters
custom_id: []const u8,
/// Placeholder text if nothing is selected; max 150 characters
placeholder: ?[]const u8,
/// List of default values for auto-populated select menu components; number of default values must be in the range defined by min_values and max_values
/// *** default_values is only available for auto-populated select menu components, which include user (5), role (6), mentionable (7), and channel (8) components.
default_values: ?[]DefaultValue,
/// Minimum number of items that must be chosen (defaults to 1); min 0, max 25
min_values: ?usize,
/// Maximum number of items that can be chosen (defaults to 1); max 25
max_values: ?usize,
/// Whether select menu is disabled (defaults to false)
disabled: ?bool,
};
/// https://discord.com/developers/docs/interactions/message-components#select-menus
pub const SelectMenuUsers = struct {
/// Type of select menu component (text: 3, user: 5, role: 6, mentionable: 7, channels: 8)
type: MessageComponentTypes,
/// ID for the select menu; max 100 characters
custom_id: []const u8,
/// Placeholder text if nothing is selected; max 150 characters
placeholder: ?[]const u8 = null,
/// List of default values for auto-populated select menu components; number of default values must be in the range defined by min_values and max_values
/// *** default_values is only available for auto-populated select menu components, which include user (5), role (6), mentionable (7), and channel (8) components.
default_values: ?[]DefaultValue = null,
/// Minimum number of items that must be chosen (defaults to 1); min 0, max 25
min_values: ?usize = null,
/// Maximum number of items that can be chosen (defaults to 1); max 25
max_values: ?usize = null,
/// Whether select menu is disabled (defaults to false)
disabled: ?bool = null,
};
/// https://discord.com/developers/docs/interactions/message-components#select-menus
pub const SelectMenuRoles = struct {
/// Type of select menu component (text: 3, user: 5, role: 6, mentionable: 7, channels: 8)
type: MessageComponentTypes,
/// ID for the select menu; max 100 characters
custom_id: []const u8,
/// Placeholder text if nothing is selected; max 150 characters
placeholder: ?[]const u8,
/// List of default values for auto-populated select menu components; number of default values must be in the range defined by min_values and max_values
/// *** default_values is only available for auto-populated select menu components, which include user (5), role (6), mentionable (7), and channel (8) components.
default_values: ?[]DefaultValue,
/// Minimum number of items that must be chosen (defaults to 1); min 0, max 25
min_values: ?usize,
/// Maximum number of items that can be chosen (defaults to 1); max 25
max_values: ?usize,
/// Whether select menu is disabled (defaults to false)
disabled: ?bool,
};
/// https://discord.com/developers/docs/interactions/message-components#select-menus
pub const SelectMenuRoles = struct {
/// Type of select menu component (text: 3, user: 5, role: 6, mentionable: 7, channels: 8)
type: MessageComponentTypes,
/// ID for the select menu; max 100 characters
custom_id: []const u8,
/// Placeholder text if nothing is selected; max 150 characters
placeholder: ?[]const u8 = null,
/// List of default values for auto-populated select menu components; number of default values must be in the range defined by min_values and max_values
/// *** default_values is only available for auto-populated select menu components, which include user (5), role (6), mentionable (7), and channel (8) components.
default_values: ?[]DefaultValue = null,
/// Minimum number of items that must be chosen (defaults to 1); min 0, max 25
min_values: ?usize = null,
/// Maximum number of items that can be chosen (defaults to 1); max 25
max_values: ?usize = null,
/// Whether select menu is disabled (defaults to false)
disabled: ?bool = null,
};
/// https://discord.com/developers/docs/interactions/message-components#select-menus
pub const SelectMenuUsersAndRoles = struct {
/// Type of select menu component (text: 3, user: 5, role: 6, mentionable: 7, channels: 8)
type: MessageComponentTypes,
/// ID for the select menu; max 100 characters
custom_id: []const u8,
/// Placeholder text if nothing is selected; max 150 characters
placeholder: ?[]const u8,
/// List of default values for auto-populated select menu components; number of default values must be in the range defined by min_values and max_values
/// *** default_values is only available for auto-populated select menu components, which include user (5), role (6), mentionable (7), and channel (8) components.
default_values: ?[]DefaultValue,
/// Minimum number of items that must be chosen (defaults to 1); min 0, max 25
min_values: ?usize,
/// Maximum number of items that can be chosen (defaults to 1); max 25
max_values: ?usize,
/// Whether select menu is disabled (defaults to false)
disabled: ?bool,
};
/// https://discord.com/developers/docs/interactions/message-components#select-menus
pub const SelectMenuUsersAndRoles = struct {
/// Type of select menu component (text: 3, user: 5, role: 6, mentionable: 7, channels: 8)
type: MessageComponentTypes,
/// ID for the select menu; max 100 characters
custom_id: []const u8,
/// Placeholder text if nothing is selected; max 150 characters
placeholder: ?[]const u8 = null,
/// List of default values for auto-populated select menu components; number of default values must be in the range defined by min_values and max_values
/// *** default_values is only available for auto-populated select menu components, which include user (5), role (6), mentionable (7), and channel (8) components.
default_values: ?[]DefaultValue = null,
/// Minimum number of items that must be chosen (defaults to 1); min 0, max 25
min_values: ?usize = null,
/// Maximum number of items that can be chosen (defaults to 1); max 25
max_values: ?usize = null,
/// Whether select menu is disabled (defaults to false)
disabled: ?bool = null,
};
/// https://discord.com/developers/docs/interactions/message-components#select-menus
pub const SelectMenuChannels = struct {
/// Type of select menu component (text: 3, user: 5, role: 6, mentionable: 7, channels: 8)
type: MessageComponentTypes,
/// ID for the select menu; max 100 characters
custom_id: []const u8,
/// List of channel types to include in the channel select component (type 8)
/// ** channel_types can only be used for channel select menu components.
channel_types: ?[]ChannelTypes,
/// Placeholder text if nothing is selected; max 150 characters
placeholder: ?[]const u8,
/// List of default values for auto-populated select menu components; number of default values must be in the range defined by min_values and max_values
/// *** default_values is only available for auto-populated select menu components, which include user (5), role (6), mentionable (7), and channel (8) components.
default_values: ?[]DefaultValue,
/// Minimum number of items that must be chosen (defaults to 1); min 0, max 25
min_values: ?usize,
/// Maximum number of items that can be chosen (defaults to 1); max 25
max_values: ?usize,
/// Whether select menu is disabled (defaults to false)
disabled: ?bool,
};
/// https://discord.com/developers/docs/interactions/message-components#select-menus
pub const SelectMenuChannels = struct {
/// Type of select menu component (text: 3, user: 5, role: 6, mentionable: 7, channels: 8)
type: MessageComponentTypes,
/// ID for the select menu; max 100 characters
custom_id: []const u8,
/// List of channel types to include in the channel select component (type 8)
/// ** channel_types can only be used for channel select menu components.
channel_types: ?[]ChannelTypes = null,
/// Placeholder text if nothing is selected; max 150 characters
placeholder: ?[]const u8 = null,
/// List of default values for auto-populated select menu components; number of default values must be in the range defined by min_values and max_values
/// *** default_values is only available for auto-populated select menu components, which include user (5), role (6), mentionable (7), and channel (8) components.
default_values: ?[]DefaultValue = null,
/// Minimum number of items that must be chosen (defaults to 1); min 0, max 25
min_values: ?usize = null,
/// Maximum number of items that can be chosen (defaults to 1); max 25
max_values: ?usize = null,
/// Whether select menu is disabled (defaults to false)
disabled: ?bool = null,
};
pub const SelectMenu = union(MessageComponentTypes) {
SelectMenu: SelectMenuString,
SelectMenuUsers: SelectMenuUsers,
SelectMenuRoles: SelectMenuRoles,
SelectMenuUsersAndRoles: SelectMenuUsersAndRoles,
SelectMenuChannels: SelectMenuChannels,
pub const SelectMenu = union(MessageComponentTypes) {
SelectMenu: SelectMenuString,
SelectMenuUsers: SelectMenuUsers,
SelectMenuRoles: SelectMenuRoles,
SelectMenuUsersAndRoles: SelectMenuUsersAndRoles,
SelectMenuChannels: SelectMenuChannels,
pub fn jsonParse(allocator: std.mem.Allocator, src: anytype, _: std.json.ParseOptions) !@This() {
const value = try std.json.innerParse(std.json.Value, allocator, src, .{
.max_value_len = 0x100,
});
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 != .object) @panic("coulnd't match against non-object type");
if (value != .object) @panic("coulnd't match against non-object type");
switch (value.object.get("type") orelse @panic("couldn't find property `type`")) {
.integer => |num| return switch (@as(MessageComponentTypes, @enumFromInt(num))) {
.SelectMenu => .{ .SelectMenu = try std.json.parseFromValueLeaky(SelectMenuString, allocator, value, .{.max_value_len = 0x100})},
.SelectMenuUsers => .{ .SelectMenuUsers = try std.json.parseFromValueLeaky(SelectMenuUsers, allocator, value, .{.max_value_len = 0x100})},
.SelectMenuRoles => .{ .SelectMenuRoles = try std.json.parseFromValueLeaky(SelectMenuRoles, allocator, value, .{.max_value_len = 0x100})},
.SelectMenuUsersAndRoles => .{ .SelectMenuUsersAndRoles = try std.json.parseFromValueLeaky(SelectMenuUsersAndRoles, allocator, value, .{.max_value_len = 0x100})},
.SelectMenuChannels => .{ .SelectMenuChannels = try std.json.parseFromValueLeaky(SelectMenuChannels, allocator, value, .{.max_value_len = 0x100})},
},
else => @panic("got type but couldn't match against non enum member `type`"),
switch (value.object.get("type") orelse @panic("couldn't find property `type`")) {
.integer => |num| return switch (@as(MessageComponentTypes, @enumFromInt(num))) {
.SelectMenu => .{ .SelectMenu = try std.json.parseFromValueLeaky(SelectMenuString, allocator, value, .{
.ignore_unknown_fields = true,
.max_value_len = 0x1000,
})},
.SelectMenuUsers => .{ .SelectMenuUsers = try std.json.parseFromValueLeaky(SelectMenuUsers, allocator, value, .{
.ignore_unknown_fields = true,
.max_value_len = 0x1000,
})},
.SelectMenuRoles => .{ .SelectMenuRoles = try std.json.parseFromValueLeaky(SelectMenuRoles, allocator, value, .{
.ignore_unknown_fields = true,
.max_value_len = 0x1000,
})},
.SelectMenuUsersAndRoles => .{ .SelectMenuUsersAndRoles = try std.json.parseFromValueLeaky(SelectMenuUsersAndRoles, allocator, value, .{
.ignore_unknown_fields = true,
.max_value_len = 0x1000,
})},
.SelectMenuChannels => .{ .SelectMenuChannels = try std.json.parseFromValueLeaky(SelectMenuChannels, allocator, value, .{
.ignore_unknown_fields = true,
.max_value_len = 0x1000,
})},
},
else => @panic("got type but couldn't match against non enum member `type`"),
}
return try MessageComponent.json(allocator, value);
}
return try MessageComponent.json(allocator, value);
}
// legacy
pub fn json(_: std.mem.Allocator) !SelectMenu {
@compileError("Deprecated, use std.json instead.");
}
};
// legacy
pub fn json(_: std.mem.Allocator) !SelectMenu {
@compileError("Deprecated, use std.json instead.");
}
};
pub const InputTextStyles = enum(u4) {
Short = 1,
Paragraph,
};
pub const InputTextStyles = enum(u4) {
Short = 1,
Paragraph,
};
pub const InputText = struct {
/// 4 for a text input
type: MessageComponentTypes,
/// Developer-defined identifier for the input; max 100 characters
custom_id: []const u8,
/// The Text Input Style
style: InputTextStyles,
/// Label for this component; max 45 characters
label: []const u8,
/// Minimum input length for a text input; min 0, max 4000
min_length: ?usize,
/// Maximum input length for a text input; min 1, max 4000
max_length: ?usize,
/// Whether this component is required to be filled (defaults to true)
required: ?bool,
/// Pre-filled value for this component; max 4000 characters
value: ?[]const u8,
/// Custom placeholder text if the input is empty; max 100 characters
placeholder: ?[]const u8,
pub const InputText = struct {
/// 4 for a text input
type: MessageComponentTypes,
/// Developer-defined identifier for the input; max 100 characters
custom_id: []const u8,
/// The Text Input Style
style: InputTextStyles,
/// Label for this component; max 45 characters
label: []const u8,
/// Minimum input length for a text input; min 0, max 4000
min_length: ?usize = null,
/// Maximum input length for a text input; min 1, max 4000
max_length: ?usize = null,
/// Whether this component is required to be filled (defaults to true)
required: ?bool = null,
/// Pre-filled value for this component; max 4000 characters
value: ?[]const u8 = null,
/// Custom placeholder text if the input is empty; max 100 characters
placeholder: ?[]const u8 = null,
};
pub const MessageComponent = union(MessageComponentTypes) {
@ -223,21 +239,43 @@ pub const MessageComponent = union(MessageComponentTypes) {
pub fn jsonParse(allocator: std.mem.Allocator, src: anytype, _: std.json.ParseOptions) !@This() {
const value = try std.json.innerParse(std.json.Value, allocator, src, .{
.max_value_len = 0x100,
.ignore_unknown_fields = true,
.max_value_len = 0x1000,
});
if (value != .object) @panic("coulnd't match against non-object type");
switch (value.object.get("type") orelse @panic("couldn't find property `type`")) {
.integer => |num| return switch (@as(MessageComponentTypes, @enumFromInt(num))) {
.ActionRow => .{ .ActionRow = try std.json.parseFromValueLeaky([]MessageComponent, allocator, value, .{.max_value_len = 0x100}) },
.Button => .{ .Button = try std.json.parseFromValueLeaky(Button, allocator, value, .{.max_value_len = 0x100}) },
.SelectMenu => .{ .SelectMenu = try std.json.parseFromValueLeaky(SelectMenuString, allocator, value, .{.max_value_len = 0x100})},
.InputText => .{ .InputText = try std.json.parseFromValueLeaky(InputText, allocator, value, .{.max_value_len = 0x100}) },
.SelectMenuUsers => .{ .SelectMenuUsers = try std.json.parseFromValueLeaky(SelectMenuUsers, allocator, value, .{.max_value_len = 0x100})},
.SelectMenuRoles => .{ .SelectMenuRoles = try std.json.parseFromValueLeaky(SelectMenuRoles, allocator, value, .{.max_value_len = 0x100})},
.SelectMenuUsersAndRoles => .{ .SelectMenuUsersAndRoles = try std.json.parseFromValueLeaky(SelectMenuUsersAndRoles, allocator, value, .{.max_value_len = 0x100})},
.SelectMenuChannels => .{ .SelectMenuChannels = try std.json.parseFromValueLeaky(SelectMenuChannels, allocator, value, .{.max_value_len = 0x100})},
.ActionRow => .{ .ActionRow = try std.json.parseFromValueLeaky([]MessageComponent, allocator, value, .{
.ignore_unknown_fields = true,
.max_value_len = 0x1000,
}) },
.Button => .{ .Button = try std.json.parseFromValueLeaky(Button, allocator, value, .{
.ignore_unknown_fields = true,
.max_value_len = 0x1000,
}) },
.SelectMenu => .{ .SelectMenu = try std.json.parseFromValueLeaky(SelectMenuString, allocator, value, .{
.ignore_unknown_fields = true,
.max_value_len = 0x1000,
})},
.InputText => .{ .InputText = try std.json.parseFromValueLeaky(InputText, allocator, value, .{.max_value_len = 0x1000}) },
.SelectMenuUsers => .{ .SelectMenuUsers = try std.json.parseFromValueLeaky(SelectMenuUsers, allocator, value, .{
.ignore_unknown_fields = true,
.max_value_len = 0x1000,
})},
.SelectMenuRoles => .{ .SelectMenuRoles = try std.json.parseFromValueLeaky(SelectMenuRoles, allocator, value, .{
.ignore_unknown_fields = true,
.max_value_len = 0x1000,
})},
.SelectMenuUsersAndRoles => .{ .SelectMenuUsersAndRoles = try std.json.parseFromValueLeaky(SelectMenuUsersAndRoles, allocator, value, .{
.ignore_unknown_fields = true,
.max_value_len = 0x1000,
})},
.SelectMenuChannels => .{ .SelectMenuChannels = try std.json.parseFromValueLeaky(SelectMenuChannels, allocator, value, .{
.ignore_unknown_fields = true,
.max_value_len = 0x1000,
})},
},
else => @panic("got type but couldn't match against non enum member `type`"),
}

View File

@ -1,122 +1,122 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const EmbedTypes = @import("shared.zig").EmbedTypes;
const EmbedTypes = @import("shared.zig").EmbedTypes;
/// https://discord.com/developers/docs/resources/channel#embed-object
pub const Embed = struct {
/// Title of embed
title: ?[]const u8,
/// Type of embed (always "rich" for webhook embeds)
type: ?EmbedTypes,
/// Description of embed
description: ?[]const u8,
/// Url of embed
url: ?[]const u8,
/// Color code of the embed
color: ?isize,
/// Timestamp of embed content
timestamp: ?[]const u8,
/// Footer information
footer: ?EmbedFooter,
/// Image information
image: ?EmbedImage,
/// Thumbnail information
thumbnail: ?EmbedThumbnail,
/// Video information
video: ?EmbedVideo,
/// Provider information
provider: ?EmbedProvider,
/// Author information
author: ?EmbedAuthor,
/// Fields information
fields: ?[]EmbedField,
};
/// https://discord.com/developers/docs/resources/channel#embed-object-embed-author-structure
pub const EmbedAuthor = struct {
/// Name of author
name: []const u8,
/// Url of author
url: ?[]const u8,
/// Url of author icon (only supports http(s) and attachments)
icon_url: ?[]const u8,
/// A proxied url of author icon
proxy_icon_url: ?[]const u8,
};
/// https://discord.com/developers/docs/resources/channel#embed-object-embed-field-structure
pub const EmbedField = struct {
/// Name of the field
name: []const u8,
/// Value of the field
value: []const u8,
/// Whether or not this field should display inline
@"inline": ?bool,
};
/// https://discord.com/developers/docs/resources/channel#embed-object-embed-footer-structure
pub const EmbedFooter = struct {
/// Footer text
text: []const u8,
/// Url of footer icon (only supports http(s) and attachments)
icon_url: ?[]const u8,
/// A proxied url of footer icon
proxy_icon_url: ?[]const u8,
};
/// https://discord.com/developers/docs/resources/channel#embed-object-embed-image-structure
pub const EmbedImage = struct {
/// Source url of image (only supports http(s) and attachments)
url: []const u8,
/// A proxied url of the image
proxy_url: ?[]const u8,
/// Height of image
height: ?isize,
/// Width of image
width: ?isize,
};
pub const EmbedProvider = struct {
/// Name of provider
name: ?[]const u8,
/// Url of provider
url: ?[]const u8,
};
/// https://discord.com/developers/docs/resources/channel#embed-object-embed-thumbnail-structure
pub const EmbedThumbnail = struct {
/// Source url of thumbnail (only supports http(s) and attachments)
url: []const u8,
/// A proxied url of the thumbnail
proxy_url: ?[]const u8,
/// Height of thumbnail
height: ?isize,
/// Width of thumbnail
width: ?isize,
};
/// https://discord.com/developers/docs/resources/channel#embed-object-embed-video-structure
pub const EmbedVideo = struct {
/// Source url of video
url: ?[]const u8,
/// A proxied url of the video
proxy_url: ?[]const u8,
/// Height of video
height: ?isize,
/// Width of video
width: ?isize,
/// https://discord.com/developers/docs/resources/channel#embed-object
pub const Embed = struct {
/// Title of embed
title: ?[]const u8 = null,
/// Type of embed (always "rich" for webhook embeds)
type: ?EmbedTypes = null,
/// Description of embed
description: ?[]const u8 = null,
/// Url of embed
url: ?[]const u8 = null,
/// Color code of the embed
color: ?isize = null,
/// Timestamp of embed content
timestamp: ?[]const u8 = null,
/// Footer information
footer: ?EmbedFooter = null,
/// Image information
image: ?EmbedImage = null,
/// Thumbnail information
thumbnail: ?EmbedThumbnail = null,
/// Video information
video: ?EmbedVideo = null,
/// Provider information
provider: ?EmbedProvider = null,
/// Author information
author: ?EmbedAuthor = null,
/// Fields information
fields: ?[]EmbedField = null,
};
/// https://discord.com/developers/docs/resources/channel#embed-object-embed-author-structure
pub const EmbedAuthor = struct {
/// Name of author
name: []const u8,
/// Url of author
url: ?[]const u8 = null,
/// Url of author icon (only supports http(s) and attachments)
icon_url: ?[]const u8 = null,
/// A proxied url of author icon
proxy_icon_url: ?[]const u8 = null,
};
/// https://discord.com/developers/docs/resources/channel#embed-object-embed-field-structure
pub const EmbedField = struct {
/// Name of the field
name: []const u8,
/// Value of the field
value: []const u8,
/// Whether or not this field should display inline
@"inline" : ?bool = null,
};
/// https://discord.com/developers/docs/resources/channel#embed-object-embed-footer-structure
pub const EmbedFooter = struct {
/// Footer text
text: []const u8,
/// Url of footer icon (only supports http(s) and attachments)
icon_url: ?[]const u8 = null,
/// A proxied url of footer icon
proxy_icon_url: ?[]const u8 = null,
};
/// https://discord.com/developers/docs/resources/channel#embed-object-embed-image-structure
pub const EmbedImage = struct {
/// Source url of image (only supports http(s) and attachments)
url: []const u8,
/// A proxied url of the image
proxy_url: ?[]const u8 = null,
/// Height of image
height: ?isize = null,
/// Width of image
width: ?isize = null,
};
pub const EmbedProvider = struct {
/// Name of provider
name: ?[]const u8 = null,
/// Url of provider
url: ?[]const u8 = null,
};
/// https://discord.com/developers/docs/resources/channel#embed-object-embed-thumbnail-structure
pub const EmbedThumbnail = struct {
/// Source url of thumbnail (only supports http(s) and attachments)
url: []const u8,
/// A proxied url of the thumbnail
proxy_url: ?[]const u8 = null,
/// Height of thumbnail
height: ?isize = null,
/// Width of thumbnail
width: ?isize = null,
};
/// https://discord.com/developers/docs/resources/channel#embed-object-embed-video-structure
pub const EmbedVideo = struct {
/// Source url of video
url: ?[]const u8 = null,
/// A proxied url of the video
proxy_url: ?[]const u8 = null,
/// Height of video
height: ?isize = null,
/// Width of video
width: ?isize = null,
};

View File

@ -1,38 +1,38 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const Snowflake = @import("snowflake.zig").Snowflake;
const User = @import("user.zig").User;
const Snowflake = @import("snowflake.zig").Snowflake;
const User = @import("user.zig").User;
/// https://discord.com/developers/docs/resources/emoji#emoji-object-emoji-structure
pub const Emoji = struct {
/// Emoji name (can only be null in reaction emoji objects)
name: ?[]const u8,
/// Emoji id
id: ?Snowflake,
/// Roles allowed to use this emoji
roles: ?[][]const u8,
/// User that created this emoji
user: ?User,
/// Whether this emoji must be wrapped in colons
require_colons: ?bool,
/// Whether this emoji is managed
managed: ?bool,
/// Whether this emoji is animated
animated: ?bool,
/// Whether this emoji can be used, may be false due to loss of Server Boosts
available: ?bool,
/// https://discord.com/developers/docs/resources/emoji#emoji-object-emoji-structure
pub const Emoji = struct {
/// Emoji name (can only be null in reaction emoji objects)
name: ?[]const u8 = null,
/// Emoji id
id: ?Snowflake = null,
/// Roles allowed to use this emoji
roles: ?[][]const u8 = null,
/// User that created this emoji
user: ?User = null,
/// Whether this emoji must be wrapped in colons
require_colons: ?bool = null,
/// Whether this emoji is managed
managed: ?bool = null,
/// Whether this emoji is animated
animated: ?bool = null,
/// Whether this emoji can be used, may be false due to loss of Server Boosts
available: ?bool = null,
};

File diff suppressed because it is too large Load Diff

View File

@ -1,195 +1,195 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const User = @import("user.zig").User;
const Snowflake = @import("snowflake.zig").Snowflake;
const ActivityTypes = @import("shared.zig").ActivityTypes;
const Partial = @import("partial.zig").Partial;
const User = @import("user.zig").User;
const Snowflake = @import("snowflake.zig").Snowflake;
const ActivityTypes = @import("shared.zig").ActivityTypes;
const Partial = @import("partial.zig").Partial;
/// https://discord.com/developers/docs/topics/gateway#get-gateway-bot
pub const GetGatewayBot = struct {
/// The WSS URL that can be used for connecting to the gateway
url: []const u8,
/// The recommended isize of shards to use when connecting
shards: isize,
/// Information on the current session start limit
session_start_limit: SessionStartLimit,
};
/// https://discord.com/developers/docs/topics/gateway#get-gateway-bot
pub const GetGatewayBot = struct {
/// The WSS URL that can be used for connecting to the gateway
url: []const u8,
/// The recommended isize of shards to use when connecting
shards: isize,
/// Information on the current session start limit
session_start_limit: SessionStartLimit,
};
/// https://discord.com/developers/docs/topics/gateway#session-start-limit-object
pub const SessionStartLimit = struct {
/// The total isize of session starts the current user is allowed
total: isize,
/// The remaining isize of session starts the current user is allowed
remaining: isize,
/// The isize of milliseconds after which the limit resets
reset_after: isize,
/// The isize of identify requests allowed per 5 seconds
max_concurrency: isize,
};
/// https://discord.com/developers/docs/topics/gateway#session-start-limit-object
pub const SessionStartLimit = struct {
/// The total isize of session starts the current user is allowed
total: isize,
/// The remaining isize of session starts the current user is allowed
remaining: isize,
/// The isize of milliseconds after which the limit resets
reset_after: isize,
/// The isize of identify requests allowed per 5 seconds
max_concurrency: isize,
};
/// https://discord.com/developers/docs/topics/gateway#presence-update
pub const PresenceUpdate = struct {
/// Either "idle", "dnd", "online", or "offline"
status: union(enum) {
idle,
dnd,
online,
offline,
},
/// The user presence is being updated for
user: Partial(User),
/// id of the guild
guild_id: Snowflake,
/// User's current activities
activities: []Activity,
/// User's platform-dependent status
client_status: ClientStatus,
};
/// https://discord.com/developers/docs/topics/gateway#presence-update
pub const PresenceUpdate = struct {
/// Either "idle", "dnd", "online", or "offline"
status: union(enum) {
idle,
dnd,
online,
offline,
},
/// The user presence is being updated for
user: Partial(User),
/// id of the guild
guild_id: Snowflake,
/// User's current activities
activities: []Activity,
/// User's platform-dependent status
client_status: ClientStatus,
};
/// https://discord.com/developers/docs/topics/gateway-events#activity-object
pub const Activity = struct {
/// The activity's name
name: []const u8,
/// Activity type
type: ActivityTypes,
/// Stream url, is validated when type is 1
url: ?[]const u8,
/// Unix timestamp of when the activity was added to the user's session
created_at: isize,
/// What the player is currently doing
details: ?[]const u8,
/// The user's current party status
state: ?[]const u8,
/// Whether or not the activity is an instanced game session
instance: ?bool,
/// Activity flags `OR`d together, describes what the payload includes
flags: ?isize,
/// Unix timestamps for start and/or end of the game
timestamps: ?ActivityTimestamps,
/// Application id for the game
/// a string
application_id: ?[]const u8,
/// The emoji used for a custom status
emoji: ?ActivityEmoji,
/// Information for the current party of the player
party: ?ActivityParty,
/// Images for the presence and their hover texts
assets: ?ActivityAssets,
/// Secrets for Rich Presence joining and spectating
secrets: ?ActivitySecrets,
/// The custom buttons shown in the Rich Presence (max 2)
buttons: ?[]ActivityButton,
};
/// https://discord.com/developers/docs/topics/gateway-events#activity-object
pub const Activity = struct {
/// The activity's name
name: []const u8,
/// Activity type
type: ActivityTypes,
/// Stream url, is validated when type is 1
url: ?[]const u8 = null,
/// Unix timestamp of when the activity was added to the user's session
created_at: isize,
/// What the player is currently doing
details: ?[]const u8 = null,
/// The user's current party status
state: ?[]const u8 = null,
/// Whether or not the activity is an instanced game session
instance: ?bool = null,
/// Activity flags `OR`d together, describes what the payload includes
flags: ?isize = null,
/// Unix timestamps for start and/or end of the game
timestamps: ?ActivityTimestamps = null,
/// Application id for the game
/// a string
application_id: ?[]const u8 = null,
/// The emoji used for a custom status
emoji: ?ActivityEmoji = null,
/// Information for the current party of the player
party: ?ActivityParty = null,
/// Images for the presence and their hover texts
assets: ?ActivityAssets = null,
/// Secrets for Rich Presence joining and spectating
secrets: ?ActivitySecrets = null,
/// The custom buttons shown in the Rich Presence (max 2)
buttons: ?[]ActivityButton = null,
};
/// https://discord.com/developers/docs/resources/application#get-application-activity-instance-activity-instance-object
pub const ActivityInstance = struct {
/// Application ID
/// a string
application_id: []const u8,
/// Activity Instance ID
/// a string
instance_id: []const u8,
/// Unique identifier for the launch
/// a string
launch_id: []const u8,
/// The Location the instance is runnning in
location: ActivityLocation,
/// The IDs of the Users currently connected to the instance
users: []Snowflake,
};
/// https://discord.com/developers/docs/resources/application#get-application-activity-instance-activity-instance-object
pub const ActivityInstance = struct {
/// Application ID
/// a string
application_id: []const u8,
/// Activity Instance ID
/// a string
instance_id: []const u8,
/// Unique identifier for the launch
/// a string
launch_id: []const u8,
/// The Location the instance is runnning in
location: ActivityLocation,
/// The IDs of the Users currently connected to the instance
users: []Snowflake,
};
/// https://discord.com/developers/docs/resources/application#get-application-activity-instance-activity-location-object
pub const ActivityLocation = struct {
/// The unique identifier for the location
/// a string
id: []const u8,
/// Enum describing kind of location
kind: ActivityLocationKind,
/// The id of the Channel
channel_id: Snowflake,
/// The id of the Guild
guild_id: ?Snowflake,
};
/// https://discord.com/developers/docs/resources/application#get-application-activity-instance-activity-location-object
pub const ActivityLocation = struct {
/// The unique identifier for the location
/// a string
id: []const u8,
/// Enum describing kind of location
kind: ActivityLocationKind,
/// The id of the Channel
channel_id: Snowflake,
/// The id of the Guild
guild_id: ?Snowflake = null,
};
/// https://discord.com/developers/docs/resources/application#get-application-activity-instance-activity-location-kind-enum
pub const ActivityLocationKind = union(enum) {
/// The Location is a Guild Channel
gc,
/// The Location is a Private Channel, such as a DM or GDM
pc,
};
/// https://discord.com/developers/docs/resources/application#get-application-activity-instance-activity-location-kind-enum
pub const ActivityLocationKind = union(enum) {
/// The Location is a Guild Channel
gc,
/// The Location is a Private Channel, such as a DM or GDM
pc,
};
/// https://discord.com/developers/docs/topics/gateway#client-status-object
pub const ClientStatus = struct {
/// The user's status set for an active desktop (Windows, Linux, Mac) application session
desktop: ?[]const u8,
/// The user's status set for an active mobile (iOS, Android) application session
mobile: ?[]const u8,
/// The user's status set for an active web (browser, bot account) application session
web: ?[]const u8,
};
/// https://discord.com/developers/docs/topics/gateway#client-status-object
pub const ClientStatus = struct {
/// The user's status set for an active desktop (Windows, Linux, Mac) application session
desktop: ?[]const u8 = null,
/// The user's status set for an active mobile (iOS, Android) application session
mobile: ?[]const u8 = null,
/// The user's status set for an active web (browser, bot account) application session
web: ?[]const u8 = null,
};
/// https://discord.com/developers/docs/topics/gateway#activity-object-activity-timestamps
pub const ActivityTimestamps = struct {
/// Unix time (in milliseconds) of when the activity started
start: ?isize,
/// Unix time (in milliseconds) of when the activity ends
end: ?isize,
};
/// https://discord.com/developers/docs/topics/gateway#activity-object-activity-timestamps
pub const ActivityTimestamps = struct {
/// Unix time (in milliseconds) of when the activity started
start: ?isize = null,
/// Unix time (in milliseconds) of when the activity ends
end: ?isize = null,
};
/// https://discord.com/developers/docs/topics/gateway#activity-object-activity-emoji
pub const ActivityEmoji = struct {
/// The name of the emoji
name: []const u8,
/// Whether this emoji is animated
animated: ?bool,
/// The id of the emoji
/// a string
id: ?[]const u8,
};
/// https://discord.com/developers/docs/topics/gateway#activity-object-activity-emoji
pub const ActivityEmoji = struct {
/// The name of the emoji
name: []const u8,
/// Whether this emoji is animated
animated: ?bool = null,
/// The id of the emoji
/// a string
id: ?[]const u8 = null,
};
/// https://discord.com/developers/docs/topics/gateway#activity-object-activity-party
pub const ActivityParty = struct {
/// Used to show the party's current and maximum size
size: ?[2]i64,
/// The id of the party
id: ?Snowflake,
};
/// https://discord.com/developers/docs/topics/gateway#activity-object-activity-party
pub const ActivityParty = struct {
/// Used to show the party's current and maximum size
size: ?[2]i64 = null,
/// The id of the party
id: ?Snowflake = null,
};
/// https://discord.com/developers/docs/topics/gateway#activity-object-activity-assets
pub const ActivityAssets = struct {
/// Text displayed when hovering over the large image of the activity
large_text: ?[]const u8,
/// Text displayed when hovering over the small image of the activity
small_text: ?[]const u8,
/// The id for a large asset of the activity, usually a snowflake
large_image: ?[]const u8,
/// The id for a small asset of the activity, usually a snowflake
small_image: ?[]const u8,
};
/// https://discord.com/developers/docs/topics/gateway#activity-object-activity-assets
pub const ActivityAssets = struct {
/// Text displayed when hovering over the large image of the activity
large_text: ?[]const u8 = null,
/// Text displayed when hovering over the small image of the activity
small_text: ?[]const u8 = null,
/// The id for a large asset of the activity, usually a snowflake
large_image: ?[]const u8 = null,
/// The id for a small asset of the activity, usually a snowflake
small_image: ?[]const u8 = null,
};
/// https://discord.com/developers/docs/topics/gateway#activity-object-activity-secrets
pub const ActivitySecrets = struct {
/// The secret for joining a party
join: ?[]const u8,
/// The secret for spectating a game
spectate: ?[]const u8,
/// The secret for a specific instanced match
match: ?[]const u8,
/// https://discord.com/developers/docs/topics/gateway#activity-object-activity-secrets
pub const ActivitySecrets = struct {
/// The secret for joining a party
join: ?[]const u8 = null,
/// The secret for spectating a game
spectate: ?[]const u8 = null,
/// The secret for a specific instanced match
match: ?[]const u8 = null,
};
/// https://discord.com/developers/docs/topics/gateway#activity-object-activity-buttons

View File

@ -1,387 +1,387 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const Snowflake = @import("snowflake.zig").Snowflake;
const VerificationLevels = @import("shared.zig").VerificationLevels;
const DefaultMessageNotificationLevels = @import("shared.zig").DefaultMessageNotificationLevels;
const ExplicitContentFilterLevels = @import("shared.zig").ExplicitContentFilterLevels;
const GuildFeatures = @import("shared.zig").GuildFeatures;
const GuildNsfwLevel = @import("shared.zig").GuildNsfwLevel;
const Role = @import("role.zig").Role;
const MemberWithUser = @import("member.zig").MemberWithUser;
const Member = @import("member.zig").Member;
const Channel = @import("channel.zig").Channel;
const MfaLevels = @import("shared.zig").MfaLevels;
const SystemChannelFlags = @import("shared.zig").SystemChannelFlags;
const PremiumTiers = @import("shared.zig").PremiumTiers;
const Emoji = @import("emoji.zig").Emoji;
const Sticker = @import("sticker.zig").Sticker;
const Partial = @import("partial.zig").Partial;
const PresenceUpdate = @import("gateway.zig").PresenceUpdate;
const WelcomeScreen = @import("channel.zig").WelcomeScreen;
const StageInstance = @import("channel.zig").StageInstance;
const Snowflake = @import("snowflake.zig").Snowflake;
const VerificationLevels = @import("shared.zig").VerificationLevels;
const DefaultMessageNotificationLevels = @import("shared.zig").DefaultMessageNotificationLevels;
const ExplicitContentFilterLevels = @import("shared.zig").ExplicitContentFilterLevels;
const GuildFeatures = @import("shared.zig").GuildFeatures;
const GuildNsfwLevel = @import("shared.zig").GuildNsfwLevel;
const Role = @import("role.zig").Role;
const MemberWithUser = @import("member.zig").MemberWithUser;
const Member = @import("member.zig").Member;
const Channel = @import("channel.zig").Channel;
const MfaLevels = @import("shared.zig").MfaLevels;
const SystemChannelFlags = @import("shared.zig").SystemChannelFlags;
const PremiumTiers = @import("shared.zig").PremiumTiers;
const Emoji = @import("emoji.zig").Emoji;
const Sticker = @import("sticker.zig").Sticker;
const Partial = @import("partial.zig").Partial;
const PresenceUpdate = @import("gateway.zig").PresenceUpdate;
const WelcomeScreen = @import("channel.zig").WelcomeScreen;
const StageInstance = @import("channel.zig").StageInstance;
/// https://discord.com/developers/docs/resources/guild#guild-object
pub const Guild = struct {
/// Guild name (2-100 characters, excluding trailing and leading whitespace)
name: []const u8,
/// True if the user is the owner of the guild
owner: ?bool,
/// Afk timeout in seconds
afk_timeout: isize,
/// True if the server widget is enabled
widget_enabled: ?bool,
/// Verification level required for the guild
verification_level: VerificationLevels,
/// Default message notifications level
default_message_notifications: DefaultMessageNotificationLevels,
/// Explicit content filter level
explicit_content_filter: ExplicitContentFilterLevels,
/// Enabled guild features
features: []GuildFeatures,
/// Required MFA level for the guild
mfa_level: MfaLevels,
/// System channel flags
system_channel_flags: SystemChannelFlags,
/// True if this is considered a large guild
large: ?bool,
/// True if this guild is unavailable due to an outage
unavailable: ?bool,
/// Total isize of members in this guild
member_count: ?isize,
/// The maximum isize of presences for the guild (the default value, currently 25000, is in effect when null is returned)
max_presences: ?isize,
/// The maximum isize of members for the guild
max_members: ?isize,
/// The vanity url code for the guild
vanity_url_code: ?[]const u8,
/// The description of a guild
description: ?[]const u8,
/// Premium tier (Server Boost level)
premium_tier: PremiumTiers,
/// The isize of boosts this guild currently has
premium_subscription_count: ?isize,
/// The maximum amount of users in a video channel
max_video_channel_users: ?isize,
/// Maximum amount of users in a stage video channel
max_stage_video_channel_users: ?isize,
/// Approximate isize of members in this guild, returned from the GET /guilds/id endpoint when with_counts is true
approximate_member_count: ?isize,
/// Approximate isize of non-offline members in this guild, returned from the GET /guilds/id endpoint when with_counts is true
approximate_presence_count: ?isize,
/// Guild NSFW level
nsfw_level: GuildNsfwLevel,
/// Whether the guild has the boost progress bar enabled
premium_progress_bar_enabled: bool,
/// Guild id
id: Snowflake,
/// Icon hash
icon: ?[]const u8,
/// Icon hash, returned when in the template object
icon_hash: ?[]const u8,
/// Splash hash
splash: ?[]const u8,
/// Discovery splash hash; only present for guilds with the "DISCOVERABLE" feature
discovery_splash: ?[]const u8,
/// Id of the owner
owner_id: Snowflake,
/// Total permissions for the user in the guild (excludes overwrites and implicit permissions)
permissions: ?[]const u8,
/// Id of afk channel
afk_channel_id: ?Snowflake,
/// The channel id that the widget will generate an invite to, or null if set to no invite
widget_channel_id: ?Snowflake,
/// Roles in the guild
roles: []Role,
/// Custom guild emojis
emojis: []Emoji,
/// Application id of the guild creator if it is bot-created
application_id: ?Snowflake,
/// The id of the channel where guild notices such as welcome messages and boost events are posted
system_channel_id: ?Snowflake,
/// The id of the channel where community guilds can display rules and/or guidelines
rules_channel_id: ?Snowflake,
/// When this guild was joined at
joined_at: ?[]const u8,
// States of members currently in voice channels; lacks the guild_id key
// voice_states: ?[]Omit(VoiceState, .{"guildId"}),
/// Users in the guild
members: ?[]Member,
/// Channels in the guild
channels: ?[]Channel,
/// All active threads in the guild that the current user has permission to view
threads: ?[]Channel,
/// Presences of the members in the guild, will only include non-offline members if the size is greater than large threshold
presences: ?[]Partial(PresenceUpdate),
/// Banner hash
banner: ?[]const u8,
///The preferred locale of a Community guild; used in server discovery and notices from ; defaults to "en-US"
preferred_locale: []const u8,
///The id of the channel where admins and moderators of Community guilds receive notices from
public_updates_channel_id: ?Snowflake,
/// The welcome screen of a Community guild, shown to new members, returned in an Invite's guild object
welcome_screen: ?WelcomeScreen,
/// Stage instances in the guild
stage_instances: ?[]StageInstance,
/// Custom guild stickers
stickers: ?[]Sticker,
///The id of the channel where admins and moderators of Community guilds receive safety alerts from
safety_alerts_channel_id: ?Snowflake,
};
/// https://discord.com/developers/docs/resources/guild#guild-object
pub const Guild = struct {
/// Guild name (2-100 characters, excluding trailing and leading whitespace)
name: []const u8,
/// True if the user is the owner of the guild
owner: ?bool = null,
/// Afk timeout in seconds
afk_timeout: isize,
/// True if the server widget is enabled
widget_enabled: ?bool = null,
/// Verification level required for the guild
verification_level: VerificationLevels,
/// Default message notifications level
default_message_notifications: DefaultMessageNotificationLevels,
/// Explicit content filter level
explicit_content_filter: ExplicitContentFilterLevels,
/// Enabled guild features
features: []GuildFeatures,
/// Required MFA level for the guild
mfa_level: MfaLevels,
/// System channel flags
system_channel_flags: SystemChannelFlags,
/// True if this is considered a large guild
large: ?bool = null,
/// True if this guild is unavailable due to an outage
unavailable: ?bool = null,
/// Total isize of members in this guild
member_count: ?isize = null,
/// The maximum isize of presences for the guild (the default value, currently 25000, is in effect when null is returned)
max_presences: ?isize = null,
/// The maximum isize of members for the guild
max_members: ?isize = null,
/// The vanity url code for the guild
vanity_url_code: ?[]const u8 = null,
/// The description of a guild
description: ?[]const u8 = null,
/// Premium tier (Server Boost level)
premium_tier: PremiumTiers,
/// The isize of boosts this guild currently has
premium_subscription_count: ?isize = null,
/// The maximum amount of users in a video channel
max_video_channel_users: ?isize = null,
/// Maximum amount of users in a stage video channel
max_stage_video_channel_users: ?isize = null,
/// Approximate isize of members in this guild, returned from the GET /guilds/id endpoint when with_counts is true
approximate_member_count: ?isize = null,
/// Approximate isize of non-offline members in this guild, returned from the GET /guilds/id endpoint when with_counts is true
approximate_presence_count: ?isize = null,
/// Guild NSFW level
nsfw_level: GuildNsfwLevel,
/// Whether the guild has the boost progress bar enabled
premium_progress_bar_enabled: bool,
/// Guild id
id: Snowflake,
/// Icon hash
icon: ?[]const u8 = null,
/// Icon hash, returned when in the template object
icon_hash: ?[]const u8 = null,
/// Splash hash
splash: ?[]const u8 = null,
/// Discovery splash hash; only present for guilds with the "DISCOVERABLE" feature
discovery_splash: ?[]const u8 = null,
/// Id of the owner
owner_id: Snowflake,
/// Total permissions for the user in the guild (excludes overwrites and implicit permissions)
permissions: ?[]const u8 = null,
/// Id of afk channel
afk_channel_id: ?Snowflake = null,
/// The channel id that the widget will generate an invite to, or null if set to no invite
widget_channel_id: ?Snowflake = null,
/// Roles in the guild
roles: []Role,
/// Custom guild emojis
emojis: []Emoji,
/// Application id of the guild creator if it is bot-created
application_id: ?Snowflake = null,
/// The id of the channel where guild notices such as welcome messages and boost events are posted
system_channel_id: ?Snowflake = null,
/// The id of the channel where community guilds can display rules and/or guidelines
rules_channel_id: ?Snowflake = null,
/// When this guild was joined at
joined_at: ?[]const u8 = null,
// States of members currently in voice channels; lacks the guild_id key
// voice_states: ?[]Omit(VoiceState, .{"guildId"}) = null,
/// Users in the guild
members: ?[]Member = null,
/// Channels in the guild
channels: ?[]Channel = null,
/// All active threads in the guild that the current user has permission to view
threads: ?[]Channel = null,
/// Presences of the members in the guild, will only include non-offline members if the size is greater than large threshold
presences: ?[]Partial(PresenceUpdate) = null,
/// Banner hash
banner: ?[]const u8 = null,
///The preferred locale of a Community guild; used in server discovery and notices from ; defaults to "en-US"
preferred_locale: []const u8,
///The id of the channel where admins and moderators of Community guilds receive notices from
public_updates_channel_id: ?Snowflake = null,
/// The welcome screen of a Community guild, shown to new members, returned in an Invite's guild object
welcome_screen: ?WelcomeScreen = null,
/// Stage instances in the guild
stage_instances: ?[]StageInstance = null,
/// Custom guild stickers
stickers: ?[]Sticker = null,
///The id of the channel where admins and moderators of Community guilds receive safety alerts from
safety_alerts_channel_id: ?Snowflake = null,
};
/// https://discord.com/developers/docs/resources/voice#voice-state-object-voice-state-structure
pub const VoiceState = struct {
/// The session id for this voice state
session_id: []const u8,
/// The guild id this voice state is for
guild_id: ?Snowflake,
/// The channel id this user is connected to
channel_id: ?Snowflake,
/// The user id this voice state is for
user_id: Snowflake,
/// The guild member this voice state is for
member: ?MemberWithUser,
/// Whether this user is deafened by the server
deaf: bool,
/// Whether this user is muted by the server
mute: bool,
/// Whether this user is locally deafened
self_deaf: bool,
/// Whether this user is locally muted
self_mute: bool,
/// Whether this user is streaming using "Go Live"
self_stream: ?bool,
/// Whether this user's camera is enabled
self_video: bool,
/// Whether this user is muted by the current user
suppress: bool,
/// The time at which the user requested to speak
request_to_speak_timestamp: ?[]const u8,
};
/// https://discord.com/developers/docs/resources/voice#voice-state-object-voice-state-structure
pub const VoiceState = struct {
/// The session id for this voice state
session_id: []const u8,
/// The guild id this voice state is for
guild_id: ?Snowflake = null,
/// The channel id this user is connected to
channel_id: ?Snowflake = null,
/// The user id this voice state is for
user_id: Snowflake,
/// The guild member this voice state is for
member: ?MemberWithUser = null,
/// Whether this user is deafened by the server
deaf: bool,
/// Whether this user is muted by the server
mute: bool,
/// Whether this user is locally deafened
self_deaf: bool,
/// Whether this user is locally muted
self_mute: bool,
/// Whether this user is streaming using "Go Live"
self_stream: ?bool = null,
/// Whether this user's camera is enabled
self_video: bool,
/// Whether this user is muted by the current user
suppress: bool,
/// The time at which the user requested to speak
request_to_speak_timestamp: ?[]const u8 = null,
};
/// https://discord.com/developers/docs/resources/guild#get-guild-widget-example-get-guild-widget
pub const GuildWidget = struct {
id: Snowflake,
name: []const u8,
instant_invite: []const u8,
channels: []struct {
/// https://discord.com/developers/docs/resources/guild#get-guild-widget-example-get-guild-widget
pub const GuildWidget = struct {
id: Snowflake,
name: []const u8,
position: isize,
},
members: []struct {
instant_invite: []const u8,
channels: []struct {
id: Snowflake,
name: []const u8,
position: isize,
},
members: []struct {
id: Snowflake,
username: []const u8,
discriminator: []const u8,
avatar: ?[]const u8 = null,
status: []const u8,
avatar_url: []const u8,
},
presence_count: isize,
};
/// https://discord.com/developers/docs/resources/guild#guild-preview-object
pub const GuildPreview = struct {
/// Guild id
id: Snowflake,
username: []const u8,
discriminator: []const u8,
avatar: ?[]const u8,
status: []const u8,
avatar_url: []const u8,
},
presence_count: isize,
};
/// Guild name (2-100 characters)
name: []const u8,
/// Icon hash
icon: ?[]const u8 = null,
/// Splash hash
splash: ?[]const u8 = null,
/// Discovery splash hash
discovery_splash: ?[]const u8 = null,
/// Custom guild emojis
emojis: []Emoji,
/// Enabled guild features
features: []GuildFeatures,
/// Approximate isize of members in this guild
approximate_member_count: isize,
/// Approximate isize of online members in this guild
approximate_presence_count: isize,
/// The description for the guild, if the guild is discoverable
description: ?[]const u8 = null,
/// Custom guild stickers
stickers: []Sticker,
};
/// https://discord.com/developers/docs/resources/guild#guild-preview-object
pub const GuildPreview = struct {
/// Guild id
id: Snowflake,
/// Guild name (2-100 characters)
name: []const u8,
/// Icon hash
icon: ?[]const u8,
/// Splash hash
splash: ?[]const u8,
/// Discovery splash hash
discovery_splash: ?[]const u8,
/// Custom guild emojis
emojis: []Emoji,
/// Enabled guild features
features: []GuildFeatures,
/// Approximate isize of members in this guild
approximate_member_count: isize,
/// Approximate isize of online members in this guild
approximate_presence_count: isize,
/// The description for the guild, if the guild is discoverable
description: ?[]const u8,
/// Custom guild stickers
stickers: []Sticker,
};
/// https://discord.com/developers/docs/resources/guild#create-guild
pub const CreateGuild = struct {
/// Name of the guild (1-100 characters)
name: []const u8,
/// Base64 128x128 image for the guild icon
icon: ?[]const u8 = null,
/// Verification level
verification_level: ?VerificationLevels = null,
/// Default message notification level
default_message_notifications: DefaultMessageNotificationLevels,
/// Explicit content filter level
explicit_content_filter: ?ExplicitContentFilterLevels = null,
/// New guild roles (first role is the everyone role)
roles: ?[]Role = null,
/// New guild's channels
channels: ?[]Partial(Channel) = null,
/// Id for afk channel
afk_channel_id: ?[]const u8 = null,
/// Afk timeout in seconds
afk_timeout: ?isize = null,
/// The id of the channel where guild notices such as welcome messages and boost events are posted
system_channel_id: ?[]const u8 = null,
/// System channel flags
system_channel_flags: ?SystemChannelFlags = null,
};
/// https://discord.com/developers/docs/resources/guild#create-guild
pub const CreateGuild = struct {
/// Name of the guild (1-100 characters)
name: []const u8,
/// Base64 128x128 image for the guild icon
icon: ?[]const u8,
/// Verification level
verification_level: ?VerificationLevels,
/// Default message notification level
default_message_notifications: DefaultMessageNotificationLevels,
/// Explicit content filter level
explicit_content_filter: ?ExplicitContentFilterLevels,
/// New guild roles (first role is the everyone role)
roles: ?[]Role,
/// New guild's channels
channels: ?[]Partial(Channel),
/// Id for afk channel
afk_channel_id: ?[]const u8,
/// Afk timeout in seconds
afk_timeout: ?isize,
/// The id of the channel where guild notices such as welcome messages and boost events are posted
system_channel_id: ?[]const u8,
/// System channel flags
system_channel_flags: ?SystemChannelFlags,
};
/// https://discord.com/developers/docs/resources/guild#modify-guild
pub const ModifyGuild = struct {
/// Guild name
name: ?[]const u8 = null,
/// Verification level
verification_level: ?VerificationLevels = null,
/// Default message notification filter level
default_message_notifications: ?DefaultMessageNotificationLevels = null,
/// Explicit content filter level
explicit_content_filter: ?ExplicitContentFilterLevels = null,
/// Id for afk channel
afk_channel_id: ?Snowflake = null,
/// Afk timeout in seconds
afk_timeout: ?isize = null,
/// Base64 1024x1024 png/jpeg/gif image for the guild icon (can be animated gif when the server has the `ANIMATED_ICON` feature)
icon: ?[]const u8 = null,
/// User id to transfer guild ownership to (must be owner)
owner_id: ?Snowflake = null,
/// Base64 16:9 png/jpeg image for the guild splash (when the server has `INVITE_SPLASH` fe
splash: ?[]const u8 = null,
/// Base64 16:9 png/jpeg image for the guild discovery spash (when the server has the `DISCOVERABLE` feature)
discovery_splash: ?[]const u8 = null,
/// Base64 16:9 png/jpeg image for the guild banner (when the server has BANNER feature)
banner: ?[]const u8 = null,
/// The id of the channel where guild notices such as welcome messages and boost events are posted
system_channel_id: ?Snowflake = null,
/// System channel flags
system_channel_flags: ?SystemChannelFlags = null,
/// The id of the channel where Community guilds display rules and/or guidelines
rules_channel_id: ?Snowflake = null,
/// The id of the channel where admins and moderators of Community guilds receive notices from Discord
public_updates_channel_id: ?Snowflake = null,
/// The preferred locale of a Community guild used in server discovery and notices from Discord; defaults to "en-US"
preferred_locale: ?[]const u8 = null,
/// Enabled guild features
features: ?[]GuildFeatures = null,
/// Whether the guild's boost progress bar should be enabled
premium_progress_bar_enabled: ?bool = null,
};
/// https://discord.com/developers/docs/resources/guild#modify-guild
pub const ModifyGuild = struct {
/// Guild name
name: ?[]const u8,
/// Verification level
verification_level: ?VerificationLevels,
/// Default message notification filter level
default_message_notifications: ?DefaultMessageNotificationLevels,
/// Explicit content filter level
explicit_content_filter: ?ExplicitContentFilterLevels,
/// Id for afk channel
afk_channel_id: ?Snowflake,
/// Afk timeout in seconds
afk_timeout: ?isize,
/// Base64 1024x1024 png/jpeg/gif image for the guild icon (can be animated gif when the server has the `ANIMATED_ICON` feature)
icon: ?[]const u8,
/// User id to transfer guild ownership to (must be owner)
owner_id: ?Snowflake,
/// Base64 16:9 png/jpeg image for the guild splash (when the server has `INVITE_SPLASH` fe
splash: ?[]const u8,
/// Base64 16:9 png/jpeg image for the guild discovery spash (when the server has the `DISCOVERABLE` feature)
discovery_splash: ?[]const u8,
/// Base64 16:9 png/jpeg image for the guild banner (when the server has BANNER feature)
banner: ?[]const u8,
/// The id of the channel where guild notices such as welcome messages and boost events are posted
system_channel_id: ?Snowflake,
/// System channel flags
system_channel_flags: ?SystemChannelFlags,
/// The id of the channel where Community guilds display rules and/or guidelines
rules_channel_id: ?Snowflake,
/// The id of the channel where admins and moderators of Community guilds receive notices from Discord
public_updates_channel_id: ?Snowflake,
/// The preferred locale of a Community guild used in server discovery and notices from Discord; defaults to "en-US"
preferred_locale: ?[]const u8,
/// Enabled guild features
features: ?[]GuildFeatures,
/// Whether the guild's boost progress bar should be enabled
premium_progress_bar_enabled: ?bool,
};
pub const CreateGuildBan = struct {
/// list of user ids to ban (max 200)
user_ids: []Snowflake,
/// number of seconds to delete messages for, between 0 and 604800 (7 days)
delete_message_seconds: ?isize = null,
};
pub const CreateGuildBan = struct {
/// list of user ids to ban (max 200)
user_ids: []Snowflake,
/// number of seconds to delete messages for, between 0 and 604800 (7 days)
delete_message_seconds: ?isize,
};
/// https://discord.com/developers/docs/resources/guild#get-guild-prune-count
pub const GetGuildPruneCountQuery = struct {
/// Number of days to count prune for (1 or more), default: 7
days: ?isize = null,
/// Role(s) to include, default: none
include_roles: ?[]Snowflake = null,
};
/// https://discord.com/developers/docs/resources/guild#get-guild-prune-count
pub const GetGuildPruneCountQuery = struct {
/// Number of days to count prune for (1 or more), default: 7
days: ?isize,
/// Role(s) to include, default: none
include_roles: ?[]Snowflake,
};
/// https://discord.com/developers/docs/resources/guild#begin-guild-prune
pub const BeginGuildPrune = struct {
/// Number of days to prune (1 or more), default: 7
days: ?isize = null,
/// Whether 'pruned' is returned, discouraged for large guilds, default: true
compute_prune_count: ?bool = null,
/// Role(s) ro include, default: none
include_roles: ?[]Snowflake = null,
};
/// https://discord.com/developers/docs/resources/guild#begin-guild-prune
pub const BeginGuildPrune = struct {
/// Number of days to prune (1 or more), default: 7
days: ?isize,
/// Whether 'pruned' is returned, discouraged for large guilds, default: true
compute_prune_count: ?bool,
/// Role(s) ro include, default: none
include_roles: ?[]Snowflake,
};
/// https://discord.com/developers/docs/resources/guild#modify-guild-onboarding-json-params
pub const ModifyGuildOnboarding = struct {
/// Prompts shown during onboarding and in customize community
prompts: []GuildOnboardingPrompt,
/// Channel IDs that members get opted into automatically
defaultChannelIds: []Snowflake,
/// Whether onboarding is enabled in the guild
enabled: bool,
/// Current mode of onboarding
mode: GuildOnboardingMode,
};
/// https://discord.com/developers/docs/resources/guild#modify-guild-onboarding-json-params
pub const ModifyGuildOnboarding = struct {
/// Prompts shown during onboarding and in customize community
prompts: []GuildOnboardingPrompt,
/// Channel IDs that members get opted into automatically
defaultChannelIds: []Snowflake,
/// Whether onboarding is enabled in the guild
enabled: bool,
/// Current mode of onboarding
mode: GuildOnboardingMode,
};
/// https://discord.com/developers/docs/resources/guild#guild-onboarding-object-guild-onboarding-structure
pub const GuildOnboarding = struct {
/// ID of the guild this onboarding is part of
guild_id: []const u8,
/// Prompts shown during onboarding and in customize community
prompts: []GuildOnboardingPrompt,
/// Channel IDs that members get opted into automatically
default_channel_ids: [][]const u8,
/// Whether onboarding is enabled in the guild
enabled: bool,
/// Current mode of onboarding
mode: GuildOnboardingMode,
};
/// https://discord.com/developers/docs/resources/guild#guild-onboarding-object-guild-onboarding-structure
pub const GuildOnboarding = struct {
/// ID of the guild this onboarding is part of
guild_id: []const u8,
/// Prompts shown during onboarding and in customize community
prompts: []GuildOnboardingPrompt,
/// Channel IDs that members get opted into automatically
default_channel_ids: [][]const u8,
/// Whether onboarding is enabled in the guild
enabled: bool,
/// Current mode of onboarding
mode: GuildOnboardingMode,
};
/// https://discord.com/developers/docs/resources/guild#guild-onboarding-object-onboarding-prompt-structure
pub const GuildOnboardingPrompt = struct {
/// ID of the prompt
id: Snowflake,
/// Type of prompt
type: GuildOnboardingPromptType,
/// Options available within the prompt
options: []GuildOnboardingPromptOption,
/// Title of the prompt
title: []const u8,
/// Indicates whether users are limited to selecting one option for the prompt
single_select: bool,
/// Indicates whether the prompt is required before a user completes the onboarding flow
required: bool,
/// Indicates whether the prompt is present in the onboarding flow. If `false`, the prompt will only appear in the Channels & Roles tab
in_onboarding: bool,
};
/// https://discord.com/developers/docs/resources/guild#guild-onboarding-object-onboarding-prompt-structure
pub const GuildOnboardingPrompt = struct {
/// ID of the prompt
id: Snowflake,
/// Type of prompt
type: GuildOnboardingPromptType,
/// Options available within the prompt
options: []GuildOnboardingPromptOption,
/// Title of the prompt
title: []const u8,
/// Indicates whether users are limited to selecting one option for the prompt
single_select: bool,
/// Indicates whether the prompt is required before a user completes the onboarding flow
required: bool,
/// Indicates whether the prompt is present in the onboarding flow. If `false`, the prompt will only appear in the Channels & Roles tab
in_onboarding: bool,
};
/// https://discord.com/developers/docs/resources/guild#guild-onboarding-object-prompt-option-structure
pub const GuildOnboardingPromptOption = struct {
/// ID of the prompt option
id: Snowflake,
/// IDs for channels a member is added to when the option is selected
channel_ids: [][]const u8,
/// IDs for roles assigned to a member when the option is selected
role_ids: []Snowflake,
/// Emoji of the option
/// @remarks
/// When creating or updating a prompt option, the `emoji_id`, `emoji_name`, and `emoji_animated` fields must be used instead of the emoji object.
emoji: ?Emoji,
/// Emoji ID of the option
/// @remarks
/// When creating or updating a prompt option, the `emoji_id`, `emoji_name`, and `emoji_animated` fields must be used instead of the emoji object.
emoji_id: ?[]const u8,
/// Emoji name of the option
/// @remarks
/// When creating or updating a prompt option, the `emoji_id`, `emoji_name`, and `emoji_animated` fields must be used instead of the emoji object.
emoji_name: ?[]const u8,
/// Whether the emoji is animated
/// @remarks
/// When creating or updating a prompt option, the `emoji_id`, `emoji_name`, and `emoji_animated` fields must be used instead of the emoji object.
emoji_animated: bool,
/// Title of the option
title: []const u8,
/// Description of the option
description: ?[]const u8,
/// https://discord.com/developers/docs/resources/guild#guild-onboarding-object-prompt-option-structure
pub const GuildOnboardingPromptOption = struct {
/// ID of the prompt option
id: Snowflake,
/// IDs for channels a member is added to when the option is selected
channel_ids: [][]const u8,
/// IDs for roles assigned to a member when the option is selected
role_ids: []Snowflake,
/// Emoji of the option
/// @remarks
/// When creating or updating a prompt option, the `emoji_id`, `emoji_name`, and `emoji_animated` fields must be used instead of the emoji object.
emoji: ?Emoji = null,
/// Emoji ID of the option
/// @remarks
/// When creating or updating a prompt option, the `emoji_id`, `emoji_name`, and `emoji_animated` fields must be used instead of the emoji object.
emoji_id: ?[]const u8 = null,
/// Emoji name of the option
/// @remarks
/// When creating or updating a prompt option, the `emoji_id`, `emoji_name`, and `emoji_animated` fields must be used instead of the emoji object.
emoji_name: ?[]const u8 = null,
/// Whether the emoji is animated
/// @remarks
/// When creating or updating a prompt option, the `emoji_id`, `emoji_name`, and `emoji_animated` fields must be used instead of the emoji object.
emoji_animated: bool,
/// Title of the option
title: []const u8,
/// Description of the option
description: ?[]const u8 = null,
};
/// https://discord.com/developers/docs/resources/guild#guild-onboarding-object-prompt-types

View File

@ -1,136 +1,136 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const Snowflake = @import("snowflake.zig").Snowflake;
const IntegrationExpireBehaviors = @import("shared.zig").IntegrationExpireBehaviors;
const OAuth2Scope = @import("shared.zig").OAuth2Scope;
const User = @import("user.zig").User;
const Snowflake = @import("snowflake.zig").Snowflake;
const IntegrationExpireBehaviors = @import("shared.zig").IntegrationExpireBehaviors;
const OAuth2Scope = @import("shared.zig").OAuth2Scope;
const User = @import("user.zig").User;
/// https://discord.com/developers/docs/resources/guild#integration-object-integration-structure
pub const Integration = struct {
/// Integration Id
id: Snowflake,
/// Integration name
name: []const u8,
/// Integration type (twitch, youtube, discord, or guild_subscription).
type: union(enum) {
twitch,
youtube,
discord,
},
/// Is this integration enabled
enabled: ?bool,
/// Is this integration syncing
syncing: ?bool,
/// Role Id that this integration uses for "subscribers"
role_id: ?Snowflake,
/// Whether emoticons should be synced for this integration (twitch only currently)
enable_emoticons: ?bool,
/// The behavior of expiring subscribers
expire_behavior: ?IntegrationExpireBehaviors,
/// The grace period (in days) before expiring subscribers
expire_grace_period: ?isize,
/// When this integration was last synced
synced_at: ?[]const u8,
/// How many subscribers this integration has
subscriber_count: ?isize,
/// Has this integration been revoked
revoked: ?bool,
/// User for this integration
user: ?User,
/// Integration account information
account: IntegrationAccount,
/// The bot/OAuth2 application for discord integrations
application: ?IntegrationApplication,
/// the scopes the application has been authorized for
scopes: []OAuth2Scope,
};
/// https://discord.com/developers/docs/resources/guild#integration-object-integration-structure
pub const Integration = struct {
/// Integration Id
id: Snowflake,
/// Integration name
name: []const u8,
/// Integration type (twitch, youtube, discord, or guild_subscription).
type: union(enum) {
twitch,
youtube,
discord,
},
/// Is this integration enabled
enabled: ?bool = null,
/// Is this integration syncing
syncing: ?bool = null,
/// Role Id that this integration uses for "subscribers"
role_id: ?Snowflake = null,
/// Whether emoticons should be synced for this integration (twitch only currently)
enable_emoticons: ?bool = null,
/// The behavior of expiring subscribers
expire_behavior: ?IntegrationExpireBehaviors = null,
/// The grace period (in days) before expiring subscribers
expire_grace_period: ?isize = null,
/// When this integration was last synced
synced_at: ?[]const u8 = null,
/// How many subscribers this integration has
subscriber_count: ?isize = null,
/// Has this integration been revoked
revoked: ?bool = null,
/// User for this integration
user: ?User = null,
/// Integration account information
account: IntegrationAccount,
/// The bot/OAuth2 application for discord integrations
application: ?IntegrationApplication = null,
/// the scopes the application has been authorized for
scopes: []OAuth2Scope,
};
/// https://discord.com/developers/docs/resources/guild#integration-account-object-integration-account-structure
pub const IntegrationAccount = struct {
/// Id of the account
id: Snowflake,
/// Name of the account
name: []const u8,
};
/// https://discord.com/developers/docs/resources/guild#integration-account-object-integration-account-structure
pub const IntegrationAccount = struct {
/// Id of the account
id: Snowflake,
/// Name of the account
name: []const u8,
};
/// https://discord.com/developers/docs/resources/guild#integration-application-object-integration-application-structure
pub const IntegrationApplication = struct {
/// The id of the app
id: Snowflake,
/// The name of the app
name: []const u8,
/// the icon hash of the app
icon: ?[]const u8,
/// The description of the app
description: []const u8,
/// The bot associated with this application
bot: ?User,
};
/// https://discord.com/developers/docs/resources/guild#integration-application-object-integration-application-structure
pub const IntegrationApplication = struct {
/// The id of the app
id: Snowflake,
/// The name of the app
name: []const u8,
/// the icon hash of the app
icon: ?[]const u8 = null,
/// The description of the app
description: []const u8,
/// The bot associated with this application
bot: ?User = null,
};
/// https://github.com/discord/discord-api-docs/blob/master/docs/topics/Gateway.md#integration-create-event-additional-fields
pub const IntegrationCreateUpdate = struct {
/// Integration Id
id: Snowflake,
/// Integration name
name: []const u8,
/// Integration type (twitch, youtube, discord, or guild_subscription).
type: union(enum) {
twitch,
youtube,
discord,
},
/// Is this integration enabled
enabled: ?bool,
/// Is this integration syncing
syncing: ?bool,
/// Role Id that this integration uses for "subscribers"
role_id: ?Snowflake,
/// Whether emoticons should be synced for this integration (twitch only currently)
enable_emoticons: ?bool,
/// The behavior of expiring subscribers
expire_behavior: ?IntegrationExpireBehaviors,
/// The grace period (in days) before expiring subscribers
expire_grace_period: ?isize,
/// When this integration was last synced
synced_at: ?[]const u8,
/// How many subscribers this integration has
subscriber_count: ?isize,
/// Has this integration been revoked
revoked: ?bool,
/// User for this integration
user: ?User,
/// Integration account information
account: IntegrationAccount,
/// The bot/OAuth2 application for discord integrations
application: ?IntegrationApplication,
/// the scopes the application has been authorized for
scopes: []OAuth2Scope,
/// Id of the guild
guild_id: Snowflake,
};
/// https://github.com/discord/discord-api-docs/blob/master/docs/topics/Gateway.md#integration-create-event-additional-fields
pub const IntegrationCreateUpdate = struct {
/// Integration Id
id: Snowflake,
/// Integration name
name: []const u8,
/// Integration type (twitch, youtube, discord, or guild_subscription).
type: union(enum) {
twitch,
youtube,
discord,
},
/// Is this integration enabled
enabled: ?bool = null,
/// Is this integration syncing
syncing: ?bool = null,
/// Role Id that this integration uses for "subscribers"
role_id: ?Snowflake = null,
/// Whether emoticons should be synced for this integration (twitch only currently)
enable_emoticons: ?bool = null,
/// The behavior of expiring subscribers
expire_behavior: ?IntegrationExpireBehaviors = null,
/// The grace period (in days) before expiring subscribers
expire_grace_period: ?isize = null,
/// When this integration was last synced
synced_at: ?[]const u8 = null,
/// How many subscribers this integration has
subscriber_count: ?isize = null,
/// Has this integration been revoked
revoked: ?bool = null,
/// User for this integration
user: ?User = null,
/// Integration account information
account: IntegrationAccount,
/// The bot/OAuth2 application for discord integrations
application: ?IntegrationApplication = null,
/// the scopes the application has been authorized for
scopes: []OAuth2Scope,
/// Id of the guild
guild_id: Snowflake,
};
/// https://github.com/discord/discord-api-docs/blob/master/docs/topics/Gateway.md#integration-delete-event-fields
pub const IntegrationDelete = struct {
/// Integration id
id: Snowflake,
/// Id of the guild
guild_id: Snowflake,
/// Id of the bot/OAuth2 application for this discord integration
application_id: ?Snowflake,
/// https://github.com/discord/discord-api-docs/blob/master/docs/topics/Gateway.md#integration-delete-event-fields
pub const IntegrationDelete = struct {
/// Integration id
id: Snowflake,
/// Id of the guild
guild_id: Snowflake,
/// Id of the bot/OAuth2 application for this discord integration
application_id: ?Snowflake = null,
};
/// https://discord.com/developers/docs/topics/gateway#guild-integrations-update

View File

@ -1,216 +1,216 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const Snowflake = @import("snowflake.zig").Snowflake;
const InteractionTypes = @import("shared.zig").InteractionTypes;
const Guild = @import("guild.zig").Guild;
const Attachment = @import("attachment.zig").Attachment;
const Message = @import("message.zig").Message;
const Channel = @import("channel.zig").Channel;
const User = @import("user.zig").User;
const Role = @import("role.zig").Role;
const AvatarDecorationData = @import("user.zig").AvatarDecorationData;
const Partial = @import("partial.zig").Partial;
const ApplicationCommandOptionTypes = @import("shared.zig").ApplicationCommandOptionTypes;
const MessageComponentTypes = @import("shared.zig").MessageComponentTypes;
const ChannelTypes = @import("shared.zig").ChannelTypes;
const MessageComponent = @import("message.zig").MessageComponent;
const ApplicationCommandTypes = @import("shared.zig").ApplicationCommandTypes;
const InteractionResponseTypes = @import("shared.zig").InteractionResponseTypes;
const InteractionContextType = @import("command.zig").InteractionContextType;
const Entitlement = @import("monetization.zig").Entitlement;
const Record = @import("../json-helper.zig").Record;
const Snowflake = @import("snowflake.zig").Snowflake;
const InteractionTypes = @import("shared.zig").InteractionTypes;
const Guild = @import("guild.zig").Guild;
const Attachment = @import("attachment.zig").Attachment;
const Message = @import("message.zig").Message;
const Channel = @import("channel.zig").Channel;
const User = @import("user.zig").User;
const Role = @import("role.zig").Role;
const AvatarDecorationData = @import("user.zig").AvatarDecorationData;
const Partial = @import("partial.zig").Partial;
const ApplicationCommandOptionTypes = @import("shared.zig").ApplicationCommandOptionTypes;
const MessageComponentTypes = @import("shared.zig").MessageComponentTypes;
const ChannelTypes = @import("shared.zig").ChannelTypes;
const MessageComponent = @import("message.zig").MessageComponent;
const ApplicationCommandTypes = @import("shared.zig").ApplicationCommandTypes;
const InteractionResponseTypes = @import("shared.zig").InteractionResponseTypes;
const InteractionContextType = @import("command.zig").InteractionContextType;
const Entitlement = @import("monetization.zig").Entitlement;
const Record = @import("../json-helper.zig").Record;
pub const Interaction = struct {
/// Id of the interaction
id: Snowflake,
/// Id of the application this interaction is for
application_id: Snowflake,
/// The type of interaction
type: InteractionTypes,
/// Guild that the interaction was sent from
guild: ?Partial(Guild),
/// The guild it was sent from
guild_id: ?Snowflake,
/// The channel it was sent from
channel: Partial(Channel),
///
/// The ID of channel it was sent from
///
/// @remarks
/// It is recommended that you begin using this channel field to identify the source channel of the interaction as they may deprecate the existing channel_id field in the future.
///
channel_id: ?Snowflake,
/// Guild member data for the invoking user, including permissions
member: ?InteractionMember,
/// User object for the invoking user, if invoked in a DM
user: ?User,
/// A continuation token for responding to the interaction
token: []const u8,
/// Read-only property, always `1`
version: 1,
/// For the message the button was attached to
message: ?Message,
/// the command data payload
data: ?InteractionData,
/// The selected language of the invoking user
locale: ?[]const u8,
/// The guild's preferred locale, if invoked in a guild
guild_locale: ?[]const u8,
/// The computed permissions for a bot or app in the context of a specific interaction (including channel overwrites)
app_permissions: []const u8,
/// For monetized apps, any entitlements for the invoking user, representing access to premium SKUs
entitlements: []Entitlement,
// Mapping of installation contexts that the interaction was authorized for to related user or guild IDs.
// authorizing_integration_owners: Partial(AutoArrayHashMap(ApplicationIntegrationType, []const u8)),
/// Context where the interaction was triggered from
context: ?InteractionContextType,
};
/// https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-callback-interaction-callback-response-object
pub const InteractionCallbackResponse = struct {
/// The interaction object associated with the interaction response
interaction: InteractionCallback,
/// The resource that was created by the interaction response.
resource: ?InteractionResource,
};
/// https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-callback-interaction-callback-object
pub const InteractionCallback = struct {
/// ID of the interaction
id: Snowflake,
/// Interaction type
type: InteractionTypes,
/// Instance ID of the Activity if one was launched or joined
activity_instance_id: ?Snowflake,
/// ID of the message that was created by the interaction
response_message_id: ?Snowflake,
/// Whether or not the message is in a loading state
response_message_loading: ?bool,
/// Whether or not the response message was ephemeral
response_message_ephemeral: ?bool,
};
/// https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-callback-interaction-callback-resource-object
pub const InteractionResource = struct {
type: InteractionResponseTypes,
///
/// Represents the Activity launched by this interaction.
///
/// @remarks
/// Only present if type is `LAUNCH_ACTIVITY`.
///
activity_instance: ?ActivityInstanceResource,
///
/// Message created by the interaction.
///
/// @remarks
/// Only present if type is either `CHANNEL_MESSAGE_WITH_SOURCE` or `UPDATE_MESSAGE`.
///
message: ?Message,
};
/// https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-callback-interaction-callback-activity-instance-resource
pub const ActivityInstanceResource = struct {
/// Instance ID of the Activity if one was launched or joined.
id: Snowflake,
};
/// https://discord.com/developers/docs/resources/guild#guild-member-object
pub const InteractionMember = struct {
/// Whether the user is deafened in voice channels
deaf: ?bool,
/// Whether the user is muted in voice channels
mute: ?bool,
/// Whether the user has not yet passed the guild's Membership Screening requirements
pending: ?bool,
/// This users guild nickname
nick: ?[]const u8,
/// The members custom avatar for this server.
avatar: ?[]const u8,
/// Array of role object ids
roles: [][]const u8,
/// When the user joined the guild
joined_at: []const u8,
/// When the user started boosting the guild
premium_since: ?[]const u8,
/// when the user's timeout will expire and the user will be able to communicate in the guild again (set null to remove timeout), null or a time in the past if the user is not timed out
communication_disabled_until: ?[]const u8,
/// Guild member flags
flags: isize,
/// data for the member's guild avatar decoration
avatar_decoration_data: ?AvatarDecorationData,
/// The user object for this member
user: User,
/// Total permissions of the member in the channel, including overwrites, returned when in the interaction object
permissions: []const u8,
};
pub const InteractionData = struct {
/// The type of component
component_type: ?MessageComponentTypes,
/// The custom id provided for this component.
custom_id: ?Snowflake,
/// The components if its a Modal Submit interaction.
components: ?[]MessageComponent,
/// The values chosen by the user.
values: ?[][]const u8,
/// The Id of the invoked command
id: Snowflake,
/// The name of the invoked command
name: []const u8,
/// the type of the invoked command
type: ApplicationCommandTypes,
/// Converted users + roles + channels + attachments
resolved: ?struct {
/// The Ids and Message objects
messages: ?Record(Message),
/// The Ids and User objects
users: ?Record(User),
// The Ids and partial Member objects
//members: ?Record(Omit(InteractionMember, .{ "user", "deaf", "mute" })),
/// The Ids and Role objects
roles: ?Record(Role),
/// The Ids and partial Channel objects
channels: ?Record(struct {
id: Snowflake,
type: ChannelTypes,
name: ?[]const u8,
permissions: ?[]const u8,
}),
/// The ids and attachment objects
attachments: Record(Attachment),
},
/// The params + values from the user
options: ?[]InteractionDataOption,
/// The target id if this is a context menu command.
target_id: ?Snowflake,
/// the id of the guild the command is registered to
guild_id: ?Snowflake,
};
pub const InteractionDataOption = struct {
/// Name of the parameter
name: []const u8,
/// Value of application command option type
type: ApplicationCommandOptionTypes,
/// Value of the option resulting from user input
value: ?union { string: []const u8, bool: bool, integer: isize },
/// Present if this option is a group or subcommand
options: ?[]InteractionDataOption,
/// `true` if this option is the currently focused option for autocomplete
focused: ?bool,
pub const Interaction = struct {
/// Id of the interaction
id: Snowflake,
/// Id of the application this interaction is for
application_id: Snowflake,
/// The type of interaction
type: InteractionTypes,
/// Guild that the interaction was sent from
guild: ?Partial(Guild) = null,
/// The guild it was sent from
guild_id: ?Snowflake = null,
/// The channel it was sent from
channel: Partial(Channel),
///
/// The ID of channel it was sent from
///
/// @remarks
/// It is recommended that you begin using this channel field to identify the source channel of the interaction as they may deprecate the existing channel_id field in the future.
///
channel_id: ?Snowflake = null,
/// Guild member data for the invoking user, including permissions
member: ?InteractionMember = null,
/// User object for the invoking user, if invoked in a DM
user: ?User = null,
/// A continuation token for responding to the interaction
token: []const u8,
/// Read-only property, always `1`
version: 1,
/// For the message the button was attached to
message: ?Message = null,
/// the command data payload
data: ?InteractionData = null,
/// The selected language of the invoking user
locale: ?[]const u8 = null,
/// The guild's preferred locale, if invoked in a guild
guild_locale: ?[]const u8 = null,
/// The computed permissions for a bot or app in the context of a specific interaction (including channel overwrites)
app_permissions: []const u8,
/// For monetized apps, any entitlements for the invoking user, representing access to premium SKUs
entitlements: []Entitlement,
// Mapping of installation contexts that the interaction was authorized for to related user or guild IDs.
// authorizing_integration_owners: Partial(AutoArrayHashMap(ApplicationIntegrationType, []const u8)),
/// Context where the interaction was triggered from
context: ?InteractionContextType = null,
};
/// https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-callback-interaction-callback-response-object
pub const InteractionCallbackResponse = struct {
/// The interaction object associated with the interaction response
interaction: InteractionCallback,
/// The resource that was created by the interaction response.
resource: ?InteractionResource = null,
};
/// https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-callback-interaction-callback-object
pub const InteractionCallback = struct {
/// ID of the interaction
id: Snowflake,
/// Interaction type
type: InteractionTypes,
/// Instance ID of the Activity if one was launched or joined
activity_instance_id: ?Snowflake = null,
/// ID of the message that was created by the interaction
response_message_id: ?Snowflake = null,
/// Whether or not the message is in a loading state
response_message_loading: ?bool = null,
/// Whether or not the response message was ephemeral
response_message_ephemeral: ?bool = null,
};
/// https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-callback-interaction-callback-resource-object
pub const InteractionResource = struct {
type: InteractionResponseTypes,
///
/// Represents the Activity launched by this interaction.
///
/// @remarks
/// Only present if type is `LAUNCH_ACTIVITY`.
///
activity_instance: ?ActivityInstanceResource = null,
///
/// Message created by the interaction.
///
/// @remarks
/// Only present if type is either `CHANNEL_MESSAGE_WITH_SOURCE` or `UPDATE_MESSAGE`.
///
message: ?Message = null,
};
/// https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-callback-interaction-callback-activity-instance-resource
pub const ActivityInstanceResource = struct {
/// Instance ID of the Activity if one was launched or joined.
id: Snowflake,
};
/// https://discord.com/developers/docs/resources/guild#guild-member-object
pub const InteractionMember = struct {
/// Whether the user is deafened in voice channels
deaf: ?bool = null,
/// Whether the user is muted in voice channels
mute: ?bool = null,
/// Whether the user has not yet passed the guild's Membership Screening requirements
pending: ?bool = null,
/// This users guild nickname
nick: ?[]const u8 = null,
/// The members custom avatar for this server.
avatar: ?[]const u8 = null,
/// Array of role object ids
roles: [][]const u8,
/// When the user joined the guild
joined_at: []const u8,
/// When the user started boosting the guild
premium_since: ?[]const u8 = null,
/// when the user's timeout will expire and the user will be able to communicate in the guild again (set null to remove timeout), null or a time in the past if the user is not timed out
communication_disabled_until: ?[]const u8 = null,
/// Guild member flags
flags: isize,
/// data for the member's guild avatar decoration
avatar_decoration_data: ?AvatarDecorationData = null,
/// The user object for this member
user: User,
/// Total permissions of the member in the channel, including overwrites, returned when in the interaction object
permissions: []const u8,
};
pub const InteractionData = struct {
/// The type of component
component_type: ?MessageComponentTypes = null,
/// The custom id provided for this component.
custom_id: ?Snowflake = null,
/// The components if its a Modal Submit interaction.
components: ?[]MessageComponent = null,
/// The values chosen by the user.
values: ?[][]const u8 = null,
/// The Id of the invoked command
id: Snowflake,
/// The name of the invoked command
name: []const u8,
/// the type of the invoked command
type: ApplicationCommandTypes,
/// Converted users + roles + channels + attachments
resolved: ?struct {
/// The Ids and Message objects
messages: ?Record(Message) = null,
/// The Ids and User objects
users: ?Record(User) = null,
// The Ids and partial Member objects
// members: ?Record(Omit(InteractionMember, .{ "user", "deaf", "mute" })) = null,
/// The Ids and Role objects
roles: ?Record(Role) = null,
/// The Ids and partial Channel objects
channels: ?Record(struct {
id: Snowflake,
type: ChannelTypes,
name: ?[]const u8 = null,
permissions: ?[]const u8 = null,
}),
/// The ids and attachment objects
attachments: Record(Attachment),
},
/// The params + values from the user
options: ?[]InteractionDataOption = null,
/// The target id if this is a context menu command.
target_id: ?Snowflake = null,
/// the id of the guild the command is registered to
guild_id: ?Snowflake = null,
};
pub const InteractionDataOption = struct {
/// Name of the parameter
name: []const u8,
/// Value of application command option type
type: ApplicationCommandOptionTypes,
/// Value of the option resulting from user input
value: ?union { string: []const u8, bool: bool, integer: isize } = null,
/// Present if this option is a group or subcommand
options: ?[]InteractionDataOption = null,
/// `true` if this option is the currently focused option for autocomplete
focused: ?bool = null,
};

View File

@ -1,98 +1,98 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const Snowflake = @import("snowflake.zig").Snowflake;
const User = @import("user.zig").User;
const Guild = @import("guild.zig").Guild;
const Channel = @import("channel.zig").Channel;
const Member = @import("member.zig").Member;
const Application = @import("application.zig").Application;
const MessageActivityTypes = @import("shared.zig").MessageActivityTypes;
const ScheduledEvent = @import("scheduled_event.zig").ScheduledEvent;
const TargetTypes = @import("shared.zig").TargetTypes;
const Partial = @import("partial.zig").Partial;
const Snowflake = @import("snowflake.zig").Snowflake;
const User = @import("user.zig").User;
const Guild = @import("guild.zig").Guild;
const Channel = @import("channel.zig").Channel;
const Member = @import("member.zig").Member;
const Application = @import("application.zig").Application;
const MessageActivityTypes = @import("shared.zig").MessageActivityTypes;
const ScheduledEvent = @import("scheduled_event.zig").ScheduledEvent;
const TargetTypes = @import("shared.zig").TargetTypes;
const Partial = @import("partial.zig").Partial;
/// https://discord.com/developers/docs/resources/invite#invite-metadata-object
pub const InviteMetadata = struct {
/// The type of invite
type: InviteType,
/// The invite code (unique Id)
code: []const u8,
/// The guild this invite is for
guild: ?Partial(Guild),
/// The channel this invite is for
channel: ?Partial(Channel),
/// The user who created the invite
inviter: ?User,
/// The type of target for this voice channel invite
target_type: ?TargetTypes,
/// The target user for this invite
target_user: ?User,
/// The embedded application to open for this voice channel embedded application invite
target_application: ?Partial(Application),
/// Approximate count of online members (only present when target_user is set)
approximate_presence_count: ?isize,
/// Approximate count of total members
approximate_member_count: ?isize,
/// The expiration date of this invite, returned from the `GET /invites/<code>` endpoint when `with_expiration` is `true`
expires_at: ?[]const u8,
/// Stage instance data if there is a public Stage instance in the Stage channel this invite is for
stage_instance: ?InviteStageInstance,
/// guild scheduled event data
guild_scheduled_event: ?ScheduledEvent,
/// isize of times this invite has been used
uses: isize,
/// Max isize of times this invite can be used
max_uses: isize,
/// Duration (in seconds) after which the invite expires
max_age: isize,
/// Whether this invite only grants temporary membership
temporary: bool,
/// When this invite was created
created_at: []const u8,
};
/// https://discord.com/developers/docs/resources/invite#invite-metadata-object
pub const InviteMetadata = struct {
/// The type of invite
type: InviteType,
/// The invite code (unique Id)
code: []const u8,
/// The guild this invite is for
guild: ?Partial(Guild) = null,
/// The channel this invite is for
channel: ?Partial(Channel) = null,
/// The user who created the invite
inviter: ?User = null,
/// The type of target for this voice channel invite
target_type: ?TargetTypes = null,
/// The target user for this invite
target_user: ?User = null,
/// The embedded application to open for this voice channel embedded application invite
target_application: ?Partial(Application) = null,
/// Approximate count of online members (only present when target_user is set)
approximate_presence_count: ?isize = null,
/// Approximate count of total members
approximate_member_count: ?isize = null,
/// The expiration date of this invite, returned from the `GET /invites/<code>` endpoint when `with_expiration` is `true`
expires_at: ?[]const u8 = null,
/// Stage instance data if there is a public Stage instance in the Stage channel this invite is for
stage_instance: ?InviteStageInstance = null,
/// guild scheduled event data
guild_scheduled_event: ?ScheduledEvent = null,
/// isize of times this invite has been used
uses: isize,
/// Max isize of times this invite can be used
max_uses: isize,
/// Duration (in seconds) after which the invite expires
max_age: isize,
/// Whether this invite only grants temporary membership
temporary: bool,
/// When this invite was created
created_at: []const u8,
};
/// https://discord.com/developers/docs/resources/invite#invite-object
pub const Invite = struct {
/// The type of invite
type: InviteType,
/// The invite code (unique Id)
code: []const u8,
/// The guild this invite is for
guild: ?Partial(Guild),
/// The channel this invite is for
channel: ?Partial(Channel),
/// The user who created the invite
inviter: ?User,
/// The type of target for this voice channel invite
target_type: ?TargetTypes,
/// The target user for this invite
target_user: ?User,
/// The embedded application to open for this voice channel embedded application invite
target_application: ?Partial(Application),
/// Approximate count of online members (only present when target_user is set)
approximate_presence_count: ?isize,
/// Approximate count of total members
approximate_member_count: ?isize,
/// The expiration date of this invite, returned from the `GET /invites/<code>` endpoint when `with_expiration` is `true`
expires_at: ?[]const u8,
/// Stage instance data if there is a public Stage instance in the Stage channel this invite is for
stage_instance: ?InviteStageInstance,
/// guild scheduled event data
guild_scheduled_event: ?ScheduledEvent,
/// https://discord.com/developers/docs/resources/invite#invite-object
pub const Invite = struct {
/// The type of invite
type: InviteType,
/// The invite code (unique Id)
code: []const u8,
/// The guild this invite is for
guild: ?Partial(Guild) = null,
/// The channel this invite is for
channel: ?Partial(Channel) = null,
/// The user who created the invite
inviter: ?User = null,
/// The type of target for this voice channel invite
target_type: ?TargetTypes = null,
/// The target user for this invite
target_user: ?User = null,
/// The embedded application to open for this voice channel embedded application invite
target_application: ?Partial(Application) = null,
/// Approximate count of online members (only present when target_user is set)
approximate_presence_count: ?isize = null,
/// Approximate count of total members
approximate_member_count: ?isize = null,
/// The expiration date of this invite, returned from the `GET /invites/<code>` endpoint when `with_expiration` is `true`
expires_at: ?[]const u8 = null,
/// Stage instance data if there is a public Stage instance in the Stage channel this invite is for
stage_instance: ?InviteStageInstance = null,
/// guild scheduled event data
guild_scheduled_event: ?ScheduledEvent = null,
};
pub const InviteType = enum {

View File

@ -1,111 +1,111 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const User = @import("user.zig").User;
const Snowflake = @import("snowflake.zig").Snowflake;
const AvatarDecorationData = @import("user.zig").AvatarDecorationData;
const User = @import("user.zig").User;
const Snowflake = @import("snowflake.zig").Snowflake;
const AvatarDecorationData = @import("user.zig").AvatarDecorationData;
/// https://discord.com/developers/docs/resources/guild#guild-member-object
pub const Member = struct {
/// Whether the user is deafened in voice channels
deaf: ?bool,
/// Whether the user is muted in voice channels
mute: ?bool,
/// Whether the user has not yet passed the guild's Membership Screening requirements
pending: ?bool,
/// The user this guild member represents
user: ?User,
/// This users guild nickname
nick: ?[]const u8,
/// The members custom avatar for this server.
avatar: ?[]const u8,
/// Array of role object ids
roles: [][]const u8,
/// When the user joined the guild
joined_at: []const u8,
/// When the user started boosting the guild
premium_since: ?[]const u8,
/// The permissions this member has in the guild. Only present on interaction events and OAuth2 current member fetch.
permissions: ?[]const u8,
/// when the user's timeout will expire and the user will be able to communicate in the guild again (set null to remove timeout), null or a time in the past if the user is not timed out
communication_disabled_until: ?[]const u8,
/// Guild member flags
flags: isize,
/// data for the member's guild avatar decoration
avatar_decoration_data: ?AvatarDecorationData,
};
/// inherits
pub const MemberWithUser = struct {
/// Whether the user is deafened in voice channels
deaf: ?bool,
/// Whether the user is muted in voice channels
mute: ?bool,
/// Whether the user has not yet passed the guild's Membership Screening requirements
pending: ?bool,
/// This users guild nickname
nick: ?[]const u8,
/// The members custom avatar for this server.
avatar: ?[]const u8,
/// Array of role object ids
roles: [][]const u8,
/// When the user joined the guild
joined_at: []const u8,
/// When the user started boosting the guild
premium_since: ?[]const u8,
/// The permissions this member has in the guild. Only present on interaction events and OAuth2 current member fetch.
permissions: ?[]const u8,
/// when the user's timeout will expire and the user will be able to communicate in the guild again (set null to remove timeout), null or a time in the past if the user is not timed out
communication_disabled_until: ?[]const u8,
/// Guild member flags
flags: isize,
/// data for the member's guild avatar decoration
avatar_decoration_data: ?AvatarDecorationData,
/// The user object for this member
user: User,
};
/// https://discord.com/developers/docs/resources/guild#add-guild-member-json-params
pub const AddGuildMember = struct {
/// access token of a user that has granted your app the `guilds.join` scope
access_token: []const u8,
/// Value to set user's nickname to. Requires MANAGE_NICKNAMES permission on the bot
nick: ?[]const u8,
/// Array of role ids the member is assigned. Requires MANAGE_ROLES permission on the bot
roles: ?[][]const u8,
/// Whether the user is muted in voice channels. Requires MUTE_MEMBERS permission on the bot
mute: ?bool,
/// Whether the user is deafened in voice channels. Requires DEAFEN_MEMBERS permission on the bot
deaf: ?bool,
};
/// https://discord.com/developers/docs/resources/guild#modify-guild-member
pub const ModifyGuildMember = struct {
/// Value to set users nickname to. Requires the `MANAGE_NICKNAMES` permission
nick: ?[]const u8,
/// Array of role ids the member is assigned. Requires the `MANAGE_ROLES` permission
roles: ?Snowflake,
/// Whether the user is muted in voice channels. Will throw a 400 if the user is not in a voice channel. Requires the `MUTE_MEMBERS` permission
mute: ?bool,
/// Whether the user is deafened in voice channels. Will throw a 400 if the user is not in a voice channel. Requires the `MOVE_MEMBERS` permission
deaf: ?bool,
/// Id of channel to move user to (if they are connected to voice). Requires the `MOVE_MEMBERS` permission
channel_id: ?Snowflake,
/// When the user's timeout will expire and the user will be able to communicate in the guild again (up to 28 days in the future), set to null to remove timeout. Requires the `MODERATE_MEMBERS` permission. The date must be given in a ISO string form.
communication_disabled_until: ?[]const u8,
/// Set the flags for the guild member. Requires the `MANAGE_GUILD` or `MANAGE_ROLES` or the combination of `MODERATE_MEMBERS` and `KICK_MEMBERS` and `BAN_MEMBERS`
flags: ?isize,
/// https://discord.com/developers/docs/resources/guild#guild-member-object
pub const Member = struct {
/// Whether the user is deafened in voice channels
deaf: ?bool = null,
/// Whether the user is muted in voice channels
mute: ?bool = null,
/// Whether the user has not yet passed the guild's Membership Screening requirements
pending: ?bool = null,
/// The user this guild member represents
user: ?User = null,
/// This users guild nickname
nick: ?[]const u8 = null,
/// The members custom avatar for this server.
avatar: ?[]const u8 = null,
/// Array of role object ids
roles: [][]const u8,
/// When the user joined the guild
joined_at: []const u8,
/// When the user started boosting the guild
premium_since: ?[]const u8 = null,
/// The permissions this member has in the guild. Only present on interaction events and OAuth2 current member fetch.
permissions: ?[]const u8 = null,
/// when the user's timeout will expire and the user will be able to communicate in the guild again (set null to remove timeout), null or a time in the past if the user is not timed out
communication_disabled_until: ?[]const u8 = null,
/// Guild member flags
flags: isize,
/// data for the member's guild avatar decoration
avatar_decoration_data: ?AvatarDecorationData = null,
};
/// inherits
pub const MemberWithUser = struct {
/// Whether the user is deafened in voice channels
deaf: ?bool = null,
/// Whether the user is muted in voice channels
mute: ?bool = null,
/// Whether the user has not yet passed the guild's Membership Screening requirements
pending: ?bool = null,
/// This users guild nickname
nick: ?[]const u8 = null,
/// The members custom avatar for this server.
avatar: ?[]const u8 = null,
/// Array of role object ids
roles: [][]const u8,
/// When the user joined the guild
joined_at: []const u8,
/// When the user started boosting the guild
premium_since: ?[]const u8 = null,
/// The permissions this member has in the guild. Only present on interaction events and OAuth2 current member fetch.
permissions: ?[]const u8 = null,
/// when the user's timeout will expire and the user will be able to communicate in the guild again (set null to remove timeout), null or a time in the past if the user is not timed out
communication_disabled_until: ?[]const u8 = null,
/// Guild member flags
flags: isize,
/// data for the member's guild avatar decoration
avatar_decoration_data: ?AvatarDecorationData = null,
/// The user object for this member
user: User,
};
/// https://discord.com/developers/docs/resources/guild#add-guild-member-json-params
pub const AddGuildMember = struct {
/// access token of a user that has granted your app the `guilds.join` scope
access_token: []const u8,
/// Value to set user's nickname to. Requires MANAGE_NICKNAMES permission on the bot
nick: ?[]const u8 = null,
/// Array of role ids the member is assigned. Requires MANAGE_ROLES permission on the bot
roles: ?[][]const u8 = null,
/// Whether the user is muted in voice channels. Requires MUTE_MEMBERS permission on the bot
mute: ?bool = null,
/// Whether the user is deafened in voice channels. Requires DEAFEN_MEMBERS permission on the bot
deaf: ?bool = null,
};
/// https://discord.com/developers/docs/resources/guild#modify-guild-member
pub const ModifyGuildMember = struct {
/// Value to set users nickname to. Requires the `MANAGE_NICKNAMES` permission
nick: ?[]const u8 = null,
/// Array of role ids the member is assigned. Requires the `MANAGE_ROLES` permission
roles: ?Snowflake = null,
/// Whether the user is muted in voice channels. Will throw a 400 if the user is not in a voice channel. Requires the `MUTE_MEMBERS` permission
mute: ?bool = null,
/// Whether the user is deafened in voice channels. Will throw a 400 if the user is not in a voice channel. Requires the `MOVE_MEMBERS` permission
deaf: ?bool = null,
/// Id of channel to move user to (if they are connected to voice). Requires the `MOVE_MEMBERS` permission
channel_id: ?Snowflake = null,
/// When the user's timeout will expire and the user will be able to communicate in the guild again (up to 28 days in the future), set to null to remove timeout. Requires the `MODERATE_MEMBERS` permission. The date must be given in a ISO string form.
communication_disabled_until: ?[]const u8 = null,
/// Set the flags for the guild member. Requires the `MANAGE_GUILD` or `MANAGE_ROLES` or the combination of `MODERATE_MEMBERS` and `KICK_MEMBERS` and `BAN_MEMBERS`
flags: ?isize = null,
};

View File

@ -1,328 +1,328 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const Snowflake = @import("snowflake.zig").Snowflake;
const User = @import("user.zig").User;
const Member = @import("member.zig").Member;
const Attachment = @import("attachment.zig").Attachment;
const Application = @import("application.zig").Application;
const Embed = @import("embed.zig").Embed;
const AllowedMentionTypes = @import("shared.zig").AllowedMentionsTypes;
const PremiumTypes = @import("shared.zig").PremiumTypes;
const InteractionTypes = @import("shared.zig").InteractionTypes;
const MessageTypes = @import("shared.zig").MessageTypes;
const Sticker = @import("sticker.zig").Sticker;
const StickerItem = @import("sticker.zig").StickerItem;
const StickerPath = @import("sticker.zig").StickerPack;
const MessageFlags = @import("shared.zig").MessageFlags;
const Emoji = @import("emoji.zig").Emoji;
const Poll = @import("poll.zig").Poll;
const AvatarDecorationData = @import("user.zig").AvatarDecorationData;
const MessageActivityTypes = @import("shared.zig").MessageActivityTypes;
const Partial = @import("partial.zig").Partial;
const MessageComponent = @import("component.zig").MessageComponent;
const Snowflake = @import("snowflake.zig").Snowflake;
const User = @import("user.zig").User;
const Member = @import("member.zig").Member;
const Attachment = @import("attachment.zig").Attachment;
const Application = @import("application.zig").Application;
const Embed = @import("embed.zig").Embed;
const AllowedMentionTypes = @import("shared.zig").AllowedMentionsTypes;
const PremiumTypes = @import("shared.zig").PremiumTypes;
const InteractionTypes = @import("shared.zig").InteractionTypes;
const MessageTypes = @import("shared.zig").MessageTypes;
const Sticker = @import("sticker.zig").Sticker;
const StickerItem = @import("sticker.zig").StickerItem;
const StickerPath = @import("sticker.zig").StickerPack;
const MessageFlags = @import("shared.zig").MessageFlags;
const Emoji = @import("emoji.zig").Emoji;
const Poll = @import("poll.zig").Poll;
const AvatarDecorationData = @import("user.zig").AvatarDecorationData;
const MessageActivityTypes = @import("shared.zig").MessageActivityTypes;
const Partial = @import("partial.zig").Partial;
const MessageComponent = @import("component.zig").MessageComponent;
/// https://discord.com/developers/docs/resources/channel#message-object
pub const Message = struct {
/// id of the message
id: Snowflake,
/// id of the channel the message was sent in
channel_id: Snowflake,
///
/// id of the guild the message was sent in
/// Note: For MESSAGE_CREATE and MESSAGE_UPDATE events, the message object may not contain a guild_id or member field since the events are sent directly to the receiving user and the bot who sent the message, rather than being sent through the guild like non-ephemeral messages.,
///
guild_id: ?Snowflake,
///
/// The author of this message (not guaranteed to be a valid user)
/// Note: The author object follows the structure of the user object, but is only a valid user in the case where the message is generated by a user or bot user. If the message is generated by a webhook, the author object corresponds to the webhook's id, username, and avatar. You can tell if a message is generated by a webhook by checking for the webhook_id on the message object.,
///
author: User,
///
/// Member properties for this message's author
/// Note: The member object exists in `MESSAGE_CREATE` and `MESSAGE_UPDATE` events from text-based guild channels. This allows bots to obtain real-time member data without requiring bots to store member state in memory.,
///
member: ?Member,
/// Contents of the message
content: ?[]const u8,
/// When this message was sent
timestamp: []const u8,
/// When this message was edited (or null if never)
edited_timestamp: ?[]const u8,
/// Whether this was a TTS message
tts: bool,
/// Whether this message mentions everyone
mention_everyone: bool,
///
/// Users specifically mentioned in the message
/// Note: The user objects in the mentions array will only have the partial member field present in `MESSAGE_CREATE` and `MESSAGE_UPDATE` events from text-based guild channels.,
///
mentions: []User,
/// Roles specifically mentioned in this message
mention_roles: ?[][]const u8,
///
/// Channels specifically mentioned in this message
/// Note: Not all channel mentions in a message will appear in `mention_channels`. Only textual channels that are visible to everyone in a discoverable guild will ever be included. Only crossposted messages (via Channel Following) currently include `mention_channels` at all. If no mentions in the message meet these requirements, this field will not be sent.,
///
mention_channels: ?[]ChannelMention,
/// Any attached files
attachments: []Attachment,
/// Any embedded content
embeds: []Embed,
/// Reactions to the message
reactions: ?[]Reaction,
// Used for validating a message was sent
//nonce: ?union(enum) {int: isize,string: []const u8,},
/// Whether this message is pinned
pinned: bool,
/// If the message is generated by a webhook, this is the webhook's id
webhook_id: ?Snowflake,
/// Type of message
type: MessageTypes,
/// Sent with Rich Presence-related chat embeds
activity: ?MessageActivity,
/// Sent with Rich Presence-related chat embeds
application: ?Partial(Application),
/// if the message is an Interaction or application-owned webhook, this is the id of the application
application_id: ?Snowflake,
// Data showing the source of a crosspost, channel follow add, pin, or reply message
// message_reference: ?Omit(MessageReference, .{"failIfNotExists"}),
/// Message flags combined as a bitfield
flags: ?MessageFlags,
///
/// The stickers sent with the message (bots currently can only receive messages with stickers, not send)
/// @deprecated
///
stickers: ?[]Sticker,
///
/// The message associated with the `message_reference`
/// Note: This field is only returned for messages with a `type` of `19` (REPLY). If the message is a reply but the `referenced_message` field is not present, the backend did not attempt to fetch the message that was being replied to, so its state is unknown. If the field exists but is null, the referenced message was deleted.,
/// TAKES A POINTER
referenced_message: ?*Message,
/// The message associated with the `message_reference`. This is a minimal subset of fields in a message (e.g. `author` is excluded.)
message_snapshots: ?[]MessageSnapshot,
/// sent if the message is sent as a result of an interaction
interaction_metadata: ?MessageInteractionMetadata,
///
/// Sent if the message is a response to an Interaction
///
/// @deprecated Deprecated in favor of {@link interaction_metadata};
///
interaction: ?MessageInteraction,
// The thread that was started from this message, includes thread member object
// thread: ?Omit(Channel, .{"member"}), //& { member: ThreadMember };,
/// The components related to this message
components: ?[]MessageComponent,
/// Sent if the message contains stickers
sticker_items: ?[]StickerItem,
/// A generally increasing integer (there may be gaps or duplicates) that represents the approximate position of the message in a thread, it can be used to estimate the relative position of the message in a thread in company with `total_message_sent` on parent thread
position: ?isize,
/// The poll object
poll: ?Poll,
/// The call associated with the message
call: ?MessageCall,
};
/// https://discord.com/developers/docs/resources/channel#message-call-object
pub const MessageCall = struct {
/// Array of user object ids that participated in the call
participants: [][]const u8,
/// Time when call ended
ended_timestamp: []const u8,
};
/// https://discord.com/developers/docs/resources/channel#channel-mention-object
pub const ChannelMention = struct {
/// id of the channel
id: Snowflake,
/// id of the guild containing the channel
guild_id: Snowflake,
/// The type of channel
type: isize,
/// The name of the channel
name: []const u8,
};
/// https://discord.com/developers/docs/resources/channel#reaction-object
pub const Reaction = struct {
/// Total isize of times this emoji has been used to react (including super reacts)
count: isize,
///
count_details: ReactionCountDetails,
/// Whether the current user reacted using this emoji
me: bool,
///
me_burst: bool,
/// Emoji information
emoji: Partial(Emoji),
/// HEX colors used for super reaction
burst_colors: [][]const u8,
};
/// https://discord.com/developers/docs/resources/channel#get-reactions-reaction-types
pub const ReactionType = enum {
Normal,
Burst,
};
/// https://discord.com/developers/docs/resources/channel#reaction-count-details-object
pub const ReactionCountDetails = struct {
/// Count of super reactions
burst: isize,
///
normal: isize,
};
/// https://discord.com/developers/docs/resources/channel#message-object-message-activity-structure
pub const MessageActivity = struct {
/// Type of message activity
type: MessageActivityTypes,
/// `party_id` from a Rich Presence event
party_id: ?Snowflake,
};
/// https://discord.com/developers/docs/resources/channel#message-object-message-reference-structure
pub const MessageReference = struct {
/// Type of reference
type: ?MessageReferenceType,
/// id of the originating message
message_id: ?Snowflake,
///
/// id of the originating message's channel
/// Note: `channel_id` is optional when creating a reply, but will always be present when receiving an event/response that includes this data model.,
///
channel_id: ?Snowflake,
/// id of the originating message's guild
guild_id: ?Snowflake,
/// When sending, whether to error if the referenced message doesn't exist instead of sending as a normal (non-reply) message, default true
fail_if_not_exists: bool,
};
/// https://discord.com/developers/docs/resources/channel#message-reference-object-message-reference-types
pub const MessageReferenceType = enum {
///
/// A standard reference used by replies.
///
/// @remarks
/// When the type is set to this value, the field referenced_message on the message will be present
///
Default,
///
/// Reference used to point to a message at a point in time.
///
/// @remarks
/// When the type is set to this value, the field message_snapshot on the message will be present
///
/// This value can only be used for basic messages;
/// i.e. messages which do not have strong bindings to a non global entity.
/// Thus we support only messages with `DEFAULT` or `REPLY` types, but disallowed if there are any polls, calls, or components.
///
Forward,
};
/// https://discord.com/developers/docs/resources/channel#message-snapshot-object-message-snapshot-structure
pub const MessageSnapshot = struct {
/// https://discord.com/developers/docs/resources/channel#message-object
/// Minimal subset of fields in the forwarded message
message: struct {
content: ?[]const u8,
pub const Message = struct {
/// id of the message
id: Snowflake,
/// id of the channel the message was sent in
channel_id: Snowflake,
///
/// id of the guild the message was sent in
/// Note: For MESSAGE_CREATE and MESSAGE_UPDATE events, the message object may not contain a guild_id or member field since the events are sent directly to the receiving user and the bot who sent the message, rather than being sent through the guild like non-ephemeral messages.,
///
guild_id: ?Snowflake = null,
///
/// The author of this message (not guaranteed to be a valid user)
/// Note: The author object follows the structure of the user object, but is only a valid user in the case where the message is generated by a user or bot user. If the message is generated by a webhook, the author object corresponds to the webhook's id, username, and avatar. You can tell if a message is generated by a webhook by checking for the webhook_id on the message object.,
///
author: User,
///
/// Member properties for this message's author
/// Note: The member object exists in `MESSAGE_CREATE` and `MESSAGE_UPDATE` events from text-based guild channels. This allows bots to obtain real-time member data without requiring bots to store member state in memory.,
///
member: ?Member = null,
/// Contents of the message
content: ?[]const u8 = null,
/// When this message was sent
timestamp: []const u8,
edited_timestamp: ?[]const u8,
mentions: []struct {
username: []const u8,
global_name: ?[]const u8,
locale: ?[]const u8,
flags: ?isize,
premium_type: ?PremiumTypes,
public_flags: ?isize,
accent_color: ?isize,
id: Snowflake,
discriminator: []const u8,
avatar: ?[]const u8,
bot: ?bool,
system: ?bool,
mfa_enabled: ?bool,
verified: ?bool,
email: ?[]const u8,
banner: ?[]const u8,
avatar_decoration_data: ?AvatarDecorationData,
member: ?Partial(Member),
},
mention_roles: ?[][]const u8,
type: MessageTypes,
flags: ?MessageFlags,
stickers: ?[]Sticker,
components: ?[]MessageComponent,
sticker_items: ?[]StickerItem,
/// When this message was edited (or null if never)
edited_timestamp: ?[]const u8 = null,
/// Whether this was a TTS message
tts: bool,
/// Whether this message mentions everyone
mention_everyone: bool,
///
/// Users specifically mentioned in the message
/// Note: The user objects in the mentions array will only have the partial member field present in `MESSAGE_CREATE` and `MESSAGE_UPDATE` events from text-based guild channels.,
///
mentions: []User,
/// Roles specifically mentioned in this message
mention_roles: ?[][]const u8 = null,
///
/// Channels specifically mentioned in this message
/// Note: Not all channel mentions in a message will appear in `mention_channels`. Only textual channels that are visible to everyone in a discoverable guild will ever be included. Only crossposted messages (via Channel Following) currently include `mention_channels` at all. If no mentions in the message meet these requirements, this field will not be sent.,
///
mention_channels: ?[]ChannelMention = null,
/// Any attached files
attachments: []Attachment,
/// Any embedded content
embeds: []Embed,
},
};
/// Reactions to the message
reactions: ?[]Reaction = null,
// Used for validating a message was sent
// nonce: ?union(enum) {int: isize,string: []const u8,} = null,
/// Whether this message is pinned
pinned: bool,
/// If the message is generated by a webhook, this is the webhook's id
webhook_id: ?Snowflake = null,
/// Type of message
type: MessageTypes,
/// Sent with Rich Presence-related chat embeds
activity: ?MessageActivity = null,
/// Sent with Rich Presence-related chat embeds
application: ?Partial(Application) = null,
/// if the message is an Interaction or application-owned webhook, this is the id of the application
application_id: ?Snowflake = null,
// Data showing the source of a crosspost, channel follow add, pin, or reply message
// message_reference: ?Omit(MessageReference, .{"failIfNotExists"}) = null,
/// Message flags combined as a bitfield
flags: ?MessageFlags = null,
///
/// The stickers sent with the message (bots currently can only receive messages with stickers, not send)
/// @deprecated
///
stickers: ?[]Sticker = null,
///
/// The message associated with the `message_reference`
/// Note: This field is only returned for messages with a `type` of `19` (REPLY). If the message is a reply but the `referenced_message` field is not present, the backend did not attempt to fetch the message that was being replied to, so its state is unknown. If the field exists but is null, the referenced message was deleted.,
/// TAKES A POINTER
referenced_message: ?*Message = null,
/// The message associated with the `message_reference`. This is a minimal subset of fields in a message (e.g. `author` is excluded.)
message_snapshots: ?[]MessageSnapshot = null,
/// sent if the message is sent as a result of an interaction
interaction_metadata: ?MessageInteractionMetadata = null,
///
/// Sent if the message is a response to an Interaction
///
/// @deprecated Deprecated in favor of {@link interaction_metadata};
///
interaction: ?MessageInteraction = null,
// The thread that was started from this message, includes thread member object
// thread: ?Omit(Channel, .{"member"}), //& { member: ThreadMember }; = null,
/// The components related to this message
components: ?[]MessageComponent = null,
/// Sent if the message contains stickers
sticker_items: ?[]StickerItem = null,
/// A generally increasing integer (there may be gaps or duplicates) that represents the approximate position of the message in a thread, it can be used to estimate the relative position of the message in a thread in company with `total_message_sent` on parent thread
position: ?isize = null,
/// The poll object
poll: ?Poll = null,
/// The call associated with the message
call: ?MessageCall = null,
};
/// https://discord.com/developers/docs/interactions/receiving-and-responding#message-interaction-object-message-interaction-structure
pub const MessageInteraction = struct {
/// Id of the interaction
id: Snowflake,
/// The type of interaction
type: InteractionTypes,
/// The name of the ApplicationCommand including the name of the subcommand/subcommand group
name: []const u8,
/// The user who invoked the interaction
user: User,
/// The member who invoked the interaction in the guild
member: ?Partial(Member),
};
/// https://discord.com/developers/docs/resources/channel#message-call-object
pub const MessageCall = struct {
/// Array of user object ids that participated in the call
participants: [][]const u8,
/// Time when call ended
ended_timestamp: []const u8,
};
/// https://discord.com/developers/docs/resources/channel#message-interaction-metadata-object-message-interaction-metadata-structure
pub const MessageInteractionMetadata = struct {
/// Id of the interaction
id: Snowflake,
/// The type of interaction
type: InteractionTypes,
/// User who triggered the interaction
user: User,
// IDs for installation context(s) related to an interaction
// authorizing_integration_owners: Partial(AutoArrayHashMap(ApplicationIntegrationType, []const u8)),
/// ID of the original response message, present only on follow-up messages
original_response_message_id: ?Snowflake,
/// ID of the message that contained interactive component, present only on messages created from component interactions
interacted_message_id: ?Snowflake,
/// Metadata for the interaction that was used to open the modal, present only on modal submit interactions
/// TAKES A POINTER
triggering_interaction_metadata: ?*MessageInteractionMetadata,
};
/// https://discord.com/developers/docs/resources/channel#channel-mention-object
pub const ChannelMention = struct {
/// id of the channel
id: Snowflake,
/// id of the guild containing the channel
guild_id: Snowflake,
/// The type of channel
type: isize,
/// The name of the channel
name: []const u8,
};
pub const AllowedMentions = struct {
/// An array of allowed mention types to parse from the content.
parse: []AllowedMentionTypes,
/// Array of role_ids to mention (Max size of 100)
roles: []Snowflake,
/// Array of user_ids to mention (Max size of 100)
users: []Snowflake,
/// For replies, whether to mention the author of the message being replied to (default false)
replied_user: ?bool,
};
/// https://discord.com/developers/docs/resources/channel#reaction-object
pub const Reaction = struct {
/// Total isize of times this emoji has been used to react (including super reacts)
count: isize,
///
count_details: ReactionCountDetails,
/// Whether the current user reacted using this emoji
me: bool,
///
me_burst: bool,
/// Emoji information
emoji: Partial(Emoji),
/// HEX colors used for super reaction
burst_colors: [][]const u8,
};
pub const GetMessagesQuery = struct {
/// Get messages around this message ID,
around: ?Snowflake,
/// Get messages before this message ID
before: ?Snowflake,
/// Get messages after this message ID
after: ?Snowflake,
/// Max number of messages to return (1-100),
limit: ?usize = 50,
/// https://discord.com/developers/docs/resources/channel#get-reactions-reaction-types
pub const ReactionType = enum {
Normal,
Burst,
};
/// https://discord.com/developers/docs/resources/channel#reaction-count-details-object
pub const ReactionCountDetails = struct {
/// Count of super reactions
burst: isize,
///
normal: isize,
};
/// https://discord.com/developers/docs/resources/channel#message-object-message-activity-structure
pub const MessageActivity = struct {
/// Type of message activity
type: MessageActivityTypes,
/// `party_id` from a Rich Presence event
party_id: ?Snowflake = null,
};
/// https://discord.com/developers/docs/resources/channel#message-object-message-reference-structure
pub const MessageReference = struct {
/// Type of reference
type: ?MessageReferenceType = null,
/// id of the originating message
message_id: ?Snowflake = null,
///
/// id of the originating message's channel
/// Note: `channel_id` is optional when creating a reply, but will always be present when receiving an event/response that includes this data model.,
///
channel_id: ?Snowflake = null,
/// id of the originating message's guild
guild_id: ?Snowflake = null,
/// When sending, whether to error if the referenced message doesn't exist instead of sending as a normal (non-reply) message, default true
fail_if_not_exists: bool,
};
/// https://discord.com/developers/docs/resources/channel#message-reference-object-message-reference-types
pub const MessageReferenceType = enum {
///
/// A standard reference used by replies.
///
/// @remarks
/// When the type is set to this value, the field referenced_message on the message will be present
///
Default,
///
/// Reference used to point to a message at a point in time.
///
/// @remarks
/// When the type is set to this value, the field message_snapshot on the message will be present
///
/// This value can only be used for basic messages;
/// i.e. messages which do not have strong bindings to a non global entity.
/// Thus we support only messages with `DEFAULT` or `REPLY` types, but disallowed if there are any polls, calls, or components.
///
Forward,
};
/// https://discord.com/developers/docs/resources/channel#message-snapshot-object-message-snapshot-structure
pub const MessageSnapshot = struct {
/// https://discord.com/developers/docs/resources/channel#message-object
/// Minimal subset of fields in the forwarded message
message: struct {
content: ?[]const u8 = null,
timestamp: []const u8,
edited_timestamp: ?[]const u8 = null,
mentions: []struct {
username: []const u8,
global_name: ?[]const u8 = null,
locale: ?[]const u8 = null,
flags: ?isize = null,
premium_type: ?PremiumTypes = null,
public_flags: ?isize = null,
accent_color: ?isize = null,
id: Snowflake,
discriminator: []const u8,
avatar: ?[]const u8 = null,
bot: ?bool = null,
system: ?bool = null,
mfa_enabled: ?bool = null,
verified: ?bool = null,
email: ?[]const u8 = null,
banner: ?[]const u8 = null,
avatar_decoration_data: ?AvatarDecorationData = null,
member: ?Partial(Member) = null,
},
mention_roles: ?[][]const u8 = null,
type: MessageTypes,
flags: ?MessageFlags = null,
stickers: ?[]Sticker = null,
components: ?[]MessageComponent = null,
sticker_items: ?[]StickerItem = null,
attachments: []Attachment,
embeds: []Embed,
},
};
/// https://discord.com/developers/docs/interactions/receiving-and-responding#message-interaction-object-message-interaction-structure
pub const MessageInteraction = struct {
/// Id of the interaction
id: Snowflake,
/// The type of interaction
type: InteractionTypes,
/// The name of the ApplicationCommand including the name of the subcommand/subcommand group
name: []const u8,
/// The user who invoked the interaction
user: User,
/// The member who invoked the interaction in the guild
member: ?Partial(Member) = null,
};
/// https://discord.com/developers/docs/resources/channel#message-interaction-metadata-object-message-interaction-metadata-structure
pub const MessageInteractionMetadata = struct {
/// Id of the interaction
id: Snowflake,
/// The type of interaction
type: InteractionTypes,
/// User who triggered the interaction
user: User,
// IDs for installation context(s) related to an interaction
// authorizing_integration_owners: Partial(AutoArrayHashMap(ApplicationIntegrationType, []const u8)),
/// ID of the original response message, present only on follow-up messages
original_response_message_id: ?Snowflake = null,
/// ID of the message that contained interactive component, present only on messages created from component interactions
interacted_message_id: ?Snowflake = null,
/// Metadata for the interaction that was used to open the modal, present only on modal submit interactions
/// TAKES A POINTER
triggering_interaction_metadata: ?*MessageInteractionMetadata = null,
};
pub const AllowedMentions = struct {
/// An array of allowed mention types to parse from the content.
parse: []AllowedMentionTypes,
/// Array of role_ids to mention (Max size of 100)
roles: []Snowflake,
/// Array of user_ids to mention (Max size of 100)
users: []Snowflake,
/// For replies, whether to mention the author of the message being replied to (default false)
replied_user: ?bool = null,
};
pub const GetMessagesQuery = struct {
/// Get messages around this message ID,
around: ?Snowflake = null,
/// Get messages before this message ID
before: ?Snowflake = null,
/// Get messages after this message ID
after: ?Snowflake = null,
/// Max number of messages to return (1-100),
limit: ?usize = null,
};

View File

@ -1,44 +1,44 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const Snowflake = @import("snowflake.zig").Snowflake;
const SkuFlags = @import("shared.zig").SkuFlags;
const Snowflake = @import("snowflake.zig").Snowflake;
const SkuFlags = @import("shared.zig").SkuFlags;
/// https://discord.com/developers/docs/monetization/entitlements#entitlement-object-entitlement-structure
pub const Entitlement = struct {
/// ID of the entitlement
id: Snowflake,
/// ID of the SKU
sku_id: Snowflake,
/// ID of the user that is granted access to the entitlement's sku
user_id: ?Snowflake,
/// ID of the guild that is granted access to the entitlement's sku
guild_id: ?Snowflake,
/// ID of the parent application
application_id: Snowflake,
/// Type of entitlement
type: EntitlementType,
/// Entitlement was deleted
deleted: bool,
/// Start date at which the entitlement is valid. Not present when using test entitlements
starts_at: ?[]const u8,
/// Date at which the entitlement is no longer valid. Not present when using test entitlements
ends_at: ?[]const u8,
/// For consumable items, whether or not the entitlement has been consumed
consumed: ?bool,
/// https://discord.com/developers/docs/monetization/entitlements#entitlement-object-entitlement-structure
pub const Entitlement = struct {
/// ID of the entitlement
id: Snowflake,
/// ID of the SKU
sku_id: Snowflake,
/// ID of the user that is granted access to the entitlement's sku
user_id: ?Snowflake = null,
/// ID of the guild that is granted access to the entitlement's sku
guild_id: ?Snowflake = null,
/// ID of the parent application
application_id: Snowflake,
/// Type of entitlement
type: EntitlementType,
/// Entitlement was deleted
deleted: bool,
/// Start date at which the entitlement is valid. Not present when using test entitlements
starts_at: ?[]const u8 = null,
/// Date at which the entitlement is no longer valid. Not present when using test entitlements
ends_at: ?[]const u8 = null,
/// For consumable items, whether or not the entitlement has been consumed
consumed: ?bool = null,
};
/// https://discord.com/developers/docs/monetization/entitlements#entitlement-object-entitlement-types

View File

@ -1,63 +1,63 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const OAuth2Scope = @import("shared.zig").OAuth2Scope;
const Guild = @import("guild.zig").Guild;
const IncomingWebhook = @import("webhook.zig").IncomingWebhook;
const OAuth2Scope = @import("shared.zig").OAuth2Scope;
const Guild = @import("guild.zig").Guild;
const IncomingWebhook = @import("webhook.zig").IncomingWebhook;
pub const TokenExchangeAuthorizationCode = struct {
grant_type: []const u8, //"authorization_code",
/// The code for the token exchange
code: []const u8,
/// The redirect_uri associated with this authorization
redirect_uri: []const u8,
};
/// https://discord.com/developers/docs/topics/oauth2#client-credentials-grant
pub const TokenExchangeRefreshToken = struct {
grant_type: "refresh_token",
/// the user's refresh token
refresh_token: []const u8,
};
/// https://discord.com/developers/docs/topics/oauth2#client-credentials-grant
pub const TokenExchangeClientCredentials = struct {
grant_type: "client_credentials",
/// The scope(s) for the access token
scope: []OAuth2Scope,
};
pub const AccessTokenResponse = struct {
/// The access token of the user
access_token: []const u8,
/// The type of token
token_type: []const u8,
/// The isize of seconds after that the access token is expired
expires_in: isize,
///
/// The refresh token to refresh the access token
///
/// @remarks
/// When the token exchange is a client credentials type grant this value is not defined.
///
refresh_token: []const u8,
/// The scopes for the access token
scope: []const u8,
/// The webhook the user created for the application. Requires the `webhook.incoming` scope
webhook: ?IncomingWebhook,
/// The guild the bot has been added. Requires the `bot` scope
guild: ?Guild,
pub const TokenExchangeAuthorizationCode = struct {
grant_type: []const u8, //"authorization_code",
/// The code for the token exchange
code: []const u8,
/// The redirect_uri associated with this authorization
redirect_uri: []const u8,
};
/// https://discord.com/developers/docs/topics/oauth2#client-credentials-grant
pub const TokenExchangeRefreshToken = struct {
grant_type: "refresh_token",
/// the user's refresh token
refresh_token: []const u8,
};
/// https://discord.com/developers/docs/topics/oauth2#client-credentials-grant
pub const TokenExchangeClientCredentials = struct {
grant_type: "client_credentials",
/// The scope(s) for the access token
scope: []OAuth2Scope,
};
pub const AccessTokenResponse = struct {
/// The access token of the user
access_token: []const u8,
/// The type of token
token_type: []const u8,
/// The isize of seconds after that the access token is expired
expires_in: isize,
///
/// The refresh token to refresh the access token
///
/// @remarks
/// When the token exchange is a client credentials type grant this value is not defined.
///
refresh_token: []const u8,
/// The scopes for the access token
scope: []const u8,
/// The webhook the user created for the application. Requires the `webhook.incoming` scope
webhook: ?IncomingWebhook = null,
/// The guild the bot has been added. Requires the `bot` scope
guild: ?Guild = null,
};

View File

@ -1,136 +1,136 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const Snowflake = @import("snowflake.zig").Snowflake;
const User = @import("user.zig").User;
const Emoji = @import("emoji.zig").Emoji;
const Partial = @import("partial.zig").Partial;
const Snowflake = @import("snowflake.zig").Snowflake;
const User = @import("user.zig").User;
const Emoji = @import("emoji.zig").Emoji;
const Partial = @import("partial.zig").Partial;
/// https://discord.com/developers/docs/resources/poll#poll-object
pub const Poll = struct {
/// The question of the poll. Only `text` is supported.
question: PollMedia,
/// Each of the answers available in the poll. There is a maximum of 10 answers per poll.
answers: []PollAnswer,
///
/// The time when the poll ends.
///
/// @remarks
/// `expiry` is marked as nullable to support non-expiring polls in the future, but all polls have an expiry currently.
///
expiry: ?[]const u8,
/// Whether a user can select multiple answers
allow_multiselect: bool,
/// The layout type of the poll
layout_type: PollLayoutType,
///
/// The results of the poll
///
/// @remarks
/// This value will not be sent by discord under specific conditions where they don't fetch them on their backend. When this value is missing it should be interpreted as "Unknown results" and not as "No results"
///The results may not be totally accurate while the poll has not ended. When it ends discord will re-calculate all the results and set {@link PollResult.is_finalized}; to true
///
results: ?PollResult,
};
/// https://discord.com/developers/docs/resources/poll#poll-object
pub const Poll = struct {
/// The question of the poll. Only `text` is supported.
question: PollMedia,
/// Each of the answers available in the poll. There is a maximum of 10 answers per poll.
answers: []PollAnswer,
///
/// The time when the poll ends.
///
/// @remarks
/// `expiry` is marked as nullable to support non-expiring polls in the future, but all polls have an expiry currently.
///
expiry: ?[]const u8 = null,
/// Whether a user can select multiple answers
allow_multiselect: bool,
/// The layout type of the poll
layout_type: PollLayoutType,
///
/// The results of the poll
///
/// @remarks
/// This value will not be sent by discord under specific conditions where they don't fetch them on their backend. When this value is missing it should be interpreted as "Unknown results" and not as "No results"
///The results may not be totally accurate while the poll has not ended. When it ends discord will re-calculate all the results and set {@link PollResult.is_finalized}; to true
///
results: ?PollResult = null,
};
/// https://discord.com/developers/docs/resources/poll#layout-type
pub const PollLayoutType = enum(u4) {
/// The default layout
Default = 1,
};
/// https://discord.com/developers/docs/resources/poll#layout-type
pub const PollLayoutType = enum(u4) {
/// The default layout
Default = 1,
};
/// https://discord.com/developers/docs/resources/poll#poll-media-object
pub const PollMedia = struct {
///
/// The text of the field
///
/// @remarks
/// `text` should always be non-null for both questions and answers, but this is subject to changes.
/// The maximum length of `text` is 300 for the question, and 55 for any answer.
///
text: ?[]const u8,
///
/// The emoji of the field
///
/// @remarks
/// When creating a poll answer with an emoji, one only needs to send either the `id` (custom emoji) or `name` (default emoji) as the only field.
///
emoji: ?Partial(Emoji),
};
/// https://discord.com/developers/docs/resources/poll#poll-media-object
pub const PollMedia = struct {
///
/// The text of the field
///
/// @remarks
/// `text` should always be non-null for both questions and answers, but this is subject to changes.
/// The maximum length of `text` is 300 for the question, and 55 for any answer.
///
text: ?[]const u8 = null,
///
/// The emoji of the field
///
/// @remarks
/// When creating a poll answer with an emoji, one only needs to send either the `id` (custom emoji) or `name` (default emoji) as the only field.
///
emoji: ?Partial(Emoji) = null,
};
/// https://discord.com/developers/docs/resources/poll#poll-answer-object
pub const PollAnswer = struct {
///
/// The id of the answer
///
/// @remarks
///This id labels each answer. It starts at 1 and goes up sequentially. recommend against depending on this value as is a implementation detail.
///
answer_id: isize,
/// The data of the answer
poll_media: PollMedia,
};
/// https://discord.com/developers/docs/resources/poll#poll-answer-object
pub const PollAnswer = struct {
///
/// The id of the answer
///
/// @remarks
///This id labels each answer. It starts at 1 and goes up sequentially. recommend against depending on this value as is a implementation detail.
///
answer_id: isize,
/// The data of the answer
poll_media: PollMedia,
};
pub const PollAnswerCount = struct {
///The {@link PollAnswer.answer_id | answer_id};
id: isize,
/// The isize of votes for this answer
count: isize,
/// Whether the current user voted for this answer
me_voted: bool,
};
pub const PollAnswerCount = struct {
///The {@link PollAnswer.answer_id | answer_id};
id: isize,
/// The isize of votes for this answer
count: isize,
/// Whether the current user voted for this answer
me_voted: bool,
};
/// https://discord.com/developers/docs/resources/poll#poll-results-object
pub const PollResult = struct {
/// Whether the votes have been precisely counted
is_finalized: bool,
/// The counts for each answer
answer_counts: []PollAnswerCount,
};
/// https://discord.com/developers/docs/resources/poll#poll-results-object
pub const PollResult = struct {
/// Whether the votes have been precisely counted
is_finalized: bool,
/// The counts for each answer
answer_counts: []PollAnswerCount,
};
/// https://discord.com/developers/docs/resources/poll#get-answer-voters-response-body
pub const GetAnswerVotesResponse = struct {
/// Users who voted for this answer
users: []User,
};
/// https://discord.com/developers/docs/resources/poll#get-answer-voters-response-body
pub const GetAnswerVotesResponse = struct {
/// Users who voted for this answer
users: []User,
};
/// https://discord.com/developers/docs/topics/gateway-events#message-poll-vote-add
pub const PollVoteAdd = struct {
/// ID of the user. Usually a snowflake
user_id: Snowflake,
/// ID of the channel. Usually a snowflake
channel_id: Snowflake,
/// ID of the message. Usually a snowflake
message_id: Snowflake,
/// ID of the guild. Usually a snowflake
guild_id: ?Snowflake,
/// ID of the answer.
answer_id: isize,
};
/// https://discord.com/developers/docs/topics/gateway-events#message-poll-vote-remove
pub const PollVoteRemove = struct {
/// ID of the user. Usually a snowflake
user_id: Snowflake,
/// ID of the channel. Usually a snowflake
channel_id: Snowflake,
/// ID of the message. Usually a snowflake
message_id: Snowflake,
/// ID of the guild. Usually a snowflake
guild_id: ?Snowflake,
/// https://discord.com/developers/docs/topics/gateway-events#message-poll-vote-add
pub const PollVoteAdd = struct {
/// ID of the user. Usually a snowflake
user_id: Snowflake,
/// ID of the channel. Usually a snowflake
channel_id: Snowflake,
/// ID of the message. Usually a snowflake
message_id: Snowflake,
/// ID of the guild. Usually a snowflake
guild_id: ?Snowflake = null,
/// ID of the answer.
answer_id: isize,
};
/// https://discord.com/developers/docs/topics/gateway-events#message-poll-vote-remove
pub const PollVoteRemove = struct {
/// ID of the user. Usually a snowflake
user_id: Snowflake,
/// ID of the channel. Usually a snowflake
channel_id: Snowflake,
/// ID of the message. Usually a snowflake
message_id: Snowflake,
/// ID of the guild. Usually a snowflake
guild_id: ?Snowflake = null,
/// ID of the answer.
answer_id: isize,
};

View File

@ -1,101 +1,101 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const Snowflake = @import("snowflake.zig").Snowflake;
const RoleFlags = @import("shared.zig").RoleFlags;
const Snowflake = @import("snowflake.zig").Snowflake;
const RoleFlags = @import("shared.zig").RoleFlags;
/// https://discord.com/developers/docs/topics/permissions#role-object-role-structure
pub const Role = struct {
/// Role id
id: Snowflake,
/// If this role is showed separately in the user listing
hoist: bool,
/// Permission bit set
permissions: []const u8,
/// Whether this role is managed by an integration
managed: bool,
/// Whether this role is mentionable
mentionable: bool,
/// The tags this role has
tags: ?RoleTags,
/// the role emoji hash
icon: ?[]const u8,
/// Role name
name: []const u8,
/// Integer representation of hexadecimal color code
color: isize,
/// Position of this role (roles with the same position are sorted by id)
position: isize,
/// role unicode emoji
unicode_emoji: ?[]const u8,
/// Role flags combined as a bitfield
flags: RoleFlags,
};
/// https://discord.com/developers/docs/topics/permissions#role-object-role-tags-structure
pub const RoleTags = struct {
/// The id of the bot this role belongs to
bot_id: ?Snowflake,
/// The id of the integration this role belongs to
integration_id: ?Snowflake,
/// Whether this is the guild's premium subscriber role
/// Tags with type ?bool represent booleans. They will be present and set to null if they are "true", and will be not present if they are "false".
premium_subscriber: ?bool,
/// Id of this role's subscription sku and listing.
subscription_listing_id: ?Snowflake,
/// Whether this role is available for purchase.
/// Tags with type ?bool represent booleans. They will be present and set to null if they are "true", and will be not present if they are "false".
available_for_purchase: ?bool,
/// Whether this is a guild's linked role
/// Tags with type ?bool represent booleans. They will be present and set to null if they are "true", and will be not present if they are "false".
guild_connections: ?bool,
};
/// https://discord.com/developers/docs/resources/guild#create-guild-role
pub const CreateGuildRole = struct {
/// Name of the role, max 100 characters, default: "new role"
name: ?[]const u8,
/// Bitwise value of the enabled/disabled permissions, default: everyone permissions in guild
permissions: ?[][]const u8,
/// RGB color value, default: 0
color: ?isize,
/// Whether the role should be displayed separately in the sidebar, default: false
hoist: ?bool,
/// Whether the role should be mentionable, default: false
mentionable: ?bool,
/// The role's unicode emoji (if the guild has the `ROLE_ICONS` feature)
unicode_emoji: ?[]const u8,
/// the role's icon image (if the guild has the `ROLE_ICONS` feature)
icon: ?[]const u8,
};
/// https://discord.com/developers/docs/resources/guild#modify-guild-role
pub const ModifyGuildRole = struct {
/// Name of the role, max 100 characters, default: "new role"
name: ?[]const u8,
/// Bitwise value of the enabled/disabled permissions, default: everyone permissions in guild
permissions: ?[][]const u8,
/// RGB color value, default: 0
color: ?isize,
/// Whether the role should be displayed separately in the sidebar, default: false
hoist: ?bool,
/// Whether the role should be mentionable, default: false
mentionable: ?bool,
/// The role's unicode emoji (if the guild has the `ROLE_ICONS` feature)
unicodeEmoji: ?[]const u8,
/// the role's icon image (if the guild has the `ROLE_ICONS` feature)
icon: ?[]const u8,
/// https://discord.com/developers/docs/topics/permissions#role-object-role-structure
pub const Role = struct {
/// Role id
id: Snowflake,
/// If this role is showed separately in the user listing
hoist: bool,
/// Permission bit set
permissions: []const u8,
/// Whether this role is managed by an integration
managed: bool,
/// Whether this role is mentionable
mentionable: bool,
/// The tags this role has
tags: ?RoleTags = null,
/// the role emoji hash
icon: ?[]const u8 = null,
/// Role name
name: []const u8,
/// Integer representation of hexadecimal color code
color: isize,
/// Position of this role (roles with the same position are sorted by id)
position: isize,
/// role unicode emoji
unicode_emoji: ?[]const u8 = null,
/// Role flags combined as a bitfield
flags: RoleFlags,
};
/// https://discord.com/developers/docs/topics/permissions#role-object-role-tags-structure
pub const RoleTags = struct {
/// The id of the bot this role belongs to
bot_id: ?Snowflake = null,
/// The id of the integration this role belongs to
integration_id: ?Snowflake = null,
/// Whether this is the guild's premium subscriber role
/// Tags with type ?bool represent booleans. They will be present and set to null if they are "true", and will be not present if they are "false".
premium_subscriber: ?bool = null,
/// Id of this role's subscription sku and listing.
subscription_listing_id: ?Snowflake = null,
/// Whether this role is available for purchase.
/// Tags with type ?bool represent booleans. They will be present and set to null if they are "true", and will be not present if they are "false".
available_for_purchase: ?bool = null,
/// Whether this is a guild's linked role
/// Tags with type ?bool represent booleans. They will be present and set to null if they are "true", and will be not present if they are "false".
guild_connections: ?bool = null,
};
/// https://discord.com/developers/docs/resources/guild#create-guild-role
pub const CreateGuildRole = struct {
/// Name of the role, max 100 characters, default: "new role"
name: ?[]const u8 = null,
/// Bitwise value of the enabled/disabled permissions, default: everyone permissions in guild
permissions: ?[][]const u8 = null,
/// RGB color value, default: 0
color: ?isize = null,
/// Whether the role should be displayed separately in the sidebar, default: false
hoist: ?bool = null,
/// Whether the role should be mentionable, default: false
mentionable: ?bool = null,
/// The role's unicode emoji (if the guild has the `ROLE_ICONS` feature)
unicode_emoji: ?[]const u8 = null,
/// the role's icon image (if the guild has the `ROLE_ICONS` feature)
icon: ?[]const u8 = null,
};
/// https://discord.com/developers/docs/resources/guild#modify-guild-role
pub const ModifyGuildRole = struct {
/// Name of the role, max 100 characters, default: "new role"
name: ?[]const u8 = null,
/// Bitwise value of the enabled/disabled permissions, default: everyone permissions in guild
permissions: ?[][]const u8 = null,
/// RGB color value, default: 0
color: ?isize = null,
/// Whether the role should be displayed separately in the sidebar, default: false
hoist: ?bool = null,
/// Whether the role should be mentionable, default: false
mentionable: ?bool = null,
/// The role's unicode emoji (if the guild has the `ROLE_ICONS` feature)
unicodeEmoji: ?[]const u8 = null,
/// the role's icon image (if the guild has the `ROLE_ICONS` feature)
icon: ?[]const u8 = null,
};

View File

@ -1,88 +1,88 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const Snowflake = @import("snowflake.zig").Snowflake;
const ScheduledEventPrivacyLevel = @import("shared.zig").ScheduledEventPrivacyLevel;
const ScheduledEventStatus = @import("shared.zig").ScheduledEventStatus;
const ScheduledEventEntityType = @import("shared.zig").ScheduledEventEntityType;
const User = @import("user.zig").User;
const Snowflake = @import("snowflake.zig").Snowflake;
const ScheduledEventPrivacyLevel = @import("shared.zig").ScheduledEventPrivacyLevel;
const ScheduledEventStatus = @import("shared.zig").ScheduledEventStatus;
const ScheduledEventEntityType = @import("shared.zig").ScheduledEventEntityType;
const User = @import("user.zig").User;
pub const ScheduledEvent = struct {
/// the id of the scheduled event
id: Snowflake,
/// the guild id which the scheduled event belongs to
guild_id: Snowflake,
/// the channel id in which the scheduled event will be hosted if specified
channel_id: ?Snowflake,
/// the id of the user that created the scheduled event
creator_id: ?Snowflake,
/// the name of the scheduled event
name: []const u8,
/// the description of the scheduled event
description: ?[]const u8,
/// the time the scheduled event will start
scheduled_start_time: []const u8,
/// the time the scheduled event will end if it does end.
scheduled_end_time: ?[]const u8,
/// the privacy level of the scheduled event
privacy_level: ScheduledEventPrivacyLevel,
/// the status of the scheduled event
status: ScheduledEventStatus,
/// the type of hosting entity associated with a scheduled event
entity_type: ScheduledEventEntityType,
/// any additional id of the hosting entity associated with event
entity_id: ?Snowflake,
/// the entity metadata for the scheduled event
entity_metadata: ?ScheduledEventEntityMetadata,
/// the user that created the scheduled event
creator: ?User,
/// the isize of users subscribed to the scheduled event
user_count: ?isize,
/// the cover image hash of the scheduled event
image: ?[]const u8,
/// the definition for how often this event should recur
recurrence_rule: ?ScheduledEventRecurrenceRule,
};
pub const ScheduledEvent = struct {
/// the id of the scheduled event
id: Snowflake,
/// the guild id which the scheduled event belongs to
guild_id: Snowflake,
/// the channel id in which the scheduled event will be hosted if specified
channel_id: ?Snowflake = null,
/// the id of the user that created the scheduled event
creator_id: ?Snowflake = null,
/// the name of the scheduled event
name: []const u8,
/// the description of the scheduled event
description: ?[]const u8 = null,
/// the time the scheduled event will start
scheduled_start_time: []const u8,
/// the time the scheduled event will end if it does end.
scheduled_end_time: ?[]const u8 = null,
/// the privacy level of the scheduled event
privacy_level: ScheduledEventPrivacyLevel,
/// the status of the scheduled event
status: ScheduledEventStatus,
/// the type of hosting entity associated with a scheduled event
entity_type: ScheduledEventEntityType,
/// any additional id of the hosting entity associated with event
entity_id: ?Snowflake = null,
/// the entity metadata for the scheduled event
entity_metadata: ?ScheduledEventEntityMetadata = null,
/// the user that created the scheduled event
creator: ?User = null,
/// the isize of users subscribed to the scheduled event
user_count: ?isize = null,
/// the cover image hash of the scheduled event
image: ?[]const u8 = null,
/// the definition for how often this event should recur
recurrence_rule: ?ScheduledEventRecurrenceRule = null,
};
pub const ScheduledEventEntityMetadata = struct {
/// location of the event
location: ?[]const u8,
};
pub const ScheduledEventEntityMetadata = struct {
/// location of the event
location: ?[]const u8 = null,
};
pub const ScheduledEventRecurrenceRule = struct {
/// Starting time of the recurrence interval
start: []const u8,
/// Ending time of the recurrence interval
end: ?[]const u8,
/// How often the event occurs
frequency: ScheduledEventRecurrenceRuleFrequency,
/// The spacing between the events, defined by `frequency`. For example, `frequency` of `Weekly` and an `interval` of `2` would be "every-other week"
interval: isize,
/// Set of specific days within a week for the event to recur on
by_weekday: ?[]ScheduledEventRecurrenceRuleWeekday,
/// List of specific days within a specific week (1-5) to recur on
by_n_weekday: ?[]ScheduledEventRecurrenceRuleNWeekday,
/// Set of specific months to recur on
by_month: ?[]ScheduledEventRecurrenceRuleMonth,
/// Set of specific dates within a month to recur on
by_month_day: ?[]isize,
/// Set of days within a year to recur on (1-364)
by_year_day: ?[]isize,
/// The total amount of times that the event is allowed to recur before stopping
count: ?isize,
pub const ScheduledEventRecurrenceRule = struct {
/// Starting time of the recurrence interval
start: []const u8,
/// Ending time of the recurrence interval
end: ?[]const u8 = null,
/// How often the event occurs
frequency: ScheduledEventRecurrenceRuleFrequency,
/// The spacing between the events, defined by `frequency`. For example, `frequency` of `Weekly` and an `interval` of `2` would be "every-other week"
interval: isize,
/// Set of specific days within a week for the event to recur on
by_weekday: ?[]ScheduledEventRecurrenceRuleWeekday = null,
/// List of specific days within a specific week (1-5) to recur on
by_n_weekday: ?[]ScheduledEventRecurrenceRuleNWeekday = null,
/// Set of specific months to recur on
by_month: ?[]ScheduledEventRecurrenceRuleMonth = null,
/// Set of specific dates within a month to recur on
by_month_day: ?[]isize = null,
/// Set of days within a year to recur on (1-364)
by_year_day: ?[]isize = null,
/// The total amount of times that the event is allowed to recur before stopping
count: ?isize = null,
};
pub const ScheduledEventRecurrenceRuleFrequency = enum {

File diff suppressed because it is too large Load Diff

View File

@ -61,10 +61,11 @@ pub const Snowflake = enum(u64) {
/// std.json parse
pub fn jsonParse(allocator: std.mem.Allocator, src: anytype, _: std.json.ParseOptions) !@This() {
const value = try std.json.innerParse(std.json.Value, allocator, src, .{
.max_value_len = 0x100
});
.ignore_unknown_fields = true,
.max_value_len = 0x1000,
});
if (value != .string)
if (value == .string)
return Snowflake.fromRaw(value.string) catch
std.debug.panic("invalid snowflake: {s}\n", .{value.string});
unreachable;

View File

@ -1,67 +1,67 @@
const Snowflake = @import("snowflake.zig").Snowflake;
const User = @import("user.zig").User;
const StickerTypes = @import("shared.zig").StickerTypes;
const StickerFormatTypes = @import("shared.zig").StickerFormatTypes;
const Snowflake = @import("snowflake.zig").Snowflake;
const User = @import("user.zig").User;
const StickerTypes = @import("shared.zig").StickerTypes;
const StickerFormatTypes = @import("shared.zig").StickerFormatTypes;
/// https://discord.com/developers/docs/resources/sticker#sticker-object-sticker-structure
pub const Sticker = struct {
/// [Id of the sticker](https://discord.com/developers/docs/reference#image-formatting)
id: Snowflake,
/// Id of the pack the sticker is from
pack_id: ?Snowflake,
/// Name of the sticker
name: []const u8,
/// Description of the sticker
description: []const u8,
/// a unicode emoji representing the sticker's expression
tags: []const u8,
/// [type of sticker](https://discord.com/developers/docs/resources/sticker#sticker-object-sticker-types)
type: StickerTypes,
/// [Type of sticker format](https://discord.com/developers/docs/resources/sticker#sticker-object-sticker-format-types)
format_type: StickerFormatTypes,
/// Whether or not the sticker is available
available: ?bool,
/// Id of the guild that owns this sticker
guild_id: ?Snowflake,
/// The user that uploaded the sticker
user: ?User,
/// A sticker's sort order within a pack
sort_value: ?isize,
};
/// https://discord.com/developers/docs/resources/sticker#sticker-object-sticker-structure
pub const Sticker = struct {
/// [Id of the sticker](https://discord.com/developers/docs/reference#image-formatting)
id: Snowflake,
/// Id of the pack the sticker is from
pack_id: ?Snowflake = null,
/// Name of the sticker
name: []const u8,
/// Description of the sticker
description: []const u8,
/// a unicode emoji representing the sticker's expression
tags: []const u8,
/// [type of sticker](https://discord.com/developers/docs/resources/sticker#sticker-object-sticker-types)
type: StickerTypes,
/// [Type of sticker format](https://discord.com/developers/docs/resources/sticker#sticker-object-sticker-format-types)
format_type: StickerFormatTypes,
/// Whether or not the sticker is available
available: ?bool = null,
/// Id of the guild that owns this sticker
guild_id: ?Snowflake = null,
/// The user that uploaded the sticker
user: ?User = null,
/// A sticker's sort order within a pack
sort_value: ?isize = null,
};
/// https://discord.com/developers/docs/resources/sticker#sticker-item-object-sticker-item-structure
pub const StickerItem = struct {
/// Id of the sticker
id: Snowflake,
/// Name of the sticker
name: []const u8,
/// [Type of sticker format](https://discord.com/developers/docs/resources/sticker#sticker-object-sticker-format-types)
format_type: StickerFormatTypes,
};
/// https://discord.com/developers/docs/resources/sticker#sticker-item-object-sticker-item-structure
pub const StickerItem = struct {
/// Id of the sticker
id: Snowflake,
/// Name of the sticker
name: []const u8,
/// [Type of sticker format](https://discord.com/developers/docs/resources/sticker#sticker-object-sticker-format-types)
format_type: StickerFormatTypes,
};
/// https://discord.com/developers/docs/resources/sticker#sticker-pack-object-sticker-pack-structure
pub const StickerPack = struct {
/// id of the sticker pack
id: Snowflake,
/// the stickers in the pack
stickers: []Sticker,
/// name of the sticker pack
name: []const u8,
/// id of the pack's SKU
sku_id: Snowflake,
/// id of a sticker in the pack which is shown as the pack's icon
cover_sticker_id: ?Snowflake,
/// description of the sticker pack
description: []const u8,
/// id of the sticker pack's [banner image](https://discord.com/developers/docs/reference#image-formatting)
banner_asset_id: ?Snowflake,
};
/// https://discord.com/developers/docs/resources/sticker#sticker-pack-object-sticker-pack-structure
pub const StickerPack = struct {
/// id of the sticker pack
id: Snowflake,
/// the stickers in the pack
stickers: []Sticker,
/// name of the sticker pack
name: []const u8,
/// id of the pack's SKU
sku_id: Snowflake,
/// id of a sticker in the pack which is shown as the pack's icon
cover_sticker_id: ?Snowflake = null,
/// description of the sticker pack
description: []const u8,
/// id of the sticker pack's [banner image](https://discord.com/developers/docs/reference#image-formatting)
banner_asset_id: ?Snowflake = null,
};
pub const CreateModifyGuildSticker = struct {
/// name of the sticker (2-30 characters)
name: ?[]const u8,
/// description of the sticker (2-100 characters)
description: ?[]const u8,
/// autocomplete/suggestion tags for the sticker (max 200 characters)
tags: ?[]const u8,
pub const CreateModifyGuildSticker = struct {
/// name of the sticker (2-30 characters)
name: ?[]const u8 = null,
/// description of the sticker (2-100 characters)
description: ?[]const u8 = null,
/// autocomplete/suggestion tags for the sticker (max 200 characters)
tags: ?[]const u8 = null,
};

View File

@ -1,26 +1,26 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const Snowflake = @import("snowflake.zig").Snowflake;
const TeamMembershipStates = @import("shared.zig").TeamMembershipStates;
const Snowflake = @import("snowflake.zig").Snowflake;
const TeamMembershipStates = @import("shared.zig").TeamMembershipStates;
/// https://discord.com/developers/docs/topics/teams#data-models-team-object
pub const Team = struct {
/// Hash of the image of the team's icon
icon: ?[]const u8,
/// https://discord.com/developers/docs/topics/teams#data-models-team-object
pub const Team = struct {
/// Hash of the image of the team's icon
icon: ?[]const u8 = null,
/// Unique ID of the team
id: Snowflake,
/// Members of the team

View File

@ -1,134 +1,134 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const Snowflake = @import("snowflake.zig").Snowflake;
const Channel = @import("channel.zig").Channel;
const ChannelTypes = @import("shared.zig").ChannelTypes;
const MessageFlags = @import("shared.zig").MessageFlags;
const Embed = @import("embed.zig").Embed;
const Partial = @import("partial.zig").Partial;
const Attachment = @import("attachment.zig").Attachment;
const AllowedMentions = @import("message.zig").AllowedMentions;
const MessageComponent = @import("message.zig").MessageComponent;
const Snowflake = @import("snowflake.zig").Snowflake;
const Channel = @import("channel.zig").Channel;
const ChannelTypes = @import("shared.zig").ChannelTypes;
const MessageFlags = @import("shared.zig").MessageFlags;
const Embed = @import("embed.zig").Embed;
const Partial = @import("partial.zig").Partial;
const Attachment = @import("attachment.zig").Attachment;
const AllowedMentions = @import("message.zig").AllowedMentions;
const MessageComponent = @import("message.zig").MessageComponent;
pub const ThreadMetadata = struct {
/// Whether the thread is archived
archived: bool,
/// Duration in minutes to automatically archive the thread after recent activity
auto_archive_duration: isize,
/// When a thread is locked, only users with `MANAGE_THREADS` can unarchive it
locked: bool,
/// whether non-moderators can add other non-moderators to a thread; only available on private threads
invitable: ?bool,
/// Timestamp when the thread's archive status was last changed, used for calculating recent activity
archive_timestamp: []const u8,
/// Timestamp when the thread was created; only populated for threads created after 2022-01-09
create_timestamp: ?[]const u8,
};
pub const ThreadMember = struct {
/// Any user-thread settings, currently only used for notifications
flags: isize,
/// The id of the thread
id: Snowflake,
/// The id of the user
user_id: Snowflake,
/// The time the current user last joined the thread
join_timestamp: []const u8,
};
pub const ListActiveThreads = struct {
/// The active threads
threads: []Channel,
/// A thread member object for each returned thread the current user has joined
members: []ThreadMember,
};
pub const ListArchivedThreads = struct {
/// The active threads
threads: []Channel,
/// A thread member object for each returned thread the current user has joined
members: []ThreadMember,
/// Whether there are potentially additional threads that could be returned on a subsequent call
has_more: bool,
};
pub const ThreadListSync = struct {
/// The id of the guild
guild_id: Snowflake,
/// The parent channel ids whose threads are being synced. If omitted, then threads were synced for the entire guild. This array may contain channelIds that have no active threads as well, so you know to clear that data
channel_ids: ?[][]const u8,
/// All active threads in the given channels that the current user can access
threads: []Channel,
/// All thread member objects from the synced threads for the current user, indicating which threads the current user has been added to
members: []ThreadMember,
};
/// https://discord.com/developers/docs/resources/channel#start-thread-from-message
pub const StartThreadFromMessage = struct {
/// 1-100 character thread name
name: []const u8,
/// Duration in minutes to automatically archive the thread after recent activity
auto_archive_duration: ?isize,
/// Amount of seconds a user has to wait before sending another message (0-21600)
rate_limit_per_user: ?isize,
};
/// https://discord.com/developers/docs/resources/channel#start-thread-without-message
pub const StartThreadWithoutMessage = struct {
/// 1-100 character thread name,
name: []const u8,
/// Duration in minutes to automatically archive the thread after recent activity,
auto_archive_duration: isize,
/// Amount of seconds a user has to wait before sending another message (0-21600),
rateLimitPerUser: ?isize,
/// the type of thread to create,
/// may only be AnnouncementThread, PublicThread, or PrivateThread
type: ChannelTypes,
/// whether non-moderators can add other non-moderators to a thread; only available when creating a private thread,
invitable: ?bool,
};
/// https://discord.com/developers/docs/resources/channel#start-thread-in-forum-or-media-channel-forum-and-media-thread-message-params-object
pub const CreateForumAndMediaThreadMessage = struct {
/// Message contents (up to 2000 characters)
content: ?[]const u8,
/// Up to 10 rich embeds (up to 6000 characters)
embeds: ?[]Embed,
/// Allowed mentions for the message
allowed_mentions: ?AllowedMentions,
/// Components to include with the message
components: ?[]MessageComponent,
/// IDs of up to 3 stickers in the server to send in the message
sticker_ids: ?[]Snowflake,
/// Attachment objects with filename and description. See Uploading Files
attachments: ?[]Partial(Attachment),
/// Message flags combined as a bitfield (only SUPPRESS_EMBEDS and SUPPRESS_NOTIFICATIONS can be set)
flags: ?MessageFlags,
};
pub const StartThreadInForumOrMediaChannel = struct {
/// 1-100 character channel name
name: []const u8,
/// Duration in minutes to automatically archive the thread after recent activity, can be set to: 60, 1440, 4320, 10080
auto_archive_duration: ?isize,
/// Amount of seconds a user has to wait before sending another message (0-21600)
rate_limit_per_user: ?isize,
/// Contents of the first message in the forum/media thread
message: CreateForumAndMediaThreadMessage,
/// The IDs of the set of tags that have been applied to a thread in a GUILD_FORUM or a GUILD_MEDIA channel
applied_tags: ?[]Snowflake,
pub const ThreadMetadata = struct {
/// Whether the thread is archived
archived: bool,
/// Duration in minutes to automatically archive the thread after recent activity
auto_archive_duration: isize,
/// When a thread is locked, only users with `MANAGE_THREADS` can unarchive it
locked: bool,
/// whether non-moderators can add other non-moderators to a thread; only available on private threads
invitable: ?bool = null,
/// Timestamp when the thread's archive status was last changed, used for calculating recent activity
archive_timestamp: []const u8,
/// Timestamp when the thread was created; only populated for threads created after 2022-01-09
create_timestamp: ?[]const u8 = null,
};
pub const ThreadMember = struct {
/// Any user-thread settings, currently only used for notifications
flags: isize,
/// The id of the thread
id: Snowflake,
/// The id of the user
user_id: Snowflake,
/// The time the current user last joined the thread
join_timestamp: []const u8,
};
pub const ListActiveThreads = struct {
/// The active threads
threads: []Channel,
/// A thread member object for each returned thread the current user has joined
members: []ThreadMember,
};
pub const ListArchivedThreads = struct {
/// The active threads
threads: []Channel,
/// A thread member object for each returned thread the current user has joined
members: []ThreadMember,
/// Whether there are potentially additional threads that could be returned on a subsequent call
has_more: bool,
};
pub const ThreadListSync = struct {
/// The id of the guild
guild_id: Snowflake,
/// The parent channel ids whose threads are being synced. If omitted, then threads were synced for the entire guild. This array may contain channelIds that have no active threads as well, so you know to clear that data
channel_ids: ?[][]const u8 = null,
/// All active threads in the given channels that the current user can access
threads: []Channel,
/// All thread member objects from the synced threads for the current user, indicating which threads the current user has been added to
members: []ThreadMember,
};
/// https://discord.com/developers/docs/resources/channel#start-thread-from-message
pub const StartThreadFromMessage = struct {
/// 1-100 character thread name
name: []const u8,
/// Duration in minutes to automatically archive the thread after recent activity
auto_archive_duration: ?isize = null,
/// Amount of seconds a user has to wait before sending another message (0-21600)
rate_limit_per_user: ?isize = null,
};
/// https://discord.com/developers/docs/resources/channel#start-thread-without-message
pub const StartThreadWithoutMessage = struct {
/// 1-100 character thread name,
name: []const u8,
/// Duration in minutes to automatically archive the thread after recent activity,
auto_archive_duration: isize,
/// Amount of seconds a user has to wait before sending another message (0-21600),
rateLimitPerUser: ?isize = null,
/// the type of thread to create,
/// may only be AnnouncementThread, PublicThread, or PrivateThread
type: ChannelTypes,
/// whether non-moderators can add other non-moderators to a thread; only available when creating a private thread,
invitable: ?bool = null,
};
/// https://discord.com/developers/docs/resources/channel#start-thread-in-forum-or-media-channel-forum-and-media-thread-message-params-object
pub const CreateForumAndMediaThreadMessage = struct {
/// Message contents (up to 2000 characters)
content: ?[]const u8 = null,
/// Up to 10 rich embeds (up to 6000 characters)
embeds: ?[]Embed = null,
/// Allowed mentions for the message
allowed_mentions: ?AllowedMentions = null,
/// Components to include with the message
components: ?[]MessageComponent = null,
/// IDs of up to 3 stickers in the server to send in the message
sticker_ids: ?[]Snowflake = null,
/// Attachment objects with filename and description. See Uploading Files
attachments: ?[]Partial(Attachment) = null,
/// Message flags combined as a bitfield (only SUPPRESS_EMBEDS and SUPPRESS_NOTIFICATIONS can be set)
flags: ?MessageFlags = null,
};
pub const StartThreadInForumOrMediaChannel = struct {
/// 1-100 character channel name
name: []const u8,
/// Duration in minutes to automatically archive the thread after recent activity, can be set to: 60, 1440, 4320, 10080
auto_archive_duration: ?isize = null,
/// Amount of seconds a user has to wait before sending another message (0-21600)
rate_limit_per_user: ?isize = null,
/// Contents of the first message in the forum/media thread
message: CreateForumAndMediaThreadMessage,
/// The IDs of the set of tags that have been applied to a thread in a GUILD_FORUM or a GUILD_MEDIA channel
applied_tags: ?[]Snowflake = null,
};

View File

@ -1,351 +1,352 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
// shared.zig
pub const PresenceStatus = @import("shared.zig").PresenceStatus;
pub const PremiumTypes = @import("shared.zig").PremiumTypes;
pub const UserFlags = @import("shared.zig").UserFlags;
pub const PremiumUsageFlags = @import("shared.zig").PremiumUsageFlags;
pub const PurchasedFlags = @import("shared.zig").PurchasedFlags;
pub const MemberFlags = @import("shared.zig").MemberFlags;
pub const ChannelFlags = @import("shared.zig").ChannelFlags;
pub const RoleFlags = @import("shared.zig").RoleFlags;
pub const AttachmentFlags = @import("shared.zig").AttachmentFlags;
pub const SkuFlags = @import("shared.zig").SkuFlags;
pub const MessageFlags = @import("shared.zig").MessageFlags;
pub const ActivityFlags = @import("shared.zig").ActivityFlags;
pub const IntegrationExpireBehaviors = @import("shared.zig").IntegrationExpireBehaviors;
pub const TeamMembershipStates = @import("shared.zig").TeamMembershipStates;
pub const ApplicationFlags = @import("shared.zig").ApplicationFlags;
pub const MessageComponentTypes = @import("shared.zig").MessageComponentTypes;
pub const TextStyles = @import("shared.zig").TextStyles;
pub const ButtonStyles = @import("shared.zig").ButtonStyles;
pub const AllowedMentionsTypes = @import("shared.zig").AllowedMentionsTypes;
pub const WebhookTypes = @import("shared.zig").WebhookTypes;
pub const EmbedTypes = @import("shared.zig").EmbedTypes;
pub const DefaultMessageNotificationLevels = @import("shared.zig").DefaultMessageNotificationLevels;
pub const ExplicitContentFilterLevels = @import("shared.zig").ExplicitContentFilterLevels;
pub const VerificationLevels = @import("shared.zig").VerificationLevels;
pub const GuildFeatures = @import("shared.zig").GuildFeatures;
pub const MfaLevels = @import("shared.zig").MfaLevels;
pub const SystemChannelFlags = @import("shared.zig").SystemChannelFlags;
pub const PremiumTiers = @import("shared.zig").PremiumTiers;
pub const GuildNsfwLevel = @import("shared.zig").GuildNsfwLevel;
pub const ChannelTypes = @import("shared.zig").ChannelTypes;
pub const OverwriteTypes = @import("shared.zig").OverwriteTypes;
pub const VideoQualityModes = @import("shared.zig").VideoQualityModes;
pub const ActivityTypes = @import("shared.zig").ActivityTypes;
pub const MessageTypes = @import("shared.zig").MessageTypes;
pub const MessageActivityTypes = @import("shared.zig").MessageActivityTypes;
pub const StickerTypes = @import("shared.zig").StickerTypes;
pub const StickerFormatTypes = @import("shared.zig").StickerFormatTypes;
pub const InteractionTypes = @import("shared.zig").InteractionTypes;
pub const ApplicationCommandOptionTypes = @import("shared.zig").ApplicationCommandOptionTypes;
pub const AuditLogEvents = @import("shared.zig").AuditLogEvents;
pub const ScheduledEventPrivacyLevel = @import("shared.zig").ScheduledEventPrivacyLevel;
pub const ScheduledEventEntityType = @import("shared.zig").ScheduledEventEntityType;
pub const ScheduledEventStatus = @import("shared.zig").ScheduledEventStatus;
pub const TargetTypes = @import("shared.zig").TargetTypes;
pub const ApplicationCommandTypes = @import("shared.zig").ApplicationCommandTypes;
pub const ApplicationCommandPermissionTypes = @import("shared.zig").ApplicationCommandPermissionTypes;
pub const BitwisePermissionFlags = @import("shared.zig").BitwisePermissionFlags;
pub const PermissionStrings = @import("shared.zig").PermissionStrings;
pub const GatewayCloseEventCodes = @import("shared.zig").GatewayCloseEventCodes;
pub const GatewayOpcodes = @import("shared.zig").GatewayOpcodes;
pub const GatewayDispatchEventNames = @import("shared.zig").GatewayDispatchEventNames;
pub const GatewayIntents = @import("shared.zig").GatewayIntents;
pub const Intents = @import("shared.zig").Intents;
pub const InteractionResponseTypes = @import("shared.zig").InteractionResponseTypes;
pub const SortOrderTypes = @import("shared.zig").SortOrderTypes;
pub const ForumLayout = @import("shared.zig").ForumLayout;
pub const ImageFormat = @import("shared.zig").ImageFormat;
pub const ImageSize = @import("shared.zig").ImageSize;
pub const Locales = @import("shared.zig").Locales;
pub const OAuth2Scope = @import("shared.zig").OAuth2Scope;
// partial.zig
pub const Partial = @import("partial.zig").Partial;
// snowflake.zig
pub const discord_epoch = @import("snowflake.zig").discord_epoch;
pub const Snowflake = @import("snowflake.zig").Snowflake;
// events.zig
pub const GuildMembersChunk = @import("events.zig").GuildMembersChunk;
pub const ChannelPinsUpdate = @import("events.zig").ChannelPinsUpdate;
pub const GuildRoleDelete = @import("events.zig").GuildRoleDelete;
pub const GuildBanAddRemove = @import("events.zig").GuildBanAddRemove;
pub const MessageReactionRemove = @import("events.zig").MessageReactionRemove;
pub const MessageReactionAdd = @import("events.zig").MessageReactionAdd;
pub const VoiceServerUpdate = @import("events.zig").VoiceServerUpdate;
pub const VoiceChannelEffectSend = @import("events.zig").VoiceChannelEffectSend;
pub const VoiceChannelEffectAnimationType = @import("events.zig").VoiceChannelEffectAnimationType;
pub const InviteCreate = @import("events.zig").InviteCreate;
pub const Hello = @import("events.zig").Hello;
pub const Ready = @import("events.zig").Ready;
pub const UnavailableGuild = @import("events.zig").UnavailableGuild;
pub const MessageDeleteBulk = @import("events.zig").MessageDeleteBulk;
pub const Template = @import("events.zig").Template;
pub const TemplateSerializedSourceGuild = @import("events.zig").TemplateSerializedSourceGuild;
pub const GuildMemberAdd = @import("events.zig").GuildMemberAdd;
pub const MessageDelete = @import("events.zig").MessageDelete;
pub const ThreadMembersUpdate = @import("events.zig").ThreadMembersUpdate;
pub const ThreadMemberUpdate = @import("events.zig").ThreadMemberUpdate;
pub const GuildRoleCreate = @import("events.zig").GuildRoleCreate;
pub const GuildEmojisUpdate = @import("events.zig").GuildEmojisUpdate;
pub const GuildStickersUpdate = @import("events.zig").GuildStickersUpdate;
pub const GuildMemberUpdate = @import("events.zig").GuildMemberUpdate;
pub const MessageReactionRemoveAll = @import("events.zig").MessageReactionRemoveAll;
pub const GuildRoleUpdate = @import("events.zig").GuildRoleUpdate;
pub const ScheduledEventUserAdd = @import("events.zig").ScheduledEventUserAdd;
pub const MessageReactionRemoveEmoji = @import("events.zig").MessageReactionRemoveEmoji;
pub const GuildMemberRemove = @import("events.zig").GuildMemberRemove;
pub const Ban = @import("events.zig").Ban;
pub const ScheduledEventUserRemove = @import("events.zig").ScheduledEventUserRemove;
pub const InviteDelete = @import("events.zig").InviteDelete;
pub const VoiceRegion = @import("events.zig").VoiceRegion;
pub const GuildWidgetSettings = @import("events.zig").GuildWidgetSettings;
pub const ModifyChannel = @import("events.zig").ModifyChannel;
pub const CreateGuildEmoji = @import("events.zig").CreateGuildEmoji;
pub const ModifyGuildEmoji = @import("events.zig").ModifyGuildEmoji;
pub const CreateGuildChannel = @import("events.zig").CreateGuildChannel;
pub const CreateMessage = @import("events.zig").CreateMessage;
pub const ModifyGuildWelcomeScreen = @import("events.zig").ModifyGuildWelcomeScreen;
pub const FollowAnnouncementChannel = @import("events.zig").FollowAnnouncementChannel;
pub const EditChannelPermissionOverridesOptions = @import("events.zig").EditChannelPermissionOverridesOptions;
pub const CreateWebhook = @import("events.zig").CreateWebhook;
pub const CreateForumPostWithMessage = @import("events.zig").CreateForumPostWithMessage;
pub const ArchivedThreads = @import("events.zig").ArchivedThreads;
pub const ActiveThreads = @import("events.zig").ActiveThreads;
pub const VanityUrl = @import("events.zig").VanityUrl;
pub const PrunedCount = @import("events.zig").PrunedCount;
pub const TeamMemberRole = @import("events.zig").TeamMemberRole;
pub const BulkBan = @import("events.zig").BulkBan;
// shared.zig
pub const PresenceStatus = @import("shared.zig").PresenceStatus;
pub const PremiumTypes = @import("shared.zig").PremiumTypes;
pub const UserFlags = @import("shared.zig").UserFlags;
pub const PremiumUsageFlags = @import("shared.zig").PremiumUsageFlags;
pub const PurchasedFlags = @import("shared.zig").PurchasedFlags;
pub const MemberFlags = @import("shared.zig").MemberFlags;
pub const ChannelFlags = @import("shared.zig").ChannelFlags;
pub const RoleFlags = @import("shared.zig").RoleFlags;
pub const AttachmentFlags = @import("shared.zig").AttachmentFlags;
pub const SkuFlags = @import("shared.zig").SkuFlags;
pub const MessageFlags = @import("shared.zig").MessageFlags;
pub const ActivityFlags = @import("shared.zig").ActivityFlags;
pub const IntegrationExpireBehaviors = @import("shared.zig").IntegrationExpireBehaviors;
pub const TeamMembershipStates = @import("shared.zig").TeamMembershipStates;
pub const ApplicationFlags = @import("shared.zig").ApplicationFlags;
pub const MessageComponentTypes = @import("shared.zig").MessageComponentTypes;
pub const TextStyles = @import("shared.zig").TextStyles;
pub const ButtonStyles = @import("shared.zig").ButtonStyles;
pub const AllowedMentionsTypes = @import("shared.zig").AllowedMentionsTypes;
pub const WebhookTypes = @import("shared.zig").WebhookTypes;
pub const EmbedTypes = @import("shared.zig").EmbedTypes;
pub const DefaultMessageNotificationLevels = @import("shared.zig").DefaultMessageNotificationLevels;
pub const ExplicitContentFilterLevels = @import("shared.zig").ExplicitContentFilterLevels;
pub const VerificationLevels = @import("shared.zig").VerificationLevels;
pub const GuildFeatures = @import("shared.zig").GuildFeatures;
pub const MfaLevels = @import("shared.zig").MfaLevels;
pub const SystemChannelFlags = @import("shared.zig").SystemChannelFlags;
pub const PremiumTiers = @import("shared.zig").PremiumTiers;
pub const GuildNsfwLevel = @import("shared.zig").GuildNsfwLevel;
pub const ChannelTypes = @import("shared.zig").ChannelTypes;
pub const OverwriteTypes = @import("shared.zig").OverwriteTypes;
pub const VideoQualityModes = @import("shared.zig").VideoQualityModes;
pub const ActivityTypes = @import("shared.zig").ActivityTypes;
pub const MessageTypes = @import("shared.zig").MessageTypes;
pub const MessageActivityTypes = @import("shared.zig").MessageActivityTypes;
pub const StickerTypes = @import("shared.zig").StickerTypes;
pub const StickerFormatTypes = @import("shared.zig").StickerFormatTypes;
pub const InteractionTypes = @import("shared.zig").InteractionTypes;
pub const ApplicationCommandOptionTypes = @import("shared.zig").ApplicationCommandOptionTypes;
pub const AuditLogEvents = @import("shared.zig").AuditLogEvents;
pub const ScheduledEventPrivacyLevel = @import("shared.zig").ScheduledEventPrivacyLevel;
pub const ScheduledEventEntityType = @import("shared.zig").ScheduledEventEntityType;
pub const ScheduledEventStatus = @import("shared.zig").ScheduledEventStatus;
pub const TargetTypes = @import("shared.zig").TargetTypes;
pub const ApplicationCommandTypes = @import("shared.zig").ApplicationCommandTypes;
pub const ApplicationCommandPermissionTypes = @import("shared.zig").ApplicationCommandPermissionTypes;
pub const BitwisePermissionFlags = @import("shared.zig").BitwisePermissionFlags;
pub const PermissionStrings = @import("shared.zig").PermissionStrings;
pub const GatewayCloseEventCodes = @import("shared.zig").GatewayCloseEventCodes;
pub const GatewayOpcodes = @import("shared.zig").GatewayOpcodes;
pub const GatewayDispatchEventNames = @import("shared.zig").GatewayDispatchEventNames;
pub const GatewayIntents = @import("shared.zig").GatewayIntents;
pub const Intents = @import("shared.zig").Intents;
pub const InteractionResponseTypes = @import("shared.zig").InteractionResponseTypes;
pub const SortOrderTypes = @import("shared.zig").SortOrderTypes;
pub const ForumLayout = @import("shared.zig").ForumLayout;
pub const ImageFormat = @import("shared.zig").ImageFormat;
pub const ImageSize = @import("shared.zig").ImageSize;
pub const Locales = @import("shared.zig").Locales;
pub const OAuth2Scope = @import("shared.zig").OAuth2Scope;
// partial.zig
pub const Partial = @import("partial.zig").Partial;
// snowflake.zig
pub const discord_epoch = @import("snowflake.zig").discord_epoch;
pub const Snowflake = @import("snowflake.zig").Snowflake;
// events.zig
pub const GuildMembersChunk = @import("events.zig").GuildMembersChunk;
pub const ChannelPinsUpdate = @import("events.zig").ChannelPinsUpdate;
pub const GuildRoleDelete = @import("events.zig").GuildRoleDelete;
pub const GuildBanAddRemove = @import("events.zig").GuildBanAddRemove;
pub const MessageReactionRemove = @import("events.zig").MessageReactionRemove;
pub const MessageReactionAdd = @import("events.zig").MessageReactionAdd;
pub const VoiceServerUpdate = @import("events.zig").VoiceServerUpdate;
pub const VoiceChannelEffectSend = @import("events.zig").VoiceChannelEffectSend;
pub const VoiceChannelEffectAnimationType = @import("events.zig").VoiceChannelEffectAnimationType;
pub const InviteCreate = @import("events.zig").InviteCreate;
pub const Hello = @import("events.zig").Hello;
pub const Ready = @import("events.zig").Ready;
pub const UnavailableGuild = @import("events.zig").UnavailableGuild;
pub const MessageDeleteBulk = @import("events.zig").MessageDeleteBulk;
pub const Template = @import("events.zig").Template;
pub const TemplateSerializedSourceGuild = @import("events.zig").TemplateSerializedSourceGuild;
pub const GuildMemberAdd = @import("events.zig").GuildMemberAdd;
pub const MessageDelete = @import("events.zig").MessageDelete;
pub const ThreadMembersUpdate = @import("events.zig").ThreadMembersUpdate;
pub const ThreadMemberUpdate = @import("events.zig").ThreadMemberUpdate;
pub const GuildRoleCreate = @import("events.zig").GuildRoleCreate;
pub const GuildEmojisUpdate = @import("events.zig").GuildEmojisUpdate;
pub const GuildStickersUpdate = @import("events.zig").GuildStickersUpdate;
pub const GuildMemberUpdate = @import("events.zig").GuildMemberUpdate;
pub const MessageReactionRemoveAll = @import("events.zig").MessageReactionRemoveAll;
pub const GuildRoleUpdate = @import("events.zig").GuildRoleUpdate;
pub const ScheduledEventUserAdd = @import("events.zig").ScheduledEventUserAdd;
pub const MessageReactionRemoveEmoji = @import("events.zig").MessageReactionRemoveEmoji;
pub const GuildMemberRemove = @import("events.zig").GuildMemberRemove;
pub const Ban = @import("events.zig").Ban;
pub const ScheduledEventUserRemove = @import("events.zig").ScheduledEventUserRemove;
pub const InviteDelete = @import("events.zig").InviteDelete;
pub const VoiceRegion = @import("events.zig").VoiceRegion;
pub const GuildWidgetSettings = @import("events.zig").GuildWidgetSettings;
pub const ModifyChannel = @import("events.zig").ModifyChannel;
pub const CreateGuildEmoji = @import("events.zig").CreateGuildEmoji;
pub const ModifyGuildEmoji = @import("events.zig").ModifyGuildEmoji;
pub const CreateGuildChannel = @import("events.zig").CreateGuildChannel;
pub const CreateMessage = @import("events.zig").CreateMessage;
pub const ModifyGuildWelcomeScreen = @import("events.zig").ModifyGuildWelcomeScreen;
pub const FollowAnnouncementChannel = @import("events.zig").FollowAnnouncementChannel;
pub const EditChannelPermissionOverridesOptions = @import("events.zig").EditChannelPermissionOverridesOptions;
pub const CreateWebhook = @import("events.zig").CreateWebhook;
pub const CreateForumPostWithMessage = @import("events.zig").CreateForumPostWithMessage;
pub const ArchivedThreads = @import("events.zig").ArchivedThreads;
pub const ActiveThreads = @import("events.zig").ActiveThreads;
pub const VanityUrl = @import("events.zig").VanityUrl;
pub const PrunedCount = @import("events.zig").PrunedCount;
pub const TeamMemberRole = @import("events.zig").TeamMemberRole;
pub const BulkBan = @import("events.zig").BulkBan;
// application.zig
pub const Application = @import("application.zig").Application;
pub const ApplicationIntegrationTypeConfiguration = @import("application.zig").ApplicationIntegrationTypeConfiguration;
pub const ApplicationIntegrationType = @import("application.zig").ApplicationIntegrationType;
pub const InstallParams = @import("application.zig").InstallParams;
pub const ModifyApplication = @import("application.zig").ModifyApplication;
pub const ApplicationEventWebhookStatus = @import("application.zig").ApplicationEventWebhookStatus;
pub const WebhookEventType = @import("application.zig").WebhookEventType;
// attachment.zig
pub const Attachment = @import("attachment.zig").Attachment;
// auditlog.zig
pub const AuditLog = @import("auditlog.zig").AuditLog;
pub const AuditLogEntry = @import("auditlog.zig").AuditLogEntry;
pub const OptionalAuditEntryInfo = @import("auditlog.zig").OptionalAuditEntryInfo;
pub const AuditLogChange = @import("auditlog.zig").AuditLogChange;
// automod.zig
pub const AutoModerationRule = @import("automod.zig").AutoModerationRule;
pub const AutoModerationEventTypes = @import("automod.zig").AutoModerationEventTypes;
pub const AutoModerationTriggerTypes = @import("automod.zig").AutoModerationTriggerTypes;
pub const AutoModerationRuleTriggerMetadata = @import("automod.zig").AutoModerationRuleTriggerMetadata;
pub const AutoModerationRuleTriggerMetadataPresets = @import("automod.zig").AutoModerationRuleTriggerMetadataPresets;
pub const AutoModerationAction = @import("automod.zig").AutoModerationAction;
pub const AutoModerationActionType = @import("automod.zig").AutoModerationActionType;
pub const AutoModerationActionMetadata = @import("automod.zig").AutoModerationActionMetadata;
pub const AutoModerationActionExecution = @import("automod.zig").AutoModerationActionExecution;
// channel.zig
pub const TypingStart = @import("channel.zig").TypingStart;
pub const Channel = @import("channel.zig").Channel;
pub const WelcomeScreen = @import("channel.zig").WelcomeScreen;
pub const WelcomeScreenChannel = @import("channel.zig").WelcomeScreenChannel;
pub const StageInstance = @import("channel.zig").StageInstance;
pub const Overwrite = @import("channel.zig").Overwrite;
pub const FollowedChannel = @import("channel.zig").FollowedChannel;
pub const ForumTag = @import("channel.zig").ForumTag;
pub const DefaultReactionEmoji = @import("channel.zig").DefaultReactionEmoji;
pub const ModifyGuildChannelPositions = @import("channel.zig").ModifyGuildChannelPositions;
pub const CreateChannelInvite = @import("channel.zig").CreateChannelInvite;
// command.zig
pub const ApplicationCommand = @import("command.zig").ApplicationCommand;
pub const CreateApplicationCommand = @import("command.zig").CreateApplicationCommand;
pub const LocaleMap = @import("command.zig").LocaleMap;
pub const InteractionEntryPointCommandHandlerType = @import("command.zig").InteractionEntryPointCommandHandlerType;
pub const ApplicationCommandOption = @import("command.zig").ApplicationCommandOption;
pub const ApplicationCommandOptionChoice = @import("command.zig").ApplicationCommandOptionChoice;
pub const GuildApplicationCommandPermissions = @import("command.zig").GuildApplicationCommandPermissions;
pub const ApplicationCommandPermissions = @import("command.zig").ApplicationCommandPermissions;
// component.zig
pub const Button = @import("component.zig").Button;
pub const SelectOption = @import("component.zig").SelectOption;
pub const DefaultValue = @import("component.zig").DefaultValue;
pub const SelectMenuString = @import("component.zig").SelectMenuString;
pub const SelectMenuUsers = @import("component.zig").SelectMenuUsers;
pub const SelectMenuRoles = @import("component.zig").SelectMenuRoles;
pub const SelectMenuUsersAndRoles = @import("component.zig").SelectMenuUsersAndRoles;
pub const SelectMenuChannels = @import("component.zig").SelectMenuChannels;
pub const SelectMenu = @import("component.zig").SelectMenu;
pub const InputTextStyles = @import("component.zig").InputTextStyles;
pub const InputText = @import("component.zig").InputText;
pub const MessageComponent = @import("component.zig").MessageComponent;
// embed.zig
pub const Embed = @import("embed.zig").Embed;
pub const EmbedAuthor = @import("embed.zig").EmbedAuthor;
pub const EmbedField = @import("embed.zig").EmbedField;
pub const EmbedFooter = @import("embed.zig").EmbedFooter;
pub const EmbedImage = @import("embed.zig").EmbedImage;
pub const EmbedProvider = @import("embed.zig").EmbedProvider;
pub const EmbedThumbnail = @import("embed.zig").EmbedThumbnail;
pub const EmbedVideo = @import("embed.zig").EmbedVideo;
// emoji.zig
pub const Emoji = @import("emoji.zig").Emoji;
// gateway.zig
pub const GetGatewayBot = @import("gateway.zig").GetGatewayBot;
pub const SessionStartLimit = @import("gateway.zig").SessionStartLimit;
pub const PresenceUpdate = @import("gateway.zig").PresenceUpdate;
pub const Activity = @import("gateway.zig").Activity;
pub const ActivityInstance = @import("gateway.zig").ActivityInstance;
pub const ActivityLocation = @import("gateway.zig").ActivityLocation;
pub const ActivityLocationKind = @import("gateway.zig").ActivityLocationKind;
pub const ClientStatus = @import("gateway.zig").ClientStatus;
pub const ActivityTimestamps = @import("gateway.zig").ActivityTimestamps;
pub const ActivityEmoji = @import("gateway.zig").ActivityEmoji;
pub const ActivityParty = @import("gateway.zig").ActivityParty;
pub const ActivityAssets = @import("gateway.zig").ActivityAssets;
pub const ActivitySecrets = @import("gateway.zig").ActivitySecrets;
pub const ActivityButton = @import("gateway.zig").ActivityButton;
// guild.zig
pub const Guild = @import("guild.zig").Guild;
pub const VoiceState = @import("guild.zig").VoiceState;
pub const GuildWidget = @import("guild.zig").GuildWidget;
pub const GuildPreview = @import("guild.zig").GuildPreview;
pub const CreateGuild = @import("guild.zig").CreateGuild;
pub const ModifyGuild = @import("guild.zig").ModifyGuild;
pub const CreateGuildBan = @import("guild.zig").CreateGuildBan;
pub const GetGuildPruneCountQuery = @import("guild.zig").GetGuildPruneCountQuery;
pub const BeginGuildPrune = @import("guild.zig").BeginGuildPrune;
pub const ModifyGuildOnboarding = @import("guild.zig").ModifyGuildOnboarding;
pub const GuildOnboarding = @import("guild.zig").GuildOnboarding;
pub const GuildOnboardingPrompt = @import("guild.zig").GuildOnboardingPrompt;
pub const GuildOnboardingPromptOption = @import("guild.zig").GuildOnboardingPromptOption;
pub const GuildOnboardingPromptType = @import("guild.zig").GuildOnboardingPromptType;
pub const GuildOnboardingMode = @import("guild.zig").GuildOnboardingMode;
// integration.zig
pub const Integration = @import("integration.zig").Integration;
pub const IntegrationAccount = @import("integration.zig").IntegrationAccount;
pub const IntegrationApplication = @import("integration.zig").IntegrationApplication;
pub const IntegrationCreateUpdate = @import("integration.zig").IntegrationCreateUpdate;
pub const IntegrationDelete = @import("integration.zig").IntegrationDelete;
pub const GuildIntegrationsUpdate = @import("integration.zig").GuildIntegrationsUpdate;
pub const InteractionContextType = @import("integration.zig").InteractionContextType;
// invite.zig
pub const InviteMetadata = @import("invite.zig").InviteMetadata;
pub const Invite = @import("invite.zig").Invite;
pub const InviteType = @import("invite.zig").InviteType;
pub const InviteStageInstance = @import("invite.zig").InviteStageInstance;
// member.zig
pub const Member = @import("member.zig").Member;
pub const MemberWithUser = @import("member.zig").MemberWithUser;
pub const AddGuildMember = @import("member.zig").AddGuildMember;
pub const ModifyGuildMember = @import("member.zig").ModifyGuildMember;
// message.zig
pub const Message = @import("message.zig").Message;
pub const MessageCall = @import("message.zig").MessageCall;
pub const ChannelMention = @import("message.zig").ChannelMention;
pub const Reaction = @import("message.zig").Reaction;
pub const ReactionType = @import("message.zig").ReactionType;
pub const ReactionCountDetails = @import("message.zig").ReactionCountDetails;
pub const MessageActivity = @import("message.zig").MessageActivity;
pub const MessageReference = @import("message.zig").MessageReference;
pub const MessageReferenceType = @import("message.zig").MessageReferenceType;
pub const MessageSnapshot = @import("message.zig").MessageSnapshot;
pub const MessageInteraction = @import("message.zig").MessageInteraction;
pub const MessageInteractionMetadata = @import("message.zig").MessageInteractionMetadata;
pub const AllowedMentions = @import("message.zig").AllowedMentions;
pub const GetMessagesQuery = @import("message.zig").GetMessagesQuery;
// monetization.zig
pub const Entitlement = @import("monetization.zig").Entitlement;
pub const EntitlementType = @import("monetization.zig").EntitlementType;
pub const Sku = @import("monetization.zig").Sku;
pub const SkuType = @import("monetization.zig").SkuType;
pub const CreateTestEntitlement = @import("monetization.zig").CreateTestEntitlement;
// oauth.zig
pub const TokenExchangeAuthorizationCode = @import("oauth.zig").TokenExchangeAuthorizationCode;
pub const TokenExchangeRefreshToken = @import("oauth.zig").TokenExchangeRefreshToken;
pub const TokenExchangeClientCredentials = @import("oauth.zig").TokenExchangeClientCredentials;
pub const AccessTokenResponse = @import("oauth.zig").AccessTokenResponse;
// poll.zig
pub const Poll = @import("poll.zig").Poll;
pub const PollLayoutType = @import("poll.zig").PollLayoutType;
pub const PollMedia = @import("poll.zig").PollMedia;
pub const PollAnswer = @import("poll.zig").PollAnswer;
pub const PollAnswerCount = @import("poll.zig").PollAnswerCount;
pub const PollResult = @import("poll.zig").PollResult;
pub const GetAnswerVotesResponse = @import("poll.zig").GetAnswerVotesResponse;
pub const PollVoteAdd = @import("poll.zig").PollVoteAdd;
pub const PollVoteRemove = @import("poll.zig").PollVoteRemove;
// role.zig
pub const Role = @import("role.zig").Role;
pub const RoleTags = @import("role.zig").RoleTags;
pub const CreateGuildRole = @import("role.zig").CreateGuildRole;
pub const ModifyGuildRole = @import("role.zig").ModifyGuildRole;
// scheduled_event.zig
pub const ScheduledEvent = @import("scheduled_event.zig").ScheduledEvent;
pub const ScheduledEventEntityMetadata = @import("scheduled_event.zig").ScheduledEventEntityMetadata;
pub const ScheduledEventRecurrenceRule = @import("scheduled_event.zig").ScheduledEventRecurrenceRule;
pub const ScheduledEventRecurrenceRuleFrequency = @import("scheduled_event.zig").ScheduledEventRecurrenceRuleFrequency;
pub const ScheduledEventRecurrenceRuleWeekday = @import("scheduled_event.zig").ScheduledEventRecurrenceRuleWeekday;
pub const ScheduledEventRecurrenceRuleNWeekday = @import("scheduled_event.zig").ScheduledEventRecurrenceRuleNWeekday;
pub const ScheduledEventRecurrenceRuleMonth = @import("scheduled_event.zig").ScheduledEventRecurrenceRuleMonth;
// sticker.zig
pub const Sticker = @import("sticker.zig").Sticker;
pub const StickerItem = @import("sticker.zig").StickerItem;
pub const StickerPack = @import("sticker.zig").StickerPack;
pub const CreateModifyGuildSticker = @import("sticker.zig").CreateModifyGuildSticker;
// team.zig
pub const Team = @import("team.zig").Team;
pub const TeamMember = @import("team.zig").TeamMember;
// thread.zig
pub const ThreadMetadata = @import("thread.zig").ThreadMetadata;
pub const ThreadMember = @import("thread.zig").ThreadMember;
pub const ListActiveThreads = @import("thread.zig").ListActiveThreads;
pub const ListArchivedThreads = @import("thread.zig").ListArchivedThreads;
pub const ThreadListSync = @import("thread.zig").ThreadListSync;
pub const StartThreadFromMessage = @import("thread.zig").StartThreadFromMessage;
pub const StartThreadWithoutMessage = @import("thread.zig").StartThreadWithoutMessage;
pub const CreateForumAndMediaThreadMessage = @import("thread.zig").CreateForumAndMediaThreadMessage;
pub const StartThreadInForumOrMediaChannel = @import("thread.zig").StartThreadInForumOrMediaChannel;
// user.zig
pub const User = @import("user.zig").User;
pub const AvatarDecorationData = @import("user.zig").AvatarDecorationData;
pub const TokenExchange = @import("user.zig").TokenExchange;
pub const TokenRevocation = @import("user.zig").TokenRevocation;
pub const CurrentAuthorization = @import("user.zig").CurrentAuthorization;
pub const Connection = @import("user.zig").Connection;
pub const ConnectionServiceType = @import("user.zig").ConnectionServiceType;
pub const ConnectionVisibility = @import("user.zig").ConnectionVisibility;
pub const ApplicationRoleConnection = @import("user.zig").ApplicationRoleConnection;
pub const ModifyCurrentUser = @import("user.zig").ModifyCurrentUser;
// webhook.zig
pub const WebhookUpdate = @import("webhook.zig").WebhookUpdate;
pub const Webhook = @import("webhook.zig").Webhook;
pub const IncomingWebhook = @import("webhook.zig").IncomingWebhook;
pub const ApplicationWebhook = @import("webhook.zig").ApplicationWebhook;
// application.zig
pub const Application = @import("application.zig").Application;
pub const ApplicationIntegrationTypeConfiguration = @import("application.zig").ApplicationIntegrationTypeConfiguration;
pub const ApplicationIntegrationType = @import("application.zig").ApplicationIntegrationType;
pub const InstallParams = @import("application.zig").InstallParams;
pub const ModifyApplication = @import("application.zig").ModifyApplication;
pub const ApplicationEventWebhookStatus = @import("application.zig").ApplicationEventWebhookStatus;
pub const WebhookEventType = @import("application.zig").WebhookEventType;
// attachment.zig
pub const Attachment = @import("attachment.zig").Attachment;
// auditlog.zig
pub const AuditLog = @import("auditlog.zig").AuditLog;
pub const AuditLogEntry = @import("auditlog.zig").AuditLogEntry;
pub const OptionalAuditEntryInfo = @import("auditlog.zig").OptionalAuditEntryInfo;
pub const AuditLogChange = @import("auditlog.zig").AuditLogChange;
// automod.zig
pub const AutoModerationRule = @import("automod.zig").AutoModerationRule;
pub const AutoModerationEventTypes = @import("automod.zig").AutoModerationEventTypes;
pub const AutoModerationTriggerTypes = @import("automod.zig").AutoModerationTriggerTypes;
pub const AutoModerationRuleTriggerMetadata = @import("automod.zig").AutoModerationRuleTriggerMetadata;
pub const AutoModerationRuleTriggerMetadataPresets = @import("automod.zig").AutoModerationRuleTriggerMetadataPresets;
pub const AutoModerationAction = @import("automod.zig").AutoModerationAction;
pub const AutoModerationActionType = @import("automod.zig").AutoModerationActionType;
pub const AutoModerationActionMetadata = @import("automod.zig").AutoModerationActionMetadata;
pub const AutoModerationActionExecution = @import("automod.zig").AutoModerationActionExecution;
// channel.zig
pub const TypingStart = @import("channel.zig").TypingStart;
pub const Channel = @import("channel.zig").Channel;
pub const WelcomeScreen = @import("channel.zig").WelcomeScreen;
pub const WelcomeScreenChannel = @import("channel.zig").WelcomeScreenChannel;
pub const StageInstance = @import("channel.zig").StageInstance;
pub const Overwrite = @import("channel.zig").Overwrite;
pub const FollowedChannel = @import("channel.zig").FollowedChannel;
pub const ForumTag = @import("channel.zig").ForumTag;
pub const DefaultReactionEmoji = @import("channel.zig").DefaultReactionEmoji;
pub const ModifyGuildChannelPositions = @import("channel.zig").ModifyGuildChannelPositions;
pub const CreateChannelInvite = @import("channel.zig").CreateChannelInvite;
// command.zig
pub const ApplicationCommand = @import("command.zig").ApplicationCommand;
pub const CreateApplicationCommand = @import("command.zig").CreateApplicationCommand;
pub const LocaleMap = @import("command.zig").LocaleMap;
pub const InteractionEntryPointCommandHandlerType = @import("command.zig").InteractionEntryPointCommandHandlerType;
pub const ApplicationCommandOption = @import("command.zig").ApplicationCommandOption;
pub const ApplicationCommandOptionChoice = @import("command.zig").ApplicationCommandOptionChoice;
pub const GuildApplicationCommandPermissions = @import("command.zig").GuildApplicationCommandPermissions;
pub const ApplicationCommandPermissions = @import("command.zig").ApplicationCommandPermissions;
// component.zig
pub const Button = @import("component.zig").Button;
pub const SelectOption = @import("component.zig").SelectOption;
pub const DefaultValue = @import("component.zig").DefaultValue;
pub const SelectMenuString = @import("component.zig").SelectMenuString;
pub const SelectMenuUsers = @import("component.zig").SelectMenuUsers;
pub const SelectMenuRoles = @import("component.zig").SelectMenuRoles;
pub const SelectMenuUsersAndRoles = @import("component.zig").SelectMenuUsersAndRoles;
pub const SelectMenuChannels = @import("component.zig").SelectMenuChannels;
pub const SelectMenu = @import("component.zig").SelectMenu;
pub const InputTextStyles = @import("component.zig").InputTextStyles;
pub const InputText = @import("component.zig").InputText;
pub const MessageComponent = @import("component.zig").MessageComponent;
// embed.zig
pub const Embed = @import("embed.zig").Embed;
pub const EmbedAuthor = @import("embed.zig").EmbedAuthor;
pub const EmbedField = @import("embed.zig").EmbedField;
pub const EmbedFooter = @import("embed.zig").EmbedFooter;
pub const EmbedImage = @import("embed.zig").EmbedImage;
pub const EmbedProvider = @import("embed.zig").EmbedProvider;
pub const EmbedThumbnail = @import("embed.zig").EmbedThumbnail;
pub const EmbedVideo = @import("embed.zig").EmbedVideo;
// emoji.zig
pub const Emoji = @import("emoji.zig").Emoji;
// gateway.zig
pub const GetGatewayBot = @import("gateway.zig").GetGatewayBot;
pub const SessionStartLimit = @import("gateway.zig").SessionStartLimit;
pub const PresenceUpdate = @import("gateway.zig").PresenceUpdate;
pub const Activity = @import("gateway.zig").Activity;
pub const ActivityInstance = @import("gateway.zig").ActivityInstance;
pub const ActivityLocation = @import("gateway.zig").ActivityLocation;
pub const ActivityLocationKind = @import("gateway.zig").ActivityLocationKind;
pub const ClientStatus = @import("gateway.zig").ClientStatus;
pub const ActivityTimestamps = @import("gateway.zig").ActivityTimestamps;
pub const ActivityEmoji = @import("gateway.zig").ActivityEmoji;
pub const ActivityParty = @import("gateway.zig").ActivityParty;
pub const ActivityAssets = @import("gateway.zig").ActivityAssets;
pub const ActivitySecrets = @import("gateway.zig").ActivitySecrets;
pub const ActivityButton = @import("gateway.zig").ActivityButton;
// guild.zig
pub const Guild = @import("guild.zig").Guild;
pub const VoiceState = @import("guild.zig").VoiceState;
pub const GuildWidget = @import("guild.zig").GuildWidget;
pub const GuildPreview = @import("guild.zig").GuildPreview;
pub const CreateGuild = @import("guild.zig").CreateGuild;
pub const ModifyGuild = @import("guild.zig").ModifyGuild;
pub const CreateGuildBan = @import("guild.zig").CreateGuildBan;
pub const GetGuildPruneCountQuery = @import("guild.zig").GetGuildPruneCountQuery;
pub const BeginGuildPrune = @import("guild.zig").BeginGuildPrune;
pub const ModifyGuildOnboarding = @import("guild.zig").ModifyGuildOnboarding;
pub const GuildOnboarding = @import("guild.zig").GuildOnboarding;
pub const GuildOnboardingPrompt = @import("guild.zig").GuildOnboardingPrompt;
pub const GuildOnboardingPromptOption = @import("guild.zig").GuildOnboardingPromptOption;
pub const GuildOnboardingPromptType = @import("guild.zig").GuildOnboardingPromptType;
pub const GuildOnboardingMode = @import("guild.zig").GuildOnboardingMode;
// integration.zig
pub const Integration = @import("integration.zig").Integration;
pub const IntegrationAccount = @import("integration.zig").IntegrationAccount;
pub const IntegrationApplication = @import("integration.zig").IntegrationApplication;
pub const IntegrationCreateUpdate = @import("integration.zig").IntegrationCreateUpdate;
pub const IntegrationDelete = @import("integration.zig").IntegrationDelete;
pub const GuildIntegrationsUpdate = @import("integration.zig").GuildIntegrationsUpdate;
pub const InteractionContextType = @import("integration.zig").InteractionContextType;
// invite.zig
pub const InviteMetadata = @import("invite.zig").InviteMetadata;
pub const Invite = @import("invite.zig").Invite;
pub const InviteType = @import("invite.zig").InviteType;
pub const InviteStageInstance = @import("invite.zig").InviteStageInstance;
// member.zig
pub const Member = @import("member.zig").Member;
pub const MemberWithUser = @import("member.zig").MemberWithUser;
pub const AddGuildMember = @import("member.zig").AddGuildMember;
pub const ModifyGuildMember = @import("member.zig").ModifyGuildMember;
// message.zig
pub const Message = @import("message.zig").Message;
pub const MessageCall = @import("message.zig").MessageCall;
pub const ChannelMention = @import("message.zig").ChannelMention;
pub const Reaction = @import("message.zig").Reaction;
pub const ReactionType = @import("message.zig").ReactionType;
pub const ReactionCountDetails = @import("message.zig").ReactionCountDetails;
pub const MessageActivity = @import("message.zig").MessageActivity;
pub const MessageReference = @import("message.zig").MessageReference;
pub const MessageReferenceType = @import("message.zig").MessageReferenceType;
pub const MessageSnapshot = @import("message.zig").MessageSnapshot;
pub const MessageInteraction = @import("message.zig").MessageInteraction;
pub const MessageInteractionMetadata = @import("message.zig").MessageInteractionMetadata;
pub const AllowedMentions = @import("message.zig").AllowedMentions;
pub const GetMessagesQuery = @import("message.zig").GetMessagesQuery;
// monetization.zig
pub const Entitlement = @import("monetization.zig").Entitlement;
pub const EntitlementType = @import("monetization.zig").EntitlementType;
pub const Sku = @import("monetization.zig").Sku;
pub const SkuType = @import("monetization.zig").SkuType;
pub const CreateTestEntitlement = @import("monetization.zig").CreateTestEntitlement;
// oauth.zig
pub const TokenExchangeAuthorizationCode = @import("oauth.zig").TokenExchangeAuthorizationCode;
pub const TokenExchangeRefreshToken = @import("oauth.zig").TokenExchangeRefreshToken;
pub const TokenExchangeClientCredentials = @import("oauth.zig").TokenExchangeClientCredentials;
pub const AccessTokenResponse = @import("oauth.zig").AccessTokenResponse;
// poll.zig
pub const Poll = @import("poll.zig").Poll;
pub const PollLayoutType = @import("poll.zig").PollLayoutType;
pub const PollMedia = @import("poll.zig").PollMedia;
pub const PollAnswer = @import("poll.zig").PollAnswer;
pub const PollAnswerCount = @import("poll.zig").PollAnswerCount;
pub const PollResult = @import("poll.zig").PollResult;
pub const GetAnswerVotesResponse = @import("poll.zig").GetAnswerVotesResponse;
pub const PollVoteAdd = @import("poll.zig").PollVoteAdd;
pub const PollVoteRemove = @import("poll.zig").PollVoteRemove;
// role.zig
pub const Role = @import("role.zig").Role;
pub const RoleTags = @import("role.zig").RoleTags;
pub const CreateGuildRole = @import("role.zig").CreateGuildRole;
pub const ModifyGuildRole = @import("role.zig").ModifyGuildRole;
// scheduled_event.zig
pub const ScheduledEvent = @import("scheduled_event.zig").ScheduledEvent;
pub const ScheduledEventEntityMetadata = @import("scheduled_event.zig").ScheduledEventEntityMetadata;
pub const ScheduledEventRecurrenceRule = @import("scheduled_event.zig").ScheduledEventRecurrenceRule;
pub const ScheduledEventRecurrenceRuleFrequency = @import("scheduled_event.zig").ScheduledEventRecurrenceRuleFrequency;
pub const ScheduledEventRecurrenceRuleWeekday = @import("scheduled_event.zig").ScheduledEventRecurrenceRuleWeekday;
pub const ScheduledEventRecurrenceRuleNWeekday = @import("scheduled_event.zig").ScheduledEventRecurrenceRuleNWeekday;
pub const ScheduledEventRecurrenceRuleMonth = @import("scheduled_event.zig").ScheduledEventRecurrenceRuleMonth;
// sticker.zig
pub const Sticker = @import("sticker.zig").Sticker;
pub const StickerItem = @import("sticker.zig").StickerItem;
pub const StickerPack = @import("sticker.zig").StickerPack;
pub const CreateModifyGuildSticker = @import("sticker.zig").CreateModifyGuildSticker;
// team.zig
pub const Team = @import("team.zig").Team;
pub const TeamMember = @import("team.zig").TeamMember;
// thread.zig
pub const ThreadMetadata = @import("thread.zig").ThreadMetadata;
pub const ThreadMember = @import("thread.zig").ThreadMember;
pub const ListActiveThreads = @import("thread.zig").ListActiveThreads;
pub const ListArchivedThreads = @import("thread.zig").ListArchivedThreads;
pub const ThreadListSync = @import("thread.zig").ThreadListSync;
pub const StartThreadFromMessage = @import("thread.zig").StartThreadFromMessage;
pub const StartThreadWithoutMessage = @import("thread.zig").StartThreadWithoutMessage;
pub const CreateForumAndMediaThreadMessage = @import("thread.zig").CreateForumAndMediaThreadMessage;
pub const StartThreadInForumOrMediaChannel = @import("thread.zig").StartThreadInForumOrMediaChannel;
// user.zig
pub const User = @import("user.zig").User;
pub const AvatarDecorationData = @import("user.zig").AvatarDecorationData;
pub const TokenExchange = @import("user.zig").TokenExchange;
pub const TokenRevocation = @import("user.zig").TokenRevocation;
pub const CurrentAuthorization = @import("user.zig").CurrentAuthorization;
pub const Connection = @import("user.zig").Connection;
pub const ConnectionServiceType = @import("user.zig").ConnectionServiceType;
pub const ConnectionVisibility = @import("user.zig").ConnectionVisibility;
pub const ApplicationRoleConnection = @import("user.zig").ApplicationRoleConnection;
pub const ModifyCurrentUser = @import("user.zig").ModifyCurrentUser;
// webhook.zig
pub const WebhookUpdate = @import("webhook.zig").WebhookUpdate;
pub const Webhook = @import("webhook.zig").Webhook;
pub const IncomingWebhook = @import("webhook.zig").IncomingWebhook;
pub const ApplicationWebhook = @import("webhook.zig").ApplicationWebhook;
/// https://discord.com/developers/docs/topics/gateway#payloads-gateway-payload-structure
pub fn GatewayPayload(comptime T: type) type {
return struct {
/// opcode for the payload
op: isize,
/// Event data
d: ?T,
/// Sequence isize, used for resuming sessions and heartbeats
s: ?isize,
/// The event name for this payload
t: ?[]const u8,
// t: ?GatewayDispatchEventNames,
};
}
/// https://discord.com/developers/docs/topics/gateway#payloads-gateway-payload-structure
pub fn GatewayPayload(comptime T: type) type {
return struct {
/// opcode for the payload
op: isize,
/// Event data
d: ?T = null,
/// Sequence isize, used for resuming sessions and heartbeats
s: ?isize = null,
/// The event name for this payload
t: ?[]const u8 = null,
// t: ?GatewayDispatchEventNames = null,
};
}

View File

@ -1,169 +1,169 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const PremiumTypes = @import("shared.zig").PremiumTypes;
const Snowflake = @import("snowflake.zig").Snowflake;
const Application = @import("application.zig").Application;
const OAuth2Scope = @import("shared.zig").OAuth2Scope;
const Integration = @import("integration.zig").Integration;
const Partial = @import("partial.zig").Partial;
const Record = @import("../json-helper.zig").Record;
const PremiumTypes = @import("shared.zig").PremiumTypes;
const Snowflake = @import("snowflake.zig").Snowflake;
const Application = @import("application.zig").Application;
const OAuth2Scope = @import("shared.zig").OAuth2Scope;
const Integration = @import("integration.zig").Integration;
const Partial = @import("partial.zig").Partial;
const Record = @import("../json-helper.zig").Record;
/// https://discord.com/developers/docs/resources/user#user-object
pub const User = struct {
/// The user's username, not unique across the platform
username: []const u8,
/// The user's display name, if it is set. For bots, this is the application name
global_name: ?[]const u8,
/// The user's chosen language option
locale: ?[]const u8,
/// The flags on a user's account
flags: ?isize,
/// The type of Nitro subscription on a user's account
premium_type: ?PremiumTypes,
/// The public flags on a user's account
public_flags: ?isize,
/// the user's banner color encoded as an integer representation of hexadecimal color code
accent_color: ?isize,
/// The user's id
id: Snowflake,
/// The user's discord-tag
discriminator: []const u8,
/// The user's avatar hash
avatar: ?[]const u8,
/// Whether the user belongs to an OAuth2 application
bot: ?bool,
///Whether the user is an Official System user (part of the urgent message system)
system: ?bool,
/// Whether the user has two factor enabled on their account
mfa_enabled: ?bool,
/// Whether the email on this account has been verified
verified: ?bool,
/// The user's email
email: ?[]const u8,
/// the user's banner, or null if unset
banner: ?[]const u8,
/// data for the user's avatar decoration
avatar_decoration_data: ?AvatarDecorationData,
clan: ?[]const u8,
};
/// https://discord.com/developers/docs/resources/user#avatar-decoration-data-object
pub const AvatarDecorationData = struct {
/// the avatar decoration hash
asset: []const u8,
/// id of the avatar decoration's SKU
sku_id: Snowflake,
};
/// TODO: implement
pub const TokenExchange = null;
pub const TokenRevocation = struct {
/// The access token to revoke
token: []const u8,
/// Optional, the type of token you are using for the revocation
token_type_hint: ?"access_token' | 'refresh_token",
};
/// https://discord.com/developers/docs/topics/oauth2#get-current-authorization-information-response-structure
pub const CurrentAuthorization = struct {
application: Application,
/// the scopes the user has authorized the application for
scopes: []OAuth2Scope,
/// when the access token expires
expires: []const u8,
/// the user who has authorized, if the user has authorized with the `identify` scope
user: ?User,
};
/// https://discord.com/developers/docs/resources/user#connection-object-connection-structure
pub const Connection = struct {
/// id of the connection account
id: Snowflake,
/// the username of the connection account
name: []const u8,
/// the service of this connection
type: ConnectionServiceType,
/// whether the connection is revoked
revoked: ?bool,
/// an array of partial server integrations
integrations: ?[]Partial(Integration),
/// whether the connection is verified
verified: bool,
/// whether friend sync is enabled for this connection
friend_sync: bool,
/// whether activities related to this connection will be shown in presence updates
show_activity: bool,
/// whether this connection has a corresponding third party OAuth2 token
two_way_link: bool,
/// visibility of this connection
visibility: ConnectionVisibility,
};
/// https://discord.com/developers/docs/resources/user#connection-object-services
pub const ConnectionServiceType = union(enum) {
@"amazon-music",
battlenet,
@"Bungie.net",
domain,
ebay,
epicgames,
facebook,
github,
instagram,
leagueoflegends,
paypal,
playstation,
reddit,
riotgames,
roblox,
spotify,
skype,
steam,
tiktok,
twitch,
twitter,
xbox,
youtube,
};
//https://discord.com/developers/docs/resources/user#connection-object-visibility-types
pub const ConnectionVisibility = enum(u4) {
/// invisible to everyone except the user themselves
None = 0,
/// visible to everyone
Everyone = 1,
};
/// https://discord.com/developers/docs/resources/user#application-role-connection-object-application-role-connection-structure
pub const ApplicationRoleConnection = struct {
/// the vanity name of the platform a bot has connected (max 50 characters)
platform_name: ?[]const u8,
/// the username on the platform a bot has connected (max 100 characters)
platform_username: ?[]const u8,
/// object mapping application role connection metadata keys to their stringified value (max 100 characters) for the user on the platform a bot has connected
metadata: []Record([]const u8),
};
pub const ModifyCurrentUser = struct {
/// user's username, if changed may cause the user's discriminator to be randomized.
username: ?[]const u8,
/// if passed, modifies the user's avatar
avatar: ?[]const u8,
/// if passed, modifies the user's banner
banner: ?[]const u8,
/// https://discord.com/developers/docs/resources/user#user-object
pub const User = struct {
/// The user's username, not unique across the platform
username: []const u8,
/// The user's display name, if it is set. For bots, this is the application name
global_name: ?[]const u8 = null,
/// The user's chosen language option
locale: ?[]const u8 = null,
/// The flags on a user's account
flags: ?isize = null,
/// The type of Nitro subscription on a user's account
premium_type: ?PremiumTypes = null,
/// The public flags on a user's account
public_flags: ?isize = null,
/// the user's banner color encoded as an integer representation of hexadecimal color code
accent_color: ?isize = null,
/// The user's id
id: Snowflake,
/// The user's discord-tag
discriminator: []const u8,
/// The user's avatar hash
avatar: ?[]const u8 = null,
/// Whether the user belongs to an OAuth2 application
bot: ?bool = null,
///Whether the user is an Official System user (part of the urgent message system)
system: ?bool = null,
/// Whether the user has two factor enabled on their account
mfa_enabled: ?bool = null,
/// Whether the email on this account has been verified
verified: ?bool = null,
/// The user's email
email: ?[]const u8 = null,
/// the user's banner, or null if unset
banner: ?[]const u8 = null,
/// data for the user's avatar decoration
avatar_decoration_data: ?AvatarDecorationData = null,
clan: ?[]const u8 = null,
};
/// https://discord.com/developers/docs/resources/user#avatar-decoration-data-object
pub const AvatarDecorationData = struct {
/// the avatar decoration hash
asset: []const u8,
/// id of the avatar decoration's SKU
sku_id: Snowflake,
};
/// TODO: implement
pub const TokenExchange = null;
pub const TokenRevocation = struct {
/// The access token to revoke
token: []const u8,
/// Optional, the type of token you are using for the revocation
token_type_hint: ?"access_token' | 'refresh_token" = null,
};
/// https://discord.com/developers/docs/topics/oauth2#get-current-authorization-information-response-structure
pub const CurrentAuthorization = struct {
application: Application,
/// the scopes the user has authorized the application for
scopes: []OAuth2Scope,
/// when the access token expires
expires: []const u8,
/// the user who has authorized, if the user has authorized with the `identify` scope
user: ?User = null,
};
/// https://discord.com/developers/docs/resources/user#connection-object-connection-structure
pub const Connection = struct {
/// id of the connection account
id: Snowflake,
/// the username of the connection account
name: []const u8,
/// the service of this connection
type: ConnectionServiceType,
/// whether the connection is revoked
revoked: ?bool = null,
/// an array of partial server integrations
integrations: ?[]Partial(Integration) = null,
/// whether the connection is verified
verified: bool,
/// whether friend sync is enabled for this connection
friend_sync: bool,
/// whether activities related to this connection will be shown in presence updates
show_activity: bool,
/// whether this connection has a corresponding third party OAuth2 token
two_way_link: bool,
/// visibility of this connection
visibility: ConnectionVisibility,
};
/// https://discord.com/developers/docs/resources/user#connection-object-services
pub const ConnectionServiceType = union(enum) {
@"amazon-music",
battlenet,
@"Bungie.net",
domain,
ebay,
epicgames,
facebook,
github,
instagram,
leagueoflegends,
paypal,
playstation,
reddit,
riotgames,
roblox,
spotify,
skype,
steam,
tiktok,
twitch,
twitter,
xbox,
youtube,
};
//https://discord.com/developers/docs/resources/user#connection-object-visibility-types
pub const ConnectionVisibility = enum(u4) {
/// invisible to everyone except the user themselves
None = 0,
/// visible to everyone
Everyone = 1,
};
/// https://discord.com/developers/docs/resources/user#application-role-connection-object-application-role-connection-structure
pub const ApplicationRoleConnection = struct {
/// the vanity name of the platform a bot has connected (max 50 characters)
platform_name: ?[]const u8 = null,
/// the username on the platform a bot has connected (max 100 characters)
platform_username: ?[]const u8 = null,
/// object mapping application role connection metadata keys to their stringified value (max 100 characters) for the user on the platform a bot has connected
metadata: []Record([]const u8),
};
pub const ModifyCurrentUser = struct {
/// user's username, if changed may cause the user's discriminator to be randomized.
username: ?[]const u8 = null,
/// if passed, modifies the user's avatar
avatar: ?[]const u8 = null,
/// if passed, modifies the user's banner
banner: ?[]const u8 = null,
};

View File

@ -1,89 +1,89 @@
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
//! ISC License
//!
//! Copyright (c) 2024-2025 Yuzu
//!
//! Permission to use, copy, modify, and/or distribute this software for any
//! purpose with or without fee is hereby granted, provided that the above
//! copyright notice and this permission notice appear in all copies.
//!
//! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
//! REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
//! AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
//! INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
//! LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//! OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
//! PERFORMANCE OF THIS SOFTWARE.
const Snowflake = @import("snowflake.zig").Snowflake;
const WebhookTypes = @import("shared.zig").WebhookTypes;
const User = @import("user.zig").User;
const Guild = @import("guild.zig").Guild;
const Channel = @import("channel.zig").Channel;
const Partial = @import("partial.zig").Partial;
const Snowflake = @import("snowflake.zig").Snowflake;
const WebhookTypes = @import("shared.zig").WebhookTypes;
const User = @import("user.zig").User;
const Guild = @import("guild.zig").Guild;
const Channel = @import("channel.zig").Channel;
const Partial = @import("partial.zig").Partial;
/// https://discord.com/developers/docs/topics/gateway#webhooks-update-webhook-update-event-fields
pub const WebhookUpdate = struct {
/// id of the guild
guild_id: Snowflake,
/// id of the channel
channel_id: Snowflake,
};
/// https://discord.com/developers/docs/resources/webhook#webhook-object-webhook-structure
/// TODO: implement
pub const Webhook = null;
pub const IncomingWebhook = struct {
/// The type of the webhook
type: WebhookTypes,
/// The secure token of the webhook (returned for Incoming Webhooks)
token: ?[]const u8,
/// The url used for executing the webhook (returned by the webhooks OAuth2 flow)
url: ?[]const u8,
/// The id of the webhook
id: Snowflake,
/// The guild id this webhook is for
guild_id: ?Snowflake,
/// The channel id this webhook is for
channel_id: Snowflake,
/// The user this webhook was created by (not returned when getting a webhook with its token)
user: ?User,
/// The default name of the webhook
name: ?[]const u8,
/// The default user avatar hash of the webhook
avatar: ?[]const u8,
/// The bot/OAuth2 application that created this webhook
application_id: ?Snowflake,
/// The guild of the channel that this webhook is following (returned for Channel Follower Webhooks)
source_guild: ?Partial(Guild),
/// The channel that this webhook is following (returned for Channel Follower Webhooks)
source_channel: ?Partial(Channel),
};
pub const ApplicationWebhook = struct {
/// The type of the webhook
type: WebhookTypes.Application,
/// The secure token of the webhook (returned for Incoming Webhooks)
token: ?[]const u8,
/// The url used for executing the webhook (returned by the webhooks OAuth2 flow)
url: ?[]const u8,
/// The id of the webhook
id: Snowflake,
/// The guild id this webhook is for
guild_id: ?Snowflake,
/// The channel id this webhook is for
channel_id: ?Snowflake,
/// The user this webhook was created by (not returned when getting a webhook with its token)
user: ?User,
/// The default name of the webhook
name: ?[]const u8,
/// The default user avatar hash of the webhook
avatar: ?[]const u8,
/// The bot/OAuth2 application that created this webhook
application_id: ?Snowflake,
/// The guild of the channel that this webhook is following (returned for Channel Follower Webhooks), field will be absent if the webhook creator has since lost access to the guild where the followed channel resides
source_guild: ?Partial(Guild),
/// The channel that this webhook is following (returned for Channel Follower Webhooks), field will be absent if the webhook creator has since lost access to the guild where the followed channel resides
source_channel: ?Partial(Channel),
/// https://discord.com/developers/docs/topics/gateway#webhooks-update-webhook-update-event-fields
pub const WebhookUpdate = struct {
/// id of the guild
guild_id: Snowflake,
/// id of the channel
channel_id: Snowflake,
};
/// https://discord.com/developers/docs/resources/webhook#webhook-object-webhook-structure
/// TODO: implement
pub const Webhook = null;
pub const IncomingWebhook = struct {
/// The type of the webhook
type: WebhookTypes,
/// The secure token of the webhook (returned for Incoming Webhooks)
token: ?[]const u8 = null,
/// The url used for executing the webhook (returned by the webhooks OAuth2 flow)
url: ?[]const u8 = null,
/// The id of the webhook
id: Snowflake,
/// The guild id this webhook is for
guild_id: ?Snowflake = null,
/// The channel id this webhook is for
channel_id: Snowflake,
/// The user this webhook was created by (not returned when getting a webhook with its token)
user: ?User = null,
/// The default name of the webhook
name: ?[]const u8 = null,
/// The default user avatar hash of the webhook
avatar: ?[]const u8 = null,
/// The bot/OAuth2 application that created this webhook
application_id: ?Snowflake = null,
/// The guild of the channel that this webhook is following (returned for Channel Follower Webhooks)
source_guild: ?Partial(Guild) = null,
/// The channel that this webhook is following (returned for Channel Follower Webhooks)
source_channel: ?Partial(Channel) = null,
};
pub const ApplicationWebhook = struct {
/// The type of the webhook
type: WebhookTypes.Application,
/// The secure token of the webhook (returned for Incoming Webhooks)
token: ?[]const u8 = null,
/// The url used for executing the webhook (returned by the webhooks OAuth2 flow)
url: ?[]const u8 = null,
/// The id of the webhook
id: Snowflake,
/// The guild id this webhook is for
guild_id: ?Snowflake = null,
/// The channel id this webhook is for
channel_id: ?Snowflake = null,
/// The user this webhook was created by (not returned when getting a webhook with its token)
user: ?User = null,
/// The default name of the webhook
name: ?[]const u8 = null,
/// The default user avatar hash of the webhook
avatar: ?[]const u8 = null,
/// The bot/OAuth2 application that created this webhook
application_id: ?Snowflake = null,
/// The guild of the channel that this webhook is following (returned for Channel Follower Webhooks), field will be absent if the webhook creator has since lost access to the guild where the followed channel resides
source_guild: ?Partial(Guild) = null,
/// The channel that this webhook is following (returned for Channel Follower Webhooks), field will be absent if the webhook creator has since lost access to the guild where the followed channel resides
source_channel: ?Partial(Channel) = null,
};