Oddbean new post about | logout
 I just whipped up a chess server, running on wss://chorus.mikedilger.com:444/ using all ephemeral events, no access control required.

I was having a horrible week, doing huge coding but getting no wins and probably have to throw out my efforts.  I really needed a win.  So I did this chess thing which was (for me) easy with super rapid progress.

Here is the protocol, anybody can write a client for this.  People connect and get paired up and play each other.  There is no fancy Elo score matching yet.  Nor did I write a client yet.  Just the server... which is currently running and listening for chess events tagging this pubkey(hex):  dbb45efeb8cc10e6f75fdff7e561e7db39cc7ba6592f4c22e26f3ee36b2e7bc2

(NIP-64 is not related to this work... yet)

Please somebody write a nice client.


// Event kinds (not yet allocated in nostr)
const REQ_TO_PLAY: EventKind = EventKind::Ephemeral(20300);
/*
 * {
 *   "pubkey": <player-asking>,
 *   "kind": 20300,
 *   "tags": [
 *     ["p", <server-pubkey>],
 *   ],
 *   "content": "",
 *   ...
 * }
*/

const RESP_TO_PLAY: EventKind = EventKind::Ephemeral(20301);
/*
 * {
 *   "pubkey": <server>,
 *   "kind": 20301,
 *   "tags": [
 *     ["p": <player-asking>],
 *   ],
 *   "content": "queued",  // 'queued' or 'error:<error>' or 'started:<d-tag-of-game>'
 *   ...
 * }
 *
 */

const GAME_STATE: EventKind = EventKind::Ephemeral(20302);
/*
 * {
 *   "pubkey": <server>
 *   "kind": 20302,
 *   "tags": [
 *     ["d": <game-id>],
 *     ["p": <pubkey-for-white>],
 *     ["p": <pubkey-for-black>],
 *   ],
 *   "content": <FEN>,
 *   ...
 * }
 */

const GAME_MOVE: EventKind = EventKind::Ephemeral(20303);
/*
 * {
 *   "pubkey": <player>,
 *   "kind": 20303,
 *   "tags": [
 *     ["d": <game-id>],
 *     ["e": <last-game-state-event-being-reacted-to>],
 *     ["p", <server-pubkey>],
 *     ["p": <pubkey-for-white>],
 *     ["p": <pubkey-for-black>],
 *   ],
 *   "content": <long-algebraic-move>, // or various other signals like 'quit' TBD.
 *   ...
 * }
 */

const GAME_ERROR: EventKind = EventKind::Ephemeral(20304);
/*
 * If the game is known, and the error event came from a player of the game:
 * {
 *   "pubkey": <server>,
 *   "kind": 20304
 *   "tags": [
 *     "e": <event-that-was-in-error>,
 *     "d": <game-id>, // if relevant (not present if game not found)
 *     "p": <pubkey-for-white>, // if game not found, this is the author of event reacted to
 *     "p": <pubkey-for-black>, // only if game was found, this is the other player
 *   ],
 *   "content": <error message>
 *   ...
 * }
 *
 * If the game is not known:
 * {
 *   "pubkey": <server>,
 *   "kind": 20304
 *   "tags": [
 *     ["e": <event-that-was-in-error>],
 *     ["p": <pubkey-of-error-event>],
 *   ],
 *   "content": <error message>
 *   ...
 * }
 */