/*
* PermissionsEx - Permissions plugin for Bukkit
* Copyright (C) 2011 t3hk0d3 http://www.tehkode.ru
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package pex.permissions.bukkit.commands;
import java.util.Map;
import net.minecraft.command.ICommandSender;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.EnumChatFormatting;
import pex.permissions.PermissionGroup;
import pex.permissions.PermissionManager;
import pex.permissions.PermissionUser;
import pex.permissions.bukkit.PermissionsEx;
import pex.permissions.commands.Command;
import pex.utils.DateUtils;
import pex.utils.StringUtils;
public class UserCommands extends PermissionsCommand {
@Command(name = "pex", syntax = "users list", permission = "permissions.manage.users", description = "List all registered users")
public void usersList(Object plugin, ICommandSender sender, Map<String, String> args) {
PermissionUser[] users = PermissionsEx.getPermissionManager().getUsers();
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.WHITE + "Currently registered users: ");
for (PermissionUser user : users) {
PermissionsEx.sendChatToPlayer(sender, " " + user.getName() + " " + EnumChatFormatting.DARK_GREEN + "[" + StringUtils.implode(user.getGroupsNames(), ", ") + "]");
}
}
@Command(name = "pex", syntax = "users", permission = "permissions.manage.users", description = "List all registered users (alias)", isPrimary = true)
public void userListAlias(Object plugin, ICommandSender sender, Map<String, String> args) {
usersList(plugin, sender, args);
}
@Command(name = "pex", syntax = "user", permission = "permissions.manage.users", description = "List all registered users (alias)")
public void userListAnotherAlias(Object plugin, ICommandSender sender, Map<String, String> args) {
usersList(plugin, sender, args);
}
/**
* User permission management
*/
@Command(name = "pex", syntax = "user <user>", permission = "permissions.manage.users.permissions.<user>", description = "List user permissions (list alias)")
public void userListAliasPermissions(Object plugin, ICommandSender sender, Map<String, String> args) {
String userName = this.autoCompletePlayerName(args.get("user"));
String worldName = this.autoCompleteWorldName(args.get("world"));
PermissionUser user = PermissionsEx.getPermissionManager().getUser(userName);
if (user == null) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "User does not exist");
return;
}
PermissionsEx.sendChatToPlayer(sender, userName + " are member of:");
printEntityInheritance(sender, user.getGroups());
for (String world : user.getAllGroups().keySet()) {
if (world == null) {
continue;
}
PermissionsEx.sendChatToPlayer(sender, " @" + world + ":");
printEntityInheritance(sender, user.getAllGroups().get(world));
}
PermissionsEx.sendChatToPlayer(sender, userName + "'s permissions:");
sendMessage(sender, mapPermissions(worldName, user, 0));
PermissionsEx.sendChatToPlayer(sender, userName + "'s options:");
for (Map.Entry<String, String> option : user.getOptions(worldName).entrySet()) {
PermissionsEx.sendChatToPlayer(sender, " " + option.getKey() + " = \"" + option.getValue() + "\"");
}
}
@Command(name = "pex", syntax = "user <user> list [world]", permission = "permissions.manage.users.permissions.<user>", description = "List user permissions")
public void userListPermissions(Object plugin, ICommandSender sender, Map<String, String> args) {
String userName = this.autoCompletePlayerName(args.get("user"));
String worldName = this.autoCompleteWorldName(args.get("world"));
PermissionUser user = PermissionsEx.getPermissionManager().getUser(userName);
if (user == null) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "User does not exist");
return;
}
PermissionsEx.sendChatToPlayer(sender, userName + "'s permissions:");
for (String permission : user.getPermissions(worldName)) {
PermissionsEx.sendChatToPlayer(sender, " " + permission);
}
}
@Command(name = "pex", syntax = "user <user> superperms", permission = "permissions.manage.users.permissions.<user>", description = "List user actual superperms")
public void userListSuperPermissions(Object plugin, ICommandSender sender, Map<String, String> args) {
String userName = this.autoCompletePlayerName(args.get("user"));
EntityPlayer player = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(userName);
if (player == null) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "Player not found (offline?)");
return;
}
PermissionsEx.sendChatToPlayer(sender, userName + "'s superperms: ");
PermissionsEx.sendChatToPlayer(sender, "disabled");
/*
* for (PermissionAttachmentInfo info :
* player.getEffectivePermissions()) { String pluginName = "built-in";
*
* if (info.getAttachment() != null && info.getAttachment().getPlugin()
* != null) { pluginName =
* info.getAttachment().getPlugin().getDescription().getName(); }
*
* PermissionsEx.sendChatToPlayer(sender, " '" + EnumChatFormatting.GREEN +
* info.getPermission() + EnumChatFormatting.WHITE + "' = " + EnumChatFormatting.BLUE +
* info.getValue() + EnumChatFormatting.WHITE + " by " + EnumChatFormatting.DARK_GREEN +
* pluginName); }
*/
}
@Command(name = "pex", syntax = "user <user> prefix [newprefix] [world]", permission = "permissions.manage.users.prefix.<user>", description = "Get or set <user> prefix")
public void userPrefix(Object plugin, ICommandSender sender, Map<String, String> args) {
String userName = this.autoCompletePlayerName(args.get("user"));
String worldName = this.autoCompleteWorldName(args.get("world"));
PermissionUser user = PermissionsEx.getPermissionManager().getUser(userName);
if (user == null) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "User does not exist");
return;
}
if (args.containsKey("newprefix")) {
user.setPrefix(args.get("newprefix"), worldName);
}
PermissionsEx.sendChatToPlayer(sender, user.getName() + "'s prefix = \"" + user.getPrefix() + "\"");
}
@Command(name = "pex", syntax = "user <user> suffix [newsuffix] [world]", permission = "permissions.manage.users.suffix.<user>", description = "Get or set <user> suffix")
public void userSuffix(Object plugin, ICommandSender sender, Map<String, String> args) {
String userName = this.autoCompletePlayerName(args.get("user"));
String worldName = this.autoCompleteWorldName(args.get("world"));
PermissionUser user = PermissionsEx.getPermissionManager().getUser(userName);
if (user == null) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "User does not exist");
return;
}
if (args.containsKey("newsuffix")) {
user.setSuffix(args.get("newsuffix"), worldName);
}
PermissionsEx.sendChatToPlayer(sender, user.getName() + "'s suffix = \"" + user.getSuffix() + "\"");
}
@Command(name = "pex", syntax = "user <user> toggle debug", permission = "permissions.manage.<user>", description = "Toggle debug only for <user>")
public void userToggleDebug(Object plugin, ICommandSender sender, Map<String, String> args) {
String userName = this.autoCompletePlayerName(args.get("user"));
PermissionUser user = PermissionsEx.getPermissionManager().getUser(userName);
if (user == null) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "User does not exist");
return;
}
user.setDebug(!user.isDebug());
PermissionsEx.sendChatToPlayer(sender, "Debug mode for user " + userName + " " + (user.isDebug() ? "enabled" : "disabled") + "!");
}
@Command(name = "pex", syntax = "user <user> check <permission> [world]", permission = "permissions.manage.<user>", description = "Checks player for <permission>")
public void userCheckPermission(Object plugin, ICommandSender sender, Map<String, String> args) {
String userName = this.autoCompletePlayerName(args.get("user"));
String worldName = this.autoCompleteWorldName(args.get("world"));
PermissionUser user = PermissionsEx.getPermissionManager().getUser(userName);
if (user == null) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "User does not exist");
return;
}
worldName = getSafeWorldName(worldName, userName);
String permission = user.getMatchingExpression(args.get("permission"), worldName);
if (permission == null) {
PermissionsEx.sendChatToPlayer(sender, "Player \"" + userName + "\" don't such have no permission");
} else {
PermissionsEx.sendChatToPlayer(sender, "Player \"" + userName + "\" have \"" + permission + "\" = " + user.explainExpression(permission));
}
}
@Command(name = "pex", syntax = "user <user> get <option> [world]", permission = "permissions.manage.<user>", description = "Toggle debug only for <user>")
public void userGetOption(Object plugin, ICommandSender sender, Map<String, String> args) {
String userName = this.autoCompletePlayerName(args.get("user"));
String worldName = this.autoCompleteWorldName(args.get("world"));
PermissionUser user = PermissionsEx.getPermissionManager().getUser(userName);
if (user == null) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "User does not exist");
return;
}
worldName = getSafeWorldName(worldName, userName);
String value = user.getOption(args.get("option"), worldName, null);
PermissionsEx.sendChatToPlayer(sender, "Player " + userName + " @ " + worldName + " option \"" + args.get("option") + "\" = \"" + value + "\"");
}
@Command(name = "pex", syntax = "user <user> delete", permission = "permissions.manage.users.<user>", description = "Remove <user>")
public void userDelete(Object plugin, ICommandSender sender, Map<String, String> args) {
String userName = this.autoCompletePlayerName(args.get("user"));
PermissionUser user = PermissionsEx.getPermissionManager().getUser(userName);
if (user == null) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "User does not exist");
return;
}
if (user.isVirtual()) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "User is virtual");
}
user.remove();
PermissionsEx.getPermissionManager().resetUser(userName);
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.WHITE + "User \"" + user.getName() + "\" removed!");
}
@Command(name = "pex", syntax = "user <user> add <permission> [world]", permission = "permissions.manage.users.permissions.<user>", description = "Add <permission> to <user> in [world]")
public void userAddPermission(Object plugin, ICommandSender sender, Map<String, String> args) {
String userName = this.autoCompletePlayerName(args.get("user"));
String worldName = this.autoCompleteWorldName(args.get("world"));
PermissionUser user = PermissionsEx.getPermissionManager().getUser(userName);
if (user == null) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "User does not exist");
return;
}
user.addPermission(args.get("permission"), worldName);
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.WHITE + "Permission \"" + args.get("permission") + "\" added!");
informPlayer(plugin, userName, "Your permissions have been changed!");
}
@Command(name = "pex", syntax = "user <user> remove <permission> [world]", permission = "permissions.manage.users.permissions.<user>", description = "Remove permission from <user> in [world]")
public void userRemovePermission(Object plugin, ICommandSender sender, Map<String, String> args) {
String userName = this.autoCompletePlayerName(args.get("user"));
String worldName = this.autoCompleteWorldName(args.get("world"));
PermissionUser user = PermissionsEx.getPermissionManager().getUser(userName);
if (user == null) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "User does not exist");
return;
}
String permission = this.autoCompletePermission(user, args.get("permission"), worldName);
user.removePermission(permission, worldName);
user.removeTimedPermission(permission, worldName);
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.WHITE + "Permission \"" + permission + "\" removed!");
informPlayer(plugin, userName, "Your permissions have been changed!");
}
@Command(name = "pex", syntax = "user <user> swap <permission> <targetPermission> [world]", permission = "permissions.manage.users.permissions.<user>", description = "Swap <permission> and <targetPermission> in permission list. Could be number or permission itself")
public void userSwapPermission(Object plugin, ICommandSender sender, Map<String, String> args) {
String userName = this.autoCompletePlayerName(args.get("user"));
String worldName = this.autoCompleteWorldName(args.get("world"));
PermissionUser user = PermissionsEx.getPermissionManager().getUser(userName);
if (user == null) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "User does not exist");
return;
}
String[] permissions = user.getOwnPermissions(worldName);
try {
int sourceIndex = getPosition(this.autoCompletePermission(user, args.get("permission"), worldName, "permission"), permissions);
int targetIndex = getPosition(this.autoCompletePermission(user, args.get("targetPermission"), worldName, "targetPermission"), permissions);
String targetPermission = permissions[targetIndex];
permissions[targetIndex] = permissions[sourceIndex];
permissions[sourceIndex] = targetPermission;
user.setPermissions(permissions, worldName);
PermissionsEx.sendChatToPlayer(sender, "Permissions swapped!");
} catch (Throwable e) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "Error: " + e.getMessage());
}
}
@Command(name = "pex", syntax = "user <user> timed add <permission> [lifetime] [world]", permission = "permissions.manage.users.permissions.timed.<user>", description = "Add timed <permissions> to <user> for [lifetime] seconds in [world]")
public void userAddTimedPermission(Object plugin, ICommandSender sender, Map<String, String> args) {
String userName = this.autoCompletePlayerName(args.get("user"));
String worldName = this.autoCompleteWorldName(args.get("world"));
int lifetime = 0;
if (args.containsKey("lifetime")) {
lifetime = DateUtils.parseInterval(args.get("lifetime"));
}
PermissionUser user = PermissionsEx.getPermissionManager().getUser(userName);
if (user == null) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "User does not exist");
return;
}
String permission = args.get("permission");
user.addTimedPermission(permission, worldName, lifetime);
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.WHITE + "Timed permission \"" + permission + "\" added!");
informPlayer(plugin, userName, "Your permissions have been changed!");
logger.info("User " + userName + " get timed permission \"" + args.get("permission") + "\" " + (lifetime > 0 ? "for " + lifetime + " seconds " : " ") + "from " + getSenderName(sender));
}
@Command(name = "pex", syntax = "user <user> timed remove <permission> [world]", permission = "permissions.manage.users.permissions.timed.<user>", description = "Remove timed <permission> from <user> in [world]")
public void userRemoveTimedPermission(Object plugin, ICommandSender sender, Map<String, String> args) {
String userName = this.autoCompletePlayerName(args.get("user"));
String worldName = this.autoCompleteWorldName(args.get("world"));
String permission = args.get("permission");
PermissionUser user = PermissionsEx.getPermissionManager().getUser(userName);
if (user == null) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "User does not exist");
return;
}
user.removeTimedPermission(args.get("permission"), worldName);
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.WHITE + "Timed permission \"" + permission + "\" removed!");
informPlayer(plugin, userName, "Your permissions have been changed!");
}
@Command(name = "pex", syntax = "user <user> set <option> <value> [world]", permission = "permissions.manage.users.permissions.<user>", description = "Set <option> to <value> in [world]")
public void userSetOption(Object plugin, ICommandSender sender, Map<String, String> args) {
String userName = this.autoCompletePlayerName(args.get("user"));
String worldName = this.autoCompleteWorldName(args.get("world"));
PermissionUser user = PermissionsEx.getPermissionManager().getUser(userName);
if (user == null) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "User does not exist");
return;
}
user.setOption(args.get("option"), args.get("value"), worldName);
if (args.containsKey("value") && args.get("value").isEmpty()) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.WHITE + "Option \"" + args.get("option") + "\" cleared!");
} else {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.WHITE + "Option \"" + args.get("option") + "\" set!");
}
informPlayer(plugin, userName, "Your permissions have been changed!");
}
/**
* User's groups management
*/
@Command(name = "pex", syntax = "user <user> group list [world]", permission = "permissions.manage.membership.<user>", description = "List all <user> groups")
public void userListGroup(Object plugin, ICommandSender sender, Map<String, String> args) {
String userName = this.autoCompletePlayerName(args.get("user"));
String worldName = this.autoCompleteWorldName(args.get("world"));
PermissionUser user = PermissionsEx.getPermissionManager().getUser(userName);
if (user == null) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "User does not exist");
return;
}
PermissionsEx.sendChatToPlayer(sender, "User " + args.get("user") + " @" + worldName + " currently in:");
for (PermissionGroup group : user.getGroups(worldName)) {
PermissionsEx.sendChatToPlayer(sender, " " + group.getName());
}
}
@Command(name = "pex", syntax = "user <user> group add <group> [world] [lifetime]", permission = "permissions.manage.membership.<group>", description = "Add <user> to <group>")
public void userAddGroup(Object plugin, ICommandSender sender, Map<String, String> args) {
String userName = this.autoCompletePlayerName(args.get("user"));
String groupName = this.autoCompleteGroupName(args.get("group"));
String worldName = this.autoCompleteWorldName(args.get("world"));
PermissionUser user = PermissionsEx.getPermissionManager().getUser(userName);
if (user == null) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "User does not exist");
return;
}
if (args.containsKey("lifetime")) {
try {
int lifetime = DateUtils.parseInterval(args.get("lifetime"));
user.addGroup(groupName, worldName, lifetime);
} catch (NumberFormatException e) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "Group lifetime should be number!");
return;
}
} else {
user.addGroup(groupName, worldName);
}
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.WHITE + "User added to group \"" + groupName + "\"!");
informPlayer(plugin, userName, "You are assigned to \"" + groupName + "\" group");
}
@Command(name = "pex", syntax = "user <user> group set <group> [world]", permission = "", description = "Set <group> for <user>")
public void userSetGroup(Object plugin, ICommandSender sender, Map<String, String> args) {
PermissionManager manager = PermissionsEx.getPermissionManager();
PermissionUser user = manager.getUser(this.autoCompletePlayerName(args.get("user")));
String worldName = this.autoCompleteWorldName(args.get("world"));
if (user == null) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "User does not exist");
return;
}
String groupName = args.get("group");
PermissionGroup[] groups;
if (groupName.contains(",")) {
String[] groupsNames = groupName.split(",");
groups = new PermissionGroup[groupsNames.length];
for (int i = 0; i < groupsNames.length; i++) {
if (sender instanceof EntityPlayer && !manager.has((EntityPlayer) sender, "permissions.manage.membership." + groupsNames[i].toLowerCase())) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "Don't have enough permission for group " + groupsNames[i]);
return;
}
groups[i] = manager.getGroup(this.autoCompleteGroupName(groupsNames[i]));
}
} else {
groupName = this.autoCompleteGroupName(groupName);
if (groupName != null) {
groups = new PermissionGroup[] { manager.getGroup(groupName) };
if (sender instanceof EntityPlayer && !manager.has((EntityPlayer) sender, "permissions.manage.membership." + groupName.toLowerCase())) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "Don't have enough permission for group " + groupName);
return;
}
} else {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "No groups set!");
return;
}
}
if (groups.length > 0) {
user.setGroups(groups, worldName);
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.WHITE + "User groups set!");
} else {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "No groups set!");
}
informPlayer(plugin, user.getName(), "You are now only in \"" + groupName + "\" group");
}
@Command(name = "pex", syntax = "user <user> group remove <group> [world]", permission = "permissions.manage.membership.<group>", description = "Remove <user> from <group>")
public void userRemoveGroup(Object plugin, ICommandSender sender, Map<String, String> args) {
String userName = this.autoCompletePlayerName(args.get("user"));
String groupName = this.autoCompleteGroupName(args.get("group"));
String worldName = this.autoCompleteWorldName(args.get("world"));
PermissionUser user = PermissionsEx.getPermissionManager().getUser(userName);
if (user == null) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "User does not exist");
return;
}
user.removeGroup(groupName, worldName);
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.WHITE + "User removed from group " + groupName + "!");
informPlayer(plugin, userName, "You were removed from \"" + groupName + "\" group");
}
@Command(name = "pex", syntax = "users cleanup <group> [threshold]", permission = "permissions.manage.users.cleanup", description = "Clean users of specified group, which last login was before threshold (in days). By default threshold is 30 days.")
public void usersCleanup(Object plugin, ICommandSender sender, Map<String, String> args) {
long threshold = 2304000;
PermissionGroup group = PermissionsEx.getPermissionManager().getGroup(args.get("group"));
if (args.containsKey("threshold")) {
try {
threshold = Integer.parseInt(args.get("threshold")) * 86400; // 86400
// -
// seconds
// in
// one
// day
} catch (NumberFormatException e) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "Threshold should be number (in days)");
return;
}
}
int removed = 0;
Long deadline = System.currentTimeMillis() / 1000L - threshold;
for (PermissionUser user : group.getUsers()) {
int lastLogin = user.getOwnOptionInteger("last-login-time", null, 0);
if (lastLogin > 0 && lastLogin < deadline) {
user.remove();
removed++;
}
}
PermissionsEx.sendChatToPlayer(sender, "Cleaned " + removed + " users");
}
}