# NEMESYS Network — notificări Tebex → Discord

Acest serviciu publică automat un embed Discord cu branding NEMESYS atunci când Tebex confirmă o plată. Mesajul include jucătorul Minecraft, pachetul/pachetele cumpărate, prețul achitat atunci când Tebex îl trimite, linkul către store, un render 3D al skin-ului și obiectivul lunar actualizat automat.

## Ce conține pachetul

- Endpoint pentru webhook-ul Tebex `payment.completed`.
- Verificare oficială a semnăturii Tebex `X-Signature`, bazată pe corpul brut al cererii.
- Răspuns automat pentru validarea endpoint-ului Tebex.
- Listă opțională de IP-uri Tebex permise: `18.209.80.3` și `54.87.231.232`.
- Stocare JSON persistentă, cu salvare atomică, protecție împotriva notificărilor duplicate și retry sigur dacă Discord nu răspunde.
- Reset automat al obiectivului la începutul fiecărei luni UTC.
- `Dockerfile`, exemplu Docker Compose și instrucțiuni pentru Pterodactyl.

Niciun secret Tebex, Discord sau al serverului nu este inclus în fișierele livrate.

## 1. Configurare

1. Copiază `.env.example` ca `.env`.
2. Completează `TEBEX_WEBHOOK_SECRET` cu **Webhook Secret** din Tebex Creator Panel → **Developers → Webhooks → Endpoints**. Nu este același lucru cu secretul pluginului/serverului de joc.
3. Creează un webhook Discord în canalul dorit (Channel Settings → Integrations → Webhooks) și pune URL-ul lui la `DISCORD_WEBHOOK_URL`.
4. Configurează suma și moneda obiectivului lunar. O plată este adăugată la obiectiv numai dacă moneda transmisă de Tebex este aceeași cu `MONTHLY_GOAL_CURRENCY`; astfel nu se adună monede diferite.

Exemplu:

```env
MONTHLY_GOAL_AMOUNT=100
MONTHLY_GOAL_CURRENCY=EUR
```

## 2. Pornire cu Docker

Din acest folder rulează:

```bash
docker compose up -d --build
```

Datele sunt salvate în `./data/state.json`, montat în container. Păstrează acest folder când actualizezi sau muți serviciul.

Pentru verificare:

```bash
curl http://IP-UL-SERVERULUI:3000/health
```

## 3. Instalare pe Pterodactyl

Folosește un egg de Node.js 18 sau mai nou. Urcă în Files conținutul acestui folder: `src`, `package.json`, `README.md`, precum și fișierul tău privat `.env`.

Setează următoarele valori în Pterodactyl:

```text
Comandă de pornire: npm start
Versiune Node.js: 18 sau mai nouă
PORT: 3000
DATA_FILE: /home/container/data/state.json
```

Portul ales trebuie să fie aceeași alocare TCP a serverului. Dacă egg-ul oferă automat variabila `SERVER_PORT`, poți șterge linia `PORT` din `.env`, iar aplicația o va folosi automat.

Adaugă și toate valorile necesare din `.env`. În mod normal, egg-ul Pterodactyl instalează dependențele din `package.json`. Dacă nu o face, configurează instalarea `npm install --omit=dev` o singură dată. Folderul `data` trebuie păstrat la restart și la reinstalare.

Dacă Pterodactyl expune aplicația printr-un domeniu sau reverse proxy, în Tebex vei folosi un URL HTTPS public, de exemplu:

```text
https://hooks.domeniul-tau.ro/webhooks/tebex
```

O alocare obişnuită de game server nu este, de regulă, un endpoint HTTPS public pentru webhook-uri. Ai nevoie de serviciul web/proxy al hostului (sau de un tunel HTTPS sigur) care redirecționează URL-ul public către portul acestui serviciu.

## 4. Adaugă și validează endpoint-ul Tebex

În Tebex Creator Panel:

1. Intră la **Developers → Webhooks → Endpoints** și adaugă `https://DOMENIUL-TAU/webhooks/tebex` (sau calea setată la `WEBHOOK_PATH`).
2. Bifează evenimentul **payment.completed**. Nu ai nevoie de evenimentele de refund/decline pentru anunțurile de cumpărături.
3. Apasă **Validate**. Tebex trimite evenimentul `validation.webhook`, iar serviciul răspunde automat cu ID-ul cerut.
4. Folosește **Send Test** din același panou, cu un ID valid de tranzacție, pentru a verifica mesajul de pe Discord.

Tebex are nevoie de un răspuns 2xx. Dacă Discord nu este disponibil temporar, serviciul răspunde cu 503 pentru ca Tebex să retrimită webhook-ul. Evenimentul rămâne salvat, astfel încât suma nu este adăugată de două ori la obiectiv.

## Securitate

- Păstrează `.env` privat. Nu publica secretul Tebex și URL-ul webhook-ului Discord în Discord, capturi de ecran, Git sau fișiere accesibile jucătorilor.
- Verificarea HMAC este mereu activă și folosește corpul brut, nemodificat, al cererii.
- Tebex recomandă în plus permiterea exclusivă a IP-urilor `18.209.80.3` și `54.87.231.232`. Activează `ENFORCE_TEBEX_IP_ALLOWLIST=true` numai dacă reverse proxy-ul transmite către aplicație IP-ul real al clientului; în caz contrar, cererile Tebex valide pot părea că vin de la proxy. Pentru un reverse proxy de încredere, setează și `TRUST_PROXY=true`.
- Folosește HTTPS pentru URL-ul public al webhook-ului.

## Personalizare

- `EMBED_COLOR=F57C00` este portocaliul NEMESYS.
- `SKIN_URL_TEMPLATE` folosește implicit [mc-heads](https://mc-heads.net/) și înlocuiește automat `{username}`. Poți schimba template-ul dacă preferi alt furnizor de render-uri.
- Produsele sunt citite direct din lista Tebex `products`, deci rank-uri, credits, keys, cosmetice și pachete noi vor apărea automat fără modificări de cod.
- Obiectivul folosește `price_paid` (iar dacă nu există, `price`), adică suma pe care Tebex o raportează ca achitată.

## Documentație de referință

Implementarea respectă [documentația actuală Tebex pentru Webhooks](https://docs.tebex.io/developers/webhooks/overview): metoda de generare a semnăturii, validarea endpoint-ului, evenimentele, comportamentul de retry și verificările IP recomandate.
