import config from "config"; import async from "async"; import { isAdminRequired, isLoginRequired } from "./hooks"; import moduleManager from "../../index"; const DBModule = moduleManager.modules.db; const UtilsModule = moduleManager.modules.utils; const WSModule = moduleManager.modules.ws; const YouTubeModule = moduleManager.modules.youtube; const CacheModule = moduleManager.modules.cache; // CacheModule.runJob("SUB", { // channel: "queue.newSong", // cb: async songId => { // const queueSongModel = await DBModule.runJob("GET_MODEL", { // modelName: "queueSong" // }); // queueSongModel.findOne({ _id: songId }, (err, song) => { // WSModule.runJob("EMIT_TO_ROOM", { // room: "admin.queue", // args: ["event:admin.queueSong.added", song] // }); // }); // } // }); // CacheModule.runJob("SUB", { // channel: "queue.removedSong", // cb: songId => { // WSModule.runJob("EMIT_TO_ROOM", { // room: "admin.queue", // args: ["event:admin.queueSong.removed", songId] // }); // } // }); // CacheModule.runJob("SUB", { // channel: "queue.update", // cb: async songId => { // const queueSongModel = await DBModule.runJob("GET_MODEL", { // modelName: "queueSong" // }); // queueSongModel.findOne({ _id: songId }, (err, song) => { // WSModule.runJob("EMIT_TO_ROOM", { // room: "admin.queue", // args: ["event:admin.queueSong.updated", song] // }); // }); // } // }); export default { // /** // * Returns the length of the queue songs list // * // * @param session // * @param cb // */ // length: isAdminRequired(async function length(session, cb) { // const queueSongModel = await DBModule.runJob("GET_MODEL", { modelName: "queueSong" }, this); // async.waterfall( // [ // next => { // queueSongModel.countDocuments({}, next); // } // ], // async (err, count) => { // if (err) { // err = await UtilsModule.runJob("GET_ERROR", { error: err }, this); // this.log("ERROR", "QUEUE_SONGS_LENGTH", `Failed to get length from queue songs. "${err}"`); // return cb({ status: "failure", message: err }); // } // this.log("SUCCESS", "QUEUE_SONGS_LENGTH", `Got length from queue songs successfully.`); // return cb(count); // } // ); // }), // /** // * Gets a set of queue songs // * // * @param session // * @param set - the set number to return // * @param cb // */ // getSet: isAdminRequired(async function getSet(session, set, cb) { // const queueSongModel = await DBModule.runJob( // "GET_MODEL", // { // modelName: "queueSong" // }, // this // ); // async.waterfall( // [ // next => { // queueSongModel // .find({}) // .skip(15 * (set - 1)) // .limit(15) // .exec(next); // } // ], // async (err, songs) => { // if (err) { // err = await UtilsModule.runJob("GET_ERROR", { error: err }, this); // this.log("ERROR", "QUEUE_SONGS_GET_SET", `Failed to get set from queue songs. "${err}"`); // return cb({ status: "failure", message: err }); // } // this.log("SUCCESS", "QUEUE_SONGS_GET_SET", `Got set from queue songs successfully.`); // return cb(songs); // } // ); // }), // /** // * Gets a song from the Musare song id // * // * @param {object} session - the session object automatically added by the websocket // * @param {string} songId - the Musare song id // * @param {Function} cb // */ // getSongFromMusareId: isAdminRequired(async function getSong(session, songId, cb) { // const queueSongModel = await DBModule.runJob( // "GET_MODEL", // { // modelName: "queueSong" // }, // this // ); // async.waterfall( // [ // next => { // queueSongModel.findOne({ _id: songId }, next); // } // ], // async (err, song) => { // if (err) { // err = await UtilsModule.runJob("GET_ERROR", { error: err }, this); // this.log("ERROR", "QUEUE_SONGS_GET_SONG_FROM_MUSARE_ID", `Failed to get song ${songId}. "${err}"`); // return cb({ status: "failure", message: err }); // } // this.log("SUCCESS", "QUEUE_SONGS_GET_SONG_FROM_MUSARE_ID", `Got song ${songId} successfully.`); // return cb({ status: "success", data: { song } }); // } // ); // }), // /** // * Updates a queuesong // * // * @param {object} session - the session object automatically added by the websocket // * @param {string} songId - the id of the queuesong that gets updated // * @param {object} updatedSong - the object of the updated queueSong // * @param {Function} cb - gets called with the result // */ // update: isAdminRequired(async function update(session, songId, updatedSong, cb) { // const queueSongModel = await DBModule.runJob( // "GET_MODEL", // { // modelName: "queueSong" // }, // this // ); // async.waterfall( // [ // next => { // queueSongModel.findOne({ _id: songId }, next); // }, // (song, next) => { // if (!song) return next("Song not found"); // let updated = false; // const $set = {}; // Object.keys(updatedSong).forEach(prop => { // if (updatedSong[prop] !== song[prop]) $set[prop] = updatedSong[prop]; // }); // updated = true; // if (!updated) return next("No properties changed"); // return queueSongModel.updateOne({ _id: songId }, { $set }, { runValidators: true }, next); // } // ], // async err => { // if (err) { // err = await UtilsModule.runJob("GET_ERROR", { error: err }, this); // this.log( // "ERROR", // "QUEUE_UPDATE", // `Updating queuesong "${songId}" failed for user ${session.userId}. "${err}"` // ); // return cb({ status: "failure", message: err }); // } // CacheModule.runJob("PUB", { channel: "queue.update", value: songId }); // this.log( // "SUCCESS", // "QUEUE_UPDATE", // `User "${session.userId}" successfully update queuesong "${songId}".` // ); // return cb({ // status: "success", // message: "Successfully updated song." // }); // } // ); // }), // /** // * Removes a queuesong // * // * @param {object} session - the session object automatically added by the websocket // * @param {string} songId - the id of the queuesong that gets removed // * @param {Function} cb - gets called with the result // */ // remove: isAdminRequired(async function remove(session, songId, cb) { // const queueSongModel = await DBModule.runJob( // "GET_MODEL", // { // modelName: "queueSong" // }, // this // ); // async.waterfall( // [ // next => { // queueSongModel.deleteOne({ _id: songId }, next); // } // ], // async err => { // if (err) { // err = await UtilsModule.runJob("GET_ERROR", { error: err }, this); // this.log( // "ERROR", // "QUEUE_REMOVE", // `Removing queuesong "${songId}" failed for user ${session.userId}. "${err}"` // ); // return cb({ status: "failure", message: err }); // } // CacheModule.runJob("PUB", { // channel: "queue.removedSong", // value: songId // }); // this.log( // "SUCCESS", // "QUEUE_REMOVE", // `User "${session.userId}" successfully removed queuesong "${songId}".` // ); // return cb({ // status: "success", // message: "Successfully updated song." // }); // } // ); // }), // /** // * Creates a queuesong // * // * @param {object} session - the session object automatically added by the websocket // * @param {string} songId - the id of the song that gets added // * @param {Function} cb - gets called with the result // */ // add: isLoginRequired(async function add(session, songId, cb) { // const requestedAt = Date.now(); // const songModel = await DBModule.runJob("GET_MODEL", { modelName: "song" }, this); // const userModel = await DBModule.runJob("GET_MODEL", { modelName: "user" }, this); // const QueueSongModel = await DBModule.runJob( // "GET_MODEL", // { // modelName: "queueSong" // }, // this // ); // async.waterfall( // [ // next => { // QueueSongModel.findOne({ songId }, next); // }, // (song, next) => { // if (song) return next("This song is already in the queue."); // return songModel.findOne({ songId }, next); // }, // // Get YouTube data from id // (song, next) => { // if (song) return next("This song has already been added."); // // TODO Add err object as first param of callback // return YouTubeModule.runJob("GET_SONG", { songId }, this) // .then(response => { // const { song } = response; // song.duration = -1; // song.artists = []; // song.genres = []; // song.skipDuration = 0; // song.thumbnail = `${config.get("domain")}/assets/notes.png`; // song.explicit = false; // song.requestedBy = session.userId; // song.requestedAt = requestedAt; // next(null, song); // }) // .catch(next); // }, // (newSong, next) => { // const song = new QueueSongModel(newSong); // song.save({ validateBeforeSave: false }, (err, song) => { // if (err) return next(err); // return next(null, song); // }); // }, // (newSong, next) => { // userModel.findOne({ _id: session.userId }, (err, user) => { // if (err) return next(err, newSong); // user.statistics.songsRequested += 1; // return user.save(err => { // if (err) return next(err, newSong); // return next(null, newSong); // }); // }); // } // ], // async (err, newSong) => { // if (err) { // err = await UtilsModule.runJob("GET_ERROR", { error: err }, this); // this.log( // "ERROR", // "QUEUE_ADD", // `Adding queuesong "${songId}" failed for user ${session.userId}. "${err}"` // ); // return cb({ status: "failure", message: err }); // } // CacheModule.runJob("PUB", { // channel: "queue.newSong", // value: newSong._id // }); // this.log("SUCCESS", "QUEUE_ADD", `User "${session.userId}" successfully added queuesong "${songId}".`); // return cb({ // status: "success", // message: "Successfully added that song to the queue" // }); // } // ); // }), // /** // * Adds a set of songs to the queue // * // * @param {object} session - the session object automatically added by the websocket // * @param {string} url - the url of the the YouTube playlist // * @param {boolean} musicOnly - whether to only get music from the playlist // * @param {Function} cb - gets called with the result // */ // addSetToQueue: isLoginRequired(function addSetToQueue(session, url, musicOnly, cb) { // async.waterfall( // [ // next => { // YouTubeModule.runJob( // "GET_PLAYLIST", // { // url, // musicOnly // }, // this // ) // .then(res => { // next(null, res.songs); // }) // .catch(next); // }, // (songIds, next) => { // let successful = 0; // let failed = 0; // let alreadyInQueue = 0; // let alreadyAdded = 0; // if (songIds.length === 0) next(); // async.eachLimit( // songIds, // 1, // (songId, next) => { // WSModule.runJob( // "RUN_ACTION2", // { // session, // namespace: "queueSongs", // action: "add", // args: [songId] // }, // this // ) // .then(res => { // if (res.status === "success") successful += 1; // else failed += 1; // if (res.message === "This song is already in the queue.") alreadyInQueue += 1; // if (res.message === "This song has already been added.") alreadyAdded += 1; // }) // .catch(() => { // failed += 1; // }) // .finally(() => { // next(); // }); // }, // () => { // next(null, { successful, failed, alreadyInQueue, alreadyAdded }); // } // ); // } // ], // async (err, response) => { // if (err) { // err = await UtilsModule.runJob("GET_ERROR", { error: err }, this); // this.log( // "ERROR", // "QUEUE_IMPORT", // `Importing a YouTube playlist to the queue failed for user "${session.userId}". "${err}"` // ); // return cb({ status: "failure", message: err }); // } // this.log( // "SUCCESS", // "QUEUE_IMPORT", // `Successfully imported a YouTube playlist to the queue for user "${session.userId}".` // ); // return cb({ // status: "success", // message: `Playlist is done importing. ${response.successful} were added succesfully, ${response.failed} failed (${response.alreadyInQueue} were already in queue, ${response.alreadyAdded} were already added)` // }); // } // ); // }) };