camelot-unchained
Version:
Camelot Unchained Client Library
75 lines (65 loc) • 2.19 kB
text/typescript
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
import events from '../events';
export interface SlashCommand {
command: string;
helpText: string;
}
const registry: SlashCommand[] = [];
function prefix(command: string) : string { return `slash_${command}`}
/**
* Registers a method to be executed when a slash command is entered in the chat
* window.
*/
export function registerSlashCommand(command: string, helpText: string, callback: (args: string) => void) {
let found = false;
for (var i = 0; i < registry.length; ++i) {
if (registry[i].command == command) {
found = true;
break;
}
}
if (!found) registry.push({command: command, helpText: helpText});
events.on(prefix(command), callback);
}
/**
* Un registers a slash command. WARNING: this will register all occurances
* of this command. If this was registered by multiple modules, ALL other modules
* listening for this command will stop working.
*/
export function unregisterSlashCommand(command: string) {
let index = -1;
for (var i = 0; i < registry.length; ++i) {
if (registry[i].command == command) {
events.off(command);
index = i;
break;
}
}
if (index >= 0) registry.slice(index, 1);
}
/**
* parseMessageForSlashCommand is meant to be run on every entered line of text
* entered into the chat window. If the line of text was a registered slash
* command then an event is fired for that command and the function returns true.
* If no slash command is found, the function returns false and the chat system
* should handle it however it would normally.
*/
export function parseMessageForSlashCommand(command: string): boolean {
const split = command.split(/ (.+)/);
let found = false;
for (var i = 0; i < registry.length; ++i) {
if (registry[i].command == split[0]) {
events.fire(prefix(split[0]), split[1]);
found = true;
break;
}
}
return found;
}
export function getSlashCommands(): SlashCommand[] {
return registry.slice(0);
}