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);
}
}