From 679cc8d7f48b4180d2fc283e0ba1e91dc1012887 Mon Sep 17 00:00:00 2001 From: BinarySandia04 Date: Sun, 15 Sep 2024 17:25:50 +0200 Subject: [PATCH] jdskjda --- client/package-lock.json | 188 +----------------- client/package.json | 5 +- client/src/assets/main.css | 21 ++ client/src/main.js | 25 +-- client/src/services/Campaign.js | 52 +++++ client/src/services/Chat.js | 36 ++++ client/src/services/ContextMenu.js | 6 + client/src/services/Data.js | 41 ++++ client/src/services/Dragonroll.js | 96 +-------- client/src/services/Game.js | 3 + client/src/services/Map.js | 8 + client/src/services/Socket.js | 8 + client/src/services/Windows.js | 2 +- client/src/views/managers/GameManager.vue | 2 +- client/src/views/managers/WindowManager.vue | 16 +- client/src/views/partials/CampaignEntry.vue | 3 +- client/src/views/partials/ChatComponent.vue | 1 - client/src/views/partials/ConceptList.vue | 30 ++- client/src/views/partials/IconSelector.vue | 2 +- client/src/views/partials/MarkdownEditor.vue | 94 +++++++++ client/src/views/partials/Tabs.vue | 101 ++++++++++ client/src/views/partials/Tags.vue | 87 ++++++++ .../windows/campaigns/CampaignListWindow.vue | 4 +- .../campaigns/CampaignPreviewWindow.vue | 5 +- .../src/views/windows/game/DatabaseWindow.vue | 61 ++---- .../views/windows/game/dnd-5e/ItemSheet.vue | 64 +++++- 26 files changed, 602 insertions(+), 359 deletions(-) create mode 100644 client/src/services/Campaign.js create mode 100644 client/src/services/Chat.js create mode 100644 client/src/services/Data.js create mode 100644 client/src/services/Socket.js create mode 100644 client/src/views/partials/MarkdownEditor.vue create mode 100644 client/src/views/partials/Tabs.vue create mode 100644 client/src/views/partials/Tags.vue diff --git a/client/package-lock.json b/client/package-lock.json index c8c99b4e..93652fbd 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -17,7 +17,7 @@ "jquery": "^3.7.1", "jquery-ui": "^1.13.3", "jquery-ui-dist": "^1.13.3", - "marked": "^9.1.0", + "marked": "^9.1.6", "marked-katex-extension": "^4.0.1", "mitt": "^3.0.1", "prismjs": "^1.29.0", @@ -25,8 +25,7 @@ "three": "^0.164.1", "vue": "^3.3.4", "vue-draggable": "^2.0.6", - "vue-router": "^4.2.4", - "vue-simplemde": "^2.1.1" + "vue-router": "^4.2.4" }, "devDependencies": { "@vitejs/plugin-vue": "^4.3.4", @@ -271,82 +270,6 @@ "integrity": "sha512-GcIY79elgB+azP74j8vqkiXz8xLFfIzbQJdlwOPisgbKT00tviJQuEghOXSMVxJ00HoYJbGswr4kcllUc4xCcg==", "deprecated": "Potential XSS vulnerability patched in v6.0.0." }, - "node_modules/@codemirror/autocomplete": { - "version": "6.9.2", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.9.2.tgz", - "integrity": "sha512-suItGf7PhtfgQMCd8ofYzycdsAHDBB8BkNrmyxeLvptW7yNT6zGT6ZzwhAfmB94TUyAAStrHjaDGC4/foenF2A==", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0" - }, - "peerDependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@codemirror/commands": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.3.0.tgz", - "integrity": "sha512-tFfcxRIlOWiQDFhjBSWJ10MxcvbCIsRr6V64SgrcaY0MwNk32cUOcCuNlWo8VjV4qRQCgNgUAnIeo0svkk4R5Q==", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.2.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.1.0" - } - }, - "node_modules/@codemirror/language": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.9.1.tgz", - "integrity": "sha512-lWRP3Y9IUdOms6DXuBpoWwjkR7yRmnS0hKYCbSfPz9v6Em1A1UCRujAkDiCrdYfs1Z0Eu4dGtwovNPStIfkgNA==", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.1.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0", - "style-mod": "^4.0.0" - } - }, - "node_modules/@codemirror/lint": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.4.2.tgz", - "integrity": "sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "crelt": "^1.0.5" - } - }, - "node_modules/@codemirror/search": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.4.tgz", - "integrity": "sha512-YoTrvjv9e8EbPs58opjZKyJ3ewFrVSUzQ/4WXlULQLSDDr1nGPJ67mMXFNNVYwdFhybzhrzrtqgHmtpJwIF+8g==", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "crelt": "^1.0.5" - } - }, - "node_modules/@codemirror/state": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.2.1.tgz", - "integrity": "sha512-RupHSZ8+OjNT38zU9fKH2sv+Dnlr8Eb8sl4NOnnqz95mCFTZUaiRP8Xv5MeeaG0px2b8Bnfe7YGwCV3nsBhbuw==" - }, - "node_modules/@codemirror/view": { - "version": "6.21.3", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.21.3.tgz", - "integrity": "sha512-8l1aSQ6MygzL4Nx7GVYhucSXvW4jQd0F6Zm3v9Dg+6nZEfwzJVqi4C2zHfDljID+73gsQrWp9TgHc81xU15O4A==", - "dependencies": { - "@codemirror/state": "^6.1.4", - "style-mod": "^4.1.0", - "w3c-keyname": "^2.2.4" - } - }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -915,27 +838,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@lezer/common": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.1.0.tgz", - "integrity": "sha512-XPIN3cYDXsoJI/oDWoR2tD++juVrhgIago9xyKhZ7IhGlzdDM9QgC8D8saKNCz5pindGcznFr2HBSsEQSWnSjw==" - }, - "node_modules/@lezer/highlight": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.1.6.tgz", - "integrity": "sha512-cmSJYa2us+r3SePpRCjN5ymCqCPv+zyXmDl0ciWtVaNiORT/MxM7ZgOMQZADD0o51qOaOg24qc/zBViOIwAjJg==", - "dependencies": { - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@lezer/lr": { - "version": "1.3.13", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.3.13.tgz", - "integrity": "sha512-RLAbau/4uSzKgIKj96mI5WUtG1qtiR0Frn0Ei9zhPj8YOkHM+1Bb8SgdVvmR/aWJCFIzjo2KFnDiRZ75Xf5NdQ==", - "dependencies": { - "@lezer/common": "^1.0.0" - } - }, "node_modules/@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -3407,28 +3309,6 @@ "node": ">=6" } }, - "node_modules/codemirror": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz", - "integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/commands": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/lint": "^6.0.0", - "@codemirror/search": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - } - }, - "node_modules/codemirror-spell-checker": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/codemirror-spell-checker/-/codemirror-spell-checker-1.1.2.tgz", - "integrity": "sha512-2Tl6n0v+GJRsC9K3MLCdLaMOmvWL0uukajNJseorZJsslaxZyZMgENocPU8R0DyoTAiKsyqiemSOZo7kjGV0LQ==", - "dependencies": { - "typo-js": "*" - } - }, "node_modules/collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -3854,11 +3734,6 @@ "node": ">=8" } }, - "node_modules/crelt": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==" - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -8055,9 +7930,10 @@ } }, "node_modules/marked": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.0.tgz", - "integrity": "sha512-VZjm0PM5DMv7WodqOUps3g6Q7dmxs9YGiFUZ7a2majzQTTCgX+6S6NAJHPvOhgFBzYz8s4QZKWWMfZKFmsfOgA==", + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", + "integrity": "sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==", + "license": "MIT", "bin": { "marked": "bin/marked.js" }, @@ -10860,16 +10736,6 @@ "dev": true, "license": "ISC" }, - "node_modules/simplemde": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/simplemde/-/simplemde-1.11.2.tgz", - "integrity": "sha512-AUXuHJ/tEEDEcN/MTitHIw3AuBcheizJt7SVwtyn00B0UK5RKZ3GB+JndmRcJ5wfYGCIL0O2yJm/uz0sJOFSLg==", - "dependencies": { - "codemirror": "*", - "codemirror-spell-checker": "*", - "marked": "*" - } - }, "node_modules/sirv": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", @@ -11449,11 +11315,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/style-mod": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.0.tgz", - "integrity": "sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==" - }, "node_modules/stylehacks": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", @@ -11828,11 +11689,6 @@ "node": ">= 0.6" } }, - "node_modules/typo-js": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/typo-js/-/typo-js-1.2.3.tgz", - "integrity": "sha512-67Hyl94beZX8gmTap7IDPrG5hy2cHftgsCAcGvE1tzuxGT+kRB+zSBin0wIMwysYw8RUCBCvv9UfQl8TNM75dA==" - }, "node_modules/uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", @@ -12207,26 +12063,6 @@ "vue": "^3.2.0" } }, - "node_modules/vue-simplemde": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/vue-simplemde/-/vue-simplemde-2.1.1.tgz", - "integrity": "sha512-UBjjdcTVlq7MrmeeKyzGVFEdsqarsqVxL/QGuCCfV1jGs7ve2wJ3pTENM6FEvaSURFnDJhIR6uUkPrxHg6S7HQ==", - "dependencies": { - "marked": "^3.0.8", - "simplemde": "*" - } - }, - "node_modules/vue-simplemde/node_modules/marked": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.8.tgz", - "integrity": "sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==", - "bin": { - "marked": "bin/marked" - }, - "engines": { - "node": ">= 12" - } - }, "node_modules/vue-style-loader": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", @@ -12245,11 +12081,6 @@ "dev": true, "license": "MIT" }, - "node_modules/w3c-keyname": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", - "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" - }, "node_modules/watchpack": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", @@ -12803,9 +12634,10 @@ } }, "node_modules/xss": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", - "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.15.tgz", + "integrity": "sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==", + "license": "MIT", "dependencies": { "commander": "^2.20.3", "cssfilter": "0.0.10" diff --git a/client/package.json b/client/package.json index 1d49981f..694c7cff 100644 --- a/client/package.json +++ b/client/package.json @@ -18,7 +18,7 @@ "jquery": "^3.7.1", "jquery-ui": "^1.13.3", "jquery-ui-dist": "^1.13.3", - "marked": "^9.1.0", + "marked": "^9.1.6", "marked-katex-extension": "^4.0.1", "mitt": "^3.0.1", "prismjs": "^1.29.0", @@ -26,8 +26,7 @@ "three": "^0.164.1", "vue": "^3.3.4", "vue-draggable": "^2.0.6", - "vue-router": "^4.2.4", - "vue-simplemde": "^2.1.1" + "vue-router": "^4.2.4" }, "devDependencies": { "@vitejs/plugin-vue": "^4.3.4", diff --git a/client/src/assets/main.css b/client/src/assets/main.css index 05f634d2..54b62a5c 100644 --- a/client/src/assets/main.css +++ b/client/src/assets/main.css @@ -118,11 +118,23 @@ input[type=text], input[type=password], input[type=email] { border: solid 1px var(--color-border); } + +textarea { + background-color: var(--color-background-softer); + padding: 12px; + color: var(--color-text); + border: none; +} + input[type=text]:focus, input[type=password]:focus, input[type=email]:focus { outline: none; background-color: var(--color-background-softest); } +textarea:focus { + outline: none; +} + button { margin-top: 5px; margin-bottom: 5px; @@ -178,11 +190,16 @@ button:active { margin-left: auto; } +.centered { + text-align: center; +} .window-wrapper { display: flex; align-items: center; border: solid 1px var(--color-border); + + /* opacity: 0; */ user-select: none; -webkit-box-shadow: 0px 0px 10px -2px rgba(0,0,0,0.75); @@ -199,6 +216,10 @@ button:active { font-size: 32px; } +.document b { + font-weight: bold; +} + .text-icon { height: 18px; width: 18px; diff --git a/client/src/main.js b/client/src/main.js index bec050a6..c4cc9a32 100644 --- a/client/src/main.js +++ b/client/src/main.js @@ -1,35 +1,14 @@ import './assets/main.css' import './assets/prism.css' -import { createApp, reactive } from 'vue' +import { createApp, defineComponent, reactive } from 'vue' import App from './App.vue' import router from './router' import mitt from 'mitt'; const emitter = mitt(); -import VueMarkdownEditor from '@kangc/v-md-editor'; -import '@kangc/v-md-editor/lib/style/base-editor.css'; -import vuepressTheme from '@kangc/v-md-editor/lib/theme/vuepress.js'; -import '@kangc/v-md-editor/lib/theme/style/vuepress.css'; -import esEs from '@kangc/v-md-editor/lib/lang/es-ES' - - -import Prism from 'prismjs'; - -import 'prismjs/components/prism-python'; -import 'prismjs/components/prism-javascript'; -import 'prismjs/components/prism-java'; -import 'prismjs/components/prism-c'; -import 'prismjs/components/prism-cpp'; -import 'prismjs/components/prism-csharp'; -import 'prismjs/components/prism-ruby'; -import 'prismjs/components/prism-bash'; - -VueMarkdownEditor.lang.use('es-Es', esEs); -VueMarkdownEditor.use(vuepressTheme, { Prism }); - -const app = createApp(App).use(VueMarkdownEditor); +const app = createApp(App); app.config.globalProperties.emitter = emitter app.config.globalProperties.rollWindows = { login: reactive([]), diff --git a/client/src/services/Campaign.js b/client/src/services/Campaign.js new file mode 100644 index 00000000..f771aa7a --- /dev/null +++ b/client/src/services/Campaign.js @@ -0,0 +1,52 @@ +import { ref } from 'vue'; + +import { ExitGame } from "./Game"; +import { socket } from "./Socket"; +import { GetUser } from "./User"; +import { chat } from './Chat'; +import { ClearAll, CreateWindow } from './Windows'; + + +let _currentCampaign = null; +let _currentPlayer = null; +const _players = ref([]); + +function ConnectToCampaign(campaign){ + _currentCampaign = campaign; + chat.value = []; + + socket.emit('enter', GetUser(), _currentCampaign._id); +} + +function Disconnect(){ + socket.emit('exit'); + ExitGame(); + + _currentCampaign = null; + _currentPlayer = null; + chat.value = []; +} + + +function DisplayCampaign(data = currentCampaign){ + ClearAll(); + CreateWindow('campaign_preview', {campaign: data}); +} + +socket.on('update-players', data => { + _players.value = []; + Object.keys(data).forEach((key) => { + _players.value.push(data[key]); + if(GetUser()._id == data[key].user._id) _currentPlayer = data[key]; + }); +}) + +export { + _currentCampaign, + _currentPlayer, + _players, + + ConnectToCampaign, + DisplayCampaign, + Disconnect +} \ No newline at end of file diff --git a/client/src/services/Chat.js b/client/src/services/Chat.js new file mode 100644 index 00000000..78be0c5e --- /dev/null +++ b/client/src/services/Chat.js @@ -0,0 +1,36 @@ +import { ref } from 'vue'; +import { socket } from "./Socket"; + +let chatMessageId = 0; +const chat = ref([]); + +socket.on('message', (data) => { + // Add new chat message, ? + if(chat.value.length > 0) if(chat.value[chat.value.length - 1].author == data.author){ + chat.value[chat.value.length - 1].chunkSize += 1; + chat.value[chat.value.length - 1].chunks.push({ + id: chat.value[chat.value.length - 1].chunkSize, + type: data.type ? data.type : 'text', + content: data.content + }); + return; + } + + chatMessageId += 1; + chat.value.push({ + id: chatMessageId, + author: data.author, + chunkSize: 1, + chunks: [ + { + id: 1, + type: data.type ? data.type : 'text', + content: data.content + } + ] + }); +}); + +export { + chat +} \ No newline at end of file diff --git a/client/src/services/ContextMenu.js b/client/src/services/ContextMenu.js index 45fa8986..9e8785b7 100644 --- a/client/src/services/ContextMenu.js +++ b/client/src/services/ContextMenu.js @@ -32,6 +32,12 @@ function PopulateContext(val){ spanInfo.innerHTML = element.name; contextMenuElement.appendChild(spanInfo); + if(element.icon){ + let iconContextElement = document.createElement('img'); + iconContextElement.src = element.icon; + contextMenuElement.appendChild(iconContextElement); + } + if(element.context){ let iconContextElement = document.createElement('img'); iconContextElement.src = arrowIcon; diff --git a/client/src/services/Data.js b/client/src/services/Data.js new file mode 100644 index 00000000..9801d585 --- /dev/null +++ b/client/src/services/Data.js @@ -0,0 +1,41 @@ +import Api from '@/services/Api' +import { GetCampaign } from "./Dragonroll"; +import { socket } from './Socket'; +import { reactive } from 'vue'; + +let data = reactive({}); + +function InitData(){ + data.value = { + concepts: [], + }; +} + +function FetchConcepts(){ + Api().get('/concept/list?campaign=' + GetCampaign()._id).then(response => { + data.value.concepts = response.data.data; + }).catch((err) => console.log(err)); +} + +function FetchData(){ + FetchConcepts(); +} + + +socket.on('update-concepts', () => { + FetchConcepts(); +}); + +let GetConcepts = () => data.value.concepts; +let GetConcept = (id) => Api().get('/concept/get?campaign=' + GetCampaign()._id + "&id=" + id) + + +export { + InitData, + FetchData, + + FetchConcepts, + + GetConcepts, + GetConcept, +} \ No newline at end of file diff --git a/client/src/services/Dragonroll.js b/client/src/services/Dragonroll.js index 16d8df08..d9111745 100644 --- a/client/src/services/Dragonroll.js +++ b/client/src/services/Dragonroll.js @@ -1,12 +1,7 @@ -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'; -import { ExitGame } from './Game'; import { GetModule } from './Modules'; -import { GetMap, LoadMap, UpdateMapList } from './Map'; +import { socket } from './Socket'; +import { _currentCampaign, _currentPlayer, _players } from './Campaign'; +import { chat } from './Chat'; let emitter; @@ -20,62 +15,12 @@ function DisplayToast(color, text, duration = 1000){ emitter.emit("toast", {color, text, duration}); } -const socket = io(backendUrl) +let GetPlayerList = () => _players; +let GetCampaign = () => _currentCampaign; +let GetClient = () => _currentPlayer; -let currentCampaign = null; -let currentPlayer = null; - -const players = ref([]); -let GetPlayerList = () => { return players; }; -let GetCampaign = () => { return currentCampaign; }; -let GetClient = () => { return currentPlayer; }; - -let chatMessageId = 0; -const chat = ref([]); let GetChatRef = () => chat; -socket.on('change_map', data => { - console.log("ChangeMap") - UpdateMapList().then(() => { - LoadMap(GetMap(data.id)); - }); -}) - -socket.on('update-players', data => { - players.value = []; - Object.keys(data).forEach((key) => { - players.value.push(data[key]); - if(GetUser()._id == data[key].user._id) currentPlayer = data[key]; - }); -}) - -socket.on('message', (data) => { - // Add new chat message, ? - if(chat.value.length > 0) if(chat.value[chat.value.length - 1].author == data.author){ - chat.value[chat.value.length - 1].chunkSize += 1; - chat.value[chat.value.length - 1].chunks.push({ - id: chat.value[chat.value.length - 1].chunkSize, - type: data.type ? data.type : 'text', - content: data.content - }); - return; - } - - chatMessageId += 1; - chat.value.push({ - id: chatMessageId, - author: data.author, - chunkSize: 1, - chunks: [ - { - id: 1, - type: data.type ? data.type : 'text', - content: data.content - } - ] - }); -}); - function _SendMap(id){ socket.emit('send_map', {id}); } @@ -84,30 +29,10 @@ function SendMessage(data){ socket.emit('message', data); } -function DisplayCampaign(data = currentCampaign){ - ClearAll(); - CreateWindow('campaign_preview', {campaign: data}); -} - -function ConnectToCampaign(campaign){ - currentCampaign = campaign; - chat.value = []; - - socket.emit('enter', GetUser(), currentCampaign._id); -} - -function Disconnect(){ - socket.emit('exit'); - ExitGame(); - - currentCampaign = null; - currentPlayer = null; - chat.value = []; -} function GetPlayer(player_campaign){ - let index = players.value.findIndex((p) => {return p._id == player_campaign}); - if(index != -1) return players.value[index]; + let index = _players.value.findIndex((p) => {return p._id == player_campaign}); + if(index != -1) return _players.value[index]; } function GetSystem(){ @@ -115,16 +40,11 @@ function GetSystem(){ } export { - socket, SetEmitter, GetEmitter, DisplayToast, - DisplayCampaign, - ConnectToCampaign, - Disconnect, - GetCampaign, GetClient, GetPlayerList, diff --git a/client/src/services/Game.js b/client/src/services/Game.js index 2965947e..291dd474 100644 --- a/client/src/services/Game.js +++ b/client/src/services/Game.js @@ -1,10 +1,13 @@ import { ref } from "vue"; +import { FetchData, InitData } from "./Data"; const inGameRef = ref(false); let InGameRef = () => inGameRef; function LaunchGame(){ inGameRef.value = true; + InitData(); + FetchData(); } function ExitGame(){ diff --git a/client/src/services/Map.js b/client/src/services/Map.js index 8f78a6fd..505193e2 100644 --- a/client/src/services/Map.js +++ b/client/src/services/Map.js @@ -3,6 +3,7 @@ import { initCustomFormatter, ref, toRaw } from 'vue'; import Api from '@/services/Api' import { _SendMap, GetCampaign } from './Dragonroll'; import { backendUrl } from './BackendURL'; +import { socket } from './Socket'; function dataURLtoFile(dataurl, filename) { var arr = dataurl.split(","), @@ -292,6 +293,13 @@ function ChangeBackgroundColor(color){ SaveMap(currentMapId.value); } + +socket.on('change_map', data => { + UpdateMapList().then(() => { + LoadMap(GetMap(data.id)); + }); +}) + export { toMapX, toMapY, diff --git a/client/src/services/Socket.js b/client/src/services/Socket.js new file mode 100644 index 00000000..3711c213 --- /dev/null +++ b/client/src/services/Socket.js @@ -0,0 +1,8 @@ +import { io } from "socket.io-client"; + +import { backendUrl } from './BackendURL'; +const socket = io(backendUrl); + +export { + socket +} \ No newline at end of file diff --git a/client/src/services/Windows.js b/client/src/services/Windows.js index 705a716c..52166b12 100644 --- a/client/src/services/Windows.js +++ b/client/src/services/Windows.js @@ -1,5 +1,5 @@ import { reactive, ref } from 'vue' -import { Disconnect } from './Dragonroll'; +import { Disconnect } from './Campaign'; const windows = ref([]) diff --git a/client/src/views/managers/GameManager.vue b/client/src/views/managers/GameManager.vue index 37bcff65..5c5b6eca 100644 --- a/client/src/views/managers/GameManager.vue +++ b/client/src/views/managers/GameManager.vue @@ -4,7 +4,7 @@ import { InGameRef } from '../../services/Game'; import IconButton from '../partials/game/IconButton.vue'; import { AddSound } from '../../services/Sound'; import TileMap from './TileMap.vue'; -import { DisplayCampaign, GetCampaign, GetClient } from '../../services/Dragonroll'; +import { GetCampaign, GetClient } from '../../services/Dragonroll'; import { ClearAll, ClearWindow, CreateWindow } from '../../services/Windows'; const game = ref(null); diff --git a/client/src/views/managers/WindowManager.vue b/client/src/views/managers/WindowManager.vue index 582c6130..c0a776bf 100644 --- a/client/src/views/managers/WindowManager.vue +++ b/client/src/views/managers/WindowManager.vue @@ -1,5 +1,5 @@ + + + + \ No newline at end of file diff --git a/client/src/views/partials/Tabs.vue b/client/src/views/partials/Tabs.vue new file mode 100644 index 00000000..c1d979be --- /dev/null +++ b/client/src/views/partials/Tabs.vue @@ -0,0 +1,101 @@ + + + + + + + + \ No newline at end of file diff --git a/client/src/views/partials/Tags.vue b/client/src/views/partials/Tags.vue new file mode 100644 index 00000000..915774b7 --- /dev/null +++ b/client/src/views/partials/Tags.vue @@ -0,0 +1,87 @@ + + + + + \ No newline at end of file diff --git a/client/src/views/windows/campaigns/CampaignListWindow.vue b/client/src/views/windows/campaigns/CampaignListWindow.vue index 6ce1ce7f..6c2598fb 100644 --- a/client/src/views/windows/campaigns/CampaignListWindow.vue +++ b/client/src/views/windows/campaigns/CampaignListWindow.vue @@ -59,7 +59,7 @@ function RefreshCampaigns(){
-

Your campaigns

+

Your campaigns

@@ -67,7 +67,7 @@ function RefreshCampaigns(){
-

Other campaigns

+

Other campaigns

diff --git a/client/src/views/windows/campaigns/CampaignPreviewWindow.vue b/client/src/views/windows/campaigns/CampaignPreviewWindow.vue index 25a65ea7..fd6aedfa 100644 --- a/client/src/views/windows/campaigns/CampaignPreviewWindow.vue +++ b/client/src/views/windows/campaigns/CampaignPreviewWindow.vue @@ -4,7 +4,7 @@ import { SetupHandle, SetSize, SetPosition, ResetPosition } from '@/services/Win import WindowHandle from '@/views/partials/WindowHandle.vue'; import PlayerList from '../../partials/PlayerList.vue'; -import { Disconnect, DisplayToast, GetCampaign, GetClient } from '../../../services/Dragonroll'; +import { DisplayToast, GetClient } from '../../../services/Dragonroll'; import CampaignBookList from '../../partials/books/CampaignBookList.vue'; import { ClearAll, ClearWindow, CreateWindow, SetMinSize, SetResizable } from '../../../services/Windows'; import { LaunchGame } from '../../../services/Game'; @@ -13,6 +13,7 @@ import ChatComponent from '../../partials/ChatComponent.vue'; import GameSystem from '@/views/partials/GameSystem.vue' import { GetModule } from '../../../services/Modules'; import { AddTooltip } from '../../../services/Tooltip'; +import { Disconnect } from '../../../services/Campaign'; const handle = ref(null); @@ -75,7 +76,7 @@ function Exit(){
-

Players

+

Players

diff --git a/client/src/views/windows/game/DatabaseWindow.vue b/client/src/views/windows/game/DatabaseWindow.vue index fed98dd3..39c040b9 100644 --- a/client/src/views/windows/game/DatabaseWindow.vue +++ b/client/src/views/windows/game/DatabaseWindow.vue @@ -1,12 +1,12 @@