aboutsummaryrefslogtreecommitdiff
path: root/src/lib/models/ActivePunishment.ts
blob: 12b0cabb6524b20dd76e7d1575e8b55a51aa394a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import { Snowflake } from 'discord.js';
import { nanoid } from 'nanoid';
import { DataTypes, Sequelize } from 'sequelize';
import { BaseModel } from './BaseModel';

export enum ActivePunishmentType {
	BAN = 'BAN',
	MUTE = 'MUTE',
	ROLE = 'ROLE',
	BLOCK = 'BLOCK'
}

export interface ActivePunishmentModel {
	id: string;
	type: ActivePunishmentType;
	user: Snowflake;
	guild: Snowflake;
	extraInfo: Snowflake;
	expires: Date | null;
	modlog: string;
}
export interface ActivePunishmentModelCreationAttributes {
	id?: string;
	type: ActivePunishmentType;
	user: Snowflake;
	guild: Snowflake;
	extraInfo?: Snowflake;
	expires?: Date;
	modlog: string;
}

const NEVER_USED = 'This should never be executed';

export class ActivePunishment
	extends BaseModel<ActivePunishmentModel, ActivePunishmentModelCreationAttributes>
	implements ActivePunishmentModel
{
	/**
	 * The ID of this punishment (no real use just for a primary key)
	 */
	public get id(): string {
		throw new Error(NEVER_USED);
	}
	public set id(_: string) {
		throw new Error(NEVER_USED);
	}

	/**
	 * The type of punishment.
	 */
	public get type(): ActivePunishmentType {
		throw new Error(NEVER_USED);
	}
	public set type(_: ActivePunishmentType) {
		throw new Error(NEVER_USED);
	}

	/**
	 * The user who is punished.
	 */
	public get user(): Snowflake {
		throw new Error(NEVER_USED);
	}
	public set user(_: Snowflake) {
		throw new Error(NEVER_USED);
	}

	/**
	 * The guild they are punished in.
	 */
	public get guild(): Snowflake {
		throw new Error(NEVER_USED);
	}
	public set guild(_: Snowflake) {
		throw new Error(NEVER_USED);
	}

	/**
	 * Additional info about the punishment if applicable. The channel id for channel blocks and role for punishment roles.
	 */
	public get extraInfo(): Snowflake {
		throw new Error(NEVER_USED);
	}
	public set extraInfo(_: Snowflake) {
		throw new Error(NEVER_USED);
	}

	/**
	 * The date when this punishment expires (optional).
	 */
	public get expires(): Date | null {
		throw new Error(NEVER_USED);
	}
	public set expires(_: Date | null) {
		throw new Error(NEVER_USED);
	}

	/**
	 * The reference to the modlog entry.
	 */
	public get modlog(): string {
		throw new Error(NEVER_USED);
	}
	public set modlog(_: string) {
		throw new Error(NEVER_USED);
	}

	public static initModel(sequelize: Sequelize): void {
		ActivePunishment.init(
			{
				id: {
					type: DataTypes.STRING,
					primaryKey: true,
					allowNull: false,
					defaultValue: nanoid
				},
				type: {
					type: DataTypes.STRING,
					allowNull: false
				},
				user: {
					type: DataTypes.STRING,
					allowNull: false
				},
				guild: {
					type: DataTypes.STRING,
					allowNull: false,
					references: {
						model: 'Guilds',
						key: 'id'
					}
				},
				extraInfo: {
					type: DataTypes.STRING,
					allowNull: true
				},
				expires: {
					type: DataTypes.DATE,
					allowNull: true
				},
				modlog: {
					type: DataTypes.STRING,
					allowNull: true,
					references: {
						model: 'ModLogs',
						key: 'id'
					}
				}
			},
			{ sequelize }
		);
	}
}