const RoomModel = require("../models/RoomModel"); const CollaborativeLeaderboardModel = require("../models/CollaborativeLeaderboardModel"); const { getRoundLeaderboard } = require("../helpers/LeaderBoardPreFetch"); const TeamModel = require("../models/TeamModel"); const User = require("../models/UserModel"); module.exports.scheduleCollaborativeRound = function scheduleCollaborativeRound(targetTime) { const currentTime = new Date().getTime(); const delay = targetTime - currentTime; if (delay <= 0) { // Target time has already passed, execute the function immediately callback(); } else { setTimeout(callback, delay); } } async function callback() { try { console.log('Function to setup Collaborative Rounds Started!'); let leaderboard = await getRoundLeaderboard(2); let top4Objects = getTop4Objects(leaderboard); let pairs = formRandomPairs(top4Objects); for (i in pairs) { let pair = new CollaborativeLeaderboardModel({ TeamID1: pairs[i].Team1.TeamID, TeamID2: pairs[i].Team2.TeamID, TeamName: pairs[i].Team1.TeamName + "-" + pairs[i].Team2.TeamName, Points: 0, Points1: pairs[i].Team1.Points, Points2: pairs[i].Team2.Points, Round: 3, Questions: { Solved: [], Unsolved: [] } }); let room = await RoomModel.findOne({ Round: 3 }); if (room) { pair.RoomID = room._id; let Team1 = await TeamModel.findOne({ _id: pairs[i].Team1.TeamID }); let Team2 = await TeamModel.findOne({ _id: pairs[i].Team2.TeamID }); await all_member_room_assign(Team1, room._id); await all_member_room_assign(Team2, room._id); Team1.RoomID = room._id; Team2.RoomID = room._id; await Team1.save(); await Team2.save(); } await pair.save(); } console.log('Function to setup Collaborative Rounds Ended!'); } catch (error) { console.log(error); } } function getTop4Objects(inputArray) { const newArray = []; for (let subArray of inputArray) { if (subArray.length < 4) newArray.push(...subArray); else { const top4Objects = subArray.slice(0, 4); newArray.push(...top4Objects); } } return newArray; } function formRandomPairs(jsonArray) { const shuffledArray = [...jsonArray]; const pairs = []; for (let i = shuffledArray.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [shuffledArray[i], shuffledArray[j]] = [shuffledArray[j], shuffledArray[i]]; } for (let i = 0; i < 12; i += 2) { const team1 = shuffledArray[i]; const team2 = shuffledArray[i + 1] || shuffledArray[0]; pairs.push({ Team1: team1, Team2: team2 }); } return pairs; } async function all_member_room_assign(team, RoomID) { let members = team.Members; for (let i in members) { let member = await User.findOne({ _id: members[i] }); if (member) { member.RoomID = RoomID; await member.save(); } } }