Хрестики-нулики на DNS
Спочатку я хотів назвати цей пост «гра в 0 рядків HTML, JS і CSS», натхненний цим постом, але це було б занадто голосно. Так чи інакше, сильно погіршивши UX, я отримав хрестики-нулики, що працюють виключно силою DNS протоколу.
Для непідготовленого користувача виглядає, звичайно, страшно, зате навіть браузер не потрібен для гри.
Для того, щоб зайти в гру, необхідно виконати таку команду, яка передбачає звернення до мого dns-сервера:
$ dig @ns.f1remoon.com game.f1remoon.com. TXT
Так само я зробив невелику довідку, яка доступна в TXT-записах по домену help.game.f1remoon.com
:
Як це працює?
Спочатку я намагався просто правильно налаштувати bind9, але був сильно засмучений: порядок видачі TXT записів був випадковий. Це, звичайно, приносило певну екзотику в гру, але було абсолютно неприйнятно. Довелося відкинути ідею і дивитися в бік самописного DNS-сервера. Озброївшись бажанням вивчити щось нове, я взяв golang і бібліотеку Go DNS і вийшов простий, не сильно відрізняється від прикладів, сервер.
Наступною складністю були всі комбінації гри. Тут велика подяка Sirion: я взяв його html-файли та транслював у призначений мені формат.
Так як команда dig, на відміну від браузера, не зберігає url і не дає тикати по полю, доведеться залишити це користувачеві. Для гри поле було розмічено як numpad:
7 8 9
4 5 6
1 2 3
При запиті ходу завжди потрібно віддавати повну історію ходів у зворотному, наприклад, команда на третій хід в клітинку «9» буде виглядати так:
$ dig @ns.f1remoon.com 9.4.5.game.f1remoon.com. TXT
Повний вивід трьох ходів
$ dig @ns.f1remoon.com 5.game.f1remoon.com. TXT
; <<>> DiG 9.11.3-1ubuntu1.1-Ubuntu <<>> @ns.f1remoon.com 5.game.f1remoon.com. TXT
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12656
;; flags: qr rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;5.game.f1remoon.com. IN TXT
;; ANSWER SECTION:
5.game.f1remoon.com. 0 IN TXT "o" "_" "_"
5.game.f1remoon.com. 0 IN TXT "_" "х" "_"
5.game.f1remoon.com. 0 IN TXT "_" "_" "_"
;; Query time: 135 msec
;; SERVER: 159.65.145.145#53(159.65.145.145)
;; WHEN: Sun Aug 05 20:16:16 UTC 2018
;; MSG SIZE rcvd: 148
$ dig @ns.f1remoon.com 4.5.game.f1remoon.com. TXT
; <<>> DiG 9.11.3-1ubuntu1.1-Ubuntu <<>> @ns.f1remoon.com 4.5.game.f1remoon.com. TXT
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9301
;; flags: qr rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;4.5.game.f1remoon.com. IN TXT
;; ANSWER SECTION:
4.5.game.f1remoon.com. 0 IN TXT "o" "_" "_"
4.5.game.f1remoon.com. 0 IN TXT "x" x "o"
4.5.game.f1remoon.com. 0 IN TXT "_" "_" "_"
;; Query time: 131 msec
;; SERVER: 159.65.145.145#53(159.65.145.145)
;; WHEN: Sun Aug 05 20:16:23 UTC 2018
;; MSG SIZE rcvd: 156
$ dig @ns.f1remoon.com 9.4.5.game.f1remoon.com. TXT
; <<>> DiG 9.11.3-1ubuntu1.1-Ubuntu <<>> @ns.f1remoon.com 9.4.5.game.f1remoon.com. TXT
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40450
;; flags: qr rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;9.4.5.game.f1remoon.com. IN TXT
;; ANSWER SECTION:
9.4.5.game.f1remoon.com. 0 IN TXT "o" "_" "x"
9.4.5.game.f1remoon.com. 0 IN TXT "x" x "o"
9.4.5.game.f1remoon.com. 0 IN TXT "o" "_" "_"
;; Query time: 131 msec
;; SERVER: 159.65.145.145#53(159.65.145.145)
;; WHEN: Sun Aug 05 20:16:30 UTC 2018
;; MSG SIZE rcvd: 164
$
Репозиторій з кодом: github.com/Firemoon777/tic-tac-toe-dns