Memento is a high-score server. It can also save your replay (or other binary) data.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
controllers
models
.dockerignore
.gitignore
Dockerfile
LICENSE
README.md
main.go

README.md

Memento

Docker Automated build

Memento is a high-score server. It can also save your replay (or other binary) data.

Installation

Docker

Run the fcingolani/memento image hosted on Docker Hub:

docker run -ti -p 3000:3000 fcingolani/memento

Usage

  1. Add a new score
> curl -i http://127.0.0.1:3000/scores -X POST -d "player_name=fcingolani&level_number=1&level_version=1&value=6500"
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Date: Wed, 26 Jul 2017 03:12:15 GMT
Content-Length: 177

{
  "id": 1,
  "playerName": "fcingolani",
  "levelNumber": 1,
  "levelVersion": 1,
  "value": 6500,
  "file": {
    "uploadTicket": "ce9584ad-0778-49f5-82a1-1f646121c967"
  }
}
  1. Upload binary data
> md5sum facepalm.png # just to check it later
0ad78e9490f2fe31e6275d91cd56ceb1 *facepalm.png

> curl -i http://127.0.0.1:3000/files/1/data -X PUT --data-binary "@facepalm.png" -H "x-file-upload-ticket: ce9584ad-0778-49f5-82a1-1f646121c967"
HTTP/1.1 100 Continue

HTTP/1.1 200 OK
Date: Wed, 26 Jul 2017 03:50:55 GMT
Content-Length: 0
Content-Type: text/plain; charset=utf-8
  1. Find a score to beat
> curl -i "http://127.0.0.1:3000/scores/_beatable?level_number=1&level_version=1&value=7000&type=lower&has_file=true"
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Date: Wed, 26 Jul 2017 03:28:01 GMT
Content-Length: 101

{
  "id": 1,
  "playerName": "fcingolani",
  "levelNumber": 1,
  "levelVersion": 1,
  "value": 6500
}
  1. Fetch binary data
> curl -s http://127.0.0.1:3000/files/1/data | md5sum
0ad78e9490f2fe31e6275d91cd56ceb1 *-

A /check utility endpoint is provided, it'll respond with 200 OK so you can use it for health checks.

> curl -i http://localhost:3000/check
HTTP/1.1 200 OK
Date: Tue, 25 Jul 2017 20:40:58 GMT
Content-Length: 0
Content-Type: text/plain; charset=utf-8

Configuration

You can use the following environment variables to configure the server. You can also use a .env file.

Variable Description Default Value
CORS_ALLOWED_ORIGINS Comma separated list of allowed origins for CORS. Won't enable CORS if not set. Empty
DATABASE_PATH SQLite database path ./db.sqlite
DEBUG Enable or disable debug mode false
LISTEN_ADDRESS TCP address to listen on :3000
MAX_UPLOAD_BYTES Max allowed file upload size in bytes 1048576

FAQ

Why do you use 2 requests to save a replay, one to save the model and another to upload the file?

This was made for a friend who uses GameMaker. GM's http library doesn't support multipart requests.

Todo

Not in priority order

  • ☐ Add Swagger file.
  • ☐ Add a security middleware.
  • ☐ Add MySQL support.
  • ☐ Add PostgreSQL support.
  • ☐ Add CORS support.
  • ☐ Better error descriptions.
  • ☑ Limit file uploads.
  • ☑ Change "time" for "value".
  • ☑ Add parameter to _beatable so you can choose if you want a bigger or smaller score to beat.
  • ☑ Further separate file uploads endpoints from score metadata.
  • ☑ Add parameter to _beatable to filter scores that have a file.