/[sudobot]/trunk/src/client/Client.ts
ViewVC logotype

Contents of /trunk/src/client/Client.ts

Parent Directory Parent Directory | Revision Log Revision Log


Revision 397 - (show annotations)
Mon Jul 29 17:30:01 2024 UTC (8 months, 1 week ago) by rakin
File MIME type: application/typescript
File size: 6961 byte(s)
feat: add cooldown support
1 /**
2 * This file is part of SudoBot.
3 *
4 * Copyright (C) 2021-2022 OSN Inc.
5 *
6 * SudoBot is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Affero General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * SudoBot is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Affero General Public License for more details.
15 *
16 * You should have received a copy of the GNU Affero General Public License
17 * along with SudoBot. If not, see <https://www.gnu.org/licenses/>.
18 */
19
20 import { Client, ClientOptions, Collection, Interaction, Message } from 'discord.js';
21 import BaseEvent from '../utils/structures/BaseEvent';
22 import BaseCommand from '../utils/structures/BaseCommand';
23 import { Config } from './Config';
24 import Database from './Database';
25 import path from 'path';
26 import { appendFile } from "fs/promises";
27 import Logger from '../automod/Logger';
28 import SnippetManager from '../services/SnippetManager';
29 import AFKEngine from '../services/AFKEngine';
30 import Auth from '../services/Auth';
31 import MessageFilter from '../automod/MessageFilter';
32 import AntiRaid from '../automod/AntiRaid';
33 import Starboard from '../services/Starboard';
34 import Server from '../api/Server';
35 import StartupManager from '../services/StartupManager';
36 import AutoClear from '../automod/AutoClear';
37 import RandomStatus from '../services/RandomStatus';
38 import DebugLogger from '../services/DebugLogger';
39 import BaseCLICommand from '../utils/structures/BaseCLICommand';
40 import discordModals from 'discord-modals';
41 import SpamFilter from '../automod/SpamFilter';
42 import Verification from '../services/Verification';
43 import Welcomer from '../services/Welcomer';
44 import Antijoin from '../automod/Antijoin';
45 import Automute from '../automod/Automute';
46 import ServiceManager from './ServiceManager';
47 import ChannelLockManager from '../services/ChannelLockManager';
48 import Cooldown from '../services/Cooldown';
49
50 export default class DiscordClient extends Client {
51 private _commands = new Collection<string, BaseCommand>();
52 private _cliCommands = new Collection<string, BaseCLICommand>();
53 private _events = new Collection<string, BaseEvent>();
54
55 rootdir: string;
56 msg: Message | Interaction | null = null;
57
58 config: Config;
59 db: Database;
60 server: Server;
61 serviceManager: ServiceManager;
62
63 logger: Logger = {} as Logger;
64 snippetManager: SnippetManager = {} as SnippetManager;
65 afkEngine: AFKEngine = {} as AFKEngine;
66 auth: Auth = {} as Auth;
67 spamFilter: SpamFilter = {} as SpamFilter;
68 messageFilter: MessageFilter = {} as MessageFilter;
69 antiraid: AntiRaid = {} as AntiRaid;
70 starboard: Starboard = {} as Starboard;
71 startupManager: StartupManager = {} as StartupManager;
72 autoClear: AutoClear = {} as AutoClear;
73 randomStatus: RandomStatus = {} as RandomStatus;
74 debugLogger: DebugLogger = {} as DebugLogger;
75 verification: Verification = {} as Verification;
76 welcomer: Welcomer = {} as Welcomer;
77 antijoin: Antijoin = {} as Antijoin;
78 automute: Automute = {} as Automute;
79 channelLock: ChannelLockManager = {} as ChannelLockManager;
80 cooldown: Cooldown = {} as Cooldown;
81
82 aliases = {
83 automod: path.resolve(__dirname, '..', 'automod'),
84 services: path.resolve(__dirname, '..', 'services'),
85 };
86
87 services = {
88 "@services/DebugLogger": "debugLogger",
89 "@automod/Logger": "logger",
90 "@services/SnippetManager": "snippetManager",
91 "@services/AFKEngine": "afkEngine",
92 "@services/Auth": "auth",
93 "@automod/SpamFilter": "spamFilter",
94 "@automod/MessageFilter": "messageFilter",
95 "@automod/AntiRaid": "antiraid",
96 "@services/Starboard": "starboard",
97 "@services/StartupManager": "startupManager",
98 "@automod/AutoClear": "autoClear",
99 "@services/RandomStatus": "randomStatus",
100 "@services/Verification": "verification",
101 "@services/Welcomer": "welcomer",
102 "@services/ChannelLockManager": "channelLock",
103 "@automod/Antijoin": "antijoin",
104 "@automod/Automute": "automute",
105 "@services/Cooldown": "cooldown",
106 };
107
108 static client: DiscordClient;
109
110 constructor(options: ClientOptions, rootdir: string = __dirname) {
111 super({
112 ws: {
113 properties: {
114 browser: "Discord iOS"
115 }
116 },
117 ...options
118 });
119
120 process.on('uncaughtException', (error, origin) => {
121 console.log('Uncaught', error);
122 this.handleCrash(error, origin).then(() => process.exit(-1)).catch(err => {
123 console.log(err);
124 process.exit(-1);
125 });
126 });
127
128 console.log('init');
129
130 this.rootdir = rootdir;
131
132 DiscordClient.client = this;
133
134 this.config = new Config(this);
135 this.db = new Database(this);
136 this.serviceManager = new ServiceManager(this, this.aliases);
137 this.serviceManager.load(this.services);
138
139 // this.logger = new Logger(this);
140 // this.snippetManager = new SnippetManager(this);
141 // this.afkEngine = new AFKEngine(this);
142 // this.auth = new Auth(this);
143 // this.spamFilter = new SpamFilter(this);
144 // this.messageFilter = new MessageFilter(this);
145 // this.antiraid = new AntiRaid(this);
146 // this.starboard = new Starboard(this);
147 // this.cooldown = new Cooldown(this);
148 // this.startupManager = new StartupManager(this);
149 // this.autoClear = new AutoClear(this);
150 // this.randomStatus = new RandomStatus(this);
151 // this.debugLogger = new DebugLogger(this);
152 // this.verification = new Verification(this);
153 // this.welcomer = new Welcomer(this);
154 // this.antijoin = new Antijoin(this);
155 // this.automute = new Automute(this);
156
157 this.server = new Server(this);
158
159 discordModals(this);
160 }
161
162 get commands(): Collection<string, BaseCommand> {
163 return this._commands;
164 }
165
166 get cliCommands(): Collection<string, BaseCLICommand> {
167 return this._cliCommands;
168 }
169
170 get events(): Collection<string, BaseEvent> {
171 return this._events;
172 }
173
174 setMessage(msg: Message | Interaction) {
175 this.msg = msg;
176 }
177
178 async handleCrash(error: Error, origin: NodeJS.UncaughtExceptionOrigin) {
179 console.log('here');
180 await appendFile(path.join(process.env.SUDO_PREFIX ?? (__dirname + "/../../"), "logs", "error.log"), `Uncaught ${error.name}: ${error.message}\n+ ${error.stack}`);
181 await this.debugLogger.logToHomeServer(`Uncaught ${error.name}: ${error.message}\n${error.stack}`);
182 }
183 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26