From 30bad342a5bc5a583514079b54c5a4bb5ca0c710 Mon Sep 17 00:00:00 2001
From: Benedikt Magnus <magnus@magnuscraft.de>
Date: Fri, 5 Nov 2021 17:16:35 +0100
Subject: [PATCH] Too long messages are now handled.

Includes a new config entry for the maximum message length.
---
 config/config.json.default                    |  1 +
 locale/de-DE.texts.json                       |  1 +
 scripts/utility/config.ts                     |  1 +
 scripts/utility/localisation.ts               |  1 +
 scripts/wichtelbot/message/messageHandler.ts  |  9 ++++--
 .../message/modules/generalModule.ts          | 11 ++++++++
 tests/tests/wichtelbot.message.handler.ts     | 28 +++++++++++++++++++
 7 files changed, 50 insertions(+), 2 deletions(-)

diff --git a/config/config.json.default b/config/config.json.default
index 541f570..9b70a96 100644
--- a/config/config.json.default
+++ b/config/config.json.default
@@ -1,6 +1,7 @@
 {
     "locale": "de-DE",
     "commandPrefix": "!",
+    "maxMessageLength": "2000",
     "moderationChannelIds": [
         "0"
     ],
diff --git a/locale/de-DE.texts.json b/locale/de-DE.texts.json
index b10633e..74f5dd5 100644
--- a/locale/de-DE.texts.json
+++ b/locale/de-DE.texts.json
@@ -28,6 +28,7 @@
     "informationUserExclusion": "Du möchtest irgendjemandem lieber nichts schenken, zum Beispiel, weil ihr eh gut befreundet seid? Dann darfst du hier bis zu drei Personen nennen (Discordname mit Tag, bspw. „Wichtelbot#6656“), die dir nicht mehr zugelost werden können. Wenn du niemanden ausschließen möchtest, schreibe einfach „-“.\n\nUnabhängig davon werde ich versuchen, dir kein Wichtelkind zuzuweisen, das du schon einmal bewichtelt hast.",
     "informationWishList": "Worüber freust du dich?\nDu kannst hier einen kleinen Text schreiben, was dir so gefällt oder ganz konkret eine Steam- oder Amazonwunschliste verlinken. Alles ist erlaubt, was deinem Wichtel dabei hilft, sich ein Bild zu machen, womit er dir eine Freude bereiten könnte.\n\nZusätzlich erhältst du später noch die Möglichkeit, Dinge auszuschließen, die du nicht magst und etwas ganz allgemein über dich zu erzählen.",
     "maybeResponse": "Ein Vielleicht gibts nicht! Die Weltherrschaft braucht eindeutige Ergebnisse!",
+    "messageTooLong": "Deine letzte Nachricht ist {var.messageLength} Zeichen lang. Erlaubt sind aber nur {var.maxLength} Zeichen. Kürze sie bitte und schicke mir dann den neuen Text.",
     "noCommandsAvailable": "Derzeit stehen keine besonderen Befehle zur Verfügung.",
     "notUnderstood": "Häää? Probiers nochmal.",
     "oldInformation": "Dies findet sich aktuell dazu in meiner Datenbank:\n>>> {var.informationValue}",
diff --git a/scripts/utility/config.ts b/scripts/utility/config.ts
index 690e940..9bb5584 100644
--- a/scripts/utility/config.ts
+++ b/scripts/utility/config.ts
@@ -7,6 +7,7 @@ interface MainConfig
 {
     locale: string;
     commandPrefix: string;
+    maxMessageLength: number;
     moderationChannelIds: string[];
     allowedCountries: string[];
     currentEvent: WichtelEvent;
diff --git a/scripts/utility/localisation.ts b/scripts/utility/localisation.ts
index 9af5547..779788d 100644
--- a/scripts/utility/localisation.ts
+++ b/scripts/utility/localisation.ts
@@ -61,6 +61,7 @@ interface Texts
     informationUserExclusion: TokenString;
     informationWishList: TokenString;
     maybeResponse: TokenString;
+    messageTooLong: TokenString;
     noCommandsAvailable: TokenString;
     notUnderstood: TokenString;
     oldInformation: TokenString;
diff --git a/scripts/wichtelbot/message/messageHandler.ts b/scripts/wichtelbot/message/messageHandler.ts
index f7fa2aa..05ec854 100644
--- a/scripts/wichtelbot/message/messageHandler.ts
+++ b/scripts/wichtelbot/message/messageHandler.ts
@@ -213,6 +213,13 @@ export default class MessageHandler
             return;
         }
 
+        if (message.content.length > Config.main.maxMessageLength)
+        {
+            await this.generalModule.sendMessageTooLong(message);
+
+            return;
+        }
+
         if (message.channel.type == ChannelType.Server)
         {
             if (!message.content.startsWith(Config.main.commandPrefix))
@@ -255,8 +262,6 @@ export default class MessageHandler
                 //       Short: Instead of <"command parameters"> we use <stateA: "command", stateB: "parameters">.
                 message.hasParameters = false;
 
-                // FIXME: Catch all commands should check for the 2.000 character limit as Discord Nitro users can send more.
-
                 const commandCallResult = await this.tryToCallCommand(message, contact.state);
 
                 switch (commandCallResult)
diff --git a/scripts/wichtelbot/message/modules/generalModule.ts b/scripts/wichtelbot/message/modules/generalModule.ts
index 60aab5a..eb367a8 100644
--- a/scripts/wichtelbot/message/modules/generalModule.ts
+++ b/scripts/wichtelbot/message/modules/generalModule.ts
@@ -194,4 +194,15 @@ export default class GeneralModule
             await message.reply(helpText);
         }
     }
+
+    public async sendMessageTooLong (message: Message): Promise<void>
+    {
+        const parameters = new KeyValuePairList();
+        parameters.addPair('messageLength', `${message.content.length}`);
+        parameters.addPair('maxLength', `${Config.main.maxMessageLength}`);
+
+        const answer = Localisation.texts.messageTooLong.process(message.author, parameters);
+
+        await message.reply(answer);
+    }
 }
diff --git a/tests/tests/wichtelbot.message.handler.ts b/tests/tests/wichtelbot.message.handler.ts
index 462c217..a380c0d 100644
--- a/tests/tests/wichtelbot.message.handler.ts
+++ b/tests/tests/wichtelbot.message.handler.ts
@@ -5,6 +5,7 @@ import { assert } from 'chai';
 import Config from '../../scripts/utility/config';
 import ConfigTestUtility from '../utility/config';
 import Database from '../../scripts/wichtelbot/database';
+import { KeyValuePairList } from '../../scripts/utility/keyValuePair';
 import Localisation from '../../scripts/utility/localisation';
 import MessageHandler from '../../scripts/wichtelbot/message/messageHandler';
 
@@ -132,5 +133,32 @@ describe('message handler',
                 assert.strictEqual(called, true);
             }
         );
+
+        it('answers with messageTooLong if message is too long.',
+            async function ()
+            {
+                let called = false;
+                let author: User;
+
+                const resultCallback = async (text: string): Promise<void> => // eslint-disable-line @typescript-eslint/require-await
+                {
+                    const parameters = new KeyValuePairList();
+                    parameters.addPair('messageLength', `${message.content.length}`);
+                    parameters.addPair('maxLength', `${Config.main.maxMessageLength}`);
+
+                    assert.strictEqual(text, Localisation.texts.messageTooLong.process(author, parameters));
+                    called = true;
+                };
+
+                const message = new TestMessageWithFixedAuthor(resultCallback, resultCallback, resultCallback, ChannelType.Personal);
+                author = message.author;
+
+                message.content = 'a'.repeat(Config.main.maxMessageLength + 1);
+
+                await messageHandler.process(message);
+
+                assert.strictEqual(called, true);
+            }
+        );
     }
 );
-- 
GitLab