From 44771fc4afe50faec88604e374acfeabc82a685f Mon Sep 17 00:00:00 2001 From: BinarySandia04 Date: Mon, 5 Aug 2024 00:30:33 +0200 Subject: [PATCH] Started socketio things --- client/package-lock.json | 90 +++++++- client/package.json | 1 + client/public/img/logo-splash.png | Bin 10135 -> 55461 bytes client/src/assets/base.css | 4 + client/src/services/Api.js | 4 +- client/src/services/BackendURL.js | 4 +- client/src/services/Dragonroll.js | 39 +++- client/src/services/Sound.js | 15 ++ client/src/services/Windows.js | 6 +- client/src/views/partials/CampaignEntry.vue | 11 +- client/src/views/partials/EditUserPartial.vue | 4 +- client/src/views/partials/PlayerEntry.vue | 88 +++++++ client/src/views/partials/PlayerList.vue | 29 +++ client/src/views/partials/WindowHandle.vue | 14 +- client/src/views/windows/LoginWindow.vue | 4 +- client/src/views/windows/RegisterWindow.vue | 4 +- .../campaigns/CampaignPreviewWindow.vue | 67 ++++-- server/io/campaign.js | 46 ++++ server/package-lock.json | 217 +++++++++++++++++- server/package.json | 3 +- server/routes/campaign.js | 9 + server/routes/user.js | 3 +- server/server.js | 18 +- server/utils/filters.js | 6 + 24 files changed, 626 insertions(+), 60 deletions(-) create mode 100644 client/src/services/Sound.js create mode 100644 client/src/views/partials/PlayerEntry.vue create mode 100644 client/src/views/partials/PlayerList.vue create mode 100644 server/io/campaign.js create mode 100644 server/utils/filters.js diff --git a/client/package-lock.json b/client/package-lock.json index 0c204a5c..456aba1c 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -19,6 +19,7 @@ "marked-katex-extension": "^4.0.1", "mitt": "^3.0.1", "prismjs": "^1.29.0", + "socket.io-client": "^4.7.5", "three": "^0.164.1", "vue": "^3.3.4", "vue-draggable": "^2.0.6", @@ -1024,6 +1025,12 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, "node_modules/@soda/friendly-errors-webpack-plugin": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", @@ -4887,7 +4894,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -5301,6 +5307,49 @@ "once": "^1.4.0" } }, + "node_modules/engine.io-client": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.4.tgz", + "integrity": "sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.0.0" + } + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.17.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", @@ -8371,8 +8420,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multicast-dns": { "version": "7.2.5", @@ -11003,6 +11051,34 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/socket.io-client": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz", + "integrity": "sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -12704,6 +12780,14 @@ "node": ">=12" } }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/xss": { "version": "1.0.14", "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", diff --git a/client/package.json b/client/package.json index c556c992..c72d6de9 100644 --- a/client/package.json +++ b/client/package.json @@ -20,6 +20,7 @@ "marked-katex-extension": "^4.0.1", "mitt": "^3.0.1", "prismjs": "^1.29.0", + "socket.io-client": "^4.7.5", "three": "^0.164.1", "vue": "^3.3.4", "vue-draggable": "^2.0.6", diff --git a/client/public/img/logo-splash.png b/client/public/img/logo-splash.png index 8a7c4cec1fcefc3a7ea9d530ec51a5dd2f1251a3..07f45c6b895e04dd8a2960ed39218a55648f8fe3 100644 GIT binary patch literal 55461 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 literal 10135 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 i{jWmh|1*uWeIEaivjzh { return axios.create({ - baseURL: BackendURL, + baseURL: backendUrl, headers: { 'Authorization': "Bearer " + localStorage.getItem('token'), "Access-Control-Allow-Origin": "*", diff --git a/client/src/services/BackendURL.js b/client/src/services/BackendURL.js index fcf36dde..ddb5e927 100644 --- a/client/src/services/BackendURL.js +++ b/client/src/services/BackendURL.js @@ -6,4 +6,6 @@ if (import.meta.env.PROD) { } -export default backendUrl; \ No newline at end of file +export { + backendUrl +}; \ No newline at end of file diff --git a/client/src/services/Dragonroll.js b/client/src/services/Dragonroll.js index 0522fe68..2df98a0b 100644 --- a/client/src/services/Dragonroll.js +++ b/client/src/services/Dragonroll.js @@ -1,12 +1,43 @@ +import { ref } from 'vue'; import { ClearAll, ClearWindow, CreateWindow } from './Windows'; +import { io } from "socket.io-client"; +import Api from '@/services/Api' +import { backendUrl } from './BackendURL'; +import { GetUser } from './User'; + +export const socket = io(backendUrl) + +let currentCampaign = null; + +const players = ref([]); +let GetPlayerList = () => { return players; }; + +socket.on('update-players', data => { + players.value = []; + Object.keys(data).forEach((key) => { + players.value.push(data[key]); + }); +}) function DisplayCampaign(data){ ClearAll(); - CreateWindow('campaign_preview', { - title: data.name - }); + CreateWindow('campaign_preview', {campaign: data}); +} + +function ConnectToCampaign(campaign){ + currentCampaign = campaign; + socket.emit('enter', GetUser(), currentCampaign._id); +} + +function Disconnect(){ + socket.emit('exit'); + currentCampaign = null; } export { - DisplayCampaign + DisplayCampaign, + ConnectToCampaign, + Disconnect, + + GetPlayerList, }; \ No newline at end of file diff --git a/client/src/services/Sound.js b/client/src/services/Sound.js new file mode 100644 index 00000000..f2f02f1d --- /dev/null +++ b/client/src/services/Sound.js @@ -0,0 +1,15 @@ +function AddSound(element){ + let soundClicks = element.getElementsByClassName("sound-click"); + + for (let i = 0; i < soundClicks.length; i++) { + soundClicks[i].addEventListener("click", async (event) => { + const audio = new Audio('/sounds/snap.wav'); + audio.type = "audio/wav" + audio.play(); + }) + } +} + +export { + AddSound +}; \ No newline at end of file diff --git a/client/src/services/Windows.js b/client/src/services/Windows.js index 061b903d..fc0d40ac 100644 --- a/client/src/services/Windows.js +++ b/client/src/services/Windows.js @@ -1,4 +1,5 @@ import { reactive, ref } from 'vue' +import { Disconnect } from './Dragonroll'; const windows = { login: ref([]), @@ -61,8 +62,9 @@ const defValues = { id: 'campaign_preview', title: "Campaign Preview", back: () => { + Disconnect(); ClearWindow('campaign_preview'); - CreateWindow('campaign_list') + CreateWindow('campaign_list'); } } } @@ -167,8 +169,6 @@ function ResetPosition(id, pos){ function CreateWindow(type, data = {}){ let finalData = {...{type}, ...defValues[type], ...data} - console.log(finalData); - if(windows[finalData.type] === undefined){ console.error("Window type " + finalData.type + " is not defined!"); return; diff --git a/client/src/views/partials/CampaignEntry.vue b/client/src/views/partials/CampaignEntry.vue index dc33ad87..f57a5b24 100644 --- a/client/src/views/partials/CampaignEntry.vue +++ b/client/src/views/partials/CampaignEntry.vue @@ -4,6 +4,8 @@ import { onMounted, ref } from 'vue'; import Api from '@/services/Api' import { DisplayCampaign } from '@/services/Dragonroll' +import { AddSound } from '../../services/Sound'; +import { ConnectToCampaign } from '../../services/Dragonroll'; const props = defineProps(['data']); const data = props.data; @@ -11,21 +13,24 @@ const data = props.data; const title = ref(""); const last_session = ref(""); +const container = ref(null); + onMounted(() => { - console.log(data); title.value = data.name; last_session.value = new Date(data.last_opened).toISOString().slice(0, 10); - console.log(title); + + AddSound(container.value) }); function ViewCampaign(){ + ConnectToCampaign(data); DisplayCampaign(data); } - diff --git a/server/io/campaign.js b/server/io/campaign.js new file mode 100644 index 00000000..50772173 --- /dev/null +++ b/server/io/campaign.js @@ -0,0 +1,46 @@ +const CampaignUser = require("../models/CampaignUser"); +const User = require("../models/User"); +const FilterUser = require('../utils/filters'); + +let sessions = {}; + +module.exports = io => { + io.on('connection', (socket) => { + socket.on('enter', (user, campaignId) => { + User.findOne(user).then(user => { + if(user){ + socket.user = user; + CampaignUser.findOne({campaign: campaignId, user}).then(campaignUser => { + if(campaignUser){ + socket.join(campaignId); + socket.campaign = campaignId; + + if(!sessions[campaignId]) sessions[campaignId] = { + players: {} + }; + + sessions[campaignId].players[socket.user._id] = { + online: true, + is_dm: campaignUser.is_dm, + data: FilterUser(socket.user) + }; + + console.log(socket.user.username + " ha entrado!"); + io.to(socket.campaign).emit('update-players', sessions[campaignId].players) + + console.log(JSON.stringify(sessions, null, 4)); + } + }); + } + }) + }); + + socket.on('exit', () => { + io.to(socket.campaign).emit('update-players', sessions[campaignId].players) + socket.leave(socket.campaign) + sessions[socket.campaign].players[socket.user._id].online = false; + + console.log(socket.user.username + " ha salido!") + }); + }); +} \ No newline at end of file diff --git a/server/package-lock.json b/server/package-lock.json index ed5bc615..082684a4 100755 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -30,7 +30,8 @@ "passport": "^0.6.0", "passport-jwt": "^4.0.1", "simplemde-vue": "^0.4.4", - "slugify": "^1.6.5" + "slugify": "^1.6.5", + "socket.io": "^4.7.5" }, "devDependencies": { "nodemon": "^2.0.22" @@ -1336,6 +1337,12 @@ "node": ">=16.0.0" } }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, "node_modules/@types/body-parser": { "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", @@ -1365,6 +1372,21 @@ "@types/node": "*" } }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "license": "MIT" + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/express": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", @@ -1582,6 +1604,15 @@ ], "license": "MIT" }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "license": "MIT", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, "node_modules/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -2043,6 +2074,59 @@ "once": "^1.4.0" } }, + "node_modules/engine.io": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", + "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", + "license": "MIT", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", @@ -3519,6 +3603,116 @@ "npm": ">= 3.0.0" } }, + "node_modules/socket.io": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "license": "MIT", + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-adapter/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, "node_modules/socks": { "version": "2.8.3", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", @@ -3770,6 +3964,27 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/server/package.json b/server/package.json index ea9fee04..9512441c 100755 --- a/server/package.json +++ b/server/package.json @@ -31,7 +31,8 @@ "passport": "^0.6.0", "passport-jwt": "^4.0.1", "simplemde-vue": "^0.4.4", - "slugify": "^1.6.5" + "slugify": "^1.6.5", + "socket.io": "^4.7.5" }, "devDependencies": { "nodemon": "^2.0.22" diff --git a/server/routes/campaign.js b/server/routes/campaign.js index cc720497..5112629e 100644 --- a/server/routes/campaign.js +++ b/server/routes/campaign.js @@ -53,4 +53,13 @@ router.get('/list', passport.authenticate('jwt', {session: false}), (req, res) = }).catch((err) => res.json({status: "error", msg: "internal"})); }); +router.get('/players', passport.authenticate('jwt', {session: false}), (req, res) => { + Campaign.findById(req.query.campaign).then((campaign) => { + CampaignUser.find({campaign}).populate('user').then((data) => { + res.json(data); + return; + }).catch((err) => res.json({status: "error", msg: "internal"})); + }).catch((err) => res.json({status: "error", msg: "not-found"})); +}); + module.exports = router; \ No newline at end of file diff --git a/server/routes/user.js b/server/routes/user.js index ebd3443b..00ff4ea6 100755 --- a/server/routes/user.js +++ b/server/routes/user.js @@ -116,6 +116,7 @@ router.post('/login', rateLimitMiddleware, (req, res) => { }); }); +/* router.get('/test', passport.authenticate('jwt', {session: false}), (req, res) => { const token = req.headers.authorization.slice(7); const payload = jwtDecode(token); @@ -126,10 +127,10 @@ router.get('/test', passport.authenticate('jwt', {session: false}), (req, res) = }); return; }); +*/ router.post("/upload-avatar", upload.single("image"), passport.authenticate('jwt', {session: false}), (req, res) => { const imageName = req.file.filename; - console.log(req.body); User.updateOne(req.user, {image: imageName}).then(() => { res.json({ diff --git a/server/server.js b/server/server.js index 2f09c920..12ed1bbc 100755 --- a/server/server.js +++ b/server/server.js @@ -1,4 +1,6 @@ const express = require('express'); +const http = require('http') +const socketIo = require('socket.io'); const app = express(); const cookieParser = require('cookie-parser'); @@ -10,6 +12,13 @@ const morgan = require('morgan'); const cors = require('cors'); const passport = require('passport'); +const server = http.createServer(app); +const io = socketIo(server, { + cors: { + origin: '*', + } +}); + const PORT = 8081; const config = JSON.parse(fs.readFileSync("config.json")); @@ -56,9 +65,12 @@ app.use(cors()); app.use('/user', require('./routes/user')); app.use('/campaign', require('./routes/campaign')); + +app.use('/public', express.static('uploads')); + +require('./io/campaign')(io); + // app.use('/users', require('./routes/users')); -app.listen(PORT, () => { +server.listen(PORT, () => { console.log("Dragonroll backend started"); }); - -app.use('/public', express.static('uploads')); \ No newline at end of file diff --git a/server/utils/filters.js b/server/utils/filters.js new file mode 100644 index 00000000..87c41cc3 --- /dev/null +++ b/server/utils/filters.js @@ -0,0 +1,6 @@ +module.exports = user => { + let filterUser = JSON.parse(JSON.stringify(user)); + delete filterUser['password']; + delete filterUser['email']; + return filterUser; +} \ No newline at end of file