| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 | 
// custom modulesconst global = require('./global');var io = global.io;function Station (id, data) {	const self = this;	//TODO Add startedAt and timePaused	let playlist = data.playlist;	let currentSong = playlist[0];	let currentSongIndex = data.currentSongIndex;	let paused = data.paused;	let locked = data.locked;	let skipVotes = data.skipVotes;	let users = data.users;	let displayName = data.displayName;	let description = data.description;	let timer;	let nsp = io.of('/' + id);	nsp.on('connection', socket => {		console.log('someone connected');	});	this.skipSong = () => {		if (playlist.length > 0) {			if (timer !== undefined) {				timer.pause();			}			if (currentSongIndex+1 < playlist.length) {				currentSongIndex++;			} else {				currentSongIndex = 0;			}			skipVotes = 0;			currentSong = playlist[currentSongIndex];			timer = new global.Timer(() => {				console.log("Skip!");				self.skipSong();			}, currentSong.duration, paused);			nsp.emit("skippedSong", currentSong);		}	};	this.toggleVoteSkip = userId => {		if (skipVotes.indexOf(userId) === -1) {			skipVotes.push(userId);		} else {			skipVotes = skipVotes.splice(skipVotes.indexOf(userId), 1);		}		//TODO Calculate if enough people voted to skip		nsp.emit("voteSkip", skipVotes);	};	this.retrievePlaylist = () => {		//TODO Use Rethink to get the Playlist for this station	};	this.pause = () => {		if (!paused) {			paused = true;			timer.pause();			nsp.emit("pause");		}	};	this.unpause = () => {		if (paused) {			paused = false;			timer.resume();			nsp.emit("unpause");		}	};	this.isPaused = () => {		return paused;	};	this.getCurrentSong = () => {		return currentSong;	};	this.lock = () => {		if (!locked) {			locked = true;			nsp.emit("lock");		}	};	this.unlock = () => {		if (locked) {			locked = false;			nsp.emit("unlocked");		}	};	this.isLocked = () => {		return locked;	};	this.updateDisplayName = newDisplayName => {		//TODO Update RethinkDB		displayName = newDisplayName;		nsp.emit("updateDisplayName", newDisplayName);	};	this.updateDescription = newDescription => {		//TODO Update RethinkDB		description = newDescription;		nsp.emit("updateDescription", newDescription);	};	this.getId = () => {		return id;	};	this.getDisplayName = () => {		return displayName;	};	this.getDescription = () => {		return description;	};	this.addUser = user => {		users.add(user);		nsp.emit("updateUsers", users);	};	this.removeUser = user => {		users.splice(users.indexOf(user), 1);		nsp.emit("updateUsers", users);	};	this.getUsers = () => {		return users;	};	this.skipSong();}module.exports = {	stations: [],	initStation: (id, data) => {		if (!this.getStation(id)) {			let station = new Station(id, data);			this.stations.push(station);			return station;		}		else {			return false;		}	},	getStation: id => {		let s = null;		this.stations.forEach(function (station) {			if (station.id == id) s = station;		});		return s;	},	getStations: () => {		return this.stations;	},	// creates a brand new station	createStation: data => {		//TODO: add createStation functionality		this.initStation(null, data);	},	// loads a station from the database	loadStation: id => {		//TODO: Get the data from RethinkDB		this.initStation(id, {			playlist: [				{					mid: "3498fd83",					duration: 20000,					title: "Test1"				},				{					mid: "3498fd83434",					duration: 10000,					title: "Test2"				}			],			currentSongIndex: 0,			paused: false,			locked: false,			skipVotes: [],			users: [],			displayName: "",			description: ""		});	}};
 |