package com.ryanmichela.sshd.jline; /** * Copyright 2013 Ryan Michela */ import com.ryanmichela.sshd.ReflectionUtil; import com.ryanmichela.sshd.SshdPlugin; import com.ryanmichela.sshd.Waitable; import jline.console.completer.Completer; import org.bukkit.Bukkit; import org.bukkit.command.CommandMap; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.logging.Level; public class ConsoleCommandCompleter implements Completer { public int complete(final String buffer, final int cursor, final List candidates) { Waitable> waitable = new Waitable>() { @Override protected List evaluate() { CommandMap commandMap = ReflectionUtil.getProtectedValue(Bukkit.getServer(), "commandMap"); return commandMap.tabComplete(Bukkit.getServer().getConsoleSender(), buffer); } }; Bukkit.getScheduler().runTask(SshdPlugin.instance, waitable); try { List offers = waitable.get(); if (offers == null) return cursor; candidates.addAll(offers); final int lastSpace = buffer.lastIndexOf(' '); if (lastSpace == -1) return cursor - buffer.length(); else return cursor - (buffer.length() - lastSpace - 1); } catch (ExecutionException e) { SshdPlugin.instance.getLogger().log(Level.WARNING, "Unhandled exception when tab completing", e); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } return cursor; } }