Contenido generado con IA — puede contener errores.

Módulo de chat

Funciones de chat

Todo lo de chat/config.yml que no es el filtro: menciones, emojis, ítems mostrados, susurros, moderación, el anunciador y los mensajes del módulo.

chat/config.yml guarda los interruptores del módulo. El filtro tiene su propio archivo; todo lo demás está aquí.

SecciónClaves
listener-priorityDónde toma el módulo el evento de chat: LOWEST, LOW, NORMAL, HIGH, HIGHEST. Por defecto HIGHEST
commandsUn booleano por comando de jugador: msg, reply, ignore, ignoreall, spymsg, mutechat, clearchat, broadcast, channel
spyformat, con {sender}, {receiver} y {message}
msgsound, un efecto de ExyliaLib que suena para quien recibe un susurro
grammarenabled
emojisenabled
command-replacerenabled, format (%command%), hover
linksenabled
mentionsenabled, format (%player%), max, cooldown-seconds, feedback
renderscache-seconds, y después item, inventory y enderchest
cross-serverenabled
console-format{channel}, {name}, {message}. Por defecto [{channel}] {name}: {message}
filtered-markerSe pone delante de un mensaje bloqueado para el staff que aún puede leerlo. Por defecto {error}✖

listener-priority en HIGHEST deja que todos los demás plugins hablen antes de que el módulo tome el control. Un valor que no sea una prioridad de evento se reporta y se usa HIGHEST.

commands se lee en cada recarga, no solo al arrancar: un comando apagado deja de responder sin reiniciar. Un comando apagado no se registra siquiera, así que otro plugin puede reclamarlo.

Menciones

mentions:
  enabled: true
  format: '{secondary}@%player%'
  max: 3
  cooldown-seconds: 5.0
  feedback:
    sound: { name: BLOCK_NOTE_BLOCK_PLING, volume: 1.0, pitch: 1.4 }

Escribir la @ es una cortesía, no un requisito: un nombre a secas es como habla la gente, y la reescritura vuelve a poner la @. Un nombre dentro de una palabra más larga no es una mención, así que Notchy es una palabra y no una mención de Notch.

Solo se puede mencionar a quien va a leer el mensaje de verdad — la mención se compara contra los viewers del mensaje, así que un nombre en un canal que alguien no puede leer no hace nada. Las menciones por encima de max en un mismo mensaje se quedan como texto plano, y el emisor no puede mencionarse a sí mismo.

feedback es un efecto de ExyliaLib que se reproduce para el jugador mencionado, y viene solo como sonido: un pling de nota, no un título cruzando la pantalla, porque una mención es un toque en el hombro y un título es una interrupción. Si quieres uno, escribe un title, una action-bar o un fuego artificial dentro. %mention% dentro de él es el nombre del jugador que dijo el suyo. A un jugador no se le avisa dos veces dentro de cooldown-seconds, por muchas veces que lo nombren.

El resaltado ocurre en TRANSFORM y el aviso en DELIVERY, así que un mensaje que el filtro detuvo por el camino no avisa a nadie. El emisor necesita exyliachatcosmetics.chat.mentions.

Emojis

chat/text/emojis.yml es la tabla; emojis.enabled es el interruptor.

plugins/ExyliaChatCosmetics/chat/text/emojis.yml
emojis:
  '<3': '{error}❤'
  ':)': '{success}☺'
  '*star*': '{highlight}★'
 
gated:
  discord:
    trigger: '[discord]'
    replacement: "<click:open_url:'https://discord.exylia.net'><hover:show_text:'{letters}Click to join'>{info}discord.exylia.net</hover></click>"
    permission: exyliachatcosmetics.chat.emoji.discord

emojis.<disparador>: reemplazo es para todo el mundo. Cada gated.<nombre> nombra un trigger, un replacement y un permission, que por defecto es exyliachatcosmetics.chat.emoji.<nombre> si se deja fuera.

Un reemplazo se escribe como cualquier línea de Exylia: tokens de paleta, MiniMessage, su propio hover y clic, y %placeholders% — aunque solo un reemplazo que nombre uno paga por resolverlo.

Todos los disparadores se compilan en una sola alternancia, del más largo al más corto, para que :)) no se lo coma :).

Gramática

chat/text/grammar.yml es la tabla; grammar.enabled es el interruptor.

rules:
  i: 'I'
  im: "I'm"
  dont: "don't"
  alot: 'a lot'

rules.<mal>: bien. Solo palabras enteras, comparadas sin distinguir mayúsculas, sustituidas por exactamente lo que escribiste.

Reemplazo de comandos

Un /comando escrito en el chat se convierte en algo que un lector puede clicar para escribirlo. format lo dibuja — %command% es el comando sin la barra — y hover es lo que dice. Al clicar se sugiere /comando con un espacio al final, listo para los argumentos.

Solo se reemplaza el nombre del comando; lo que el jugador escribiera después se queda como texto.

Enlaces

Una URL se subraya y se vuelve clicable, pero solo para quien tenga exyliachatcosmetics.chat.links. Los enlaces de todos los demás ya los enmascaró o bloqueó la comprobación url del filtro antes de llegar aquí, así que un enlace que llegó sin enmascarar es de alguien que se salta el filtro de todas formas.

Ítems mostrados

Tres cosas que un jugador puede enseñar en el chat.

EscritoDisparadoresPermisoMuestra
[item][item], [i], [hand]exyliachatcosmetics.chat.render.itemLo que lleva en la mano, con el hover de ítem de siempre
[inv][inv], [inventory]…chat.render.invSu inventario, con un recuento en el hover
[ec][ec], [enderchest]…chat.render.ecSu cofre de ender, con un recuento en el hover

Cada uno se dibuja como mucho una vez por mensaje: una línea con veinte [inv] es una ventana, no veinte instantáneas. Los disparadores se comparan sin distinguir mayúsculas, y el format ({item}, {player}) y el title (%player%) de cada tipo son configurables.

Al clicar se abre una copia de solo lectura de lo que tenía el emisor cuando escribió la línea. Es un contenedor normal cuyos clics y arrastres se rechazan, no un menú; no hay nada dentro con lo que interactuar. [item] se abre en una fila con el ítem en el centro, salvo una caja de shulker en la mano, que se abre sobre su contenido. [inv] se abre en un cofre doble dispuesto como la pantalla de inventario, con la armadura y las dos manos en la fila de abajo.

Las instantáneas viven renders.cache-seconds (por defecto 60) en una caché acotada. Después de eso el clic responde renders.expired de chat/messages.yml. El clic ejecuta el comando oculto /chatcosmeticsrender <id>, y el id son ocho caracteres al azar y no un contador, para que nadie abra la ventana de otro adivinando un número. Ese comando está registrado para que el clic tenga a qué llamar; no hay nada que escribir.

La instantánea se toma en el hilo del chat

El evento de chat es asíncrono y el mensaje tiene que decidirse dentro de él, así que el inventario se copia donde está el mensaje — fuera del hilo principal, como hace cualquier plugin de chat que enseña ítems. Lo que se copia son pilas de ítems, que son datos planos, y aquí nada le escribe al jugador ni al mundo. De lo que Paper protege fuera del hilo es de mutar el mundo y las entidades, y esto no hace ninguna de las dos.

Una mano vacía no produce nada: el disparador se queda como texto y al emisor se le dice por qué, en vez de dejarle leer [item] en su propio mensaje sin explicación.

Mensajes privados, ignorados y social spy

/msg (/tell, /w, /whisper), /reply (/r), /ignore <jugador>, /ignoreall (/msgtoggle, /togglemsg) y /spymsg (/socialspy).

Un susurro son dos líneas, de los bloques sender y receiver de msg.yml. Cada una se dibuja con su propio lector como viewer y con la otra persona como objetivo de los placeholders, para que un hover que habla de "él" hable de la persona correcta en las dos pantallas. Ver Formatos.

/ignore alterna a un jugador; /ignoreall cierra el buzón a todo el mundo. Los dos se guardan por jugador. Un susurro a un buzón cerrado o que te ignora se lo dice al emisor, en vez de fingir que se entregó. exyliachatcosmetics.chat.bypass.ignore atraviesa los dos, y a quien tenga exyliachatcosmetics.chat.staff no se le puede ignorar en absoluto.

PrivateMessageEvent se lanza antes de que un susurro llegue a alguien de este servidor, y cancelarlo no entrega nada.

/spymsg alterna leer los susurros de todo el mundo, dibujados con spy.format. Un espía nunca lee sus propios susurros ni aquellos de los que es destinatario; esos ya los tendría.

/reply responde a quien te susurró por última vez o a quien susurraste por última vez — las dos partes lo recuerdan, así que /r funciona antes de que hayas escrito nada.

Con cross-server encendido, un susurro a alguien que no está en este servidor se construye aquí, se publica y se muestra allí. El otro lado solo comprueba el buzón cerrado y la lista de ignorados. Si no está en ningún servidor, al emisor se le dice que está desconectado.

Moderación

ComandoExcepción
/mutechatexyliachatcosmetics.chat.bypass.mute
/clearchatexyliachatcosmetics.chat.bypass.clearchat
/broadcast (/bc)—

Los tres se anuncian con una línea que nombra a quien lo hizo, y los tres se propagan entre servidores con cross-server encendido — un silencio se anuncia una vez, al cambiar, no una vez por servidor.

/clearchat empuja cien líneas en blanco a cada pantalla salvo a las que lo saltan.

El silencio no se guarda

Es una bandera en memoria, que la compuerta lee en cada mensaje. Un reinicio quita el silencio, que es lo que espera un dueño que silenció durante una avalancha hace una hora.

El anunciador

chat/announcements.yml guarda la rotación.

plugins/ExyliaChatCosmetics/chat/announcements.yml
enabled: true
interval-seconds: 300
random: false
 
replacements:
  discord:
    text: '{info}&ldiscord.exylia.net'
    hover: '{warning}➥ Click to join'
    click: 'OPEN_URL:https://discord.exylia.net'
 
announcements:
  discord:
    lines:
      - ' {letters_black}▎ {letters}join us at {discord}{letters}.'
    sound: BLOCK_NOTE_BLOCK_PLING
  cosmetics:
    lines:
      - ' {letters_black}▎ {letters}open {highlight}/cosmetics{letters}.'
    hover: '{warning}➥ Click to open'
    click: 'RUN_COMMAND:/cosmetics'
    permission: ''
ClaveSignificado
enabledfalse para el reloj
interval-secondsEntre dos anuncios. Cualquier valor por debajo de 5 se sube a 5
randomtrue elige cualquiera, false va bajando la lista
announcements.<id>.linesUna línea o una lista. Tokens de paleta, MiniMessage y %placeholders%
announcements.<id>.hoverUna línea o una lista, mostrada sobre todas las líneas del anuncio
announcements.<id>.clickRUN_COMMAND:, SUGGEST_COMMAND:, OPEN_URL: o COPY:
announcements.<id>.soundUn nombre de sonido, o fuera para el silencio
announcements.<id>.permissionSolo lo leen quienes lo tengan; vacío para todo el mundo
replacements.<nombre>Una pieza con su propio text, hover y click que una línea pega con {nombre}

Un replacement es la forma de que una palabra de una línea lleve su propio hover y su propio clic sin que lo lleve el resto de la línea. Hay un solo temporizador asíncrono para todos los anuncios, y recargar cambia el archivo y reinicia el reloj desde cero.

Una línea sin ningún %placeholder% se construye una vez y se le envía a todos; una línea con uno se construye por lector, que es lo único que el anunciador hace por jugador.

/cca chat announce <id> envía uno ahora; /cca chat announce next envía el que toque y avanza la rotación.

Los anuncios son el servidor hablando, así que conservan las versalitas de ExyliaLib — al contrario que la línea de chat. Ver El módulo de chat.

chat/messages.yml

Cada línea que envía el módulo, en secciones: general, whispers, ignore, staff (spy, alertas del filtro, los resultados de /cca chat), moderation (silencio, limpieza, broadcast, castigado), channels, filter, renders y announcer.

Tiene su propio prefix, y %prefix% en este archivo se sustituye desde él antes de que la línea llegue al motor de texto — así que el prefijo general del plugin, el del messages.yml de los cosméticos, nunca se aplica aquí.

Por qué el chat no toma prestado el prefijo de los cosméticos

Un plugin de chat habla como el chat. Un servidor que enciende el módulo y esconde los cosméticos no debería leer el nombre del plugin de cosméticos delante de un error de susurro, así que los dos prefijos están separados a propósito y ninguno puede colarse en el otro.

Entre servidores

cross-server.enabled: true más Redis en el database.yml de ExyliaLib pone al módulo en el canal chat de la librería. Las líneas de chat de canales marcados cross-server, los susurros, el interruptor de silencio, /clearchat y /broadcast viajan todos; todo se dibuja donde se escribió y el servidor que lo recibe solo decide quién lo lee. Sin Redis no se publica nada y no llega nada.

La parte de los canales está en Canales.

Relacionado

Todos los comandos y nodos que se nombran aquí están completos en Comandos y Permisos.

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