Skip to content

Commit 4454f1d

Browse files
committed
Massive cleaning of SQL, ladder loading
1 parent 54c1254 commit 4454f1d

File tree

6 files changed

+218
-61
lines changed

6 files changed

+218
-61
lines changed

API/src/main/java/me/innectic/permissify/api/database/DatabaseHandler.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public abstract class DatabaseHandler {
4343
@Getter protected Map<UUID, List<Permission>> cachedPermissions = new HashMap<>();
4444
@Getter protected Map<String, PermissionGroup> cachedGroups = new HashMap<>();
4545
@Getter protected Optional<PermissionGroup> defaultGroup = Optional.empty();
46+
@Getter protected Map<String, AbstractLadder> cachedLadders = new HashMap<>();
4647
@Getter protected final Optional<ConnectionInformation> connectionInformation;
4748
@Getter protected List<UUID> superAdmins = new ArrayList<>();
4849
// Revisit: Maybe different default formatters?
@@ -72,6 +73,21 @@ public DatabaseHandler(ConnectionInformation connectionInformation) {
7273
*/
7374
public abstract void reload(List<UUID> onlinePlayers);
7475

76+
/**
77+
* Load all groups
78+
*/
79+
protected abstract void loadGroups();
80+
81+
/**
82+
* Load all ladders
83+
*/
84+
protected abstract void loadLadders();
85+
86+
/**
87+
* Load all super admins
88+
*/
89+
protected abstract void loadSuperAdmins();
90+
7591
/**
7692
* Drop all values from the handler.
7793
*/
@@ -240,6 +256,13 @@ public DatabaseHandler(ConnectionInformation connectionInformation) {
240256
*/
241257
public abstract boolean isSuperAdmin(UUID uuid);
242258

259+
/***
260+
* Remove a superadmin.
261+
*
262+
* @param uuid the uuid of the player to remove
263+
*/
264+
public abstract void removeSuperAdmin(UUID uuid);
265+
243266
/**
244267
* Set the format for chat messages
245268
*
@@ -277,6 +300,19 @@ public DatabaseHandler(ConnectionInformation connectionInformation) {
277300
*/
278301
public abstract void setDefaultGroup(PermissionGroup group);
279302

303+
/**
304+
* Set the ladder of a group.
305+
*
306+
* @param group the name of the group
307+
* @param ladder the ladder to add to the group
308+
*/
280309
public abstract void setGroupLadder(String group, AbstractLadder ladder);
310+
311+
/**
312+
* Get the current ladder of a group.
313+
*
314+
* @param group the name of the group to get the ladder from
315+
* @return the ladder, if present.
316+
*/
281317
public abstract Optional<AbstractLadder> getGroupLadder(String group);
282318
}

API/src/main/java/me/innectic/permissify/api/database/handlers/SQLHandler.java

Lines changed: 137 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@
3131
import me.innectic.permissify.api.database.ConnectionInformation;
3232
import me.innectic.permissify.api.group.group.PermissionGroup;
3333
import me.innectic.permissify.api.group.ladder.AbstractLadder;
34+
import me.innectic.permissify.api.group.ladder.LadderLevel;
3435
import me.innectic.permissify.api.group.ladder.impl.DefaultLadder;
36+
import me.innectic.permissify.api.group.ladder.impl.LadderBuilder;
3537
import me.innectic.permissify.api.profile.PermissifyProfile;
3638
import me.innectic.permissify.api.util.FormatterType;
3739

@@ -55,7 +57,6 @@ public SQLHandler(ConnectionInformation connectionInformation) {
5557

5658
if(connectionInformation.getMeta().containsKey("sqlite")) {
5759
type = "sqlite";
58-
// TODO: It would be nice to give this types...
5960
Map sqliteData = (Map) connectionInformation.getMeta().get("sqlite");
6061
databaseUrl = (String) sqliteData.get("file");
6162
isUsingSqlite = true;
@@ -93,23 +94,25 @@ public void initialize() {
9394
else connection = Optional.ofNullable(DriverManager.getConnection(baseConnectionURL, connectionInformation.get().getUsername(), connectionInformation.get().getPassword()));
9495
if (!connection.isPresent()) return;
9596
String database = connectionInformation.get().getDatabase();
96-
if (!database.equals("")) database += ".";
97+
if (!database.equals("")) database = ".";
9798
// TODO: This should all be prepared statements, but that breaks for some reason
9899
if (!isUsingSqlite) {
99100
PreparedStatement databaseStatement = connection.get().prepareStatement("CREATE DATABASE IF NOT EXISTS " + database);
100101
databaseStatement.execute();
101102
databaseStatement.close();
102103
}
103104

104-
PreparedStatement groupMembersStatement = connection.get().prepareStatement("CREATE TABLE IF NOT EXISTS " + database + "groupMembers (uuid VARCHAR(767) NOT NULL, `group` VARCHAR(700) NOT NULL, `primary` TINYINT NOT NULL)");
105+
PreparedStatement groupMembersStatement = connection.get().prepareStatement("CREATE TABLE IF NOT EXISTS " + database +
106+
"groupMembers (uuid VARCHAR(767) NOT NULL, `group` VARCHAR(700) NOT NULL, `primary` TINYINT NOT NULL, ladderPosition INTEGER NOT NULL)");
105107
groupMembersStatement.execute();
106108
groupMembersStatement.close();
107109

108110
PreparedStatement groupPermissionsStatement = connection.get().prepareStatement("CREATE TABLE IF NOT EXISTS " + database +"groupPermissions (groupName VARCHAR(767) NOT NULL, permission VARCHAR(767) NOT NULL)");
109111
groupPermissionsStatement.execute();
110112
groupPermissionsStatement.close();
111113

112-
PreparedStatement groupsStatement = connection.get().prepareStatement("CREATE TABLE IF NOT EXISTS " + database + "groups (name VARCHAR(100) NOT NULL UNIQUE, prefix VARCHAR(100) NOT NULL, suffix VARCHAR(100) NOT NULL, chatcolor VARCHAR(4) NOT NULL, defaultGroup TINYINT NOT NULL)");
114+
PreparedStatement groupsStatement = connection.get().prepareStatement("CREATE TABLE IF NOT EXISTS " + database +
115+
"groups (name VARCHAR(100) NOT NULL UNIQUE, prefix VARCHAR(100) NOT NULL, suffix VARCHAR(100) NOT NULL, chatcolor VARCHAR(4) NOT NULL, defaultGroup TINYINT NOT NULL, ladder VARCHAR(767))");
113116
groupsStatement.execute();
114117
groupsStatement.close();
115118

@@ -121,6 +124,14 @@ public void initialize() {
121124
superAdminStatement.execute();
122125
superAdminStatement.close();
123126

127+
PreparedStatement ladderStatement = connection.get().prepareStatement("CREATE TABLE IF NOT EXISTS " + database + "ladders (name VARCHAR(767))");
128+
ladderStatement.execute();
129+
ladderStatement.close();
130+
131+
PreparedStatement ladderLevelStatement = connection.get().prepareStatement("CREATE TABLE IF NOT EXISTS " + database + "ladderLevels (ladder VARCHAR(767), name VARCHAR(767), power INTEGER)");
132+
ladderLevelStatement.execute();
133+
ladderLevelStatement.close();
134+
124135
if (!hasFormattingTable(connection.get(), database)) {
125136
PreparedStatement formattingStatement = connection.get().prepareStatement("CREATE TABLE IF NOT EXISTS " + database + "formatting (`format` VARCHAR(400) NOT NULL, formatter VARCHAR(200) NOT NULL)");
126137
formattingStatement.execute();
@@ -163,59 +174,131 @@ public void reload(List<UUID> onlinePlayers) {
163174
cachedGroups = new HashMap<>();
164175
cachedPermissions = new HashMap<>();
165176
superAdmins = new ArrayList<>();
177+
cachedLadders = new HashMap<>();
166178

167179
chatFormat = getChatFormat(true);
168180
whisperFormat = getWhisperFormat(true);
169181

182+
loadSuperAdmins();
183+
loadLadders();
184+
loadGroups();
185+
186+
onlinePlayers.forEach(this::getPermissions);
187+
}
188+
189+
@Override
190+
protected void loadGroups() {
170191
Optional<Connection> connection = getConnection();
171-
if (connection.isPresent()) {
172-
try {
173-
// Load all super admins
174-
PreparedStatement adminStatement = connection.get().prepareStatement("SELECT uuid FROM superAdmin");
175-
ResultSet adminResults = adminStatement.executeQuery();
176-
while (adminResults.next()) {
177-
superAdmins.add(UUID.fromString(adminResults.getString("uuid")));
192+
if (!connection.isPresent()) {
193+
PermissifyAPI.get().ifPresent(api -> api.getDisplayUtil().displayError(ConnectionError.REJECTED, Optional.empty()));
194+
return;
195+
}
196+
197+
try {
198+
PreparedStatement groupStatement = connection.get().prepareStatement("SELECT * from groups");
199+
ResultSet groupResults = groupStatement.executeQuery();
200+
while (groupResults.next()) {
201+
String groupName = groupResults.getString("name");
202+
PermissionGroup group = new PermissionGroup(groupName,
203+
groupResults.getString("chatcolor"),
204+
groupResults.getString("prefix"),
205+
groupResults.getString("suffix"), getGroupLadder(groupName).orElse(new DefaultLadder()));
206+
String ladder = groupResults.getString("ladder");
207+
ladder = ladder == null || ladder.equals("") ? null : ladder;
208+
209+
PreparedStatement groupPermissionsStatement = connection.get().prepareStatement("SELECT * FROM groupPermissions WHERE groupName=?");
210+
groupPermissionsStatement.setString(1, group.getName());
211+
ResultSet groupPermissionsResult = groupPermissionsStatement.executeQuery();
212+
213+
while (groupPermissionsResult.next()) {
214+
group.addPermission(groupPermissionsResult.getString("permission"));
178215
}
179-
adminResults.close();
180-
adminStatement.close();
181-
182-
// Load all group names
183-
PreparedStatement groupStatement = connection.get().prepareStatement("SELECT * from groups");
184-
ResultSet groupResults = groupStatement.executeQuery();
185-
while (groupResults.next()) {
186-
String groupName = groupResults.getString("name");
187-
PermissionGroup group = new PermissionGroup(groupName,
188-
groupResults.getString("chatcolor"),
189-
groupResults.getString("prefix"),
190-
groupResults.getString("suffix"), getGroupLadder(groupName).orElse(new DefaultLadder()));
191-
PreparedStatement groupPermissionsStatement = connection.get().prepareStatement("SELECT * FROM groupPermissions WHERE groupName=?");
192-
groupPermissionsStatement.setString(1, group.getName());
193-
ResultSet groupPermissionsResult = groupPermissionsStatement.executeQuery();
194-
while (groupPermissionsResult.next()) {
195-
group.addPermission(groupPermissionsResult.getString("permission"));
196-
}
197-
groupPermissionsResult.close();
198-
groupPermissionsStatement.close();
199-
200-
PreparedStatement groupMembersStatement = connection.get().prepareStatement("SELECT uuid,`primary` FROM groupMembers WHERE `group`=?");
201-
groupMembersStatement.setString(1, group.getName());
202-
ResultSet groupMembersResults = groupMembersStatement.executeQuery();
203-
while (groupMembersResults.next()) {
204-
group.addPlayer(UUID.fromString(groupMembersResults.getString("uuid")), groupMembersResults.getBoolean("primary"));
205-
}
206-
groupMembersResults.close();
207-
groupMembersStatement.close();
208-
cachedGroups.put(groupName, group);
209-
if (groupResults.getBoolean("defaultGroup")) defaultGroup = Optional.of(group);
216+
groupPermissionsResult.close();
217+
groupPermissionsStatement.close();
218+
219+
PreparedStatement groupMembersStatement = connection.get().prepareStatement("SELECT uuid,`primary` FROM groupMembers WHERE `group`=?");
220+
groupMembersStatement.setString(1, group.getName());
221+
222+
ResultSet groupMembersResults = groupMembersStatement.executeQuery();
223+
while (groupMembersResults.next()) {
224+
group.addPlayer(UUID.fromString(groupMembersResults.getString("uuid")), groupMembersResults.getBoolean("primary"));
210225
}
211-
groupStatement.close();
212-
groupResults.close();
213-
connection.get().close();
214-
} catch (SQLException e) {
215-
PermissifyAPI.get().ifPresent(api -> api.getDisplayUtil().displayError(ConnectionError.REJECTED, Optional.of(e)));
226+
227+
if (ladder == null) {
228+
// Default ladder
229+
group.setLadder(new DefaultLadder());
230+
} else {
231+
// Get the built ladder
232+
group.setLadder(cachedLadders.getOrDefault(ladder, new DefaultLadder()));
233+
}
234+
235+
groupMembersResults.close();
236+
groupMembersStatement.close();
237+
cachedGroups.put(groupName, group);
238+
239+
if (groupResults.getBoolean("defaultGroup")) defaultGroup = Optional.of(group);
216240
}
217-
} else PermissifyAPI.get().ifPresent(api -> api.getDisplayUtil().displayError(ConnectionError.REJECTED, Optional.empty()));
218-
onlinePlayers.forEach(this::getPermissions);
241+
groupResults.close();
242+
groupStatement.close();
243+
} catch (SQLException e) {
244+
e.printStackTrace();
245+
}
246+
}
247+
248+
@Override
249+
protected void loadLadders() {
250+
Optional<Connection> connection = getConnection();
251+
if (!connection.isPresent()) {
252+
PermissifyAPI.get().ifPresent(api -> api.getDisplayUtil().displayError(ConnectionError.REJECTED, Optional.empty()));
253+
return;
254+
}
255+
256+
try {
257+
PreparedStatement ladderNameStatements = connection.get().prepareStatement("SELECT * FROM ladders");
258+
ResultSet ladderNameResults = ladderNameStatements.executeQuery();
259+
260+
while (ladderNameResults.next()) {
261+
String ladderName = ladderNameResults.getString("name");
262+
263+
List<LadderLevel> levels = new ArrayList<>();
264+
PreparedStatement ladderLevelsStatement = connection.get().prepareStatement("SELECT * FROM ladderLevels where ladder=?");
265+
ResultSet ladderLevelsResults = ladderLevelsStatement.executeQuery();
266+
267+
while (ladderLevelsResults.next()) {
268+
String levelName = ladderLevelsResults.getString("name");
269+
int levelPower = ladderLevelsResults.getInt("power");
270+
271+
levels.add(new LadderLevel(levelPower, Optional.of(levelName)));
272+
}
273+
274+
LadderBuilder ladderBuilder = new LadderBuilder(new HashMap<>(), levels);
275+
cachedLadders.put(ladderName, ladderBuilder);
276+
}
277+
} catch (SQLException e) {
278+
e.printStackTrace();
279+
}
280+
}
281+
282+
@Override
283+
protected void loadSuperAdmins() {
284+
Optional<Connection> connection = getConnection();
285+
if (!connection.isPresent()) {
286+
PermissifyAPI.get().ifPresent(api -> api.getDisplayUtil().displayError(ConnectionError.REJECTED, Optional.empty()));
287+
return;
288+
}
289+
try {
290+
// Load all super admins
291+
PreparedStatement adminStatement = connection.get().prepareStatement("SELECT uuid FROM superAdmin");
292+
ResultSet adminResults = adminStatement.executeQuery();
293+
while (adminResults.next()) {
294+
superAdmins.add(UUID.fromString(adminResults.getString("uuid")));
295+
}
296+
adminResults.close();
297+
adminStatement.close();
298+
connection.get().close();
299+
} catch (SQLException e) {
300+
PermissifyAPI.get().ifPresent(api -> api.getDisplayUtil().displayError(ConnectionError.REJECTED, Optional.of(e)));
301+
}
219302
}
220303

221304
@Override
@@ -678,6 +761,11 @@ public boolean isSuperAdmin(UUID uuid) {
678761
return superAdmins.contains(uuid);
679762
}
680763

764+
@Override
765+
public void removeSuperAdmin(UUID uuid) {
766+
767+
}
768+
681769
@Override
682770
public void setChatFormat(String format) {
683771
this.chatFormat = format;

API/src/main/java/me/innectic/permissify/api/group/ladder/AbstractLadder.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,21 +33,31 @@
3333
* @since 9/1/2017
3434
*/
3535
public abstract class AbstractLadder {
36-
@Getter protected Map<UUID, LadderLevel> players = new HashMap<>();
36+
@Getter protected Map<UUID, Integer> players = new HashMap<>();
3737
@Getter protected List<LadderLevel> levels = new ArrayList<>();
3838

3939
public final void reset() {
4040
drop();
4141
registerLadders();
4242
}
4343

44-
public final void drop() {
44+
private void drop() {
4545
players = new HashMap<>();
4646
levels = new ArrayList<>();
4747
}
4848

4949
public abstract void registerLadders();
5050

51+
public final void addPlayer(UUID uuid, int position) {
52+
players.put(uuid, position);
53+
// TODO: Apply extra permissions
54+
}
55+
56+
public final void removePlayer(UUID uuid) {
57+
if (players.containsKey(uuid)) players.remove(uuid);
58+
// TODO: Remove extra permissions
59+
}
60+
5161
@Override
5262
public String toString() {
5363
return "AbstractLadder [" +

API/src/main/java/me/innectic/permissify/api/group/ladder/LadderAdapter.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,22 +34,22 @@
3434
public class LadderAdapter implements JsonSerializer<AbstractLadder>, JsonDeserializer<AbstractLadder> {
3535

3636
@Override
37-
public JsonElement serialize(AbstractLadder src, Type typeOfSrc, JsonSerializationContext context) {
37+
public JsonElement serialize(AbstractLadder ladder, Type type, JsonSerializationContext context) {
3838
JsonObject result = new JsonObject();
39-
result.add("type", new JsonPrimitive(src.getClass().getSimpleName()));
40-
result.add("data", context.serialize(src, src.getClass()));
39+
result.add("type", new JsonPrimitive(ladder.getClass().getSimpleName()));
40+
result.add("data", context.serialize(ladder, ladder.getClass()));
4141
return result;
4242
}
4343

4444
@Override
45-
public AbstractLadder deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
45+
public AbstractLadder deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
4646
JsonObject jsonObject = json.getAsJsonObject();
47-
String type = jsonObject.get("type").getAsString();
47+
String typeName = jsonObject.get("type").getAsString();
4848
JsonElement element = jsonObject.get("data");
4949
try {
5050
return context.deserialize(element, Class.forName("me.innectic.permissify.api.group.ladder.impl." + type));
5151
} catch (ClassNotFoundException e) {
52-
throw new JsonParseException("Unknown element type: " + type, e);
52+
throw new JsonParseException("Unknown element: " + typeName, e);
5353
}
5454
}
5555
}

API/src/main/java/me/innectic/permissify/api/group/ladder/impl/DefaultLadder.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2222
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2323
* SOFTWARE.
24-
*/package me.innectic.permissify.api.group.ladder.impl;
24+
*/
25+
package me.innectic.permissify.api.group.ladder.impl;
2526

2627
import me.innectic.permissify.api.group.ladder.AbstractLadder;
2728
import me.innectic.permissify.api.group.ladder.LadderLevel;
@@ -38,9 +39,6 @@ public class DefaultLadder extends AbstractLadder {
3839

3940
@Override
4041
public void registerLadders() {
41-
// Default ladders will only have 2 levels: default, admin. I don't care about display differences.
42-
// TODO: Should I actually care about having names for the default ladders?
43-
4442
this.levels.add(new LadderLevel(0, Optional.empty()));
4543
this.levels.add(new LadderLevel(1, Optional.empty()));
4644
}

0 commit comments

Comments
 (0)