· 6 years ago · Jan 13, 2020, 07:24 PM
1package com.ayanix.plugins.manaeventtokens;
2
3import com.ayanix.panther.impl.common.storage.sql.HikariMySQLStorage;
4import com.ayanix.panther.internal.sql2o.Connection;
5import com.ayanix.panther.internal.sql2o.Query;
6import com.ayanix.panther.internal.sql2o.ResultSetHandler;
7import lombok.Getter;
8import lombok.val;
9import org.bukkit.Bukkit;
10import org.bukkit.entity.Player;
11
12import java.util.*;
13import java.util.logging.Level;
14
15/**
16 * ManaEventTokens - Developed by Lewes D. B. (Boomclaw).
17 * All rights reserved 2017.
18 */
19public class TokenManager
20{
21
22 private final ManaEventTokens plugin;
23 private final List<PlayerTokenData> playerData;
24 @Getter
25 private HikariMySQLStorage sql;
26
27 TokenManager(ManaEventTokens plugin)
28 {
29 this.plugin = plugin;
30 this.playerData = Collections.synchronizedList(new ArrayList<>());
31 }
32
33 public boolean connect()
34 {
35 val builder = new HikariMySQLStorage.HikariSQLStorageBuilder();
36
37 builder.host(plugin.getConfig().getString("mysql.host"))
38 .port(plugin.getConfig().getInt("mysql.port"))
39 .username(plugin.getConfig().getString("mysql.username"))
40 .password(plugin.getConfig().getString("mysql.password"))
41 .table(plugin.getConfig().getString("mysql.table"))
42 .database(plugin.getConfig().getString("mysql.database"));
43
44 try
45 {
46 sql = builder.build();
47 } catch (Exception e)
48 {
49 plugin.getLogger().log(Level.SEVERE, "Unable to connect to database", e);
50 return false;
51 }
52
53 String createQuery = "CREATE TABLE IF NOT EXISTS " + sql.getTable() + " ( uuid VARCHAR(40), name VARCHAR(16)," +
54 " " +
55 "balance FLOAT, primary key(uuid) )";
56
57 try (Connection connection = sql.getSQL().open();
58 Query query = connection.createQuery(createQuery))
59 {
60 query.executeUpdate();
61 }
62
63 return true;
64 }
65
66 public PlayerTokenData get(Player player)
67 {
68 return get(player.getUniqueId());
69 }
70
71 public PlayerTokenData get(UUID uuid)
72 {
73 return get(uuid, false);
74 }
75
76 public PlayerTokenData get(UUID uuid, boolean cache)
77 {
78 PlayerTokenData cacheData = getFromCache(uuid);
79
80 if (cacheData != null)
81 {
82 return cacheData;
83 } else
84 {
85 cacheData = new PlayerTokenData(uuid);
86 }
87
88 final String selectQuery = "SELECT * FROM " + sql.getTable() + " WHERE uuid=:uuid";
89
90 try (Connection connection = sql.getSQL().open();
91 Query query = connection.createQuery(selectQuery))
92 {
93 List<PlayerTokenData> data =
94 query.addParameter("uuid", uuid.toString()).executeAndFetch((ResultSetHandler<PlayerTokenData>) resultSet -> {
95 PlayerTokenData playerTokenData = new PlayerTokenData(uuid);
96
97 resultSet.beforeFirst();
98
99 while (resultSet.next())
100 {
101 double balance = resultSet.getDouble("balance");
102
103 playerTokenData.setBalance(balance);
104 }
105
106 return playerTokenData;
107 });
108
109 if (!data.isEmpty())
110 {
111 cacheData = data.get(0);
112 }
113 } catch (Exception e)
114 {
115 e.printStackTrace();
116 return new PlayerTokenData(uuid);
117 }
118
119 if (cache)
120 {
121 if (cacheData == null)
122 {
123 return new PlayerTokenData(uuid);
124 }
125
126 playerData.add(cacheData);
127 }
128
129 return cacheData;
130 }
131
132 public PlayerTokenData getFromCache(UUID uuid)
133 {
134 synchronized (playerData)
135 {
136 Iterator<PlayerTokenData> iterator = playerData.iterator();
137
138 while (iterator.hasNext())
139 {
140 PlayerTokenData data = iterator.next();
141
142 if (data == null)
143 {
144 iterator.remove();
145 continue;
146 }
147
148 if (data.getUuid().equals(uuid))
149 {
150 return data;
151 }
152 }
153 }
154
155 return null;
156 }
157
158 public PlayerTokenData get(String name)
159 {
160 return get(Bukkit.getOfflinePlayer(name).getUniqueId());
161 }
162
163 public void saveAll()
164 {
165 final String queryStr = "INSERT INTO " + sql.getTable() + " (uuid, name, balance) VALUES (:uuid, :name, " +
166 ":balance) ON DUPLICATE KEY UPDATE name=:name, balance=:balance";
167
168 try (Connection connection = sql.getSQL().open();
169 Query query = connection.createQuery(queryStr))
170 {
171 synchronized (playerData)
172 {
173 for (PlayerTokenData data : playerData)
174 {
175 query.addParameter("uuid", data.getUuid().toString())
176 .addParameter("name", Bukkit.getOfflinePlayer(data.getUuid()).getName())
177 .addParameter("balance", data.getBalance()).addToBatch();
178 }
179 }
180
181 query.executeUpdate();
182 }
183 }
184
185 public void save(PlayerTokenData data)
186 {
187 if (data == null)
188 {
189 return;
190 }
191
192 final String queryStr = "INSERT INTO " + sql.getTable() + " (uuid, name, balance) VALUES (:uuid, :name, " +
193 ":balance) ON DUPLICATE KEY UPDATE name=:name, balance=:balance";
194
195 try (Connection connection = sql.getSQL().open();
196 Query query = connection.createQuery(queryStr))
197 {
198 query.addParameter("uuid", data.getUuid().toString())
199 .addParameter("name", Bukkit.getOfflinePlayer(data.getUuid()).getName())
200 .addParameter("balance", data.getBalance()).executeUpdate();
201 }
202 }
203
204 public void removeFromCache(PlayerTokenData data)
205 {
206 if (data == null)
207 {
208 return;
209 }
210
211 playerData.remove(data);
212 }
213
214}