Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 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 | import { Config } from "@/modules/shared/config/types";
import { IDatabaseService } from "@/modules/shared/database/interfaces/IDatabaseService";
import { Services } from "@/types/Constants";
import { Inject, Injectable, Logger } from "@nestjs/common";
import { ConfigService } from "@nestjs/config";
import { OnEvent } from "@nestjs/event-emitter";
import { RESTJSONErrorCodes } from "discord-api-types/v10";
import { ActivityType, Client, DiscordAPIError, PresenceData, REST, RateLimitData } from "discord.js";
import { Context, ContextOf, On, Once } from "necord";
@Injectable()
export class GatewayEvents {
public constructor(
@Inject(Services.Database) private readonly database: IDatabaseService,
private readonly config: ConfigService<Config>,
) {}
private readonly logger = new Logger(GatewayEvents.name);
private IGNORED_ERRORS = [
RESTJSONErrorCodes.UnknownMessage,
RESTJSONErrorCodes.UnknownChannel,
RESTJSONErrorCodes.UnknownGuild,
RESTJSONErrorCodes.UnknownUser,
RESTJSONErrorCodes.UnknownInteraction,
// User blocked bot or DM disabled
RESTJSONErrorCodes.CannotSendMessagesToThisUser,
// User blocked bot or DM disabled
RESTJSONErrorCodes.ReactionWasBlocked,
RESTJSONErrorCodes.MaximumActiveThreads,
];
@Once("ready")
public async onReady(@Context() [client]: ContextOf<"ready">) {
this.logger.log(`Bot logged in as ${client.user.username}`);
await this._setPresence(client);
for (const guild of client.guilds.cache.values()) {
if (!(await this.database.GuildRepo().get(guild.id))) {
await this.database.GuildRepo().create(guild);
}
}
}
@On("warn")
public onWarn(@Context() [data]: ContextOf<"warn">) {
this.logger.warn(data);
}
@Once("debug")
public async onDebug(@Context() [data]: ContextOf<"debug">) {
if (this.config.getOrThrow<Config["Debug"]>("Debug").Client) this.logger.debug(data);
}
@On("error")
public async onError(@Context() [error]: ContextOf<"error">) {
if (
error instanceof DiscordAPIError &&
typeof error.code === "number" &&
this.IGNORED_ERRORS.includes(error.code)
) {
return;
}
this.logger.verbose(`\nMessage: ${error.message}\nCause: ${error.stack}`);
}
@OnEvent("rest")
public async onRest(rest: REST) {
rest.on("rateLimited", async ({ majorParameter, timeToReset, route, method }: RateLimitData) => {
this.logger.fatal(`RateLimit on route: ${method} ${route} ${majorParameter}, Time: ${timeToReset}ms`);
});
}
private async _setPresence(client: Client) {
const presences: PresenceData = {
activities: [
{
type: ActivityType.Custom,
name: "WorkingAt",
state: `${""}N-D-B | 🎵 Music Player - 🚧 WIP`,
url: "https://discord.gg/5CHARxbaRk",
},
{
type: ActivityType.Watching,
name: "Best Bot of Discord",
},
{
type: ActivityType.Streaming,
name: "Watch my Creator Streams on Twitch!",
url: "https://Twitch.TV/NedcloarBR",
},
{
type: ActivityType.Custom,
name: "TotalStatus",
state: `👤 ${client.users.cache.size} Users - 🏠 ${client.guilds.cache.size} Guilds`,
},
],
status: "dnd",
};
function setPresence() {
const activity = presences.activities[Math.floor(Math.random() * presences.activities.length)];
client.user.setPresence({
activities: [activity],
});
}
setPresence();
setInterval(() => setPresence(), 120_000);
}
}
|