parent
248e65db47
commit
ddeaca06c2
@ -1,20 +0,0 @@ |
|||||||
import express from "express"; |
|
||||||
import socketIO from "socket.io"; |
|
||||||
|
|
||||||
const PORT = 3001; |
|
||||||
|
|
||||||
const app = express(); |
|
||||||
|
|
||||||
app.get('/', (req, res) => res.send('Hello World!')); |
|
||||||
|
|
||||||
const server = app.listen(PORT, () => console.log(`Example app listening on port ${PORT}!`)); |
|
||||||
const io = socketIO(server); |
|
||||||
|
|
||||||
io.on('connection', socket => { |
|
||||||
console.log('a user connected', socket.id); |
|
||||||
|
|
||||||
setInterval(() => { |
|
||||||
console.log('send :)') |
|
||||||
socket.emit("SENDING_NEW_TIME", "ASD") |
|
||||||
}, 1500) |
|
||||||
}); |
|
@ -0,0 +1,109 @@ |
|||||||
|
const User = require("./User.js"); |
||||||
|
|
||||||
|
module.exports = class Lobby { |
||||||
|
/** |
||||||
|
* @type {User[]} |
||||||
|
*/ |
||||||
|
users = []; |
||||||
|
/** |
||||||
|
* @type {string|undefined} |
||||||
|
*/ |
||||||
|
leaderId = undefined; |
||||||
|
|
||||||
|
running = false; |
||||||
|
runningInterval = undefined; |
||||||
|
currentTime = 0; |
||||||
|
|
||||||
|
constructor(name) { |
||||||
|
this.name = name; |
||||||
|
} |
||||||
|
|
||||||
|
run() { |
||||||
|
this.running = true; |
||||||
|
this.runningInterval = setInterval(() => { |
||||||
|
this.currentTime += 1; |
||||||
|
}, 1000); |
||||||
|
} |
||||||
|
|
||||||
|
pause() { |
||||||
|
this.running = false; |
||||||
|
clearInterval(this.runningInterval); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @returns {boolean} |
||||||
|
*/ |
||||||
|
hasUsers() { |
||||||
|
return this.users.length !== 0; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
setRandomLeader() { |
||||||
|
if (this.hasUsers()) { |
||||||
|
this.leaderId = this.users[0].id; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param {User} user |
||||||
|
*/ |
||||||
|
addUser(user) { |
||||||
|
this.users.push(user); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param id |
||||||
|
* @returns {User|undefined} |
||||||
|
*/ |
||||||
|
getUser(id) { |
||||||
|
return this.users.find(u => u.id === id); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param {string} id |
||||||
|
*/ |
||||||
|
removeUser(id) { |
||||||
|
this.users = this.users.filter(u => u.id !== id); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @returns {boolean} |
||||||
|
*/ |
||||||
|
hasLeader() { |
||||||
|
return !!this.leaderId; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param {string} id |
||||||
|
* @returns {boolean} |
||||||
|
*/ |
||||||
|
isLeader(id) { |
||||||
|
return this.leaderId === id; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param {string} id |
||||||
|
*/ |
||||||
|
setLeader(id) { |
||||||
|
if (!this.getUser(id)) { |
||||||
|
throw new Error('user_not_in_lobby'); |
||||||
|
} |
||||||
|
|
||||||
|
this.leaderId = id; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @returns {User|undefined} |
||||||
|
*/ |
||||||
|
getLeader() { |
||||||
|
return this.users.find(u => u.id === this.leaderId) |
||||||
|
} |
||||||
|
}; |
@ -0,0 +1,5 @@ |
|||||||
|
module.exports = class User { |
||||||
|
constructor(id) { |
||||||
|
this.id = id; |
||||||
|
} |
||||||
|
}; |
@ -0,0 +1,44 @@ |
|||||||
|
const express = require("express"); |
||||||
|
const socketIO = require("socket.io"); |
||||||
|
|
||||||
|
const service = require("./service.js"); |
||||||
|
const state = require("./state.js"); |
||||||
|
|
||||||
|
const PORT = 3001; |
||||||
|
|
||||||
|
const app = express(); |
||||||
|
const server = app.listen(PORT, () => console.log(`Example app listening on port ${PORT}!`)); |
||||||
|
const io = socketIO(server); |
||||||
|
|
||||||
|
app.get('/', (req, res) => res.send('<pre>' + JSON.stringify(state) + '</pre>')); |
||||||
|
|
||||||
|
io.on('connection', socket => { |
||||||
|
const socketId = socket.id; |
||||||
|
|
||||||
|
console.log('a user connected', socketId); |
||||||
|
|
||||||
|
const lobby = service.joinLobby(socketId); |
||||||
|
socket.join(lobby.name); |
||||||
|
socket.emit('welcome', {lobby: lobby.name}); |
||||||
|
|
||||||
|
|
||||||
|
socket.on('disconnect', (reason) => { |
||||||
|
console.log('Disconnected:', socketId); |
||||||
|
service.leaveLobby(socketId); |
||||||
|
}); |
||||||
|
|
||||||
|
socket.on('join_lobby', (lobbyId, callback) => { |
||||||
|
console.log(`${socketId} wants to join '${lobbyId}'.`); |
||||||
|
|
||||||
|
// Leave current lobby first
|
||||||
|
service.leaveLobby(socketId); |
||||||
|
const lobby = service.joinLobby(socketId, lobbyId); |
||||||
|
|
||||||
|
socket.join(lobby.name); |
||||||
|
|
||||||
|
callback(null, { |
||||||
|
status: 'ok', |
||||||
|
lobby: lobby.name |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
@ -0,0 +1,43 @@ |
|||||||
|
const User = require("./User.js"); |
||||||
|
const state = require("./state.js"); |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param {string} socketId |
||||||
|
* @param {number|undefined} lobbyId |
||||||
|
* @returns {Lobby} |
||||||
|
*/ |
||||||
|
function joinLobby(socketId, lobbyId=undefined) { |
||||||
|
let lobby = state.getLobby(lobbyId); |
||||||
|
if (!lobby) { |
||||||
|
lobby = state.createRandomLobby(); |
||||||
|
} |
||||||
|
|
||||||
|
lobby.addUser(new User(socketId)); |
||||||
|
|
||||||
|
if (!lobby.hasLeader()) { |
||||||
|
lobby.setLeader(socketId); |
||||||
|
} |
||||||
|
|
||||||
|
state.lobbies[lobby.name] = lobby; |
||||||
|
return lobby; |
||||||
|
} |
||||||
|
|
||||||
|
function leaveLobby(socketId) { |
||||||
|
Object.keys(state.lobbies).forEach(lobbyId => { |
||||||
|
const lobby = state.getLobby(lobbyId); |
||||||
|
|
||||||
|
lobby.removeUser(socketId); |
||||||
|
|
||||||
|
if (!lobby.hasUsers()) { |
||||||
|
state.removeLobby(lobbyId); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if (lobby.getLeader() === socketId) { |
||||||
|
lobby.setRandomLeader(); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
module.exports = {joinLobby, leaveLobby}; |
@ -0,0 +1,62 @@ |
|||||||
|
const Lobby = require("./Lobby.js"); |
||||||
|
const User = require("./User.js"); |
||||||
|
const {getRandomInt} = require("./util.js"); |
||||||
|
|
||||||
|
class State { |
||||||
|
/** |
||||||
|
* @type {Object.<string, Lobby>} |
||||||
|
*/ |
||||||
|
lobbies = {}; |
||||||
|
lobbyCount = 0; |
||||||
|
|
||||||
|
constructor() { |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @returns {Lobby} |
||||||
|
*/ |
||||||
|
createRandomLobby() { |
||||||
|
let lobby = undefined; |
||||||
|
|
||||||
|
while (!lobby) { |
||||||
|
const id = getRandomInt(100, Math.max(1000, this.lobbyCount * 2)); |
||||||
|
lobby = this.createLobby(id); |
||||||
|
} |
||||||
|
|
||||||
|
return lobby; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param lobbyId |
||||||
|
* @returns {Lobby|undefined} |
||||||
|
*/ |
||||||
|
getLobby(lobbyId) { |
||||||
|
if (!lobbyId || !this.lobbies.hasOwnProperty(lobbyId)) { |
||||||
|
return undefined; |
||||||
|
} |
||||||
|
|
||||||
|
return this.lobbies[lobbyId]; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns undefined when the lobby already exists. |
||||||
|
* @param {number} lobbyId |
||||||
|
* @returns {Lobby|undefined} |
||||||
|
*/ |
||||||
|
createLobby(lobbyId) { |
||||||
|
if (this.lobbies.hasOwnProperty(lobbyId)) { |
||||||
|
return undefined; |
||||||
|
} |
||||||
|
|
||||||
|
this.lobbyCount += 1; |
||||||
|
return new Lobby(lobbyId); |
||||||
|
} |
||||||
|
|
||||||
|
removeLobby(lobbyId) { |
||||||
|
this.lobbyCount -= 1; |
||||||
|
delete this.lobbies[lobbyId]; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
module.exports = new State(); |
@ -0,0 +1,15 @@ |
|||||||
|
/** |
||||||
|
* Generates random int |
||||||
|
* @param {number} min, inclusive |
||||||
|
* @param {number} max, exclusive |
||||||
|
* @returns {number} |
||||||
|
*/ |
||||||
|
function getRandomInt(min, max) { |
||||||
|
min = Math.ceil(min); |
||||||
|
max = Math.floor(max); |
||||||
|
return Math.floor(Math.random() * (max - min)) + min; |
||||||
|
} |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
getRandomInt |
||||||
|
}; |
@ -0,0 +1,15 @@ |
|||||||
|
const express = require('express'); |
||||||
|
const state = require('./state.js'); |
||||||
|
const b = require('./b.js'); |
||||||
|
|
||||||
|
const PORT = 3002; |
||||||
|
|
||||||
|
const app = express(); |
||||||
|
const server = app.listen(PORT, () => console.log(`Example app listening on port ${PORT}!`)); |
||||||
|
|
||||||
|
app.get('/', (req, res) => { |
||||||
|
let i = state.a; |
||||||
|
b.test(i += 1); |
||||||
|
|
||||||
|
return res.send('<pre>' + JSON.stringify(state) + '</pre>') |
||||||
|
}); |
@ -0,0 +1,7 @@ |
|||||||
|
const state = require('./state.js'); |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
test: (i) => { |
||||||
|
state.setA(i); |
||||||
|
} |
||||||
|
}; |
@ -0,0 +1,12 @@ |
|||||||
|
class State { |
||||||
|
a = 3; |
||||||
|
constructor() { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
setA(i) { |
||||||
|
this.a = i; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
module.exports = new State(); |
@ -0,0 +1,25 @@ |
|||||||
|
import React, {useEffect} from 'react'; |
||||||
|
import {Col, Progress} from "antd" |
||||||
|
import socket from "../util/socket"; |
||||||
|
|
||||||
|
|
||||||
|
const Lobby = () => { |
||||||
|
useEffect(() => { |
||||||
|
socket.on("SENDING_NEW_TIME", (data: string) => { |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
return () => { |
||||||
|
socket.off("SENDING_NEW_TIME"); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
return ( |
||||||
|
<Col className="sider" span={4} offset={10}> |
||||||
|
<h1>Centurion!</h1> |
||||||
|
</Col> |
||||||
|
|
||||||
|
); |
||||||
|
}; |
||||||
|
|
||||||
|
export default Lobby; |
@ -1,3 +1,23 @@ |
|||||||
import io from "socket.io-client"; |
import io from "socket.io-client"; |
||||||
|
|
||||||
export default io("http://localhost:3001"); |
|
||||||
|
const socket = io("http://localhost:3001"); |
||||||
|
export default socket; |
||||||
|
|
||||||
|
/** |
||||||
|
* Promisify emit. |
||||||
|
* @param event |
||||||
|
* @param arg |
||||||
|
* @param callback |
||||||
|
*/ |
||||||
|
export function emit(event: string, arg: any) { |
||||||
|
return new Promise((resolve, reject) => { |
||||||
|
socket.emit(event, arg, (err: any, res: any) => { |
||||||
|
if (err) { |
||||||
|
return reject(err); |
||||||
|
} |
||||||
|
|
||||||
|
resolve(res); |
||||||
|
}) |
||||||
|
}) |
||||||
|
} |
Loading…
Reference in new issue