Skip to content

Exports games and frames into various formats

License

Notifications You must be signed in to change notification settings

BattlesnakeOfficial/exporter

Repository files navigation

Battlesnake Game Exporter

Generate images and animations from Battlesnake games and snakes.

Local Development

Install

brew install go@1.17

Or install manually from https://go.dev/dl/.

Inkscape

The exporter uses inkscape (version 1.1+) to convert SVGs to PNG format. If Inkscape is not present, the exporter will gracefully handle this by rendering default tails/heads using a local PNG file. You don't have to have inkscape installed to use the exporter unless you want custom heads or tails.

ALSO, some tests which cover functionality that includes SVG rendering will fail unless you have inkscape installed locally.

Inkscape is a freely available, cross-platform tool which you can easily install:

Building

local

go build -o bin/exporter cmd/exporter/main.go

docker

docker build . -t exporter

Running the server

local

export PORT=8000 # optional port override

./bin/exporter

docker

docker run -it -p 8000:8000 exporter:latest

Running the tests

go test ./...

Note: some tests may fail if inkscape is not available or if you have the wrong version of inkscape installed (pre 1.x versions of inkscape won't work)

Endpoints

/avatars/{customation_key:customization_value}/{width}x{height}.svg

Exports a Battlesnake avatar with the provided customizations.

Currently there are 3 customizations possible:

  • head allows you to pick from one of the available head options
  • tail allows you to pick from one of the available tail options
  • color allows you to choose any valid hex code colour. The value must be passed in as a 7 character value like #cc0033. Note that the # character must be url encoded as %23

curl example of requesting a single customization

curl -i http://localhost:8000/avatars/head:beluga/500x100.svg

curl example of requesting all customization keys

curl -i http://localhost:8000/avatars/head:beluga/tail:fish/color:%2331688e/500x100.svg

/games/{game id}/{width}x{height}.gif

Exports the game as an animated gif sized width pixels wide and height pixels high.

See GIF size validation for details about how to choose a valid GIF resolution

/games/{game id}/frames/{frame number}/{width}x{height}.gif

Exports the game as an animated gif sized width pixels wide and height pixels high.

See GIF size validation for details about how to choose a valid GIF resolution

/games/{game id}/frames/{frame number}.txt

Exports a specific frame as an ASCII string.

Choose a GIF size

GIF sizes are restricted to a limited set of options based on the game board being exported. Additionally, there is an upper-limit of a maximum resolution of 504x504 (254016 pixels) which supersedes the calculation of available options.

At the time of this writing, the options are:

  • 10 pixels per board square (+ 4 pixels for border)
  • 20 pixels per board square (+ 4 pixels for border)
  • 30 pixels per board square (+ 4 pixels for border)
  • 40 pixels per board square (+ 4 pixels for border)

These options may change. If you need an up-to-date list, look at allowedPixelsPerSquare in handlers.go for an authoritative list of allowed resolutions.

Using the above, you can determine the available GIF dimensions that you can request.

Examples:

  • allowed sizes allowed for 11x11 board are:
    • 114x114 (10 pixels per board square)
    • 224x224 (20 pixels per board square)
    • 334x334 (30 pixels per board square)
    • 444x444 (40 pixels per board square)
  • allowed sizes allowed for 19x19 board are:
    • 194x194 (10 pixels per board square)
    • 384x384 (20 pixels per board square)
    • 574x574 (30 pixels per board square) (Disallowed because it exceeds 504x504)
    • 764x764 (40 pixels per board square) (Disallowed because it exceeds 504x504)
  • etc...

Caching

By default all exported objects are set to be cached by the browser for 24 hours.

Feedback

  • Do you have an issue or suggestions for this repository? Head over to our Feedback Repository today and let us know!