# BlacklistBlock - STARFACE Custom Block

Ein Custom Block für den STARFACE Module Designer, der eingehende Anrufe gegen eine
konfigurierbare Blacklist prüft und anonyme Anrufe (unterdrückte Rufnummer) separat
behandelt. Pro Eintrag kann festgelegt werden, **was** mit dem Anruf passieren soll.

## Funktionsweise

Der Block wird **bei jedem eingehenden Anruf** ausgeführt (Modultyp *Call-Processing*).
Ablauf:

1. `GetCaller2` ermittelt Anrufernummer, Name und das Flag `isAnonymous`.
2. **Anonymer Anruf** (unterdrückte Rufnummer): es greift die *Aktion bei anonymen Anrufen*.
3. Andernfalls wird die Nummer gegen die **Blacklist-Einträge** geprüft (erster Treffer gewinnt).
4. Bei einem Treffer wird die zugehörige Aktion ausgeführt.
5. Kein Treffer / Aktion `NONE` / `ALLOW` → der Block tut nichts, der Anruf läuft normal weiter.

Die Aktionen nutzen die eingebauten STARFACE-Blöcke (`Hangup`, `Busy`, `CallPhonenumber2`,
`Answer` + `PlaybackResourceFile2`), die per Reflection im selben Anruf-Kontext aufgerufen
werden – dadurch bleibt der Block über STARFACE-Versionen hinweg robust.

## Aktionen

| Aktion     | Wirkung                                                              |
|------------|---------------------------------------------------------------------|
| `HANGUP`   | Anruf sofort auflegen (Anrufer wird getrennt)                        |
| `BUSY`     | Besetztzeichen senden                                                |
| `REDIRECT` | Anruf auf eine andere Nummer/Nebenstelle umleiten (Ziel erforderlich)|
| `ANNOUNCE` | Anruf annehmen, Ansage abspielen, dann auflegen                     |
| `ALLOW`    | Ausnahme – Anruf trotz Treffer durchstellen (für Whitelist-Fälle)   |
| `NONE`     | (nur anonym) nichts tun, Anruf normal durchstellen                  |

## Kompatibilität

- STARFACE 8.x, 9.x, 10.x (Java 21)

## Konfigurationsfelder (Eingabe)

| Feld | Typ | Beschreibung | Default |
|------|-----|--------------|---------|
| `blacklistEntries` | STRING (mehrzeilig) | Nummern + optionale Aktion/Ziel, eine pro Zeile | |
| `defaultAction` | STRING (Auswahl) | Aktion für Einträge ohne eigene Aktion | `HANGUP` |
| `defaultRedirectTarget` | STRING | Ziel für REDIRECT-Einträge ohne eigenes Ziel | |
| `announcementFile` | STRING | Name der Sound-Ressource für `ANNOUNCE` | |
| `anonymousAction` | STRING (Auswahl) | Behandlung anonymer Anrufe | `NONE` |
| `anonymousRedirectTarget` | STRING | Ziel bei `REDIRECT` für anonyme Anrufe | |
| `countryCode` | STRING | Eigene Ländervorwahl (Deutschland = 49) | `49` |
| `prefixMatch` | BOOLEAN | Bereichssperre: Eintrag sperrt auch beginnende Nummern | `true` |

## Ausgabe-Variablen

| Feld | Typ | Beschreibung |
|------|-----|--------------|
| `caller` | STRING | Erkannte Anrufernummer (international normalisiert) |
| `isAnonymous` | BOOLEAN | Rufnummer unterdrückt? |
| `blocked` | BOOLEAN | Wurde der Anruf behandelt (geblockt/umgeleitet)? |
| `actionTaken` | STRING | Tatsächlich ausgeführte Aktion |
| `statusMessage` | STRING | Status-Meldung |

## Format der Blacklist-Einträge

Eine Nummer pro Zeile (Komma geht auch). Pro Zeile optional eine eigene Aktion und ein Ziel:

```
nummer;AKTION;ziel
```

Beispiele:

```
# Kommentarzeile, wird ignoriert
+49301234567                 # nutzt die Standard-Aktion
0190;BUSY                    # dieser (Bereich) immer besetzt
004989;REDIRECT;100          # auf Nebenstelle 100 umleiten
+4972112345;ALLOW            # Ausnahme: trotz Bereichssperre durchstellen
0900;ANNOUNCE                # Ansage abspielen und auflegen
```

**Reihenfolge:** Der erste passende Eintrag gewinnt. `ALLOW`-Ausnahmen daher **vor**
breite Bereichssperren setzen.

## Nummern-Vergleich

Alle Nummern werden vor dem Vergleich in eine einheitliche internationale Ziffernform
gebracht (`countryCode` = 49):

| Eingabe | normalisiert |
|---------|--------------|
| `+49 721 12345`  | `4972112345` |
| `0049 721 12345` | `4972112345` |
| `0721 12345`     | `4972112345` |
| `100` (intern)   | `100` |

Bei `prefixMatch = true` sperrt ein Eintrag auch alle Nummern, die mit ihm beginnen
(z.B. `0190` → gesamter `0190`-Bereich). Zum Schutz vor versehentlichem Über-Sperren
greift die Bereichssperre erst ab 3 Ziffern; kürzere Einträge werden nur exakt verglichen.

## Build

```bash
./build-block.sh
```

Die STARFACE-API-JARs werden in `libs/starface/` erwartet. Sind sie dort nicht vorhanden,
nutzt das Script automatisch die JARs des `mail2fax`-Moduls
(`../../mail2fax/v8-9-10/libs/starface/`). Ergebnis: `BlacklistBlock.class`.

Es werden **keine** zusätzlichen Bibliotheken benötigt (kein JavaMail o.ä.).

## Installation im Module Designer

Siehe **[INSTALLATION.md](INSTALLATION.md)** für die Schritt-für-Schritt-Anleitung.
</content>
