173 lines
6.0 KiB
Markdown
173 lines
6.0 KiB
Markdown
# cl-deck-builder2
|
|
|
|
## About
|
|
|
|
This is a project to...
|
|
|
|
- Build TCG decks: "The Deck Builder"
|
|
- Keep track of TCG inventory: "The Inventory Manager"
|
|
- Support sale of TCG Inventory via "The Deck Builder"
|
|
|
|
It's a [Caveman2](https://github.com/fukamachi/caveman) web app, written in [Common Lisp](https://lisp-lang.org/).
|
|
|
|
The entire application may be built and run inside a [Docker](https://www.docker.com/) container.
|
|
|
|
You may access a live instance at [https://phntsm.ddns.net/](https://phntsm.ddns.net/).
|
|
|
|
## Usage
|
|
|
|
There are three components to this project. "The Inventory Manager",
|
|
"The Deck Builder," and "The User Interface". The Deck Builder sources
|
|
in-stock products from the Inventory Manager. When the Deck Builder
|
|
constructs a Deck, it keeps a record of which cards are located in
|
|
which decks. When a Deck is purchased, this information can be updated
|
|
via a web interface. The User Interface is a convenient front-end.
|
|
|
|
The project may be used by loading a Docker image, loading the code
|
|
directly into a Lisp sytem like [SBCL](http://sbcl.org/), or using a
|
|
development environment like [Portacle](https://portacle.github.io/).
|
|
|
|
Once loaded, follow the code below to start the development
|
|
environment, or, if you're using the Docker image, simply type:
|
|
|
|
```bash
|
|
% make docker-build
|
|
% make docker-run
|
|
```
|
|
|
|
## Installation
|
|
|
|
First, set up [SBCL](http://sbcl.org/) and [Quicklisp](https://www.quicklisp.org/beta/).
|
|
|
|
If you're using [Portacle](https://portacle.github.io/), you should be all set already, just clone the repository.
|
|
|
|
Clone the master repository from
|
|
[http://phntsm.ddns.net/git/cl-deck-builder.git/](http://phntsm.ddns.net/git/cl-deck-builder.git/):
|
|
|
|
```bash
|
|
% cd ~/quicklisp/local-projects/
|
|
git clone http://phntsm.ddns.net/git/cl-deck-builder.git/
|
|
```
|
|
|
|
```lisp
|
|
;; You may have to push whatever directory you're in to *LOCAL-PROJECT-DIRECTORIES*
|
|
(push #P"~/code/cl-deck-builder2/" ql:*local-project-directories*)
|
|
|
|
;; Load cl-deck-builder2 and tests
|
|
(ql:quickload '(:cl-deck-builder2 :cl-deck-builder2-test))
|
|
|
|
;; cl-deck-builder2.asd finds src/package.lisp which contains package
|
|
;; definition - switch to this package for development.
|
|
(in-package :cl-deck-builder2)
|
|
|
|
;; Start the server:
|
|
;; in src/main.lisp we define a custom function, MY/START, that will
|
|
;; INVOKE-RESTART if the server is already running.
|
|
;;
|
|
;; IPv4
|
|
(my/start :address "0.0.0.0" :port 5001 :server :woo)
|
|
;; IPv6
|
|
(my/start :address "::" :port 5001 :server :woo)
|
|
|
|
;; For development session:
|
|
(use-package '(:cl-deck-builder2.db
|
|
:cl-deck-builder2.draw
|
|
:cl-deck-builder2.models
|
|
:cl-deck-builder2.toolkit
|
|
:cl-deck-builder2-test))
|
|
```
|
|
|
|
### Requirements
|
|
|
|
You'll need Quicklisp, and the dependencies listed in the ASDF System
|
|
Definition file, as well as the following system libraries installed.
|
|
|
|
```bash
|
|
# Install Software
|
|
% apt install build-essential git jq sbcl
|
|
% apt install nginx fcgiwrap libev-dev sqlite3 libsqlite3-dev collectd imagemagick ruby ruby-sidekiq
|
|
|
|
# For source code hosting
|
|
% apt install cgit python3-pygments python3-markdown
|
|
```
|
|
|
|
- [What is build-essential Ubuntu, how to install and use it?](https://linuxhint.com/install-build-essential-ubuntu/)
|
|
- [git](https://git-scm.com/): Version Control
|
|
- [jq](https://jqlang.github.io/jq/): Parsin JSON files on the command line
|
|
- [SBCL](http://sbcl.org/): Lisp Implementation
|
|
- [NGINX](https://www.nginx.com/): Web Server for HTTP, HTTPS, IPv4, IPv6, other services can be forwarded behind NGINX as well
|
|
- [fcgiwrap](https://www.nginx.com/resources/wiki/start/topics/examples/fcgiwrap/): Simple FastCGI wrapper for CGI scripts (The project runs as a CGI script)
|
|
- [libev](http://software.schmorp.de/pkg/libev.html): Event loop used by [woo](https://github.com/fukamachi/woo)
|
|
- [sqlite3](https://www.sqlite.org/index.html): In-memory database store
|
|
- [collectd](https://collectd.org/): collectd is a daemon which collects system and application performance metrics periodically and provides mechanisms to store the values in a variety of ways, for example in RRD files. This also nets us [RRDtool](https://oss.oetiker.ch/rrdtool/) which we can use for charts and graphs.
|
|
- [ImageMagick](https://www.imagemagick.org/): We use this to generate deck images and other various image manipulations.
|
|
- [Ruby](https://www.ruby-lang.org/en/): We use the [Sidekiq](https://sidekiq.org/) job scheduler, which is written in Ruby.
|
|
|
|
You may want to set up [cgit](https://git.zx2c4.com/cgit/) git web.
|
|
|
|
There is also a `Dockerfile` with a `Makefile`.
|
|
|
|
## Author
|
|
|
|
_Bubblegumdrop <staticsunn@gmail.com>_
|
|
|
|
## Copyright
|
|
|
|
Copyright (c) 2024 Bubblegumdrop
|
|
|
|
## License
|
|
|
|
GPLv3+
|
|
|
|
## Localization Workflow
|
|
|
|
`lisp.pot` contains the string to translate that were extracted from
|
|
the `.lisp` files.
|
|
|
|
`djula.pot` contains the strings to transtlate that were extracted
|
|
from the djula templates.
|
|
|
|
gettext is the default translation engine.
|
|
|
|
### Update Translations
|
|
|
|
To build the translations:
|
|
|
|
# Extract all {_ ... _} sequences from Djula templates
|
|
make locale/templates/LC_MESSAGES/djula.pot
|
|
|
|
# Extract all (_ ... _) sequences from LISP code
|
|
make locale/templates/LC_MESSAGES/lisp.pot
|
|
|
|
# Produce combined project template for translation
|
|
make locale/templates/LC_MESSAGES/cl-deck-builder2.pot
|
|
|
|
... make your translation edits to cl-deck-builder2.pot ...
|
|
|
|
### Compile Translations
|
|
|
|
To Produce the `.mo` files, add your language to `LOCALES` in the
|
|
`Makefile` then update the translations with the `tr` target:
|
|
|
|
LOCALES := en_US ja_JP
|
|
|
|
# Produce the translations
|
|
make tr
|
|
|
|
The default `LANG` is currently `en_US` in `view.lisp`:
|
|
|
|
(defun render (template-path &optional env (lang "en_US"))
|
|
"Use Djula to render a template."
|
|
(let ((template (gethash template-path *template-registry*)))
|
|
(unless template
|
|
(setf template (djula:compile-template* (princ-to-string template-path)))
|
|
(setf (gethash template-path *template-registry*) template))
|
|
(with-locale (lang)
|
|
(apply #'djula:render-template*
|
|
template nil
|
|
env))))
|
|
|
|
## TODO
|
|
|
|
See [todo.md](doc/todo.md)
|