Skip to content

Commit 8ee00b6

Browse files
committed
Fixing/adding a few misc. things
1 parent f113618 commit 8ee00b6

File tree

8 files changed

+146
-61
lines changed

8 files changed

+146
-61
lines changed

src/commands/moderation/giveWin.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,22 @@ export default {
8181
const usersIdInMatch = await getUsersInMatch(matchId)
8282
const users = await Promise.all(
8383
usersIdInMatch.map(async (userId) => {
84-
const user = await interaction.client.users.fetch(userId)
84+
// Try to get member first for displayName, fallback to user
85+
let displayName: string
86+
try {
87+
const member = await interaction.guild?.members.fetch(userId)
88+
displayName = member?.displayName ?? ''
89+
} catch {
90+
try {
91+
const user = await interaction.client.users.fetch(userId)
92+
displayName = user.username
93+
} catch {
94+
displayName = 'name not found'
95+
}
96+
}
97+
8598
return {
86-
name: user.username,
99+
name: displayName,
87100
value: userId,
88101
}
89102
}),

src/commands/other/randomStake.ts

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,28 @@ import { getRandomStake } from '../../utils/matchHelpers'
33
import {
44
getMatchData,
55
getMatchIdFromChannel,
6-
getStakeList,
76
setPickedMatchStake,
87
} from '../../utils/queryDB'
98

109
export default {
1110
async execute(interaction: ChatInputCommandInteraction) {
1211
try {
12+
const customStake =
13+
interaction.options.getString('custom-stake', false) ?? false
14+
const custom = customStake == 'yes'
1315
const matchId = await getMatchIdFromChannel(interaction.channelId)
16+
const stakeChoice = await getRandomStake(custom)
1417

1518
if (matchId) {
1619
// In a match channel
17-
const stakeList = await getStakeList()
18-
const randomStake =
19-
stakeList[Math.floor(Math.random() * stakeList.length)]
2020
const matchData = await getMatchData(matchId)
2121

2222
if (!matchData.stake_vote_ended)
23-
await setPickedMatchStake(matchId, randomStake.stake_name)
24-
25-
const stakeStr = `${randomStake.stake_emote} ${randomStake.stake_name}`
26-
await interaction.reply({ content: stakeStr })
27-
} else {
28-
// Not in a match channel - use normal logic
29-
const stakeChoice = await getRandomStake()
30-
const stakeStr = `${stakeChoice.stake_emote} ${stakeChoice.stake_name}`
31-
await interaction.reply({ content: stakeStr })
23+
await setPickedMatchStake(matchId, stakeChoice.stake_name)
3224
}
25+
26+
const stakeStr = `${stakeChoice.stake_emote} ${stakeChoice.stake_name}`
27+
await interaction.reply({ content: stakeStr })
3328
} catch (err: any) {
3429
console.error(err)
3530
const errorMsg = err.detail || err.message || 'Unknown'
Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import { ChatInputCommandInteraction, MessageFlags } from 'discord.js'
22
import { drawPlayerStatsCanvas } from '../../utils/canvasHelpers'
33
import { getQueueIdFromName, getStatsCanvasUserData } from '../../utils/queryDB'
4-
import { setupViewStatsButtons } from '../../utils/queueHelpers'
4+
import {
5+
setupViewStatsButtons,
6+
setUserQueueRole,
7+
} from '../../utils/queueHelpers'
58

69
export default {
710
async execute(interaction: ChatInputCommandInteraction) {
@@ -19,6 +22,10 @@ export default {
1922
files: [statFile],
2023
components: [viewStatsButtons],
2124
})
25+
26+
// Update queue role, just to be sure it's correct when they check
27+
// This is a nice bandaid fix till we update leaderboard roles better
28+
await setUserQueueRole(queueId, targetUser.id)
2229
} catch (err: any) {
2330
console.error(err)
2431
const errorMsg = err.detail || err.message || 'Unknown'

src/commands/superCommands/random.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,16 @@ export default {
1111
sub.setName('deck').setDescription('Roll a random deck'),
1212
)
1313
.addSubcommand((sub) =>
14-
sub.setName('stake').setDescription('Roll a random stake'),
14+
sub
15+
.setName('stake')
16+
.setDescription('Roll a random stake')
17+
.addStringOption((option) =>
18+
option
19+
.setName('custom-stake')
20+
.setDescription('Whether to include custom stakes or not')
21+
.addChoices([{ name: 'yes', value: 'yes' }])
22+
.setRequired(false),
23+
),
1524
),
1625

1726
async execute(interaction: ChatInputCommandInteraction) {

src/commands/superCommands/stats.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import viewStats from '../queues/viewStats'
1+
import viewStats from '../queues/statsQueue'
22
import {
33
AutocompleteInteraction,
44
ChatInputCommandInteraction,

src/events/interactionCreate.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -877,6 +877,20 @@ export default {
877877
console.error('Failed to fetch original message embed:', err)
878878
}
879879

880+
// Add delete button for helpers
881+
const deleteButtonRow =
882+
new ActionRowBuilder<ButtonBuilder>().addComponents(
883+
new ButtonBuilder()
884+
.setCustomId(`delete-contest-${matchId}`)
885+
.setLabel('Delete Contest Channel')
886+
.setStyle(ButtonStyle.Danger),
887+
)
888+
889+
await contestChannel.send({
890+
content: 'Helpers can delete this contest channel when resolved:',
891+
components: [deleteButtonRow],
892+
})
893+
880894
await interaction.update({
881895
content: `Contest channel created! Please go here to contest this matchup with the staff: ${contestChannel}`,
882896
components: [],
@@ -888,6 +902,40 @@ export default {
888902
await interaction.deleteReply()
889903
}
890904

905+
if (interaction.customId.startsWith('delete-contest-')) {
906+
const matchId = parseInt(interaction.customId.split('-')[2])
907+
const botSettings = await getSettings()
908+
const member = interaction.member as GuildMember
909+
910+
// Check if user is a helper
911+
if (
912+
member &&
913+
(member.roles.cache.has(botSettings.helper_role_id) ||
914+
member.roles.cache.has(botSettings.queue_helper_role_id))
915+
) {
916+
// User is a helper, delete the channel
917+
await interaction.reply({
918+
content: 'Deleting contest channel...',
919+
flags: MessageFlags.Ephemeral,
920+
})
921+
922+
try {
923+
await interaction.channel?.delete()
924+
} catch (err) {
925+
console.error(
926+
`Failed to delete contest channel for match ${matchId}:`,
927+
err,
928+
)
929+
}
930+
} else {
931+
// User is not a helper
932+
await interaction.reply({
933+
content: 'Only helpers can delete contest channels.',
934+
flags: MessageFlags.Ephemeral,
935+
})
936+
}
937+
}
938+
891939
if (interaction.customId.startsWith('rematch-')) {
892940
const matchId = parseInt(interaction.customId.split('-')[1])
893941
const matchData = await getMatchData(matchId)

src/utils/queryDB.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -385,20 +385,22 @@ export async function getLeaderboardPosition(
385385
queueId: number,
386386
userId: string,
387387
): Promise<number | null> {
388-
const playersRes = await pool.query(
388+
const result = await pool.query(
389389
`
390-
SELECT user_id
391-
FROM queue_users
392-
WHERE queue_id = $1
393-
ORDER BY elo DESC
390+
SELECT rank
391+
FROM (
392+
SELECT user_id, ROW_NUMBER() OVER (ORDER BY elo DESC) as rank
393+
FROM queue_users
394+
WHERE queue_id = $1
395+
) ranked
396+
WHERE user_id = $2
394397
`,
395-
[queueId],
398+
[queueId, userId],
396399
)
397400

398-
if (playersRes.rowCount === 0) return null
401+
if (result.rowCount === 0) return null
399402

400-
const players: { user_id: string }[] = playersRes.rows
401-
return players.findIndex((p) => p.user_id === userId) + 1
403+
return result.rows[0].rank
402404
}
403405

404406
export async function getLeaderboardQueueRole(
@@ -419,8 +421,6 @@ export async function getLeaderboardQueueRole(
419421
[queueId, rank],
420422
)
421423

422-
console.log(roleRes.rowCount)
423-
424424
if (roleRes.rowCount === 0) return null
425425
return roleRes.rows[0]
426426
}

src/utils/queueHelpers.ts

Lines changed: 45 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -585,53 +585,66 @@ export async function setUserQueueRole(
585585
): Promise<void> {
586586
console.log(`setting queue role for user ${userId} in queue ${queueId}`)
587587
const currentRole = await getUserQueueRole(queueId, userId)
588-
const leaderboardRole = await getLeaderboardQueueRole(queueId, userId)
589588
const allQueueRoles = await getAllQueueRoles(queueId, false)
589+
const leaderboardRole = await getLeaderboardQueueRole(queueId, userId)
590590

591591
const guild = await getGuild()
592592
const member = await guild.members.fetch(userId)
593593

594-
// Remove all MMR-based roles (where mmr_threshold is not null)
594+
// Get current member roles
595+
const currentRoleIds = new Set(member.roles.cache.keys())
596+
597+
// Determine which queue roles should be added/removed
595598
const mmrRoles = allQueueRoles.filter((role) => role.mmr_threshold !== null)
596-
for (const role of mmrRoles) {
597-
try {
598-
await member.roles.remove(role.role_id)
599-
} catch (err) {
600-
console.error(`Failed to remove MMR role ${role.role_id}:`, err)
599+
const leaderboardRoles = allQueueRoles.filter(
600+
(role) => role.leaderboard_min !== null,
601+
)
602+
603+
const rolesToRemove: string[] = []
604+
const rolesToAdd: string[] = []
605+
606+
// Check leaderboard roles
607+
for (const role of leaderboardRoles) {
608+
const expectedRole =
609+
leaderboardRole && role.role_id === leaderboardRole.role_id
610+
611+
if (expectedRole && !currentRoleIds.has(role.role_id)) {
612+
rolesToAdd.push(role.role_id)
613+
} else if (!expectedRole && currentRoleIds.has(role.role_id)) {
614+
rolesToRemove.push(role.role_id)
601615
}
602616
}
603617

604-
// Add the current MMR-based role if one exists
605-
if (currentRole) {
606-
try {
607-
await member.roles.add(currentRole.role_id)
608-
} catch (err) {
609-
console.error(`Failed to add MMR role ${currentRole.role_id}:`, err)
618+
// Check MMR roles
619+
for (const role of mmrRoles) {
620+
const expectedRole = currentRole && role.role_id === currentRole.role_id
621+
622+
// If the user has the expected role, check if they are within the MMR range
623+
// Also don't add if they already have the role
624+
if (expectedRole && !currentRoleIds.has(role.role_id)) {
625+
rolesToAdd.push(role.role_id)
626+
} else if (!expectedRole && currentRoleIds.has(role.role_id)) {
627+
rolesToRemove.push(role.role_id)
610628
}
611629
}
612630

613-
// Remove all leaderboard roles (where leaderboard_min is not null)
614-
const leaderboardRoles = allQueueRoles.filter(
615-
(role) => role.leaderboard_min !== null,
616-
)
617-
for (const role of leaderboardRoles) {
618-
try {
619-
await member.roles.remove(role.role_id)
620-
} catch (err) {
621-
console.error(`Failed to remove leaderboard role ${role.role_id}:`, err)
622-
}
631+
// Do nothing if no role changes are needed
632+
if (rolesToRemove.length === 0 && rolesToAdd.length === 0) {
633+
console.log(`No role changes needed for user ${userId}`)
634+
return
623635
}
624636

625-
// Add the current leaderboard role if one exists
626-
if (leaderboardRole) {
627-
try {
628-
await member.roles.add(leaderboardRole.role_id)
629-
} catch (err) {
630-
console.error(
631-
`Failed to add leaderboard role ${leaderboardRole.role_id}:`,
632-
err,
633-
)
637+
try {
638+
if (rolesToRemove.length > 0) {
639+
await member.roles.remove(rolesToRemove)
640+
console.log(`Removed ${rolesToRemove.length} roles from user ${userId}`)
641+
}
642+
if (rolesToAdd.length > 0) {
643+
await member.roles.add(rolesToAdd)
644+
console.log(`Added ${rolesToAdd.length} roles to user ${userId}`)
634645
}
646+
} catch (err) {
647+
console.error(`Failed to update roles for user ${userId}:`, err)
635648
}
636649
}
637650

0 commit comments

Comments
 (0)