-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstart.js
173 lines (142 loc) · 4.7 KB
/
start.js
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
import { access, readdir, readFile, writeFile } from "fs/promises";
import { exec as execAsync } from "child_process";
import { linkUserDirectory, writeLineToEnv } from "./src/lib.js";
import chalk from "chalk";
import dotEnv from "dotenv";
import inquirer from "inquirer";
import os from "os";
import path from "path";
import util from "util";
import { createRequire } from "module";
import { configDirectory } from "./src/constants.js";
const require = createRequire(import.meta.url);
const quietList = require("./src/data/quiet-list.json");
const exec = util.promisify(execAsync);
const {
log: {
write
}
} = new inquirer.ui.BottomBar();
const configureEnvironment = async () => {
const { directory } = await inquirer.prompt([ {
type: "input",
name: "directory",
message: "Where is your Hackmud config directory?",
default: process.env.configDirectory,
async validate (directory) {
if (!directory) {
return false;
}
try {
await access(directory);
} catch (e) {
return `Unable to find ${directory}`;
}
const files = await readdir(directory);
if (!files.some(file => file.includes(".key"))) {
return `Unable to find users in ${directory}`;
}
return true;
}
} ]);
await writeLineToEnv(`configDirectory=${directory}`);
return directory;
};
const linkUsers = async configDirectory => {
const results = [];
const files = await readdir(configDirectory, { withFileTypes: true });
const users = files
.filter(file => file.isDirectory());
const { chosenUsers } = await inquirer.prompt([ {
type: "checkbox",
name: "chosenUsers",
message: "Which user accounts do you want to publish scripts to?",
choices: users
} ]);
if (chosenUsers.length === 0) {
write(chalk.red("No users selected."));
await linkUsers(configDirectory);
}
for (let i = 0; i < chosenUsers.length; i++) {
try {
await linkUserDirectory(configDirectory, chosenUsers[i]);
results.push(`${chosenUsers[i]}: ${chalk.green("\u2713")}`);
} catch (/** @type any */e) {
if (e.stderr.includes("File exists")) {
results.push(`${chosenUsers[i]}: ${chalk.blueBright("Skipped - already linked")}`);
} else {
results.push(`${chosenUsers[i]}: ${chalk.red("Error - " + e.message)}`);
}
}
}
return results;
};
const updateQuietList = async configureDirectory => {
const currentSettingsFile = path.resolve(configureDirectory, "settings");
const currentSettings = JSON.parse(
await readFile(currentSettingsFile, "utf8")
);
currentSettings.gui_quiet = [
...new Set(currentSettings.gui_quiet.concat(quietList))
].sort();
await writeFile(
currentSettingsFile,
JSON.stringify(currentSettings), "utf8"
);
};
const run = async () => {
dotEnv.config();
try {
await access(configDirectory);
} catch (/** @type any */e) {
try {
await exec(`mkdir ${configDirectory}`);
} catch (/** @type any */e) {
return `Unable to set up environment ${e.message}`;
}
}
let configureDirectory = process.env.configDirectory;
if (!configureDirectory) {
configureDirectory = await configureEnvironment();
}
const { choice } = await inquirer.prompt([
{
type: "list",
name: "choice",
message: "Welcome Hackmud! What would you like to do?",
choices: [
{
name: "Reconfigure my scripting environment",
value: "reconfigure"
},
{
name: "Link my Hackmud users to the scripting environment",
value: "link"
},
{
name: "Update my quiet list with a list of known bots",
value: "quiet"
},
new inquirer.Separator(),
{
name: "Exit",
value: "exit"
}
]
}
]);
switch (choice) {
case "reconfigure":
await configureEnvironment();
break;
case "link":
write((await linkUsers(configureDirectory)).join(os.EOL));
break;
case "quiet":
await updateQuietList(configureDirectory);
write(chalk.blueBright("Quiet list updated successfully"));
break;
}
return true;
};
run();