Compare commits

...

5 Commits

Author SHA1 Message Date
976175242b reorder close poll and use message identifier
All checks were successful
Compile the repository / compile (pull_request) Successful in 28s
Run unit tests / test (pull_request) Successful in 16s
2023-11-19 18:56:39 +01:00
68546b0b50 adjust message identifier in test 2023-11-19 18:56:08 +01:00
1348abbd48 make message identifiers actually work properly with LSP 2023-11-19 18:55:51 +01:00
fce9091114 rename message type union to better reflect its intention 2023-11-19 18:24:33 +01:00
081f3c6201 fix incorrect branded type 2023-11-19 18:24:13 +01:00
3 changed files with 30 additions and 25 deletions

View File

@ -2,11 +2,11 @@ import { Message } from "discord.js";
// branded types to differentiate objects of identical Type but different contents // branded types to differentiate objects of identical Type but different contents
export type VoteEndMessage = Message & { readonly __brand: 'vote' } export type VoteEndMessage = Message<true> & { readonly __brand: 'voteend' }
export type AnnouncementMessage = Message & { readonly __brand: 'announcement' } export type AnnouncementMessage = Message<true> & { readonly __brand: 'announcement' }
export type VoteMessage = Message & { readonly __brand: 'voteend' } export type VoteMessage = Message<true> & { readonly __brand: 'vote' }
export type DiscordMessage = VoteMessage | VoteEndMessage | AnnouncementMessage export type KnownDiscordMessage = VoteMessage | VoteEndMessage | AnnouncementMessage
export function isVoteMessage(message: Message): message is VoteMessage { export function isVoteMessage(message: Message): message is VoteMessage {
return message.cleanContent.includes('[Abstimmung]') return message.cleanContent.includes('[Abstimmung]')

View File

@ -225,29 +225,31 @@ export default class VoteController {
const lastMessage: Message<true> = messages[0] const lastMessage: Message<true> = messages[0]
logger.debug(`Found messages: ${JSON.stringify(messages, null, 2)}`, { guildId, requestId }) if (!isVoteMessage(lastMessage)) {
logger.error(`Found message that is not a vote message, can't proceed`, { guildId, requestId })
logger.debug(`Last message: ${JSON.stringify(lastMessage, null, 2)}`, { guildId, requestId }) logger.debug(`Found messages: ${JSON.stringify(messages, null, 2)}`, { guildId, requestId })
logger.debug(`Last message: ${JSON.stringify(lastMessage, null, 2)}`, { guildId, requestId })
}
const votes = (await this.getVotesByEmote(lastMessage, guildId, requestId)) else {
.sort((a, b) => b.count - a.count) const votes = (await this.getVotesByEmote(lastMessage, guildId, requestId))
.sort((a, b) => b.count - a.count)
logger.debug(`votes: ${JSON.stringify(votes, null, 2)}`, { guildId, requestId })
logger.debug(`votes: ${JSON.stringify(votes, null, 2)}`, { guildId, requestId })
logger.info("Deleting vote message")
await lastMessage.delete() logger.info("Deleting vote message")
const event = await this.getOpenEvent(guild, guild.id, requestId) lastMessage.unpin()
if (event && votes?.length > 0) { await lastMessage.delete()
this.updateOpenPollEventWithVoteResults(event, votes, guild, guildId, requestId) const event = await this.getOpenEvent(guild, guild.id, requestId)
this.sendVoteClosedMessage(event, votes[0].movie, guildId, requestId) if (event && votes?.length > 0) {
this.updateOpenPollEventWithVoteResults(event, votes, guild, guildId, requestId)
this.sendVoteClosedMessage(event, votes[0].movie, guildId, requestId)
}
} }
lastMessage.unpin()
} }
/** /**
* gets votes for the movies without the NONE_OF_THAT votes * gets votes for the movies without the NONE_OF_THAT votes
*/ */
public async getVotesByEmote(message: Message, guildId: string, requestId: string): Promise<Vote[]> { public async getVotesByEmote(message: VoteMessage, guildId: string, requestId: string): Promise<Vote[]> {
const votes: Vote[] = [] const votes: Vote[] = []
logger.debug(`Number of items in emotes: ${Object.values(Emotes).length}`, { guildId, requestId }) logger.debug(`Number of items in emotes: ${Object.values(Emotes).length}`, { guildId, requestId })
for (let i = 0; i < Object.keys(Emotes).length / 2; i++) { for (let i = 0; i < Object.keys(Emotes).length / 2; i++) {

View File

@ -3,6 +3,7 @@ import VoteController from "../../server/helper/vote.controller"
import { JellyfinHandler } from "../../server/jellyfin/handler" import { JellyfinHandler } from "../../server/jellyfin/handler"
import { ExtendedClient } from "../../server/structures/client" import { ExtendedClient } from "../../server/structures/client"
import { Emoji, NONE_OF_THAT } from "../../server/constants" import { Emoji, NONE_OF_THAT } from "../../server/constants"
import { isVoteMessage } from "../../server/helper/messageIdentifiers"
describe('vote controller - none_of_that functions', () => { describe('vote controller - none_of_that functions', () => {
const testEventId = '1234321' const testEventId = '1234321'
@ -89,8 +90,10 @@ describe('vote controller - none_of_that functions', () => {
}) })
} }
} }
const result = await votes.getVotesByEmote(mockMessage, 'guildId', 'requestId') if (isVoteMessage(mockMessage)) {
expect(result.length).toEqual(5) const result = await votes.getVotesByEmote(mockMessage, 'guildId', 'requestId')
expect(result).toEqual(votesList.filter(x => x.movie != NONE_OF_THAT)) expect(result.length).toEqual(5)
expect(result).toEqual(votesList.filter(x => x.movie != NONE_OF_THAT))
}
}) })
}) })