/*******************************************************************************
* Copyright 2014 Tobias Welther
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package de.tobiyas.racesandclasses.commands.chat.channels;
import java.util.LinkedList;
import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import de.tobiyas.racesandclasses.APIs.LanguageAPI;
import de.tobiyas.racesandclasses.commands.AbstractCommand;
import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayer;
import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayerManager;
import de.tobiyas.racesandclasses.util.chat.ChannelLevel;
import de.tobiyas.racesandclasses.util.consts.PermissionNode;
import de.tobiyas.util.autocomplete.AutoCompleteUtils;
import de.tobiyas.util.player.PlayerUtils;
public class CommandExecutor_Channel extends AbstractCommand {
public CommandExecutor_Channel(){
super("channel");
}
@Override
public boolean onInternalCommand(CommandSender sender, Command command, String label,
String[] args) {
if(!plugin.getConfigManager().getGeneralConfig().isConfig_channels_enable()){
LanguageAPI.sendTranslatedMessage(sender, "something_disabled",
"value", "Channels");
return true;
}
if(args.length == 0){
postHelp(sender);
return true;
}
String channelCommand = args[0];
if(channelCommand.equalsIgnoreCase("info")){
String channelName = "";
if(args.length == 2){
channelName = args[1];
}
postChannelInfo(sender, channelName);
return true;
}
if(channelCommand.equalsIgnoreCase("list")){
listChannels(sender);
return true;
}
if(!(sender instanceof Player)){
LanguageAPI.sendTranslatedMessage(sender,"only_players");
return true;
}
Player player = (Player) sender;
RaCPlayer racPlayer = RaCPlayerManager.get().getPlayer(player);
if(channelCommand.equalsIgnoreCase("change") || channelCommand.equalsIgnoreCase("post") || channelCommand.equalsIgnoreCase("switch")
|| channelCommand.equalsIgnoreCase("ch")){
if(args.length != 2){
LanguageAPI.sendTranslatedMessage(player, "wrong_command_use",
"command", "/channel change <channelname>");
return true;
}
String changeTo = args[1];
changeChannel(racPlayer, changeTo);
return true;
}
if(channelCommand.equalsIgnoreCase("join")){
if(args.length == 1 || args.length > 3){
LanguageAPI.sendTranslatedMessage(player,"wrong_command_use",
"command", "/channel join <channelname> [@password@]");
return true;
}
String channelName = args[1];
String password = "";
if(args.length == 3){
password = args[2];
}
joinChannel(racPlayer, channelName, password);
return true;
}
if(channelCommand.equalsIgnoreCase("leave")){
if(args.length != 2){
LanguageAPI.sendTranslatedMessage(player,"wrong_command_use",
"command", "/channel leave <channelname>");
return true;
}
String channelName = args[1];
leaveChannel(racPlayer, channelName);
return true;
}
if(channelCommand.equalsIgnoreCase("create")){
if(args.length == 1 || args.length > 4){
LanguageAPI.sendTranslatedMessage(player,"wrong_command_use",
"command", "/channel create <channelname> [channelType] [@password@]");
return true;
}
String channelName = args[1];
String channelType = "PublicChannel";
String channelPassword = "";
if(args.length > 2)
channelType = args[2];
if(args.length > 3)
channelPassword = args[3];
createChannel(racPlayer, channelName, channelType, channelPassword);
return true;
}
if(channelCommand.equalsIgnoreCase("reload")){
if(!plugin.getPermissionManager().checkPermissions(sender, PermissionNode.channelReload)) return true;
plugin.getChannelManager().init();
sender.sendMessage(ChatColor.GREEN + "Reloaded.");
}
if(channelCommand.equalsIgnoreCase("ban")){
if(!(args.length == 3 || args.length == 4)){
LanguageAPI.sendTranslatedMessage(player, "wrong_command_use",
"command", "/channel ban <channelname> <playername> [@time_in_seconds@]");
return true;
}
int time = Integer.MAX_VALUE;
try{
time = Integer.valueOf(args[3]);
}catch(Exception e){
}
Player target = PlayerUtils.getPlayer(args[2]);
RaCPlayer racTarget = RaCPlayerManager.get().getPlayer(target);
if(target == null){
//TODO add some output
return true;
}
plugin.getChannelManager().banPlayer(racPlayer, racTarget, args[1], time);
return true;
}
if(channelCommand.equalsIgnoreCase("unban")){
if(!(args.length == 3)){
LanguageAPI.sendTranslatedMessage(player,"wrong_command_use",
"command", "/channel unban <channelname> <playername>");
return true;
}
Player target = PlayerUtils.getPlayer(args[2]);
RaCPlayer racTarget = RaCPlayerManager.get().getPlayer(target);
if(target == null){
//TODO add some output
return true;
}
plugin.getChannelManager().unbanPlayer(racPlayer, racTarget, args[1]);
return true;
}
if(channelCommand.equalsIgnoreCase("mute")){
if(!(args.length == 3 || args.length == 4)){
LanguageAPI.sendTranslatedMessage(player,"wrong_command_use",
"command", "/channel mute <channelname> <playername> [@time_in_seconds@]");
return true;
}
int time = Integer.MAX_VALUE;
try{
time = Integer.valueOf(args[3]);
}catch(Exception e){
}
Player target = PlayerUtils.getPlayer(args[2]);
RaCPlayer racTarget = RaCPlayerManager.get().getPlayer(target);
if(target == null){
//TODO add some output
return true;
}
plugin.getChannelManager().mutePlayer(racPlayer, racTarget, args[1], time);
return true;
}
if(channelCommand.equalsIgnoreCase("unmute")){
if(!(args.length == 3)){
LanguageAPI.sendTranslatedMessage(player,"wrong_command_use",
"command", "/channel unmute <channelname> <playername>");
return true;
}
Player target = PlayerUtils.getPlayer(args[2]);
RaCPlayer racTarget = RaCPlayerManager.get().getPlayer(target);
if(target == null){
//TODO add some output
return true;
}
plugin.getChannelManager().unmutePlayer(racPlayer, racTarget, args[1]);
return true;
}
if(channelCommand.equalsIgnoreCase("edit")){
if(args.length < 4){
LanguageAPI.sendTranslatedMessage(player, "wrong_command_use",
"command", "/channel edit <channelname> <@channel_propertie@> <@new_value@>");
return true;
}
String channel = args[1];
String property = args[2];
String newValue = "";
for(int i = 3; i < args.length; i++){
newValue += args[i];
if(i != args.length - 1){
newValue += " ";
}
}
channelEdit(racPlayer, channel, property, newValue);
return true;
}
if(channelCommand.equalsIgnoreCase("delete")){
if(args.length < 2){
LanguageAPI.sendTranslatedMessage(player, "wrong_command_use",
"command", "/channel delete <channelname>");
return true;
}
String channel = args[1];
channelDelete(racPlayer, channel);
return true;
}
postHelp(player);
return true;
}
private void postHelp(CommandSender sender){
LanguageAPI.sendTranslatedMessage(sender,"wrong_command_use",
"command", "");
sender.sendMessage(ChatColor.RED + "/channel " + ChatColor.LIGHT_PURPLE + "info " + ChatColor.AQUA + "[channelname]");
sender.sendMessage(ChatColor.RED + "/channel " + ChatColor.LIGHT_PURPLE + "list");
sender.sendMessage(ChatColor.RED + "/channel " + ChatColor.LIGHT_PURPLE + "<post/change/switch> " + ChatColor.YELLOW + "<channelname>");
sender.sendMessage(ChatColor.RED + "/channel " + ChatColor.LIGHT_PURPLE + "join " + ChatColor.YELLOW + "<channelname> " +
ChatColor.AQUA + "[@password@]");
sender.sendMessage(ChatColor.RED + "/channel " + ChatColor.LIGHT_PURPLE + "leave " + ChatColor.YELLOW + "<channelname> ");
sender.sendMessage(ChatColor.RED + "/channel " + ChatColor.LIGHT_PURPLE + "create " + ChatColor.YELLOW + "<channelname> " +
ChatColor.AQUA + "[channeltype] [@password@]");
sender.sendMessage(ChatColor.RED + "/channel " + ChatColor.LIGHT_PURPLE + "edit " + ChatColor.YELLOW + "<channelname> " +
ChatColor.AQUA + "<@channel_propertie@> <@new_value@>");
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command,
String alias, String[] args) {
List<String> complete = new LinkedList<String>();
if(args.length == 0) return complete;
if(args.length == 1){
return AutoCompleteUtils.getAllNamesWith(args[0], "info", "list", "change", "join", "leave", "create", "edit");
}
return complete;
}
private void postChannelInfo(CommandSender sender, String channel){
if(channel == "" && sender instanceof Player){
RaCPlayer racPlayer = RaCPlayerManager.get().getPlayer((Player) sender);
channel = racPlayer.getCurrentChatChannel();
}
sender.sendMessage(ChatColor.YELLOW + "=====" + ChatColor.RED + " Channel Information: " +
ChatColor.AQUA + channel + ChatColor.YELLOW + " =====");
plugin.getChannelManager().postChannelInfo(sender, channel);
}
private void channelDelete(RaCPlayer racPlayer, String channel) {
plugin.getChannelManager().deleteChannel(racPlayer, channel);
}
private void listChannels(CommandSender sender){
sender.sendMessage(ChatColor.YELLOW + "======" + ChatColor.RED + "Channel-List:" + ChatColor.YELLOW + "=====");
sender.sendMessage(ChatColor.YELLOW + "HINT: Format is: " + ChatColor.BLUE + "ChannelName: " + ChatColor.AQUA + "ChannelLevel");
for(ChannelLevel level : ChannelLevel.values()){
for(String channel : plugin.getChannelManager().listAllPublicChannels()){
if(plugin.getChannelManager().getChannelLevel(channel) == level && sender instanceof Player){
String addition = "";
RaCPlayer racPlayer = RaCPlayerManager.get().getPlayer((Player) sender);
if(plugin.getChannelManager().isMember(racPlayer, channel)){
addition = ChatColor.YELLOW + " <-[Joined]";
}
sender.sendMessage(ChatColor.BLUE + channel + ": " + ChatColor.AQUA + level.name() + addition);
}
}
}
}
private void joinChannel(RaCPlayer player, String channelName, String password){
ChannelLevel level = plugin.getChannelManager().getChannelLevel(channelName);
if(level == ChannelLevel.NONE){
player.sendMessage(ChatColor.RED + "Could not find any channel named: " + ChatColor.LIGHT_PURPLE + channelName);
return;
}
plugin.getChannelManager().joinChannel(player, channelName, password, true);
}
private void leaveChannel(RaCPlayer player, String channelName){
ChannelLevel level = plugin.getChannelManager().getChannelLevel(channelName);
if(level == ChannelLevel.NONE){
player.sendMessage(ChatColor.RED + "Could not find any channel named: " + ChatColor.LIGHT_PURPLE + channelName);
return;
}
plugin.getChannelManager().leaveChannel(player, channelName, true);
if(channelName.equalsIgnoreCase(player.getCurrentChatChannel())){
player.setCurrentChatChannel("Global");
}
}
private void createChannel(RaCPlayer player, String channelName, String channelType, String channelPassword){
ChannelLevel channelLevel = getChannelLevel(channelType);
if(channelLevel == ChannelLevel.NONE){
player.sendMessage(ChatColor.RED + "Channel Level could not be recognized: " + ChatColor.LIGHT_PURPLE + channelType);
return;
}
if(channelLevel == ChannelLevel.GlobalChannel || channelLevel == ChannelLevel.RaceChannel
|| channelLevel == ChannelLevel.WorldChannel || channelLevel == ChannelLevel.LocalChannel){
player.sendMessage(ChatColor.RED + "You can't create a new " + ChatColor.AQUA + channelLevel);
return;
}
if(channelLevel == ChannelLevel.PasswordChannel &&
!plugin.getPermissionManager().checkPermissions(player.getPlayer(), PermissionNode.channelCreatePassword))
return;
if(channelLevel == ChannelLevel.PublicChannel &&
!plugin.getPermissionManager().checkPermissions(player.getPlayer(), PermissionNode.channelCreatePublic))
return;
if(channelLevel == ChannelLevel.PrivateChannel &&
!plugin.getPermissionManager().checkPermissions(player.getPlayer(), PermissionNode.channelCreatePrivate))
return;
if(channelLevel != ChannelLevel.PasswordChannel && channelPassword != "")
player.sendMessage(ChatColor.YELLOW + "[INFO] You try to create a non-password channel with a password. The password will be ignored.");
if(plugin.getChannelManager().getChannelLevel(channelName) != ChannelLevel.NONE){
player.sendMessage(ChatColor.RED + "This channel already exisists.");
return;
}
plugin.getChannelManager().registerChannel(channelLevel, channelName, channelPassword, player);
}
private void changeChannel(RaCPlayer player, String changeTo){
ChannelLevel level = plugin.getChannelManager().getChannelLevel(changeTo);
if(level == ChannelLevel.NONE){
player.sendMessage(ChatColor.RED + "Could not find any channel named: " + ChatColor.LIGHT_PURPLE + changeTo);
return;
}
if(level != ChannelLevel.LocalChannel){
if(!plugin.getChannelManager().isMember(player, changeTo)){
player.sendMessage(ChatColor.RED + "You are no member of: " + ChatColor.LIGHT_PURPLE + changeTo);
return;
}
}
player.setCurrentChatChannel(changeTo);
player.sendMessage(ChatColor.GREEN + "You now write in the channel: " + ChatColor.AQUA + changeTo);
}
private ChannelLevel getChannelLevel(String channelType){
channelType = channelType.toLowerCase();
for(ChannelLevel level : ChannelLevel.values()){
String realChannelName = level.name().toLowerCase();
if(realChannelName.contains(channelType)){
return level;
}
}
return ChannelLevel.NONE;
}
private void channelEdit(RaCPlayer player, String channel, String property, String newValue){
ChannelLevel level = plugin.getChannelManager().getChannelLevel(channel);
if(level == ChannelLevel.NONE){
player.sendMessage(ChatColor.RED + "Could not find any channel named: " + ChatColor.LIGHT_PURPLE + channel);
return;
}
if(level == ChannelLevel.GlobalChannel || level == ChannelLevel.WorldChannel || level == ChannelLevel.RaceChannel){
if(!plugin.getPermissionManager().checkPermissions(player.getPlayer(), PermissionNode.channelEdit)){
return;
}
}
plugin.getChannelManager().editChannel(player, channel, property, newValue);
}
}