{"id":21456228,"url":"https://github.com/etkecc/honoroit","last_synced_at":"2025-04-22T12:51:30.819Z","repository":{"id":256148573,"uuid":"845204781","full_name":"etkecc/honoroit","owner":"etkecc","description":"A helpdesk matrix bot","archived":false,"fork":false,"pushed_at":"2025-04-14T19:45:10.000Z","size":102938,"stargazers_count":15,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-14T20:36:07.743Z","etag":null,"topics":["helpdesk","matrix-org","mautrix-go"],"latest_commit_sha":null,"homepage":"https://matrix.to/#/#honoroit:etke.cc","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/etkecc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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,"zenodo":null},"funding":{"liberapay":"etkecc"}},"created_at":"2024-08-20T19:40:48.000Z","updated_at":"2025-04-14T19:39:29.000Z","dependencies_parsed_at":null,"dependency_job_id":"16765561-3f6f-4156-97df-43bfc553b36b","html_url":"https://github.com/etkecc/honoroit","commit_stats":null,"previous_names":["etkecc/honoroit"],"tags_count":29,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/etkecc%2Fhonoroit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/etkecc%2Fhonoroit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/etkecc%2Fhonoroit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/etkecc%2Fhonoroit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/etkecc","download_url":"https://codeload.github.com/etkecc/honoroit/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250243943,"owners_count":21398430,"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":["helpdesk","matrix-org","mautrix-go"],"created_at":"2024-11-23T05:14:53.494Z","updated_at":"2025-04-22T12:51:30.798Z","avatar_url":"https://github.com/etkecc.png","language":"Go","funding_links":["https://liberapay.com/etkecc"],"categories":["Bots"],"sub_categories":["Support / Chat Bot"],"readme":"# Honoroit [![Matrix](https://img.shields.io/matrix/honoroit:etke.cc?logo=matrix\u0026style=for-the-badge)](https://matrix.to/#/#honoroit:etke.cc)\n\n\u003e [more about that name](https://finalfantasy.fandom.com/wiki/Honoroit_Banlardois)\n\n\n\u003c!-- vim-markdown-toc GFM --\u003e\n\n* [Features](#features)\n* [How it looks like](#how-it-looks-like)\n    * [Step 1: a matrix user (customer) sends a message to Honoroit bot in direct 1:1 chat](#step-1-a-matrix-user-customer-sends-a-message-to-honoroit-bot-in-direct-11-chat)\n    * [Step 2: a new thread created in the backoffice room](#step-2-a-new-thread-created-in-the-backoffice-room)\n    * [Step 3: operator(-s) chat with customer in that thread](#step-3-operator-s-chat-with-customer-in-that-thread)\n    * [Step 4: customer sees that like a direct 1:1 chat with honoroit user](#step-4-customer-sees-that-like-a-direct-11-chat-with-honoroit-user)\n    * [Step 5: operator closes the request](#step-5-operator-closes-the-request)\n    * [Step 6: customer receives special message and bot leaves the room](#step-6-customer-receives-special-message-and-bot-leaves-the-room)\n* [TODO](#todo)\n* [Commands](#commands)\n* [Configuration](#configuration)\n    * [mandatory](#mandatory)\n    * [optional](#optional)\n        * [honoroit internals](#honoroit-internals)\n        * [redmine](#redmine)\n* [Where to get](#where-to-get)\n    * [etke.cc](#etkecc)\n    * [Matrix Docker Ansible Deploy](#matrix-docker-ansible-deploy)\n    * [Docker](#docker)\n    * [Binary](#binary)\n    * [Build from source](#build-from-source)\n\n\u003c!-- vim-markdown-toc --\u003e\n\nA helpdesk bot, used as part of [etke.cc](https://etke.cc) service.\n\nThe main idea of that bot is to give you the same abilities as with website chats (like Intercom, jivosite, etc) inside the matrix.\n\n## Features\n\n* chat-based configuration\n* optional silent mode (bot won't send any automatic messages to the customer)\n* prometheus metrics on `/metrics` endpoint\n* [Redmine integration](./docs/redmine.md)\n* [MSC4144 integration](./docs/msc4144.md)\n* End-to-End encryption\n* Get a message from any matrix user proxied to a specific room. Any message that user will send in his 1:1 room with Honoroit will be proxied as thread messages\n* Chat with that user through the honoroit bot in a thread inside your special room. Any member of that special room can participate in discussion\n* When request fulfilled - send a `!ho done` in that thread - thread topic will be renamed and \"proxied user\" will know that request was closed (bot will leave user's room with special notice)\n\n## How it looks like\n\n### Step 1: a matrix user (customer) sends a message to Honoroit bot in direct 1:1 chat\n\n![step 1](contrib/screenshots/1-customer-sends-a-message.png)\n\n### Step 2: a new thread created in the backoffice room\n\n![step 2](contrib/screenshots/2-new-thread-created-in-the-backoffice-room.png)\n\n### Step 3: operator(-s) chat with customer in that thread\n\n![step 3](contrib/screenshots/3-operators-chat-with-customer-in-that-thread.png)\n\n### Step 4: customer sees that like a direct 1:1 chat with honoroit user\n\n![step 4](contrib/screenshots/4-customer-sees-that-like-a-direct-1-1-chat-with-honoroit-user.png)\n\n### Step 5: operator closes the request\n\n![step 5](contrib/screenshots/5-operator-closes-the-request.png)\n\n### Step 6: customer receives special message and bot leaves the room\n\n![step 6](contrib/screenshots/6-customer-receives-special-message-and-bot-leaves-the-room.png)\n\n## TODO\n\n* Unit tests\n\n## Commands\n\nAvailable commands in the threads. Note that all commands should be called with prefix, so `!ho done` will work, but simple `done` will not.\n\n* `done` - close the current request and mark is as done. Customer will receive special message and honoroit bot will leave 1:1 chat with customer. Any new message to the thread will not work and return error.\n* `rename TXT` - rename the thread topic title, when you want to change the standard message to something different\n* `note NOTE` - a message prefixed with `!ho note` will **not** be sent anywhere, it's a safe place to keep notes for other operations in a thread with a customer, example: `!ho note @room need help with this one`\n* `invite` - invite yourself into the customer 1:1 room\n* `start MXID` - start a conversation with a MXID from the honoroit (like a new thread, but initialized by operator), eg: `!ho start @user:example.com`\n* `count MXID` - count a request from MXID and their homeserver, but don't actually create a room or invite them\n* `config` - show all config options\n* `config KEY` - show specific config option and its current value\n* `config KEY VALUE` - update value of the specific config option\n\n\n## Configuration\n\nenv vars\n\n### mandatory\n\n* **HONOROIT_HOMESERVER** - homeserver url, eg: `https://matrix.example.com`\n* **HONOROIT_LOGIN** - user login, localpart when using password (e.g., `honoroit`), OR full MXID when using shared secret (e.g., `@honoroit:example.com`)\n* **HONOROIT_PASSWORD** - user password, alternatively you may use shared secret\n* **HONOROIT_SHAREDSECRET** - alternative to password, shared secret ([details](https://github.com/devture/matrix-synapse-shared-secret-auth))\n* **HONOROIT_ROOMID** - room ID where threads will be created, eg: `!test:example.com`\n\n### optional\n\n#### honoroit internals\n\n* **HONOROIT_PREFIX** - command prefix\n* **HONOROIT_PORT** - http port\n* **HONOROIT_DATA_SECRET** - secure key (password) to encrypt account data, must be 16, 24, or 32 bytes long\n* **HONOROIT_MONITORING_SENTRY_DSN** - sentry DSN\n* **HONOROIT_MONITORING_SENTRY_RATE** - sentry sample rate, from 0 to 100 (default: 20)\n* **HONOROIT_MONITORING_HEALTHCHECKS_URL** - healthchecks.io url, default: `https://hc-ping.com`\n* **HONOROIT_MONITORING_HEALTHCHECKS_UUID** - healthchecks.io UUID\n* **HONOROIT_MONITORING_HEALTHCHECKS_DURATION** - heathchecks.io duration between pings in seconds (default: 5)\n* **HONOROIT_LOGLEVEL** - log level\n* **HONOROIT_CACHESIZE** - max allowed mappings in cache\n* **HONOROIT_NOENCRYPTIONWARNING** - disable e2e encryption warning message\n* **HONOROIT_DB_DSN** - database connection string\n* **HONOROIT_DB_DIALECT** - database dialect (postgres, sqlite3)\n* **HONOROIT_METRICS_LOGIN** - /metrics login\n* **HONOROIT_METRICS_PASSWORD** - /metrics password\n* **HONOROIT_METRICS_IPS** - /metrics allowed ips\n\n#### redmine\n\nOptional 2-way sync with redmine\n\n* **HONOROIT_REDMINE_HOST** - redmine host, e.g. `https://redmine.example.com`\n* **HONOROIT_REDMINE_APIKEY** - redmine API key\n* **HONOROIT_REDMINE_PROJECT** - redmine project identifier, e.g. `internal-project`\n* **HONOROIT_REDMINE_TRACKERID** - redmine tracker ID, e.g. `1`\n* **HONOROIT_REDMINE_NEWSTATUSID** - redmine \"new\" status ID, e.g. `1`\n* **HONOROIT_REDMINE_INPROGRESSSTATUSID** - redmine \"in progress\" status ID, e.g. `2`\n* **HONOROIT_REDMINE_DONESTATUSID** - redmine \"done\" status ID, e.g. `3`\n\nYou can find default values in [config/defaults.go](config/defaults.go)\n\n## Where to get\n\n### [etke.cc](https://etke.cc)\n\nYou can get a hosted version of the bot with a support and maintenance plan by the developers on [etke.cc](https://etke.cc)\n\n### [Matrix Docker Ansible Deploy](https://github.com/spantaleev/matrix-docker-ansible-deploy)\n\nYou can get the bot using MDAD playbook, just [follow the docs](https://github.com/spantaleev/matrix-docker-ansible-deploy/blob/master/docs/configuring-playbook-bot-honoroit.md)\n\n### Docker\n\nYou can get the bot using docker image from [the registry](https://github.com/etkecc/honoroit/pkgs/container/honoroit)\n\n```bash\n# 1. Get UID and GID of the system user you want to use to run the bot's container:\n# id\n# 2. Prepare the configuration in the env file (see Configuration section), alternatively you can use `docker --env` flags\n# 2. Run the bot using UID and GID from step 1:\ndocker run --user YOUR_UID:YOUR_GID --env-file /YOUR_ENV_FILE ghcr.io/etkecc/honoroit:latest\n```\n\n### Binary\n\nYou can get binary from [the releases page](https://github.com/etkecc/honoroit/releases):\n\n```bash\n# 1. Prepare the configuration in the .env file (see Configuration section), alternatively you can use env vars\n# 2. Run the bot (it will load .env file in the current directory automatically)\n./honoroit\n```\n\n### Build from source\n\n```bash\n# 1. Clone the repo\n# 2. Prepare the configuration in the .env file (see Configuration section), alternatively you can use env vars\n# 3. (if `just` is installed)\njust build\n# or\ngo build -ldflags '-extldflags \"-static\"' -tags timetzdata,goolm -v ./cmd/honoroit\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fetkecc%2Fhonoroit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fetkecc%2Fhonoroit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fetkecc%2Fhonoroit/lists"}