Files
server/util/src/entities/Message.ts
2021-08-24 16:34:46 +02:00

261 lines
5.6 KiB
TypeScript

import { User } from "./User";
import { Member } from "./Member";
import { Role } from "./Role";
import { Channel } from "./Channel";
import { InteractionType } from "../interfaces/Interaction";
import { Application } from "./Application";
import { Column, CreateDateColumn, Entity, JoinColumn, ManyToMany, ManyToOne, UpdateDateColumn } from "typeorm";
import { BaseClass } from "./BaseClass";
import { Guild } from "./Guild";
import { Webhook } from "./Webhook";
export enum MessageType {
DEFAULT = 0,
RECIPIENT_ADD = 1,
RECIPIENT_REMOVE = 2,
CALL = 3,
CHANNEL_NAME_CHANGE = 4,
CHANNEL_ICON_CHANGE = 5,
CHANNEL_PINNED_MESSAGE = 6,
GUILD_MEMBER_JOIN = 7,
USER_PREMIUM_GUILD_SUBSCRIPTION = 8,
USER_PREMIUM_GUILD_SUBSCRIPTION_TIER_1 = 9,
USER_PREMIUM_GUILD_SUBSCRIPTION_TIER_2 = 10,
USER_PREMIUM_GUILD_SUBSCRIPTION_TIER_3 = 11,
CHANNEL_FOLLOW_ADD = 12,
GUILD_DISCOVERY_DISQUALIFIED = 14,
GUILD_DISCOVERY_REQUALIFIED = 15,
REPLY = 19,
APPLICATION_COMMAND = 20,
}
@Entity("messages")
export class Message extends BaseClass {
@Column()
id: string;
@Column()
channel_id: string;
@JoinColumn({ name: "channel_id" })
@ManyToOne(() => Channel, (channel: Channel) => channel.id)
channel: Channel;
@Column()
guild_id: string;
@JoinColumn({ name: "guild_id" })
@ManyToOne(() => Guild, (guild: Guild) => guild.id)
guild?: Guild;
@Column()
author_id: string;
@JoinColumn({ name: "author_id" })
@ManyToOne(() => User, (user: User) => user.id)
author?: User;
@Column()
member_id: string;
@JoinColumn({ name: "member_id" })
@ManyToOne(() => Member, (member: Member) => member.id)
member?: Member;
@Column()
webhook_id: string;
@JoinColumn({ name: "webhook_id" })
@ManyToOne(() => Webhook, (webhook: Webhook) => webhook.id)
webhook?: Webhook;
@Column()
application_id: string;
@JoinColumn({ name: "application_id" })
@ManyToOne(() => Application, (application: Application) => application.id)
application?: Application;
@Column()
content?: string;
@Column()
@CreateDateColumn()
timestamp: Date;
@Column()
@UpdateDateColumn()
edited_timestamp?: Date;
@Column()
tts?: boolean;
@Column()
mention_everyone?: boolean;
@Column("simple-array")
mention_user_ids: string[];
@JoinColumn({ name: "mention_user_ids" })
@ManyToMany(() => User, (user: User) => user.id)
mention_users: User[];
@Column("simple-array")
mention_role_ids: string[];
@JoinColumn({ name: "mention_role_ids" })
@ManyToMany(() => Role, (role: Role) => role.id)
mention_roles: Role[];
@Column("simple-array")
mention_channel_ids: string[];
@JoinColumn({ name: "mention_channel_ids" })
@ManyToMany(() => Channel, (channel: Channel) => channel.id)
mention_channels: Channel[];
@Column("simple-json")
attachments: Attachment[];
@Column("simple-json")
embeds: Embed[];
@Column("simple-json")
reactions: Reaction[];
@Column({ type: "text" })
nonce?: string | number;
@Column()
pinned?: boolean;
@Column({ type: "simple-enum", enum: MessageType })
type: MessageType;
@Column("simple-json")
activity?: {
type: number;
party_id: string;
};
@Column({ type: "bigint" })
flags?: bigint;
@Column("simple-json")
stickers?: any[];
@Column("simple-json")
message_reference?: {
message_id: string;
channel_id?: string;
guild_id?: string;
};
@Column("simple-json")
interaction?: {
id: string;
type: InteractionType;
name: string;
user_id: string; // the user who invoked the interaction
// user: User; // TODO: autopopulate user
};
@Column("simple-json")
components: MessageComponent[];
}
export interface MessageComponent {
type: number;
style?: number;
label?: string;
emoji?: PartialEmoji;
custom_id?: string;
url?: string;
disabled?: boolean;
components: MessageComponent[];
}
export enum MessageComponentType {
ActionRow = 1,
Button = 2,
}
export interface Attachment {
id: string; // attachment id
filename: string; // name of file attached
size: number; // size of file in bytes
url: string; // source url of file
proxy_url: string; // a proxied url of file
height?: number; // height of file (if image)
width?: number; // width of file (if image)
content_type?: string;
}
export interface Embed {
title?: string; //title of embed
type?: EmbedType; // type of embed (always "rich" for webhook embeds)
description?: string; // description of embed
url?: string; // url of embed
timestamp?: Date; // timestamp of embed content
color?: number; // color code of the embed
footer?: {
text: string;
icon_url?: string;
proxy_icon_url?: string;
}; // footer object footer information
image?: EmbedImage; // image object image information
thumbnail?: EmbedImage; // thumbnail object thumbnail information
video?: EmbedImage; // video object video information
provider?: {
name?: string;
url?: string;
}; // provider object provider information
author?: {
name?: string;
url?: string;
icon_url?: string;
proxy_icon_url?: string;
}; // author object author information
fields?: {
name: string;
value: string;
inline?: boolean;
}[];
}
export enum EmbedType {
rich = "rich",
image = "image",
video = "video",
gifv = "gifv",
article = "article",
link = "link",
}
export interface EmbedImage {
url?: string;
proxy_url?: string;
height?: number;
width?: number;
}
export interface Reaction {
count: number;
//// not saved in the database // me: boolean; // whether the current user reacted using this emoji
emoji: PartialEmoji;
user_ids: string[];
}
export interface PartialEmoji {
id?: string;
name: string;
animated?: boolean;
}
export interface AllowedMentions {
parse?: ("users" | "roles" | "everyone")[];
roles?: string[];
users?: string[];
replied_user?: boolean;
}