Skip to content

Commit 164a8c4

Browse files
Merge pull request #183 from private-yusuke/instantiate-modules-with-an-instance-of-Ai
Instantiate modules with an instance of `Ai`
2 parents c733d89 + d2303fc commit 164a8c4

File tree

4 files changed

+24
-26
lines changed

4 files changed

+24
-26
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "botot2",
3-
"version": "4.0.0",
3+
"version": "4.0.1",
44
"description": "A chatbot for Misskey with Markov chain",
55
"main": "index.js",
66
"scripts": {

src/ai.ts

+17-13
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import config from "./config";
22
import IModule from "./module";
3+
import Modulez from "./modules";
34
import * as WebSocket from "ws";
45
import { User, Reaction, generateUserId, api } from "./misskey";
56
import * as moment from "moment";
@@ -10,32 +11,35 @@ import { assertProperty } from "./util/assert-property";
1011

1112
export default class Ai {
1213
public account: User;
14+
public loadedModules: IModule[] = [];
1315
private connection: any;
14-
modules: IModule[] = [];
1516
private isInterrupted: boolean = false;
1617
meta: any;
1718

18-
constructor(account: User, modules: IModule[]) {
19+
constructor(account: User) {
1920
this.account = account;
20-
this.modules = modules;
2121

2222
this.init();
2323
}
2424

25+
private moduleCandidates() {
26+
return Modulez.map((M) => new M(this))
27+
.filter((m) => config.modules.includes(m.name))
28+
.sort((a, b) => b.priority - a.priority);
29+
}
30+
2531
private init() {
26-
let loadedModules: IModule[] = [];
27-
for (let m of this.modules) {
32+
for (let m of this.moduleCandidates()) {
2833
try {
2934
m.install();
30-
loadedModules.push(m);
35+
this.loadedModules.push(m);
3136
} catch (e) {
3237
console.error(`An error has occured while loading module "${m.name}"`);
3338
console.error(e);
3439
}
3540
}
36-
this.modules = loadedModules;
3741
console.info("loaded modules:");
38-
this.modules.forEach((m) => console.log(`${m.priority}: ${m.name}`));
42+
this.loadedModules.forEach((m) => console.log(`${m.priority}: ${m.name}`));
3943

4044
this.initConnection();
4145
console.log({
@@ -165,7 +169,7 @@ export default class Ai {
165169
}
166170
if (body.user.isBot) return;
167171

168-
this.modules.filter(assertProperty("onNote")).forEach((m) => {
172+
this.loadedModules.filter(assertProperty("onNote")).forEach((m) => {
169173
return m.onNote(body);
170174
});
171175
}
@@ -194,7 +198,7 @@ export default class Ai {
194198
console.log(
195199
`!${msg.user.name}(@${generateUserId(msg.user)}): ${msg.text}`
196200
);
197-
let funcs = this.modules.filter(assertProperty("onCommand"));
201+
let funcs = this.loadedModules.filter(assertProperty("onCommand"));
198202
let done = false;
199203
for (let i = 0; i < funcs.length; i++) {
200204
if (done) break;
@@ -204,7 +208,7 @@ export default class Ai {
204208
if (!done) msg.reply("command not found");
205209
} else {
206210
let res: ReturnType<NonNullable<IModule["onMention"]>>;
207-
this.modules.filter(assertProperty("onMention")).some((m) => {
211+
this.loadedModules.filter(assertProperty("onMention")).some((m) => {
208212
res = m.onMention(msg);
209213
return res === true || typeof res === "object";
210214
});
@@ -216,15 +220,15 @@ export default class Ai {
216220
}
217221

218222
private onFollowed(user: User) {
219-
this.modules.filter(assertProperty("onFollowed")).forEach((m) => {
223+
this.loadedModules.filter(assertProperty("onFollowed")).forEach((m) => {
220224
return m.onFollowed(user);
221225
});
222226
}
223227

224228
async onInterrupt() {
225229
this.isInterrupted = true;
226230
this.connection.close();
227-
this.modules.filter(assertProperty("onInterrupted")).forEach((m) => {
231+
this.loadedModules.filter(assertProperty("onInterrupted")).forEach((m) => {
228232
m.onInterrupted();
229233
});
230234
process.exit(0);

src/index.ts

+1-9
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,8 @@ async function main() {
2222
console.log(`I am ${me.name}(@${me.username})!`);
2323
console.log(`Version: ${config.version}(${config.revision})`);
2424
me.host = config.host;
25-
const modules: IModule[] = [];
26-
Modulez.forEach((M) => {
27-
const m = new M(ai);
28-
if (config.modules.indexOf(m.name) >= 0) modules.push(m);
29-
});
30-
modules.sort((a, b) => {
31-
return b.priority - a.priority;
32-
});
3325

34-
ai = new Ai(me, modules);
26+
ai = new Ai(me);
3527
}
3628

3729
process.on("SIGINT", async () => {

src/modules/admin.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,14 @@ export default class AdminModule implements IModule {
3737
public async onCommand(msg: MessageLike, cmd: string[]): Promise<boolean> {
3838
if (cmd[0] == "info") {
3939
let res = `\`\`\`
40-
Modules: ${this.ai.modules.map((i) => `${i.name}(${i.priority})`).join(", ")}
40+
Modules: ${this.ai.loadedModules
41+
.map((i) => `${i.name}(${i.priority})`)
42+
.join(", ")}
4143
Uptime: ${this.getUptime()}
4244
${process.title} ${process.version} ${process.arch} ${process.platform}
4345
Version: ${config.version}(${config.revision})
4446
`;
45-
res += this.ai.modules
47+
res += this.ai.loadedModules
4648
.filter(assertProperty("info"))
4749
.map((i) => i.info())
4850
.join("\n");
@@ -51,7 +53,7 @@ Version: ${config.version}(${config.revision})
5153
return true;
5254
} else if (cmd[0] == "help") {
5355
let res = "```\n";
54-
this.ai.modules.forEach((v) => {
56+
this.ai.loadedModules.forEach((v) => {
5557
if (v.commands) {
5658
v.commands.forEach((c) => {
5759
if (c.desc) res += `/${c.name}: ${c.desc}\n`;

0 commit comments

Comments
 (0)