package net.glowstone.net.handler.play.player; import com.flowpowered.networking.MessageHandler; import net.glowstone.EventFactory; import net.glowstone.net.GlowSession; import net.glowstone.net.message.play.player.TabCompleteMessage; import net.glowstone.net.message.play.player.TabCompleteResponseMessage; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerChatTabCompleteEvent; import org.bukkit.util.StringUtil; import java.util.ArrayList; import java.util.Collections; import java.util.List; public final class TabCompleteHandler implements MessageHandler<GlowSession, TabCompleteMessage> { @Override public void handle(GlowSession session, TabCompleteMessage message) { final Player sender = session.getPlayer(); final String buffer = message.getText(); final List<String> completions = new ArrayList<>(); // complete command or username if (buffer.startsWith("/")) { List<String> items = session.getServer().getCommandMap().tabComplete(sender, buffer.substring(1)); if (items != null) { completions.addAll(items); } } else { int space = buffer.lastIndexOf(' '); String lastWord; if (space == -1) { lastWord = buffer; } else { lastWord = buffer.substring(space + 1); } // from Command for (Player player : session.getServer().getOnlinePlayers()) { String name = player.getName(); if (sender.canSee(player) && StringUtil.startsWithIgnoreCase(name, lastWord)) { completions.add(name); } } Collections.sort(completions, String.CASE_INSENSITIVE_ORDER); } // call event and send response EventFactory.callEvent(new PlayerChatTabCompleteEvent(sender, buffer, completions)); session.send(new TabCompleteResponseMessage(completions)); } }