diff --git a/src/main/java/com/ryanmichela/sshd/implementations/SSHDCommandSender.java b/src/main/java/com/ryanmichela/sshd/implementations/SSHDCommandSender.java index 5f6a570..cfceaaa 100644 --- a/src/main/java/com/ryanmichela/sshd/implementations/SSHDCommandSender.java +++ b/src/main/java/com/ryanmichela/sshd/implementations/SSHDCommandSender.java @@ -2,21 +2,29 @@ package com.ryanmichela.sshd.implementations; import com.ryanmichela.sshd.ConsoleShellFactory; import com.ryanmichela.sshd.SshdPlugin; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.Server; +import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.conversations.Conversation; import org.bukkit.conversations.ConversationAbandonedEvent; import org.bukkit.conversations.ManuallyAbandonedConversationCanceller; -import org.bukkit.craftbukkit.v1_12_R1.command.ServerCommandSender; -import org.bukkit.craftbukkit.v1_12_R1.conversations.ConversationTracker; +import org.bukkit.permissions.PermissibleBase; +import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionAttachment; +import org.bukkit.permissions.PermissionAttachmentInfo; +import org.bukkit.plugin.Plugin; import java.io.IOException; import java.util.Arrays; +import java.util.Set; import java.util.logging.Level; -public class SSHDCommandSender extends ServerCommandSender implements ConsoleCommandSender { +public class SSHDCommandSender implements ConsoleCommandSender, CommandSender { - private final ConversationTracker conversationTracker = new ConversationTracker(); + private final PermissibleBase perm = new PermissibleBase(this); + private final SSHDConversationTracker conversationTracker = new SSHDConversationTracker(); public void sendMessage(String message) { this.sendRawMessage(message); @@ -24,7 +32,7 @@ public class SSHDCommandSender extends ServerCommandSender implements ConsoleCom public void sendRawMessage(String message) { try { - ConsoleShellFactory.ConsoleShell.consoleReader.println(ChatColor.stripColor(message) + "\r"); + ConsoleShellFactory.ConsoleShell.consoleReader.println(ChatColor.stripColor(message)); } catch (IOException e) { SshdPlugin.instance.getLogger().log(Level.SEVERE, "Error sending message to SSHDCommandSender", e); } @@ -66,4 +74,56 @@ public class SSHDCommandSender extends ServerCommandSender implements ConsoleCom return this.conversationTracker.isConversing(); } + public boolean isPermissionSet(String name) { + return this.perm.isPermissionSet(name); + } + + public boolean isPermissionSet(Permission perm) { + return this.perm.isPermissionSet(perm); + } + + public boolean hasPermission(String name) { + return this.perm.hasPermission(name); + } + + public boolean hasPermission(Permission perm) { + return this.perm.hasPermission(perm); + } + + public PermissionAttachment addAttachment(Plugin plugin, String name, boolean value) { + return this.perm.addAttachment(plugin, name, value); + } + + public PermissionAttachment addAttachment(Plugin plugin) { + return this.perm.addAttachment(plugin); + } + + public PermissionAttachment addAttachment(Plugin plugin, String name, boolean value, int ticks) { + return this.perm.addAttachment(plugin, name, value, ticks); + } + + public PermissionAttachment addAttachment(Plugin plugin, int ticks) { + return this.perm.addAttachment(plugin, ticks); + } + + public void removeAttachment(PermissionAttachment attachment) { + this.perm.removeAttachment(attachment); + } + + public void recalculatePermissions() { + this.perm.recalculatePermissions(); + } + + public Set getEffectivePermissions() { + return this.perm.getEffectivePermissions(); + } + + public boolean isPlayer() { + return false; + } + + public Server getServer() { + return Bukkit.getServer(); + } + } diff --git a/src/main/java/com/ryanmichela/sshd/implementations/SSHDConversationTracker.java b/src/main/java/com/ryanmichela/sshd/implementations/SSHDConversationTracker.java new file mode 100644 index 0000000..947ef2d --- /dev/null +++ b/src/main/java/com/ryanmichela/sshd/implementations/SSHDConversationTracker.java @@ -0,0 +1,78 @@ +package com.ryanmichela.sshd.implementations; + +import org.bukkit.Bukkit; +import org.bukkit.conversations.Conversation; +import org.bukkit.conversations.ConversationAbandonedEvent; +import org.bukkit.conversations.ManuallyAbandonedConversationCanceller; + +import java.util.LinkedList; +import java.util.logging.Level; + +public class SSHDConversationTracker { + private LinkedList conversationQueue = new LinkedList<>(); + + synchronized boolean beginConversation(Conversation conversation) { + if (!this.conversationQueue.contains(conversation)) { + this.conversationQueue.addLast(conversation); + if (this.conversationQueue.getFirst() == conversation) { + conversation.begin(); + conversation.outputNextPrompt(); + return true; + } + } + + return true; + } + + synchronized void abandonConversation(Conversation conversation, ConversationAbandonedEvent details) { + if (!this.conversationQueue.isEmpty()) { + if (this.conversationQueue.getFirst() == conversation) { + conversation.abandon(details); + } + + if (this.conversationQueue.contains(conversation)) { + this.conversationQueue.remove(conversation); + } + + if (!this.conversationQueue.isEmpty()) { + this.conversationQueue.getFirst().outputNextPrompt(); + } + } + + } + + public synchronized void abandonAllConversations() { + LinkedList oldQueue = this.conversationQueue; + this.conversationQueue = new LinkedList<>(); + + for (Conversation conversation : oldQueue) { + try { + conversation.abandon(new ConversationAbandonedEvent(conversation, new ManuallyAbandonedConversationCanceller())); + } catch (Throwable var5) { + Bukkit.getLogger().log(Level.SEVERE, "Unexpected exception while abandoning a conversation", var5); + } + } + + } + + synchronized void acceptConversationInput(String input) { + if (this.isConversing()) { + Conversation conversation = this.conversationQueue.getFirst(); + + try { + conversation.acceptInput(input); + } catch (Throwable var4) { + conversation.getContext().getPlugin().getLogger().log(Level.WARNING, String.format("Plugin %s generated an exception whilst handling conversation input", conversation.getContext().getPlugin().getDescription().getFullName()), var4); + } + } + + } + + synchronized boolean isConversing() { + return !this.conversationQueue.isEmpty(); + } + + public synchronized boolean isConversingModaly() { + return this.isConversing() && this.conversationQueue.getFirst().isModal(); + } +}