From 75c234a823b660dafdd52dbc1da830ca7306e864 Mon Sep 17 00:00:00 2001 From: Benedikt Magnus <magnus@magnuscraft.de> Date: Thu, 4 Nov 2021 21:27:14 +0100 Subject: [PATCH] Help command --- locale/de-DE.commands.json | 13 ++++ locale/de-DE.texts.json | 3 +- scripts/utility/localisation.ts | 2 + scripts/wichtelbot/message/messageHandler.ts | 66 +++++++++++++------ .../message/modules/generalModule.ts | 32 ++++++--- 5 files changed, 86 insertions(+), 30 deletions(-) diff --git a/locale/de-DE.commands.json b/locale/de-DE.commands.json index 275ef86..7c2445c 100644 --- a/locale/de-DE.commands.json +++ b/locale/de-DE.commands.json @@ -49,6 +49,19 @@ "hey" ] }, + "help": { + "commands": [ + "Hilfe", + "Hilf mir", + "Info", + "Befehle", + "Kommandos", + "Was", + "Wie bitte", + "Hä" + ], + "info": "Zeigt an, welche Befehle derzeit zur Verfügung stehen." + }, "informationAnalogue": { "commands": ["analog", "nur analog"] }, diff --git a/locale/de-DE.texts.json b/locale/de-DE.texts.json index 9111216..8453001 100644 --- a/locale/de-DE.texts.json +++ b/locale/de-DE.texts.json @@ -28,9 +28,10 @@ "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!", + "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}", - "registration": "Okay, los gehts!\nDu kannst den Registrierungsvorgang jederzeit unterbrechen und einfach zu einem späteren Zeitpunkt weitermachen.\n\nInfos vorab:\n\nEs werden dir mehrere Fragen gestellt, angefangen davon, ob du lieber digital oder analog (oder beides) wichteln möchtest, über deine Adresse (Hausadresse/Packstation wenn analog, E-Mail/Steamprofil wenn digital) bis hin zu Allergien. Ganz zum Schluss erhältst du überdies die Möglichkeit, in Form eines Freitextes noch alles loszuwerden, das womöglich in den Fragen nicht abgedeckt worden ist.\nWenn du einen Fehler machst, verwende bitte _nicht_ die Discordfunktion zum Editieren von Nachrichten. Nach Abschluss der Registrierung kannst du die Antworten als Ganzes nochmals überarbeiten.\n\nBitte beachte: Wenn du deinen Wichtel analog bewichtelst, erhältst du sowohl den Klarnamen als auch eine Adresse. Bitte bedenke, dass dies Informationen sind, die nichts auf dem Discord zu suchen haben und gehe daher sensibel damit um.\n\nAuf dem Achterdiscord wird es drei verschiedene Kanäle für das Wichteln geben. Einen reinen Infokanal, in dem das Orgateam schreibt, einen spoilerfreien für Nachfragen und einen Hibbelkanal für Vorfreude, Fotos, Spekulationen etc.\nAuf diese Weise kann jeder das Wichteln so genießen, wie er das möchte.\n\nAlles klar? Klicke auf „ja“ um fortzufahren.", + "registration": "Okay, los gehts!\nDu kannst den Registrierungsvorgang jederzeit unterbrechen und einfach zu einem späteren Zeitpunkt weitermachen.\n\nInfos vorab:\n\nEs werden dir mehrere Fragen gestellt, angefangen davon, ob du lieber digital oder analog (oder beides) wichteln möchtest, über deine Adresse (Hausadresse/Packstation wenn analog, E-Mail/Steamprofil wenn digital) bis hin zu Allergien. Ganz zum Schluss erhältst du überdies die Möglichkeit, in Form eines Freitextes noch alles loszuwerden, das womöglich in den Fragen nicht abgedeckt worden ist.\nWenn du einen Fehler machst, verwende bitte _nicht_ die Discordfunktion zum Editieren von Nachrichten. Nach Abschluss der Registrierung kannst du die Antworten als Ganzes nochmals überarbeiten.\n\nBitte beachte: Wenn du deinen Wichtel analog bewichtelst, erhältst du sowohl den Klarnamen als auch eine Adresse. Bitte bedenke, dass dies Informationen sind, die nichts auf dem Discord zu suchen haben und gehe daher sensibel damit um.\n\nAuf dem Achterdiscord wird es drei verschiedene Kanäle für das Wichteln geben. Einen reinen Infokanal, in dem das Orgateam schreibt, einen spoilerfreien für Nachfragen und einen Hibbelkanal für Vorfreude, Fotos, Spekulationen etc.\nAuf diese Weise kann jeder das Wichteln so genießen, wie er das möchte.\n\nSchreibe „Hilfe“, um dir jederzeit eine Liste der aktuell verfügbaren Befehle ausgeben zu lassen.\n\nAlles klar? Klicke auf „ja“ um fortzufahren.", "registrationCancelled": "Schade! Wenn du es dir anders überlegen solltest, schreibe einfach „registrieren“, um den Anmeldevorgang erneut zu starten.", "sentComponentText": "Klicken! Du sollst klicken!" } diff --git a/scripts/utility/localisation.ts b/scripts/utility/localisation.ts index b2cc486..9af5547 100644 --- a/scripts/utility/localisation.ts +++ b/scripts/utility/localisation.ts @@ -19,6 +19,7 @@ interface Commands goodMorning: CommandInfo; goodNight: CommandInfo; hello: CommandInfo; + help: CommandInfo; informationAnalogue: CommandInfo; informationBothAnalogueAndDigital: CommandInfo; informationDigital: CommandInfo; @@ -60,6 +61,7 @@ interface Texts informationUserExclusion: TokenString; informationWishList: TokenString; maybeResponse: TokenString; + noCommandsAvailable: TokenString; notUnderstood: TokenString; oldInformation: TokenString; registration: TokenString; diff --git a/scripts/wichtelbot/message/messageHandler.ts b/scripts/wichtelbot/message/messageHandler.ts index f8a6057..cfd00f0 100644 --- a/scripts/wichtelbot/message/messageHandler.ts +++ b/scripts/wichtelbot/message/messageHandler.ts @@ -1,6 +1,6 @@ import { ChannelType, Message, State } from '../endpoint/definitions'; +import Localisation, { CommandInfo } from '../../utility/localisation'; import { CommandHandlerFunction } from './handlingTools/handlerFunctions'; -import { CommandInfo } from '../../utility/localisation'; import Config from '../../utility/config'; import Database from '../database'; import GeneralModule from './modules/generalModule'; @@ -32,13 +32,15 @@ export default class MessageHandler // In private messages: protected stateCommands = new StateCommandMap(); + protected helpCommands: string[] = []; // In group/server channels: protected publicCommands: CommandMap = new Map<string, CommandHandlerFunction>(); protected moderatorCommands: CommandMap = new Map<string, CommandHandlerFunction>(); // Special: protected firstContact: CommandHandlerFunction = async (message): Promise<void> => this.generalModule.firstContact(message); - protected messageNotUnterstood = async (message: Message, availableCommands: CommandInfo[]): Promise<void> => - this.generalModule.notUnderstood(message, availableCommands); + protected messageNotUnterstood = async (message: Message): Promise<void> => this.generalModule.notUnderstood(message); + protected sentHelpText = async (message: Message, availableCommands: CommandInfo[]): Promise<void> => + this.generalModule.sendHelpText(message, availableCommands); protected sentComponentText: CommandHandlerFunction = async (message): Promise<void> => this.generalModule.sentComponentText(message); protected componentExpectedStates: Set<State> = new Set(); @@ -101,6 +103,9 @@ export default class MessageHandler } ); } + + const commandList = stateCommandDefinition.paths.map((path) => path.command); + this.commandListsForEveryState.set(stateCommandDefinition.state, commandList); } } @@ -125,6 +130,14 @@ export default class MessageHandler } ); } + + // Help commands: + this.prepareCommandInfo(Localisation.commands.help, + (command: string): void => + { + this.helpCommands.push(command); + } + ); } /** @@ -151,6 +164,15 @@ export default class MessageHandler */ protected async tryToCallCommand (message: Message, state: State): Promise<CommandCallResult> { + // Help command: + if (this.helpCommands.includes(message.command)) + { + const availableCommands = this.getAvailableCommands(state); + await this.sentHelpText(message, availableCommands); + + return CommandCallResult.Called; + } + const stateCommands = [ new StateCommand(state, ''), // Catch all new StateCommand(state, message.command), // Specific state command @@ -253,25 +275,8 @@ export default class MessageHandler await this.sentComponentText(message); break; case CommandCallResult.NotFound: - { - let availableStateCommands = this.commandListsForEveryState.get(contact.state); - if (availableStateCommands === undefined) - { - availableStateCommands = []; - } - - let availableStatelessCommands = this.commandListsForEveryState.get(State.Nothing); - if (availableStatelessCommands === undefined) - { - availableStatelessCommands = []; - } - - const availableCommands = availableStateCommands.concat(availableStatelessCommands); - - await this.messageNotUnterstood(message, availableCommands); - + await this.messageNotUnterstood(message); break; - } } } else @@ -286,4 +291,23 @@ export default class MessageHandler return; } } + + private getAvailableCommands (state: State): CommandInfo[] + { + let availableStateCommands = this.commandListsForEveryState.get(state); + if (availableStateCommands === undefined) + { + availableStateCommands = []; + } + + let availableStatelessCommands = this.commandListsForEveryState.get(State.Nothing); + if (availableStatelessCommands === undefined) + { + availableStatelessCommands = []; + } + + const availableCommands = availableStateCommands.concat(availableStatelessCommands); + + return availableCommands; + } } diff --git a/scripts/wichtelbot/message/modules/generalModule.ts b/scripts/wichtelbot/message/modules/generalModule.ts index 90d432e..33046d3 100644 --- a/scripts/wichtelbot/message/modules/generalModule.ts +++ b/scripts/wichtelbot/message/modules/generalModule.ts @@ -163,9 +163,16 @@ export default class GeneralModule /** * Replies context-dependend help messages. */ - public async notUnderstood (message: Message, availableCommands: CommandInfo[]): Promise<void> + public async notUnderstood (message: Message): Promise<void> { - let answer = Localisation.texts.notUnderstood.process(message.author); + const answer = Localisation.texts.notUnderstood.process(message.author); + + await message.reply(answer); + } + + public async sendHelpText (message: Message, availableCommands: CommandInfo[]): Promise<void> + { + let helpText: string|null = null; // Print every available command with an info text as help message: if (availableCommands.length > 0) @@ -179,8 +186,11 @@ export default class GeneralModule continue; } - const parameters = new KeyValuePairList('name', commandInfo.info); - const singleCommandInfoText = Localisation.texts.commandInfo.process(undefined, parameters); + const parameters = new KeyValuePairList(); + parameters.addPair('name', commandInfo.commands[0]); + parameters.addPair('info', commandInfo.info); + + const singleCommandInfoText = Localisation.texts.commandInfo.process(message.author, parameters); commandInfoTexts.push(singleCommandInfoText); } @@ -190,12 +200,18 @@ export default class GeneralModule const infoText = commandInfoTexts.join('\n'); const parameters = new KeyValuePairList('commandInfo', infoText); - const helpText = Localisation.texts.helpText.process(undefined, parameters); - - answer += '\n\n' + helpText; + helpText = Localisation.texts.helpText.process(message.author, parameters); } } - await message.reply(answer); + if (helpText === null) + { + const answer = Localisation.texts.noCommandsAvailable.process(message.author); + await message.reply(answer); + } + else + { + await message.reply(helpText); + } } } -- GitLab