---
title: 'Discord Updater bot'
url: 'https://wiki.teletypegames.org/hu/services/updater'
markdown: 'https://wiki.teletypegames.org/hu/services/updater.md'
lang: hu
date: '2026-03-06'
description: 'Az Updater egy kis Go eszköz, amely figyeli a Grav wiki, a Redmine és a Gitea változásait, és Discord-webhookokra posztolja az új aktivitást. Egy helyi gyorsítótár gondoskodik róla, hogy minden változás csak egyszer kerüljön bejelentésre. Hogyan működik Az updater INTERVAL_MINUTES percenként végi…'
taxonomy:
  tag:
    - howto
---

# Discord Updater bot

> Az Updater egy kis Go eszköz, amely figyeli a Grav wiki, a Redmine és a Gitea változásait, és Discord-webhookokra posztolja az új aktivitást. Egy helyi gyorsítótár gondoskodik róla, hogy minden változás csak egyszer kerüljön bejelentésre.

# Hogyan működik

Az updater `INTERVAL_MINUTES` percenként végigmegy a forrásokon:

1. **Lekérés** — minden forrástól elkéri a legutóbbi `*_CONTENT_LIMIT` darab elemet.
2. **Összevetés** — elemenként összeveti a változásjelet a `cache.json` tartalmával.
3. **Értesítés** — ami új vagy változott, azt egy Markdown-linkként elküldi a forráshoz tartozó webhookra.
4. **Gyorsítótár mentése** — a kör végén visszaírja a `cache.json`-t, hogy a következő kör ne ismételje meg.

| Forrás | Mit kér le | Változásjel | Üzenet |
|---|---|---|---|
| Grav wiki | `GET /custom/updates.json?limit=N` | az oldal `modified` időbélyege | `📖 [Grav] - Oldalcím` |
| Redmine | `GET /issues.json?limit=N&sort=updated_on:desc` | az issue `updated_on` mezője | `🎫 [Redmine] - #123 Tárgy` |
| Gitea | `GET /api/v1/repos/ORG/REPO/commits?limit=N` repónként | a commit SHA-ja | `📝 [Gitea] - (org/repo) commitüzenet` |

## A Grav-forrás

A wiki a `/custom/updates.json` végponton adja ki az oldalakat, a fájl módosítási ideje szerint csökkenő sorrendben (sablon: `themes/ttgwiki/templates/updates.json.twig` a [wiki-pages](https://git.teletypegames.org/services/wiki-pages) repóban). Az updater csak a `route`, `title` és `modified` mezőket használja; a link `GRAV_BASE_URL` + `route`.

```json
{"lang":"en","count":1,"pages":[
  {"route":"/team/onboarding","title":"Onboarding","modified":1792479011,
   "updatedAt":"2026-10-20T06:50:11+00:00","locale":"en","tags":["team"],"private":true}
]}
```

- A gyorsítótár-kulcs `grav_` + route, tehát egy oldal minden mentése (új `modified`) új üzenetet ad.
- A bejelentkezéshez kötött oldalak (`private: true`) is bekerülnek a listába a címükkel; a törzsüket a végpont nem adja ki, és az updater nem is kéri.
- Prefix nélküli útvonalat kér, ezért az angol címeket és URL-eket posztolja.

# Konfiguráció

Környezeti változók; másold az `env-example` fájlt `.env` néven. Minden forrás minden körben lefut — amelyiknek nincs beállítva az URL-je, az csendben üres listát ad.

## Általános

| Változó | Leírás | Alapérték |
|---|---|---|
| `INTERVAL_MINUTES` | Két kör között eltelt idő (perc). | `5` |
| `DISCORD_WEBHOOK` | Tartalék webhook; jelenleg minden forrásnak saját van, így nem használja semmi. | - |
| `DISCORD_FAKE` | Ha `true`, az üzenetek csak a logba kerülnek, Discordra nem. | `false` |

## Grav wiki

| Változó | Leírás |
|---|---|
| `GRAV_BASE_URL` | A wiki alap-URL-je, **záró perjel nélkül**: `https://wiki.teletypegames.org`. |
| `GRAV_DISCORD_WEBHOOK` | Discord-webhook a wiki-értesítésekhez. |
| `GRAV_CONTENT_LIMIT` | Hány legutóbb módosított oldalt nézzen. |

A Grav-végponthoz nem kell token.

## Redmine

| Változó | Leírás |
|---|---|
| `REDMINE_BASE_URL` | A Redmine alap-URL-je (`https://pm.teletypegames.org`). |
| `REDMINE_KEY` | Redmine API-kulcs (`X-Redmine-API-Key`). |
| `REDMINE_DISCORD_WEBHOOK` | Discord-webhook a Redmine-értesítésekhez. |
| `REDMINE_CONTENT_LIMIT` | Hány legutóbb frissült issue-t nézzen. |

## Gitea

| Változó | Leírás |
|---|---|
| `GITEA_BASE_URL` | A Gitea alap-URL-je (`https://git.teletypegames.org`). |
| `GITEA_TOKEN` | Gitea API-token. |
| `GITEA_REPOS` | A figyelt repók vesszővel elválasztva, pl. `games/mranderson,games/impostor`. Csak a commitokat figyeli, issue-kat és PR-eket nem. |
| `GITEA_DISCORD_WEBHOOK` | Discord-webhook a Gitea-értesítésekhez. |
| `GITEA_CONTENT_LIMIT` | Repónként hány legutóbbi commitot nézzen. |

# Futtatás

Előbb állítsd be a `.env` fájlt, aztán vagy:

```bash
go run main.go          # helyben
docker compose up -d    # konténerben
```

A konténer a repó mappáját mountolja `/app`-ként, és indításkor `go run main.go`-t futtat. A `cache.json` is ebben a mappában él, így túléli az újraindítást. A konténer az `interstack` hálózaton fut, `384m` memórialimittel.

Élesben: `/srv/stacks/updater` a szerveren, a log `docker logs updater-app`. A masterre pusholt változás, ha a Go-forrást, a `Dockerfile`-t vagy a `compose.yaml`-t érinti, `go vet` és build után Woodpeckerből települ (`ci-deploy updater`, lásd [Telepítés](https://wiki.teletypegames.org/hu/infrastructure/deployment)); a `.env` és a `cache.json` a szerveren marad.

# Fájlok

| Fájl | Tartalom |
|---|---|
| `main.go` | Belépési pont, a `lib.Runner()`-t hívja. |
| `lib/runner.go` | A konfiguráció beolvasása, a forrás- és webhooklista, a fő ciklus. |
| `lib/fetcher.grav.go`, `lib/fetcher.redmine.go`, `lib/fetcher.gitea.go` | A három élő forrás. |
| `lib/fetcher.go` | Közös HTTP-kérés és a gyorsítótár-ellenőrzés. |
| `lib/sender.discord.go`, `lib/message.go` | A Discord-webhook és az üzenetformátum. |
| `lib/cache.go` | `cache.json` betöltése és mentése. |
| `env-example` | Konfigurációs sablon. |

# Repó

https://git.teletypegames.org/services/updater

'; var prevLevel = 2; for (var i = 0; i < headings.length; i++) { var h = headings\[i\]; var text = h.textContent.trim(); var slug = text.toLowerCase() .replace(/\[áàâä\]/g,'a').replace(/\[éèêë\]/g,'e').replace(/\[íìîï\]/g,'i') .replace(/\[óòôöő\]/g,'o').replace(/\[úùûüű\]/g,'u') .replace(/\[^a-z0-9\]+/g, '-').replace(/^-|-$/g, ''); if (!slug) slug = 'heading-' + i; if (used\[slug\]) { slug += '-' + i; } used\[slug\] = true; h.id = slug; var level = parseInt(h.tagName.charAt(1)); var cls = level > 2 ? ' class="toc-child"' : ''; html += '- [' + text + '](#'%20+%20slug%20+%20')
'; } html += '
'; toc.innerHTML = html; // Scroll-spy: highlight current heading var links = toc.querySelectorAll('a'); var ids = \[\]; for (var j = 0; j < links.length; j++) ids.push(links\[j\].getAttribute('href').slice(1)); function updateActive() { var current = ''; for (var k = 0; k < ids.length; k++) { var el = document.getElementById(ids\[k\]); if (el && el.getBoundingClientRect().top <= 80) current = ids\[k\]; } for (var m = 0; m < links.length; m++) { links\[m\].parentNode.classList.toggle('active', links\[m\].getAttribute('href') === '#' + current); } } window.addEventListener('scroll', updateActive, { passive: true }); updateActive(); })();

---

## Navigation

- Parent: [Szolgáltatások](https://wiki.teletypegames.org/hu/services.md)
- Previous: [TTG Gate BBS](https://wiki.teletypegames.org/hu/services/ttg-gate-bbs.md)
- Next: [WarpEngine BBS](https://wiki.teletypegames.org/hu/services/warp-engine-bbs.md)
