Contenido generado con IA — puede contener errores.

Referencia

Base de datos

Las trece tablas, qué las indexa, y qué saber antes de tocarlas a mano.

El almacenamiento es de ExyliaLib. database.yml se escribe en el primer arranque y usa H2 por defecto; los otros motores son MySQL, MariaDB, PostgreSQL y MongoDB, con un bloque redis al lado. Las tablas se crean y migran desde las definiciones de los records, así que no hay ningún esquema que aplicar.

Las trece tablas

TablaClaveGuarda
clansid (UUID en texto)Nombre, líder, saldo, abierto, friendly fire, home, baneados, DTR, congelado, EXP
clan_membersuuidEl clan del jugador y su rango
clan_rolesidCada rango de cada clan: nombre, peso, permisos, si es el rango por defecto
clan_relationsclanId:targetClanIdUna opinión direccional, ALLY o RIVAL
clan_invitesplayerUuid:clanIdUna invitación vigente
clan_claimsidUn rectángulo: mundo, minX, minZ, maxX, maxZ, baseY
clan_statsclanIdBajas, muertes, segundos jugados
player_statsplayerUuid:clanIdLo mismo por jugador y clan, más el último nombre visto
clan_logsidAcción, actor, objetivo, detalle, fecha
clan_mailsidTipo, remitente, destinatario, asunto, cuerpo, enviado, caduca, lista de leídos, lista de borrados, fijado
lfc_profilesplayerUuidEstado, publicado, última publicación, caduca, las respuestas
lfp_postingsclanIdEstado, publicado, última publicación, caduca, descripción, las respuestas
lfp_applicationsplayerUuid:clanIdEstado, solicitado, resuelto, mensaje

Qué te dan las claves

Varias reglas que habría que hacer cumplir a mano las impone la propia clave:

  • Un jugador está en un clan. clan_members tiene por clave el UUID del jugador, así que no puede existir una segunda fila de pertenencia.
  • Un clan tiene un terreno y una oferta LFP. Las dos tienen por clave el id del clan.
  • Un jugador tiene un perfil LFC, y una solicitud por clan.
  • Una invitación es única por pareja, y una relación también.

Dos índices

ÍndiceSobrePara
idx_cl_clan_tsclan_logs (clanId, timestamp DESC)El menú de logs: filtrar por clan, más nuevo primero, tomar una página
idx_cm_clan_sentclan_mails (clanId, sentAt DESC)El buzón, igual

Los dos convierten una página en una lectura acotada en vez de un escaneo.

Columnas que conviene conocer

ColumnaFormato
clans.bannedPlayersUUIDs separados por comas
clan_roles.permissionsNombres de permiso separados por comas. Un nombre desconocido se salta al leer
clans.homeLocationUna localización serializada que lleva el servidor en el que se puso: servidor,mundo,x,y,z,yaw,pitch. null si no está puesta
clan_mails.readByPlayers / deletedByPlayersUUIDs separados por comas — así leído y borrado son por miembro desde una sola fila
lfc_profiles.data / lfp_postings.dataLas respuestas serializadas
*.statusACTIVE / EXPIRED para ofertas y perfiles; PENDING / ACCEPTED / REJECTED para solicitudes

Qué no está en la base de datos

  • Las peticiones de alianza. En memoria, con caducidad de 60 segundos; un reinicio se lleva las pendientes.
  • Los canales de chat. Por sesión; tras un reinicio todo el mundo vuelve a global.
  • Las rachas de bajas. Por sesión, y se reinician al morir.
  • Los marcadores de camp, rally, focus y regroup. Todos en memoria.
  • El nivel del clan. Se deriva de clans.exp en cada lectura, nunca se guarda.
  • Qué miembros son dueños de un terreno. Se deriva de clan_members; la fila del terreno solo nombra al clan.

Cachés

Clanes, miembros, rangos, relaciones, terrenos e invitaciones se mantienen en memoria y se escriben al cambiar, así que el camino caliente no toca la base de datos. Dos cosas se cachean con TTL:

CachéTTLPor qué
Cada ranking30 sUn scoreboard pregunta cuatro veces por segundo
La lista de conectados por clan y por alianza1 sTreinta huecos × varios espectadores × cuatro veces por segundo
Editar filas a mano requiere reiniciar

Las cachés se cargan al activar y las mantiene al día el propio plugin con sus escrituras. Una fila cambiada directamente en la base de datos no se detecta, y se sobrescribirá la próxima vez que ese clan cambie. Usa /clanadmin donde cubra lo que necesitas, y para el servidor donde no.

Arranque

Los repositorios se leen de forma asíncrona, así que el plugin termina de activarse antes de que las tablas hayan respondido. Hasta entonces, cualquier consulta dice sin clan, que es la forma segura de equivocarse un momento. En cuanto las cachés son ciertas, a quien ya esté conectado se le repite la entrada, así que un jugador que se conectó en esa ventana no se queda invisible para su propio clan.

Si la lectura falla del todo, la consola lo dice y el plugin se queda quieto en vez de empezar a escribir contra cachés que sabe vacías.

¿Falta algo en esta página? Dínoslo en Discord