Registriert einen neuen User
Request Payload:
{
"username": "username",
"password": "password",
"firstname": "firstname",
"lastname": "lastname"
}
Response:
Statuscode: 201
{
"message": "New player created"
}
Authentifiziert einen User und vergibt ein Zugangstoken
Request Payload:
{
"username": "username",
"password": "password"
}
Response:
{
"accessToken": "jwt",
"user": {
"id": "id",
"username": "username",
"firstname": "firstname",
"lastname": "lastname"
}
}
Verifiziert das mit gegebende Zugangstoken und gibt die gespeicherten Nutzerdaten zurück
Request Payload:
{
"token": "jwt"
}
Response:
Statuscode: 200
{
"user": {
"id": "id",
"username": "username"
}
}
Erstellt ein Tunier mit den spezifizierten Optionen
// kein JSON Objekt
"numBestOfMatches": 3 // ungerade zahlen, n > 2 und n < 8
// Beispiel:
socket.emit('tournament:create', 3, (data) => {
// logic
});
Der Server bestätigt das Event mit einen Acknowledgment
Success:
{
"success": true,
"data": {
"tournamentId": "id",
"currentSize": 1,
"bestOf": 5 // anzahl der best of matches
},
"error": null
}
Error:
{
"success": false,
"data": null,
"error": {
"message": "..."
}
}
Lässt den Client das Tunier mit der spezifizierten tournamentId beitreten
"tournamentId": "id" // kein JSON Objekt
Der Server bestätigt das Event mit einen Acknowledgment
Success:
{
"success": true,
"data": {
"tournamentId": "id",
"currentSize": 1,
"bestOf": 5,
"players": [
{
"id": "playerId",
"username": "username"
}
]
},
"error": null
}
Error:
{
"success": false,
"data": null,
"error": {
"message": "..."
}
}
Lässt den Spieler das Tunier in dem er sich aufhält verlassen
Der Server bestätigt das Event mit einen Acknowledgment
Success:
{
"success": true,
"data": null,
"error": null
}
Error:
{
"success": false,
"data": null,
"error": {
"message": "..."
}
}
Lässt den Spieler das Tunier in dem er sich aufhält starten
Kann nur vom Host des Tuniers veranlasst werden
Der Server bestätigt das Event mit einen Acknowledgment
Success:
{
"success": true,
"data": null,
"error": null
}
Error:
{
"success": false,
"data": null,
"error": {
"message": "..."
}
}
Schickt allen Client die mit dem Socket.io Server verbunden sind updated über die verfügbaren tuniere denen man beitreten kann
Wird jedesmal wenn ein Client ein Tunier erstellt oder beitritt geupdated und an alle Clients gesendet
{
"tournaments": [
{
"id": "tournamentId",
"createdAt": "date", // 2023-04-14T19:16:17.907Z
"status": "WAITING_FOR_MORE_PLAYERS",
"currentSize": 1,
"players": [
{
"username": "username"
}
]
},
{
"id": "tournamentId",
"createdAt": "date",
"status": "WAITING_FOR_MORE_PLAYERS",
"currentSize": 2,
"players": [
{
"username": "username"
},
{
"username": "username2"
}
]
}
...
...
...
]
}
Sendet allen Clients im Tunier updates wenn andere Clients beitreten oder austreten
{
"message": "...",
"tournamentId": "id",
"currentSize": 1,
"bestOf": 5,
"players": [
{
"id": "playerId",
"username": "username"
}
]
}
Sendet allen Clients im Tunier updates über verschiedene Sachen (Tunier start/ende, Wechsel des Hosts, Matches, etc...)
{
"message": "...",
"tournamentId": "tournament id",
"currentSize": 2,
"status:": "status" // "IN_PROGRESS" | "FINISHED" | "WAITING_FOR_MORE_PLAYERS"
"players": [
{
"id": "player id",
"username": "player username",
"score": 2 // gewonnene matches
}
...
...
...
],
"winner": { // kann auch null sein
"id": "winner id",
"username": "winner username",
"score": 2
},
"host": {
"id": "hostId",
"username": "host username"
}
}
Wichtig:
match:invite
ist deaktiviert worden da die Python Clients keine Acknowledgments auf broadcast emits senden können
Sendet einem Spieler, der sich in einem laufenden Turnier befindet und auf ein neues Spiel wartet, eine Einladung zu einem Match.
Die Einladung muss per Acknowledgment in 10 Sekunden angenommen werden
{
"message": "....",
"matchId": "match id",
"players": [
// Array hat immer eine länge von 2
{
"id": "player1 id",
"username": "player1 username"
},
{
"id": "player2 id",
"username": "player2 username"
}
],
"invitationTimeout": 1683482639 // Zeitpunkt wann die Einladung abläuft, in Unixzeit
}
Acknowledgment Payload
{
"accepted": true, // boolean
"id": "player id" // id des Spielers
}
Client Beispiel in JavaScript
socket.on("match:invite", (data, ack) => {
console.log(data);
{ accepted: true, id: "my id" });
});
Sendet den Spielern Informationen über verschiendene Events wie den Spielstart, Ablehnung der Match Einladung des Gengners, Fehlern im Matchmaking, Erfolg der Match Suche, Match Ende, etc....
{
"message": "...",
"tournamentId": "tournament id",
"match": {
"id": "match id",
"round": 0, // 0 - bestOf
"bestOf": 5,
"status": "match status", // "PENDING" | "IN_PROGRESS" | "FINISHED"
"opponents": [
{
"id": "player1 id",
"username": "player1 username",
"points": 0,
},
{
"id": "player2 id",
"username": "player2 username",
"points": 0,
}
],
"winner": {
{
"id": "winner id",
"username": "winner username",
"points": 0,
},
} // kann auch null sein
}
}
Fordert einen Spieler in einen aktiven Spiel auf einen Zug zu machen
Der zu machende Zug des Spielers muss in 10 Sekunden als Acknowledgment zum Server gesendet werden.
{
"message": "...",
"timeout": 1683482639 // Zeitpunkt des Timeouts, in Unixzeit
}
Acknowledgment Payload
{
"type": "put", // 'take' | 'put' | 'nope'
"card1": {
"type": "number", // "number" | 'joker' | 'reboot' | 'see-through' | 'selection';
"color": "red", // 'red' | 'blue' | 'green' | 'yellow' | 'red-yellow' | 'blue-green' | 'yellow-blue' | 'red-blue' | 'red-green' | 'yellow-green' | 'multi' | null. null wenn action oder joker karte
"value": 1, // null wenn action oder joker karte
"select": 1, // 1 oder -1 null wenn keine selection karte
"selectValue": 1, // null wenn keine selection karte
"selectedColor": "red" // 'red' | 'blue' | 'green' | 'yellow' | null;
},
"card2": {
...
},
"card3": {
...
},
"reason": "Because I can!" // Begründung des Zuges
}
Wird einen Spieler in einen aktiven Spiel geschickt wenn sich der Stand des Spielers ändert.
{
"matchId": "match id",
"gameId": "game id",
"topCard": {}, // oberste Karte, sehe ICard Type unten
"lastTopCard": {}, // letzte obere Karte
"drawPileSize": 19,
"players": [
{
"id": "player1 id",
"username": "player1 username",
"handSize": 4
},
{
"id": "player2 id",
"username": "player2 username",
"handSize": 3
}
],
"hand": [{}, {}], // ICard Array
"handSize": 4,
"currentPlayer": {
"id": "player1 id",
"username": "player1 username"
},
"currentPlayerIdx": 0,
"prevPlayer": {
"id": "player2 id",
"username": "player2 username"
},
"prevPlayerIdx": 1,
"prevTurnCards": [{}, {}], // ICards array
"lastMove": {} // Von Type Move (siehe unten) oder null
}
Wird einen Spieler in einen aktiven Spiel geschickt wenn das Spiel endet oder ein Spieler disqualifiziert wird
{
"message": "...",
"winner": {
"id": "winner id",
"username": "winner username",
"points": 0
}
}
interface ICard {
type: 'number' | 'joker' | 'reboot' | 'see-through' | 'selection';
color:
| 'red'
| 'blue'
| 'green'
| 'yellow'
| 'red-yellow'
| 'blue-green'
| 'yellow-blue'
| 'red-blue'
| 'red-green'
| 'yellow-green'
| 'multi'
| null; // null for action cards or joker
value: number | null; // null for action cards or joker
select?: number | null; // is only not null if the selection card is played
selectValue?: number | null;
selectedColor?: 'red' | 'blue' | 'green' | 'yellow' | null;
}
interface Move {
type: 'take' | 'put' | 'nope';
card1: ICard | null;
card2: ICard | null;
card3: ICard | null;
reason: string;
}