diff options
Diffstat (limited to 'util/src/models/Guild.ts')
-rw-r--r-- | util/src/models/Guild.ts | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/util/src/models/Guild.ts b/util/src/models/Guild.ts new file mode 100644 index 00000000..13a7d078 --- /dev/null +++ b/util/src/models/Guild.ts @@ -0,0 +1,161 @@ +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"); |