Moved watcher and at to separate modules (not in utils anymore).
This commit is contained in:
parent
1dabf3d25d
commit
5c4ff153e8
4 changed files with 320 additions and 295 deletions
122
src/main/js/modules/at.js
Normal file
122
src/main/js/modules/at.js
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
'use strict';
|
||||||
|
/*global events, module, require, __plugin, setInterval, clearInterval, setTimeout, addUnloadHandler*/
|
||||||
|
var utils = require('utils');
|
||||||
|
/************************************************************************
|
||||||
|
## The at Module
|
||||||
|
|
||||||
|
The at module provides a single function `at()` which can be used to schedule
|
||||||
|
repeating (or non-repeating) tasks to be done at a particular time.
|
||||||
|
|
||||||
|
### at() function
|
||||||
|
|
||||||
|
The utils.at() function will perform a given task at a given time in the
|
||||||
|
(minecraft) day.
|
||||||
|
|
||||||
|
#### Parameters
|
||||||
|
|
||||||
|
* 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'
|
||||||
|
* callback : A javascript function which will be invoked at the given time.
|
||||||
|
* 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.
|
||||||
|
* repeat : (optional) true or false, default is true (repeat the task every day)
|
||||||
|
|
||||||
|
#### Example
|
||||||
|
|
||||||
|
To warn players when night is approaching:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var utils = require('utils'),
|
||||||
|
at = require('at');
|
||||||
|
function warning(){
|
||||||
|
utils.players(function( player ) {
|
||||||
|
echo( player, 'The night is dark and full of terrors!' );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
at('19:00', warning);
|
||||||
|
```
|
||||||
|
To run a task only once at the next given time:
|
||||||
|
```javascript
|
||||||
|
var utils = require('utils'),
|
||||||
|
at = require('at');
|
||||||
|
function wakeup(){
|
||||||
|
utils.players(function( player ) {
|
||||||
|
echo( player, "Wake Up Folks!" );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
at('06:00', wakeup, null, false);
|
||||||
|
```
|
||||||
|
|
||||||
|
***/
|
||||||
|
function at(time24hr, callback, pWorlds, repeat) {
|
||||||
|
var timeParts = time24hr.split( ':' );
|
||||||
|
var timeMins = (timeParts[0] * 60) + (timeParts[1] * 1);
|
||||||
|
if (!pWorlds || typeof pWorlds == 'undefined' ) {
|
||||||
|
pWorlds = utils.worlds();
|
||||||
|
}
|
||||||
|
if (repeat === undefined){
|
||||||
|
repeat = true;
|
||||||
|
}
|
||||||
|
utils.foreach( pWorlds, function ( world ) {
|
||||||
|
atAddTask( timeMins, callback, world, repeat);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
var atTasks = {};
|
||||||
|
/*
|
||||||
|
constructs a function which will be called every x ticks to
|
||||||
|
track the schedule for a given world
|
||||||
|
*/
|
||||||
|
function atMonitorFactory(world){
|
||||||
|
var worldName = ''+ world.name;
|
||||||
|
var lastRun = null;
|
||||||
|
return function(){
|
||||||
|
var timeMins = utils.getTime24(world);
|
||||||
|
if (timeMins === lastRun){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
lastRun = timeMins;
|
||||||
|
var worldSchedule = atTasks[worldName];
|
||||||
|
if (!worldSchedule){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var tasks = worldSchedule[timeMins];
|
||||||
|
if (!tasks){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
utils.foreach(tasks, function(task, i){
|
||||||
|
if (!task){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setTimeout(task.callback.bind(null, timeMins, world), 1);
|
||||||
|
if (!task.repeat){
|
||||||
|
tasks[i] = null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
function atAddTask( timeMins, callback, world, repeat){
|
||||||
|
var worldName = ''+world.name;
|
||||||
|
if (!atTasks[worldName]){
|
||||||
|
atTasks[worldName] = {};
|
||||||
|
}
|
||||||
|
if (!atTasks[worldName][timeMins]){
|
||||||
|
atTasks[worldName][timeMins] = [];
|
||||||
|
}
|
||||||
|
atTasks[worldName][timeMins].push({callback: callback, repeat: repeat});
|
||||||
|
}
|
||||||
|
var atMonitors = [];
|
||||||
|
function onLoadStartMonitor(event){
|
||||||
|
var monitor = setInterval( atMonitorFactory(event.world), 900);
|
||||||
|
atMonitors.push( monitor );
|
||||||
|
}
|
||||||
|
if (__plugin.canary){
|
||||||
|
events.loadWorld( onLoadStartMonitor );
|
||||||
|
}
|
||||||
|
if (__plugin.bukkit){
|
||||||
|
events.worldLoad( onLoadStartMonitor );
|
||||||
|
}
|
||||||
|
|
||||||
|
addUnloadHandler(function(){
|
||||||
|
utils.foreach(atMonitors, function(atInterval){
|
||||||
|
clearInterval(atInterval);
|
||||||
|
});
|
||||||
|
});
|
|
@ -1,10 +1,11 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
/*global require, module, __plugin, __dirname, echo, persist, isOp, events, Packages, command, global */
|
/*global require, module, __plugin, __dirname, echo, persist, isOp, events, Packages, command, global */
|
||||||
var utils = require('utils'),
|
var utils = require('utils'),
|
||||||
|
watcher = require('watcher'),
|
||||||
autoload = require('plugin').autoload,
|
autoload = require('plugin').autoload,
|
||||||
foreach = utils.foreach,
|
foreach = utils.foreach,
|
||||||
watchDir = utils.watchDir,
|
watchDir = watcher.watchDir,
|
||||||
unwatchDir = utils.unwatchDir,
|
unwatchDir = watcher.unwatchDir,
|
||||||
playersDir = __dirname + '/../../players/',
|
playersDir = __dirname + '/../../players/',
|
||||||
serverAddress = utils.serverAddress();
|
serverAddress = utils.serverAddress();
|
||||||
|
|
||||||
|
@ -212,7 +213,7 @@ var _classroom = {
|
||||||
echo( sender, 'Only operators can use this function');
|
echo( sender, 'Only operators can use this function');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
foreach( utils.players(), function(player){
|
utils.players(function(player){
|
||||||
if (!isOp(player)){
|
if (!isOp(player)){
|
||||||
canScript ? grantScripting(player) : revokeScripting(player);
|
canScript ? grantScripting(player) : revokeScripting(player);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/*global __plugin, org, exports, server, setTimeout, Packages, setInterval, addUnloadHandler, clearInterval, events*/
|
/*global require, __plugin, org, exports, server, setTimeout, Packages, setInterval, addUnloadHandler, clearInterval, events*/
|
||||||
'use strict';
|
'use strict';
|
||||||
var File = java.io.File;
|
var File = java.io.File;
|
||||||
|
|
||||||
|
@ -411,117 +411,12 @@ var _nicely = function( next, hasNext, onDone, delay ) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
exports.nicely = _nicely;
|
exports.nicely = _nicely;
|
||||||
/************************************************************************
|
|
||||||
### utils.at() function
|
|
||||||
|
|
||||||
The utils.at() function will perform a given task at a given time in the
|
|
||||||
(minecraft) day.
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
* 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'
|
|
||||||
* callback : A javascript function which will be invoked at the given time.
|
|
||||||
* 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.
|
|
||||||
* repeat : (optional) true or false, default is true (repeat the task every day)
|
|
||||||
|
|
||||||
#### Example
|
|
||||||
|
|
||||||
To warn players when night is approaching:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
var utils = require('utils');
|
|
||||||
function warning(){
|
|
||||||
utils.players(function( player ) {
|
|
||||||
echo( player, 'The night is dark and full of terrors!' );
|
|
||||||
});
|
|
||||||
}
|
|
||||||
utils.at('19:00', warning);
|
|
||||||
```
|
|
||||||
To run a task only once at the next given time:
|
|
||||||
```javascript
|
|
||||||
var utils = require('utils');
|
|
||||||
function wakeup(){
|
|
||||||
utils.players(function( player ) {
|
|
||||||
echo( player, "Wake Up Folks!" );
|
|
||||||
});
|
|
||||||
}
|
|
||||||
utils.at('06:00', wakeup, null, false);
|
|
||||||
```
|
|
||||||
***/
|
|
||||||
exports.at = function( time24hr, callback, pWorlds, repeat ) {
|
exports.at = function( time24hr, callback, pWorlds, repeat ) {
|
||||||
var timeParts = time24hr.split( ':' );
|
console.warn("utils.at() is deprecated, use require('at') instead");
|
||||||
var timeMins = (timeParts[0] * 60) + (timeParts[1] * 1);
|
var at = require('at');
|
||||||
if (!pWorlds || typeof pWorlds == 'undefined' ) {
|
return at( time24hr, callback, pWorlds, repeat);
|
||||||
pWorlds = worlds();
|
|
||||||
}
|
|
||||||
if (repeat === undefined){
|
|
||||||
repeat = true;
|
|
||||||
}
|
|
||||||
_foreach( pWorlds, function ( world ) {
|
|
||||||
atAddTask( timeMins, callback, world, repeat);
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
var atTasks = {};
|
|
||||||
/*
|
|
||||||
constructs a function which will be called every x ticks to
|
|
||||||
track the schedule for a given world
|
|
||||||
*/
|
|
||||||
function atMonitorFactory(world){
|
|
||||||
var worldName = ''+ world.name;
|
|
||||||
var lastRun = null;
|
|
||||||
return function(){
|
|
||||||
var timeMins = getTime24(world);
|
|
||||||
if (timeMins === lastRun){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
lastRun = timeMins;
|
|
||||||
var worldSchedule = atTasks[worldName];
|
|
||||||
if (!worldSchedule){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var tasks = worldSchedule[timeMins];
|
|
||||||
if (!tasks){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
_foreach(tasks, function(task, i){
|
|
||||||
if (!task){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setTimeout(task.callback.bind(null, timeMins, world), 1);
|
|
||||||
if (!task.repeat){
|
|
||||||
tasks[i] = null;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}
|
|
||||||
function atAddTask( timeMins, callback, world, repeat){
|
|
||||||
var worldName = ''+world.name;
|
|
||||||
if (!atTasks[worldName]){
|
|
||||||
atTasks[worldName] = {};
|
|
||||||
}
|
|
||||||
if (!atTasks[worldName][timeMins]){
|
|
||||||
atTasks[worldName][timeMins] = [];
|
|
||||||
}
|
|
||||||
atTasks[worldName][timeMins].push({callback: callback, repeat: repeat});
|
|
||||||
}
|
|
||||||
var atMonitors = [];
|
|
||||||
function onLoadStartMonitor(evt){
|
|
||||||
var monitor = setInterval( atMonitorFactory(evt.world), 900);
|
|
||||||
atMonitors.push( monitor );
|
|
||||||
}
|
|
||||||
if (__plugin.canary){
|
|
||||||
events.loadWorld( onLoadStartMonitor );
|
|
||||||
}
|
|
||||||
if (__plugin.bukkit){
|
|
||||||
events.worldLoad( onLoadStartMonitor );
|
|
||||||
}
|
|
||||||
|
|
||||||
addUnloadHandler(function(){
|
|
||||||
_foreach(atMonitors, function(atInterval){
|
|
||||||
clearInterval(atInterval);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
### utils.time( world ) function
|
### utils.time( world ) function
|
||||||
|
|
||||||
|
@ -597,7 +492,7 @@ exports.find = function( dir , filter ) {
|
||||||
files = dirfile.list(filter);
|
files = dirfile.list(filter);
|
||||||
}
|
}
|
||||||
_foreach( files, function( file ) {
|
_foreach( files, function( file ) {
|
||||||
file = new java.io.File( dir + '/' + file );
|
file = new File( dir + '/' + file );
|
||||||
if ( file.isDirectory() ) {
|
if ( file.isDirectory() ) {
|
||||||
recurse( file.canonicalPath, store );
|
recurse( file.canonicalPath, store );
|
||||||
} else {
|
} else {
|
||||||
|
@ -640,188 +535,6 @@ exports.serverAddress = function() {
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
/************************************************************************
|
|
||||||
### utils.watchFile() function
|
|
||||||
|
|
||||||
Watches for changes to the given file or directory and calls the function provided
|
|
||||||
when the file changes.
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
* File - the file to watch (can be a file or directory)
|
|
||||||
* Callback - The callback to invoke when the file has changed. The callback takes the
|
|
||||||
changed file as a parameter.
|
|
||||||
|
|
||||||
#### Example
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
var utils = require('utils');
|
|
||||||
utils.watchFile( 'test.txt', function( file ) {
|
|
||||||
console.log( file + ' has changed');
|
|
||||||
});
|
|
||||||
```
|
|
||||||
***/
|
|
||||||
var filesWatched = {};
|
|
||||||
var dirsWatched = {};
|
|
||||||
|
|
||||||
exports.watchFile = function( file, callback ) {
|
|
||||||
if ( typeof file == 'string' ) {
|
|
||||||
file = new File(file);
|
|
||||||
}
|
|
||||||
filesWatched[file.canonicalPath] = {
|
|
||||||
callback: callback,
|
|
||||||
lastModified: file.lastModified()
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
### utils.watchDir() function
|
|
||||||
|
|
||||||
Watches for changes to the given directory and calls the function provided
|
|
||||||
when the directory changes. It works by calling watchFile/watchDir for each
|
|
||||||
file/subdirectory.
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
* Dir - the file to watch (can be a file or directory)
|
|
||||||
* Callback - The callback to invoke when the directory has changed.
|
|
||||||
The callback takes the changed file as a parameter.
|
|
||||||
For each change inside the directory the callback will also
|
|
||||||
be called.
|
|
||||||
|
|
||||||
#### Example
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
var utils = require('utils');
|
|
||||||
utils.watchDir( 'players/_ial', function( dir ) {
|
|
||||||
console.log( dir + ' has changed');
|
|
||||||
});
|
|
||||||
```
|
|
||||||
***/
|
|
||||||
|
|
||||||
exports.watchDir = function( dir, callback ) {
|
|
||||||
if ( typeof dir == 'string' ) {
|
|
||||||
dir = new File(dir);
|
|
||||||
}
|
|
||||||
dirsWatched[dir.canonicalPath] = {
|
|
||||||
callback: callback,
|
|
||||||
lastModified: dir.lastModified()
|
|
||||||
};
|
|
||||||
|
|
||||||
var files = dir.listFiles(),file;
|
|
||||||
if ( !files ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for ( var i = 0; i < files.length; i++ ) {
|
|
||||||
file = files[i];
|
|
||||||
if (file.isDirectory( )) {
|
|
||||||
exports.watchDir(file,callback);
|
|
||||||
}else{
|
|
||||||
exports.watchFile(file,callback);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
/************************************************************************
|
|
||||||
### utils.unwatchFile() function
|
|
||||||
|
|
||||||
Removes a file from the watch list.
|
|
||||||
|
|
||||||
#### Example
|
|
||||||
```javascript
|
|
||||||
var utils = require('utils');
|
|
||||||
utils.unwatchFile( 'test.txt');
|
|
||||||
```
|
|
||||||
|
|
||||||
***/
|
|
||||||
exports.unwatchFile = function( file, callback ) {
|
|
||||||
if ( typeof file == 'string' ) {
|
|
||||||
file = new File(file);
|
|
||||||
}
|
|
||||||
delete filesWatched[file.canonicalPath];
|
|
||||||
};
|
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
### utils.unwatchDir() function
|
|
||||||
|
|
||||||
Removes a directory from the watch list and all files inside the directory
|
|
||||||
are also "unwatched"
|
|
||||||
|
|
||||||
#### Example
|
|
||||||
```javascript
|
|
||||||
var utils = require('utils');
|
|
||||||
utils.unwatchDir ('players/_ial');
|
|
||||||
```
|
|
||||||
Would cause also
|
|
||||||
```javascript
|
|
||||||
utils.unwatchFile (file);
|
|
||||||
```
|
|
||||||
for each file inside directory (and unwatchDir for each directory inside it)
|
|
||||||
|
|
||||||
***/
|
|
||||||
exports.unwatchDir = function( dir, callback ) {
|
|
||||||
if ( typeof dir == 'string' ) {
|
|
||||||
dir = new File(dir);
|
|
||||||
}
|
|
||||||
delete dirsWatched[dir.canonicalPath];
|
|
||||||
|
|
||||||
var files = dir.listFiles(),file;
|
|
||||||
if ( !files ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for ( var i = 0; i < files.length; i++ ) {
|
|
||||||
file = files[i];
|
|
||||||
if (file.isDirectory( )) {
|
|
||||||
exports.unwatchDir(file,callback);
|
|
||||||
}else{
|
|
||||||
exports.unwatchFile(file,callback);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function fileWatcher(calledCallbacks) {
|
|
||||||
for (var file in filesWatched) {
|
|
||||||
var fileObject = new File(file);
|
|
||||||
var lm = fileObject.lastModified();
|
|
||||||
if ( lm != filesWatched[file].lastModified ) {
|
|
||||||
filesWatched[file].lastModified = lm;
|
|
||||||
filesWatched[file].callback(fileObject);
|
|
||||||
if (!fileObject.exists()) {
|
|
||||||
exports.unwatchFile(file,filesWatched[file].callback);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
//monitors directories for time change
|
|
||||||
//when a change is detected watchFiles are invoked for each of the files in directory
|
|
||||||
//and callback is called
|
|
||||||
function dirWatcher(calledCallbacks) {
|
|
||||||
for (var dir in dirsWatched) {
|
|
||||||
var dirObject = new File(dir);
|
|
||||||
var lm = dirObject.lastModified();
|
|
||||||
var dw = dirsWatched[dir];
|
|
||||||
if ( lm != dirsWatched[dir].lastModified ) {
|
|
||||||
dirsWatched[dir].lastModified = lm;
|
|
||||||
dirsWatched[dir].callback(dirObject);
|
|
||||||
|
|
||||||
exports.unwatchDir(dir, dw.callback);
|
|
||||||
//causes all files to be rewatched
|
|
||||||
if (dirObject.exists()) {
|
|
||||||
exports.watchDir(dir, dw.callback);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
//guarantees that a callback is only called once for each change
|
|
||||||
function monitorDirAndFiles() {
|
|
||||||
fileWatcher ();
|
|
||||||
dirWatcher ();
|
|
||||||
setTimeout( monitorDirAndFiles, 3000 );
|
|
||||||
};
|
|
||||||
|
|
||||||
setTimeout( monitorDirAndFiles, 3000 );
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
### utils.array() function
|
### utils.array() function
|
||||||
|
|
||||||
|
|
189
src/main/js/modules/watcher.js
Normal file
189
src/main/js/modules/watcher.js
Normal file
|
@ -0,0 +1,189 @@
|
||||||
|
'use strict';
|
||||||
|
/*global setTimeout, exports, require*/
|
||||||
|
var File = java.io.File;
|
||||||
|
/************************************************************************
|
||||||
|
## The watcher Module
|
||||||
|
|
||||||
|
This module exposes functions for watching for changes to files or directories.
|
||||||
|
|
||||||
|
### watcher.watchFile() function
|
||||||
|
|
||||||
|
Watches for changes to the given file or directory and calls the function provided
|
||||||
|
when the file changes.
|
||||||
|
|
||||||
|
#### Parameters
|
||||||
|
|
||||||
|
* File - the file to watch (can be a file or directory)
|
||||||
|
* Callback - The callback to invoke when the file has changed. The callback takes the
|
||||||
|
changed file as a parameter.
|
||||||
|
|
||||||
|
#### Example
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var watcher = require('watcher');
|
||||||
|
watcher.watchFile( 'test.txt', function( file ) {
|
||||||
|
console.log( file + ' has changed');
|
||||||
|
});
|
||||||
|
```
|
||||||
|
***/
|
||||||
|
var filesWatched = {};
|
||||||
|
var dirsWatched = {};
|
||||||
|
|
||||||
|
exports.watchFile = function( file, callback ) {
|
||||||
|
if ( typeof file == 'string' ) {
|
||||||
|
file = new File(file);
|
||||||
|
}
|
||||||
|
filesWatched[file.canonicalPath] = {
|
||||||
|
callback: callback,
|
||||||
|
lastModified: file.lastModified()
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/************************************************************************
|
||||||
|
### watcher.watchDir() function
|
||||||
|
|
||||||
|
Watches for changes to the given directory and calls the function provided
|
||||||
|
when the directory changes. It works by calling watchFile/watchDir for each
|
||||||
|
file/subdirectory.
|
||||||
|
|
||||||
|
#### Parameters
|
||||||
|
|
||||||
|
* Dir - the file to watch (can be a file or directory)
|
||||||
|
* Callback - The callback to invoke when the directory has changed.
|
||||||
|
The callback takes the changed file as a parameter.
|
||||||
|
For each change inside the directory the callback will also
|
||||||
|
be called.
|
||||||
|
|
||||||
|
#### Example
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var watcher = require('watcher');
|
||||||
|
watcher.watchDir( 'players/_ial', function( dir ) {
|
||||||
|
console.log( dir + ' has changed');
|
||||||
|
});
|
||||||
|
```
|
||||||
|
***/
|
||||||
|
|
||||||
|
exports.watchDir = function( dir, callback ) {
|
||||||
|
if ( typeof dir == 'string' ) {
|
||||||
|
dir = new File(dir);
|
||||||
|
}
|
||||||
|
dirsWatched[dir.canonicalPath] = {
|
||||||
|
callback: callback,
|
||||||
|
lastModified: dir.lastModified()
|
||||||
|
};
|
||||||
|
|
||||||
|
var files = dir.listFiles(),file;
|
||||||
|
if ( !files ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for ( var i = 0; i < files.length; i++ ) {
|
||||||
|
file = files[i];
|
||||||
|
if (file.isDirectory( )) {
|
||||||
|
exports.watchDir(file,callback);
|
||||||
|
}else{
|
||||||
|
exports.watchFile(file,callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
/************************************************************************
|
||||||
|
### watcher.unwatchFile() function
|
||||||
|
|
||||||
|
Removes a file from the watch list.
|
||||||
|
|
||||||
|
#### Example
|
||||||
|
```javascript
|
||||||
|
var watcher = require('watcher');
|
||||||
|
watcher.unwatchFile('test.txt');
|
||||||
|
```
|
||||||
|
|
||||||
|
***/
|
||||||
|
exports.unwatchFile = function( file, callback ) {
|
||||||
|
if ( typeof file == 'string' ) {
|
||||||
|
file = new File(file);
|
||||||
|
}
|
||||||
|
delete filesWatched[file.canonicalPath];
|
||||||
|
};
|
||||||
|
|
||||||
|
/************************************************************************
|
||||||
|
### watcher.unwatchDir() function
|
||||||
|
|
||||||
|
Removes a directory from the watch list and all files inside the directory
|
||||||
|
are also "unwatched"
|
||||||
|
|
||||||
|
#### Example
|
||||||
|
```javascript
|
||||||
|
var watcher = require('watcher');
|
||||||
|
watcher.unwatchDir ('players/_ial');
|
||||||
|
```
|
||||||
|
Would cause also
|
||||||
|
```javascript
|
||||||
|
watcher.unwatchFile (file);
|
||||||
|
```
|
||||||
|
for each file inside directory (and unwatchDir for each directory inside it)
|
||||||
|
|
||||||
|
***/
|
||||||
|
exports.unwatchDir = function( dir, callback ) {
|
||||||
|
if ( typeof dir == 'string' ) {
|
||||||
|
dir = new File(dir);
|
||||||
|
}
|
||||||
|
delete dirsWatched[dir.canonicalPath];
|
||||||
|
|
||||||
|
var files = dir.listFiles(),file;
|
||||||
|
if ( !files ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for ( var i = 0; i < files.length; i++ ) {
|
||||||
|
file = files[i];
|
||||||
|
if (file.isDirectory( )) {
|
||||||
|
exports.unwatchDir(file,callback);
|
||||||
|
}else{
|
||||||
|
exports.unwatchFile(file,callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function fileWatcher(calledCallbacks) {
|
||||||
|
for (var file in filesWatched) {
|
||||||
|
var fileObject = new File(file);
|
||||||
|
var lm = fileObject.lastModified();
|
||||||
|
if ( lm != filesWatched[file].lastModified ) {
|
||||||
|
filesWatched[file].lastModified = lm;
|
||||||
|
filesWatched[file].callback(fileObject);
|
||||||
|
if (!fileObject.exists()) {
|
||||||
|
exports.unwatchFile(file,filesWatched[file].callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//monitors directories for time change
|
||||||
|
//when a change is detected watchFiles are invoked for each of the files in directory
|
||||||
|
//and callback is called
|
||||||
|
function dirWatcher(calledCallbacks) {
|
||||||
|
for (var dir in dirsWatched) {
|
||||||
|
var dirObject = new File(dir);
|
||||||
|
var lm = dirObject.lastModified();
|
||||||
|
var dw = dirsWatched[dir];
|
||||||
|
if ( lm != dirsWatched[dir].lastModified ) {
|
||||||
|
dirsWatched[dir].lastModified = lm;
|
||||||
|
dirsWatched[dir].callback(dirObject);
|
||||||
|
|
||||||
|
exports.unwatchDir(dir, dw.callback);
|
||||||
|
//causes all files to be rewatched
|
||||||
|
if (dirObject.exists()) {
|
||||||
|
exports.watchDir(dir, dw.callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//guarantees that a callback is only called once for each change
|
||||||
|
function monitorDirAndFiles() {
|
||||||
|
fileWatcher ();
|
||||||
|
dirWatcher ();
|
||||||
|
setTimeout( monitorDirAndFiles, 3000 );
|
||||||
|
};
|
||||||
|
|
||||||
|
setTimeout( monitorDirAndFiles, 3000 );
|
Reference in a new issue