All user data for FoundryVTT. Includes worlds, systems, modules, and any asset in the "foundryuserdata" directory. Does NOT include the FoundryVTT installation itself.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

110 lines
3.5 KiB

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