67656fa32d
Se añade la integración del script de Monetag (MultiTag: popunder + push + in-page push + vignette) como alternativa a AdSense para monetizar sin depender de que Google apruebe el sitio. Tres interruptores (ver components/Monetag.tsx): 1. `MONETAG_SRC` + `MONETAG_ZONE` en el .env (no versionadas, documentadas en el README). Cualquiera de las dos vacía = no se carga nada. Se leen en el servidor y se pasan como props, así que encender/apagar es tocar el .env + reiniciar, SIN rebuild. Ahora mismo van vacías: la integración queda instalada pero inerte hasta que se pegue la zona del panel de Monetag. 2. El filtro común de publicidad, extraído a lib/ads.ts (`shouldServeAds`): fuera para admins y para quien sea rango 2+ o haya pagado alguna vez. Antes esta lógica vivía dentro de AdSense.tsx; ahora la comparten la etiqueta de AdSense y el script de Monetag desde un único sitio, para que no se puedan desincronizar. 3. El consentimiento «Marketing» del banner, en components/MonetagScript.tsx (cliente). A diferencia de la etiqueta de AdSense, MultiTag escribe cookies y pide permisos, así que NO puede cargarse sin aceptar la categoría. Mismo patrón que Analytics.tsx: useConsent reacciona en caliente, arranca en false. El push de MultiTag necesitará además un sw.js servido desde la raíz del dominio (public/sw.js, descargado del panel). Sin él, el resto de formatos funcionan igual. Verificado: con las variables vacías la web queda idéntica (ni script de Monetag ni cambios) y la etiqueta de AdSense sigue intacta. Con una zona de prueba, el filtro de servidor deja pasar a anónimos y rango 1 sin pagos, y corta a los admins. Sin consentimiento no se inyecta ningún <script> (la zona solo viaja como prop inerte en el payload de React). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
36 lines
1.3 KiB
TypeScript
36 lines
1.3 KiB
TypeScript
import { getSession } from './session'
|
|
import { isAdmin } from './admin'
|
|
import { getAccountRankInfo } from './account'
|
|
|
|
/**
|
|
* ¿A este visitante se le sirven anuncios?
|
|
*
|
|
* Criterio único para TODA la publicidad (la etiqueta de AdSense y el script de
|
|
* Monetag), para que no se puedan desincronizar:
|
|
*
|
|
* - Admin (allowlist ADMIN_EMAILS o gmlevel de AzerothCore): nunca. La navegación
|
|
* del staff no debe contar como tráfico con anuncios.
|
|
* - Rango 2+ (100 PD, ver getAccountRank en lib/account.ts) o cualquier pago
|
|
* confirmado por Stripe/SumUp: nunca. Los anuncios son la contrapartida de no
|
|
* haber donado.
|
|
* - El resto (anónimos y rango 1 sin pagos): sí.
|
|
*
|
|
* Los dos cortes del segundo punto son distintos a propósito: el mínimo de SumUp
|
|
* (0,20 € = 20 PD) no llega a los 100 PD del rango 2, así que mirar solo el rango
|
|
* dejaría con anuncios a alguien que ya ha pagado.
|
|
*
|
|
* Corta en seco sin tocar la BD si no hay sesión, así que el visitante anónimo (el
|
|
* caso normal) no paga ninguna consulta extra.
|
|
*/
|
|
export async function shouldServeAds(): Promise<boolean> {
|
|
const session = await getSession()
|
|
if (await isAdmin(session)) return false
|
|
|
|
if (session.accountId) {
|
|
const { level, donatedPD } = await getAccountRankInfo(session.accountId)
|
|
if (level >= 2 || donatedPD > 0) return false
|
|
}
|
|
|
|
return true
|
|
}
|