Хрестики-нулики на 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

Читайте також  Принцип найменшої дії. Частина 1

Степан Лютий

Обожнюю технології в сучасному світі. Хоча частенько і замислююся над тим, як далеко вони нас заведуть. Не те, щоб я прям і знаюся на ядрах, пікселях, коллайдерах і інших парсеках. Просто приходжу в захват від того, що може в творчому пориві вигадати людський розум.

You may also like...

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *