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();
|
|
}
|
|
|
|
}
|