{"id":16022043,"url":"https://github.com/cfstras/spacestate","last_synced_at":"2025-04-02T06:45:09.729Z","repository":{"id":38237993,"uuid":"261873218","full_name":"cfstras/spacestate","owner":"cfstras","description":"Proof-of-concept minimal implementation of the Mumble protocol to receive server metadata and serve via REST API.","archived":false,"fork":false,"pushed_at":"2024-04-19T23:13:05.000Z","size":251,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-07T21:33:44.654Z","etag":null,"topics":["mumble","mumble-api","rust"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cfstras.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","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":"2020-05-06T20:37:58.000Z","updated_at":"2024-04-19T23:13:06.000Z","dependencies_parsed_at":"2023-11-28T13:27:40.315Z","dependency_job_id":"5dd2be78-c1bf-4b4b-8e06-28c7a979f64a","html_url":"https://github.com/cfstras/spacestate","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cfstras%2Fspacestate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cfstras%2Fspacestate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cfstras%2Fspacestate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cfstras%2Fspacestate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cfstras","download_url":"https://codeload.github.com/cfstras/spacestate/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246769974,"owners_count":20830769,"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":["mumble","mumble-api","rust"],"created_at":"2024-10-08T18:20:35.949Z","updated_at":"2025-04-02T06:45:09.700Z","avatar_url":"https://github.com/cfstras.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Spacestate\n\nSpacestate is a minimal implementation of the mumble protocol to facilitate getting status information from a running Mumble server.\n\nUsage:\n\n```bash\ncargo run -- $server_hostname [$port]\n```\n\nRunning the main binary will start an HTTP server at 127.0.0.1:8000.\n\n## Configuration\n\nYou can use these environment variables to configure the HTTP server, or by saving a `Rocket.toml` according to the [Rocket configuration guide](https://rocket.rs/v0.5/guide/configuration/) in your working directory.\n\n```bash\nexport ROCKET_ADDRESS=\"0.0.0.0\"\nexport ROCKET_PORT=8000\n```\n\n## Status\n\nTwo methods are used:\n\n1. Simple UDP Ping Packet as [specified here](https://wiki.mumble.info/wiki/Protocol)  \nThis ping packet only responds with latency, user numbers, and server version.\n\n1. Full Mumble Protocol to gather information [Protobuf spec](https://mumble-protocol.readthedocs.io)  \nThis protocol is more complex, but allows gathering full user \u0026 channel information.\n\n## Ping Packet\n\n`HTTP GET /ping`\n\nStatus: Fully functional\n\nExample response:\n```json\n{\n  \"data\": {\n    \"version\": [\n      0,\n      1,\n      4,\n      0\n    ],\n    \"packet_id\": 15366622843189944000,\n    \"users\": 0,\n    \"max_users\": 200,\n    \"bandwidth\": 300000,\n    \"ping\": 7\n  },\n  \"time_since_refresh\": 0\n}\n```\n\n## Full Protocol\n\n`HTTP GET /status`\n\nStatus: Unfinished\n\nThis implementation does not start a UDP voice tunnel after connecting, and the Mumble server does not seem to like this.\nAfter the initial session and TLS negotiation, Mumble will _sometimes_ start sending channel \u0026 user information after a few seconds, but not always.\n\nExample response:\n```json\n{\n  \"data\": {\n    \"header\": null,\n    \"channels\": {\n      \"0\": {\n        \"channel_id\": 0,\n        \"parent\": null,\n        \"name\": \"Our Mumble Server\",\n        \"links\": [],\n        \"description\": \"Test test\u003cbr\u003eTest\",\n        \"links_add\": [],\n        \"links_remove\": [],\n        \"temporary\": null,\n        \"position\": 0,\n        \"description_hash\": null,\n        \"max_users\": 0,\n        \"is_enter_restricted\": false,\n        \"can_enter\": true\n      },\n      \"1\": {\n        \"channel_id\": 1,\n        \"parent\": 8,\n        \"name\": \"Some Channel\",\n        \"links\": [],\n        \"description\": \"HTML description, sometimes with images as base64\",\n        \"links_add\": [],\n        \"links_remove\": [],\n        \"temporary\": null,\n        \"position\": 0,\n        \"description_hash\": null,\n        \"max_users\": 0,\n        \"is_enter_restricted\": false,\n        \"can_enter\": true\n      },\n      \"8\": {\n        \"channel_id\": 8,\n        \"parent\": 0,\n        \"name\": \"Some Root Channel Name\",\n        \"links\": [],\n        \"description\": \"...\",\n        \"links_add\": [],\n        \"links_remove\": [],\n        \"temporary\": null,\n        \"position\": 0,\n        \"description_hash\": null,\n        \"max_users\": 0,\n        \"is_enter_restricted\": false,\n        \"can_enter\": true\n      },\n    },\n    \"users\": {\n      \"84\": {\n        \"session\": 84,\n        \"actor\": null,\n        \"name\": \"ZiffBot\",\n        \"user_id\": null,\n        \"channel_id\": 8,\n        \"mute\": null,\n        \"deaf\": null,\n        \"suppress\": null,\n        \"self_mute\": null,\n        \"self_deaf\": null,\n        \"texture\": null,\n        \"plugin_context\": null,\n        \"plugin_identity\": null,\n        \"comment\": null,\n        \"hash\": null,\n        \"comment_hash\": null,\n        \"texture_hash\": null,\n        \"priority_speaker\": null,\n        \"recording\": null,\n        \"temporary_access_tokens\": [],\n        \"listening_channel_add\": [],\n        \"listening_channel_remove\": []\n      }\n    },\n    \"server_version\": {\n      \"version\": 66560,\n      \"release\": \"1.4.0\",\n      \"os\": \"Linux\",\n      \"os_version\": \"Alpine Linux v3.18 [x64]\"\n    },\n    \"suggest_config\": null,\n    \"server_sync\": {\n      \"session\": 84,\n      \"max_bandwidth\": 300000,\n      \"welcome_text\": \"Custom Channel Welcome text!\",\n      \"permissions\": 134744846\n    },\n    \"server_config\": {\n      \"max_bandwidth\": null,\n      \"welcome_text\": null,\n      \"allow_html\": true,\n      \"message_length\": 5000,\n      \"image_message_length\": 131072,\n      \"max_users\": 200\n    }\n  },\n  \"time_since_refresh\": 0\n}\n```\n\n## License\n\nBSD 3-Clause, see [LICENSE.md]\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcfstras%2Fspacestate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcfstras%2Fspacestate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcfstras%2Fspacestate/lists"}