{"id":20864424,"url":"https://github.com/nihlaeth/whiterabbot","last_synced_at":"2026-04-28T07:31:30.988Z","repository":{"id":54295776,"uuid":"63547936","full_name":"nihlaeth/WhiteRabbot","owner":"nihlaeth","description":"Telegram bot for shift rescheduling","archived":false,"fork":false,"pushed_at":"2021-06-01T21:53:05.000Z","size":82,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-12T15:12:08.005Z","etag":null,"topics":["mongodb","telegram"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nihlaeth.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-07-17T19:05:24.000Z","updated_at":"2016-07-23T20:19:13.000Z","dependencies_parsed_at":"2022-08-13T11:20:09.309Z","dependency_job_id":null,"html_url":"https://github.com/nihlaeth/WhiteRabbot","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/nihlaeth/WhiteRabbot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nihlaeth%2FWhiteRabbot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nihlaeth%2FWhiteRabbot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nihlaeth%2FWhiteRabbot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nihlaeth%2FWhiteRabbot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nihlaeth","download_url":"https://codeload.github.com/nihlaeth/WhiteRabbot/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nihlaeth%2FWhiteRabbot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28077395,"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","status":"online","status_checked_at":"2025-12-27T02:00:05.897Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["mongodb","telegram"],"created_at":"2024-11-18T05:42:22.038Z","updated_at":"2025-12-27T10:02:24.412Z","avatar_url":"https://github.com/nihlaeth.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# WhiteRabbot\n\nTelegram bot for shift rescheduling\n\n## Development\n\nIf you want to install the requirements in the virtual environment,\n`requirements-freeze.txt` contains a known-good combination of requirement\nversions.\n\n    pip install -r requirements-freeze.txt\n\nIf you want to pull in updates, use\n\n    pip install -r requirements.txt\n\ninstead.\n\n## Roadmap\n\n### The data/ORM layer\n\nThis layer limits the data to states that are possible.\n\nFirst, handle only today, and return a Shift object.\n\n* What shift is now?\n* What shift is there at time X today?\n* What shift is there at or after time X?\n\nThen extend this to arbitrary days (daily recurrence rules). More complicated\nrecurrence can wait.\n\n* What shift is there at datetime X?\n\nThen introduce the notion of people, and a shift being covered.\n\n* Who is covering shift X? =\u003e regular person\ns Who is covering shift X? =\u003e nobody\n* Who is covering shift X? =\u003e Oskar\n\nNext, introduce the notion of Mutations.\n\n* Who is covering shift X? =\u003e default person\n* Add a mutation to shift X saying it's empty. Now who is covering it?\n* Add a mutation to shift X saying Oskar takes it. Now who is covering it?\n* Add a mutation to shift X saying it's empty again. Now who?\n* Add a mutation to shift Y saying Wimpje takes it. Now who is covering X? Y?\n\n\n### The API layer\n\nThis layer limits the user to operations and queries that are allowed, and that\nleave the data in states that are allowed.\n\nAt this point we'll probably introduce the notions of a requesting User (who\nmust match the Person who currently owns the task) and a Schedule (N Users\nbelong to one Schedule, they can retrieve Shifts from that Schedule,\nModifications must pertain to users and shifts from that Schedule)\n\n\n### The Telegram interface layer\n\nThis layer is a UI for Telegram users, and uses operations from the API layer.\n\nBecause of the sequential nature of Telegram interaction, this layer is going\nto be a bit of state machine, I expect.\n\nTake Telegram input; do things like\n\n* nothing\n* reply to the user\n* call one of the API layer operations\n* change state\n* some combination of the above\n\nThis will need tables such as the TelegramUser (distinct from the user), the TelegramGroup.\n\n\n## Some sketches\n\n### The real life situation\n\n    zorggroep 1\u003c---\u003e1 Telegram groep N\u003c---\u003eN Telegram users\n        1\n        |\n        1\n    Schedule  1\u003c---\u003e Potential shifts (weekday, name)\n        1\n        |\n        N\n    Mutation N\u003c---\u003e1/0 Telegram user\n\n### The database table\n\n    Schedule          N\u003c---\u003eN Telegram users\n    - Telegram group          - name\n        1                     - telegram_user_id\n        |                  /\n        N           ______/\n    Mutation N     /     |\n    - mutator     1      /\n    - new cover null or 1\n    - shift (somehow, data model to be determined)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnihlaeth%2Fwhiterabbot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnihlaeth%2Fwhiterabbot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnihlaeth%2Fwhiterabbot/lists"}