Fixed issue with stack trace in console when empty commands entered. Added more example modules
This commit is contained in:
parent
dbf6adfadc
commit
fc440654b8
16 changed files with 240 additions and 96 deletions
|
@ -767,7 +767,7 @@ The utils.at() function will perform a given task at a given time every
|
||||||
* time24hr : The time in 24hr form - e.g. 9:30 in the morning is "09:30" while
|
* time24hr : The time in 24hr form - e.g. 9:30 in the morning is "09:30" while
|
||||||
9:30 pm is "21:30", midnight is "00:00" and midday is "12:00"
|
9:30 pm is "21:30", midnight is "00:00" and midday is "12:00"
|
||||||
* callback : A javascript function which will be invoked at the given time.
|
* callback : A javascript function which will be invoked at the given time.
|
||||||
* world : (optional) Each world has its own clock. If no world is specified, the server's first world is used.
|
* worlds : (optional) An array of worlds. Each world has its own clock. If no array of worlds is specified, all the server's worlds are used.
|
||||||
|
|
||||||
#### Example
|
#### Example
|
||||||
|
|
||||||
|
@ -781,7 +781,7 @@ To warn players when night is approaching...
|
||||||
player.chat("The night is dark and full of terrors!");
|
player.chat("The night is dark and full of terrors!");
|
||||||
});
|
});
|
||||||
|
|
||||||
}, self.world);
|
});
|
||||||
|
|
||||||
### utils.find() function
|
### utils.find() function
|
||||||
|
|
||||||
|
@ -838,8 +838,8 @@ The following chat-formatting methods are added to the javascript String class..
|
||||||
Example
|
Example
|
||||||
-------
|
-------
|
||||||
|
|
||||||
var boldGoldText = "Hello World".bold().gold();
|
/js var boldGoldText = "Hello World".bold().gold();
|
||||||
self.sendMessage(boldGoldText);
|
/js self.sendMessage(boldGoldText);
|
||||||
|
|
||||||
<p style="color:gold;font-weight:bold">Hello World</p>
|
<p style="color:gold;font-weight:bold">Hello World</p>
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,10 @@ Bug Fix: [Can't get Scriptcraft core libraries working][bug103].
|
||||||
|
|
||||||
[bug103]: https://github.com/walterhiggins/ScriptCraft/issues/103
|
[bug103]: https://github.com/walterhiggins/ScriptCraft/issues/103
|
||||||
|
|
||||||
|
Bug Fix; Server console errors when empty commands submitted.
|
||||||
|
|
||||||
|
Added more example modules.
|
||||||
|
|
||||||
# 2013 12 28
|
# 2013 12 28
|
||||||
|
|
||||||
Documented the 'homes' module other tweaks to documentation.
|
Documented the 'homes' module other tweaks to documentation.
|
||||||
|
|
59
src/main/javascript/lib/command.js
Normal file
59
src/main/javascript/lib/command.js
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
/*
|
||||||
|
command management - allow for non-ops to execute approved javascript code.
|
||||||
|
*/
|
||||||
|
var _commands = {};
|
||||||
|
var _cmdInterceptors = [];
|
||||||
|
/*
|
||||||
|
execute a JSP command.
|
||||||
|
*/
|
||||||
|
var executeCmd = function(args, player){
|
||||||
|
if (args.length === 0)
|
||||||
|
throw new Error("Usage: jsp command-name command-parameters");
|
||||||
|
var name = args[0];
|
||||||
|
var cmd = _commands[name];
|
||||||
|
if (typeof cmd === "undefined"){
|
||||||
|
// it's not a global command - pass it on to interceptors
|
||||||
|
var intercepted = false;
|
||||||
|
for (var i = 0;i < _cmdInterceptors.length;i++){
|
||||||
|
if (_cmdInterceptors[i](args,player))
|
||||||
|
intercepted = true;
|
||||||
|
}
|
||||||
|
if (!intercepted)
|
||||||
|
console.warn('Command %s is not recognised',name);
|
||||||
|
}else{
|
||||||
|
func = cmd.callback;
|
||||||
|
var params = [];
|
||||||
|
for (var i =1; i < args.length;i++){
|
||||||
|
params.push("" + args[i]);
|
||||||
|
}
|
||||||
|
var result = null;
|
||||||
|
try {
|
||||||
|
result = func(params,player);
|
||||||
|
}catch (e){
|
||||||
|
console.error("Error while trying to execute command: " + JSON.stringify(params));
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
define a new JSP command.
|
||||||
|
*/
|
||||||
|
var defineCmd = function(name, func, options, intercepts) {
|
||||||
|
if (typeof options == "undefined")
|
||||||
|
options = [];
|
||||||
|
_commands[name] = {callback: func, options: options};
|
||||||
|
if (intercepts)
|
||||||
|
_cmdInterceptors.push(func);
|
||||||
|
return func;
|
||||||
|
};
|
||||||
|
var _command = function(name, func, options, intercepts) {
|
||||||
|
if (typeof name == "undefined"){
|
||||||
|
// it's an invocation from the Java Plugin!
|
||||||
|
return executeCmd(__cmdArgs, self);
|
||||||
|
}else{
|
||||||
|
return defineCmd(name, func, options, intercepts);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
exports.command = _command;
|
||||||
|
exports.commands = _commands;
|
|
@ -49,63 +49,8 @@ var _plugin = function(/* String */ moduleName, /* Object */ moduleObject, isPer
|
||||||
}
|
}
|
||||||
return moduleObject;
|
return moduleObject;
|
||||||
};
|
};
|
||||||
/*
|
|
||||||
allow for deferred execution (once all modules have loaded)
|
|
||||||
*/
|
|
||||||
var _deferred = [];
|
|
||||||
var _ready = function( func ){
|
|
||||||
_deferred.push(func);
|
|
||||||
};
|
|
||||||
var _cmdInterceptors = [];
|
|
||||||
/*
|
|
||||||
command management - allow for non-ops to execute approved javascript code.
|
|
||||||
*/
|
|
||||||
var _commands = {};
|
|
||||||
exports.commands = _commands;
|
|
||||||
var _command = function(name,func,options,intercepts)
|
|
||||||
{
|
|
||||||
if (typeof name == "undefined"){
|
|
||||||
// it's an invocation from the Java Plugin!
|
|
||||||
if (__cmdArgs.length === 0)
|
|
||||||
throw new Error("Usage: jsp command-name command-parameters");
|
|
||||||
var name = __cmdArgs[0];
|
|
||||||
var cmd = _commands[name];
|
|
||||||
if (typeof cmd === "undefined"){
|
|
||||||
// it's not a global command - pass it on to interceptors
|
|
||||||
var intercepted = false;
|
|
||||||
for (var i = 0;i < _cmdInterceptors.length;i++){
|
|
||||||
if (_cmdInterceptors[i](__cmdArgs))
|
|
||||||
intercepted = true;
|
|
||||||
}
|
|
||||||
if (!intercepted)
|
|
||||||
self.sendMessage("Command '" + name + "' is not recognised");
|
|
||||||
}else{
|
|
||||||
func = cmd.callback;
|
|
||||||
var params = [];
|
|
||||||
for (var i =1; i < __cmdArgs.length;i++){
|
|
||||||
params.push("" + __cmdArgs[i]);
|
|
||||||
}
|
|
||||||
var result = null;
|
|
||||||
try {
|
|
||||||
result = func(params);
|
|
||||||
}catch (e){
|
|
||||||
console.error("Error while trying to execute command: " + JSON.stringify(params));
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
if (typeof options == "undefined")
|
|
||||||
options = [];
|
|
||||||
_commands[name] = {callback: func, options: options};
|
|
||||||
if (intercepts)
|
|
||||||
_cmdInterceptors.push(func);
|
|
||||||
return func;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.plugin = _plugin;
|
exports.plugin = _plugin;
|
||||||
exports.command = _command;
|
|
||||||
exports.save = _save;
|
exports.save = _save;
|
||||||
|
|
||||||
var scriptCraftDir = null;
|
var scriptCraftDir = null;
|
||||||
|
@ -172,6 +117,7 @@ exports.autoload = function(dir) {
|
||||||
};
|
};
|
||||||
_reload(pluginDir);
|
_reload(pluginDir);
|
||||||
};
|
};
|
||||||
|
|
||||||
addUnloadHandler(function(){
|
addUnloadHandler(function(){
|
||||||
//
|
//
|
||||||
// save all plugins which have persistent data
|
// save all plugins which have persistent data
|
||||||
|
|
|
@ -565,11 +565,11 @@ var server = org.bukkit.Bukkit.server;
|
||||||
global.require = fnRequire(__plugin.logger, __engine, config.verbose, jsPluginsRootDirName, modulePaths);
|
global.require = fnRequire(__plugin.logger, __engine, config.verbose, jsPluginsRootDirName, modulePaths);
|
||||||
|
|
||||||
global.console = require('console');
|
global.console = require('console');
|
||||||
|
global.command = require('command').command;
|
||||||
var plugins = require('plugin');
|
var plugins = require('plugin');
|
||||||
global._onTabComplete = require('tabcomplete');
|
global._onTabComplete = require('tabcomplete');
|
||||||
|
|
||||||
global.plugin = plugins.plugin;
|
global.plugin = plugins.plugin;
|
||||||
global.command = plugins.command;
|
|
||||||
global.save = plugins.save;
|
global.save = plugins.save;
|
||||||
|
|
||||||
var events = require('events');
|
var events = require('events');
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
var _commands = require('plugin').commands;
|
var _commands = require('command').commands;
|
||||||
/*
|
/*
|
||||||
Tab completion for the /jsp commmand
|
Tab completion for the /jsp commmand
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -35,8 +35,8 @@ The following chat-formatting methods are added to the javascript String class..
|
||||||
Example
|
Example
|
||||||
-------
|
-------
|
||||||
|
|
||||||
var boldGoldText = "Hello World".bold().gold();
|
/js var boldGoldText = "Hello World".bold().gold();
|
||||||
self.sendMessage(boldGoldText);
|
/js self.sendMessage(boldGoldText);
|
||||||
|
|
||||||
<p style="color:gold;font-weight:bold">Hello World</p>
|
<p style="color:gold;font-weight:bold">Hello World</p>
|
||||||
|
|
||||||
|
|
|
@ -149,7 +149,7 @@ var _foreach = function(array, callback, object, delay, onCompletion) {
|
||||||
if (delay){
|
if (delay){
|
||||||
var next = function(){ callback(array[i],i,object,array); i++;};
|
var next = function(){ callback(array[i],i,object,array); i++;};
|
||||||
var hasNext = function(){return i < len;};
|
var hasNext = function(){return i < len;};
|
||||||
utils.nicely(next,hasNext,onCompletion,delay);
|
_nicely(next,hasNext,onCompletion,delay);
|
||||||
}else{
|
}else{
|
||||||
for (;i < len; i++){
|
for (;i < len; i++){
|
||||||
callback(array[i],i,object,array);
|
callback(array[i],i,object,array);
|
||||||
|
@ -182,17 +182,18 @@ function and the start of the next `next()` function.
|
||||||
See the source code to utils.foreach for an example of how utils.nicely is used.
|
See the source code to utils.foreach for an example of how utils.nicely is used.
|
||||||
|
|
||||||
***/
|
***/
|
||||||
exports.nicely = function(next, hasNext, onDone, delay){
|
var _nicely = function(next, hasNext, onDone, delay){
|
||||||
if (hasNext()){
|
if (hasNext()){
|
||||||
next();
|
next();
|
||||||
server.scheduler.runTaskLater(__plugin,function(){
|
server.scheduler.runTaskLater(__plugin,function(){
|
||||||
utils.nicely(next,hasNext,onDone,delay);
|
_nicely(next,hasNext,onDone,delay);
|
||||||
},delay);
|
},delay);
|
||||||
}else{
|
}else{
|
||||||
if (onDone)
|
if (onDone)
|
||||||
onDone();
|
onDone();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
exports.nicely = _nicely;
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
### utils.at() function
|
### utils.at() function
|
||||||
|
|
||||||
|
@ -204,7 +205,7 @@ The utils.at() function will perform a given task at a given time every
|
||||||
* time24hr : The time in 24hr form - e.g. 9:30 in the morning is "09:30" while
|
* time24hr : The time in 24hr form - e.g. 9:30 in the morning is "09:30" while
|
||||||
9:30 pm is "21:30", midnight is "00:00" and midday is "12:00"
|
9:30 pm is "21:30", midnight is "00:00" and midday is "12:00"
|
||||||
* callback : A javascript function which will be invoked at the given time.
|
* callback : A javascript function which will be invoked at the given time.
|
||||||
* world : (optional) Each world has its own clock. If no world is specified, the server's first world is used.
|
* worlds : (optional) An array of worlds. Each world has its own clock. If no array of worlds is specified, all the server's worlds are used.
|
||||||
|
|
||||||
#### Example
|
#### Example
|
||||||
|
|
||||||
|
@ -218,10 +219,10 @@ To warn players when night is approaching...
|
||||||
player.chat("The night is dark and full of terrors!");
|
player.chat("The night is dark and full of terrors!");
|
||||||
});
|
});
|
||||||
|
|
||||||
}, self.world);
|
});
|
||||||
|
|
||||||
***/
|
***/
|
||||||
exports.at = function(time24hr, callback, world) {
|
exports.at = function(time24hr, callback, worlds) {
|
||||||
var forever = function(){ return true;};
|
var forever = function(){ return true;};
|
||||||
var timeParts = time24hr.split(":");
|
var timeParts = time24hr.split(":");
|
||||||
var hrs = ((timeParts[0] * 1000) + 18000) % 24000;
|
var hrs = ((timeParts[0] * 1000) + 18000) % 24000;
|
||||||
|
@ -230,15 +231,17 @@ exports.at = function(time24hr, callback, world) {
|
||||||
mins = (timeParts[1] / 60) * 1000;
|
mins = (timeParts[1] / 60) * 1000;
|
||||||
|
|
||||||
var timeMc = hrs + mins;
|
var timeMc = hrs + mins;
|
||||||
if (typeof world == "undefined"){
|
if (typeof worlds == "undefined"){
|
||||||
world = server.worlds.get(0);
|
worlds = server.worlds;
|
||||||
}
|
}
|
||||||
utils.nicely(function(){
|
_nicely(function(){
|
||||||
var time = world.getTime();
|
_foreach (worlds, function (world){
|
||||||
var diff = timeMc - time;
|
var time = world.getTime();
|
||||||
if (diff > 0 && diff < 100){
|
var diff = timeMc - time;
|
||||||
callback();
|
if (diff > 0 && diff < 100){
|
||||||
}
|
callback();
|
||||||
|
}
|
||||||
|
});
|
||||||
},forever, null, 100);
|
},forever, null, 100);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -149,20 +149,22 @@ var alias = plugin('alias', {
|
||||||
}, true );
|
}, true );
|
||||||
|
|
||||||
|
|
||||||
var aliasCmd = command('alias', function(params){
|
var aliasCmd = command('alias', function(params,invoker){
|
||||||
var operation = params[0];
|
var operation = params[0];
|
||||||
if (!operation){
|
if (!operation){
|
||||||
self.sendMessage("Usage:\n" + _usage);
|
invoker.sendMessage("Usage:\n" + _usage);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (alias[operation])
|
if (alias[operation])
|
||||||
alias[operation](self, params.slice(1));
|
alias[operation](invoker, params.slice(1));
|
||||||
else
|
else
|
||||||
self.sendMessage("Usage:\n" + _usage);
|
invoker.sendMessage("Usage:\n" + _usage);
|
||||||
});
|
});
|
||||||
|
|
||||||
var _intercept = function( msg, invoker, exec)
|
var _intercept = function( msg, invoker, exec)
|
||||||
{
|
{
|
||||||
|
if (msg.trim().length == 0)
|
||||||
|
return false;
|
||||||
var msgParts = msg.split(' ');
|
var msgParts = msg.split(' ');
|
||||||
var command = msg.match(/^\/*([^\s]+)/)[1];
|
var command = msg.match(/^\/*([^\s]+)/)[1];
|
||||||
|
|
||||||
|
|
|
@ -86,14 +86,24 @@ exports.commando = function(name, func, options, intercepts){
|
||||||
|
|
||||||
events.on('player.PlayerCommandPreprocessEvent', function(l,e){
|
events.on('player.PlayerCommandPreprocessEvent', function(l,e){
|
||||||
var msg = "" + e.message;
|
var msg = "" + e.message;
|
||||||
var command = msg.match(/^\/([^\s]+)/)[1];
|
var parts = msg.match(/^\/([^\s]+)/);
|
||||||
|
if (!parts)
|
||||||
|
return;
|
||||||
|
if (parts.length < 2)
|
||||||
|
return;
|
||||||
|
var command = parts[1];
|
||||||
if (commands[command]){
|
if (commands[command]){
|
||||||
e.message = "/jsp " + msg.replace(/^\//,"");
|
e.message = "/jsp " + msg.replace(/^\//,"");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
events.on('server.ServerCommandEvent', function(l,e){
|
events.on('server.ServerCommandEvent', function(l,e){
|
||||||
var msg = "" + e.command;
|
var msg = "" + e.command;
|
||||||
var command = msg.match(/^\/*([^\s]+)/)[1];
|
var parts = msg.match(/^\/*([^\s]+)/);
|
||||||
|
if (!parts)
|
||||||
|
return;
|
||||||
|
if (parts.length < 2)
|
||||||
|
return;
|
||||||
|
var command = parts[1];
|
||||||
if (commands[command]){
|
if (commands[command]){
|
||||||
e.command = "jsp " + msg.replace(/^\//,"");
|
e.command = "jsp " + msg.replace(/^\//,"");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
/*
|
|
||||||
A simple minecraft plugin.
|
|
||||||
Usage: At the in-game prompt type ...
|
|
||||||
|
|
||||||
/js hello()
|
|
||||||
|
|
||||||
... and a message `Hello {player-name}` will appear (where {player-name} is
|
|
||||||
replaced by your own name).
|
|
||||||
*/
|
|
||||||
exports.hello = function(){
|
|
||||||
echo("Hello " + self.name);
|
|
||||||
};
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
A simple minecraft plugin.
|
||||||
|
Usage: At the in-game prompt type ...
|
||||||
|
|
||||||
|
/js hello(self)
|
||||||
|
|
||||||
|
... and a message `Hello {player-name}` will appear (where {player-name} is
|
||||||
|
replaced by your own name).
|
||||||
|
|
||||||
|
This example demonstrates the basics of adding new functionality which is only
|
||||||
|
usable by server operators or users with the scriptcraft.evaluate permission.
|
||||||
|
By default, only ops are granted this permission.
|
||||||
|
|
||||||
|
The `hello` function below is only usable by players with the scriptcraft.evaluate
|
||||||
|
permission since it relies on the `/js` command to execute.
|
||||||
|
|
||||||
|
*/
|
||||||
|
exports.hello = function(player){
|
||||||
|
player.sendMessage('Hello ' + player.name);
|
||||||
|
};
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
A simple minecraft plugin.
|
||||||
|
Usage: At the in-game prompt type ...
|
||||||
|
|
||||||
|
/jsp hello
|
||||||
|
|
||||||
|
... and a message `Hello {player-name}` will appear (where {player-name} is
|
||||||
|
replaced by your own name).
|
||||||
|
|
||||||
|
This example demonstrates the basics of adding new functionality
|
||||||
|
which is usable all players or those with the scriptcraft.proxy
|
||||||
|
permission. By default, all players are granted this permission.
|
||||||
|
|
||||||
|
This differs from example 1 in that a new 'jsp ' command extension
|
||||||
|
is defined. Since all players can use the `jsp` command, all players
|
||||||
|
can use the new extension. Unlike the previous example, the `jsp
|
||||||
|
hello` command does not evaluate javascript code so this command is
|
||||||
|
much more secure.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
command('hello', function (parameters, player) {
|
||||||
|
player.sendMessage('Hello ' + player.name);
|
||||||
|
});
|
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
A simple minecraft plugin.
|
||||||
|
Usage: At the in-game prompt type ...
|
||||||
|
|
||||||
|
/jsp op-hello
|
||||||
|
|
||||||
|
... and a message `Hello {player-name}` will appear (where {player-name} is
|
||||||
|
replaced by your own name).
|
||||||
|
|
||||||
|
This example demonstrates the basics of adding new functionality
|
||||||
|
which is usable all players or those with the scriptcraft.proxy
|
||||||
|
permission. By default, all players are granted this permission. In
|
||||||
|
this command though, the function checks to see if the player is an
|
||||||
|
operator and if they aren't will return immediately.
|
||||||
|
|
||||||
|
This differs from example 2 in that the function will only print a
|
||||||
|
message for operators.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
command('op-hello', function (parameters, player) {
|
||||||
|
/*
|
||||||
|
this is how you limit based on player privileges
|
||||||
|
*/
|
||||||
|
if (!player.op){
|
||||||
|
player.sendMessage('Only operators can do this.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
player.sendMessage('Hello ' + player.name);
|
||||||
|
});
|
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
A simple minecraft plugin.
|
||||||
|
Usage: At the in-game prompt type ...
|
||||||
|
|
||||||
|
/jsp hello-params Hi
|
||||||
|
/jsp hello-params Saludos
|
||||||
|
/jsp hello-params Greetings
|
||||||
|
|
||||||
|
... and a message `Hi {player-name}` or `Saludos {player-name}` etc
|
||||||
|
will appear (where {player-name} is replaced by your own name).
|
||||||
|
|
||||||
|
This example demonstrates adding and using parameters in commands.
|
||||||
|
|
||||||
|
This differs from example 3 in that the greeting can be changed from
|
||||||
|
a fixed 'Hello ' to anything you like by passing a parameter.
|
||||||
|
*/
|
||||||
|
|
||||||
|
command('hello-params', function (parameters, player) {
|
||||||
|
/*
|
||||||
|
parameters is an array (or list) of strings. parameters[0]
|
||||||
|
refers to the first element in the list. Arrays in Javascript
|
||||||
|
are 0-based. That is, the 1st element is parameters[0], the 2nd
|
||||||
|
element is parameters[1], the 3rd element is parameters[2] and
|
||||||
|
so on. In this example, parameters[1] refers to the first word
|
||||||
|
which appears after `jsp hello-params `.
|
||||||
|
*/
|
||||||
|
var salutation = parameters[0] ;
|
||||||
|
player.sendMessage( salutation + ' ' + player.name);
|
||||||
|
});
|
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
A simple minecraft plugin.
|
||||||
|
Usage: At the in-game prompt type ...
|
||||||
|
|
||||||
|
/jsp hello-module
|
||||||
|
|
||||||
|
... and a message `Hello {player-name}` will appear (where {player-name} is
|
||||||
|
replaced by your own name).
|
||||||
|
|
||||||
|
This example demonstrates the use of modules. In
|
||||||
|
example-1-hello-module.js we created a new javascript module. In
|
||||||
|
this example, we use that module...
|
||||||
|
|
||||||
|
* We load the module using the `require()` function. Because this
|
||||||
|
module and the module we require are n the same directory, we
|
||||||
|
specify `'./example-1-hello-module'` as the path (when loading a
|
||||||
|
module from the same directory, `./` at the start of the path
|
||||||
|
indicates that the file should be searched for in the same
|
||||||
|
directory.
|
||||||
|
|
||||||
|
* We assign the loaded module to a variable (`greetings`) and then
|
||||||
|
use the module's `hello` method to display the message.
|
||||||
|
|
||||||
|
*/
|
||||||
|
var greetings = require('./example-1-hello-module');
|
||||||
|
|
||||||
|
command('hello-module', function( parameters, player ){
|
||||||
|
greetings.hello(player);
|
||||||
|
});
|
Reference in a new issue