ProjectAres/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/channels/AdminChannel.java

132 lines
5.4 KiB
Java

package tc.oc.commons.bukkit.channels;
import java.util.stream.Stream;
import javax.inject.Inject;
import javax.inject.Singleton;
import com.github.rmsy.channels.Channel;
import com.github.rmsy.channels.ChannelsPlugin;
import com.github.rmsy.channels.PlayerManager;
import com.github.rmsy.channels.event.ChannelMessageEvent;
import com.github.rmsy.channels.impl.SimpleChannel;
import com.sk89q.minecraft.util.commands.Command;
import com.sk89q.minecraft.util.commands.CommandContext;
import com.sk89q.minecraft.util.commands.CommandException;
import com.sk89q.minecraft.util.commands.CommandPermissions;
import com.sk89q.minecraft.util.commands.CommandPermissionsException;
import com.sk89q.minecraft.util.commands.CommandUsageException;
import com.sk89q.minecraft.util.commands.Console;
import me.anxuiz.settings.Setting;
import me.anxuiz.settings.SettingBuilder;
import me.anxuiz.settings.types.BooleanType;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player;
import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionDefault;
import tc.oc.api.bukkit.users.OnlinePlayers;
import tc.oc.commons.bukkit.settings.SettingManagerProvider;
import tc.oc.commons.bukkit.util.ItemCreator;
import tc.oc.commons.core.commands.Commands;
@Singleton
public class AdminChannel extends SimpleChannel implements Commands {
static final Setting SETTING = new SettingBuilder()
.name("AdminChat").alias("ac")
.summary("Show confidential staff info")
.type(new BooleanType())
.defaultValue(true).get();
public static final String PERM_NODE = "chat.admin";
public static final String PERM_SEND = PERM_NODE + ".send";
public static final String PERM_RECEIVE = PERM_NODE + ".receive";
public static final String PREFIX = ChatColor.WHITE + "[" + ChatColor.GOLD + "A" + ChatColor.WHITE + "]";
public static final String BROADCAST_FORMAT = PREFIX + " {2}";
public static final String FORMAT = PREFIX + " {1}" + ChatColor.WHITE + ": {2}";
private final ConsoleCommandSender console;
private final OnlinePlayers players;
private final SettingManagerProvider settings;
@Inject AdminChannel(ConsoleCommandSender console, OnlinePlayers players, SettingManagerProvider settings) {
super(FORMAT, BROADCAST_FORMAT, new Permission(PERM_RECEIVE, PermissionDefault.OP));
this.players = players;
this.settings = settings;
this.console = console;
}
@Command(aliases = "a",
desc = "Sends a message to the staff channel (or sets the staff channel to your default channel).",
max = -1,
min = 0,
anyFlags = true,
usage = "[message...]")
@Console
@CommandPermissions({PERM_SEND, PERM_RECEIVE})
public void onAdminChatCommand(final CommandContext arguments, final CommandSender sender) throws CommandException {
if(arguments.argsLength() == 0) {
if (sender.hasPermission(PERM_RECEIVE)) {
if (sender instanceof Player) {
Player player = (Player) sender;
PlayerManager playerManager = ChannelsPlugin.get().getPlayerManager();
Channel oldChannel = playerManager.getMembershipChannel(player);
playerManager.setMembershipChannel(player, this);
if (!oldChannel.equals(this)) {
sender.sendMessage(org.bukkit.ChatColor.YELLOW + "Changed default channel to administrator chat");
} else {
throw new CommandException("Administrator chat is already your default channel");
}
} else {
throw new CommandUsageException("You must provide a message.", "/a <message...>");
}
} else {
throw new CommandPermissionsException();
}
} else if (sender.hasPermission(PERM_SEND)) {
Player sendingPlayer = null;
if (sender instanceof Player) {
sendingPlayer = (Player) sender;
}
this.sendMessage(arguments.getJoinedStrings(0), sendingPlayer);
if (!sender.hasPermission(PERM_RECEIVE)) {
sender.sendMessage(org.bukkit.ChatColor.YELLOW + "Message sent");
}
} else {
throw new CommandPermissionsException();
}
}
@Override
public void sendMessageToViewer(Player sender, CommandSender viewer, String sanitizedMessage, ChannelMessageEvent event) {
if(viewer != null && !isEnabled(viewer)) {
return;
}
super.sendMessageToViewer(sender, viewer, sanitizedMessage, event);
}
public boolean isEnabled(Player viewer) {
return (boolean) settings.getManager(viewer)
.getValue(SETTING);
}
public boolean isEnabled(CommandSender viewer) {
return !(viewer instanceof Player) || isEnabled((Player) viewer);
}
public boolean isVisible(CommandSender viewer) {
return viewer.hasPermission(getListeningPermission()) &&
isEnabled(viewer);
}
public Stream<CommandSender> viewers() {
return Stream.<CommandSender>concat(Stream.of(console),
players.all().stream())
.filter(this::isVisible);
}
}