package net.smoofyuniverse.festivia.listener; import com.google.inject.Inject; import net.smoofyuniverse.cardio.text.TextFormatter; import net.smoofyuniverse.festivia.api.State; import net.smoofyuniverse.festivia.impl.FestiviaManager; import net.smoofyuniverse.festivia.impl.GameTeam; import net.smoofyuniverse.festivia.impl.GameUser; import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.event.Listener; import org.spongepowered.api.event.filter.cause.Root; import org.spongepowered.api.event.message.MessageChannelEvent; import org.spongepowered.api.event.message.MessageEvent.MessageFormatter; import org.spongepowered.api.text.Text; import org.spongepowered.api.text.TextTemplate; import org.spongepowered.api.text.action.TextActions; import org.spongepowered.api.text.channel.MessageChannel; import org.spongepowered.api.text.format.TextColors; import org.spongepowered.api.text.transform.SimpleTextTemplateApplier; public class ChatListener { public static final TextTemplate BODY_CONTENT = TextTemplate.of(TextTemplate.arg("content")), HEADER_NAME = TextTemplate.of(TextTemplate.arg("name"), ": "), HEADER_TEAM = TextTemplate.of(TextColors.DARK_GRAY, TextActions.showText(Text.of("Précédez le message par ! pour parler à tous.")), "[Equipe] "), HEADER_SPEC = TextTemplate.of(TextColors.GRAY, "[Spec] "); @Inject private FestiviaManager manager; @Listener public void onPlayerChat(MessageChannelEvent.Chat e, @Root Player p) { if (!e.getChannel().isPresent()) return; String content = e.getRawMessage().toPlain().trim(); GameUser u = GameUser.of(p); e.setChannel(MessageChannel.TO_PLAYERS); MessageFormatter f = e.getFormatter(); f.getHeader().clear(); f.getBody().clear(); if (!u.inGame()) f.getHeader().add(new SimpleTextTemplateApplier(HEADER_SPEC)); // Spectator prefix if (content.charAt(0) == '!') { // Global chat if (content.length() == 1) { e.setCancelled(true); return; } content = content.substring(1); } else { State state = this.manager.getState(); if (state == State.WAITING || state == State.STARTING || state == State.PLAYING) { GameTeam t = u.getTeam().orElse(null); if (t != null) { // Team chat f.getHeader().add(new SimpleTextTemplateApplier(HEADER_TEAM)); // Team prefix e.setChannel(MessageChannel.fixed(t.getUsers())); } } } SimpleTextTemplateApplier nameA = new SimpleTextTemplateApplier(HEADER_NAME); nameA.setParameter("name", u.getColoredName()); f.getHeader().add(nameA); SimpleTextTemplateApplier contentA = new SimpleTextTemplateApplier(BODY_CONTENT); contentA.setParameter("content", TextFormatter.format(p, content)); f.getBody().add(contentA); } }