Schafkopf-Server/Public/game.js

321 lines
8.1 KiB
JavaScript
Raw Normal View History

// The web socket to connect to the server
var socket = null;
2021-11-28 23:59:24 +01:00
var tableId = "";
function closeSocketIfNeeded() {
if (socket) {
socket.close()
2021-11-28 23:59:24 +01:00
didCloseSocket()
}
}
2021-12-01 22:50:42 +01:00
function didLeaveTable() {
tableId = ""
}
2021-11-28 23:59:24 +01:00
function didCloseSocket() {
socket = null
2021-11-27 11:59:13 +01:00
}
2021-11-28 23:59:24 +01:00
function setTableId(table) {
tableId = table
}
function showBlankLoginScreen(text) {
closeSocketIfNeeded()
2021-12-01 22:50:42 +01:00
didLeaveTable()
clearLoginPassword()
clearLoginName()
deleteSessionToken()
2021-12-01 22:50:42 +01:00
showLoginElements()
setLoginError(text)
}
2021-11-28 23:59:24 +01:00
function showGame(tableId) {
setTableId(tableId)
const token = getSessionToken()
if (token) {
2021-11-30 20:55:25 +01:00
showGameElements()
2021-12-01 22:50:42 +01:00
openSocket(token)
2021-11-28 23:59:24 +01:00
// TODO: Show interface
console.log("Show table " + tableId)
} else {
showBlankLoginScreen("")
}
}
function registerUser() {
const username = getLoginName()
const password = getLoginPassword()
if (username == "") {
setLoginError("Please enter your desired user name")
return
}
if (password == "") {
setLoginError("Please enter a password")
return
}
performRegisterPlayerRequest(username, password)
.then(function(token) {
setSessionToken(token)
setPlayerName(username)
2021-12-01 22:50:42 +01:00
showTableListElements()
2021-11-28 23:59:24 +01:00
loadCurrentTable(token)
}).catch(function(error) {
setLoginError(error.message)
})
}
2021-11-27 11:59:13 +01:00
2021-11-28 23:59:24 +01:00
function deletePlayerAccount() {
const name = getPlayerName()
const password = getLoginPassword()
2021-11-27 11:59:13 +01:00
2021-11-28 23:59:24 +01:00
performDeletePlayerRequest(name, password, function(error) {
if (error == "") {
showBlankLoginScreen("")
console.log("Player deleted")
} else {
closeSocketIfNeeded()
2021-12-01 22:50:42 +01:00
didLeaveTable()
2021-11-28 23:59:24 +01:00
deleteSessionToken()
alert(error)
console.log(error)
}
})
}
2021-11-28 23:59:24 +01:00
function loginUser() {
const username = getLoginName()
const password = getLoginPassword()
if (username == "") {
setLoginError("Please enter your user name")
return
}
if (password == "") {
setLoginError("Please enter your password")
return
}
performLoginPlayerRequest(username, password)
.then(function(token) {
setSessionToken(token)
setPlayerName(username)
2021-12-01 22:50:42 +01:00
showTableListElements()
2021-11-28 23:59:24 +01:00
loadCurrentTable(token)
}).catch(function(error) {
setLoginError(error.message)
})
}
2021-11-28 23:59:24 +01:00
function logoutUser() {
const token = getSessionToken()
if (token) {
performLogoutRequest(token)
2021-11-28 23:59:24 +01:00
.then(function() {
showBlankLoginScreen("")
}).catch(function(error) {
showBlankLoginScreen(error.message)
console.log(error)
})
} else {
showBlankLoginScreen("")
}
}
2021-11-28 23:59:24 +01:00
function loadExistingSession() {
const token = getSessionToken()
if (token) {
resumeSessionRequest(token)
.then(function(name) {
setPlayerName(name)
2021-12-01 22:50:42 +01:00
showTableListElements()
2021-11-28 23:59:24 +01:00
loadCurrentTable(token)
}).catch(function(error) {
showBlankLoginScreen(error.message)
})
} else {
showBlankLoginScreen("")
}
}
function loadCurrentTable(token) {
performGetCurrentTableRequest(token)
.then(function(tableId) {
if (tableId == "") {
2021-12-01 22:50:42 +01:00
didLeaveTable()
2021-11-28 23:59:24 +01:00
refreshTables()
return
}
2021-12-01 22:50:42 +01:00
console.log("Loaded table " + tableId)
2021-11-28 23:59:24 +01:00
showGame(tableId)
}).catch(function(error) {
showBlankLoginScreen(error.message)
})
}
2021-11-28 23:59:24 +01:00
function createTable() {
const tableName = getTableName()
if (tableName == "") {
return
}
2021-11-28 23:59:24 +01:00
const token = getSessionToken()
if (token) {
const isVisible = getTableVisibility()
performCreateTableRequest(token, tableName, isVisible)
.then(function(tableId) {
clearTableName()
showGame(tableId)
}).catch(function(error) {
showBlankLoginScreen(error.message)
})
} else {
showBlankLoginScreen("")
}
}
2021-11-28 23:59:24 +01:00
function joinTable(tableId) {
const token = getSessionToken()
2021-11-27 11:59:13 +01:00
if (token) {
2021-11-28 23:59:24 +01:00
performJoinTableRequest(tableId, token)
.then(function() {
showGame(tableId)
})
.catch(function(error) {
showBlankLoginScreen(error.message)
})
} else {
2021-11-28 23:59:24 +01:00
showBlankLoginScreen("")
2021-11-27 11:59:13 +01:00
}
}
2021-11-30 20:55:25 +01:00
function leaveTable() {
const token = getSessionToken()
if (token) {
performLeaveTableRequest(token)
.then(function() {
2021-12-01 22:50:42 +01:00
showTableListElements()
closeSocketIfNeeded()
didLeaveTable()
refreshTables()
2021-11-30 20:55:25 +01:00
})
.catch(function(error) {
showBlankLoginScreen(error.message)
})
} else {
showBlankLoginScreen("")
}
}
2021-11-28 23:59:24 +01:00
function openSocket(token) {
socket = new WebSocket(((window.location.protocol === "https:") ? "wss://" : "ws://") + window.location.host + "/session/start")
2021-11-27 11:59:13 +01:00
socket.onopen = function(e) {
socket.send(token);
2021-12-01 22:50:42 +01:00
showConnectedState()
};
socket.onmessage = function(event) {
// TODO: Handle server data
2021-11-28 23:59:24 +01:00
//event.data
2021-12-01 22:50:42 +01:00
handleServerUpdates(event.data)
};
socket.onclose = function(event) {
if (event.wasClean) {
2021-12-01 22:50:42 +01:00
} else {
// e.g. server process killed or network down
// event.code is usually 1006 in this case
2021-11-28 23:59:24 +01:00
// TODO: Retry several times to open socket,
// stop after too many failed attempts
}
2021-12-01 22:50:42 +01:00
didCloseSocket()
showDisconnectedState()
};
socket.onerror = function(error) {
// error.message
};
2021-11-27 11:59:13 +01:00
}
2021-12-01 22:50:42 +01:00
function handleServerUpdates(data) {
const info = JSON.parse(data.substring(1))
if (data.startsWith("t")) {
handleTableInfoUpdate(info)
} else if (data.startsWith("c")) {
handleCardInfoUpdate(info)
} else {
console.log("Unhandled update: " + data)
}
}
function handleTableInfoUpdate(info) {
for (let i = 0, len = info.players.length; i < len; i += 1) {
const player = info.players[i]
// TODO: Mark active player
setTablePlayerInfo(i + 1, player.name, player.connected, false)
}
if (info.tableIsFull) {
showDealButton()
} else {
hideDealButton()
}
}
function handleCardInfoUpdate(info) {
for (let i = 0, len = info.cards.length; i < len; i += 1) {
setHandCard(i+1, info.cards[i].card, info.cards[i].playable)
}
for (let i = 0, len = info.tableCards.length; i < len; i += 1) {
setTableCard(i+1, info.tableCards[i])
}
}
function refreshTables() {
const token = getSessionToken()
if (token) {
2021-11-28 23:59:24 +01:00
performGetPublicTablesRequest(token)
.then(function(json) {
const html = processTableList(json)
setTableListContent(html)
}).catch(function(error) {
showBlankLoginScreen(error.message)
})
} else {
showBlankLoginScreen()
}
2021-11-27 11:59:13 +01:00
}
function processTableList(tables) {
var html = ""
2021-11-28 23:59:24 +01:00
for (let i = 0, len = tables.length; i < len; i++) {
tableInfo = tables[i]
2021-11-28 23:59:24 +01:00
html += "<div class=\"table-row\">"
if (tableInfo.players.length < 4) {
html += "<button class=\"table-join-btn\" onclick=\"joinTable('" + tableInfo.id + "')\">Join</button>"
} else {
html += "<button class=\"table-join-btn\" disabled>Full</button>"
}
html += "<div class=\"table-title\">" + tableInfo.name + "</div>"
2021-12-01 22:50:42 +01:00
if (tableInfo.players.length == 0) {
html += "<div class=\"table-subtitle\">No players</div>"
} else {
const names = tableInfo.players.map(function(player) { return player.name }).join(", ")
html += "<div class=\"table-subtitle\">Players: " + names + "</div>"
}
2021-11-28 23:59:24 +01:00
html += "</div>" // table-row
}
return html
2021-12-01 22:50:42 +01:00
}
function dealCards() {
const token = getSessionToken()
if (token) {
performDealCardsRequest(token)
.catch(function(error) {
showBlankLoginScreen(error.message)
})
} else {
showBlankLoginScreen()
}
}