Ein Bot, viele Server
Einstellungen pro Server: /prefix setzt ein Präfix für Textbefehle auf nur einem Server.
Bevor du beginnst
Erstelle eine Anwendung, installiere sie auf einem Testserver und setze drei Umgebungsvariablen (siehe Starte deinen Bot):
export ZRZUR_BOT_TOKEN=YOUR_BOT_TOKEN
export ZRZUR_API_URL=https://api.zrzur.com
export ZRZUR_WS_URL=wss://events.zrzur.comSchalte dann im Entwicklerportal den Intent Nachrichteninhalt für den Bot ein: Ohne ihn bekommt der Bot Nachrichten ohne Text, und wenn er angefordert wird, aber aus ist, scheitert die Verbindung. Siehe Intents.
Der Code
// One bot, many servers: every setting is keyed by server id. `/prefix`
// sets a text-command prefix for this server only.
import { Client, Intents } from "@zrzur/sdk/bot";
const bot = new Client({
token: process.env.ZRZUR_BOT_TOKEN,
apiUrl: process.env.ZRZUR_API_URL,
wsUrl: process.env.ZRZUR_WS_URL,
// privileged: switch it on for the bot in the Developer Portal first
intents: [Intents.Default, Intents.MessageContent],
});
const MANAGE_SERVER = 1n << 1n;
/** server id → prefix */
const prefixes = new Map();
/** channel id → server id, from Ready and channel events */
const serverOf = new Map();
bot.on("Ready", (event) => {
for (const channel of event.channels ?? [])
if (channel.server) serverOf.set(channel._id, channel.server);
});
bot.on(
"ChannelCreate",
(channel) => channel.server && serverOf.set(channel._id, channel.server),
);
bot.on("ServerCreate", (event) => {
// the bot was added to a new server
for (const channel of event.channels ?? [])
serverOf.set(channel._id, event.id);
});
bot.on("ServerDelete", (event) => prefixes.delete(event.id));
bot.command("prefix", (i) => {
if ((BigInt(i.raw.user_permissions) & MANAGE_SERVER) !== MANAGE_SERVER)
return i.reply({ content: "You need Manage Server.", ephemeral: true });
prefixes.set(i.serverId, i.option("value"));
return i.reply({
content: `Prefix for this server: ${i.option("value")}`,
ephemeral: true,
});
});
bot.onMessage((message) => {
const prefix = prefixes.get(serverOf.get(message.channel)) ?? "!";
if (message.content === `${prefix}where`) {
return bot.messages.reply(
message,
`This is server ${serverOf.get(message.channel)}.`,
);
}
});
await bot.login();
await bot.syncCommands([
{
name: "prefix",
description: "Set the text-command prefix for this server",
options: [
{
type: "String",
name: "value",
description: "Prefix",
required: true,
max_length: 3,
},
],
},
]);
console.log("ready");
Starte es mit node multi-server.mjs.
Probiere es aus
Führe /prefix value:? auf einem Server aus, sende dann dort ?where und auf einem anderen Server !where.
Was es zeigt
Readylistet jeden Kanal mit seinem Server;ChannelCreateundServerCreateergänzen neue.ServerDeletesagt dem Bot, dass er gegangen ist oder entfernt wurde: Lösche die Einstellungen dieses Servers.- Bewahre Einstellungen in Produktion in einer Datenbank auf; diese Demo hält sie im Speicher.