Client working, server done bug smashing time

This commit is contained in:
nannal 2020-04-17 00:49:55 +03:00
parent d50ccb48f8
commit 2129889248
11 changed files with 531 additions and 111 deletions

View File

@ -1,24 +0,0 @@
function register(){
console.log("register")
}
function make(){
console.log("make")
}
function join(){
console.log("join")
}
function start(){
console.log("start")
}
function donate(){
console.log("donate")
}
function accuse(){
console.log("accuse")
}

View File

@ -1,37 +0,0 @@
<html>
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<meta content="utf-8" http-equiv="encoding"/>
<script src="index.js"></script>
<div id="controls">
</br>Register
<input id="register" type="text" placeholder="Name"/> <button onclick="register()">Register</button>
</br>Make
<input id="make" type="text" placeholder="GameName"/> <button onclick="make()">Make</button>
</br>Join
<input id="join" type="text" placeholder="Name"/> <button onclick="join()">Join</button>
</br>Start
<button onclick="start()">Start</button>
</br>Donate
<select id="donate" name="list">
<option value="x">x</option>
</select>
<input id="amount" type="number">
<button onclick="donate()">Donate</button>
</br>Accuse
<input id="accuse" type="text" placeholder="Name"/> <button onclick="accuse()">Accuse</button>
</div>
<div id="info"></div>
</html>

12
client/simpleclient/index.css Executable file
View File

@ -0,0 +1,12 @@
body{
margin:40px auto;
max-width:650px;
line-height:1.6;
font-size:18px;
color:#444;
padding:0 10px;
}
h1,h2,h3{
line-height:1.2
}

73
client/simpleclient/index.html Executable file
View File

@ -0,0 +1,73 @@
<html>
<head>
<link rel="stylesheet" type="text/css" href="index.css">
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<meta content="utf-8" http-equiv="encoding"/>
<script src="index.js"></script>
<script src="jq.js"></script>
</head>
<body>
<div class="controls">
<div class="Reigster-Container">
</br>Register
<input id="register" type="text" placeholder="Name"/> <button onclick="register()">Register</button>
</div>
<div class="Make-Container">
</br>Make
<input id="makeSeats" type="number"/> <button onclick="make()">Make</button>
</div>
<div class="Join-Container">
</br>Join
<input id="join" type="text" placeholder="Name"/> <button onclick="join()">Join</button>
</div>
<div class="Start-Container">
</br>Start
<button onclick="start()">Start</button>
</div>
<div class="Donate-Container">
</br>Donate
<select id="donate" name="list">
<option value="x">x</option>
</select>
<input id="amount" type="number">
<button onclick="donate()">Donate</button>
</div>
<div class="Accuse-Container">
</br>Accuse
<input id="accuse" type="text" placeholder="Name"/> <button onclick="accuse()">Accuse</button>
</div>
</div>
<div id="info">
<div id="messages"></div>
<div id="games"></div>
<div id="gameInfo"></div>
<div id="myCharity"></div>
<div id="charityStatus"></div>
<div id="boardFunding"></div>
<div id="transactionLog"></div>
<div id="accusationLog"></div>
<div id="messages"></div>
</div>
</body>
</html>

287
client/simpleclient/index.js Executable file
View File

@ -0,0 +1,287 @@
// Global Vars
serverAddr="http://localhost:3000"
ownerID=''
// ownerID='6298bc89-41cb-4cc7-84cd-7fd8e419f263'
gameID=''
//Meta Game Utils
function register(){
const data = { name: document.getElementById('register').value };
fetch(serverAddr+'/lobby/register', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
})
.then((response) => response.json())
.then((data) => {
// console.log(data)
ownerID=data.ownerID
document.getElementById('register').value=data.name
//hide register
//show make & join
//show list of games
listGames()
})
.catch((error) => {
console.error('Error:', error);
});
}
function listGames(){
fetch(serverAddr+"/lobby/list")
.then((response) => {
return response.json();
})
.then((data) => {
document.getElementById('messages').value='data.gamesArr'
console.log(data);
});
}
function make(){
console.log("make")
const data = {
ownerID: ownerID,
seats: document.getElementById('makeSeats').value };
fetch(serverAddr+'/lobby/make', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
})
.then((response) => response.json())
.then((data) => {
// console.log(data)
gameID=data.gameID
gameData(gameID)
})
.catch((error) => {
console.error('Error:', error);
});
}
function join(){
console.log("join")
gameID=document.getElementById('join').value
const data = {
ownerID: ownerID,
gameID: gameID };
// console.log(data)
fetch(serverAddr+'/lobby/join', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
})
.then((response) => response.json())
.then((data) => {
// console.log(data)
gameData(gameID)
})
.catch((error) => {
console.error('Error:', error);
});
}
function gameData(gameID) {
fetch(serverAddr+'/lobby/details/'+gameID)
.then((response) => {
if (response.status == 404) {
status()
}
return response.json();
})
.then((data) => {
checkIfStarted = setInterval(function(){
gameData(gameID)
clearInterval(checkIfStarted)
}, 1000)
if (document.getElementById("messages").innerText != "Game Name: "+data.name+", GameID: "+data.gameID) {
document.getElementById("messages").innerText="Game Name: "+data.name+", GameID: "+data.gameID
}
})
}
function start(){
console.log("start")
const data = {
ownerID: ownerID,
gameID: gameID };
// console.log(data)
fetch(serverAddr+'/lobby/start', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
})
.then((response) => response.json())
.then((data) => {
console.log(data)
})
.catch((error) => {
console.error('Error:', error);
});
}
// Game controls
function donate(){
console.log("donate")
// /game/:gameID/distribution
amount=document.getElementById('amount').value
doante=document.getElementById('donate').value
const data = {
ownerID: ownerID,
gameID: gameID,
charityID: doante,
amount: amount };
// console.log(data)
fetch(serverAddr+'/game/'+gameID+'/distribution', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
})
.then((response) => response.json())
.then((data) => {
// console.log(data)
// gameData(gameID)
})
.catch((error) => {
console.error('Error:', error);
});
}
function accuse(){
console.log("accuse")
name = document.getElementById('accuse').value
const data = {
ownerID: ownerID,
gameID: gameID,
player: name };
// console.log(data)
fetch(serverAddr+'/game/'+gameID+'/accuse', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
})
.then((response) => response.json())
.then((data) => {
// console.log(data)
document.getElementById("accuseLog").innerText=data
// gameData(gameID)
})
.catch((error) => {
console.error('Error:', error);
});
}
// Game Utils
function status() {
//the game has started, get the data
// One off updates
const data = {
ownerID: ownerID,
gameID: gameID };
fetch(serverAddr+'/game/'+gameID+'/charity', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
})
.then((response) => response.json())
.then((data) => {
// console.log(data)
myCharityFormat(data)
})
.catch((error) => {
console.error('Error:', error);
});
//Quick Recurring updates
setInterval(function(){
fetch(serverAddr+'/game/'+gameID+'/boardFunding', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
})
.then((response) => response.json())
.then((data) => {
boardFundingFormat(data)
// statusObj.funding=data
})
.catch((error) => {
// console.error('Error:', error);
});
fetch(serverAddr+'/game/'+gameID+'/charityList')
.then((response) => {
return response.json();
})
.then((data) => {
// console.log(data);
dropDownList=""
data.charatiesArr.forEach(element => {
dropDownList=dropDownList+'<option value="'+element.charityID+'">'+element.name+'</option>'
});
if (document.getElementById("donate").innerHTML != dropDownList){
document.getElementById("donate").innerHTML=dropDownList
statusObj.charitylist=data
}
document.getElementById("charityStatus").innerHTML=charityStatusFormat(data)
});
fetch(serverAddr+'/game/'+gameID+'/playerList')
.then((response) => {
return response.json();
})
.then((data) => {
statusObj.playerlist=data
// console.log(data);
});
// fdocument.getElementById("info").innerText=prettyprint(statusObj)
}, 3000)
}
//Formating Functions
function myCharityFormat(data) {
document.getElementById("myCharity").innerText="Your Charity: "+data.charity
}
function charityStatusFormat(data) {
html=""
data.forEach(element => {
html=html+"<b>"+element.name+":</b> "+element.capital
})
return html
}
function boardFundingFormat(data) {
}

File diff suppressed because one or more lines are too long

166
game.js
View File

@ -26,7 +26,7 @@ const game = {
gameObj.charities = [] gameObj.charities = []
gameObj.distributionLog = [] gameObj.distributionLog = []
gameObj.accuseLog = {} gameObj.accuseLog = {}
console.log(gameObj) gameObj.status = "distribution"
for (let index = 0; index < gameObj.players.length; index++) { for (let index = 0; index < gameObj.players.length; index++) {
gameObj.charities.push({ gameObj.charities.push({
charityID: uuidv4(), charityID: uuidv4(),
@ -38,7 +38,6 @@ const game = {
gameObj.secretLink = [] gameObj.secretLink = []
gameObj.players.forEach((element, index) => { gameObj.players.forEach((element, index) => {
charity = gameObj.charities[index] charity = gameObj.charities[index]
console.log(element)
let link = { let link = {
charity: charity.charityID, charity: charity.charityID,
owner: element.name owner: element.name
@ -51,6 +50,7 @@ const game = {
gameObj.players.forEach(element => { gameObj.players.forEach(element => {
element.funds = 10000000 element.funds = 10000000
element.status = "Employed" element.status = "Employed"
console.log(element)
}) })
//update game //update game
mongo.update("embezzle", "gamelist", { mongo.update("embezzle", "gamelist", {
@ -63,17 +63,25 @@ const game = {
"_id": ownerID "_id": ownerID
}) })
name = name[0].name name = name[0].name
secret = await mongo.get("embezzle", "gamelist", { let gameObj = await mongo.get("embezzle", "gamelist", {
"gameID": gameID "gameID": gameID
}) })
secret = secret[0].secretLink secret = gameObj[0].secretLink
let mine = "" let mine = ""
secret.forEach(element => { gameObj[0].charities.forEach(element => {
console.log(element.owner,name) secret.forEach(user => {
if (element.name == name) { console.log(name,user)
mine = element.name if (name==user.name){
} console.log(element, user)
console.log("User Found")
if (element.charityID == user.charity) {
console.log(element.charityID,user.charity)
(console.log("Charity Found"))
mine = element.name
}
}
})
}) })
chairtyObj = { chairtyObj = {
@ -101,7 +109,8 @@ const game = {
}) })
}, },
boardFunding: async (gameID, ownerID) => { boardFunding: async (ownerID,gameID) => {
r=""
name = await mongo.get("embezzle", "players", { name = await mongo.get("embezzle", "players", {
"_id": ownerID "_id": ownerID
}) })
@ -113,16 +122,21 @@ const game = {
result = "" result = ""
players.forEach(element => { players.forEach(element => {
if (element.name == name) { if (element.name == name) {
result = name r = {funds: element.funds}
} }
}) })
return r
}, },
distribution: async (gameID, ownerID, charityID, amount) => { distribution: async (gameID, ownerID, charityID, amount) => {
//get the player info //turn the amount to an int
amount=parseInt(amount)
//get the game info
gameObj = await mongo.get("embezzle", "gamelist", { gameObj = await mongo.get("embezzle", "gamelist", {
"gameID": gameID "gameID": gameID
}) })
gameObj = gameObj[0] gameObj = gameObj[0]
// console.log(gameObj)
if (gameObj.status != "distribution") { if (gameObj.status != "distribution") {
return({error:"You have tried to distribute funds when it is not the distribution round"}) return({error:"You have tried to distribute funds when it is not the distribution round"})
@ -131,18 +145,18 @@ const game = {
"_id": ownerID "_id": ownerID
}) })
player = player[0] player = player[0]
//Wipe out the accuse log read for the next round // console.log(gameObj)
gameObj.accuseLog={}
// Check if we have two players left and if so, decide on a winner gameObj.players.forEach((element, index) => {
employedCount = 0 if (player.name == element.name){
gameObj.players.forEach(element => { player=gameObj.players[index]
if (element.status == "Employed") { console.log(player)
employedCount++
} }
}) })
if (employedCount < 3) {
return game.winner(gameID) //Wipe out the accuse log read for the next round
} gameObj.accuseLog={}
// Now we know the game is still on-going: // Now we know the game is still on-going:
//add users funds to the charity & subtract donation from users funds //add users funds to the charity & subtract donation from users funds
@ -156,46 +170,122 @@ const game = {
element.capital = element.capital+amount element.capital = element.capital+amount
player.funds = player.funds - amount player.funds = player.funds - amount
gameObj.distributionLog.push({ gameObj.distributionLog.push({
donator:player.name, donator: player.name,
amount: amount, amount: amount,
charity: element.name charity: element.name
}) })
} }
}) })
reaminingFunding = 0 reaminingFunding = 0
gameObj.players.forEach(element => { gameObj.players.forEach(element => {
reaminingFunding= reaminingFunding+element.funds reaminingFunding=reaminingFunding+element.funds
if (reaminingFunding == 0) {
roundStatus(gameID)
}
}) })
if (reaminingFunding == 0) {
game.roundStatus(gameID)
}
mongo.update("embezzle", "gamelist", { mongo.update("embezzle", "gamelist", {
"gameID": gameID "gameID": gameID
}, gameObj) }, gameObj)
return ({log: gameObj.distributionLog}) return ({log: gameObj.distributionLog})
}, },
accuse: async (gameID, ownerID, player) => { accuse: async (gameID, ownerID, victim) => {
//??? //Get votes on who should be fired
}, player = await mongo.get("embezzle", "players", {
winner: async (gameID) => { "_id": ownerID
winner = await mongo.get("embezzle", "gamelist", { })
player = player[0]
gameObj = await mongo.get("embezzle", "gamelist", {
"gameID": gameID "gameID": gameID
}) })
winer = winner[0].winner gameObj = gameObj[0]
if (gameObj.status != "accuse"){
return {Error: "Game status is not accuse, you'll want to distribute funds before trying to fire someone"}
}
gameObj.players.forEach(element => {
if (victim == element.name) {
gameObj.accuseLog[player.name] = victim
} else {
return gameObj.accuseLog
}
})
if (Object.keys(gameObj.accuseLog).length == gameObj.players.length){
vote={}
Object.keys(gameObj.accuseLog).forEach(accuser => {
vote[accuser]=0
Object.values(gameObj.accuseLog).forEach(accused => {
if (accuser == accused) {
vote[accuser]=vote[accuser]+1
}
})
})
sorted = Object.keys(vote).sort(function(a,b){return vote[a]-vote[b]})
fired = sorted[sorted.length-1]
gameObj.players.forEach(element => {
if (element.name == fired ) {
element.status="Fired"
game.roundStatus(gameID)
}
})
}
// Check if we have two players left and if so, decide on a winner
employedCount = 0
gameObj.players.forEach(element => {
if (element.status == "Employed") {
employedCount++
}
})
if (employedCount == 2) {
return game.winner(gameID)
}
//change status of the user to fired
mongo.update("embezzle", "gamelist", {
"gameID": gameID
}, gameObj)
return ({log: gameObj.distributionLog})
},
winner: async (gameID) => {
winner=""
gameObj = await mongo.get("embezzle", "gamelist", {
"gameID": gameID
})
gameObj = gameObj[0]
// Get the company with the highest value
x=gameObj.charities.sort((a, b) => parseFloat(a.capital) - parseFloat(b.capital));
winCharity=x[gameObj.charities.length-1].charityID
gameObj.secretLink.forEach(element => {
if (element.charity == winCharity) {
winner=element.owner
}
})
// Get the ID
// Tie the ID to the player using secret link
//Declare the winner
gameObj.status="Finished"
mongo.update("embezzle", "gamelist", {
"gameID": gameID
}, gameObj)
return {winner: winner}
}, },
roundStatus: async (gameID) => { roundStatus: async (gameID) => {
gameObj = await mongo.get("embezzle", "gamelist", { gameObj = await mongo.get("embezzle", "gamelist", {
"gameID": gameID "gameID": gameID
}) })
gameObj = gameObj[0] gameObj = gameObj[0]
if (typeof gameObj == undefined || gameObj == "accuse") { console.log(gameObj.status)
if (typeof gameObj.status == "lobby" || gameObj.status == "accuse") {
gameObj.status = "distribution" gameObj.status = "distribution"
} else { } else {
gameObj.status = "accuse" gameObj.status = "accuse"
} }
console.log(gameObj.status)
mongo.update("embezzle", "gamelist", { mongo.update("embezzle", "gamelist", {
"gameID": gameID "gameID": gameID
}, gameObj) }, gameObj)

View File

@ -7,6 +7,7 @@ app.use(bodyParser.json(),function (req, res, next) {
res.setHeader('Access-Control-Allow-Origin', '*') res.setHeader('Access-Control-Allow-Origin', '*')
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE') res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE')
res.setHeader('Access-Control-Allow-Headers', 'Content-Type') res.setHeader('Access-Control-Allow-Headers', 'Content-Type')
res.setHeader('Content-Type', 'application/json')
res.setHeader('Access-Control-Allow-Credentials', true) res.setHeader('Access-Control-Allow-Credentials', true)
next() next()
}) })
@ -27,6 +28,9 @@ app.get('/lobby/list' , async function (req, res) {
//get game details //get game details
app.get('/lobby/details/:gameID', function (req, res) { app.get('/lobby/details/:gameID', function (req, res) {
lobby.details(req.params.gameID).then(r => { lobby.details(req.params.gameID).then(r => {
if (r.length == 0){
res.status(404)
}
res.send(JSON.stringify(r[0])) res.send(JSON.stringify(r[0]))
}) })
@ -80,8 +84,8 @@ app.get('/game/:gameID/playerList', function (req, res) {
}) })
}) })
// boardFunding // boardFunding
app.get('/game/:gameID/boardFunding', function (req, res) { app.post('/game/:gameID/boardFunding', function (req, res) {
game.boardFunding(req.params.gameID).then(r => { game.boardFunding(req.body.ownerID,req.params.gameID).then(r => {
res.send(JSON.stringify(r)) res.send(JSON.stringify(r))
}) })
}) })

View File

@ -39,17 +39,19 @@ var lobby = {
}, },
register: (name) => { register: (name) => {
id = uuidv4() id = uuidv4()
name=name+'-'+id.split('-')[3]
mongo.put("embezzle", "players", { mongo.put("embezzle", "players", {
_id: id, _id: id,
name: name name: name
}) })
return ({ return ({
ownerID: id ownerID: id,
name: name
}) })
}, },
make: async (ownerID, seats) => { make: async (ownerID, seats) => {
gameID = uuidv4() gameID = uuidv4()
//todo write charity name generator //Name the game after the person that makes it.
name = await mongo.get("embezzle", "players", { name = await mongo.get("embezzle", "players", {
"_id": ownerID "_id": ownerID
}) })
@ -69,6 +71,7 @@ var lobby = {
// return({gameID:gameID}) // return({gameID:gameID})
}, },
join: async (ownerID, gameID) => { join: async (ownerID, gameID) => {
//TODO: Stop players joining the game more than once.
value = await mongo.get("embezzle", "gamelist", { value = await mongo.get("embezzle", "gamelist", {
"gameID": gameID "gameID": gameID
}) })
@ -80,14 +83,18 @@ var lobby = {
playerObj = { playerObj = {
name: player.name name: player.name
} }
if (gameObj.status != "lobby") {
return {error:"Unable to join game"}
} else {
gameObj.players.push(playerObj)
mongo.update("embezzle", "gamelist", {
"gameID": gameID
}, gameObj)
return ({
gameID: gameID
})
}
gameObj.players.push(playerObj)
mongo.update("embezzle", "gamelist", {
"gameID": gameID
}, gameObj)
return ({
gameID: gameID
})
}, },
start: (ownerID, gameID) => { start: (ownerID, gameID) => {
mongo.get("embezzle", "gamelist", { mongo.get("embezzle", "gamelist", {

5
package-lock.json generated
View File

@ -746,6 +746,11 @@
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
}, },
"nodaemon": {
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/nodaemon/-/nodaemon-0.0.5.tgz",
"integrity": "sha512-4rfEhcDMZX/av809P6Yu9mxQf3qQL66fCOrAex+k6HkMnWKDd57IesiT4VCXUK4FTZWQ9MrvSZ76VrKgvSjnDg=="
},
"nodemon": { "nodemon": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.2.tgz", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.2.tgz",

View File

@ -16,6 +16,7 @@
"body-parser": "^1.19.0", "body-parser": "^1.19.0",
"express": "^4.17.1", "express": "^4.17.1",
"mongodb": "^3.4.1", "mongodb": "^3.4.1",
"nodaemon": "0.0.5",
"randomstring": "^1.1.5", "randomstring": "^1.1.5",
"uuid": "^3.4.0" "uuid": "^3.4.0"
}, },