d-zone
Version:
An ambient life simulation driven by the user activity within a Discord server
87 lines (77 loc) • 2.77 kB
JavaScript
'use strict';
var EventEmitter = require('events').EventEmitter;
var inherits = require('inherits');
var Actor = require('./actor.js');
module.exports = Users;
inherits(Users, EventEmitter);
function Users(game,world) {
this.setMaxListeners(0);
this.game = game;
this.game.once('destroy', this.destroy.bind(this));
this.game.users = this;
this.world = world;
this.actors = {};
this.messageQueue = {};
}
Users.prototype.addActor = function(data) {
var grid = this.world.randomEmptyGrid();
var actor = new Actor({
x: +grid.split(':')[0], y: +grid.split(':')[1], z: 0,
uid: data.uid,
username: data.username,
roleColor: data.roleColor,
maxListeners: this._maxListeners+3
});
this.actors[actor.uid] = actor;
actor.addToGame(this.game);
actor.updatePresence(data.status);
};
Users.prototype.updateActor = function(data) {
let actor = this.actors[data.uid]
if(actor) {
if(data.delete) {
actor.updatePresence('offline')
this.removeActor(actor)
} else {
actor.updatePresence(data.status)
}
} else {
this.addActor(data)
}
}
Users.prototype.removeActor = function(actor) {
delete this.actors[actor.uid];
actor.remove();
};
Users.prototype.queueMessage = function(data) {
if(!data.message || !this.actors[data.uid]) return;
if(!this.messageQueue[data.channel]) this.messageQueue[data.channel] = { busy: false, messages: [] };
this.messageQueue[data.channel].messages.push({
uid: data.uid,
message: data.message
});
this.onMessageAdded(data.channel);
};
Users.prototype.onMessageAdded = function(channel) {
if(this.messageQueue[channel].busy || this.messageQueue[channel].messages.length < 1) return;
this.messageQueue[channel].busy = true;
var message = this.messageQueue[channel].messages[0];
var self = this;
this.actors[message.uid].startTalking(message.message, channel, function() {
self.messageQueue[channel].messages.shift();
self.messageQueue[channel].busy = false;
self.onMessageAdded(channel);
});
this.emit('message', { user: this.actors[message.uid], channel: channel });
};
Users.prototype.getActorAtPosition = function(x,y,z) { // For debugging
for(var aKey in this.actors) { if(!this.actors.hasOwnProperty(aKey)) continue;
if(this.actors[aKey].position.x == x
&& this.actors[aKey].position.y == y
&& this.actors[aKey].position.z == z) return this.actors[aKey];
}
};
Users.prototype.destroy = function() {
this.actors = {};
this.messageQueue = {};
};