Add Discord support
This commit is contained in:
parent
af9772c702
commit
72d2316b33
|
@ -1,3 +1,4 @@
|
||||||
DATABASE_URL="postgresql://user:password@localhost/cosmic"
|
DATABASE_URL="postgresql://user:password@localhost/cosmic"
|
||||||
MPPNET_TOKEN=""
|
MPPNET_TOKEN=""
|
||||||
CHATBOX_LICENSE_KEY=""
|
CHATBOX_LICENSE_KEY=""
|
||||||
|
DISCORD_TOKEN="bot token"
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
d8,
|
||||||
|
`8P
|
||||||
|
|
||||||
|
.d888b,?88 d8P?88,.d88b, d8888b 88bd88b d8888b d8888b .d888b, 88bd8b,d88b 88b d8888b
|
||||||
|
?8b, d88 88 `?88' ?88d8b_,dP 88P' `d8P' `Pd8P' ?88 ?8b, 88P'`?8P'?8b 88Pd8P' `P
|
||||||
|
`?8b ?8( d88 88b d8P88b d88 88b 88b d88 `?8b d88 d88 88P d88 88b
|
||||||
|
`?888P' `?88P'?8b 888888P'`?888P'd88' `?888P'`?8888P'`?888P' d88' d88' 88bd88' `?888P'
|
||||||
|
88P'
|
||||||
|
d88
|
||||||
|
?8P
|
|
@ -0,0 +1 @@
|
||||||
|
path: config/ascii.txt
|
|
@ -1,4 +1,4 @@
|
||||||
enableConsole: true
|
enableConsole: true
|
||||||
enableMPP: true
|
enableMPP: false
|
||||||
enableDiscord: false
|
enableDiscord: true
|
||||||
enableSwitchChat: false
|
enableSwitchChat: false
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@prisma/client": "^5.5.2",
|
"@prisma/client": "^5.5.2",
|
||||||
"@t3-oss/env-core": "^0.7.1",
|
"@t3-oss/env-core": "^0.7.1",
|
||||||
|
"discord.js": "^14.14.1",
|
||||||
"dotenv": "^16.3.1",
|
"dotenv": "^16.3.1",
|
||||||
"hyperimport": "^0.1.0",
|
"hyperimport": "^0.1.0",
|
||||||
"mathjs": "^11.11.2",
|
"mathjs": "^11.11.2",
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
import { loadCommands } from "./commands";
|
import { loadCommands } from "./commands";
|
||||||
import { loadRoleConfig } from "./permissions";
|
import { loadRoleConfig } from "./permissions";
|
||||||
import { ServiceLoader } from "./services";
|
import { ServiceLoader } from "./services";
|
||||||
|
import { printStartupASCII } from "./util/ascii";
|
||||||
|
|
||||||
|
printStartupASCII();
|
||||||
loadRoleConfig();
|
loadRoleConfig();
|
||||||
loadCommands();
|
loadCommands();
|
||||||
ServiceLoader.loadServices();
|
ServiceLoader.loadServices();
|
||||||
|
|
|
@ -0,0 +1,102 @@
|
||||||
|
import Discord from "discord.js";
|
||||||
|
import { ServiceAgent } from "../ServiceAgent";
|
||||||
|
import { ChatMessage } from "../console/MicroHandler";
|
||||||
|
import { CommandHandler } from "../../commands/CommandHandler";
|
||||||
|
|
||||||
|
export class DiscordAgent extends ServiceAgent<Discord.Client> {
|
||||||
|
constructor(private token: string) {
|
||||||
|
const cl = new Discord.Client({
|
||||||
|
intents: ["Guilds", "GuildMessages", "MessageContent"]
|
||||||
|
});
|
||||||
|
|
||||||
|
super("discord", cl);
|
||||||
|
}
|
||||||
|
|
||||||
|
private wasDestroyed = false;
|
||||||
|
|
||||||
|
public start(): void {
|
||||||
|
this.wasDestroyed
|
||||||
|
? (this.client = new Discord.Client({
|
||||||
|
intents: ["Guilds", "GuildMessages", "MessageContent"]
|
||||||
|
}))
|
||||||
|
: undefined;
|
||||||
|
|
||||||
|
this.wasDestroyed = false;
|
||||||
|
|
||||||
|
this.client.login(this.token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public stop(): void {
|
||||||
|
this.client.destroy();
|
||||||
|
this.wasDestroyed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private lastChannelId: string | undefined;
|
||||||
|
|
||||||
|
public getLastChannelId() {
|
||||||
|
return this.lastChannelId;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected bindEventListeners(): void {
|
||||||
|
this.client.on("ready", () => {});
|
||||||
|
|
||||||
|
this.client.on("messageCreate", async msg => {
|
||||||
|
const _id = "DISCORD_" + msg.author.id;
|
||||||
|
|
||||||
|
this.emit("chat", {
|
||||||
|
m: "a",
|
||||||
|
a: msg.content,
|
||||||
|
p: {
|
||||||
|
_id,
|
||||||
|
name: msg.author.username,
|
||||||
|
color: msg.author.hexAccentColor || "#000000",
|
||||||
|
platformId: msg.author.id
|
||||||
|
}
|
||||||
|
} as ChatMessage);
|
||||||
|
|
||||||
|
let args = msg.content.split(" ");
|
||||||
|
|
||||||
|
const str = await CommandHandler.handleCommand(
|
||||||
|
{
|
||||||
|
m: "command",
|
||||||
|
a: msg.content,
|
||||||
|
argc: args.length,
|
||||||
|
argv: args,
|
||||||
|
p: {
|
||||||
|
_id,
|
||||||
|
name: msg.author.username,
|
||||||
|
color: msg.author.hexAccentColor || "#000000",
|
||||||
|
platformId: msg.author.id
|
||||||
|
},
|
||||||
|
originalMessage: msg
|
||||||
|
},
|
||||||
|
this
|
||||||
|
);
|
||||||
|
|
||||||
|
if (str) {
|
||||||
|
if (typeof str == "string") {
|
||||||
|
const channel = await this.client.channels.fetch(
|
||||||
|
msg.channelId
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!channel) return;
|
||||||
|
if (!channel.isTextBased()) return;
|
||||||
|
channel.send(`\u034f${str}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.on("send chat", async text => {
|
||||||
|
if (!this.lastChannelId) return;
|
||||||
|
|
||||||
|
const channel = await this.client.channels.fetch(
|
||||||
|
this.lastChannelId
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!channel) return;
|
||||||
|
if (!channel.isTextBased()) return;
|
||||||
|
|
||||||
|
channel.send(`\u034f${text}`);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,6 +4,7 @@ import { ServiceAgent } from "./ServiceAgent";
|
||||||
import { loadConfig } from "../util/config";
|
import { loadConfig } from "../util/config";
|
||||||
import { SwitchChatAgent } from "./switchchat";
|
import { SwitchChatAgent } from "./switchchat";
|
||||||
import { ConsoleAgent } from "./console";
|
import { ConsoleAgent } from "./console";
|
||||||
|
import { DiscordAgent } from "./discord";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Services are anything (any platforms or environments) that the bot will directly communicate to users with
|
* Services are anything (any platforms or environments) that the bot will directly communicate to users with
|
||||||
|
@ -79,6 +80,13 @@ export class ServiceLoader {
|
||||||
this.addAgent(switchChatAgent);
|
this.addAgent(switchChatAgent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (config.enableDiscord) {
|
||||||
|
const discordAgent = new DiscordAgent(env.DISCORD_TOKEN);
|
||||||
|
|
||||||
|
discordAgent.start();
|
||||||
|
this.addAgent(discordAgent);
|
||||||
|
}
|
||||||
|
|
||||||
if (config.enableConsole) {
|
if (config.enableConsole) {
|
||||||
const consoleAgent = new ConsoleAgent();
|
const consoleAgent = new ConsoleAgent();
|
||||||
|
|
||||||
|
|
|
@ -73,7 +73,6 @@ export class MPPAgent extends ServiceAgent<Client> {
|
||||||
);
|
);
|
||||||
|
|
||||||
if (str) {
|
if (str) {
|
||||||
this.logger.debug(str);
|
|
||||||
if (typeof str == "string") {
|
if (typeof str == "string") {
|
||||||
if (str.includes("\n")) {
|
if (str.includes("\n")) {
|
||||||
let sp = str.split("\n");
|
let sp = str.split("\n");
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
import { loadConfig } from "./config";
|
||||||
|
import { readFileSync } from "fs";
|
||||||
|
|
||||||
|
const config = loadConfig("config/ascii.yml", {
|
||||||
|
path: "config/ascii.txt"
|
||||||
|
});
|
||||||
|
|
||||||
|
export function printStartupASCII() {
|
||||||
|
const data = readFileSync(config.path);
|
||||||
|
|
||||||
|
// To make a compromise with PM2's logs,
|
||||||
|
// we will attempt to write every line
|
||||||
|
// with a color character so the entire
|
||||||
|
// file is printed in color.
|
||||||
|
for (const line of data.toString().split("\n")) {
|
||||||
|
process.stdout.write(`\x1b[35m${line}\x1b[0m\n`);
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,7 +8,8 @@ export const env = createEnv({
|
||||||
isServer: true,
|
isServer: true,
|
||||||
server: {
|
server: {
|
||||||
MPPNET_TOKEN: z.string(),
|
MPPNET_TOKEN: z.string(),
|
||||||
CHATBOX_LICENSE_KEY: z.string()
|
CHATBOX_LICENSE_KEY: z.string(),
|
||||||
|
DISCORD_TOKEN: z.string()
|
||||||
},
|
},
|
||||||
runtimeEnv: process.env
|
runtimeEnv: process.env
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue