feat(vip): Tunesien (TN) als VIP-Land + kuratierte Starter-Liste
TN-User fielen bisher mangels TN-Liste auf die DE-Liste zurück. Jetzt eigene (kurze) TN-Starter-Liste: mbet216.com, 2xbet365.com, cesar365.com, icombet.com, unibet365.net (von einem TN-Test-User gemeldet). TN in COUNTRY_KEYS (webcontent-Endpoint) + VIP_COUNTRIES (Geräte-Region- Auflösung + Add-Check). Native Region-Logik ist generisch (Locale.region → JSON-Key) — kein Native-Code nötig. gambling-domains.json _meta v3. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
48a8bbc4af
commit
f555c5e4d8
@ -12,7 +12,7 @@ import { apiFetch } from '../lib/api';
|
|||||||
* Filter nutzt (`Locale.current.region`).
|
* Filter nutzt (`Locale.current.region`).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const VIP_COUNTRIES = ['DE', 'GB', 'FR'] as const;
|
const VIP_COUNTRIES = ['DE', 'GB', 'FR', 'TN'] as const;
|
||||||
export type VipCountry = (typeof VIP_COUNTRIES)[number];
|
export type VipCountry = (typeof VIP_COUNTRIES)[number];
|
||||||
|
|
||||||
/** Geräte-Region → unterstützter VIP-Ländercode. Fallback DE. */
|
/** Geräte-Region → unterstützter VIP-Ländercode. Fallback DE. */
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"_comment": "STARTER — kuratierte Starter-Liste der bekanntesten Gambling-Domains pro Land. NICHT die Endliste. Die finale, traffic-rangbasierte Kuratierung (via Similarweb-Ranking / GGL-Whitelist für DE) ist noch offen. Apple-Hartlimit: max. 50 Domains pro Land — diese Grenze darf NIE überschritten werden. Schlüssel = ISO-3166-1-alpha-2-Ländercode (Locale.current.region). Werte = registrierbare Domains ohne Schema/Subdomain (ManagedSettings WebDomain matched die Domain inkl. Subdomains).",
|
"_comment": "STARTER — kuratierte Starter-Liste der bekanntesten Gambling-Domains pro Land. NICHT die Endliste. Die finale, traffic-rangbasierte Kuratierung (via Similarweb-Ranking / GGL-Whitelist für DE) ist noch offen. Apple-Hartlimit: max. 50 Domains pro Land — diese Grenze darf NIE überschritten werden. Schlüssel = ISO-3166-1-alpha-2-Ländercode (Locale.current.region). Werte = registrierbare Domains ohne Schema/Subdomain (ManagedSettings WebDomain matched die Domain inkl. Subdomains).",
|
||||||
"_meta": {
|
"_meta": {
|
||||||
"version": 2,
|
"version": 3,
|
||||||
"updatedAt": "2026-05-22",
|
"updatedAt": "2026-05-22",
|
||||||
"maxDomainsPerCountry": 50,
|
"maxDomainsPerCountry": 50,
|
||||||
"status": "starter"
|
"status": "starter"
|
||||||
@ -97,5 +97,12 @@
|
|||||||
"lucien-barriere.com",
|
"lucien-barriere.com",
|
||||||
"casinobarriere.com",
|
"casinobarriere.com",
|
||||||
"circus.be"
|
"circus.be"
|
||||||
|
],
|
||||||
|
"TN": [
|
||||||
|
"mbet216.com",
|
||||||
|
"2xbet365.com",
|
||||||
|
"cesar365.com",
|
||||||
|
"icombet.com",
|
||||||
|
"unibet365.net"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,15 +16,13 @@ const DOMAIN_RE = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])
|
|||||||
|
|
||||||
// Kuratierte Layer-2-VIP-Listen pro Land (gambling-domains.json).
|
// Kuratierte Layer-2-VIP-Listen pro Land (gambling-domains.json).
|
||||||
const CURATED_LISTS = gamblingDomains as unknown as Record<string, string[]>;
|
const CURATED_LISTS = gamblingDomains as unknown as Record<string, string[]>;
|
||||||
const VIP_COUNTRIES = ["DE", "GB", "FR"] as const;
|
const VIP_COUNTRIES = ["DE", "GB", "FR", "TN"] as const;
|
||||||
|
|
||||||
// Die VIP-Layer-2-Liste fasst max. 50 Domains; 20 davon sind für die
|
// Die VIP-Layer-2-Liste fasst max. 50 Domains; 20 davon sind für die
|
||||||
// kuratierte Liste reserviert (RESERVED_CURATED in webcontent-domains.get.ts)
|
// kuratierte Liste reserviert (RESERVED_CURATED in webcontent-domains.get.ts)
|
||||||
// → max. 30 eigene Custom-Domains. Wird die überschritten, greift der
|
// → max. 30 eigene Custom-Domains. Wird die überschritten, greift der
|
||||||
// VIP-Slot-Replace-Flow (Swap mit 24h-Cooldown).
|
// VIP-Slot-Replace-Flow (Swap mit 24h-Cooldown).
|
||||||
// ⚠️ TEMP-TEST-WERT: 3 statt 30 — damit der Swap-Dialog schon ab der
|
const MAX_VIP_CUSTOM = 30;
|
||||||
// 4. Web-Domain triggert. NACH DEM TEST auf 30 ZURÜCKSETZEN!
|
|
||||||
const MAX_VIP_CUSTOM = 3;
|
|
||||||
const SWAP_COOLDOWN_MS = 24 * 60 * 60 * 1000;
|
const SWAP_COOLDOWN_MS = 24 * 60 * 60 * 1000;
|
||||||
|
|
||||||
/** Client-`country` (Geräte-Region) → unterstützter VIP-Ländercode. Fallback DE. */
|
/** Client-`country` (Geräte-Region) → unterstützter VIP-Ländercode. Fallback DE. */
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import gamblingDomains from "../../data/gambling-domains.json";
|
import gamblingDomains from "../../data/gambling-domains.json";
|
||||||
import { getWebCustomDomains } from "../../db/domains";
|
import { getWebCustomDomains } from "../../db/domains";
|
||||||
|
|
||||||
const COUNTRY_KEYS = ["DE", "GB", "FR"] as const;
|
const COUNTRY_KEYS = ["DE", "GB", "FR", "TN"] as const;
|
||||||
type CountryKey = (typeof COUNTRY_KEYS)[number];
|
type CountryKey = (typeof COUNTRY_KEYS)[number];
|
||||||
|
|
||||||
const GLOBAL_LISTS = gamblingDomains as unknown as Record<string, string[]>;
|
const GLOBAL_LISTS = gamblingDomains as unknown as Record<string, string[]>;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"_meta": {
|
"_meta": {
|
||||||
"version": 2,
|
"version": 3,
|
||||||
"updatedAt": "2026-05-22",
|
"updatedAt": "2026-05-22",
|
||||||
"maxDomainsPerCountry": 50,
|
"maxDomainsPerCountry": 50,
|
||||||
"status": "starter"
|
"status": "starter"
|
||||||
@ -96,5 +96,12 @@
|
|||||||
"lucien-barriere.com",
|
"lucien-barriere.com",
|
||||||
"casinobarriere.com",
|
"casinobarriere.com",
|
||||||
"circus.be"
|
"circus.be"
|
||||||
|
],
|
||||||
|
"TN": [
|
||||||
|
"mbet216.com",
|
||||||
|
"2xbet365.com",
|
||||||
|
"cesar365.com",
|
||||||
|
"icombet.com",
|
||||||
|
"unibet365.net"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user