· 7 years ago · Jan 14, 2019, 12:56 AM
1package mineplex.core.account.repository;
2
3import java.sql.Connection;
4import java.sql.ResultSet;
5import java.sql.SQLException;
6import java.sql.Statement;
7import java.sql.Timestamp;
8import java.util.ArrayList;
9import java.util.List;
10import java.util.UUID;
11import mineplex.core.account.repository.token.DonorRequestToken;
12
13import org.bukkit.Bukkit;
14import org.bukkit.craftbukkit.libs.com.google.gson.reflect.TypeToken;
15import org.bukkit.plugin.java.JavaPlugin;
16
17import mineplex.core.account.ILoginProcessor;
18import mineplex.core.account.repository.token.LoginToken;
19import mineplex.core.account.repository.token.RankUpdateToken;
20import mineplex.core.common.Rank;
21import mineplex.core.common.util.Callback;
22import mineplex.core.common.util.NautHashMap;
23import mineplex.core.database.DBPool;
24import mineplex.core.database.DatabaseRunnable;
25import mineplex.core.database.RepositoryBase;
26import mineplex.core.database.ResultSetCallable;
27import mineplex.core.database.column.Column;
28import mineplex.core.database.column.ColumnBoolean;
29import mineplex.core.database.column.ColumnTimestamp;
30import mineplex.core.database.column.ColumnVarChar;
31import mineplex.core.server.remotecall.JsonWebCall;
32
33public class AccountRepository extends RepositoryBase
34{
35 private static String CREATE_ACCOUNT_TABLE = "CREATE TABLE IF NOT EXISTS accounts (id INT NOT NULL AUTO_INCREMENT, uuid VARCHAR(100), name VARCHAR(40), gems INT, rank VARCHAR(40), rankPerm BOOL, rankExpire LONG, lastLogin LONG, totalPlayTime LONG, PRIMARY KEY (id), UNIQUE INDEX uuidIndex (uuid), UNIQUE INDEX nameIndex (name), INDEX rankIndex (rank));";
36 private static String ACCOUNT_LOGIN_NEW = "INSERT INTO accounts (uuid, name, lastLogin) values(?, ?, now());";
37 private static String UPDATE_ACCOUNT_RANK = "UPDATE accounts SET rank=?, rankPerm=false, rankExpire=now() + INTERVAL 1 MONTH WHERE uuid = ?;";
38 private static String UPDATE_ACCOUNT_RANK_DONOR = "UPDATE accounts SET rank=?, donorRank=?, rankPerm=false, rankExpire=now() + INTERVAL 1 MONTH WHERE uuid = ?;";
39 private static String UPDATE_ACCOUNT_RANK_PERM = "UPDATE accounts SET rank=?, rankPerm=true WHERE uuid = ?;";
40 private static String UPDATE_ACCOUNT_RANK_DONOR_PERM = "UPDATE accounts SET rank=?, donorRank=?, rankPerm=true WHERE uuid = ?;";
41 private static String UPDATE_ACCOUNT_NULL_RANK = "UPDATE accounts SET rank=?, donorRank=?, rankPerm=?, rankExpire=? WHERE uuid = ? AND rank IS NULL;";
42
43 private static String SELECT_ACCOUNT_UUID_BY_NAME = "SELECT uuid FROM accounts WHERE name = ? ORDER BY lastLogin DESC;";
44
45 private String _webAddress;
46
47 public AccountRepository(JavaPlugin plugin, String webAddress)
48 {
49 super(plugin, DBPool.ACCOUNT);
50
51 _webAddress = webAddress;
52 }
53
54 @Override
55 protected void initialize()
56 {
57 executeUpdate(CREATE_ACCOUNT_TABLE, new Column[0]);
58 }
59
60 public int login(NautHashMap<String, ILoginProcessor> loginProcessors, String uuid, String name)
61 {
62 int accountId = -1;
63 try (
64 Connection connection = getConnection();
65 Statement statement = connection.createStatement()
66 )
67 {
68 statement.execute("SELECT id FROM accounts WHERE accounts.uuid = '" + uuid + "' LIMIT 1;");
69 ResultSet resultSet = statement.getResultSet();
70
71 while (resultSet.next())
72 {
73 accountId = resultSet.getInt(1);
74 }
75
76 if (accountId == -1)
77 {
78 final List<Integer> tempList = new ArrayList<Integer>(1);
79
80 executeInsert(ACCOUNT_LOGIN_NEW, new ResultSetCallable()
81 {
82 @Override
83 public void processResultSet(ResultSet resultSet) throws SQLException
84 {
85 while (resultSet.next())
86 {
87 tempList.add(resultSet.getInt(1));
88 }
89 }
90 },new ColumnVarChar("uuid", 100, uuid), new ColumnVarChar("name", 100, name));
91
92 accountId = tempList.get(0);
93 }
94
95 /*
96 boolean statementStatus = statement.execute(
97 "UPDATE accounts SET name='" + name + "', lastLogin=now() WHERE accounts.uuid = '" + uuid + "';"
98 + "SELECT games, visibility, showChat, friendChat, privateMessaging, partyRequests, invisibility, forcefield, showMacReports, ignoreVelocity, pendingFriendRequests FROM accountPreferences WHERE accountPreferences.uuid = '" + uuid + "' LIMIT 1;"
99 + "SELECT items.name, ic.name as category, count FROM accountInventory AS ai INNER JOIN items ON items.id = ai.itemId INNER JOIN itemCategories AS ic ON ic.id = items.categoryId INNER JOIN accounts ON accounts.id = ai.accountId WHERE accounts.uuid = '" + uuid + "';"
100 + "SELECT benefit FROM rankBenefits WHERE rankBenefits.uuid = '" + uuid + "';"
101 + "SELECT stats.name, value FROM accountStats INNER JOIN stats ON stats.id = accountStats.statId INNER JOIN accounts ON accountStats.accountId = accounts.id WHERE accounts.uuid = '" + uuid + "';"
102 + "SELECT tA.Name, status, serverName, tA.lastLogin, now() FROM accountFriend INNER Join accounts AS fA ON fA.uuid = uuidSource INNER JOIN accounts AS tA ON tA.uuid = uuidTarget LEFT JOIN playerMap ON tA.name = playerName WHERE uuidSource = '" + uuid + "';"
103 + "SELECT gameType, elo FROM eloRating WHERE uuid = '" + uuid + "';"
104 );
105*/
106
107 String loginString = "UPDATE accounts SET name='" + name + "', lastLogin=now() WHERE id = '" + accountId + "';";
108
109 for (ILoginProcessor loginProcessor : loginProcessors.values())
110 {
111 loginString += loginProcessor.getQuery(accountId, uuid, name);
112 }
113
114 statement.execute(loginString);
115
116 /*
117 while (true)
118 {
119 if (statementStatus)
120 {
121 System.out.println("ResultSet : " + statement.getResultSet().getMetaData().getColumnCount() + " columns:");
122
123 for (int i = 0; i < statement.getResultSet().getMetaData().getColumnCount(); i++)
124 {
125 System.out.println(statement.getResultSet().getMetaData().getColumnName(i + 1));
126 }
127 }
128 else
129 {
130 if (statement.getUpdateCount() == -1)
131 break;
132
133 System.out.println("Update statement : " + statement.getUpdateCount() + " rows affected.");
134 }
135
136 statementStatus = statement.getMoreResults();
137 }
138
139 System.out.println("Done");
140 */
141
142 statement.getUpdateCount();
143 statement.getMoreResults();
144
145 for (ILoginProcessor loginProcessor : loginProcessors.values())
146 {
147 loginProcessor.processLoginResultSet(name, accountId, statement.getResultSet());
148 statement.getMoreResults();
149 }
150 }
151 catch (Exception exception)
152 {
153 exception.printStackTrace();
154 }
155
156 return accountId;
157 }
158
159 public String GetClient(String name, UUID uuid, String ipAddress)
160 {
161 LoginToken token = new LoginToken();
162 token.Name = name;
163 token.Uuid = uuid.toString();
164 token.IpAddress = ipAddress;
165
166 return new JsonWebCall(_webAddress + "PlayerAccount/Login").ExecuteReturnStream(token);
167 }
168
169 public String GetDonor(String name, UUID uuid)
170 {
171 DonorRequestToken token = new DonorRequestToken();
172 token.name = name;
173 token.uuid = uuid.toString();
174 return new JsonWebCall(this._webAddress + "PlayerAccount/DonorRequest.php").ExecuteReturnStream(token);
175 }
176
177 public String getClientByUUID(UUID uuid)
178 {
179 return new JsonWebCall(_webAddress + "PlayerAccount/GetAccountByUUID").ExecuteReturnStream(uuid.toString());
180 }
181
182 public UUID getClientUUID(String name)
183 {
184 final List<UUID> uuids = new ArrayList<UUID>();
185
186 executeQuery(SELECT_ACCOUNT_UUID_BY_NAME, new ResultSetCallable()
187 {
188 @Override
189 public void processResultSet(ResultSet resultSet) throws SQLException
190 {
191 while (resultSet.next())
192 {
193 uuids.add(UUID.fromString(resultSet.getString(1)));
194 }
195 }
196 }, new ColumnVarChar("name", 100, name));
197
198 if (uuids.size() > 0)
199 return uuids.get(uuids.size() - 1);
200 else
201 return null;
202 }
203
204 public void saveRank(final Callback<Rank> callback, final String name, final UUID uuid, final Rank rank, final boolean perm)
205 {
206 final RankUpdateToken token = new RankUpdateToken();
207 token.Name = name;
208 token.Rank = rank.toString();
209 token.Perm = perm;
210
211 final Callback<Rank> extraCallback = new Callback<Rank>()
212 {
213 public void run(final Rank response)
214 {
215 if (rank == Rank.ULTRA || rank == Rank.HERO || rank == Rank.LEGEND)
216 {
217 if (perm)
218 executeUpdate(UPDATE_ACCOUNT_RANK_DONOR_PERM, new ColumnVarChar("rank", 100, rank.toString()), new ColumnVarChar("donorRank", 100, rank.toString()), new ColumnVarChar("uuid", 100, uuid.toString()));
219 else
220 executeUpdate(UPDATE_ACCOUNT_RANK_DONOR, new ColumnVarChar("rank", 100, rank.toString()), new ColumnVarChar("donorRank", 100, rank.toString()), new ColumnVarChar("uuid", 100, uuid.toString()));
221 }
222 else
223 {
224 if (perm)
225 AccountRepository.this.executeUpdate(AccountRepository.UPDATE_ACCOUNT_RANK_PERM, new Column[] { new ColumnVarChar("rank", 100, rank.toString()), new ColumnVarChar("uuid", 100, uuid.toString()) });
226 else
227 AccountRepository.this.executeUpdate(AccountRepository.UPDATE_ACCOUNT_RANK, new Column[] { new ColumnVarChar("rank", 100, rank.toString()), new ColumnVarChar("uuid", 100, uuid.toString()) });
228 }
229
230 Bukkit.getServer().getScheduler().runTask(Plugin, new Runnable()
231 {
232 @Override
233 public void run()
234 {
235 callback.run(response);
236 }
237 });
238 }
239 };
240
241 handleDatabaseCall(new DatabaseRunnable(new Runnable()
242 {
243 public void run()
244 {
245 new JsonWebCall(_webAddress + "PlayerAccount/RankUpdate").Execute(Rank.class, extraCallback, token);
246 }
247 }), "Error saving player " + token.Name + "'s rank in AccountRepository : ");
248
249 }
250
251 public void matchPlayerName(final Callback<List<String>> callback, final String userName)
252 {
253 Thread asyncThread = new Thread(new Runnable()
254 {
255 public void run()
256 {
257 List<String> tokenList = new JsonWebCall(_webAddress + "PlayerAccount/GetMatches").Execute(new TypeToken<List<String>>(){}.getType(), userName);
258 callback.run(tokenList);
259 }
260 });
261
262 asyncThread.start();
263 }
264
265 @Override
266 protected void update()
267 {
268 }
269
270 public void updateMysqlRank(final String uuid, final String rank, final boolean perm, final String rankExpire)
271 {
272 handleDatabaseCall(new DatabaseRunnable(new Runnable()
273 {
274 public void run()
275 {
276 executeUpdate(UPDATE_ACCOUNT_NULL_RANK, new ColumnVarChar("rank", 100, rank), new ColumnVarChar("donorRank", 100, rank), new ColumnBoolean("rankPerm", perm), new ColumnTimestamp("rankExpire", Timestamp.valueOf(rankExpire)), new ColumnVarChar("uuid", 100, uuid));
277 }
278 }), "Error updating player's mysql rank AccountRepository : ");
279 }
280
281 public String getClientByName(String playerName)
282 {
283 return new JsonWebCall(_webAddress + "PlayerAccount/GetAccount").ExecuteReturnStream(playerName);
284 }
285}