{"id":15984731,"url":"https://github.com/jaredreisinger/xyzzybot","last_synced_at":"2025-04-04T20:46:21.450Z","repository":{"id":146779086,"uuid":"96524511","full_name":"JaredReisinger/xyzzybot","owner":"JaredReisinger","description":"Bringing interactive fiction to Slack","archived":false,"fork":false,"pushed_at":"2018-03-05T22:11:38.000Z","size":2071,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-10T05:26:10.281Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JaredReisinger.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-07-07T09:46:19.000Z","updated_at":"2024-11-26T06:59:11.000Z","dependencies_parsed_at":null,"dependency_job_id":"dd5076d3-2732-4b10-9a10-fc1a9533a62a","html_url":"https://github.com/JaredReisinger/xyzzybot","commit_stats":{"total_commits":35,"total_committers":1,"mean_commits":35.0,"dds":0.0,"last_synced_commit":"66df2001805b4db4ffa388d96627c6260ed37bc1"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JaredReisinger%2Fxyzzybot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JaredReisinger%2Fxyzzybot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JaredReisinger%2Fxyzzybot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JaredReisinger%2Fxyzzybot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JaredReisinger","download_url":"https://codeload.github.com/JaredReisinger/xyzzybot/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247249602,"owners_count":20908211,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-08T02:10:18.468Z","updated_at":"2025-04-04T20:46:21.415Z","avatar_url":"https://github.com/JaredReisinger.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ![](https://github.com/JaredReisinger/xyzzybot/raw/master/docs/logo-60.png) xyzzybot\n\nBefore 8-bit, there was 7-bit...\n\n\n## Goals\n\nWith the popularity of Slack (and related tools), there’s been a resurgence of\nattention on text-based, conversational interaction.  As a long-time fan of\ninteractive fiction, it’s only natural to want to combine the two.\n\n\n## Setup\n\n\u003e This project is not-yet-ready for primetime.  The intention is to provide a\n\u003e ready-to-run Docker image that only needs some configuration—for your team’s\n\u003e specific app account—and a volume for game files.\n\u003e\n\u003e _(more to come)_\n\n\n## Interaction model\n\nBefore diving into a discussion of the interaction model, we need to understand\nall of the _kinds_ of interaction/context that will exist, keeping in mind that\na game can be in progress in a channel with multiple participants.  Given that,\na message always has an intended recipient:\n\n* **the in-progress game** — for game commands, like `go north`, or `take lamp`\n\n* **xyzzybot itself** — for interacting with xyzzybot itself (“start playing a\n  new game, “what’s your status?”)\n\n* **other channel members** — messges for other channel members should\n  generally be ignored by xyzzybot\n\nIdeally, the experience will feel “natural” in Slack, with the bot/app all but\ndisappearing behind the story.  In a typical conversation with people, you don’t\nneed to address them directly with each message; there is context that can be\ninferred.  To approximate this, as a very simple heuristic, xyzzybot will assume\nthat messages of 4 words or less are _probably_ game commands if there is a game\ncurrently in progress.\n\nIf another Slack user is addressed explicity (`@username` anywhere in the\nmessage), the message will be considered part of the general conversation, and\nignored.\n\nIf xyzzybot is addressed explicitly at the beginning of the message (`@xyzzybot\nhelp`), the rest of the message is either a game command, or a xyzzybot command.\nIf there’s not a game in progress, _or_ the first word is preceded by an\nexclamation mark (`!`), the message is treated as a xyzzybot command.  If there\nis a game in progress, and the first word is _not_ preceded by an exclamation\nmark, the message is passed to the game.  (The meta-command prefix was\noriginally a slash, but that has special meaning to Slack, and can’t reliably be\nused without deeper slash-command integration.)\n\n\u003e An implication of this is that it is _always_ possible to ensure that a\n\u003e xyzzybot command will be understood: whether there is a game in progress or\n\u003e not, `@xyzzybot !foo` will _**always**_ be treated as a command `foo` meant\n\u003e for xyzzybot itself.\n\n\n## Components\n\nxyzzybot stands on the shoulders of giants... under the covers, it’s using\n[Christoph Ender’s libfizmo](https://github.com/chrender/libfizmo) as\nthe game interpreter, which in turn is a combination of [Ender’s\nlibfizmo](https://github.com/chrender/libfizmo) and [Andrew Plotkin’s RemGlk\nlibrary](http://eblong.com/zarf/glk/index.html).  This provides a game\ninterpreter whose stdin/stdout is structured JSON data, rather than simple lines\nof text from which paragraphs and other formatting must be inferred.  (These are\nall conveniently packaged as the Docker image\n[jaredreisinger/fizmo-json](https://hub.docker.com/r/jaredreisinger/fizmo-json/),\nmaking it easy to acquire and consume.)\n\nInternally, xyzzybot is composed of two basic parts: interacting with the game\ninterpreter (fizmo-json), and interacting with Slack.\n\n\n### Interpreter model\n\n\u003e _(more to come)_\n\n\n### Slack handling\n\n\u003e _(more to come)_\n\n\n## Roadmap\n\nThese items are in roughly the order I think they’ll be addressed, but things\nmay shift:\n\n* [x] run interpreter as a subprocess\n\n* [x] proxy input/output between Slack and interpreter\n\n* [x] improve `status` command (requires tracking better information per-channel)\n\n* [ ] handle persistence across restarts (save/restore in-progress games)\n\n* [x] create Docker image for easier deployment\n\n* [ ] allow for on-the-fly configuration changes (and persist them)\n\n* [ ] allow for per-channel configuration (and persistence)\n\n* [x] administrative commands (a very few)\n\n* [x] in-Slack commands for uploading new games (very simple, first-pass UI)\n\n* [x] gameplay in xyzzybot direct messages (?)\n\n\u003e _(more to come)_\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjaredreisinger%2Fxyzzybot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjaredreisinger%2Fxyzzybot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjaredreisinger%2Fxyzzybot/lists"}