clone from github

This commit is contained in:
Boris
2024-01-15 09:30:27 +00:00
parent cb714d9889
commit 2a47c91dbf
37 changed files with 7581 additions and 0 deletions

View File

@@ -0,0 +1,20 @@
{
"discordPrefix" : "",
"discordChannels" :
{
"PlayerJoined" : "",
"PlayerLeft" : "",
"PlayerKilled" : "",
"PublicPlayerKilled" : "",
"PlayerMovedChunk" : "",
"TradeDeckUsed" : "",
"CreatureKilled" : ""
},
"discordRoles" :
{
"admin" : [],
"spawn" : []
}
}

View File

@@ -0,0 +1,5 @@
{
"username": "",
"password": ""//,
//"botToken": ""
}

View File

@@ -0,0 +1,8 @@
{"id":430480604,"username":"Guts","lastLogin":1585069824986,"_id":"DB5tkNBe6DhWPNRL"}
{"id":1833104236,"username":"Boris","lastLogin":1584647644426,"_id":"NB0BoE8nnIh7ToX5"}
{"id":971306613,"username":"poiuytrewq4645","lastLogin":1584282273535,"_id":"PI05jVvpOfvR5urh"}
{"id":833789224,"username":"mot40344","lastLogin":1585065470922,"_id":"TJoevTLA3FuCDErw"}
{"id":446362829,"username":"mr_blobbsen","lastLogin":1585066894604,"_id":"URneUJ5zw3P5k0Nk"}
{"id":670400968,"username":"Kinny","lastLogin":1584309293642,"_id":"h9SNzZCCqUm6L6j6"}
{"id":1179574189,"username":"Agidon","lastLogin":1584294727359,"_id":"vSM2TstpKQLyisNG"}
{"$$indexCreated":{"fieldName":"id","unique":"true","sparse":false}}

View File

@@ -0,0 +1 @@
{"$$indexCreated":{"fieldName":"hash","unique":"true","sparse":false}}

View File

@@ -0,0 +1,180 @@
//Load required classes.
const { Servers } = require('alta-jsapi');
const { WebsocketBot } = require('att-bot-core');
const { BasicWrapper } = require('att-websockets');
const Discord = require('discord.js');
const moment = require('moment');
const sha512 = require('crypto-js/sha512');
const fs = require('fs');
const alta_jsapi = require('alta-jsapi');
//Local classes
const Player = require('./src/player.js');
const Subscriptions = require('./src/subscriptions.js');
const commands = require('./src/discordcmds.js')
const managers = require('./src/managers.js');
//Load information from credentials and config
const { username, password, botToken } = require("./credentials");
const { targetServers, showAllServers, blacklistServers, discordPrefix, discordChannels, discordRoles } = require("./config");
//readline stuffs
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
//NeDB
var Datastore = require('nedb');
var players = new Datastore({ filename : 'data/players.db', autoload: true });
var kills = new Datastore({ filename : 'data/playerkills.db', autoload: true });
var chunkHistory = new Datastore({ filename : 'data/chunkhistory.db', autoload: true });
var spawnables = new Datastore({ filename : 'data/spawnables.db', autoload: true });
players.ensureIndex({ fieldName: 'id', unique: 'true' });
players.persistence.setAutocompactionInterval( 129600 );
spawnables.ensureIndex({ fieldName: 'hash', unique: 'true' });
//Vars
var playername = username;
var botConnection;
var pendingCommandList = [];
//Some utility helper functions and prototypes
function ts()
{
return "["+ moment().format("h:mm:ss A") +"] "
}
function strrep( str, n )
{
if ( n < 1 ) return '';
var result = str;
while( n-- > 0 )
{
result += str;
}
return result;
}
// Database helpers
function insertHandler( err, doc )
{
if ( err ) { console.log( err ); }
}
function updateHandler( err, rows )
{
if ( err ) { console.log( err ); }
}
function convertPassToHash( username, password, botToken )
{
// The SHA512 hash generated by crypto-js/sha512 will be 128 characters
if ( password.length !== 128 )
{
console.log( "Plaintext password encountered, converting to SHA512 hash for permanent storage" );
newPass = alta_jsapi.Sessions.hashPassword(password)
newFile = { "username" : username, "password" : newPass, "botToken": botToken };
fs.writeFile('./credentials.json', JSON.stringify( newFile, null, 4 ), function( err ) {
if ( err )
{
console.log( err );
} else {
console.log( "New credentials.json saved" );
}
});
password = newPass;
}
return password;
}
//Run the program
main();
async function main()
{
console.log( ts() + "[BorisBot: Discord Edition] is Starting" );
// Convert the password to a hash if necessary
var mpassword = convertPassToHash( username, password, botToken );
// Players in database
//players.find({}).exec( function( err, docs ) { console.log( docs ); });
//Connect to discord
const discord = new Discord.Client();
await new Promise( resolve =>
{
discord.on('ready', resolve);
discord.login(botToken);
});
//Discord command and message management (todo: move to own lib)
discord.on('message', message =>
{
if ( message.content.length > 0 && message.content.startsWith( discordPrefix ) )
{
var tmessage = message.content.substring(discordPrefix.length).trim();
var args = splitArgs( tmessage );
if ( args && args.length >= 1 )
{
var command = args.shift();
var commandFunction = commands[command];
if (!!commandFunction)
{
commandFunction(message, args, tmessage);
}
}
}
});
//Alta Login
const bot = new WebsocketBot();
//Use a hashed password, SHA512
await bot.loginWithHash(username, mpassword);
//Run the bot.
//When any of the 'targetServers' are available, a connection is automatically created.
var subs = new Subscriptions( discordChannels, players, kills, chunkHistory );
alta_jsapi.Sessions.loginWithUsername(username, mpassword);
await bot.run(test => targetServers.includes(test.id), async (server, connection) =>
{
var wrapper = new BasicWrapper(connection);
botConnection =
{
"connection" : connection,
"wrapper" : wrapper
}
console.log( ts() +"loading inital players" );
for ( var i in server.online_players )
{
let oplayer = server.online_players[i];
subs.PlayerJoined( discord, { "user": { "id": oplayer.id, "username": oplayer.username } });
}
// Subscriptions
await wrapper.subscribe("PlayerJoined", data => { subs.PlayerJoined( discord, data ) });
await wrapper.subscribe("PlayerLeft", data => { subs.PlayerLeft( discord, data ); });
await wrapper.subscribe("PlayerKilled", data => { subs.PlayerKilled( discord, data ); });
await wrapper.subscribe("TradeDeckUsed", data => { subs.TradeDeckUsed( discord, data ); });
await wrapper.subscribe("CreatureKilled", data => { subs.CreatureKilled( discord, data ); });
await wrapper.subscribe("PlayerMovedChunk", data => { subs.PlayerMovedChunk( discord, data ); });
await wrapper.subscribe("TraceLog", data => {
if ( pendingCommandList.length && data.logger === pendingCommandList[0].module )
{
console.log( "the command is a module match" )
// TODO: add a 'type' to pending commands to better match response items
let command = pendingCommandList.shift();
if ( command )
{
console.log( "executing handler" )
command.handler( data.message );
}
}
}
);
}
)
}

View File

@@ -0,0 +1,248 @@
//Load required classes.
const { Servers } = require('alta-jsapi');
const { WebsocketBot } = require('att-bot-core');
const { BasicWrapper } = require('att-websockets');
const Discord = require('discord.js');
const moment = require('moment');
const sha512 = require('crypto-js/sha512');
const fs = require('fs');
const alta_jsapi = require('alta-jsapi');
//Local classes
const Player = require('./src/player.js');
const Subscriptions = require('./src/subscriptions.js');
const commands = require('./src/discordcmds.js')
const managers = require('./src/managers.js');
//Load information from credentials and config
const { username, password, botToken } = require("./credentials");
const { targetServers, showAllServers, blacklistServers, discordPrefix, discordChannels, discordRoles } = require("./config");
//readline stuffs
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
//NeDB
var Datastore = require('nedb');
var players = new Datastore({ filename : 'data/players.db', autoload: true });
var kills = new Datastore({ filename : 'data/playerkills.db', autoload: true });
var chunkHistory = new Datastore({ filename : 'data/chunkhistory.db', autoload: true });
var spawnables = new Datastore({ filename : 'data/spawnables.db', autoload: true });
players.ensureIndex({ fieldName: 'id', unique: 'true' });
players.persistence.setAutocompactionInterval( 129600 );
spawnables.ensureIndex({ fieldName: 'hash', unique: 'true' });
//Vars
var playername = username;
var botConnection;
var pendingCommandList = [];
//Some utility helper functions and prototypes
function ts()
{
return "["+ moment().format("h:mm:ss A") +"] "
}
function strrep( str, n )
{
if ( n < 1 ) return '';
var result = str;
while( n-- > 0 )
{
result += str;
}
return result;
}
// Database helpers
function insertHandler( err, doc )
{
if ( err ) { console.log( err ); }
}
function updateHandler( err, rows )
{
if ( err ) { console.log( err ); }
}
function convertPassToHash( username, password, botToken )
{
// The SHA512 hash generated by crypto-js/sha512 will be 128 characters
if ( password.length !== 128 )
{
console.log( "Plaintext password encountered, converting to SHA512 hash for permanent storage" );
newPass = alta_jsapi.Sessions.hashPassword(password)
newFile = { "username" : username, "password" : newPass, "botToken": botToken };
fs.writeFile('./credentials.json', JSON.stringify( newFile, null, 4 ), function( err ) {
if ( err )
{
console.log( err );
} else {
console.log( "New credentials.json saved" );
}
});
password = newPass;
}
return password;
}
//Run the program
main();
async function main()
{
console.log( ts() + "[BorisBot: Discord Edition] is Starting" );
// Convert the password to a hash if necessary
var mpassword = convertPassToHash( username, password, botToken );
// Players in database
//players.find({}).exec( function( err, docs ) { console.log( docs ); });
//Connect to discord
const discord = new Discord.Client();
await new Promise( resolve =>
{
discord.on('ready', resolve);
discord.login(botToken);
});
//Discord command and message management (todo: move to own lib)
discord.on('message', message =>
{
if ( message.content.length > 0 && message.content.startsWith( discordPrefix ) )
{
var tmessage = message.content.substring(discordPrefix.length).trim();
var args = splitArgs( tmessage );
if ( args && args.length >= 1 )
{
var command = args.shift();
var commandFunction = commands[command];
if (!!commandFunction)
{
commandFunction(message, args, tmessage);
}
}
}
});
//Alta Login
const bot = new WebsocketBot();
//Use a hashed password, SHA512
await bot.loginWithHash(username, mpassword);
//Run the bot.
//When any of the 'targetServers' are available, a connection is automatically created.
var subs = new Subscriptions( discordChannels, players, kills, chunkHistory );
alta_jsapi.Sessions.loginWithUsername(username, mpassword);
var targetServers = []
serverquery()
function serverquery() {
rl.question('Server? > ', (serverans) => //Outputs 'Server? > ' to allow the user to input one of the below results
{
(async () => {
servers = await alta_jsapi.Servers.getConsoleServers()
for(i=0; i<servers.length; i++) {
if(servers[i].name.match(serverans)) {
serverans = servers[i].name
targetServers[0] = servers[i].id
console.log(servers[i].name)
console.log(servers[i].id)
break;
}
else if(i == (servers.length - 1)) {
console.log("Selected server offline / Spelt something wrong you pleb")
serverquery()
return;
}
}
await bot.run(test => targetServers.includes(test.id), async (server, connection) =>
{
var wrapper = new BasicWrapper(connection);
botConnection =
{
"connection" : connection,
"wrapper" : wrapper
}
console.log( ts() +"loading inital players" );
for ( var i in server.online_players )
{
let oplayer = server.online_players[i];
subs.PlayerJoined( discord, { "user": { "id": oplayer.id, "username": oplayer.username } });
}
//Subscriptions
await wrapper.subscribe("PlayerJoined", data => { subs.PlayerJoined( discord, data ) });
await wrapper.subscribe("PlayerLeft", data => { subs.PlayerLeft( discord, data ); });
await wrapper.subscribe("PlayerKilled", data => { subs.PlayerKilled( discord, data ); });
await wrapper.subscribe("TradeDeckUsed", data => { subs.TradeDeckUsed( discord, data ); });
await wrapper.subscribe("CreatureKilled", data => { subs.CreatureKilled( discord, data ); });
await wrapper.subscribe("PlayerMovedChunk", data => { subs.PlayerMovedChunk( discord, data ); });
await wrapper.subscribe("TraceLog", data => {
if (message.content.startsWith("!"))
{
say("Working on pleb commands shut it")
}
// Admin Only ///////////////////////////////////////////////////////////////////
// Admin commands are preceeded by an exclamation mark to avoid accidentally doing stuff.
else if (message.content.startsWith("!!"))
{
var TEMPmessage = message.content.replace(/[,\/#!$%\^&\*;:{}=\-_`'~?()]/g,"")
originalMessageAsAnArray = TEMPmessage.split(' ');
// Make sure the user is CJ or Poi.
if (message.author.discriminator.match("8147"))
{
// List possible commands. Will explan on this later.
if (hazWerds("command", "list") == "Y")
{
say('**Current commands:** \n!teleport [PLAYER] to [PLAYER]\n!broadcast [TIME IN SECONDS] [MESSAGE WITH NO QUOTES] (Still working on this)')
}
// Broadcast a message to all players.
else if (hazWerds("broadcast") == "Y")
{
originalMessageAsAnArray.shift()
TEMPduration = originalMessageAsAnArray[0]
originalMessageAsAnArray.shift()
TEMPmessage = originalMessageAsAnArray.join(" ")
try
{
wrapper.send('player message * "' + TEMPmessage + '" ' + TEMPduration)
say('SENT: player message * "' + TEMPmessage + '" ' + TEMPduration)
}
catch(err) {main()}
}
// Teleport one player to another.
else if (hazWerds("teleport", "to") == "Y")
{
try
{wrapper.send("player teleport " + originalMessageAsAnArray[1] + " " + originalMessageAsAnArray[3])
say(originalMessageAsAnArray[1] + " should have been teleported to " + originalMessageAsAnArray[3] + ".")}
catch(err) {main()}
}
// Just send it to the server directly as a command.
else
{
wrapper.send(TEMPmessage)
}
}
}
}
);
}
)
}
)()
}
)
}
}

839
BorisBotDiscordEdition/package-lock.json generated Normal file
View File

@@ -0,0 +1,839 @@
{
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"@discordjs/collection": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.5.tgz",
"integrity": "sha512-CU1q0UXQUpFNzNB7gufgoisDHP7n+T3tkqTsp3MNUkVJ5+hS3BCvME8uCXAUFlz+6T2FbTCu75A+yQ7HMKqRKw=="
},
"abort-controller": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
"integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
"requires": {
"event-target-shim": "^5.0.0"
}
},
"ajv": {
"version": "6.12.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
"integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
"requires": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
"alta-jsapi": {
"version": "git+https://github.com/alta-vr/alta-jsapi.git#b49de4d687d3f70daa1a16f409dfb741a75b9453",
"from": "git+https://github.com/alta-vr/alta-jsapi.git",
"requires": {
"crypto-js": "^3.1.9-1",
"jsonwebtoken": "^8.5.1",
"memoizee": "^0.4.14",
"request": "^2.88.0",
"request-promise-native": "^1.0.7"
}
},
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"requires": {
"color-convert": "^1.9.0"
}
},
"asn1": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
"integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
"requires": {
"safer-buffer": "~2.1.0"
}
},
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
},
"async": {
"version": "0.2.10",
"resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
"integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E="
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
},
"att-bot-core": {
"version": "git+https://github.com/alta-vr/ATT-Bot-JS.git#9a4ba212c1a69749fb7fc40160d24f3d4c99bcef",
"from": "git+https://github.com/alta-vr/ATT-Bot-JS.git",
"requires": {
"alta-jsapi": "git+https://github.com/alta-vr/alta-jsapi.git",
"att-websockets": "git+https://github.com/alta-vr/att-websockets.git",
"chalk": "^2.4.2",
"crypto-js": "^3.1.9-1",
"node": "^12.10.0"
}
},
"att-websockets": {
"version": "git+https://github.com/alta-vr/att-websockets.git#8bf9c52f2e23050655e40d38e5d8faef074c4576",
"from": "git+https://github.com/alta-vr/att-websockets.git",
"requires": {
"alta-jsapi": "git+https://github.com/alta-vr/alta-jsapi.git",
"isomorphic-ws": "^4.0.1",
"ws": "^7.1.2"
}
},
"aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
},
"aws4": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
"integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug=="
},
"bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
"integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
"requires": {
"tweetnacl": "^0.14.3"
},
"dependencies": {
"tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
}
}
},
"binary-search-tree": {
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/binary-search-tree/-/binary-search-tree-0.2.5.tgz",
"integrity": "sha1-fbs7IQ/coIJFDa0jNMMErzm9x4Q=",
"requires": {
"underscore": "~1.4.4"
}
},
"buffer-equal-constant-time": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
"integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
},
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
},
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"requires": {
"color-name": "1.1.3"
}
},
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
},
"combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": {
"delayed-stream": "~1.0.0"
}
},
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"crypto-js": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz",
"integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q=="
},
"d": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
"integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
"requires": {
"es5-ext": "^0.10.50",
"type": "^1.0.1"
}
},
"dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
"requires": {
"assert-plus": "^1.0.0"
}
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
"discord.js": {
"version": "12.0.2",
"resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.0.2.tgz",
"integrity": "sha512-iZiEA4Y61gqq/EjFfLXnkRK9pLapnax/vTVDUhs/mAhyqozAy0GOlk/MZI9rSa1iIoKTWRq6P9CRKhLNT2wUnA==",
"requires": {
"@discordjs/collection": "^0.1.5",
"abort-controller": "^3.0.0",
"form-data": "^3.0.0",
"node-fetch": "^2.6.0",
"prism-media": "^1.2.0",
"setimmediate": "^1.0.5",
"tweetnacl": "^1.0.3",
"ws": "^7.2.1"
},
"dependencies": {
"form-data": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz",
"integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
}
},
"tweetnacl": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
"integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw=="
}
}
},
"ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
"integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
"requires": {
"jsbn": "~0.1.0",
"safer-buffer": "^2.1.0"
}
},
"ecdsa-sig-formatter": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
"integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
"requires": {
"safe-buffer": "^5.0.1"
}
},
"es5-ext": {
"version": "0.10.53",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
"integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
"requires": {
"es6-iterator": "~2.0.3",
"es6-symbol": "~3.1.3",
"next-tick": "~1.0.0"
},
"dependencies": {
"next-tick": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
"integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
}
}
},
"es6-iterator": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
"integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
"requires": {
"d": "1",
"es5-ext": "^0.10.35",
"es6-symbol": "^3.1.1"
}
},
"es6-symbol": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
"integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
"requires": {
"d": "^1.0.1",
"ext": "^1.1.2"
}
},
"es6-weak-map": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
"integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
"requires": {
"d": "1",
"es5-ext": "^0.10.46",
"es6-iterator": "^2.0.3",
"es6-symbol": "^3.1.1"
}
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
"event-emitter": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
"integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
"requires": {
"d": "1",
"es5-ext": "~0.10.14"
}
},
"event-target-shim": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
"integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="
},
"ext": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
"integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
"requires": {
"type": "^2.0.0"
},
"dependencies": {
"type": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz",
"integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow=="
}
}
},
"extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
},
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
},
"fast-deep-equal": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
"integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA=="
},
"fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
},
"forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
},
"getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
"requires": {
"assert-plus": "^1.0.0"
}
},
"har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
},
"har-validator": {
"version": "5.1.3",
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
"integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
"requires": {
"ajv": "^6.5.5",
"har-schema": "^2.0.0"
}
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
},
"http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
"requires": {
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
"sshpk": "^1.7.0"
}
},
"immediate": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
"integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps="
},
"is-promise": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
"integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
},
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
},
"isomorphic-ws": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz",
"integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w=="
},
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
},
"json-schema": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
"integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
},
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
},
"json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
},
"jsonwebtoken": {
"version": "8.5.1",
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
"integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
"requires": {
"jws": "^3.2.2",
"lodash.includes": "^4.3.0",
"lodash.isboolean": "^3.0.3",
"lodash.isinteger": "^4.0.4",
"lodash.isnumber": "^3.0.3",
"lodash.isplainobject": "^4.0.6",
"lodash.isstring": "^4.0.1",
"lodash.once": "^4.0.0",
"ms": "^2.1.1",
"semver": "^5.6.0"
}
},
"jsprim": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
"integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
"requires": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
"json-schema": "0.2.3",
"verror": "1.10.0"
}
},
"jwa": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
"integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
"requires": {
"buffer-equal-constant-time": "1.0.1",
"ecdsa-sig-formatter": "1.0.11",
"safe-buffer": "^5.0.1"
}
},
"jws": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
"integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
"requires": {
"jwa": "^1.4.1",
"safe-buffer": "^5.0.1"
}
},
"lie": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz",
"integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=",
"requires": {
"immediate": "~3.0.5"
}
},
"localforage": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/localforage/-/localforage-1.7.3.tgz",
"integrity": "sha512-1TulyYfc4udS7ECSBT2vwJksWbkwwTX8BzeUIiq8Y07Riy7bDAAnxDaPU/tWyOVmQAcWJIEIFP9lPfBGqVoPgQ==",
"requires": {
"lie": "3.1.1"
}
},
"lodash": {
"version": "4.17.15",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
},
"lodash.includes": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
"integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
},
"lodash.isboolean": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
"integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
},
"lodash.isinteger": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
"integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
},
"lodash.isnumber": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
"integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
},
"lodash.isplainobject": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
"integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
},
"lodash.isstring": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
"integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
},
"lodash.once": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
"integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
},
"lru-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz",
"integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=",
"requires": {
"es5-ext": "~0.10.2"
}
},
"memoizee": {
"version": "0.4.14",
"resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz",
"integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==",
"requires": {
"d": "1",
"es5-ext": "^0.10.45",
"es6-weak-map": "^2.0.2",
"event-emitter": "^0.3.5",
"is-promise": "^2.1",
"lru-queue": "0.1",
"next-tick": "1",
"timers-ext": "^0.1.5"
}
},
"mime-db": {
"version": "1.43.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
"integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ=="
},
"mime-types": {
"version": "2.1.26",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
"integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
"requires": {
"mime-db": "1.43.0"
}
},
"minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"mkdirp": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz",
"integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==",
"requires": {
"minimist": "^1.2.5"
}
},
"moment": {
"version": "2.24.0",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
"integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"nedb": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/nedb/-/nedb-1.8.0.tgz",
"integrity": "sha1-DjUCzYLABNU1WkPJ5VV3vXvZHYg=",
"requires": {
"async": "0.2.10",
"binary-search-tree": "0.2.5",
"localforage": "^1.3.0",
"mkdirp": "~0.5.1",
"underscore": "~1.4.4"
}
},
"next-tick": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
},
"node": {
"version": "12.16.1",
"resolved": "https://registry.npmjs.org/node/-/node-12.16.1.tgz",
"integrity": "sha512-YFayjFMXG6thgqKHsiihuGXgjD/0227b3lO3S+BmRcN/DxBlSANOUndewuo2SD7sjleo/JKiL89aDDxP2VOV3w==",
"requires": {
"node-bin-setup": "^1.0.0"
}
},
"node-bin-setup": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.0.6.tgz",
"integrity": "sha512-uPIxXNis1CRbv1DwqAxkgBk5NFV3s7cMN/Gf556jSw6jBvV7ca4F9lRL/8cALcZecRibeqU+5dFYqFFmzv5a0Q=="
},
"node-fetch": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
"integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA=="
},
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
},
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
},
"prism-media": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.1.tgz",
"integrity": "sha512-R3EbKwJiYlTvGwcG1DpUt+06DsxOGS5W4AMEHT7oVOjG93MjpdhGX1whHyjnqknylLMupKAsKMEXcTNRbPe6Vw=="
},
"psl": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz",
"integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ=="
},
"punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
},
"qs": {
"version": "6.5.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
},
"request": {
"version": "2.88.2",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
"integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
"requires": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
"caseless": "~0.12.0",
"combined-stream": "~1.0.6",
"extend": "~3.0.2",
"forever-agent": "~0.6.1",
"form-data": "~2.3.2",
"har-validator": "~5.1.3",
"http-signature": "~1.2.0",
"is-typedarray": "~1.0.0",
"isstream": "~0.1.2",
"json-stringify-safe": "~5.0.1",
"mime-types": "~2.1.19",
"oauth-sign": "~0.9.0",
"performance-now": "^2.1.0",
"qs": "~6.5.2",
"safe-buffer": "^5.1.2",
"tough-cookie": "~2.5.0",
"tunnel-agent": "^0.6.0",
"uuid": "^3.3.2"
},
"dependencies": {
"form-data": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
"mime-types": "^2.1.12"
}
}
}
},
"request-promise-core": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz",
"integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==",
"requires": {
"lodash": "^4.17.15"
}
},
"request-promise-native": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz",
"integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==",
"requires": {
"request-promise-core": "1.1.3",
"stealthy-require": "^1.1.1",
"tough-cookie": "^2.3.3"
}
},
"safe-buffer": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
"integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
},
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
},
"setimmediate": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
"integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
},
"sshpk": {
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
"integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
"requires": {
"asn1": "~0.2.3",
"assert-plus": "^1.0.0",
"bcrypt-pbkdf": "^1.0.0",
"dashdash": "^1.12.0",
"ecc-jsbn": "~0.1.1",
"getpass": "^0.1.1",
"jsbn": "~0.1.0",
"safer-buffer": "^2.0.2",
"tweetnacl": "~0.14.0"
},
"dependencies": {
"tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
}
}
},
"stealthy-require": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
"integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks="
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"requires": {
"has-flag": "^3.0.0"
}
},
"timers-ext": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz",
"integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==",
"requires": {
"es5-ext": "~0.10.46",
"next-tick": "1"
}
},
"tough-cookie": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
"requires": {
"psl": "^1.1.28",
"punycode": "^2.1.1"
}
},
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
"requires": {
"safe-buffer": "^5.0.1"
}
},
"type": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
"integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
},
"underscore": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz",
"integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ="
},
"uri-js": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
"integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
"requires": {
"punycode": "^2.1.0"
}
},
"uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
},
"verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
"requires": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "^1.2.0"
}
},
"ws": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz",
"integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ=="
}
}
}

View File

@@ -0,0 +1,366 @@
//Command list
const commands = {
'ping': (message, args) =>
{
message.channel.send("pong");
},
'tp': async function (message, args)
{
while ( args.length && args[0].toLowerCase() === namemanager(args[0]) )
{
argv = args.shift();
}
},
'where': (message, args) =>
{
while ( args.length && args[0].toLowerCase() === "is" )
{
argv = args.shift();
}
var username = args.join(' ');
players.findOne({ username: username }, function( err, player ) {
if ( err )
{
console.log( err );
} else if ( !!player && player.lastChunk !== undefined ) {
message.channel.send( '```'+ username +" was last seen at "+ player.lastChunk +'```');
} else {
message.channel.send( '```'+ "No location known for "+ username +'```' );
}
});
},
'who': (message, args) =>
{
while( args.length && args[0].toLowerCase() === "is" )
{
argv = args.shift();
}
var username = args.join(' ');
players.findOne({ username: username }, function( err, player ) {
if ( err )
{
console.log( err );
} else {
if ( !player )
{
message.guild.channel.send('```'+ "Unknown user: "+ username +'```');
} else if ( !player.bio ) {
message.channel.send('```'+ username +" does not have a bio"+ '```');
} else {
message.channel.send('```'+ username +" is "+ player.bio +'```');
}
}
});
},
'bio': (message, args) =>
{
console.log( args );
function updatePlayerBio( playerid, bio )
{
players.update({ id: playerid }, { $set: { bio: bio } }, {}, function( err, numReplaced ) {
if ( err )
{
console.log( err );
} else {
message.channel.send('```'+ username +" is "+ bio +'```');
}
});
}
var username = message.author.username;
players.findOne({ username: username }, function( err, player ) {
if ( err ) {
console.log( err );
}
console.log( player );
if ( player )
{
while ( args[0] === username || args[0] === "is" )
{
args.shift();
}
var bio = args.join(' ');
updatePlayerBio( player.id, bio );
} else {
username = args.shift();
while( args[0] === "is" ) { args.shift(); }
var bio = args.join(' ');
players.findOne({ username, username }, function( err, player ) {
if ( player )
{
updatePlayerBio( player.id, bio )
} else {
message.channel.send('```'+ "Unknown user: "+ username +'```');
}
});
}
});
},
'servers': async function (message, args)
{
var servers = await Servers.getOnline();
if ( !!servers )
{
var longest = 0;
for( var i in servers )
{
if ( servers[i].name.length > longest )
{
longest = servers[i].name.length;
}
}
var serverNameLen = longest + 1;
var listTable = "| Servers"+ strrep(' ', (serverNameLen - 7)) +"| Players\n";
listTable += "|"+ strrep('-', (serverNameLen + 1) ) +"|---------\n";
for ( var i in servers )
{
if ( blacklistServers.includes( servers[i].id ) )
{
continue
}
if ( !showAllServers && !targetServers.includes( servers[i].id ) )
{
continue
}
listTable += "| "+ servers[i].name + strrep(' ', ( serverNameLen - servers[i].name.length )) +"| "+ servers[i].online_players.length +"\n";
}
message.channel.send( '```'+ listTable +'```' );
} else {
message.channel.send("No servers appear to be online, perhaps it's patch day?");
}
},
'players': async function (message, args)
{
var servers = await Servers.getOnline();
var listTable = '';
while ( args.length && ( args[0].toLowerCase() === "online" || args[0].toLowerCase() === "in" || args[0].toLowerCase() === "on" ) )
{
args.shift();
}
var mustMatch = args.join(' ');
for( var i in servers )
{
var pOnline = servers[i].online_players;
if ( pOnline.length <= 0 && !mustMatch )
{
continue
}
if ( blacklistServers.includes( servers[i].id ) )
{
continue;
}
if ( !showAllServers && !targetServers.includes( servers[i].id ) )
{
continue;
}
if ( mustMatch )
{
var re = new RegExp( mustMatch, 'ig' );
if ( !servers[i].name.match( re ) )
{
continue;
}
}
listTable += "| "+ servers[i].name +"\n";
listTable += "|"+ strrep('-', (servers[i].name.length + 1)) +"\n";
if ( pOnline.length <= 0 )
{
listTable += "| No players online\n"
} else {
for( var n in pOnline )
{
listTable += "| "+ pOnline[n].username +"\n";
}
}
listTable += "\n";
}
if ( listTable === '' )
{
if ( mustMatch )
{
message.channel.send('```No server found matching "'+ mustMatch +'"```');
} else {
message.channel.send('```No servers were found online, is it patch day?```');
}
} else {
message.channel.send('```'+ listTable +'```');
}
},
'zone': async function (message, args)
{
switch( args.shift() )
{
case 'history':
var chunkName = args.join(' ');
players.find({}, function( err, playerList ) {
chunkHistory.find({ chunk: chunkName }).sort({ ts: -1 }).exec( function( err, chunklist ) {
if ( err )
{
console.log( err );
} else if ( !chunklist ) {
message.channel.send('```'+ "No history for zone '"+ chunkName +"'"+ '```');
} else {
var response = "| Players who have recently visited zone '"+ chunkName +"'\n";
response += "|--------------------------------"+ strrep( '-', chunkName.length ) +"-\n";
let limit = 15;
if ( chunklist.length < limit ) { limit = chunklist.length; }
for ( var i = 0; i < limit; i++ ) {
ichunk = chunklist[i];
if ( ++i > 10 ) { }
player = playerList.find( x => x.id === ichunk.player );
response += "|["+ moment( ichunk.ts ).format("YYYY/MM/DD HH:mm:ss") +"] "+ player.username +"\n";
};
message.channel.send('```'+ response +'```');
}
});
});
break;
}
},
'player' : async function ( message, args )
{
switch( args.shift() )
{
case 'path':
// Return known history of player movements
var username = args.join(' ');
players.findOne({ username: username }, function( err, player ) {
if ( err )
{
message.channel.send('```'+ "No player data found for "+ username +'```');
} else {
if ( !!player )
{
chunkHistory.find({ player: player.id }).sort({ ts: -1 }).exec( function ( err, chunklist ) {
if ( err )
{
console.log( err );
} else if ( !!chunklist ) {
let limit = 20;
var response = '| Path History for '+ username +"\n";
response += '|------------------'+ strrep('-', username.length+1) +"\n";
if ( chunklist.length < limit ) { limit = chunklist.length; }
for ( var i = 0; i < limit ; i++ ) {
var elem = chunklist[i];
response += "|["+ moment( elem.ts ).format( "YYYY/MM/DD HH:mm:ss" ) +"] "+ elem.chunk +"\n";
}
message.channel.send('```'+ response +'```');
} else {
message.channel.send('```'+ "No path data found for "+ username +'```');
}
});
} else {
message.channel.send('```'+ "No player found for "+ username +'```');
}
}
});
break;
}
},
'load' : async function( message, args )
{
switch( args.shift() )
{
case 'assets':
// First verify the message author has correct permission
if ( message.member.roles.some( x => discordRoles.admin.includes( x.id ) ))
{
console.log( ts()+ "loading assets");
message.channel.send('```'+ "Loading ATT assets, please wait" +'```');
// Add the handler to pendingCommandList
pendingCommandList.push({
"command" : "spawn list",
"module" : "Alta.Console.Commands.SpawnCommandModule",
"handler": function ( response ) {
let countPrefabs = 0;
let responselines = response.split(/\n/)
responselines.forEach( function( line ) {
let found = line.match( /\|([^|]+)\|([^|]+)\|/ );
if ( found )
{
found.shift(); // fulltext of match
let num = new String( found.shift() ).trim() // ID of the prefab
let val = new String( found.shift() ).trim() // The prefab name
if ( num.match( /[0-9]+/ ) )
{
// It's a prefab! Store it
console.log( "found asset: "+ num +" | "+ val )
spawnables.update({ hash: num }, { $set : { hash: num, name: val } }, { upsert: true }, updateHandler );
countPrefabs++;
}
}
});
message.channel.send( '```'+ "Found and stored "+ countPrefabs + " spawnable assets" +'```')
}
});
// Finally, execute the command
try {
botConnection.wrapper.send( "spwan list" );
} catch ( e ) {
console.log( e )
message.channel.send( '```'+ "Cannot send command, is server offline?" +'```')
return;
}
} else {
console.log( "invalid permission to load assets" );
message.channel.send('```'+ "You do not have the required permissions" +'```');
}
break;
}
},
'find' : async function( message, args )
{
switch( args.shift() )
{
case 'asset':
case 'spawnable':
case 'item':
let mustMatch = args.join(' ');
spawnables.find({ name : { $regex: new RegExp( mustMatch, 'gi' ) }}).sort({ name : 1 }).exec( function( err, results ) {
let response = "| Spawnable items matching "+ mustMatch +" ("+ results.length +")\n";
response += "|--------------------------"+ strrep('-', mustMatch.length) + "-----\n";
let itemc = 0;
results.forEach( function( item ) {
let shortsp = '';
if ( item.hash.length < 5 ) { shortsp = ' '; }
response += "| "+ item.hash + shortsp + " | "+ item.name +"\n";
if ( itemc++ > 20 )
{
message.channel.send('```'+ response +'```')
itemc = 0;
response = '';
}
});
message.channel.send( '```'+ response +'```')
})
break;
}
}
}

View File

@@ -0,0 +1,148 @@
"use strict";
exports.namemanager = (name) => {
if(name == undefined) {
name = playername
}
if(name == "") {
name = playername
}
if(name == "poi") {
name = "poiuytrewq4645"
}
if(name == "mansnac") {
name = "mantax"
}
if(name == "ursa") {
name = "Ursidious"
}
/*if(name == "") {
name = ""
}*/
return name
}
exports.splitArgs = (args) => {
let spaceChars = '#s#';
// If an exact match of the space character exists in the string, make it more unique
while( args.indexOf( spaceChars ) > -1 ) { spaceChars += '|'; }
// replace spaces which are inside quotes with the spaceChar placeholder
let mangleargs = args.replace( /[“"]([^“^"]*)[“"]?/g, ( match, cap ) => {
return cap.replace(/\s/g, spaceChars );
});
// split the padded string on actual spaces
let newargs = mangleargs.split( /\ +/ );
// replace the spaceChar in any matching elements with actual spaces
let reg = new RegExp( spaceChars, 'g' );
let argarr = newargs.map( ( x ) => { return x.replace( reg, ' ' ); });
return argarr;
}
exports.teleportmanager = (location) => {
console.log(location)
switch (location) {
//Pope Mountain
case "Mountain":
return [-1259,1000.69,942]
break
//Mystery Roof Place
case "000":
return [0,1000.69,0]
break
//Evinon Empire
case "EE":
return [-174.5,1000.69,-644.5]
break
case "Storage":
return [ -351.975, 209.94, -661.433 ]
break
//Grey Wardens
case "GW":
return [-639.453,1000.69,-82.208]
break
//Sin City
case "SC":
return [-329.748,1000.69,-343.807]
break
//Schmmechee Sentinels
case "SS":
return [-969.479,1000.69,129.304]
break
//Viridium Valour
case "VV":
return [-608.406,1000.69,94.553]
break
//Bounding Foxes
case "BF":
return [-519.507,1000.69,62.1519966]
break
//Town Blacksmith
case "Smithy":
return [-717.2,1000.69,12.7]
break
//Town Hall :V
case "TH":
return [-895.2,1000.69,93.9]
break
//Path between Dust Bowl and Cliffs
case "DB":
return [-581,1000.69,325.3]
break
//Inside Mines
case "Mines":
return [-897.749,1000.69,-160.403]
break
//Mountain outback of camps
case "OM":
return [988.816,1000.69,-736.122]
break
//Mountain outback of the outback mountain of the camps
case "OOM":
return [1019.675,1000.69,-1371.084]
break
//Outside the MP Bridge
case "MP":
return [-1051.641,1000.69,39.53]
break
//Televator Surface TP
case "Televator":
return [-869.021,1000.69,-123.773]
break
//Town Crafting Building
case "Crafting_Building":
return [-799.941,1000.69,103.74]
break
//Skydiving, may die
case "Skydive":
return [-295.713,990,435.593]
break
//
//SHRINES START
//
case "Archery":
return [-835,1000.69,385]
break
case "Blacksmith":
return [-642.704,1000.69,19.363]
break
case "Combat":
return [-1403.3,1000.69,161]
break
case "Woodcutting":
return [-404.3,1000.69,19.6]
break
case "Mining":
return [-825.419,1000.69,-59.953]
break
case "General_Shrine":
return [-1145.647,1000.69,113.898]
break
//
///SHRINES END
//
default:
return null
break
}
}

View File

@@ -0,0 +1,21 @@
module.exports = class Player {
constructor( id, username )
{
this.id = id;
this.username = username;
}
set id( id ) { this._id = id; }
get id() { return _id; }
set username(username) { this._username = username; }
get username() { return this._username; }
set bio(bio) { this._bio = bio; }
get bio() { return _bio; }
set lastLogin(lastLogin) { this._lastLogin = lastLogin; }
get lastLogin() { return _lastLogin; }
}

View File

@@ -0,0 +1,124 @@
const moment = require('moment');
function now()
{
return moment().valueOf();
}
function ts_f()
{
return "["+ moment().format("h:mm:ss A") +"] "
}
// Database helpers
function insertHandler( err, doc )
{
if ( err ) { console.log( err ); }
}
function updateHandler( err, rows )
{
if ( err ) { console.log( err ); }
}
module.exports = class Subscriptions {
constructor( discordChannels, playersDb, killsDb, chunksDb ) {
this.discordChannels = discordChannels;
this.playersDb = playersDb;
this.killsDb = killsDb;
this.chunksDb = chunksDb;
}
PlayerJoined( discord, data )
{
//console.log( data );
this.playersDb.update(
{ id: data.user.id },
{ $set: { username: data.user.username, lastLogin: now() } },
{ upsert: true },
updateHandler
);
discord.channels.get( this.discordChannels["PlayerJoined"] ).send( ts_f() + data.user.username +" joined the server" );
console.log( ts_f() + data.user.username +" joined the server" );
}
PlayerLeft( discord, data )
{
//console.log( data );
discord.channels.get( this.discordChannels["PlayerLeft"] ).send( ts_f() + data.user.username +" left the server" );
console.log( ts_f() + data.user.username +" left the server" );
}
PlayerMovedChunk( discord, data )
{
//console.log( data );
this.playersDb.update({ id: data.player.id }, { $set: { lastChunk: data.newChunk } }, {}, updateHandler );
this.chunksDb.insert({ ts: now(), player: data.player.id, chunk: data.newChunk }, insertHandler );
// also update the zone history for the new chunk
// TODO
console.log( ts_f() + data.player.username +" has moved to chunk "+ data.newChunk );
}
PlayerKilled( discord, data )
{
//console.log( data );
console.log( ts_f() + "player kill" );
if ( data.killerPlayer != undefined )
{
this.killsDb.insert({
ts: now(),
killed : data.killedPlayer.id,
killer: data.killerPlayer.id,
usedTool: data.usedTool,
toolWielder: data.toolWielder
}, insertHandler );
discord.channels.get( this.discordChannels["PlayerKilled"] ).send( ts_f() + data.killerPlayer.username +" has killed "+ data.killedPlayer.username );
discord.channels.get( this.discordChannels["PublicPlayerKilled"] ).send( '```'+ data.killerPlayer.username +" has murdered "+ data.killedPlayer.username +'```' );
} else {
if ( data.toolWielder )
{
this.killsDb.insert({
ts: now(),
killed : data.killedPlayer.id,
usedTool: data.usedTool,
toolWielder: data.toolWielder
}, insertHandler );
let matches = data.toolWielder.match( /[0-9]+\s-\s([^\()]+)/ );
let toolWielder = data.toolWielder;
if ( matches !== null )
{
toolWielder = matches[1];
}
discord.channels.get( this.discordChannels["PlayerKilled"] ).send( ts_f() + data.killedPlayer.username +" was killed by: "+ toolWielder );
discord.channels.get( this.discordChannels["PublicPlayerKilled"] ).send( '```'+ data.killedPlayer.username +" was killed by: "+ toolWielder +'```' );
} else {
this.killsDb.insert({
ts: now(),
killed : data.killedPlayer.id,
}, insertHandler );
discord.channels.get( this.discordChannels["PlayerKilled"] ).send( ts_f() + data.killedPlayer.username +" has suddenly offed themselves" );
discord.channels.get( this.discordChannels["PublicPlayerKilled"] ).send( '```'+ data.killedPlayer.username +" has suddenly offed themselves" +'```');
}
}
}
TradeDeckUsed( discord, data )
{
console.log( ts_f() + "trade deck used" );
console.log( data );
}
CreatureKilled( discord, data )
{
console.log( ts_f() + "creature murdered" );
console.log( data );
}
CreatureSpawned( discord, data )
{
console.log( ts_f() + "creature has spawned" );
console.log( data );
}
}