q13x-eaglerproxy/server/plugins/EagProxyAAS/commands.js

285 lines
10 KiB
JavaScript
Raw Normal View History

2024-09-04 05:02:00 -07:00
import { dirname, join } from "path";
import { Enums } from "../../proxy/Enums.js";
import { config } from "./config.js";
import { ConnectType } from "./types.js";
import fs from "fs/promises";
import { fileURLToPath } from "url";
const SEPARATOR = "======================================";
const METADATA = JSON.parse((await fs.readFile(join(dirname(fileURLToPath(import.meta.url)), "metadata.json"))).toString());
export function sendPluginChatMessage(client, ...components) {
if (components.length == 0)
throw new Error("There must be one or more passed components!");
else {
client.ws.send(client.serverSerializer.createPacketBuffer({
name: "chat",
params: {
message: JSON.stringify({
text: "[EagPAAS] ",
color: "gold",
extra: components,
}),
},
}));
}
}
export function handleCommand(sender, cmd) {
switch (cmd.toLowerCase().split(/ /gim)[0]) {
default:
sendPluginChatMessage(sender, {
text: `"${cmd.split(/ /gim, 1)[0]}" is not a valid command!`,
color: "red",
});
break;
case "/eag-help":
helpCommand(sender);
break;
case "/eag-toggleparticles":
toggleParticles(sender);
break;
case "/eag-switchservers":
switchServer(cmd, sender);
break;
}
}
export function helpCommand(sender) {
sendPluginChatMessage(sender, {
text: SEPARATOR,
color: "yellow",
});
sendPluginChatMessage(sender, {
text: "Available Commands:",
color: "aqua",
});
sendPluginChatMessage(sender, {
text: "/eag-help",
color: "light_green",
hoverEvent: {
action: "show_text",
value: Enums.ChatColor.GOLD + "Click me to run this command!",
},
clickEvent: {
action: "run_command",
value: "/eag-help",
},
extra: [
{
text: " - Prints out a list of commmands",
color: "aqua",
},
],
});
sendPluginChatMessage(sender, {
text: "/eag-toggleparticles",
color: "light_green",
hoverEvent: {
action: "show_text",
value: Enums.ChatColor.GOLD + "Click me to run this command!",
},
clickEvent: {
action: "run_command",
value: "/eag-toggleparticles",
},
extra: [
{
text: " - Toggles whether or not particles should be rendered/shown on the client. Turning this on can potentially boost FPS.",
color: "aqua",
},
],
});
sendPluginChatMessage(sender, {
text: `/eag-switchservers <mode: online|offline> <ip>${config.allowCustomPorts ? " [port]" : ""}`,
color: "light_green",
hoverEvent: {
action: "show_text",
value: Enums.ChatColor.GOLD + "Click me to paste this command to chat!",
},
clickEvent: {
action: "suggest_command",
value: `/eag-switchservers <mode: online|offline> <ip>${config.allowCustomPorts ? " [port]" : ""}`,
},
extra: [
{
text: " - Switch between servers on-the-fly. Switching to servers in online mode requires logging in via online mode or EasyMC!",
color: "aqua",
},
],
});
sendPluginChatMessage(sender, {
text: `Running ${METADATA.name} on version v${METADATA.version}.`,
color: "gray",
});
sendPluginChatMessage(sender, {
text: SEPARATOR,
color: "yellow",
});
}
export function toggleParticles(sender) {
const listener = sender._particleListener;
if (listener != null) {
sender.removeListener("vanillaPacket", listener);
sender._particleListener = undefined;
sendPluginChatMessage(sender, {
text: "Disabled particle hider!",
color: "red",
});
}
else {
sender._particleListener = (packet, origin) => {
if (origin == "SERVER") {
if (packet.name == "world_particles") {
packet.cancel = true;
}
else if (packet.name == "world_event") {
if (packet.params.effectId >= 2000) {
packet.cancel = true;
}
}
}
};
sender.on("vanillaPacket", sender._particleListener);
sendPluginChatMessage(sender, {
text: "Enabled particle hider!",
color: "green",
});
}
}
export async function switchServer(cmd, sender) {
if (sender._serverSwitchLock) {
return sendPluginChatMessage(sender, {
text: `There is already a pending server switch - please wait, and be patient!`,
color: "red",
});
}
let split = cmd.split(/ /gim).slice(1), mode = split[0]?.toLowerCase(), ip = split[1], port = split[2];
if (mode != "online" && mode != "offline") {
return sendPluginChatMessage(sender, {
text: `Invalid command usage - please provide a valid mode! `,
color: "red",
extra: [
{
text: `/eag-switchservers <mode: online|offline> <ip>${config.allowCustomPorts ? " [port]" : ""}.`,
color: "gold",
},
],
});
}
if (ip == null) {
return sendPluginChatMessage(sender, {
text: `Invalid command usage - please provide a valid IP or hostname (like example.com, 1.2.3.4, etc.)! `,
color: "red",
extra: [
{
text: `/eag-switchservers <mode: online|offline> <ip>${config.allowCustomPorts ? " [port]" : ""}.`,
color: "gold",
},
],
});
}
if (port != null &&
(isNaN(Number(port)) || Number(port) < 1 || Number(port) > 65535)) {
return sendPluginChatMessage(sender, {
text: `Invalid command usage - a port must be a number above 0 and below 65536! `,
color: "red",
extra: [
{
text: `/eag-switchservers <mode: online|offline> <ip>${config.allowCustomPorts ? " [port]" : ""}.`,
color: "gold",
},
],
});
}
if (port != null && !config.allowCustomPorts) {
return sendPluginChatMessage(sender, {
text: `Invalid command usage - custom server ports are disabled on this proxy instance! `,
color: "red",
extra: [
{
text: `/eag-switchservers <mode: online|offline> <ip>${config.allowCustomPorts ? " [port]" : ""}.`,
color: "gold",
},
],
});
}
let connectionType = mode == "offline" ? ConnectType.OFFLINE : ConnectType.ONLINE, addr = ip, addrPort = Number(port);
if (connectionType == ConnectType.ONLINE) {
if (sender._onlineSession == null) {
sendPluginChatMessage(sender, {
text: `You either connected to this proxy under offline mode, or your online/EasyMC session has timed out and has become invalid.`,
color: "red",
});
return sendPluginChatMessage(sender, {
text: `To switch to online servers, please reconnect and log-in through online/EasyMC mode.`,
color: "red",
});
}
else {
const savedAuth = sender._onlineSession;
sendPluginChatMessage(sender, {
text: `(joining server under ${savedAuth.username}/your ${savedAuth.isEasyMC ? "EasyMC" : "Minecraft"} account's username)`,
color: "aqua",
});
sendPluginChatMessage(sender, {
text: "Attempting to switch servers, please wait... (if you don't get connected to the target server after a while, the server might not be a Minecraft server at all. Reconnect and try again.)",
color: "gray",
});
sender._serverSwitchLock = true;
try {
await sender.switchServers({
host: addr,
port: addrPort,
version: "1.8.8",
keepAlive: false,
skipValidation: true,
hideErrors: true,
...savedAuth,
});
sender._serverSwitchLock = false;
}
catch (err) {
if (sender.state != Enums.ClientState.DISCONNECTED) {
sender.disconnect(Enums.ChatColor.RED +
`Something went wrong whilst switching servers: ${err.message}${err.code == "ENOTFOUND"
? addr.includes(":")
? `\n${Enums.ChatColor.GRAY}Suggestion: Replace the : in your IP with a space.`
: "\nIs that IP valid?"
: ""}`);
}
}
}
}
else {
sendPluginChatMessage(sender, {
text: `(joining server under ${sender.username}/Eaglercraft username)`,
color: "aqua",
});
sendPluginChatMessage(sender, {
text: "Attempting to switch servers, please wait... (if you don't get connected to the target server for a while, the server might be online only)",
color: "gray",
});
try {
sender._serverSwitchLock = true;
await sender.switchServers({
host: addr,
port: addrPort,
version: "1.8.8",
username: sender.username,
auth: "offline",
keepAlive: false,
skipValidation: true,
hideErrors: true,
});
sender._serverSwitchLock = false;
}
catch (err) {
if (sender.state != Enums.ClientState.DISCONNECTED) {
sender.disconnect(Enums.ChatColor.RED +
`Something went wrong whilst switching servers: ${err.message}${err.code == "ENOTFOUND"
? addr.includes(":")
? `\n${Enums.ChatColor.GRAY}Suggestion: Replace the : in your IP with a space.`
: "\nIs that IP valid?"
: ""}`);
}
}
}
}