File size: 3,338 Bytes
df72131
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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();
        }
    }
}