1
1
import { Injectable , Logger , OnModuleInit } from '@nestjs/common'
2
+ import { Cron , CronExpression } from '@nestjs/schedule'
2
3
import { Bot } from '@prisma/client'
3
4
4
5
import { createDiscordRestClient , DiscordBot } from '@pubkey-link/api-bot-util'
@@ -170,11 +171,6 @@ export class ApiBotManagerService implements OnModuleInit {
170
171
}
171
172
172
173
async syncBotServer ( userId : string , botId : string , serverId : string ) {
173
- const bot = this . ensureBotInstance ( botId )
174
- if ( ! bot ) {
175
- console . log ( `Can't find bot.` , botId , serverId )
176
- return false
177
- }
178
174
const community = await this . core . data . community . findFirst ( {
179
175
where : { bot : { id : botId } } ,
180
176
include : { bot : true } ,
@@ -183,13 +179,48 @@ export class ApiBotManagerService implements OnModuleInit {
183
179
console . log ( `Can't find community.` , botId , serverId )
184
180
return false
185
181
}
182
+ await this . core . ensureCommunityAdmin ( { userId, communityId : community . id } )
183
+ await this . syncBotServerMembers ( {
184
+ communityId : community . id ,
185
+ botId,
186
+ serverId,
187
+ } )
188
+ return true
189
+ }
190
+
191
+ @Cron ( CronExpression . EVERY_5_MINUTES )
192
+ private async syncBotServers ( ) {
193
+ const bots = await this . core . data . bot . findMany ( { where : { status : BotStatus . Active } } )
194
+
195
+ for ( const bot of bots ) {
196
+ const servers = await this . getBotServers ( '-no-user-id-' , bot . id )
197
+ for ( const server of servers ) {
198
+ await this . syncBotServerMembers ( { botId : bot . id , communityId : bot . communityId , serverId : server . id } )
199
+ }
200
+ }
201
+ }
202
+
203
+ async syncBotServerMembers ( {
204
+ botId,
205
+ communityId,
206
+ serverId,
207
+ } : {
208
+ botId : string
209
+ communityId : string
210
+ serverId : string
211
+ } ) {
212
+ const discordBot = this . ensureBotInstance ( botId )
213
+ if ( ! discordBot ) {
214
+ console . log ( `Can't find bot.` , botId , serverId )
215
+ return false
216
+ }
186
217
this . logger . verbose ( `Fetching members... ${ botId } ${ serverId } ` )
187
218
188
219
const [ discordIdentityIds , botMemberIds ] = await Promise . all ( [
189
220
this . botMember . getDiscordIdentityIds ( ) ,
190
221
this . botMember . getBotMemberIds ( botId , serverId ) ,
191
222
] )
192
- const members = await bot . getDiscordServerMembers ( serverId )
223
+ const members = await discordBot . getDiscordServerMembers ( serverId )
193
224
194
225
this . logger . verbose ( `Found ${ members . length } members to process` )
195
226
const filtered = members
@@ -202,20 +233,28 @@ export class ApiBotManagerService implements OnModuleInit {
202
233
203
234
if ( toBeDeleted . length ) {
204
235
this . logger . warn ( `Found ${ toBeDeleted . length } members to delete` )
205
- this . logger . warn ( `TODO: DELETE MEMBERS` )
236
+ for ( const userId of toBeDeleted ) {
237
+ this . logger . verbose ( `Removing member ${ userId } from bot ${ botId } server ${ serverId } ...` )
238
+ await this . botMember . scheduleRemoveMember ( { communityId, botId, serverId, userId } )
239
+ }
206
240
}
207
241
208
242
this . logger . verbose ( `Found ${ filtered . length } members to process (filtered)` )
209
243
let linkedCount = 0
210
244
for ( const member of filtered ) {
211
245
const userId = member . id
212
- await this . botMember . scheduleAddMember ( community . bot , serverId , userId )
213
-
214
- this . logger . verbose ( `${ botId } ${ serverId } Processed ${ member . user . username } (linked: ${ ! ! member . id } )` )
246
+ await this . botMember . scheduleAddMember ( { communityId, botId : botId , serverId, userId } )
215
247
if ( member . id ) {
216
248
linkedCount ++
217
249
}
218
250
}
251
+ await this . core . logInfo (
252
+ `Found ${ members . length } members to process (filtered ${ filtered . length } ) (linked ${ linkedCount } )` ,
253
+ {
254
+ botId,
255
+ communityId,
256
+ } ,
257
+ )
219
258
this . logger . verbose (
220
259
`Found ${ members . length } members to process (filtered ${ filtered . length } ) (linked ${ linkedCount } )` ,
221
260
)
0 commit comments