PageRenderTime 51ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/src/net/blockheaven/kaipr/heavenactivity/HeavenActivity.java

https://github.com/matjam/HeavenActivity
Java | 472 lines | 278 code | 78 blank | 116 comment | 81 complexity | 8f09a75c0371511b5b4fa9dda56f861c MD5 | raw file
  1. package net.blockheaven.kaipr.heavenactivity;
  2. import java.util.HashMap;
  3. import java.util.Iterator;
  4. import java.util.Map;
  5. import java.util.Timer;
  6. import java.util.TimerTask;
  7. import java.util.logging.Logger;
  8. import net.blockheaven.kaipr.heavenactivity.register.payment.Method;
  9. import net.blockheaven.kaipr.heavenactivity.register.payment.Method.MethodAccount;
  10. import org.bukkit.ChatColor;
  11. import org.bukkit.command.Command;
  12. import org.bukkit.command.CommandSender;
  13. import org.bukkit.command.ConsoleCommandSender;
  14. import org.bukkit.entity.Player;
  15. import org.bukkit.event.Event;
  16. import org.bukkit.event.Event.Priority;
  17. import org.bukkit.event.block.BlockListener;
  18. import org.bukkit.event.player.PlayerListener;
  19. import org.bukkit.event.server.ServerListener;
  20. import org.bukkit.plugin.PluginManager;
  21. import org.bukkit.plugin.java.JavaPlugin;
  22. import com.nijiko.permissions.PermissionHandler;
  23. public class HeavenActivity extends JavaPlugin {
  24. /**
  25. * Logger for messages.
  26. */
  27. protected static final Logger logger = Logger.getLogger("Minecraft.HeavenActivity");
  28. /**
  29. * Configuration
  30. */
  31. public HeavenActivityConfig config;
  32. /**
  33. * Data
  34. */
  35. public HeavenActivityData data;
  36. /**
  37. * Permission handler
  38. */
  39. public static PermissionHandler Permissions;
  40. /**
  41. * Register-based economy handling method
  42. */
  43. public static Method ecoMethod;
  44. /**
  45. * Sequence update timer
  46. */
  47. public static Timer updateTimer = null;
  48. /**
  49. * The current sequence
  50. */
  51. public int currentSequence = 1;
  52. /**
  53. * Called when plugin gets enabled, initialize all the stuff we need
  54. */
  55. public void onEnable() {
  56. logger.info(getDescription().getName() + " "
  57. + getDescription().getVersion() + " enabled.");
  58. getDataFolder().mkdirs();
  59. config = new HeavenActivityConfig(this);
  60. data = new HeavenActivityData(this);
  61. data.initNewSequence();
  62. startUpdateTimer();
  63. PlayerListener playerListener = new HeavenActivityPlayerListener(this);
  64. BlockListener blockListener = new HeavenActivityBlockListener(this);
  65. ServerListener serverListener = new HeavenActivityServerListener(this);
  66. PluginManager pm = getServer().getPluginManager();
  67. if (config.moveTracking)
  68. pm.registerEvent(Event.Type.PLAYER_MOVE, playerListener, Priority.Monitor, this);
  69. if (config.commandTracking || config.logCommands)
  70. pm.registerEvent(Event.Type.PLAYER_COMMAND_PREPROCESS, playerListener, Priority.Monitor, this);
  71. if (config.chatTracking)
  72. pm.registerEvent(Event.Type.PLAYER_CHAT, playerListener, Priority.Monitor, this);
  73. if (config.blockTracking) {
  74. pm.registerEvent(Event.Type.BLOCK_BREAK, blockListener, Priority.Monitor, this);
  75. pm.registerEvent(Event.Type.BLOCK_PLACE, blockListener, Priority.Monitor, this);
  76. }
  77. pm.registerEvent(Event.Type.PLUGIN_ENABLE, serverListener, Priority.Monitor, this);
  78. pm.registerEvent(Event.Type.PLUGIN_DISABLE, serverListener, Priority.Monitor, this);
  79. }
  80. /**
  81. * Called when the plugin gets disabled, disable timers and save stats
  82. */
  83. public void onDisable() {
  84. stopUpdateTimer();
  85. }
  86. /**
  87. * Command handling
  88. */
  89. public boolean onCommand(CommandSender sender, Command cmd,
  90. String commandLabel, String[] args) {
  91. if (args.length == 0) {
  92. if (hasPermission(sender, "activity.view.own")) {
  93. if (!(sender instanceof Player)) {
  94. sender.sendMessage(ChatColor.RED + "[Activity] Activity is only tracked for players!");
  95. return false;
  96. }
  97. final int activity = data.getActivity((Player) sender);
  98. sendMessage(sender, "Your current activity is: " + activityColor(activity) + activity + "%");
  99. } else {
  100. sendMessage(sender, ChatColor.RED + "You have no permission to see your activity.");
  101. }
  102. } else if (args[0].compareToIgnoreCase("list") == 0 || args[0].compareToIgnoreCase("listall") == 0) {
  103. if (hasPermission(sender, "activity.view.list")) {
  104. StringBuilder res = new StringBuilder();
  105. for (Player player : getServer().getOnlinePlayers()) {
  106. final int activity = data.getActivity(player);
  107. res.append(activityColor(activity) + player.getName() + " " + activity + "%");
  108. res.append(ChatColor.GRAY + ", ");
  109. }
  110. if (res.length() > 0) {
  111. sendMessage(sender, res.substring(0, res.length() - 2));
  112. } else {
  113. sendMessage(sender, "There are no players online.");
  114. }
  115. } else {
  116. sendMessage(sender, ChatColor.RED + "You have no permission to see a list of online players' activity.");
  117. }
  118. } else if (args[0].compareToIgnoreCase("admin") == 0 && hasPermission(sender, "activity.admin.*")) {
  119. if (args.length == 1) {
  120. sendMessage(sender, ChatColor.RED + "/activity admin <reload>");
  121. } else if (args[1].compareToIgnoreCase("reload") == 0) {
  122. config.load();
  123. stopUpdateTimer();
  124. startUpdateTimer();
  125. sendMessage(sender, ChatColor.GREEN + "Reloaded");
  126. } else if (args[1].compareToIgnoreCase("debug") == 0) {
  127. if (config.debug) {
  128. config.debug = false;
  129. sendMessage(sender, "Debug mode turned " + ChatColor.RED + "OFF");
  130. } else {
  131. config.debug = true;
  132. sendMessage(sender, "Debug mode turned " + ChatColor.GREEN +"ON");
  133. }
  134. } else if (args[1].compareToIgnoreCase("benchmark") == 0) {
  135. TimerTask getting = new TimerTask() {
  136. public void run() {
  137. long start = System.currentTimeMillis();
  138. for (int i=100000; i > 0; i--) {
  139. data.getActivity("_benchmark_");
  140. }
  141. HeavenActivity.logger.info("100.000 x getActivity: " + String.valueOf(System.currentTimeMillis() - start) + "ms");
  142. }
  143. };
  144. TimerTask setting = new TimerTask() {
  145. public void run() {
  146. long start = System.currentTimeMillis();
  147. for (int i=100000; i > 0; i--) {
  148. data.addActivity("_benchmark_", ActivitySource.MOVE, 3);
  149. }
  150. HeavenActivity.logger.info("1.000.000 x addActivity: " + String.valueOf(System.currentTimeMillis() - start) + "ms");
  151. }
  152. };
  153. getServer().getScheduler().scheduleAsyncDelayedTask(this, getting);
  154. getServer().getScheduler().scheduleAsyncDelayedTask(this, setting);
  155. }
  156. } else if (args.length == 1) {
  157. if (hasPermission(sender, "activity.view.other")) {
  158. String playerName = matchSinglePlayer(sender, args[0]).getName();
  159. int activity = data.getActivity(playerName);
  160. sendMessage(sender, "Current activity of " + playerName + ": " + activityColor(activity) + activity + "%");
  161. } else {
  162. sendMessage(sender, ChatColor.RED + "You have no permission to see other's activity.");
  163. }
  164. }
  165. return true;
  166. }
  167. /**
  168. * Checks permission for a CommandSender
  169. *
  170. * @param player
  171. * @param node
  172. * @return
  173. */
  174. public boolean hasPermission(CommandSender sender, String node) {
  175. if (sender instanceof ConsoleCommandSender)
  176. return true;
  177. return hasPermission((Player)sender, node);
  178. }
  179. /**
  180. * Checks permission for a Player
  181. *
  182. * @param player
  183. * @param node
  184. * @return
  185. */
  186. public boolean hasPermission(Player player, String node) {
  187. if (player.isOp())
  188. return true;
  189. if (Permissions != null) {
  190. return Permissions.has(player, node);
  191. } else {
  192. return player.hasPermission(node);
  193. }
  194. }
  195. /**
  196. * Returns a cumulated multiplier set for the given player
  197. *
  198. * @param player
  199. * @return
  200. */
  201. public Map<ActivitySource, Double> getCumulatedMultiplierSet(Player player) {
  202. Map<ActivitySource, Double> res = new HashMap<ActivitySource, Double>(ActivitySource.values().length);
  203. Iterator<String> multiplierSetNameIterator = config.multiplierSets.keySet().iterator();
  204. for (int i1 = config.multiplierSets.size(); i1 > 0; i1--) {
  205. final String multiplierSetName = multiplierSetNameIterator.next();
  206. if (!hasPermission(player, "activity.multiplier." + multiplierSetName))
  207. continue;
  208. final Map<ActivitySource, Double> multiplierSet = config.multiplierSets.get(multiplierSetName);
  209. Iterator<ActivitySource> sourceIterator = multiplierSet.keySet().iterator();
  210. for (int i2 = multiplierSet.size(); i2 > 0; i2--) {
  211. final ActivitySource source = sourceIterator.next();
  212. if (res.containsKey(source)) {
  213. res.put(source, res.get(source) * multiplierSet.get(source));
  214. } else {
  215. res.put(source, multiplierSet.get(source));
  216. }
  217. }
  218. }
  219. return res;
  220. }
  221. // public Set<String> getMultiplierSets(Player player) {
  222. // Set<String> res = new HashSet<String>();
  223. //
  224. // Iterator<String> multiplierIterator = config.multiplierSets.keySet().iterator();
  225. // while (multiplierIterator.hasNext()) {
  226. // final String multiplier = multiplierIterator.next();
  227. // if (hasPermission(player, "activity.multiplier." + multiplier)) {
  228. // res.add(multiplier);
  229. // }
  230. // }
  231. //
  232. // return res;
  233. // }
  234. /**
  235. * Sends a prefixed message to given CommandSender
  236. *
  237. * @param sender
  238. * @param message
  239. */
  240. public void sendMessage(CommandSender sender, String message) {
  241. sender.sendMessage(ChatColor.DARK_GRAY + "[Activity] " + ChatColor.GRAY + message);
  242. }
  243. /**
  244. * Sends a prefixed message to given Player
  245. *
  246. * @param player
  247. * @param message
  248. */
  249. public void sendMessage(Player player, String message) {
  250. player.sendMessage(ChatColor.DARK_GRAY + "[Activity] " + ChatColor.GRAY + message);
  251. }
  252. /**
  253. * Match a single online player which name contains filter
  254. *
  255. * @param sender
  256. * @param filter
  257. * @return
  258. */
  259. public Player matchSinglePlayer(CommandSender sender, String filter) {
  260. filter = filter.toLowerCase();
  261. for (Player player : getServer().getOnlinePlayers()) {
  262. if (player.getName().toLowerCase().contains(filter)) {
  263. return player;
  264. }
  265. }
  266. sender.sendMessage(ChatColor.RED + "No matching player found, matching yourself.");
  267. return (Player) sender;
  268. }
  269. /**
  270. * Returns current activity of given player
  271. *
  272. * @param playerName
  273. * @return
  274. */
  275. @Deprecated
  276. public int getActivity(Player player) {
  277. return data.getActivity(player.getName());
  278. }
  279. /**
  280. * Returns current activity of given playerName
  281. *
  282. * @param playerName
  283. * @return
  284. */
  285. @Deprecated
  286. public int getActivity(String playerName) {
  287. return data.getActivity(playerName);
  288. }
  289. /**
  290. * Logs a debug message
  291. *
  292. * @param message
  293. */
  294. public void debugMsg(String message) {
  295. debugMsg(message, null);
  296. }
  297. /**
  298. * Logs a debug message including the time the action took
  299. *
  300. * @param message
  301. * @param started
  302. */
  303. public void debugMsg(String message, Long started) {
  304. if (!config.debug) return;
  305. StringBuilder msg = new StringBuilder("[HeavenActivity Debug]");
  306. msg.append("[Seq#").append(currentSequence).append(" (").append(data.playersActivities.size()).append(")]");
  307. if (started != null) {
  308. msg.append("[Time:").append(System.currentTimeMillis() - started).append("ms]");
  309. }
  310. msg.append(" ").append(message);
  311. HeavenActivity.logger.info(msg.toString());
  312. }
  313. /**
  314. * Initializes and starts the update timer
  315. */
  316. protected void startUpdateTimer() {
  317. updateTimer = new Timer();
  318. updateTimer.scheduleAtFixedRate(new TimerTask() {
  319. public void run() {
  320. // Give players info
  321. if (currentSequence % config.notificationSequence == 0) {
  322. long notificationStarted = System.currentTimeMillis();
  323. for (Player player : getServer().getOnlinePlayers()) {
  324. if (hasPermission(player, "activity.notify.activity")) {
  325. final int activity = data.getActivity(player.getName());
  326. sendMessage(player, "Your current activity is: " + activityColor(activity) + activity + "%");
  327. }
  328. }
  329. debugMsg("Notifications sent", notificationStarted);
  330. }
  331. // Handle income
  332. if (currentSequence % config.incomeSequence == 0 && config.incomeEnabled) {
  333. long handleIncomeStarted = System.currentTimeMillis();
  334. handleOnlineIncome();
  335. debugMsg("Online income handled", handleIncomeStarted);
  336. }
  337. ++currentSequence;
  338. data.initNewSequence();
  339. }
  340. }, (config.sequenceInterval * 1000L), (config.sequenceInterval * 1000L));
  341. logger.info("[HeavenActivity] Update timer started");
  342. }
  343. /**
  344. * Stops the update timer
  345. */
  346. protected void stopUpdateTimer() {
  347. updateTimer.cancel();
  348. logger.info("[HeavenActivity] Update timer stopped");
  349. }
  350. /**
  351. * Gives income to online players
  352. */
  353. protected void handleOnlineIncome() {
  354. if (data.playersActivities.size() == 0)
  355. return;
  356. if (ecoMethod == null) {
  357. logger.warning("[HeavenActivity] Want to give income, but no economy plugin is active! Skipping...");
  358. return;
  359. }
  360. for (Player player : getServer().getOnlinePlayers()) {
  361. final int activity = data.getActivity(player);
  362. if ((int)activity >= config.incomeMinActivity) {
  363. MethodAccount account = ecoMethod.getAccount(player.getName());
  364. config.incomeExpression.setVariable("player_activity", activity);
  365. config.incomeExpression.setVariable("player_balance", account.balance());
  366. final Double amount = config.incomeExpression.getValue();
  367. if (amount > 0.0 || config.incomeAllowNegative) {
  368. account.add(amount);
  369. if (config.incomeSourceAccount != null) {
  370. ecoMethod.getAccount(config.incomeSourceAccount).subtract(amount);
  371. }
  372. if (hasPermission(player, "activity.notify.income")) {
  373. sendMessage(player, "You got " + activityColor(activity) + ecoMethod.format(amount)
  374. + ChatColor.GRAY + " income for being "
  375. + activityColor(activity) + activity + "% " + ChatColor.GRAY + "active.");
  376. sendMessage(player, "Your Balance is now: " + ChatColor.WHITE
  377. + ecoMethod.format(account.balance()));
  378. }
  379. continue;
  380. }
  381. }
  382. sendMessage(player, ChatColor.RED + "You were too lazy, no income for you this time!");
  383. }
  384. }
  385. protected ChatColor activityColor(int activity) {
  386. if (activity > 75) {
  387. return ChatColor.GREEN;
  388. } else if (activity < 25) {
  389. return ChatColor.RED;
  390. } else {
  391. return ChatColor.YELLOW;
  392. }
  393. }
  394. }