184 lines
3.5 KiB
Markdown
184 lines
3.5 KiB
Markdown
# Peddlers of Ketran
|
|
|
|
This project consists of both the front-end and back-end game
|
|
API server.
|
|
|
|
The front-end is launched from the 'client' directory in development mode via 'npm start'. In production, you build
|
|
it via 'npm build' and deploy the public front-end.
|
|
|
|
The back-end is launched out of the 'server' directory via 'npm start' and will
|
|
bind to the default port 8930.
|
|
|
|
If you change the default port of the REST API server, you will need to change
|
|
client/package.json's "proxy" value to reflect the new port change.
|
|
|
|
NOTE:
|
|
|
|
Board.js currently hard codes assetsPath and gamesPath to be absolute as the
|
|
dynamic router and resource / asset loading isn't working correctly.
|
|
|
|
## Building
|
|
|
|
### Native
|
|
|
|
#### Prerequisites
|
|
|
|
```bash
|
|
sudo apt-get install -y nodejs npm python
|
|
sudo -E npm install --global npm@latest
|
|
```
|
|
|
|
### In container
|
|
|
|
```bash
|
|
```
|
|
|
|
# Architecture
|
|
|
|
```plantuml
|
|
skinparam componentStyle rectangle
|
|
|
|
component "Server" as server
|
|
component "Resources" as res
|
|
component "Client" as client
|
|
component "Game" as game
|
|
component "Player" as player
|
|
|
|
package "Game" as game {
|
|
component Players as players
|
|
}
|
|
|
|
server <-> resource : serves to client
|
|
client <-> server
|
|
player <-> client
|
|
players -r-> player
|
|
server -> game
|
|
```
|
|
|
|
# Ketr.Ketran REST API
|
|
|
|
## POST /api/v1/game
|
|
|
|
### Request
|
|
|
|
```json
|
|
{}
|
|
```
|
|
|
|
### Response
|
|
|
|
```json
|
|
{
|
|
gameId: id
|
|
gameState: {
|
|
tiles: []
|
|
}
|
|
}
|
|
```
|
|
|
|
# Configuring / installing
|
|
|
|
## Build
|
|
|
|
```bash
|
|
git clone git.ketrenos.com:jketreno/peddlers-of-ketran.git
|
|
cd server
|
|
npm install
|
|
npm start &
|
|
cd ../client
|
|
npm install
|
|
npm start
|
|
```
|
|
|
|
## Install
|
|
|
|
```bash
|
|
export BASEPATH=${PWD}
|
|
# Ensure sudo has password ready
|
|
sudo -l
|
|
envsubst BASEPATH < install/ketr.ketran | sudo tee /etc/logrotate.d/ketr.ketran
|
|
envsubst BASEPATH < install/ketr.ketran.service | sudo tee /etc/systemd/system/ketr.ketran.service
|
|
sudo systemctl daemon-reload
|
|
```
|
|
|
|
Install the following into your nginx server configuration:
|
|
|
|
```nginx
|
|
location /ketr.ketran {
|
|
root /var/www/ketrenos.com;
|
|
index unresolvable-file-html.html;
|
|
try_files $uri @index;
|
|
}
|
|
|
|
# This seperate location is so the no cache policy only applies to the index and nothing else.
|
|
location @index {
|
|
root /var/www/ketrenos.com/ketr.ketran;
|
|
add_header Cache-Control no-cache;
|
|
expires 0;
|
|
try_files /index.html =404;
|
|
}
|
|
|
|
location /ketr.ketran/api {
|
|
proxy_pass http://192.168.1.78:8930;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
proxy_set_header Host $http_host;
|
|
proxy_set_header X-NginX-Proxy true;
|
|
proxy_pass_header Set-Cookie;
|
|
proxy_pass_header P3P;
|
|
proxy_http_version 1.1;
|
|
proxy_set_header Upgrade $http_upgrade;
|
|
proxy_set_header Connection "upgrade";
|
|
}
|
|
```
|
|
|
|
Add security tokens in ketr.ketran/config/local.json:
|
|
|
|
```bash
|
|
cat << EOF > config/local.json
|
|
{
|
|
"tokens": [ {
|
|
"$(whoami)": "$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32};echo;)"
|
|
} ]
|
|
}
|
|
EOF
|
|
```
|
|
|
|
## Launch
|
|
|
|
```bash
|
|
sudo systemctl start ketr.ketran
|
|
```
|
|
|
|
## To test
|
|
|
|
### New game
|
|
```bash
|
|
curl -k -s -X POST http://localhost:8930/ketr.ketran/api/v1/games/
|
|
```
|
|
|
|
### Game status
|
|
|
|
```bash
|
|
curl -k -s -X GET http://localhost:8930/ketr.ketran/api/v1/games/:id
|
|
```
|
|
|
|
# States
|
|
|
|
Chat is available at all times by registered players
|
|
|
|
## Lobby
|
|
|
|
|
|
* Register session+name
|
|
* Register session with color
|
|
* Unregister player+name from color
|
|
* Roll dice for player position
|
|
* Shuffle board
|
|
* Set "Ready" for player
|
|
* All ready? state == active
|
|
|
|
## Active
|
|
|
|
* |