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