2024-08-04 22:30:33 +00:00
|
|
|
const CampaignUser = require("../models/CampaignUser");
|
|
|
|
const User = require("../models/User");
|
|
|
|
const FilterUser = require('../utils/filters');
|
|
|
|
|
|
|
|
let sessions = {};
|
|
|
|
|
2024-08-05 14:55:37 +00:00
|
|
|
async function GetOfflinePlayers(campaign){
|
|
|
|
let players = await CampaignUser.find({campaign}).populate('user').exec();
|
|
|
|
let finalPlayers = [];
|
|
|
|
// TODO: Filter
|
|
|
|
players.forEach(player => finalPlayers.push(FilterUser(player)));
|
|
|
|
|
|
|
|
return finalPlayers;
|
|
|
|
}
|
|
|
|
|
|
|
|
function SetPlayerProperty(campaign, player_id, key, value){
|
|
|
|
objIndex = sessions[campaign].players.findIndex(player => player.user._id.toString() == player_id);
|
|
|
|
if(objIndex != -1){
|
|
|
|
sessions[campaign].players[objIndex][key] = value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-08-04 22:30:33 +00:00
|
|
|
module.exports = io => {
|
|
|
|
io.on('connection', (socket) => {
|
|
|
|
socket.on('enter', (user, campaignId) => {
|
|
|
|
User.findOne(user).then(user => {
|
|
|
|
if(user){
|
|
|
|
socket.user = user;
|
2024-08-05 14:55:37 +00:00
|
|
|
CampaignUser.findOne({campaign: campaignId, user}).then(async campaignUser => {
|
2024-08-04 22:30:33 +00:00
|
|
|
if(campaignUser){
|
|
|
|
socket.join(campaignId);
|
2024-08-10 20:20:16 +00:00
|
|
|
socket.campaignUser = campaignUser;
|
2024-08-04 22:30:33 +00:00
|
|
|
socket.campaign = campaignId;
|
|
|
|
|
2024-08-10 20:20:16 +00:00
|
|
|
if(!sessions[campaignId]){ sessions[campaignId] = {
|
|
|
|
players: await GetOfflinePlayers(campaignId),
|
|
|
|
chat: []
|
|
|
|
};
|
|
|
|
} else {
|
|
|
|
newPlayers = await GetOfflinePlayers(campaignId);
|
|
|
|
newPlayers.forEach(player => {
|
|
|
|
for(let i = 0; i < sessions[campaignId].players.length; i++){
|
|
|
|
if(player._id == sessions[campaignId].players[i]._id) return;
|
|
|
|
}
|
|
|
|
sessions[campaignId].players.push(FilterUser(player));
|
|
|
|
})
|
|
|
|
}
|
2024-08-05 14:55:37 +00:00
|
|
|
|
|
|
|
|
2024-10-16 20:13:56 +00:00
|
|
|
// console.log(socket.user.username + " ha entrado!");
|
2024-08-05 14:55:37 +00:00
|
|
|
SetPlayerProperty(campaignId, socket.user._id, "online", true);
|
2024-09-25 23:15:53 +00:00
|
|
|
// io.to(socket.campaign).emit('update-players', sessions[campaignId].players)
|
|
|
|
socket.emit('init-info', {players: sessions[campaignId].players})
|
2024-08-04 22:30:33 +00:00
|
|
|
|
2024-08-05 14:55:37 +00:00
|
|
|
// console.log(JSON.stringify(sessions[campaignId], null, 4));
|
2024-08-04 22:30:33 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
})
|
|
|
|
});
|
|
|
|
|
|
|
|
socket.on('exit', () => {
|
2024-08-05 14:55:37 +00:00
|
|
|
SetPlayerProperty(socket.campaign, socket.user._id, "online", false);
|
|
|
|
io.to(socket.campaign).emit('update-players', sessions[socket.campaign].players)
|
2024-08-04 22:30:33 +00:00
|
|
|
socket.leave(socket.campaign)
|
|
|
|
|
|
|
|
console.log(socket.user.username + " ha salido!")
|
|
|
|
});
|
2024-08-06 21:02:18 +00:00
|
|
|
|
|
|
|
socket.on('message', (data) => {
|
|
|
|
io.to(socket.campaign).emit('message', data);
|
|
|
|
})
|
2024-08-10 20:20:16 +00:00
|
|
|
|
|
|
|
socket.on('send_map', (data) => {
|
|
|
|
if(!socket.campaignUser) return;
|
|
|
|
if(socket.campaignUser.is_dm){
|
|
|
|
socket.to(socket.campaign).emit('change_map', data);
|
|
|
|
}
|
|
|
|
})
|
2024-08-04 22:30:33 +00:00
|
|
|
});
|
|
|
|
}
|