(client, guildId = null)
| 415 | } |
| 416 | |
| 417 | export async function reconcileReactionRoleMessages(client, guildId = null) { |
| 418 | const summary = { |
| 419 | scannedGuilds: 0, |
| 420 | scannedMessages: 0, |
| 421 | removedMessages: 0, |
| 422 | errors: 0 |
| 423 | }; |
| 424 | |
| 425 | try { |
| 426 | const targetGuildIds = guildId |
| 427 | ? [guildId] |
| 428 | : Array.from(client.guilds.cache.keys()); |
| 429 | |
| 430 | for (const targetGuildId of targetGuildIds) { |
| 431 | summary.scannedGuilds += 1; |
| 432 | |
| 433 | let reactionRoleMessages = []; |
| 434 | try { |
| 435 | reactionRoleMessages = await getAllReactionRoleMessages(client, targetGuildId); |
| 436 | } catch (error) { |
| 437 | summary.errors += 1; |
| 438 | logger.warn(`Failed to fetch reaction role messages for reconciliation in guild ${targetGuildId}:`, error); |
| 439 | continue; |
| 440 | } |
| 441 | |
| 442 | if (!reactionRoleMessages.length) { |
| 443 | continue; |
| 444 | } |
| 445 | |
| 446 | const guild = client.guilds.cache.get(targetGuildId) || await client.guilds.fetch(targetGuildId).catch(() => null); |
| 447 | if (!guild) { |
| 448 | for (const reactionRoleMessage of reactionRoleMessages) { |
| 449 | summary.scannedMessages += 1; |
| 450 | await client.db.delete(`reaction_roles:${targetGuildId}:${reactionRoleMessage.messageId}`); |
| 451 | summary.removedMessages += 1; |
| 452 | } |
| 453 | logger.info(`Removed ${reactionRoleMessages.length} stale reaction role message(s) for unavailable guild ${targetGuildId}`); |
| 454 | continue; |
| 455 | } |
| 456 | |
| 457 | for (const reactionRoleMessage of reactionRoleMessages) { |
| 458 | summary.scannedMessages += 1; |
| 459 | |
| 460 | try { |
| 461 | const channel = guild.channels.cache.get(reactionRoleMessage.channelId) |
| 462 | || await guild.channels.fetch(reactionRoleMessage.channelId).catch(() => null); |
| 463 | |
| 464 | if (!channel || !channel.isTextBased?.()) { |
| 465 | await client.db.delete(`reaction_roles:${targetGuildId}:${reactionRoleMessage.messageId}`); |
| 466 | summary.removedMessages += 1; |
| 467 | continue; |
| 468 | } |
| 469 | |
| 470 | const message = await channel.messages.fetch(reactionRoleMessage.messageId).catch(() => null); |
| 471 | if (!message) { |
| 472 | await client.db.delete(`reaction_roles:${targetGuildId}:${reactionRoleMessage.messageId}`); |
| 473 | summary.removedMessages += 1; |
| 474 | } |
no test coverage detected