const { v4: uuidv4 } = require('uuid'); const asyncHandeler = require("express-async-handler"); const { response } = require("express"); const login = require("../middlewares/UserLoginMiddleware"); const path = require('path'); const User = require('../models/UserModel'); const Team = require('../models/TeamModel'); const { getRoomLeaderBoardR1R2, getRound4Leaderboard } = require('../helpers/LeaderBoardPreFetch'); const { distributeQs } = require('./QuestionController'); const { getRoundLeaderboard } = require('../helpers/LeaderBoardPreFetch'); const Leaderboard = require("../models/LeaderboardModel"); const CollaborativeLeaderboardModel = require("../models/CollaborativeLeaderboardModel"); const UserQuestionModel = require("../models/UserQuestionModel"); const Room = require("../models/RoomModel"); exports.get = asyncHandeler(async (req, res) => { // console.log(await getRoomLeaderBoardR1(req.user.Team)); res.send(await getRoomLeaderBoardR1(req.user.Team)); return; }); exports.post = asyncHandeler(async (req, res) => { //distribution of questions here //let data=await insertLogsToMongo(); // await setQues() //setAllTLeaderBoardFalse(); //start timer of setcollaborative timer let date = new Date(); // await setQues(); // scheduleCollaborativeRound(date); await setQues2(); res.json(await getRound4Leaderboard()); }); async function createLeaderboardDocuments() { try { // Retrieve all teams from the Team collection const teams = await Team.find(); // Iterate over each team and create a leaderboard document for (const team of teams) { // Check if a leaderboard document already exists for the team const existingLeaderboard = await Leaderboard.findOne({ TeamID: team._id }); if (!existingLeaderboard) { // Create a new leaderboard document for the team const leaderboard = new Leaderboard({ TeamID: team._id, TeamName: team.TeamName, Points: 0, Time: new Date(), RoomID: team.RoomID, Round: 0, Questions: { Solved: [], Unsolved: [] } }); // Save the leaderboard document await leaderboard.save(); console.log(`Created leaderboard document for team: ${team.TeamName}`); } } console.log("Leaderboard documents created for all teams."); } catch (error) { console.error("Error creating leaderboard documents:", error); } } async function checkTeamOK() { try { const teams = await Team.find(); let count = 0; let teamcount = 0; let response = []; let team1 = []; for (const team of teams) { let flag = true; for (i in team.Members) { let user = await User.findOne({ _id: team.Members[i] }); if (!user) { // console.log("Team " + team.TeamName + "has a member who is not a user") count++; response.push(team.Members[i]); if (flag) { let teamLeader = await User.findOne({ TeamID: team._id, Role: "Leader" }); if (teamLeader) { console.log("Team Leader:" + teamLeader.Name); } team1.push(team.TeamName); teamcount++; flag = false; } } } } console.log("Total teams with missing registrations:" + teamcount) console.log("Total users with missing registrations:" + count); return team1; } catch (err) { console.log(err); } } const fs = require("fs"); const QuestionsModel = require('../models/QuestionsModel'); const { scheduleCollaborativeRound } = require('../timers/RoundThreeCollaborator'); async function insertLogsToMongo() { try { const logData = fs.readFileSync("logs.txt", "utf8"); let insert = false; const logEntries = logData.split("\n"); let finalData = []; let tempObj = {}; for (const row of logEntries) { // console.log(row); if (row.includes("{")) { insert = true; } else if (row.includes("}")) { insert = false; finalData.push(tempObj); tempObj = {}; } const rowData = row.split(": "); if (insert) { if ( rowData[0].includes("Name") || rowData[0].includes("Email") || rowData[0].includes("RollNumber") || rowData[0].includes("PhoneNumber") || rowData[0].includes("TeamID") || rowData[0].includes("Branch") || rowData[0].includes("Year") || rowData[0].includes("DiscordID") || rowData[0].includes("Password") || rowData[0].includes("Role") || rowData[0].includes("Timestamp") || rowData[0].includes("_id") ) { tempObj[rowData[0]] = rowData[1]; } } } let response = []; let users = await checkTeamOK(); users = extractIdsFromArray(users) let data = await convertDataArray(cleanData(finalData)); for (let i in users) { let team = users[i].toString(); // console.log(team); let flag = false; for (let j in data) { if (data[j] !== undefined) { //console.log(data[j].TeamID); if (data[j]._id === team) { // console.log("found"+data[j].TeamID); response.push(data[j]); flag = true; } } } if (!flag) { console.log("Team not found:" + team); } } console.log(response.length); for (k in response) { await registerUser(response[k]); } return response; } catch (err) { console.error("Error parsing data:", err); } } function cleanData(dataArray) { const cleanedData = []; dataArray.forEach((item) => { const cleanedItem = {}; for (const key in item) { let value = item[key]; value = value.trim().replace(/^'new ObjectId\("(.*)"\)'$|^'(.*)',$/, '$1$2'); // Remove single quotes and optional trailing comma cleanedItem[key.trim()] = value; } cleanedData.push(cleanedItem); }); return cleanedData; } function convertDataArray(dataArray) { const convertedArray = dataArray.map((item) => { let response = {}; let goodObj = true; if (item.Name) { response.Name = item.Name.trim() } else goodObj = false; if (item.Email) { response.Email = item.Email.trim() } else goodObj = false; if (item.RollNumber) response.RollNumber = item.RollNumber.replace(',', '').trim() else goodObj = false; if (item.PhoneNumber) response.PhoneNumber = item.PhoneNumber.trim() else goodObj = false; if (item.TeamID) response.TeamID = item.TeamID.replace('new ObjectId("', '').replace('"),', '').trim() else goodObj = false; if (item.Branch) response.Branch = item.Branch.trim() else goodObj = false; if (item.Year) response.Year = item.Year.trim() else goodObj = false; if (item.DiscordID) response.DiscordID = item.DiscordID.trim() else goodObj = false; if (item.Password) response.Password = item.Password.trim() else goodObj = false; if (item.Role) response.Role = item.Role.trim() else goodObj = false; if (item.Timestamp) response.Timestamp = item.Timestamp.replace(',', '').trim() else goodObj = false; if (item._id) response._id = item._id.replace('new ObjectId("', '').replace('"),', '').trim() else goodObj = false; if (goodObj) return response; }); for (i in convertedArray) { if (convertedArray[i] === undefined) { convertedArray.splice(i, 1); } } return convertedArray; } function extractIdsFromArray(dataArray) { const idArray = dataArray.map((item) => item.toString()); return idArray; } async function registerUser(user) { let team = await Team.findOne({ _id: user.TeamID }); let usern = new User({ Name: user.Name, Email: user.Email, Password: team.Password, RollNumber: user.RollNumber, PhoneNumber: user.PhoneNumber, Branch: user.Branch, Year: user.Year, DiscordID: user.DiscordID, Role: "Member", TeamID: team._id }); try { await usern.save(); usern = await User.findOne({ Email: user.Email }); let index = team.Members.indexOf(user._id); team.Members.splice(index, 1); team.Members.push(usern._id); //remove old user id await team.save(); console.log("User saved:" + usern.Name); } catch (err) { console.log(err); } console.log(team); } async function setQues() { try { let ques = await QuestionsModel.find({ Round: 3 }) for (i in ques) { let q = ques[i] q.assigned = true; console.log(q) await q.save() } } catch (err) { console.log(err) } //set assigned false to all round 2 questions } async function setAllTLeaderBoardFalse() { let leaderboard = await Leaderboard.find({ Round: 2 }); for (i in leaderboard) { let board = leaderboard[i]; board.Enabled = false; await board.save(); } } async function setQues2() { let board = await Leaderboard.find({ Round: 4 }); for (let i in board) { let questions=board[i].Questions.Unsolved; let count=1; for(let j in questions){ let q=questions[j]; let ques=await QuestionsModel.findOne({_id:q}); let t1q=new UserQuestionModel({ QuestionID:ques._id, QuestionNumber:ques.QuestionNumber, Question:ques.Question, Description:ques.Description, HintAddress:count, Answer:ques.Answer, Points:ques.Points, Round:ques.Round, TeamID:board[i].TeamID, Hint:ques.Hint, num:count }) await t1q.save(); } } } async function setTopUser() { let room=await Room.findOne({Round:3}); let TopTeam=new CollaborativeLeaderboardModel({ TeamID1:"5f9f1f1b1c9d440000b0b0a1", TeamID2:"5f9f1f1b1c9d440000b0b0a2", Questions:{ Solved:[], Unsolved:[] }, Points:241543903, TeamName:"david", Round:3, RoomID:room._id }) TopTeam.save(); }