import ChatCommand from "./ChatCommand.mjs"; export default class ChatCommands { constructor() { this.registeredCommands = []; } /** * Registers a Chat Command to be handled * @param command @typedef {Object} ChatCommand */ registerCommand(command) { this.registeredCommands.push(command); } /** * Deregister a Chat Command * @param command @typedef {Object} ChatCommand */ deregisterCommand(command) { ChatCommands._removeFromArray(this.registeredCommands, command); } static _removeFromArray(array, element) { const index = array.indexOf(element); if (index > -1) { array.splice(index, 1); } } /** * @deprecated in favor of createCommandFromData(data) */ createCommand(commandKey, shouldDisplayToChat, invokeOnCommand, createdMessageType = 0) { return new ChatCommand(commandKey, shouldDisplayToChat, invokeOnCommand, createdMessageType, "fa-terminal", "No description provided"); } createCommandFromData(data) { return new ChatCommand( data.commandKey, this._getOrDefault(data.shouldDisplayToChat, false), data.invokeOnCommand, this._getOrDefault(data.createdMessageType, 0), this._getOrDefault(data.iconClass, "fa-terminal"), this._getOrDefault(data.description, "No description provided"), this._getOrDefault(data.gmOnly, false) ); } _getOrDefault(value, defaultValue) { if (value != undefined) { return value; } return defaultValue } handleChatMessage(chatlog, messageText, chatData) { var matchString = messageText.toLowerCase(); let matchedCommands = []; for (var x = 0; x < this.registeredCommands.length; x++) { let registeredCommand = this.registeredCommands[x]; var commandKey = registeredCommand.commandKey.toLowerCase(); if (commandKey != "" && matchString.startsWith(commandKey)) { if (registeredCommand.gmOnly && !game.user.isGM) continue; matchedCommands.push(registeredCommand); } } let shouldCancel = false; let shouldShowToChat = false; for (let x=0; x < matchedCommands.length; x++) { let command = matchedCommands[x]; messageText = ChatCommands._removeCommand(messageText, command.commandKey); chatData.type = command.createdMessageType; shouldCancel = true; if (command.shouldDisplayToChat) { shouldShowToChat = true; } if (command.invokeOnCommand != undefined) { let modifiedText = command.invokeOnCommand(chatlog, messageText, chatData); if (modifiedText != undefined) { messageText = modifiedText; } } } if (shouldShowToChat) { chatData.content = messageText; ChatMessage.create(chatData); } return !shouldCancel; } static _caseInsensitiveReplace(line, word, replaceWith) { var regex = new RegExp('(' + word + ')', 'gi'); return line.replace(regex, replaceWith); } static _removeCommand(messageText, command) { messageText = ChatCommands._caseInsensitiveReplace(messageText, command, ""); return messageText.trim(); } }