· 10 years ago · Apr 13, 2016, 11:57 PM
1package ru.Den_Abr.Crates;
2
3import java.util.concurrent.*;
4import org.bukkit.configuration.*;
5import org.bukkit.scheduler.*;
6import java.util.*;
7import org.bukkit.plugin.*;
8
9public class KeyCache
10{
11 private static String host;
12 private static String user;
13 private static String password;
14 private static String database;
15 private static int port;
16 private static MySQL mysql;
17 private static Map<String, Map<String, Integer>> keys;
18
19 static {
20 KeyCache.keys = new ConcurrentHashMap<String, Map<String, Integer>>();
21 }
22
23 public static void init(final ConfigurationSection cs) {
24 KeyCache.keys.clear();
25 KeyCache.host = cs.getString("host");
26 KeyCache.user = cs.getString("user");
27 KeyCache.password = cs.getString("password");
28 KeyCache.database = cs.getString("database");
29 KeyCache.port = cs.getInt("port");
30 KeyCache.mysql = new MySQL(KeyCache.user, KeyCache.password, KeyCache.host, KeyCache.port, KeyCache.database);
31 createTables();
32 }
33
34 private static void createTables() {
35 final String sqlQuery = "CREATE TABLE IF NOT EXISTS `player_keys` ( `id` int(11) NOT NULL AUTO_INCREMENT, `player` varchar(255) NOT NULL, `key` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `id` (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;";
36 KeyCache.mysql.createTable(sqlQuery);
37 }
38
39 public static boolean removeKey(final String player, final String key) {
40 if (getKeys(player, key) <= 1) {
41 KeyCache.keys.get(key).remove(player.toLowerCase());
42 }
43 else {
44 KeyCache.keys.get(key).put(player.toLowerCase(), getKeys(player, key) - 1);
45 }
46 return KeyCache.mysql.update("DELETE FROM `player_keys` WHERE `player` = '" + player + "' AND `key` = '" + key + "' LIMIT 1");
47 }
48
49 public static int getKeys(final String player, final String key) {
50 if (KeyCache.keys.containsKey(key) && KeyCache.keys.get(key).containsKey(player.toLowerCase())) {
51 return KeyCache.keys.get(key).get(player.toLowerCase());
52 }
53 return 0;
54 }
55
56 public static void grabKeys(final int period) {
57 new BukkitRunnable() {
58 public void run() {
59 final String query = "SELECT * FROM `player_keys`";
60 final List<Object[]> resultList = KeyCache.mysql.select(query);
61 final ConcurrentHashMap<String, Map<String, Integer>> results = new ConcurrentHashMap<String, Map<String, Integer>>();
62 for (final Object[] r : resultList) {
63 final String player = ((String)r[1]).toLowerCase();
64 final String keyName = (String)r[2];
65 if (!results.containsKey(keyName)) {
66 results.put(keyName, new HashMap<String, Integer>());
67 results.get(keyName).put(player, 1);
68 }
69 else {
70 final Map<String, Integer> keyMap = results.get(keyName);
71 if (keyMap.containsKey(player)) {
72 keyMap.put(player, keyMap.get(player) + 1);
73 }
74 else {
75 keyMap.put(player, 1);
76 }
77 }
78 }
79 KeyCache.keys.clear();
80 KeyCache.keys.putAll(results);
81 }
82 }.runTaskTimerAsynchronously((Plugin)CratesPlugin.getInstance(), 0L, (long)(period * 20 * 60));
83 }
84}