Крестики-нолики на 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 "_" "x" "_"
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