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
| Tabla | Clave | Guarda |
|---|---|---|
clans | id (UUID en texto) | Nombre, líder, saldo, abierto, friendly fire, home, baneados, DTR, congelado, EXP |
clan_members | uuid | El clan del jugador y su rango |
clan_roles | id | Cada rango de cada clan: nombre, peso, permisos, si es el rango por defecto |
clan_relations | clanId:targetClanId | Una opinión direccional, ALLY o RIVAL |
clan_invites | playerUuid:clanId | Una invitación vigente |
clan_claims | id | Un rectángulo: mundo, minX, minZ, maxX, maxZ, baseY |
clan_stats | clanId | Bajas, muertes, segundos jugados |
player_stats | playerUuid:clanId | Lo mismo por jugador y clan, más el último nombre visto |
clan_logs | id | Acción, actor, objetivo, detalle, fecha |
clan_mails | id | Tipo, remitente, destinatario, asunto, cuerpo, enviado, caduca, lista de leídos, lista de borrados, fijado |
lfc_profiles | playerUuid | Estado, publicado, última publicación, caduca, las respuestas |
lfp_postings | clanId | Estado, publicado, última publicación, caduca, descripción, las respuestas |
lfp_applications | playerUuid:clanId | Estado, 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_memberstiene 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
| Índice | Sobre | Para |
|---|---|---|
idx_cl_clan_ts | clan_logs (clanId, timestamp DESC) | El menú de logs: filtrar por clan, más nuevo primero, tomar una página |
idx_cm_clan_sent | clan_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
| Columna | Formato |
|---|---|
clans.bannedPlayers | UUIDs separados por comas |
clan_roles.permissions | Nombres de permiso separados por comas. Un nombre desconocido se salta al leer |
clans.homeLocation | Una 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 / deletedByPlayers | UUIDs separados por comas — así leído y borrado son por miembro desde una sola fila |
lfc_profiles.data / lfp_postings.data | Las respuestas serializadas |
*.status | ACTIVE / 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.expen 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é | TTL | Por qué |
|---|---|---|
| Cada ranking | 30 s | Un scoreboard pregunta cuatro veces por segundo |
| La lista de conectados por clan y por alianza | 1 s | Treinta huecos × varios espectadores × cuatro veces por segundo |
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