mirror of
https://github.com/anatolykopyl/vk-bingo.git
synced 2026-03-26 21:04:26 +00:00
End event
This commit is contained in:
@@ -3,7 +3,6 @@ import session from 'express-session';
|
|||||||
import mongodb from 'mongodb';
|
import mongodb from 'mongodb';
|
||||||
import MongoStore from 'connect-mongo';
|
import MongoStore from 'connect-mongo';
|
||||||
import cors from 'cors';
|
import cors from 'cors';
|
||||||
import crypto from 'crypto'
|
|
||||||
import { createNanoEvents } from 'nanoevents';
|
import { createNanoEvents } from 'nanoevents';
|
||||||
|
|
||||||
import "dotenv/config";
|
import "dotenv/config";
|
||||||
@@ -117,7 +116,7 @@ const client = new MongoClient(process.env.URI, { useUnifiedTopology: true });
|
|||||||
emitter.emit('connection', Object.keys(players))
|
emitter.emit('connection', Object.keys(players))
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pass && pass.toLowerCase() === process.env.PASSWORD) {
|
if (pass && pass.toLowerCase().trim() === process.env.PASSWORD) {
|
||||||
req.session.loggedIn = true;
|
req.session.loggedIn = true;
|
||||||
return res.status(200).send('Logged in');
|
return res.status(200).send('Logged in');
|
||||||
} else {
|
} else {
|
||||||
@@ -254,12 +253,15 @@ const client = new MongoClient(process.env.URI, { useUnifiedTopology: true });
|
|||||||
}
|
}
|
||||||
|
|
||||||
players = {}
|
players = {}
|
||||||
|
answers = 0
|
||||||
|
score = {}
|
||||||
|
|
||||||
|
emitter.emit("end")
|
||||||
|
|
||||||
return res.status(200).send();
|
return res.status(200).send();
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get('/api/stream', async (req, res) => {
|
app.get('/api/stream', async (req, res) => {
|
||||||
const id = crypto.randomUUID()
|
|
||||||
|
|
||||||
res.set({
|
res.set({
|
||||||
'Access-Control-Allow-Origin': '*',
|
'Access-Control-Allow-Origin': '*',
|
||||||
'Cache-Control': 'no-cache',
|
'Cache-Control': 'no-cache',
|
||||||
@@ -298,11 +300,11 @@ const client = new MongoClient(process.env.URI, { useUnifiedTopology: true });
|
|||||||
oldCard = { ...card }
|
oldCard = { ...card }
|
||||||
card = await drawCard()
|
card = await drawCard()
|
||||||
|
|
||||||
emitter.emit(`allDone-${id}`);
|
emitter.emit("allDone");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const unbindAllDone = emitter.on(`allDone-${id}`, () => {
|
emitter.on("allDone", () => {
|
||||||
const data = {
|
const data = {
|
||||||
correctAnswer: oldCard.name,
|
correctAnswer: oldCard.name,
|
||||||
score
|
score
|
||||||
@@ -310,6 +312,11 @@ const client = new MongoClient(process.env.URI, { useUnifiedTopology: true });
|
|||||||
res.write(`data: ${JSON.stringify(data)}\nevent: reveal\n\n`);
|
res.write(`data: ${JSON.stringify(data)}\nevent: reveal\n\n`);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
emitter.on("end", () => {
|
||||||
|
res.write(`event: end\n\n`);
|
||||||
|
res.end();
|
||||||
|
})
|
||||||
|
|
||||||
res.on('close', () => {
|
res.on('close', () => {
|
||||||
res.end();
|
res.end();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -17,5 +17,9 @@ export default () => {
|
|||||||
evtSource.addEventListener('reveal', (event) => handler(JSON.parse(event.data)))
|
evtSource.addEventListener('reveal', (event) => handler(JSON.parse(event.data)))
|
||||||
}
|
}
|
||||||
|
|
||||||
return { addAnswerListener, addUserlistListener, addRevealListener }
|
function addEndListener(handler) {
|
||||||
|
evtSource.addEventListener('end', (event) => handler(JSON.parse(event.data)))
|
||||||
|
}
|
||||||
|
|
||||||
|
return { addAnswerListener, addUserlistListener, addRevealListener, addEndListener }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
<template>
|
<template>
|
||||||
<h1 class="header">Флекспатруль мультиплеер</h1>
|
<h1 class="header">
|
||||||
|
Флекспатруль мультиплеер
|
||||||
|
</h1>
|
||||||
|
|
||||||
<div class="main">
|
<div class="main">
|
||||||
<div
|
<div
|
||||||
class="card"
|
v-if="card"
|
||||||
v-if="card"
|
class="card"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
class="meme"
|
class="meme"
|
||||||
@@ -12,7 +14,10 @@
|
|||||||
>
|
>
|
||||||
<h2>Кто скинул этот мем?</h2>
|
<h2>Кто скинул этот мем?</h2>
|
||||||
<div class="interactive">
|
<div class="interactive">
|
||||||
<transition name="fade-answers" mode="out-in">
|
<transition
|
||||||
|
name="fade-answers"
|
||||||
|
mode="out-in"
|
||||||
|
>
|
||||||
<List
|
<List
|
||||||
v-if="!showResult"
|
v-if="!showResult"
|
||||||
:options="options"
|
:options="options"
|
||||||
@@ -20,7 +25,7 @@
|
|||||||
/>
|
/>
|
||||||
<Result
|
<Result
|
||||||
v-else
|
v-else
|
||||||
:selectedName="selectedAnswer"
|
:selected-name="selectedAnswer"
|
||||||
:correct="correctAnswer"
|
:correct="correctAnswer"
|
||||||
/>
|
/>
|
||||||
</transition>
|
</transition>
|
||||||
@@ -39,6 +44,7 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { onMounted, ref } from 'vue'
|
import { onMounted, ref } from 'vue'
|
||||||
|
import { useRouter } from 'vue-router'
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
import List from './List.vue'
|
import List from './List.vue'
|
||||||
import Result from './Result.vue'
|
import Result from './Result.vue'
|
||||||
@@ -49,7 +55,8 @@ import useServerEvents from '@/composables/useServerEvents'
|
|||||||
import SquareLoader from 'vue-spinner/src/SquareLoader.vue'
|
import SquareLoader from 'vue-spinner/src/SquareLoader.vue'
|
||||||
|
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
const { addRevealListener } = useServerEvents()
|
const router = useRouter()
|
||||||
|
const { addRevealListener, addEndListener } = useServerEvents()
|
||||||
|
|
||||||
const options = ref()
|
const options = ref()
|
||||||
const card = ref()
|
const card = ref()
|
||||||
@@ -66,6 +73,10 @@ addRevealListener((data) => {
|
|||||||
}, 5000)
|
}, 5000)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
addEndListener(() => {
|
||||||
|
router.push('/')
|
||||||
|
})
|
||||||
|
|
||||||
async function getCard() {
|
async function getCard() {
|
||||||
correctAnswer.value = null
|
correctAnswer.value = null
|
||||||
selectedAnswer.value = null
|
selectedAnswer.value = null
|
||||||
|
|||||||
@@ -82,12 +82,14 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
import { ref, onMounted, computed } from 'vue'
|
import { ref, onMounted, computed } from 'vue'
|
||||||
|
import { useRouter } from 'vue-router'
|
||||||
import useServerEvents from '@/composables/useServerEvents'
|
import useServerEvents from '@/composables/useServerEvents'
|
||||||
import Answer from './Answer.vue'
|
import Answer from './Answer.vue'
|
||||||
|
|
||||||
import SquareLoader from 'vue-spinner/src/SquareLoader.vue'
|
import SquareLoader from 'vue-spinner/src/SquareLoader.vue'
|
||||||
|
|
||||||
const { addAnswerListener, addUserlistListener, addRevealListener } = useServerEvents()
|
const { addAnswerListener, addUserlistListener, addRevealListener, addEndListener } = useServerEvents()
|
||||||
|
const router = useRouter()
|
||||||
|
|
||||||
const card = ref()
|
const card = ref()
|
||||||
const users = ref([])
|
const users = ref([])
|
||||||
@@ -163,6 +165,10 @@ addRevealListener((data) => {
|
|||||||
}, 5000)
|
}, 5000)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
addEndListener(() => {
|
||||||
|
router.push('/')
|
||||||
|
})
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
getCard()
|
getCard()
|
||||||
getPlayers()
|
getPlayers()
|
||||||
|
|||||||
Reference in New Issue
Block a user