2021-01-03 07:21:15 +00:00
package dev.plex.listener.impl ;
2020-10-28 19:07:02 +00:00
2023-08-30 03:41:15 +00:00
import dev.plex.hook.VaultHook ;
2021-01-03 07:21:15 +00:00
import dev.plex.listener.PlexListener ;
2022-03-20 02:04:55 +00:00
import dev.plex.listener.annotation.Toggleable ;
2023-08-25 11:07:56 +00:00
import dev.plex.meta.PlayerMeta ;
2021-01-03 07:21:15 +00:00
import dev.plex.player.PlexPlayer ;
2022-05-04 14:50:37 +00:00
import dev.plex.util.PlexUtils ;
2022-05-04 16:08:35 +00:00
import dev.plex.util.minimessage.SafeMiniMessage ;
2022-08-03 00:03:04 +00:00
import dev.plex.util.redis.MessageUtil ;
2022-01-27 09:00:50 +00:00
import io.papermc.paper.chat.ChatRenderer ;
import io.papermc.paper.event.player.AsyncChatEvent ;
import net.kyori.adventure.audience.Audience ;
import net.kyori.adventure.text.Component ;
2023-08-30 03:41:15 +00:00
import net.kyori.adventure.text.TextComponent ;
2022-05-02 06:04:21 +00:00
import net.kyori.adventure.text.TextReplacementConfig ;
import net.kyori.adventure.text.event.ClickEvent ;
2022-01-27 09:00:50 +00:00
import net.kyori.adventure.text.format.NamedTextColor ;
2024-01-26 11:26:54 +00:00
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer ;
2022-01-27 09:00:50 +00:00
import org.bukkit.entity.Player ;
2020-10-28 19:07:02 +00:00
import org.bukkit.event.EventHandler ;
2023-08-28 11:35:32 +00:00
import org.bukkit.event.EventPriority ;
2022-01-27 09:00:50 +00:00
import org.jetbrains.annotations.NotNull ;
2020-10-28 19:07:02 +00:00
2023-03-08 20:23:10 +00:00
import java.util.UUID ;
2023-08-24 02:34:01 +00:00
import java.util.function.BiConsumer ;
2023-03-08 20:23:10 +00:00
import java.util.function.Supplier ;
2024-01-26 11:26:54 +00:00
import java.util.regex.Pattern ;
2023-03-08 20:23:10 +00:00
2022-03-20 02:04:55 +00:00
@Toggleable ( " chat.enabled " )
2020-10-31 08:55:27 +00:00
public class ChatListener extends PlexListener
2020-10-28 19:07:02 +00:00
{
2022-08-03 00:03:04 +00:00
public static final TextReplacementConfig URL_REPLACEMENT_CONFIG = TextReplacementConfig
2022-05-20 20:44:25 +00:00
. builder ( )
. match ( " (https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|] " )
. replacement ( ( matchResult , builder ) - > Component . empty ( )
. content ( matchResult . group ( ) )
. clickEvent ( ClickEvent . openUrl (
matchResult . group ( )
) ) ) . build ( ) ;
2023-08-24 02:34:01 +00:00
public static BiConsumer < AsyncChatEvent , PlexPlayer > PRE_RENDERER = ChatListener : : defaultChatProcessing ;
2022-08-02 12:08:52 +00:00
private final PlexChatRenderer renderer = new PlexChatRenderer ( ) ;
2022-05-10 05:08:45 +00:00
2023-08-28 11:35:32 +00:00
@EventHandler ( priority = EventPriority . LOWEST )
2022-01-27 09:00:50 +00:00
public void onChat ( AsyncChatEvent event )
2020-10-28 19:07:02 +00:00
{
2022-08-02 12:08:52 +00:00
PlexPlayer plexPlayer = plugin . getPlayerCache ( ) . getPlexPlayerMap ( ) . get ( event . getPlayer ( ) . getUniqueId ( ) ) ;
2023-03-08 20:23:10 +00:00
if ( plexPlayer . isStaffChat ( ) )
{
2023-08-30 03:41:15 +00:00
String prefix = PlexUtils . mmSerialize ( VaultHook . getPrefix ( event . getPlayer ( ) ) ) ; // Don't use PlexPlayer#getPrefix because that returns their custom set prefix and not their group's
MessageUtil . sendStaffChat ( event . getPlayer ( ) , event . message ( ) , PlexUtils . adminChat ( event . getPlayer ( ) . getName ( ) , prefix , SafeMiniMessage . mmSerialize ( event . message ( ) ) ) . toArray ( UUID [ ] : : new ) ) ;
2024-01-26 11:26:54 +00:00
plugin . getServer ( ) . getConsoleSender ( ) . sendMessage ( PlexUtils . messageComponent ( " adminChatFormat " , event . getPlayer ( ) . getName ( ) , prefix , SafeMiniMessage . mmSerialize ( event . message ( ) . replaceText ( URL_REPLACEMENT_CONFIG ) ) ) ) ;
2022-08-03 00:03:04 +00:00
event . setCancelled ( true ) ;
return ;
}
2023-08-25 11:07:56 +00:00
Component prefix = PlayerMeta . getPrefix ( plexPlayer ) ;
2022-05-10 05:08:45 +00:00
2023-08-25 04:24:14 +00:00
if ( prefix ! = null & & ! prefix . equals ( Component . empty ( ) ) & & ! prefix . equals ( Component . space ( ) ) )
2022-02-26 06:24:11 +00:00
{
2022-08-02 12:08:52 +00:00
renderer . hasPrefix = true ;
renderer . prefix = prefix ;
2022-05-06 04:27:32 +00:00
}
2022-08-02 12:08:52 +00:00
else
{
renderer . hasPrefix = false ;
renderer . prefix = null ;
}
2023-08-24 02:34:01 +00:00
PRE_RENDERER . accept ( event , plexPlayer ) ;
2022-08-02 12:08:52 +00:00
event . renderer ( renderer ) ;
2022-01-27 09:00:50 +00:00
}
public static class PlexChatRenderer implements ChatRenderer
{
public boolean hasPrefix ;
2022-03-18 01:18:35 +00:00
public Component prefix ;
2022-05-11 05:48:47 +00:00
public Supplier < Component > before = null ;
2022-01-27 09:00:50 +00:00
@Override
public @NotNull Component render ( @NotNull Player source , @NotNull Component sourceDisplayName , @NotNull Component message , @NotNull Audience viewer )
{
2022-05-04 15:08:52 +00:00
Component component = Component . empty ( ) ;
2022-05-02 06:04:21 +00:00
2022-05-11 05:48:47 +00:00
if ( before ! = null )
{
component = component . append ( before . get ( ) ) ;
}
2022-01-27 09:00:50 +00:00
if ( hasPrefix )
{
2022-05-11 05:48:47 +00:00
component = component . append ( prefix ) . append ( Component . space ( ) ) ;
2022-01-27 09:00:50 +00:00
}
2022-05-20 20:44:25 +00:00
return component
2022-08-02 00:23:57 +00:00
. append ( Component . empty ( ) )
2022-08-02 04:38:18 +00:00
. append (
source . name ( ) . equals ( sourceDisplayName ) ?
SafeMiniMessage . mmDeserialize ( plugin . config . getString ( " chat.name-color " ) + SafeMiniMessage . mmSerialize ( sourceDisplayName ) )
: SafeMiniMessage . mmDeserialize ( plugin . config . getString ( " chat.name-color " ) ) . append ( sourceDisplayName )
)
2022-05-20 20:44:25 +00:00
. append ( Component . space ( ) )
. append ( Component . text ( " » " ) . color ( NamedTextColor . GRAY ) )
. append ( Component . space ( ) )
2023-08-24 02:34:01 +00:00
. append ( message )
2022-05-20 20:44:25 +00:00
. replaceText ( URL_REPLACEMENT_CONFIG ) ;
2021-06-20 08:02:07 +00:00
}
2020-10-28 19:07:02 +00:00
}
2023-08-24 02:34:01 +00:00
private static void defaultChatProcessing ( AsyncChatEvent event , PlexPlayer plexPlayer )
{
2024-01-26 11:26:54 +00:00
String text = PlexUtils . getTextFromComponent ( event . message ( ) ) ;
event . message ( PlexUtils . stringToComponent ( text ) ) ;
2023-08-24 02:34:01 +00:00
}
2020-10-28 19:07:02 +00:00
}