package uk.codingbadgers.bstore;
import java.util.ArrayList;
import java.util.List;
import net.milkbowl.vault.permission.Permission;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import uk.codingbadgers.bFundamentals.bFundamentals;
import uk.codingbadgers.bFundamentals.module.Module;
import uk.codingbadgers.bstore.database.DatabaseManager;
import uk.codingbadgers.bstore.database.InvestorData;
import uk.codingbadgers.bstore.database.XPPurchaseData;
public class bStore extends Module implements Listener {
private DatabaseManager databaseManager;
/**
* Called when the module is disabled.
*/
@Override
public void onDisable() {
}
/**
* Called when the module is loaded.
*/
@Override
public void onEnable() {
databaseManager = new DatabaseManager();
// Register this as a listener
register(this);
// Register all commands
registerCommand(new CommandStore(this));
// See if investors have run out
checkInvestors();
}
/**
* Get the database manager instance
* @return The database manager instance
*/
public DatabaseManager getDatabaseManager() {
return this.databaseManager;
}
/**
* Called when a player joins the server
* Used to given any items which require the player to be online,
* and to demote if their investor time has run out.
* @param event The event containing join information
*/
@EventHandler(priority = EventPriority.LOW)
public void onPlayerJoin(PlayerJoinEvent event) {
final Player player = event.getPlayer();
final String playerName = player.getName();
InvestorData investor = this.databaseManager.getInvestor(playerName);
if (investor != null) {
final long now = System.currentTimeMillis();
if (investor.endTime < now) {
// Investor has run out...
demoteInvestor(investor);
} else {
final long timeRemaining = investor.endTime - now;
Bukkit.getScheduler().runTaskLater(m_plugin, new Runnable() {
@Override
public void run() {
Module.sendMessage(getName(), player, "Your investor runs out in " + formatMSTime(timeRemaining) + ".");
}
}, 5 * 20L);
}
}
// Give xp for offline purchases
List<XPPurchaseData> xpData = this.databaseManager.getXPPurchases(playerName);
for (XPPurchaseData data : xpData) {
player.giveExpLevels(data.levels);
}
this.databaseManager.removeXPPurchases(playerName);
}
/**
*
* @param timeMs
* @return
*/
private String formatMSTime(long timeMs) {
int minutes = (int)((timeMs / (1000*60)) % 60);
int hours = (int)((timeMs / (1000*60*60)) % 24);
int days = (int)((timeMs / (1000*60*60*24)) % 7);
int weeks = (int)((timeMs / (1000*60*60*24*7)));
List<String> parts = new ArrayList<String>();
if (weeks != 0) {
parts.add(weeks + " " + (weeks == 1 ? "week" : "weeks"));
}
if (days != 0) {
parts.add(days + " " + (days == 1 ? "day" : "days"));
}
if (hours != 0) {
parts.add(hours + " " + (hours == 1 ? "hour" : "hours"));
}
if (minutes != 0) {
parts.add(minutes + " " + (minutes == 1 ? "minute" : "minutes"));
}
String formattedTime = "";
if (parts.isEmpty()) {
formattedTime = "now";
}
else if (parts.size() == 1) {
formattedTime = parts.get(0);
}
else {
for (int partIndex = 0; partIndex < parts.size() - 1; ++partIndex) {
if (partIndex == (parts.size() - 2)) {
formattedTime += parts.get(partIndex) + " and ";
} else {
formattedTime += parts.get(partIndex) + ", ";
}
}
formattedTime += parts.get(parts.size() - 1);
}
return formattedTime;
}
/**
*
* @param investor
*/
private void demoteInvestor(InvestorData investor) {
Permission perms = bFundamentals.getPermissions();
String[] groups = perms.getPlayerGroups((World)null, investor.playerName);
// Remove all groups
for (String group : groups) {
perms.playerRemoveGroup((World)null, investor.playerName, group);
}
// Set to old rank
perms.playerAddGroup((World)null, investor.playerName, investor.oldRank);
// Add additional groups back
for (String group : groups) {
if (group.equalsIgnoreCase("investor")) {
continue;
}
perms.playerAddGroup((World)null, investor.playerName, group);
}
Player player = Bukkit.getPlayer(investor.playerName);
if (player != null) {
Module.sendMessage(getName(), player, "Your investor has run out.");
Module.sendMessage(getName(), player, "To continue to recieve your investor perks, please re-invest.");
Module.sendMessage(getName(), player, ChatColor.UNDERLINE + "" + ChatColor.AQUA + "http://mcbadgercraft.com/store/5-investor-perks");
}
this.databaseManager.removeInvestor(investor.playerName);
}
/**
*
*/
private void checkInvestors() {
final int checkMins = 5; // Number of minutes between checks
Bukkit.getScheduler().runTaskLater(m_plugin, new Runnable() {
@Override
public void run() {
final long now = System.currentTimeMillis();
for (Player player : Bukkit.getOnlinePlayers()) {
InvestorData investor = databaseManager.getInvestor(player.getName());
if (investor == null) {
continue;
}
if (investor.endTime < now) {
// Investor has run out...
demoteInvestor(investor);
}
}
}
}, checkMins * 60L * 20L);
}
/**
*
* @param type
* @return
*/
ItemPackage getItemPackage(String type) {
return null;
}
}