package uk.codingbadgers.bstore; import java.text.DecimalFormat; import java.util.logging.Level; import net.milkbowl.vault.permission.Permission; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import uk.codingbadgers.bFundamentals.bFundamentals; import uk.codingbadgers.bFundamentals.commands.ModuleCommand; import uk.codingbadgers.bFundamentals.module.Module; import uk.codingbadgers.bstore.database.DatabaseManager; import uk.codingbadgers.bstore.database.InvestorData; public class CommandStore extends ModuleCommand { final private bStore module; final private DatabaseManager databasemanager; public CommandStore(bStore module) { super("store", "/store <command> [param] [...]"); this.module = module; this.databasemanager = module.getDatabaseManager(); } /** * Called when the 'store' command is executed. * usage: /store purchase <playername> investor <length> * usage: /store purchase <playername> xp <number of levels> * usage: /store purchase <playername> money <amount> * usage: /store purchase <playername> mobpackage <name> * usage: /store list [playername] * @return True if handled */ @Override public boolean onCommand(CommandSender sender, String label, String[] args) { if (args.length == 0) { Module.sendMessage(module.getName(), sender, "Usage..."); Module.sendMessage(module.getName(), sender, "/store purchase"); Module.sendMessage(module.getName(), sender, "/store list"); return true; } final String subCommand = args[0]; if (subCommand.equalsIgnoreCase("purchase")) { handlePurchase(sender, args); } else if (subCommand.equalsIgnoreCase("list")) { handleList(sender, args); } else { Module.sendMessage(module.getName(), sender, "Usage..."); Module.sendMessage(module.getName(), sender, "/store purchase"); Module.sendMessage(module.getName(), sender, "/store list"); } return true; } /** * usage: /store purchase <playername> investor <length> * usage: /store purchase <playername> xp <number of levels> * usage: /store purchase <playername> money <amount> * usage: /store purchase <playername> mobpackage <name> * @param sender * @param args */ private void handlePurchase(CommandSender sender, String[] args) { if (!sender.hasPermission("bStore.purchase")) { Module.sendMessage(module.getName(), sender, "You do not have the required permission 'bStore.purchase'."); return; } if (args.length != 4) { Module.sendMessage(module.getName(), sender, "Usage..."); Module.sendMessage(module.getName(), sender, "/store purchase <playername> investor <length>"); Module.sendMessage(module.getName(), sender, "/store purchase <playername> xp <number of levels>"); Module.sendMessage(module.getName(), sender, "/store purchase <playername> money <amount>"); Module.sendMessage(module.getName(), sender, "/store purchase <playername> mobpackage <name>"); Module.sendMessage(module.getName(), sender, "/store purchase <playername> itempackage <name>"); return; } final String playerName = args[1]; final String itemName = args[2]; if (itemName.equalsIgnoreCase("investor")) { handlePurchaseInvestor(sender, playerName, args[3]); } else if (itemName.equalsIgnoreCase("xp")) { handlePurchaseXP(sender, playerName, args[3]); } else if (itemName.equalsIgnoreCase("money")) { handlePurchaseMoney(sender, playerName, args[3]); } else if (itemName.equalsIgnoreCase("mobpackage")) { handlePurchaseMobPackage(sender, playerName, args[3]); } else if (itemName.equalsIgnoreCase("itempackage")) { handlePurchaseItemPackage(sender, playerName, args[3]); } } /** * * @param sender * @param args */ private void handleList(CommandSender sender, String[] args) { if (!sender.hasPermission("bStore.list")) { Module.sendMessage(module.getName(), sender, "You do not have the required permission 'bStore.list'."); return; } } /** * * @param sender * @param playerName * @param string */ private void handlePurchaseInvestor(CommandSender sender, String playerName, String length) { if (!sender.hasPermission("bStore.purchase.investor")) { Module.sendMessage(module.getName(), sender, "You do not have the required permission 'bStore.purchase.investor'."); return; } // See how long the investment is for String userFriendlyInvestorLength; long investorLength = 0; final long oneDay = 1000 * 60 * 60 * 24; int money = 0; if (length.equalsIgnoreCase("1week")) { investorLength = oneDay * 7; userFriendlyInvestorLength = "One Week Investor"; money = 125000; } else if (length.equalsIgnoreCase("1month")) { investorLength = oneDay * 30; userFriendlyInvestorLength = "One Month Investor"; money = 500000; } else if (length.equalsIgnoreCase("3month")) { investorLength = oneDay * 90; userFriendlyInvestorLength = "Three Months Investor"; money = 500000; } else { try { investorLength = Integer.parseInt(length) * 1000 * 60; // if it isnt a string, presume length in minutes userFriendlyInvestorLength = investorLength + " Minutes Investor"; money = (int)Math.ceil(investorLength * 12.4f); } catch (NumberFormatException ex) { Module.sendMessage(module.getName(), sender, "Invalid investment length. Valid: 1week, 1month, 3month, [x] in minutes"); bFundamentals.log(Level.WARNING, "Invalid length of investment specified.", ex); return; } } // Give the investor their money try { bFundamentals.getEconomy().depositPlayer(playerName, money); Module.sendMessage(module.getName(), sender, "Player granted investor money of '£" + formatMoney(money) + "'"); Player player = Bukkit.getPlayer(playerName); if (player != null) { Module.sendMessage(module.getName(), player, ChatColor.GOLD + "Thankyou for investing. You have been paid your investor money of '£" + formatMoney(money) + "'."); } } catch (Exception ex) { Module.sendMessage(module.getName(), sender, "Failed to grant money '" + money + "'"); bFundamentals.log(Level.WARNING, "Failed to grant money '" + money + "'", ex); } Permission perms = bFundamentals.getPermissions(); String oldRank = perms.getPrimaryGroup((World)null, playerName); String[] groups = perms.getPlayerGroups((World)null, playerName); // Remove all groups for (String group : groups) { perms.playerRemoveGroup((World)null, playerName, group); } // Set to investor perms.playerAddGroup((World)null, playerName, "investor"); // Add additional groups back for (String group : groups) { if (group.equalsIgnoreCase(oldRank)) { continue; } perms.playerAddGroup((World)null, playerName, group); } // Log the end time of the investor long from = System.currentTimeMillis(); long to = from + investorLength; // Extend an investors time InvestorData investor = this.databasemanager.getInvestor(playerName); if (investor != null) { from = investor.startTime; to = investor.endTime + investorLength; } this.databasemanager.logInvestor(playerName, from, to, oldRank, investor != null); // Log the purchase logPurchase(playerName, "Investor", length); Module.sendMessage(module.getName(), sender, "[Sucess] Investor Purchase - '" + playerName + "' length '" + length + "' old rank '" + oldRank + "' ."); broadcast(ChatColor.YELLOW + playerName + ChatColor.GOLD + " has purchased " + ChatColor.YELLOW + userFriendlyInvestorLength + ChatColor.GOLD + "!"); } /** * * @param sender * @param playerName * @param string */ private void handlePurchaseXP(CommandSender sender, String playerName, String levelsString) { if (!sender.hasPermission("bStore.purchase.xp")) { Module.sendMessage(module.getName(), sender, "You do not have the required permission 'bStore.purchase.xp'."); return; } int levels = 0; String userFriendlyXPLevels; try { levels = Integer.parseInt(levelsString); userFriendlyXPLevels = levels + " Levels of Experience"; } catch(NumberFormatException ex) { Module.sendMessage(module.getName(), sender, "Failed to purchase xp for player '" + playerName + "' levels '" + levels + "'."); bFundamentals.log(Level.WARNING, "Failed to purchase xp for player '" + playerName + "' levels '" + levels + "'.", ex); return; } OfflinePlayer player = Bukkit.getOfflinePlayer(playerName); if (player.isOnline()) { player.getPlayer().giveExpLevels(levels); } else { // Store to database and give on login. this.databasemanager.logXPPurchase(playerName, levels); } logPurchase(playerName, "XP", levels + " Levels"); Module.sendMessage(module.getName(), sender, "[Sucess] XP Purchase - '" + playerName + "' levels '" + levels + "'."); broadcast(ChatColor.YELLOW + playerName + ChatColor.GOLD + " has purchased " + ChatColor.YELLOW + userFriendlyXPLevels + ChatColor.GOLD + "!"); } /** * * @param sender * @param playerName * @param string */ private void handlePurchaseMoney(CommandSender sender, String playerName, String amount) { if (!sender.hasPermission("bStore.purchase.money")) { Module.sendMessage(module.getName(), sender, "You do not have the required permission 'bStore.purchase.money'."); return; } String userFriendlyMoneyAmount; try { Double dAmount = Double.parseDouble(amount); bFundamentals.getEconomy().depositPlayer(playerName, dAmount); userFriendlyMoneyAmount = "£" + formatMoney(dAmount); } catch(NumberFormatException ex) { Module.sendMessage(module.getName(), sender, "Failed to purchase money for player '" + playerName + "' amount '" + amount + "'."); bFundamentals.log(Level.WARNING, "Failed to purchase money for player '" + playerName + "' amount '" + amount + "'.", ex); return; } logPurchase(playerName, "Money", "£" + amount); Module.sendMessage(module.getName(), sender, "[Sucess] Money Purchase - '" + playerName + "' amount '" + amount + "'."); broadcast(ChatColor.YELLOW + playerName + ChatColor.GOLD + " has purchased " + ChatColor.YELLOW + userFriendlyMoneyAmount + ChatColor.GOLD + "!"); } /** * * @param sender * @param playerName * @param string */ private void handlePurchaseMobPackage(CommandSender sender, String playerName, String type) { if (!sender.hasPermission("bStore.purchase.mobpackage")) { Module.sendMessage(module.getName(), sender, "You do not have the required permission 'bStore.purchase.mobpackage'."); return; } Permission perms = bFundamentals.getPermissions(); String[] ranks = perms.getGroups(); String userFriendlyMobPackage = ""; boolean foundPackage = false; for (String rank : ranks) { if (rank.equalsIgnoreCase(type)) { foundPackage = true; userFriendlyMobPackage = type.substring("mob_".length()); userFriendlyMobPackage = userFriendlyMobPackage.substring(0, 1).toUpperCase() + userFriendlyMobPackage.substring(1); userFriendlyMobPackage = userFriendlyMobPackage.replace('_', ' ') + " MobDisguise Package"; break; } } if (foundPackage == false) { Module.sendMessage(module.getName(), sender, "Failed to purchase mobdisguise for player '" + playerName + "' type '" + type + "'."); bFundamentals.log(Level.WARNING, "Failed to purchase mobdisguise for player '" + playerName + "' type '" + type + "'."); return; } perms.playerAddGroup((World)null, playerName, type); logPurchase(playerName, "MobPackage", type); Module.sendMessage(module.getName(), sender, "[Sucess] MobPackage Purchase - '" + playerName + "' type '" + type + "'."); broadcast(ChatColor.YELLOW + playerName + ChatColor.GOLD + " has purchased the " + ChatColor.YELLOW + userFriendlyMobPackage + ChatColor.GOLD + "!"); } /** * * @param sender * @param playerName * @param type */ private void handlePurchaseItemPackage(CommandSender sender, String playerName, String type) { if (!sender.hasPermission("bStore.purchase.itempackage")) { Module.sendMessage(module.getName(), sender, "You do not have the required permission 'bStore.purchase.itempackage'."); return; } ItemPackage itemPackage = this.module.getItemPackage(type); if (itemPackage == null) { Module.sendMessage(module.getName(), sender, "There is no item package with the name '" + type + "'."); return; } } /** * * @param playerName * @param investor * @param length */ private void logPurchase(String playerName, String type, String item) { this.databasemanager.logPurchase(playerName, type, item); } /** * * @param message */ private void broadcast(String message) { for (Player player : Bukkit.getOnlinePlayers()) { Module.sendMessage(m_module.getName(), player, ChatColor.GOLD + message); } } /** * Format a number to a usable string. * * @param amount the amount * @return the string */ private String formatMoney(double amount) { DecimalFormat format = new DecimalFormat("##0.00"); String formatted = format.format(amount); if (formatted.endsWith(".")) { formatted = formatted.substring(0, formatted.length() - 1); } return formatted; } }