| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 | 'use strict';const coreClass = require("../core");const async = require("async");let tasks = {};module.exports = class extends coreClass {	initialize() {		return new Promise((resolve, reject) => {			this.setStage(1);						this.cache = this.moduleManager.modules["cache"];			this.stations = this.moduleManager.modules["stations"];			this.notifications = this.moduleManager.modules["notifications"];			this.utils = this.moduleManager.modules["utils"];			//this.createTask("testTask", testTask, 5000, true);			this.createTask("stationSkipTask", this.checkStationSkipTask, 1000 * 60 * 30);			this.createTask("sessionClearTask", this.sessionClearingTask, 1000 * 60 * 60 * 6);			resolve();		});	}	async createTask(name, fn, timeout, paused = false) {		try { await this._validateHook(); } catch { return; }		tasks[name] = {			name,			fn,			timeout,			lastRan: 0,			timer: null		};		if (!paused) this.handleTask(tasks[name]);	}	async pauseTask(name) {		try { await this._validateHook(); } catch { return; }		if (tasks[name].timer) tasks[name].timer.pause();	}	async resumeTask(name) {		try { await this._validateHook(); } catch { return; }		tasks[name].timer.resume();	}	async handleTask(task) {		try { await this._validateHook(); } catch { return; }		if (task.timer) task.timer.pause();		task.fn(() => {			task.lastRan = Date.now();			task.timer = new utils.Timer(() => {				this.handleTask(task);			}, task.timeout, false);		});	}	/*testTask(callback) {		//Stuff		console.log("Starting task");		setTimeout(() => {			console.log("Callback");			callback();		}, 10000);	}*/	async checkStationSkipTask(callback) {		try { await this._validateHook(); } catch { return; }		this.logger.info("TASK_STATIONS_SKIP_CHECK", `Checking for stations to be skipped.`, false);		async.waterfall([			(next) => {				this.cache.hgetall('stations', next);			},			(stations, next) => {				async.each(stations, (station, next2) => {					if (station.paused || !station.currentSong || !station.currentSong.title) return next2();					const timeElapsed = Date.now() - station.startedAt - station.timePaused;					if (timeElapsed <= station.currentSong.duration) return next2();					else {						this.logger.error("TASK_STATIONS_SKIP_CHECK", `Skipping ${station._id} as it should have skipped already.`);						this.stations.initializeStation(station._id);						next2();					}				}, () => {					next();				});			}		], () => {			callback();		});	}	async sessionClearingTask(callback) {		try { await this._validateHook(); } catch { return; }			this.logger.info("TASK_SESSION_CLEAR", `Checking for sessions to be cleared.`, false);		async.waterfall([			(next) => {				this.cache.hgetall('sessions', next);			},			(sessions, next) => {				if (!sessions) return next();				let keys = Object.keys(sessions);				async.each(keys, (sessionId, next2) => {					let session = sessions[sessionId];					if (session && session.refreshDate && (Date.now() - session.refreshDate) < (60 * 60 * 24 * 30 * 1000)) return next2();					if (!session) {						this.logger.info("TASK_SESSION_CLEAR", 'Removing an empty session.');						this.cache.hdel('sessions', sessionId, () => {							next2();						});					} else if (!session.refreshDate) {						session.refreshDate = Date.now();						this.cache.hset('sessions', sessionId, session, () => {							next2();						});					} else if ((Date.now() - session.refreshDate) > (60 * 60 * 24 * 30 * 1000)) {						this.utils.socketsFromSessionId(session.sessionId, (sockets) => {							if (sockets.length > 0) {								session.refreshDate = Date.now();								this.cache.hset('sessions', sessionId, session, () => {									next2()								});							} else {								this.logger.info("TASK_SESSION_CLEAR", `Removing session ${sessionId} for user ${session.userId} since inactive for 30 days and not currently in use.`);								this.cache.hdel('sessions', session.sessionId, () => {									next2();								});							}						});					} else {						this.logger.error("TASK_SESSION_CLEAR", "This should never log.");						next2();					}				}, () => {					next();				});			}		], () => {			callback();		});	}}
 |