diff --git a/src/gateway/schema/Activity.ts b/src/gateway/schema/Activity.ts
new file mode 100644
index 00000000..f58b0fa9
--- /dev/null
+++ b/src/gateway/schema/Activity.ts
@@ -0,0 +1,60 @@
+import { Activity, Status } from "@fosscord/util";
+
+export const ActivitySchema = {
+ afk: Boolean,
+ status: String,
+ $activities: [
+ {
+ name: String,
+ type: Number,
+ $url: String,
+ $created_at: Date,
+ $timestamps: {
+ $start: Number,
+ $end: Number,
+ },
+ $application_id: String,
+ $details: String,
+ $state: String,
+ $emoji: {
+ $name: String,
+ $id: String,
+ $animated: Boolean,
+ },
+ $party: {
+ $id: String,
+ $size: [Number, Number],
+ },
+ $assets: {
+ $large_image: String,
+ $large_text: String,
+ $small_image: String,
+ $small_text: String,
+ },
+ $secrets: {
+ $join: String,
+ $spectate: String,
+ $match: String,
+ },
+ $instance: Boolean,
+ $flags: String,
+
+ $id: String,
+ $sync_id: String,
+ $metadata: { // spotify
+ $context_uri: String,
+ album_id: String,
+ artist_ids: [String],
+ },
+ $session_id: String,
+ },
+ ],
+ $since: Number, // unix time (in milliseconds) of when the client went idle, or null if the client is not idle
+};
+
+export interface ActivitySchema {
+ afk: boolean;
+ status: Status;
+ activities?: Activity[];
+ since?: number; // unix time (in milliseconds) of when the client went idle, or null if the client is not idle
+}
diff --git a/src/gateway/schema/Identify.ts b/src/gateway/schema/Identify.ts
new file mode 100644
index 00000000..6f68b515
--- /dev/null
+++ b/src/gateway/schema/Identify.ts
@@ -0,0 +1,106 @@
+import { ActivitySchema } from "./Activity";
+
+export const IdentifySchema = {
+ token: String,
+ $intents: BigInt, // discord uses a Integer for bitfields we use bigints tho. | instanceOf will automatically convert the Number to a BigInt
+ $properties: Object,
+ // {
+ // // discord uses $ in the property key for bots, so we need to double prefix it, because instanceOf treats $ (prefix) as a optional key
+ // $os: String,
+ // $os_arch: String,
+ // $browser: String,
+ // $device: String,
+ // $$os: String,
+ // $$browser: String,
+ // $$device: String,
+ // $browser_user_agent: String,
+ // $browser_version: String,
+ // $os_version: String,
+ // $referrer: String,
+ // $$referrer: String,
+ // $referring_domain: String,
+ // $$referring_domain: String,
+ // $referrer_current: String,
+ // $referring_domain_current: String,
+ // $release_channel: String,
+ // $client_build_number: Number,
+ // $client_event_source: String,
+ // $client_version: String,
+ // $system_locale: String,
+ // $window_manager: String,
+ // $distro: String,
+ // },
+ $presence: ActivitySchema,
+ $compress: Boolean,
+ $large_threshold: Number,
+ $shard: [BigInt, BigInt],
+ $guild_subscriptions: Boolean,
+ $capabilities: Number,
+ $client_state: {
+ $guild_hashes: Object,
+ $highest_last_message_id: String || Number,
+ $read_state_version: Number,
+ $user_guild_settings_version: Number,
+ $user_settings_version: undefined,
+ $useruser_guild_settings_version: undefined,
+ },
+ $clientState: {
+ $guildHashes: Object,
+ $highestLastMessageId: String || Number,
+ $readStateVersion: Number,
+ $useruserGuildSettingsVersion: undefined,
+ $userGuildSettingsVersion: undefined,
+ },
+ $v: Number,
+ $version: Number,
+};
+
+export interface IdentifySchema {
+ token: string;
+ properties: {
+ // bruh discord really uses $ in the property key, so we need to double prefix it, because instanceOf treats $ (prefix) as a optional key
+ os?: string;
+ os_atch?: string;
+ browser?: string;
+ device?: string;
+ $os?: string;
+ $browser?: string;
+ $device?: string;
+ browser_user_agent?: string;
+ browser_version?: string;
+ os_version?: string;
+ referrer?: string;
+ referring_domain?: string;
+ referrer_current?: string;
+ referring_domain_current?: string;
+ release_channel?: "stable" | "dev" | "ptb" | "canary";
+ client_build_number?: number;
+ client_event_source?: any;
+ client_version?: string;
+ system_locale?: string;
+ };
+ intents?: bigint; // discord uses a Integer for bitfields we use bigints tho. | instanceOf will automatically convert the Number to a BigInt
+ presence?: ActivitySchema;
+ compress?: boolean;
+ large_threshold?: number;
+ largeThreshold?: number;
+ shard?: [bigint, bigint];
+ guild_subscriptions?: boolean;
+ capabilities?: number;
+ client_state?: {
+ guild_hashes?: any;
+ highest_last_message_id?: string | number;
+ read_state_version?: number;
+ user_guild_settings_version?: number;
+ user_settings_version?: number;
+ useruser_guild_settings_version?: number;
+ };
+ clientState?: {
+ guildHashes?: any;
+ highestLastMessageId?: string | number;
+ readStateVersion?: number;
+ userGuildSettingsVersion?: number;
+ useruserGuildSettingsVersion?: number;
+ };
+ v?: number;
+}
diff --git a/src/gateway/schema/LazyRequest.ts b/src/gateway/schema/LazyRequest.ts
new file mode 100644
index 00000000..1fe658bb
--- /dev/null
+++ b/src/gateway/schema/LazyRequest.ts
@@ -0,0 +1,19 @@
+export interface LazyRequest {
+ guild_id: string;
+ channels?: Record<string, [number, number][]>;
+ activities?: boolean;
+ threads?: boolean;
+ typing?: true;
+ members?: any[];
+ thread_member_lists?: any[];
+}
+
+export const LazyRequest = {
+ guild_id: String,
+ $activities: Boolean,
+ $channels: Object,
+ $typing: Boolean,
+ $threads: Boolean,
+ $members: [] as any[],
+ $thread_member_lists: [] as any[],
+};
diff --git a/src/gateway/schema/VoiceStateUpdateSchema.ts b/src/gateway/schema/VoiceStateUpdateSchema.ts
new file mode 100644
index 00000000..f6480414
--- /dev/null
+++ b/src/gateway/schema/VoiceStateUpdateSchema.ts
@@ -0,0 +1,17 @@
+export const VoiceStateUpdateSchema = {
+ $guild_id: String,
+ $channel_id: String,
+ self_mute: Boolean,
+ self_deaf: Boolean,
+ $self_video: Boolean, //required in docs but bots don't always send it
+ $preferred_region: String,
+};
+
+export interface VoiceStateUpdateSchema {
+ guild_id?: string;
+ channel_id?: string;
+ self_mute: boolean;
+ self_deaf: boolean;
+ self_video?: boolean;
+ preferred_region?: string;
+}
\ No newline at end of file
|