summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--dist/index.d.ts3
-rw-r--r--src/Schema/Activity.ts41
-rw-r--r--src/Schema/Emoji.ts5
-rw-r--r--src/Schema/Identify.ts17
-rw-r--r--src/index.ts9
-rw-r--r--src/models/Channel.ts19
-rw-r--r--src/models/Emoji.ts12
-rw-r--r--src/models/Guild.ts53
-rw-r--r--src/models/Guild.ts.OLD38
-rw-r--r--src/models/Invite.ts31
-rw-r--r--src/models/Member.ts14
-rw-r--r--src/models/Role.ts9
-rw-r--r--src/models/User.ts62
14 files changed, 312 insertions, 2 deletions
diff --git a/.gitignore b/.gitignore
index adb2c197..92bc6247 100644
--- a/.gitignore
+++ b/.gitignore
@@ -101,3 +101,4 @@ typings/
 
 # TernJS port file
 .tern-port
+.DS_Store
diff --git a/dist/index.d.ts b/dist/index.d.ts
index 46dcff5a..45a3252d 100644
--- a/dist/index.d.ts
+++ b/dist/index.d.ts
@@ -1,5 +1,6 @@
 import { checkToken } from "./checkToken";
 import Config, { DefaultOptions } from "./Config";
-import db from "./Database";
+import { db } from "discord-server-util";
+
 import * as Constants from "./Constants";
 export { checkToken, Config, Constants, db, DefaultOptions };
diff --git a/src/Schema/Activity.ts b/src/Schema/Activity.ts
new file mode 100644
index 00000000..e502cebd
--- /dev/null
+++ b/src/Schema/Activity.ts
@@ -0,0 +1,41 @@
+import { EmojiSchema } from "./Emoji";
+
+export const ActivitySchema = {
+	afk: Boolean,
+	status: String,
+	$activities: [
+		{
+			name: String, // the activity's name
+			type: Number, // activity type // TODO: check if its between range 0-5
+			$url: String, // stream url, is validated when type is 1
+			$created_at: Number, // unix timestamp of when the activity was added to the user's session
+			$timestamps: {
+				// unix timestamps for start and/or end of the game
+				start: Number,
+				end: Number,
+			},
+			$application_id: BigInt, // application id for the game
+			$details: String,
+			$State: String,
+			$emoji: EmojiSchema,
+			$party: {
+				$id: String,
+				$size: [Number], // used to show the party's current and maximum size // TODO: array length 2
+			},
+			$assets: {
+				$large_image: String, // the id for a large asset of the activity, usually a snowflake
+				$large_text: String, // text displayed when hovering over the large image of the activity
+				$small_image: String, // the id for a small asset of the activity, usually a snowflake
+				$small_text: String, // text displayed when hovering over the small image of the activity
+			},
+			$secrets: {
+				$join: String, // the secret for joining a party
+				$spectate: String, // the secret for spectating a game
+				$match: String, // the secret for a specific instanced match
+			},
+			$instance: Boolean,
+			flags: BigInt, // activity flags OR d together, describes what the payload includes
+		},
+	],
+	$since: Number, // unix time (in milliseconds) of when the client went idle, or null if the client is not idle
+};
diff --git a/src/Schema/Emoji.ts b/src/Schema/Emoji.ts
new file mode 100644
index 00000000..ebb9afdd
--- /dev/null
+++ b/src/Schema/Emoji.ts
@@ -0,0 +1,5 @@
+export const EmojiSchema = {
+	name: String, // the name of the emoji
+	id: BigInt, // the id of the emoji
+	animated: Boolean, // whether this emoji is animated
+};
diff --git a/src/Schema/Identify.ts b/src/Schema/Identify.ts
new file mode 100644
index 00000000..8775fac3
--- /dev/null
+++ b/src/Schema/Identify.ts
@@ -0,0 +1,17 @@
+import { ActivitySchema } from "./Activity";
+
+export const 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,
+		$$browser: String,
+		$$device: 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,
+	$shard: [Number],
+	$guild_subscriptions: Boolean,
+};
diff --git a/src/index.ts b/src/index.ts
index 69c592f9..1d501baf 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -2,5 +2,12 @@ import { checkToken } from "./checkToken";
 import Config, { DefaultOptions } from "./Config";
 import db from "./Database";
 import * as Constants from "./Constants";
+import { Channel } from "./models/Channel";
+import { Emoji } from "./models/Emoji";
+import { Guild } from "./models/Guild";
+import { Invite } from "./models/Invite";
+import { Member } from "./models/Member";
+import { Role } from "./models/Role";
+import { User } from "./models/User";
 
-export { checkToken, Config, Constants, db, DefaultOptions };
+export { checkToken, Config, Constants, db, DefaultOptions, Channel, Emoji, Guild, Invite, Member, Role, User };
diff --git a/src/models/Channel.ts b/src/models/Channel.ts
new file mode 100644
index 00000000..81fec185
--- /dev/null
+++ b/src/models/Channel.ts
@@ -0,0 +1,19 @@
+export interface Channel {
+	id: bigint;
+	guild_id: bigint;
+	last_message_id: string;
+	last_pin_timestamp: string;
+	name: string;
+	nsfw: boolean;
+	parent_id: bigint;
+	position: number;
+	rate_limit_per_user: number;
+	topic: string | null;
+	type: number;
+	permission_overwrites: {
+		allow: bigint;
+		deny: bigint;
+		id: bigint;
+		type: number;
+	}[];
+}
diff --git a/src/models/Emoji.ts b/src/models/Emoji.ts
new file mode 100644
index 00000000..1facc252
--- /dev/null
+++ b/src/models/Emoji.ts
@@ -0,0 +1,12 @@
+export interface Emoji {
+	allNamesString: string; // e.g. :thonk:
+	animated: boolean;
+	available: boolean;
+	guildId: bigint;
+	id: bigint;
+	managed: boolean;
+	name: string;
+	require_colons: boolean;
+	url: string;
+	roles: [];
+}
diff --git a/src/models/Guild.ts b/src/models/Guild.ts
new file mode 100644
index 00000000..3d84a9c8
--- /dev/null
+++ b/src/models/Guild.ts
@@ -0,0 +1,53 @@
+import { Channel } from "./Channel";
+import { Emoji } from "./Emoji";
+import { Member } from "./Member";
+import { Role } from "./Role";
+
+export interface Guild {
+	id: bigint;
+	name: string;
+	icon: string;
+	icon_hash: string;
+	splash: string;
+	discovery_splash: string;
+	owner: boolean;
+	owner_id: bigint;
+	permissions: string;
+	region: string;
+	afk_channel_id: bigint;
+	afk_timeout: number;
+	widget_enabled: boolean;
+	widget_channel_id: bigint;
+	verification_level: number;
+	default_message_notifications: number;
+	explicit_content_filter: number;
+	roles: Role[];
+	emojis: Emoji[];
+	features: [];
+	mfa_level: number;
+	application_id: bigint;
+	system_channel_id: bigint;
+	system_channel_flags: number;
+	rules_channel_id: bigint;
+	joined_at: number;
+	large: boolean;
+	unavailable: boolean;
+	member_count: number;
+	voice_states: []; // ! tf is this
+	members: Member[];
+	channels: Channel[];
+	presences: []; // TODO: add model
+	max_presences: number;
+	max_members: number;
+	vanity_url_code: string;
+	description: string;
+	banner: string;
+	premium_tier: number;
+	premium_subscription_count: number;
+	preferred_locale: string;
+	public_updates_channel_id: bigint;
+	max_video_channel_users: number;
+	approximate_member_count: number;
+	approximate_presence_count: number;
+	welcome_screen: []; // ! what is this
+}
diff --git a/src/models/Guild.ts.OLD b/src/models/Guild.ts.OLD
new file mode 100644
index 00000000..a4e7460f
--- /dev/null
+++ b/src/models/Guild.ts.OLD
@@ -0,0 +1,38 @@
+export interface Guild {
+	id: bigint;
+	name: string;
+	icon: string; // e.g. "28776e7ad42922582be25bb06cdc5b53"
+	icon_hash: string;
+	afk_channel_id: bigint;
+	afk_timeout: number;
+	application_id: bigint;
+	banner: string; // id
+	description: string;
+	explicit_content_filter: number;
+	features: string[];
+	/* guild_hashes: // ? what is this
+		channels: {hash: "uZsNP+TWAFY", omitted: false}
+		metadata: {hash: "JCboqYj68bQ", omitted: false}
+		roles: {hash: "1d7EJBRgVqg", omitted: false}
+		version: 1
+	*/
+	joined_at: string; // user specific, Date Iso: "2021-01-23T19:01:23.126002+00:00"
+	large: boolean;
+	lazy: boolean; // ? what is this
+	max_members: number; // e.g. default 100.000
+	max_video_channel_users: number; // ? default: 25, is this max 25 streaming or watching
+	member_count: number; // current member count
+	mfa_level: number;
+	owner_id: bigint;
+	preferred_locale: string; // only partnered/verified guilds can choose this
+	premium_subscription_count: number; // number of boosts
+	premium_tier: number; // ? what is this
+	public_updates_channel_id: bigint; //
+	rules_channel_id: bigint;
+	splash: string; // e.g. "32bec3d01f1dc90933cbb0bd75d333b0"
+	system_channel_flags: number;
+	system_channel_id: bigint;
+	vanity_url_code: string;
+	verification_level: number;
+	threads: []; // ? not yet finished
+}
diff --git a/src/models/Invite.ts b/src/models/Invite.ts
new file mode 100644
index 00000000..900eb4a1
--- /dev/null
+++ b/src/models/Invite.ts
@@ -0,0 +1,31 @@
+export interface Invite {
+	code: string;
+	guild: {
+		id: bigint;
+		name: string;
+		splash: string;
+		description: string;
+		icon: string;
+		features: Object;
+		verification_level: number;
+	};
+	channel: {
+		id: bigint;
+		name: string;
+		type: number;
+	};
+
+	inviter: {
+		id: bigint;
+		username: string;
+		avatar: string;
+		discriminator: number;
+	};
+	target_user: {
+		id: bigint;
+		username: string;
+		avatar: string;
+		discriminator: number;
+	};
+	target_user_type: number;
+}
diff --git a/src/models/Member.ts b/src/models/Member.ts
new file mode 100644
index 00000000..c0c5516d
--- /dev/null
+++ b/src/models/Member.ts
@@ -0,0 +1,14 @@
+import { Role } from "./Role";
+import { User } from "./User";
+
+export interface Member {
+	user: User;
+	nick: string;
+	roles: Role[];
+	joined_at: number;
+	premium_since: number;
+	deaf: boolean;
+	mute: boolean;
+	pending: boolean;
+	permissions: string;
+}
diff --git a/src/models/Role.ts b/src/models/Role.ts
new file mode 100644
index 00000000..44ddfea1
--- /dev/null
+++ b/src/models/Role.ts
@@ -0,0 +1,9 @@
+export interface Role {
+	color: number;
+	hoist: boolean;
+	managed: boolean;
+	mentionable: boolean;
+	name: string;
+	permissions: bigint;
+	position: number;
+}
diff --git a/src/models/User.ts b/src/models/User.ts
new file mode 100644
index 00000000..4cef39c6
--- /dev/null
+++ b/src/models/User.ts
@@ -0,0 +1,62 @@
+import { UserFlags } from "../util/UserFlags";
+
+export interface User {
+	id: bigint;
+	username: string;
+	discriminator: string;
+	avatar: string | null;
+	bot: boolean;
+	system: boolean;
+	mfa_enabled: boolean;
+	created_at: number;
+	verified: boolean;
+	email: string;
+	flags: bigint; // TODO: automatically convert BigInt to BitField of UserFlags
+	hash: string; // hash of the password, salt is saved in password (bcrypt)
+	valid_tokens_since: number; // all tokens with a previous issue date are invalid
+	user_settings: UserSettings;
+}
+
+export interface UserSettings {
+	afk_timeout: number;
+	allow_accessibility_detection: boolean;
+	animate_emoji: boolean;
+	animate_stickers: number;
+	contact_sync_enabled: boolean;
+	convert_emoticons: boolean;
+	custom_status: {
+		emoji_id: bigint | null;
+		emoji_name: string | null;
+		expires_at: number | null;
+		text: string | null;
+	};
+	default_guilds_restricted: boolean;
+	detect_platform_accounts: boolean;
+	developer_mode: boolean;
+	disable_games_tab: boolean;
+	enable_tts_command: boolean;
+	explicit_content_filter: number;
+	friend_source_flags: { all: boolean };
+	gif_auto_play: boolean;
+	guild_folders: // every top guild is displayed as a "folder"
+	{
+		color: number;
+		guild_ids: bigint[];
+		id: number;
+		name: string;
+	}[];
+	guild_positions: bigint[]; // guild ids ordered by position
+	inline_attachment_media: boolean;
+	inline_embed_media: boolean;
+	locale: string; // en_US
+	message_display_compact: boolean;
+	native_phone_integration_enabled: boolean;
+	render_embeds: boolean;
+	render_reactions: boolean;
+	restricted_guilds: bigint[];
+	show_current_game: boolean;
+	status: "online" | "offline" | "dnd" | "idle";
+	stream_notifications_enabled: boolean;
+	theme: "dark" | "white"; // dark
+	timezone_offset: number; // e.g -60
+}