Newer
Older
percord / rtc / src / models / Guild.ts
@Flam3rboy Flam3rboy on 12 Aug 2021 4 KB :sparkles: rtc
import { Schema, model, Types, Document } from "mongoose";
import db from "../util/Database";
import { ChannelModel } from "./Channel";
import { EmojiModel } from "./Emoji";
import { MemberModel } from "./Member";
import { RoleModel } from "./Role";

export interface GuildDocument extends Document, Guild {
	id: string;
}

export interface Guild {
	id: string;
	afk_channel_id?: string;
	afk_timeout?: number;
	application_id?: string;
	banner?: string;
	default_message_notifications?: number;
	description?: string;
	discovery_splash?: string;
	explicit_content_filter?: number;
	features: string[];
	icon?: string;
	large?: boolean;
	max_members?: number; // e.g. default 100.000
	max_presences?: number;
	max_video_channel_users?: number; // ? default: 25, is this max 25 streaming or watching
	member_count?: number;
	presence_count?: number; // users online
	// members?: Member[]; // * Members are stored in a seperate collection
	// roles: Role[]; // * Role are stored in a seperate collection
	// channels: GuildChannel[]; // * Channels are stored in a seperate collection
	// emojis: Emoji[];  // * Emojis are stored in a seperate collection
	// voice_states: []; // * voice_states are stored in a seperate collection
    //TODO:
	presences?: object[];
	mfa_level?: number;
	name: string;
	owner_id: string;
	preferred_locale?: string; // only community guilds can choose this
	premium_subscription_count?: number;
	premium_tier?: number; // nitro boost level
	public_updates_channel_id?: string;
	region?: string;
	rules_channel_id?: string;
	splash?: string;
	system_channel_flags?: number;
	system_channel_id?: string;
	unavailable?: boolean;
	vanity_url?: {
		code: string;
		uses: number;
	};
	verification_level?: number;
	welcome_screen: {
		enabled: boolean;
		description: string;
		welcome_channels: { 
		description: string;
	    emoji_id?: string;
	    emoji_name: string;
	    channel_id: string }[];
	};
	widget_channel_id?: string;
	widget_enabled?: boolean;
}

export const GuildSchema = new Schema({
	id: { type: String, required: true },
	afk_channel_id: String,
	afk_timeout: Number,
	application_id: String,
	banner: String,
	default_message_notifications: Number,
	description: String,
	discovery_splash: String,
	explicit_content_filter: Number,
	features: { type: [String], default: [] },
	icon: String,
	large: Boolean,
	max_members: { type: Number, default: 100000 },
	max_presences: Number,
	max_video_channel_users: { type: Number, default: 25 },
	member_count: Number,
	presences: { type: [Object], default: [] },
	presence_count: Number,
	mfa_level: Number,
	name: { type: String, required: true },
	owner_id: { type: String, required: true },
	preferred_locale: String,
	premium_subscription_count: Number,
	premium_tier: Number,
	public_updates_channel_id: String,
	region: String,
	rules_channel_id: String,
	splash: String,
	system_channel_flags: Number,
	system_channel_id: String,
	unavailable: Boolean,
	vanity_url: {
		code: String,
		uses: Number
	},
	verification_level: Number,
	voice_states: { type: [Object], default: [] },
	welcome_screen: {
		enabled: Boolean,
		description: String,
		welcome_channels: [{ 
		description: String,
	    emoji_id: String,
	    emoji_name: String,
	    channel_id: String }],
	},
	widget_channel_id: String,
	widget_enabled: Boolean,
});

GuildSchema.virtual("channels", {
	ref: ChannelModel,
	localField: "id",
	foreignField: "guild_id",
	justOne: false,
	autopopulate: true,
});

GuildSchema.virtual("roles", {
	ref: RoleModel,
	localField: "id",
	foreignField: "guild_id",
	justOne: false,
	autopopulate: true,
});

// nested populate is needed for member users: https://gist.github.com/yangsu/5312204
GuildSchema.virtual("members", {
	ref: MemberModel,
	localField: "id",
	foreignField: "guild_id",
	justOne: false,
});

GuildSchema.virtual("emojis", {
	ref: EmojiModel,
	localField: "id",
	foreignField: "guild_id",
	justOne: false,
	autopopulate: true,
});

GuildSchema.virtual("joined_at", {
	ref: MemberModel,
	localField: "id",
	foreignField: "guild_id",
	justOne: true,
}).get((member: any, virtual: any, doc: any) => {
	return member?.joined_at;
});

// @ts-ignore
export const GuildModel = db.model<GuildDocument>("Guild", GuildSchema, "guilds");