From 53912b39a1c6ddb9871846c3e67f50d614fa62b0 Mon Sep 17 00:00:00 2001 From: Benedikt Magnus <magnus@magnuscraft.de> Date: Sun, 14 Nov 2021 20:34:00 +0100 Subject: [PATCH] Added "end registration" command. --- locale/de-DE.commands.json | 10 ++++++ locale/de-DE.texts.json | 1 + scripts/utility/localisation.ts | 2 ++ scripts/wichtelbot/database/database.ts | 31 +++++++++++++------ .../wichtelbot/endpoint/definitions/state.ts | 2 ++ .../wichtelbot/message/handlingDefinition.ts | 4 +++ .../message/modules/moderationModule.ts | 23 +++++++++++++- 7 files changed, 62 insertions(+), 11 deletions(-) diff --git a/locale/de-DE.commands.json b/locale/de-DE.commands.json index b258925..796b2cf 100644 --- a/locale/de-DE.commands.json +++ b/locale/de-DE.commands.json @@ -92,6 +92,16 @@ "maybe": { "commands": ["vielleicht", "vllt", "eventuell", "evtl"] }, + "moddingEndRegistration": + { + "commands": [ + "RegistrierungsphaseBeenden", + "RegistrierungBeenden", + "AnmeldephaseBeenden", + "AnmeldungBeenden" + ], + "info": "Beendet die Registrierungsphase und versetzt alle vollständig registrierten Teilnehmer in den Wartezustand." + }, "moddingRunAssignment": { "commands": [ diff --git a/locale/de-DE.texts.json b/locale/de-DE.texts.json index b654f9c..396088e 100644 --- a/locale/de-DE.texts.json +++ b/locale/de-DE.texts.json @@ -38,6 +38,7 @@ "notUnderstood": "Häää? Probiers nochmal.", "oldInformation": "Dies findet sich aktuell dazu in meiner Datenbank:\n>>> {var.informationValue}", "moderationNeedHelp": "<@&{var.moderationRoleId}> Der Wichtel {contact.nickname} ({contact.tag}) bittet um Hilfe.", + "moderationRegistrationEnded": "Registrierungsphase beendet. \nAnzahl Wartender: {var.waitingMemberCount}", "moderationStatus": "**Status des Wichtelns {var.currentEventName}**\nAktuelle Phase: {var.eventPhaseString}\n\nAnzahl Teilnehmer: {var.contactCount}\nDavon vollständig registriert: {var.waitingMemberCount}\n\nBewichtelungsarten:\nAls Wichtelpate: {var.analogueGiverCount} mal analog, {var.digitalGiverCount} mal digital, {var.allGiverCount} mal beides\nAls Wichtelkind: {var.analogueTakerCount} mal analog, {var.digitalTakerCount} mal digital, {var.allTakerCount} mal beides\n\nPakete: {var.parcelSentCount} versendet, {var.parcelReceivedCount} erhalten", "moderationStatusEventPhase": "{var.currentEventPhase}", "moderationStatusEventPhaseWithNextPhase": "{var.currentEventPhase} ({var.nextEventPhase} startet am {date.day}.{date.month}.{date.year} um {date.hour}:{date.minute} Uhr)", diff --git a/scripts/utility/localisation.ts b/scripts/utility/localisation.ts index 01da981..f72d176 100644 --- a/scripts/utility/localisation.ts +++ b/scripts/utility/localisation.ts @@ -27,6 +27,7 @@ interface Commands informationBothAnalogueAndDigital: CommandInfo; informationDigital: CommandInfo; maybe: CommandInfo; + moddingEndRegistration: CommandInfo; moddingRunAssignment: CommandInfo; // TODO: Rename "modding" commands to "moderation". moddingStatus: CommandInfo; no: CommandInfo; @@ -79,6 +80,7 @@ interface Texts notUnderstood: TokenString; oldInformation: TokenString; moderationNeedHelp: TokenString; // TODO: This includes a Discord specific mention which is not portable to other implementations. + moderationRegistrationEnded: TokenString; moderationStatus: TokenString; moderationStatusEventPhase: TokenString; moderationStatusEventPhaseWithNextPhase: TokenString; diff --git a/scripts/wichtelbot/database/database.ts b/scripts/wichtelbot/database/database.ts index 7616447..9b6ce44 100644 --- a/scripts/wichtelbot/database/database.ts +++ b/scripts/wichtelbot/database/database.ts @@ -248,21 +248,32 @@ export default class Database */ public updateContact (contact: Contact): void { - contact.lastUpdateTime = Utils.getCurrentUnixTime(); + this.updateContacts([contact]); + } + /** + * NOTE: The contact objects's lastUpdateTime will be updated. + */ + public updateContacts (contacts: Contact[]): void + { const statement = this.mainDatabase.prepare( `UPDATE - contact - SET - tag = :tag, name = :name, nickname = :nickname, - lastUpdateTime = :lastUpdateTime, type = :type, state = :state - WHERE - id = :id` + contact + SET + tag = :tag, name = :name, nickname = :nickname, + lastUpdateTime = :lastUpdateTime, type = :type, state = :state + WHERE + id = :id` ); - statement.run( - this.getBindablesFromObject(contact) - ); + for (const contact of contacts) + { + contact.lastUpdateTime = Utils.getCurrentUnixTime(); + + statement.run( + this.getBindablesFromObject(contact) + ); + } } public getContactCount (): number diff --git a/scripts/wichtelbot/endpoint/definitions/state.ts b/scripts/wichtelbot/endpoint/definitions/state.ts index 5ab407a..7f327b7 100644 --- a/scripts/wichtelbot/endpoint/definitions/state.ts +++ b/scripts/wichtelbot/endpoint/definitions/state.ts @@ -20,6 +20,8 @@ enum State /** Waiting for becoming a Wichtel. */ Waiting = 'waiting', // TODO: Rename to "registered". ConfirmDeregistration = 'confirmDeregistration', + /** While assignment is running; cannot change information. */ + Assignment = 'assignment', // TODO: Rename to "waiting" after "waiting" has been renamed to "registered". // As wichtel: MessageToGiftGiver = 'messageToGiftGiver', MessageToGiftTaker = 'messageToGiftTaker', diff --git a/scripts/wichtelbot/message/handlingDefinition.ts b/scripts/wichtelbot/message/handlingDefinition.ts index 401bd82..5fd8953 100644 --- a/scripts/wichtelbot/message/handlingDefinition.ts +++ b/scripts/wichtelbot/message/handlingDefinition.ts @@ -497,6 +497,10 @@ export default class HandlingDefinition ]; public moderatorCommands: CommandDefinition[] = [ + { + commandInfo: Localisation.commands.moddingEndRegistration, // TODO: Remove with cron feature that does this automatically. + handlerFunction: async (message: Message): Promise<void> => this.moderationModule.endRegistration(message) + }, { commandInfo: Localisation.commands.moddingRunAssignment, handlerFunction: async (message: Message): Promise<void> => diff --git a/scripts/wichtelbot/message/modules/moderationModule.ts b/scripts/wichtelbot/message/modules/moderationModule.ts index bd0367f..63012c1 100644 --- a/scripts/wichtelbot/message/modules/moderationModule.ts +++ b/scripts/wichtelbot/message/modules/moderationModule.ts @@ -2,7 +2,7 @@ import Config from "../../../utility/config"; import Database from "../../database/database"; import { KeyValuePairList } from "../../../utility/keyValuePair"; import Localisation from "../../../utility/localisation"; -import { Message } from "../../endpoint/definitions"; +import { Message, State } from "../../endpoint/definitions"; import Utils from "../../../utility/utils"; import WichtelEventPhase from "../../../utility/wichtelEvent"; @@ -90,4 +90,25 @@ export class ModerationModule await message.reply(answer); } + + /** + * End the registration phase and give all members that have completed the registration the "assignment" status. + */ + public async endRegistration (message: Message): Promise<void> + { + const members = this.database.getWaitingMembers(); + + for (const member of members) + { + member.state = State.Assignment; + } + + // NOTE: We can use "updateContacts" instead of "updateMembers" because we changed the state, which is only part of the contact: + this.database.updateContacts(members); + + const parameters = new KeyValuePairList('waitingMemberCount', `${members.length}`); + const answer = Localisation.texts.moderationRegistrationEnded.process(message.author, parameters); + + await message.reply(answer); + } } -- GitLab