Skip to content

Commit

Permalink
Merge pull request #304 from IgorKowalczyk/v4
Browse files Browse the repository at this point in the history
Typescript rewrite
  • Loading branch information
IgorKowalczyk authored Aug 16, 2024
2 parents 33c6ed1 + 18c0f2f commit de744bc
Show file tree
Hide file tree
Showing 16 changed files with 545 additions and 427 deletions.
7 changes: 5 additions & 2 deletions config.js → config.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import type { ColorResolvable } from "discord.js";

export const defaultConfig = {
channel: process.env.CHANNEL_ID, // Channel ID
token: process.env.TOKEN, // Discord bot token
owners: [...process.env.OWNERS_IDS.split(",")], // Array of owners IDs (separated by commas)
embedColor: "#5865f2", // Discord's blurple
cwd: process.env.CUSTOM_CWD || process.cwd(), // Custom working directory
owners: [...(process.env.OWNERS_IDS?.split(",") ?? [])], // Array of owners IDs (separated by commas)
embedColor: [88, 101, 242] as ColorResolvable, // Discord's blurple
emojis: {
loading: "<a:loading:895227261752582154>", // https://cdn.discordapp.com/emojis/895227261752582154.gif?v=1
output: "📤",
Expand Down
29 changes: 0 additions & 29 deletions events/client/ready.js

This file was deleted.

15 changes: 15 additions & 0 deletions events/client/ready.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ActivityType, Client, TextChannel } from "discord.js";
import { logger } from "../../utils/logger.js";
import { defaultConfig } from "../../config.js";

export async function ready(client: Client): Promise<void> {
try {
logger("ready", `Logged in as ${client.user?.tag}! (ID: ${client.user?.id})`);
if (!defaultConfig.channel) return logger("error", "Channel not found! Please check your CHANNEL_ID .env variable.");
const channel = client.channels.cache.get(defaultConfig.channel) as TextChannel;
logger("ready", `Watching for commands in ${channel.guild.name}#${channel.name}`);
client.user?.setActivity("👀 Watching all ports!", { type: ActivityType.Custom });
} catch (error) {
logger("error", `Error setting activity: ${error}`);
}
}
70 changes: 0 additions & 70 deletions events/guild/messageCreate.js

This file was deleted.

59 changes: 59 additions & 0 deletions events/guild/messageCreate.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import fs from "node:fs";
import path from "node:path";
import { Client, EmbedBuilder, Message, TextChannel } from "discord.js";
import { defaultConfig } from "../../config.js";
import { execCommand } from "../../utils/execCommand.ts";
import { logger } from "../../utils/logger.js";

export async function messageCreate(client: Client, message: Message): Promise<void | Message<boolean>> {
try {
if (message.author.bot) return;
if (!(message.channel instanceof TextChannel)) return;
if (message.channel.id !== defaultConfig.channel && !defaultConfig.owners.includes(message.author.id)) return;
if (!message.content) return;

const [command, ...args] = message.content.split(" ");

if (command === "cd") {
const newCWD = args.join(" ");
if (!newCWD) return;

const resolvedPath = path.resolve(defaultConfig.cwd, newCWD);
if (!fs.existsSync(resolvedPath)) {
const error = new EmbedBuilder() // prettier
.setDescription(`${defaultConfig.emojis.error} **Directory does not exist**`)
.setColor(defaultConfig.embedColor);
return message.reply({ embeds: [error] });
}

try {
process.chdir(resolvedPath);
defaultConfig.debugger.changeDir && logger("event", `Changed directory from ${defaultConfig.cwd} to ${resolvedPath}`);

const changedDirectory = new EmbedBuilder() // prettier
.setDescription(`${defaultConfig.emojis.change} **Changed directory from \`${defaultConfig.cwd}\` to \`${resolvedPath}\`**`)
.setColor(defaultConfig.embedColor);

defaultConfig.cwd = resolvedPath;
return message.reply({ embeds: [changedDirectory] });
} catch (error) {
defaultConfig.debugger.changeDir && logger("error", `Error changing directory: ${error}`);
const errorEmbed = new EmbedBuilder() // prettier
.setDescription(`${defaultConfig.emojis.error} **Error changing directory**`)
.setColor(defaultConfig.embedColor);

return message.reply({ embeds: [errorEmbed] });
}
}

const wait = new EmbedBuilder() // prettier
.setDescription(`${defaultConfig.emojis.loading} **Waiting for server response...**`)
.setColor(defaultConfig.embedColor);

await message.reply({ embeds: [wait] });

await execCommand(client, message.content);
} catch (error) {
logger("error", `Error executing command: ${error}`);
}
}
15 changes: 7 additions & 8 deletions index.js → index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import "dotenv/config";
import { Client, GatewayIntentBits } from "discord.js";
import loadEvents from "./utils/loadEvents.js";
import { logger } from "./utils/logger.js";
import loadEvents from "./utils/loadEvents";
import { logger } from "./utils/logger";

logger("event", "Starting SSH Bot session...");
logger("info", `Running version v${process.env.npm_package_version} on Node.js ${process.version} on ${process.platform} ${process.arch}`);
Expand All @@ -14,25 +14,24 @@ try {
parse: ["users", "roles"],
repliedUser: false,
},
intents: GatewayIntentBits.Guilds | GatewayIntentBits.GuildMembers | GatewayIntentBits.GuildPresences | GatewayIntentBits.GuildMessages | GatewayIntentBits.MessageContent,
intents: GatewayIntentBits.Guilds | GatewayIntentBits.GuildMembers | GatewayIntentBits.GuildMessages | GatewayIntentBits.MessageContent,
});

client.customCWD = process.env.CUSTOM_CWD || process.cwd();

logger("info", "Loading events...");
await loadEvents(client);

logger("info", "Logging in...");

await client.login(process.env.TOKEN);
} catch (error) {
logger("error", error);
logger("error", `Error starting the bot: ${error}`);
process.exit(1);
}

process.on("unhandledRejection", async (reason) => {
return logger("error", reason);
return logger("error", `Unhandled Rejection: ${reason}`);
});

process.on("uncaughtException", async (err) => {
return logger("error", err);
return logger("error", `Uncaught Exception: ${err}`);
});
17 changes: 9 additions & 8 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
{
"name": "discord-ssh",
"version": "3.0.0",
"version": "4.0.0",
"description": "Discord bot for using shell commands remotely through Discord",
"exports": null,
"type": "module",
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js",
"start": "tsx ./index.ts",
"dev": "tsx watch ./index.ts",
"format": "prettier . --write --ignore-unknown --cache",
"format:check": "prettier . --check --cache",
"lint": "eslint .",
Expand All @@ -22,9 +21,11 @@
"devDependencies": {
"@igorkowalczyk/eslint-config": "2.2.0",
"@igorkowalczyk/prettier-config": "2.2.0",
"eslint": "9.9.0",
"nodemon": "3.1.4",
"prettier": "3.3.3"
"@types/node": "22.3.0",
"eslint": "9.7.0",
"prettier": "3.3.3",
"tsx": "4.17.0",
"typescript": "5.5.4"
},
"engines": {
"node": ">=18"
Expand All @@ -47,5 +48,5 @@
"ssh",
"remote-connection"
],
"packageManager": "pnpm@9.7.1"
"packageManager": "pnpm@9.6.0"
}
Loading

0 comments on commit de744bc

Please sign in to comment.