1
1
import { Message , Room , Contact } from 'wechaty' ;
2
- import { InternJobProvider } from './providers/internship-job-provider' ;
3
- import { NGJobProvider } from './providers/new-graduate-job-provider' ;
2
+ import { InternshipJobProvider } from './providers/internship-job-provider' ;
3
+ import { NewGraduateJobProvider } from './providers/new-graduate-job-provider' ;
4
4
import { FileSystemService } from './file-system-service' ;
5
5
6
6
interface Command {
7
7
name : string ;
8
8
aliases : string [ ] ;
9
9
description : string ;
10
- execute : ( message : Message , args : string [ ] ) => Promise < void > ;
10
+ execute : ( message : Message , args : string [ ] , silent ?: boolean ) => Promise < void > ;
11
11
}
12
12
13
13
export class CommandHandler {
14
14
private commands : Command [ ] ;
15
- private internJob : InternJobProvider ;
16
- private newGradJob : NGJobProvider ;
15
+ private internJob : InternshipJobProvider ;
16
+ private newGradJob : NewGraduateJobProvider ;
17
17
private targetRooms : Room [ ] ;
18
18
19
- constructor ( internJob : InternJobProvider , newGradJob : NGJobProvider , targetRooms : Room [ ] ) {
19
+ constructor (
20
+ internJob : InternshipJobProvider ,
21
+ newGradJob : NewGraduateJobProvider ,
22
+ targetRooms : Room [ ] ,
23
+ ) {
20
24
this . internJob = internJob ;
21
25
this . newGradJob = newGradJob ;
22
26
this . targetRooms = targetRooms ;
@@ -33,9 +37,13 @@ export class CommandHandler {
33
37
if ( room && sender && ( await this . isRoomOwnerOrAdmin ( room , sender ) ) ) {
34
38
const roomTopic = await room . topic ( ) ;
35
39
await this . addRoomToRegistry ( roomTopic ) ;
36
- await message . say ( `Room "${ roomTopic } " has been added to the bot's target list.` ) ;
40
+ await this . sendMessage (
41
+ message ,
42
+ `Room "${ roomTopic } " has been added to the bot's target list.` ,
43
+ ) ;
37
44
} else {
38
- await message . say (
45
+ await this . sendMessage (
46
+ message ,
39
47
"Sorry, only room owners or admins can add rooms to the bot's target list." ,
40
48
) ;
41
49
}
@@ -45,19 +53,33 @@ export class CommandHandler {
45
53
name : 'intern' ,
46
54
aliases : [ 'internjobs' ] ,
47
55
description : 'Get new intern job postings' ,
48
- execute : async ( message : Message ) => {
49
- if ( ! ( await this . sendJobUpdates ( this . internJob ) ) ) {
50
- await message . say ( 'No new jobs found for Intern roles' ) ;
56
+ execute : async ( message : Message , args : string [ ] , silent = false ) => {
57
+ const room = message . room ( ) ;
58
+ if ( room ) {
59
+ if ( ! ( await this . sendJobUpdates ( this . internJob , room ) ) ) {
60
+ if ( ! silent ) {
61
+ await this . sendMessage ( message , 'No new jobs found for Intern roles' ) ;
62
+ }
63
+ }
64
+ } else {
65
+ await this . sendMessage ( message , 'This command can only be used in a room.' ) ;
51
66
}
52
67
} ,
53
68
} ,
54
69
{
55
70
name : 'ng' ,
56
71
aliases : [ 'ngjobs' ] ,
57
72
description : 'Get new graduate job postings' ,
58
- execute : async ( message : Message ) => {
59
- if ( ! ( await this . sendJobUpdates ( this . newGradJob ) ) ) {
60
- await message . say ( 'No new jobs found for New Graduate roles' ) ;
73
+ execute : async ( message : Message , args : string [ ] , silent = false ) => {
74
+ const room = message . room ( ) ;
75
+ if ( room ) {
76
+ if ( ! ( await this . sendJobUpdates ( this . newGradJob , room ) ) ) {
77
+ if ( ! silent ) {
78
+ await this . sendMessage ( message , 'No new jobs found for New Graduate roles' ) ;
79
+ }
80
+ }
81
+ } else {
82
+ await this . sendMessage ( message , 'This command can only be used in a room.' ) ;
61
83
}
62
84
} ,
63
85
} ,
@@ -73,13 +95,13 @@ export class CommandHandler {
73
95
helpMessage += ` Aliases: ${ command . aliases . join ( ', ' ) } \n` ;
74
96
}
75
97
} ) ;
76
- await message . say ( helpMessage ) ;
98
+ await this . sendMessage ( message , helpMessage ) ;
77
99
} ,
78
100
} ,
79
101
] ;
80
102
}
81
103
82
- async handleCommand ( message : Message ) {
104
+ async handleCommand ( message : Message , silent = false ) {
83
105
const text = message . text ( ) . toLowerCase ( ) ;
84
106
const commandMatch = text . match ( / @ \S + \s + ( .+ ) / ) ;
85
107
const commandName = commandMatch ? commandMatch [ 1 ] . split ( ' ' ) [ 0 ] : '' ;
@@ -90,9 +112,21 @@ export class CommandHandler {
90
112
91
113
if ( command ) {
92
114
const args = commandMatch ? commandMatch [ 1 ] . split ( ' ' ) . slice ( 1 ) : [ ] ;
93
- await command . execute ( message , args ) ;
115
+ await command . execute ( message , args , silent ) ;
116
+ } else if ( ! silent ) {
117
+ await this . sendMessage (
118
+ message ,
119
+ 'Unrecognized command. Use "@BOT help" for available commands.' ,
120
+ ) ;
121
+ }
122
+ }
123
+
124
+ private async sendMessage ( message : Message , content : string ) {
125
+ const room = message . room ( ) ;
126
+ if ( room ) {
127
+ await room . say ( content ) ;
94
128
} else {
95
- await message . say ( 'Unrecognized command. Use "@BOT help" for available commands.' ) ;
129
+ await message . say ( content ) ;
96
130
}
97
131
}
98
132
@@ -105,37 +139,36 @@ export class CommandHandler {
105
139
const registeredTopicsPath = 'registered-topics.json' ;
106
140
let topicsLocal : { topics : string [ ] } = { topics : [ ] } ;
107
141
108
- if ( FileSystemService . fileExists ( registeredTopicsPath ) ) {
109
- topicsLocal = FileSystemService . readJSON < { topics : string [ ] } > ( registeredTopicsPath ) ;
142
+ if ( FileSystemService . globalFileExists ( registeredTopicsPath ) ) {
143
+ topicsLocal = FileSystemService . readGlobalJSON < { topics : string [ ] } > ( registeredTopicsPath ) ;
110
144
}
111
145
112
146
if ( ! topicsLocal . topics . includes ( roomTopic ) ) {
113
147
topicsLocal . topics . push ( roomTopic ) ;
114
- FileSystemService . writeJSON ( registeredTopicsPath , topicsLocal ) ;
148
+ FileSystemService . writeGlobalJSON ( registeredTopicsPath , topicsLocal ) ;
115
149
console . log ( `Added room "${ roomTopic } " to the registry.` ) ;
116
150
} else {
117
151
console . log ( `Room "${ roomTopic } " is already in the registry.` ) ;
118
152
}
119
153
}
120
154
121
- private async sendJobUpdates ( provider : InternJobProvider | NGJobProvider ) {
122
- console . log ( `Checking for new ${ provider . jobType } jobs... now !` ) ;
123
- if ( this . targetRooms . length === 0 ) {
124
- console . log ( 'No target rooms set' ) ;
125
- return false ;
126
- }
127
- const newJobs = await provider . getNewJobs ( ) ;
155
+ private async sendJobUpdates (
156
+ provider : InternshipJobProvider | NewGraduateJobProvider ,
157
+ room : Room ,
158
+ ) {
159
+ const roomTopic = await room . topic ( ) ;
160
+ console . log ( `Checking for new ${ provider . jobType } jobs for room ${ roomTopic } ... now !` ) ;
161
+
162
+ const newJobs = await provider . getNewJobs ( roomTopic ) ;
128
163
if ( newJobs . length > 0 ) {
129
164
const messages = provider . formatJobMessages ( newJobs ) ;
130
- for ( const room of this . targetRooms ) {
131
- for ( const message of messages ) {
132
- await room . say ( message ) ;
133
- await new Promise ( ( resolve ) => setTimeout ( resolve , 1000 ) ) ;
134
- }
165
+ for ( const message of messages ) {
166
+ await room . say ( message ) ;
167
+ await new Promise ( ( resolve ) => setTimeout ( resolve , 1000 ) ) ;
135
168
}
136
169
return true ;
137
170
} else {
138
- console . log ( ' No new jobs found' ) ;
171
+ console . log ( ` No new ${ provider . jobType } jobs found for room ${ roomTopic } ` ) ;
139
172
return false ;
140
173
}
141
174
}
0 commit comments