Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/bot/commands/checkin/handlers/checkin-audit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { registerCommand } from '@commands/registry'
import { AUDIT_FLAME_CHANNEL, FLAMEWARDEN_ROLE } from '@config/discord'
import { CHECKIN_AUDIT_ID } from '@events/interaction-create/checkin/handlers/audit-modal'
import { createCheckinReviewModal, encodeSnowflake, getCustomId } from '@utils/component'
import { getChannelOrThread, sendReply } from '@utils/discord'
import { getChannel, sendReply } from '@utils/discord'
import { DiscordBaseError } from '@utils/discord/error'
import { log } from '@utils/logger'
import { SlashCommandBuilder } from 'discord.js'
Expand All @@ -30,7 +30,7 @@ registerCommand({
if (!interaction.inCachedGuild())
throw new CheckinAuditError(CheckinAudit.ERR.NotGuild)

const channel = await getChannelOrThread(interaction.guild, AUDIT_FLAME_CHANNEL) as TextChannel
const channel = await getChannel(interaction.guild, AUDIT_FLAME_CHANNEL) as TextChannel
CheckinAudit.assertMissPerms(interaction.client.user, channel)
const thread = await CheckinAudit.assertThreadUnderChannel(interaction.guild, interaction.channelId, channel)
CheckinAudit.assertNotArchivedThread(thread)
Expand Down
8 changes: 4 additions & 4 deletions src/bot/commands/checkin/messages/checkin-status.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,10 @@ ${checkin.public_id}
✍🏻 **${flamewarden.displayName}'(s) Comment**: ${checkin.comment ?? '-'}
> *"[Api Tuan/Nona](${checkin.link}) <@${userDiscordId}> meredup hari ini, namun belum padam sepenuhnya. Perbaiki, dan nyalakan kembali percikan yang benar."*
`,
LastCheckin: (userDiscordId: string, checkin: Checkin, flamewarden?: GuildMember) => `
LastCheckin: (guildName: string, userDiscordId: string, checkin: Checkin, flamewarden?: GuildMember) => `
Wahai Tuan/Nona <@${userDiscordId}>,
tercatat bahwa rangkaian nyala api Tuan/Nona telah terputus pada pergantian hari sebelumnya.
Namun demikian, percikan terakhir masih tersimpan dalam arsip Aksaria dan dapat ditinjau kembali.
Namun demikian, percikan terakhir masih tersimpan dalam arsip ${guildName} dan dapat ditinjau kembali.

Berikut adalah *check-in* terakhir yang pernah Tuan/Nona torehkan:
🆔 **Check-In ID**:
Expand All @@ -99,9 +99,9 @@ ${flamewarden?.displayName
: ''}
> *"[Percikan ini](${checkin.link}) pernah kau titipkan pada api, namun belum sempat ditakar oleh penjaga nyala."*
`,
LastCheckinNote: (checkinLink: string, statusLink: string) => `
LastCheckinNote: (guildName: string, checkinLink: string, statusLink: string) => `
Apabila Tuan/Nona meyakini bahwa [*check-in*](${checkinLink}) belum sempat ditinjau oleh <@&${FLAMEWARDEN_ROLE}>,
maka Aksaria membuka ruang klarifikasi dengan tata cara sebagai berikut:
maka ${guildName} membuka ruang klarifikasi dengan tata cara sebagai berikut:
Ⅰ. Berikan reaksi ❓ pada pesan [*status check-in*](${statusLink}) ini.
Ⅱ. Sebuah *thread* khusus akan tercipta secara otomatis.
Ⅲ. Gunakan *thread* tersebut untuk berkomunikasi dan mengajukan peninjauan kepada <@&${FLAMEWARDEN_ROLE}>.
Expand Down
12 changes: 6 additions & 6 deletions src/bot/commands/checkin/validators/checkin-status.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ export class CheckinStatus extends CheckinStatusMessage {
`🧭 Check-In #${checkin.public_id}`,
CheckinStatus.MSG.WaitingCheckin(userDiscordId, checkin),
DUMMY.COLOR,
{ text: DUMMY.FOOTER },
{ text: DUMMY.FOOTER(guild.name) },
)
break
}
Expand All @@ -66,7 +66,7 @@ export class CheckinStatus extends CheckinStatusMessage {
`🔥 Check-In #${checkin.public_id}`,
CheckinStatus.MSG.ApprovedCheckin(userDiscordId, flamewarden, checkin),
DUMMY.COLOR,
{ text: DUMMY.FOOTER },
{ text: DUMMY.FOOTER(guild.name) },
)
break
}
Expand All @@ -76,7 +76,7 @@ export class CheckinStatus extends CheckinStatusMessage {
`❌ Check-In #${checkin.public_id}`,
CheckinStatus.MSG.RejectedCheckin(userDiscordId, flamewarden, checkin),
DUMMY.COLOR,
{ text: DUMMY.FOOTER },
{ text: DUMMY.FOOTER(guild.name) },
)
break
}
Expand All @@ -91,7 +91,7 @@ export class CheckinStatus extends CheckinStatusMessage {
`🧐 Check-In`,
CheckinStatus.MSG.NoCheckin(userDiscordId, checkinStreak),
DUMMY.COLOR,
{ text: DUMMY.FOOTER },
{ text: DUMMY.FOOTER(guild.name) },
)

return { content, embed }
Expand All @@ -101,9 +101,9 @@ export class CheckinStatus extends CheckinStatusMessage {
const buttons = this.generateButtons(guild.id, checkin)
embed = createEmbed(
`🕯️ Check-In #${checkin.public_id}`,
CheckinStatus.MSG.LastCheckin(userDiscordId, checkin, flamewarden),
CheckinStatus.MSG.LastCheckin(guild.name, userDiscordId, checkin, flamewarden),
DUMMY.COLOR,
{ text: DUMMY.FOOTER },
{ text: DUMMY.FOOTER(guild.name) },
)

return { content, embed, buttons }
Expand Down
4 changes: 2 additions & 2 deletions src/bot/commands/embed/handlers/role-grant-create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,8 @@ registerCommand({
.setTextInputComponent(
new TextInputBuilder()
.setCustomId('footer')
.setPlaceholder(DUMMY.FOOTER)
.setValue(DUMMY.FOOTER)
.setPlaceholder(DUMMY.FOOTER(interaction.guild.name))
.setValue(DUMMY.FOOTER(interaction.guild.name))
.setStyle(TextInputStyle.Short)
.setRequired(false),
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import process from 'node:process'
import { GRIND_ASHES_CHANNEL } from '@config/discord'
import { registerClientReadyHandler } from '@events/client-ready/registry'
import { EVENT_PATH } from '@events/index'
import { getChannelOrThread } from '@utils/discord'
import { getChannel } from '@utils/discord'
import { DiscordBaseError } from '@utils/discord/error'
import { getModuleName } from '@utils/io'
import { log } from '@utils/logger'
Expand All @@ -27,7 +27,7 @@ registerClientReadyHandler({
log.check(ResetGrinderRoles.MSG.JobRunning)

const guild = await client.guilds.fetch(process.env.GUILD_ID!)
const channel = await getChannelOrThread(guild, GRIND_ASHES_CHANNEL) as TextChannel
const channel = await getChannel(guild, GRIND_ASHES_CHANNEL) as TextChannel
ResetGrinderRoles.assertChannel(channel)
const users = await ResetGrinderRoles.getUsersWithLatestStreak(client.prisma)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ export class ResetGrinderRolesMessage extends DiscordAssert {
JobRunning: '[JOB] Running daily grinder reset...',
JobSuccess: '[JOB] Grinder daily reset finished successfully',
RemoveGrinderRoleFrom: (member: GuildMember) => `[JOB] Removed Grinder role from ${member.user.tag}`,
GoodBye: (member: GuildMember) => `
GoodBye: (guildName: string, member: GuildMember) => `
# 💔 Nyala Api Tuan/Nona <@${member.id}> Telah Gugur
Tatkala hari telah berganti dan lonceng waktu menunjukkan pergantian malam, tercatat bahwa tiada *check-in* yang sah diterima pada hari yang telah berlalu. Maka, sesuai hukum Aksaria, peran Grinder untuk saat ini harus dilepaskan.
Tatkala hari telah berganti dan lonceng waktu menunjukkan pergantian malam, tercatat bahwa tiada *check-in* yang sah diterima pada hari yang telah berlalu. Maka, sesuai hukum ${guildName}, peran Grinder untuk saat ini harus dilepaskan.

Api bukanlah padam karena kelemahan, melainkan karena ia tak disirami pada waktunya.

Namun jangan berduka, jalan ini selalu terbuka bagi mereka yang bersedia memulai kembali. Apabila Tuan/Nona berkehendak menyalakan api kembali, silakan kembali ke <#${IGNITE_PATH_CHANNEL}> dan bangkitlah dari awal.

*Aksaria menanti mereka yang konsisten.*
*${guildName} menanti mereka yang konsisten.*
`,
GoodByeNotes: `
> Apabila *check-in* Tuan/Nona masih berada dalam status menunggu peninjauan (*waiting*) dan belum memperoleh keputusan hingga mendekati pergantian hari, maka dengan ini disampaikan ketentuan berikut:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ export class ResetGrinderRoles extends ResetGrinderRolesMessage {
await sendAsBot(
null,
channel,
{ content: ResetGrinderRoles.MSG.GoodBye(member), components: [button], allowedMentions: { users: [member.id], roles: [] } },
{ content: ResetGrinderRoles.MSG.GoodBye(guild.name, member), components: [button], allowedMentions: { users: [member.id], roles: [] } },
)

log.info(this.MSG.RemoveGrinderRoleFrom(member))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import type { TextChannel } from 'discord.js'
import { GRIND_ASHES_CHANNEL, GRINDER_ROLE } from '@config/discord'
import { AURA_FARMING_CHANNEL, GRINDER_ROLE } from '@config/discord'
import { registerGuildMemberUpdateHandler } from '@events/guild-member-update/registry'
import { EVENT_PATH } from '@events/index'
import { getChannelOrThread, sendAsBot } from '@utils/discord'
import { getChannel, sendAsBot } from '@utils/discord'
import { DiscordBaseError } from '@utils/discord/error'
import { getModuleName } from '@utils/io'
import { GrinderRole } from '../validators'
Expand All @@ -18,7 +18,6 @@ const moduleName = getModuleName(EVENT_PATH, __filename)
registerGuildMemberUpdateHandler({
desc: 'Watches grinder role assignment/removal for members on guild member update.',
errorTag: () => `${moduleName}: ${GrinderRole.ERR.UnexpectedGrinderRole}`,
match: (_, newMember) => GrinderRole.isMemberHasRole(newMember, GRINDER_ROLE),
async exec(_, oldMember, newMember) {
try {
if (!newMember.guild)
Expand All @@ -27,7 +26,7 @@ registerGuildMemberUpdateHandler({
const newHasGrinderRole = GrinderRole.isMemberHasRole(newMember, GRINDER_ROLE)
const oldHasGrinderRole = GrinderRole.isMemberHasRole(oldMember, GRINDER_ROLE)
if (newHasGrinderRole && !oldHasGrinderRole) {
const channel = await getChannelOrThread(newMember.guild, GRIND_ASHES_CHANNEL) as TextChannel
const channel = await getChannel(newMember.guild, AURA_FARMING_CHANNEL) as TextChannel
GrinderRole.assertChannel(channel)
const button = GrinderRole.generateButton(newMember.guild.id)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import type { TextChannel } from 'discord.js'
import { AURA_FARMING_CHANNEL } from '@config/discord'
import { registerGuildMemberUpdateHandler } from '@events/guild-member-update/registry'
import { EVENT_PATH } from '@events/index'
import { getChannel, sendAsBot } from '@utils/discord'
import { DiscordBaseError } from '@utils/discord/error'
import { getModuleName } from '@utils/io'
import { ServerBooster } from '../validators'

export class ServerBoosterError extends DiscordBaseError {
constructor(message: string, options?: { cause?: unknown }) {
super('ServerBoosterError', message, options)
}
}

const moduleName = getModuleName(EVENT_PATH, __filename)

registerGuildMemberUpdateHandler({
desc: 'Watches server booster for members on guild member update.',
errorTag: () => `${moduleName}: ${ServerBooster.ERR.UnexpectedServerBooster}`,
async exec(_, oldMember, newMember) {
try {
if (!newMember.guild)
throw new ServerBoosterError(ServerBooster.ERR.NotGuild)

const wasBoosting = !!oldMember.premiumSince
const isBoosting = !!newMember.premiumSince

const justBoosted = !wasBoosting && isBoosting
if (!justBoosted)
return

const channel = await getChannel(newMember.guild, AURA_FARMING_CHANNEL) as TextChannel
ServerBooster.assertChannel(channel)

const embed = ServerBooster.sayDeeplyThanksTo(newMember)

await sendAsBot(null, channel, {
content: ServerBooster.MSG.SpecialThanks,
embeds: [embed],
})
}
catch (err: any) {
if (!(err instanceof DiscordBaseError))
throw err
}
},
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import type { GuildMember } from 'discord.js'
import { BEARER_LOUNGE_CHANNEL, GRINDER_ROLE } from '@config/discord'
import { createEmbed } from '@utils/component'
import { DiscordAssert } from '@utils/discord'
import { DUMMY } from '@utils/placeholder'

export class ServerBoosterMessage extends DiscordAssert {
static override readonly ERR = {
...DiscordAssert.ERR,
UnexpectedServerBooster: '❌ Something went wrong while managing the server booster',
}

static override readonly MSG = {
...DiscordAssert.MSG,
SpecialThanks: `# ❤️‍🔥 Sebuah Nyala Telah Diperkuat`,
Really: `
Api tidak selalu membesar karena banyak kayu,
kadang karena satu jiwa yang rela memberi nyala!`,
ItMeansALot: (guildName: string, userDiscordId: string, boostCount: number) => `
Tuan/Nona <@${userDiscordId}> telah mempersembahkan aura mereka untuk menguatkan nyala ${guildName} beserta para <@&${GRINDER_ROLE}>🔥!

**✨ Maklumat Anugerah**
- Jumlah *Server Boost* ${guildName} kini bertambah menjadi **\`${boostCount}\`**.
- Tuan/Nona resmi diakui sebagai *Bearer of the Flame*.
- Gerbang khusus ⁠<#${BEARER_LOUNGE_CHANNEL}> kini terbuka bagi Tuan/Nona; sebuah ruang kehormatan untuk para penjaga nyala.

Kami sampaikan terima kasih setinggi-tingginya.
Semoga nyala kebaikan ini kembali pada Tuan/Nona
dalam wujud disiplin, keberkahan, dan pertumbuhan.
`,
}

static sayDeeplyThanksTo(member: GuildMember) {
return createEmbed(
this.MSG.Really,
this.MSG.ItMeansALot(member.guild.name, member.id, member.guild.premiumSubscriptionCount ?? 0),
DUMMY.COLOR,
{ text: DUMMY.FOOTER(member.guild.name) },
{
name: member.user.tag,
iconURL: member.user.displayAvatarURL(),
},
member.user.displayAvatarURL({ size: 512 }),
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { DiscordAssert } from '@utils/discord'
import { ServerBoosterMessage } from '../messages'

export class ServerBooster extends ServerBoosterMessage {
static override BASE_PERMS = [
...DiscordAssert.BASE_PERMS,
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,9 @@ registerInteractionHandler({

const embed = createEmbed(
`🔥 Audit Check-In Telah Diselesaikan`,
CheckinAudit.MSG.AuditSuccess(updatedCheckin.link!, flamewarden.id, updatedCheckin.user!.discord_id),
CheckinAudit.MSG.AuditSuccess(interaction.guild.name, updatedCheckin.link!, flamewarden.id, updatedCheckin.user!.discord_id),
DUMMY.COLOR,
{ text: DUMMY.FOOTER },
{ text: DUMMY.FOOTER(interaction.guild.name) },
)

await sendReply(interaction, '', false, { embeds: [embed], allowedMentions: { users: [updatedCheckin.user!.discord_id] } })
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ registerInteractionHandler({

const msg = await sendReply(
interaction,
Checkin.MSG.CheckinSuccess(todo),
Checkin.MSG.CheckinSuccess(interaction.guild.name, todo),
false,
{
files: attachments.length ? attachments : undefined,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ registerInteractionHandler({

const statusMessageLink = messageLink(interaction.channelId, interaction.message.id, interaction.guildId)

await sendReply(interaction, CheckinStatus.MSG.LastCheckinNote(checkinLink, statusMessageLink))
await sendReply(interaction, CheckinStatus.MSG.LastCheckinNote(interaction.guild.name, checkinLink, statusMessageLink))
}
catch (err: any) {
if (err instanceof DiscordBaseError)
Expand Down
4 changes: 2 additions & 2 deletions src/bot/events/interaction-create/checkin/messages/audit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@ ${waitingCheckinList}

static override readonly MSG = {
...DiscordAssert.MSG,
AuditSuccess: (checkinLink: string, flamewardenId: string, userDiscordId: string) => `
AuditSuccess: (guildName: string, checkinLink: string, flamewardenId: string, userDiscordId: string) => `
Wahai Tuan/Nona <@${userDiscordId}>,
[percikan](${checkinLink}) yang Tuan/Nona titipkan telah selesai ditakar dan ditetapkan.
🗓 **Audited At**: ${getParsedNow(getNow())}
👀 **Audited By**: <@${flamewardenId}>

> *"Api telah diuji, dan keputusannya kini tercatat dalam Aksaria."*
> *"Api telah diuji, dan keputusannya kini tercatat dalam ${guildName}."*
`,
}
}
4 changes: 2 additions & 2 deletions src/bot/events/interaction-create/checkin/messages/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,14 @@ export class CheckinMessage extends DiscordAssert {

static override readonly MSG = {
...DiscordAssert.MSG,
CheckinSuccess: (todo: string) => `
CheckinSuccess: (guildName: string, todo: string) => `
# ✅ Check-In Baru Terdeteksi!
*Kindly take a look and do a review for this one, <@&${FLAMEWARDEN_ROLE}>*

⋆。˚ ☁︎ ˚。⋆。˚☽˚。⋆
${todo}

> ${DUMMY.FOOTER}`,
> ${DUMMY.FOOTER(guildName)}`,

GrinderDetails: (checkin: Checkin, lastCheckin?: Checkin) => `
✨─────✨/✨━━━━✨
Expand Down
12 changes: 6 additions & 6 deletions src/bot/events/interaction-create/checkin/validators/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { AURA_FARMING_CHANNEL, CHECKIN_CHANNEL, GRINDER_ROLE } from '@config/dis
import { SubmittedCheckinError } from '@events/message-reaction-add/checkin/handlers/submitted'
import { createEmbed, decodeSnowflakes, encodeSnowflake, getCustomId } from '@utils/component'
import { isDateToday, isDateYesterday } from '@utils/date'
import { DiscordAssert, getChannelOrThread, sendAsBot } from '@utils/discord'
import { DiscordAssert, getChannel, sendAsBot } from '@utils/discord'
import { attachNewGrindRole, getGrindRoleByStreakCount } from '@utils/discord/roles'
import { DUMMY } from '@utils/placeholder'
import { ActionRowBuilder, ButtonBuilder, ButtonStyle, messageLink, PermissionsBitField } from 'discord.js'
Expand Down Expand Up @@ -155,7 +155,7 @@ export class Checkin extends CheckinMessage {
return

const hasGrindRole = this.isMemberHasRole(member, newRole.id)
const channel = await getChannelOrThread(guild, AURA_FARMING_CHANNEL) as TextChannel
const channel = await getChannel(guild, AURA_FARMING_CHANNEL) as TextChannel
this.assertChannel(channel)

if (!hasGrindRole) {
Expand All @@ -166,7 +166,7 @@ export class Checkin extends CheckinMessage {
})
}
else {
const checkinChannel = await getChannelOrThread(guild, CHECKIN_CHANNEL) as TextChannel
const checkinChannel = await getChannel(guild, CHECKIN_CHANNEL) as TextChannel
await sendAsBot(null, checkinChannel, {
content: `Hey, <@${member.id}>. You already have <@&${newRole.id}>`,
allowedMentions: { users: [member.id], roles: [] },
Expand Down Expand Up @@ -516,7 +516,7 @@ export class Checkin extends CheckinMessage {
`🎉 *Check-In* Berhasil`,
this.MSG.CheckinSuccessToMember(checkin),
DUMMY.COLOR,
{ text: DUMMY.FOOTER },
{ text: DUMMY.FOOTER(member.guild.name) },
)

await member.send({ embeds: [embed] })
Expand All @@ -531,7 +531,7 @@ export class Checkin extends CheckinMessage {
`⚠️ *Check-In* Ditolak`,
this.MSG.CheckinRejected(flamewarden, checkin),
'#D9534F',
{ text: DUMMY.FOOTER },
{ text: DUMMY.FOOTER(member.guild.name) },
)
break

Expand All @@ -540,7 +540,7 @@ export class Checkin extends CheckinMessage {
`🔥 *Check-In* Disetujui`,
this.MSG.CheckinApproved(flamewarden, checkin),
'#4CAF50',
{ text: DUMMY.FOOTER },
{ text: DUMMY.FOOTER(member.guild.name) },
)
break

Expand Down
Loading