A Teletype Games blogja BBS-ként: a legfrissebb posztok és a kategóriák, egy poszt képernyőnként lapozva. A szerkesztők ugyanezen a vonalon lépnek be, és írnak, szerkesztenek, törölnek posztokat.
Elérhető:
teletypegames.org:2328, böngészőben pedig a bbsweb-en, és a TTG Gate BBS-en át is
Ruby alkalmazás a rubbs gemre építve, mint a Teletype BBS, az Alexandria BBS és a Feedia BBS. Egy porton két arca van, és mindkettő soralapú, ablakok nélkül:
A menük, a listák, a mezők és a teljes képernyős szerkesztő mindkettőn ugyanazok. A hívás a rubbs BBS::Terminal kérdésével indul: a RETURN elfogadja a tippet, az 1 a modernt, a 2 a C64-et választja.
| Billentyű | Művelet |
|---|---|
L |
Legfrissebb posztok, a legújabb elöl |
C |
Kategóriák a posztszámukkal, aztán a kategória posztjai |
G |
Ugrás egy posztra a száma alapján (a weben a poszt mellett látszik) |
E |
Szerkesztői belépés |
Q |
Kilépés |
A listák számozottak: a szám és RETURN megnyit egy posztot, a RETURN magában lapoz, a Q vagy a ← visszalép. Egy poszt mutatja a címét, kategóriáját, dátumát és szerzőjét, az utolsó módosítás dátumát, az összefoglalót, aztán a törzsét (Markdown), képernyőnként lapozva.
A C64-en minden képernyő kitölti a teljes 40×25-öt: a menük és a listák kurzoros menük (a CRSR mozgatja a sávot, a RETURN választ, a billentyűk is működnek), alul egy inverz lábléccel, ami megmondja a képernyő billentyűit. A kezdőlap annyi friss posztot mutat, amennyi kifér. Egy poszt minden oldalán ott marad a lábléc: a RETURN, a + vagy a CRSR le lapoz, a - vagy a CRSR fel visszalapoz, a Q vagy a ← kilép; szerkesztőnek a lábléc fölötti sorban ott az E szerkesztés, a P publikálás és a D törlés, a kérdések a láblécben jönnek a poszt fölött, és szerkesztés vagy publikálás után a poszt újra megjelenik.
Belépés után a menüben ott van az U nem publikált posztok, a W új poszt, a P jelszócsere és az O kilépés a szerkesztőből, és minden poszt alatt az E szerkesztés, a P publikálás vagy visszavonás és a D törlés.
Egy új poszt nem publikált: csak a szerkesztők látják (a listákban jelölve), az olvasók és a web nem. Egy új poszt mentés után nem publikált marad; a poszt alatti P publikálja. Az első publikálás beírja a published_at-ot és jelez a Discordra; visszavonás és újrapublikálás után nem jelez még egyszer. Egy új poszt sorban bekéri a címet (legfeljebb 80 karakter), a kategóriát, az egysoros összefoglalót (legfeljebb 280) és a törzset, aztán mutatja a piszkozatot: T cím, C kategória, S összefoglaló, B törzs, V előnézet, W mentés, Q kilépés.
Amit egy szerkesztő ír, az a mentésig piszkozatként megmarad, így egy megszakadt kapcsolat sem visz el semmit. A piszkozat minden mező után mentődik, a szerkesztőben 15 másodpercenként, ha változott a szöveg (TTG_BLOG_BBS_AUTOSAVE_SECONDS), és bontáskor is. Az első változáskor jön létre, így ha csak megnyitsz egy posztot és kilépsz, nem marad utána piszkozat. A piszkozatot csak a szerkesztés látja: a listák, a számlálók, a G és a web nem.
W ment: egy szerkesztés beíródik a posztjába, és a piszkozat törlődik; egy új poszt piszkozatából maga a poszt lesz, nem publikáltan.Q változás után rákérdez: a K megtartja a piszkozatot későbbre, a D eldobja, a RETURN (C64-en a back) visszavisz a piszkozathoz.E egy listával indul; a W ugyanígy, ha vannak új posztokhoz tartozó piszkozatok. A lista első sora a poszt mostani állapota (illetve egy új poszt), alatta a piszkozatok idővel és szerzővel, a legutóbbi elöl. A D eldob egyet (modern terminálon a D után a számát kell beírni). Minden szerkesztő látja az összes piszkozatot; a menüben a W mellett látszik, hány új posztos piszkozat vár.W rákérdez, mielőtt felülírja az ő mentését.A név, a jelszavak és a cím a rubbs egy mezőjében (BBS::Field), az összefoglaló és a törzs a teljes képernyős szerkesztőjében (BBS::Editor) készül. Mindkettő a meglévő szövegből indul, így egy cím vagy egy poszt szerkeszthető, nem kell újragépelni: a kurzorbillentyűk bárhová mozognak, a gépelés a kurzornál szúr be, a DEL előtte töröl, a szerkesztő pedig gépelés közben tördeli a sorokat. A mező RETURN-re zárul; a RUN/STOP vagy a ← (Esc) kilép belőle.
| Billentyű a szerkesztőben | Művelet |
|---|---|
| kurzorbillentyűk | Mozgás; fel-le az oszlop marad |
| HOME / END | A képernyősor eleje / vége |
| PgUp / PgDn | Egy képernyőnyit fel / le (modern terminál) |
RUN/STOP vagy ← (Esc), majd S |
Mentés |
RUN/STOP vagy ← (Esc), majd Q |
Kilépés, a szöveg a régi marad |
| F1 (Ctrl-S) | Azonnali mentés (a C64 Ultimate UltimateTermje az F1-et a súgójának tartja meg) |
Az összefoglaló egy bekezdés: a RETURN menti. A törzsben a RETURN új sort, az üres sor új bekezdést kezd (Markdown).
A posztok a teletypegames.org/blog blogja, az oldal mindkét nyelvén ugyanazok. Minden poszt mutatja a számát, hogy milyen terminálról gépelték (ANSI vagy C64), és van egy C64-képernyő nézete (?view=c64): azok a sorok, amiket egy Commodore 64-es hívó lát, C64-palettával. Mellette egy kártya tárcsázza a boardot böngészőben (bbsweb, modern vagy C64-ként), a telnet-paranccsal és a G + posztszámmal. Az oldal RSS-e (/api/v1/rss/blog) is ezeket hozza.
A board csak olvasható HTTP-n szolgálja ki őket, ugyanabban a folyamatban, mint a telnetvonalat (Web::Api, 8080-as port). A konténer az interstack hálózatra is csatlakozik, és az oldal API-ja ott olvassa: http://ttg-blog-bbs:8080 (TTG_BLOG_BBS_URL); a port kifelé nincs publikálva.
| Kérés | Válasz |
|---|---|
GET /posts |
a publikált posztok, a legújabb elöl, törzs nélkül |
GET /posts/SLUG |
egy poszt: Markdown, HTML (kramdown, GFM) és a C64-képernyő |
GET /categories |
a kategóriák a posztszámukkal |
GET /health |
{"ok":true} |
Egy poszt mentéskor kapja meg a slugját: a dátuma és a címe sima ASCII-ben (2026-10-28-hello-world). A cím átírásakor nem változik, így a linkek nem törnek el. Ha a stack .env-jében van TTG_BLOG_BBS_DISCORD_WEBHOOK, egy új poszt a linkjével Discordra is kimegy.
A kategóriák a config/categories.yml-ből jönnek (id, name, about): News, Devlog, Releases, Retro, Events. A módosítás egy commit ebbe a fájlba; a masterre pusholva élesedik. A poszt az id-jével hivatkozik a kategóriára.
A szerkesztők és a posztok egy SQLite-fájlban vannak, a stack data/ttgblog.sqlite3-jában (users, posts a slug-gal, face-szel, status-szal (draft, unpublished, published), published_at-tel, created_at-tel, updated_at-tel, piszkozatnál original_id-vel és base_updated_at-tel). A jelszavak PBKDF2-SHA256 digestek; három rossz belépés után az adott hívásban nincs több próbálkozás. A szerkesztőket a szerveren kezeled:
docker exec -it ttg-blog-bbs bin/user add NÉV # kétszer kéri a jelszót
docker exec -it ttg-blog-bbs bin/user passwd NÉV
docker exec -it ttg-blog-bbs bin/user remove NÉV # a posztjai maradnak, szerző nélkül
docker exec ttg-blog-bbs bin/user list
A masterre pusholva Woodpeckerből élesedik (RuboCop, compose-ellenőrzés, ci-deploy ttg-blog-bbs); a konténer ttg-blog-bbs, a /srv/stacks/ttg-blog-bbs-ban, a data/ megmarad a deployok között. Az entrypoint induláskor frissíti a rubbs-t.