1
1
import config from "./config" ;
2
2
import IModule from "./module" ;
3
+ import Modulez from "./modules" ;
3
4
import * as WebSocket from "ws" ;
4
5
import { User , Reaction , generateUserId , api } from "./misskey" ;
5
6
import * as moment from "moment" ;
@@ -10,32 +11,35 @@ import { assertProperty } from "./util/assert-property";
10
11
11
12
export default class Ai {
12
13
public account : User ;
14
+ public loadedModules : IModule [ ] = [ ] ;
13
15
private connection : any ;
14
- modules : IModule [ ] = [ ] ;
15
16
private isInterrupted : boolean = false ;
16
17
meta : any ;
17
18
18
- constructor ( account : User , modules : IModule [ ] ) {
19
+ constructor ( account : User ) {
19
20
this . account = account ;
20
- this . modules = modules ;
21
21
22
22
this . init ( ) ;
23
23
}
24
24
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
+
25
31
private init ( ) {
26
- let loadedModules : IModule [ ] = [ ] ;
27
- for ( let m of this . modules ) {
32
+ for ( let m of this . moduleCandidates ( ) ) {
28
33
try {
29
34
m . install ( ) ;
30
- loadedModules . push ( m ) ;
35
+ this . loadedModules . push ( m ) ;
31
36
} catch ( e ) {
32
37
console . error ( `An error has occured while loading module "${ m . name } "` ) ;
33
38
console . error ( e ) ;
34
39
}
35
40
}
36
- this . modules = loadedModules ;
37
41
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 } ` ) ) ;
39
43
40
44
this . initConnection ( ) ;
41
45
console . log ( {
@@ -165,7 +169,7 @@ export default class Ai {
165
169
}
166
170
if ( body . user . isBot ) return ;
167
171
168
- this . modules . filter ( assertProperty ( "onNote" ) ) . forEach ( ( m ) => {
172
+ this . loadedModules . filter ( assertProperty ( "onNote" ) ) . forEach ( ( m ) => {
169
173
return m . onNote ( body ) ;
170
174
} ) ;
171
175
}
@@ -194,7 +198,7 @@ export default class Ai {
194
198
console . log (
195
199
`!${ msg . user . name } (@${ generateUserId ( msg . user ) } ): ${ msg . text } `
196
200
) ;
197
- let funcs = this . modules . filter ( assertProperty ( "onCommand" ) ) ;
201
+ let funcs = this . loadedModules . filter ( assertProperty ( "onCommand" ) ) ;
198
202
let done = false ;
199
203
for ( let i = 0 ; i < funcs . length ; i ++ ) {
200
204
if ( done ) break ;
@@ -204,7 +208,7 @@ export default class Ai {
204
208
if ( ! done ) msg . reply ( "command not found" ) ;
205
209
} else {
206
210
let res : ReturnType < NonNullable < IModule [ "onMention" ] > > ;
207
- this . modules . filter ( assertProperty ( "onMention" ) ) . some ( ( m ) => {
211
+ this . loadedModules . filter ( assertProperty ( "onMention" ) ) . some ( ( m ) => {
208
212
res = m . onMention ( msg ) ;
209
213
return res === true || typeof res === "object" ;
210
214
} ) ;
@@ -216,15 +220,15 @@ export default class Ai {
216
220
}
217
221
218
222
private onFollowed ( user : User ) {
219
- this . modules . filter ( assertProperty ( "onFollowed" ) ) . forEach ( ( m ) => {
223
+ this . loadedModules . filter ( assertProperty ( "onFollowed" ) ) . forEach ( ( m ) => {
220
224
return m . onFollowed ( user ) ;
221
225
} ) ;
222
226
}
223
227
224
228
async onInterrupt ( ) {
225
229
this . isInterrupted = true ;
226
230
this . connection . close ( ) ;
227
- this . modules . filter ( assertProperty ( "onInterrupted" ) ) . forEach ( ( m ) => {
231
+ this . loadedModules . filter ( assertProperty ( "onInterrupted" ) ) . forEach ( ( m ) => {
228
232
m . onInterrupted ( ) ;
229
233
} ) ;
230
234
process . exit ( 0 ) ;
0 commit comments