Spaces:
Running
Running
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(); | |
} | |
} | |
} |