A rubbs a Ruby gemünk telnetes üzenőfalak (BBS-ek) építéséhez: egy belépő párbeszéd tíz sorból, egy ablakos, menüs, egérrel kezelhető teljes képernyős board néhány százból, és ugyanaz a board Commodore 64-en, ugyanazon a porton. A BBS-hálózatunk mind a tizenegy boardja ezen fut. Ez a kézikönyv a rubbs 1.0.0-t írja le. Minden osztálya és metódusa dokumentálva van a forrásban: az API-referencia (RDoc) minden kiadási taggel újraépül belőle.
Flow a soronkénti párbeszédekhez (belépés, varázslók), Application egy asztalhoz ablakokkal, menükkel és widgetekkel, és a PETSCII Screen a Selector kurzoros menüivel egy soralapú boardhoz, Commodore 64-en vagy modern terminálon; a hívás szabadon jár köztük.session.petscii! 40×25-ös PETSCII-re állítja a vonalat, a kód közben ugyanúgy UTF-8-at és ANSI-t ír; a BBS::Terminal minden hívótól megkérdezi, milyen terminálról hív, és a modern vagy a C64-es arcot indítja.FakeOS), flow-k és bármilyen program doorként, telnet-gatewayek, amik egy másik boardnak adják tovább a vonalat (egy C64 akár ASCII-boardot is felhívhat), ZMODEM- és XMODEM-letöltés.| Oldal | Mit találsz ott |
|---|---|
| Minimális projekt | A legkisebb teljes projekt: kérdés-válasz board négy fájlban, Dockerfile, compose, futtatás Windowson, Linuxon és macOS-en |
| Első lépések | Telepítés, az első board, a BBS.configure minden beállítása, a szerver, egy valódi board projektszerkezete, Docker |
| Flow | A soronkénti párbeszéd DSL-je lépésről lépésre: ask, say, menu, confirm, gate, persist, call, screenek, bannerek, al-flow-k |
| Application | Az asztal: az application DSL, menüsor, státuszsor, helperek és service-ek, a futási ciklus, események és fókusz |
| Window-k | Window-k és a window DSL; Info, Form, MasterDetail, Stream; dialógusok; nagyítás, mozgatás, méretezés, váltás |
| Widgetek | Minden widget és konténer, jelenetek, és saját widget írása |
| Rajzolás | Témák és színszerepeik, a paletta, a FrameBuffer, a renderelő, Markdown |
| Doorok | Doorok, szimulált gépek (FakeOS), telnet-gatewayek (Gateway), ZMODEM és XMODEM |
| AI-karakterek | Personák, a modellkliens, chat előzményekkel és tartalékválaszokkal, az írógép |
| Commodore 64 | PETSCII, a terminálkérdés, a PETSCII Screen és a Selector, és egy board modern és C64-es arccal |
| Rajzok és grafikus képernyők | Rajzok YAML-ben mindkét arcra, a C64 grafikus vászna és kurzoros menü rajta, élő hotspotos jelenetek, évszak-rétegek, art-preview |
| Telnet és a store | A session: negotiation, billentyűk, egér, sorok, korlátok; a BBS::Store SQLite-on |
| Adat és hálózat | BBS.log, BBS.background, BBS::SQLite, HTTP, Cache, RateLimit, Wikipedia, Text, Address, és hogy hol kezeljük a hibát |
| Változásnapló | Mit hozott az egyes verzió, és mit vett ki az 1.0 |
A gem neve bbs. Figyel egy TCP-porton, minden hívóval lefolytatja a telnet-negotiationt, mindegyiknek ad egy Session-t, és futtatja a beállított flow-t:
require 'bbs'
BBS.configure do |c|
c.log_tag = 'my-bbs'
c.flow = BBS::Flow.define do
big_banner 'My BBS'
ask :name, prompt: 'Your name'
say 'Welcome!', style: :success
end
end
BBS.start
ruby bbs.rb, aztán telnet localhost 2323. Innen az Első lépések épít belőle ablakos, C64-es arcú boardot.
| Réteg | Mi ez | Mire jó |
|---|---|---|
BBS::Flow |
soronkénti párbeszéd, lépésenként deklarálva | belépés, regisztráció, varázslók, a hívás ragasztója |
BBS::Application |
asztal: menüsor, window-k, widgetek, egér | egy egész board modern terminálon |
BBS::Petscii::Screen + BBS::Selector |
soralapú képernyő 40×25-ben (vagy a modern terminál méretében): címsor, lapozás, kurzoros menük, promptok, szerkesztő | egy board C64-es arca, vagy egy egész soralapú board |
A hívás többnyire egy flow-val indul (a terminálkérdés, a belépés), és egy applicationben vagy egy PETSCII-képernyőn folytatódik; a doorok és gatewayek kilépnek belőle, majd visszatérnek. Az 1.0 előtt volt egy negyedik réteg is, a BBS::TUI, egyetlen teljes képernyős oldalakhoz; egyik board sem használta, és az 1.0 kivette (lásd a Változásnaplót).
flowchart LR
S[TCP-szerver] --> SE[Session: telnet, ablakméret]
SE --> F[Flow]
F --> A[Application]
F --> P[PETSCII Screen + Selector]
A <--> D[Door: FakeOS, Flow, program]
A <--> G[Gateway: egy másik board]
P <--> G
F --> F2[Al-flow]
| Board | Mit ad neki a rubbs |
|---|---|
Teletype BBS :2323 |
az egész asztalt és a PETSCII-arcát; a SERMO és a Chat of Ra AI-karakteres FakeOS-door, a C64 és a Plus/4 door FakeOS-gép |
Impostor BBS :2324 |
egy flow saját screenekkel, gemben, így egy másik board doorként is futtathatja |
TTG Wiki BBS :2325 |
kétpaneles wikiböngésző a wiki JSON API-ja fölött |
Alexandria BBS :2326 |
a Wikipédia (BBS::Wikipedia) master-detail window-kban, és PETSCII-ben |
Feedia BBS :2327 |
RSS-olvasó űrlapokkal az adminoknak, és PETSCII-ben |
TTG Blog BBS :2328 |
blog BBS::SQLite-on, soralapúan mindkét arcon |
WarpEngine BBS :2329 |
a C64- és Plus/4-polc, ZMODEM- és XMODEM-letöltéssel |
Scriptorium BBS :2330 |
a Project Gutenberg könyvei BBS::HTTP-n és BBS::Cache-en át |
Commodex BBS :2331 |
C64-es játékok a Wikidatából és a Wikipédiából, a tippek BBS::RateLimit-tel korlátozva |
Pixelia BBS :2332 |
ANSI- és PETSCII-galéria és egy közös vászon (Petscii::Canvas, Art) |
| TTG Gate BBS | egy port az egész hálózathoz és a világ boardjainak telefonkönyve, mind BBS::Gateway-jel (translate:, ha egy C64 ASCII-boardot hív) |
A 0.29.0 óta a rubbs-ban van, amit eddig minden soralapú boardunk maga írt meg. Mind benne van az API-referenciában; a Commodore 64 oldal munka közben mutatja őket.
| Osztály | Mi ez |
|---|---|
BBS::Petscii::Screen |
egy C64-es hívás 40×25-ös képernyője: title (fordított sáv), say(text, color:), rule(color:), page (oldalanként 20 sor, RETURN-re a következő, kérésre 2/5 oldalszám), pick (számozott BBS::Selector-lista), menu, actions (egy sor billentyű), choose (egy billentyű néhány közül), ask (BBS::Field), edit (BBS::Editor, nil, ha a hívó kilép), pause, key, bell, plain. A board saját metódusaihoz leszármaztatható; a cols:/rows: megadásával modern terminálon is használható |
BBS::Selector |
az egyetlen kurzoros menü: számozott, a kurzorbillentyűk és a számjegyek kijelölnek, a RETURN választ; a Flow menu-je, a Screen minden menüje és a vászon menüje is Selector, a színeit a Selector::COLORS adja |
BBS::Petscii::Colors |
a BBS::Ansi paletta C64-es nevei: WH YE CY LG GR DG LB BL GN RD PU OR, valamint RV/RO a fordított mód be/ki. A board névtér-moduljában a Colors.install(self) minden benne fészkelt osztálynak megadja a puszta neveket |
BBS::BlockFont |
a logók 3×5-ös blokkbetűje (A–Z, 0–9, szóköz és néhány jel): rows, half_blocks a modern archoz, petscii (fordított szóközök, soronként egy szín) a C64-hez; a NARROW_I és a WIDE_W a betűk másik alakja |
BBS::Goodbye |
a hívás utolsó képernyője: modern („Thanks for calling …”, NO CARRIER) és petscii (fordított sáv, majd kis szünetekkel +++, ATH0, NO CARRIER) |
BBS::DiscordWebhook |
Discord-webhookra posztol háttérszálon, mentionök nélkül, továbbítási korláttal (alapból 20 poszt 10 percenként), időkorláttal, a hibákat a board log tagje alatt naplózza; a require 'bbs/discord_webhook' önmagában tölti be, így egy board domainje is használhatja |
module UI
module Petscii
BBS::Petscii::Colors.install(self)
class Screen < BBS::Petscii::Screen
end
LOGO = BBS::BlockFont.petscii('WARP', colors: [LB, LB, CY, CY, WH], indent: 10)
end
end
screen = UI::Petscii::Screen.new(runner.session)
book = screen.pick('the shelves', books, &:title)
screen.say('Downloading…', color: YE)
BBS::Goodbye.petscii(screen, title: 'warpengine bbs', color: LB)
Az 1.0 a nagytakarítás kiadása: mindenre egyetlen út. Amit egy boardnak általában át kell írnia:
screen.say(text, GN) → screen.say(text, color: GN), screen.rule(DG) → screen.rule(color: DG);screen.editor(max, title) → screen.edit(title: title, max: max).to_s;Petscii::Screen::MENU → BBS::Selector::COLORS (vagy semmi: ez az alapértelmezés);public_only: false;BBS::TUI, a BBS::Color, a ProgressBar, Spinner, HBox, VBox, Panel, AnsiArt, a Flow-lépések többsége a call mellől, és a színekről elnevezett Flow-stílusok.A Változásnapló röviden felsorolja mindezt; a repó UPGRADING.md-je minden eltávolított vagy átnevezett API-t megad a helyettesítőjével és egy greppel, amely megtalálja.
gem 'bbs', git: 'https://git.teletypegames.org/engines/rubbs.git', tag: 'v1.0.0'
Ruby 3.2 vagy újabb (a socket időkorlátjaihoz IO#timeout= kell), a sqlite3 gemmel. A boardok taggel vagy git-revízióval rögzítik a rubbs-t a Gemfile.lock-jukban.
| Fájl | Feladat |
|---|---|
lib/bbs.rb |
a nyilvános felület: BBS.configure, BBS.config, BBS.start, BBS.log, BBS.background |
bbs/server.rb, bbs/session.rb, bbs/telnet.rb, bbs/telnet/ |
fogadó ciklus, hívónként egy szál; telnet (az egyetlen IAC-Parser), billentyűk, egér, sorok |
bbs/petscii.rb, bbs/petscii/, bbs/terminal.rb |
a C64-es vonal, az egyetlen jeltáblája és kódolója, a Screen, a vászon; a modern-vagy-C64 kérdés |
bbs/flow.rb, bbs/flow/, bbs/flow_runner.rb, bbs/banner.rb |
a Flow DSL, a lépésobjektumai és a futtatójuk; bannerek |
bbs/selector.rb, bbs/selector/ |
a kurzoros menü |
bbs/application.rb, bbs/menu.rb, bbs/statusbar.rb, bbs/focus_manager.rb, bbs/event.rb |
az Application-réteg |
bbs/widget.rb, bbs/container.rb, bbs/widgets/ |
widgetek, fájlonként egy |
bbs/window.rb, bbs/window_spec.rb, bbs/windows/*, bbs/dialogs.rb |
window-k, a window DSL, a kész window-k, dialógusok |
bbs/ansi.rb, bbs/theme.rb, bbs/theme/presets.rb, bbs/frame_buffer.rb, bbs/renderer.rb, bbs/markdown.rb |
a paletta és a rajzolás |
bbs/art.rb, bbs/season.rb, bin/art-preview |
rajzok mindkét arcra |
bbs/door.rb, bbs/fake_os.rb, bbs/gateway.rb, bbs/gateway/, bbs/zmodem.rb, bbs/xmodem.rb |
doorok, szimulált gépek, gatewayek, letöltés |
bbs/ai.rb |
AI-karakterek |
bbs/block_font.rb, bbs/goodbye.rb, bbs/discord_webhook.rb |
logóbetű, búcsú, Discord-webhook posztok |
bbs/sqlite.rb, bbs/store.rb, bbs/store/ |
SQLite migrációkkal; a rá épülő upsert-store |
bbs/http.rb, bbs/cache.rb, bbs/rate_limit.rb, bbs/wikipedia.rb, bbs/background.rb, bbs/text.rb, bbs/address.rb |
egy tartalmas board közös építőelemei |
engines/rubbs — MIT-licenc. A README.md-je az egyfájlos fejlesztői referencia, az UPGRADING.md az út 0.x-ről 1.0-ra; ez a kézikönyv a vezetett változat.