Skip to content

Commit ac3b047

Browse files
committed
Fix uncached group assignment
1 parent ff30b4d commit ac3b047

File tree

8 files changed

+115
-53
lines changed

8 files changed

+115
-53
lines changed

API/src/main/java/me/innectic/permissify/api/PermissifyAPI.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import me.innectic.permissify.api.util.DisplayUtil;
3232

3333
import java.lang.reflect.InvocationTargetException;
34+
import java.util.ArrayList;
3435
import java.util.Optional;
3536

3637
/**
@@ -60,6 +61,7 @@ public void initialize(HandlerType type, Optional<ConnectionInformation> connect
6061
boolean connected = databaseHandler.get().connect();
6162
if (connected) System.out.println("Connected to the database.");
6263
else System.out.println("Unable to connect to the database.");
64+
databaseHandler.ifPresent(handler -> handler.clear(new ArrayList<>()));
6365
}
6466

6567
public static Optional<PermissifyAPI> get() {

API/src/main/java/me/innectic/permissify/api/PermissifyConstants.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -126,13 +126,13 @@ public class PermissifyConstants {
126126
), Arrays.asList(
127127
"&a&l/permissify group listpermissions [group]",
128128
"&a&l/permissify group list",
129-
"&a&l/permissify player addpermission ",
130-
"&a&l/permissify player removepermission ",
131-
"&a&l/permissify player addgroup ",
132-
"&a&l/permissify player listpermissions",
133-
"&a&l/permissify player listgroups ",
134-
"&a&l/permissify player removegroup ",
135-
"&a&l/permissify player setmain "
129+
"&a&l/permissify player addpermission [permission] [player]",
130+
"&a&l/permissify player removepermission [permission] [player]",
131+
"&a&l/permissify player addgroup [player] [group]",
132+
"&a&l/permissify player listpermissions [player]",
133+
"&a&l/permissify player listgroups [player]",
134+
"&a&l/permissify player removegroup [player] [group]",
135+
"&a&l/permissify player setmain [player] [group]"
136136
)));
137137

138138
// Error response

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ public abstract class DatabaseHandler {
4040

4141
@Getter protected Map<UUID, Map<String, Boolean>> cachedPermissions = new HashMap<>();
4242
@Getter protected List<PermissionGroup> cachedGroups = new ArrayList<>();
43+
@Getter protected List<String> groupNames = new ArrayList<>(); // This is probably redundant, but it allows for not loading
44+
// all the groups, and not making tons of queries
4345
protected List<UUID> superAdmins = new ArrayList<>();
4446
protected final Optional<ConnectionInformation> connectionInformation;
4547
protected String chatFormat = "{group} {username}: {message}";
@@ -63,8 +65,10 @@ public DatabaseHandler(ConnectionInformation connectionInformation) {
6365

6466
/**
6567
* Clear the handler's cache and reload all needed values.
68+
*
69+
* @param onlinePlayers the current players online who will need permissions.
6670
*/
67-
public abstract void clear();
71+
public abstract void clear(List<UUID> onlinePlayers);
6872

6973
/**
7074
* Add a permission to a player
@@ -117,6 +121,14 @@ public DatabaseHandler(ConnectionInformation connectionInformation) {
117121
*/
118122
public abstract boolean deleteGroup(String name);
119123

124+
/**
125+
* Get the permission group from name.
126+
*
127+
* @param name the name of the group.
128+
* @return fulfilled if exists, empty otherwise
129+
*/
130+
public abstract Optional<PermissionGroup> getGroup(String name);
131+
120132
/**
121133
* Add a player to a permission group, and grant permissions.
122134
*

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

Lines changed: 60 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,39 @@ public boolean connect() {
8282
}
8383

8484
@Override
85-
public void clear() {
85+
public void clear(List<UUID> onlinePlayers) {
8686
cachedGroups = new ArrayList<>();
8787
cachedPermissions = new HashMap<>();
8888
superAdmins = new ArrayList<>();
8989

9090
chatFormat = getChatFormat(true);
9191
whisperFormat = getWhisperFormat(true);
92+
93+
Optional<Connection> connection = getConnection();
94+
if (connection.isPresent()) {
95+
try {
96+
// Load all super admins
97+
PreparedStatement adminStatement = connection.get().prepareStatement("SELECT uuid FROM superAdmin");
98+
ResultSet adminResults = adminStatement.executeQuery();
99+
while (adminResults.next()) {
100+
superAdmins.add(UUID.fromString(adminResults.getString("uuid")));
101+
}
102+
adminResults.close();
103+
adminStatement.close();
104+
105+
// Load all group names
106+
PreparedStatement groupStatement = connection.get().prepareStatement("SELECT name from groups");
107+
ResultSet groupResults = groupStatement.executeQuery();
108+
while (groupResults.next()) {
109+
groupNames.add(groupResults.getString("name"));
110+
}
111+
groupStatement.close();
112+
groupResults.close();
113+
connection.get().close();
114+
} catch (SQLException e) {
115+
PermissifyAPI.get().ifPresent(api -> api.getDisplayUtil().displayError(ConnectionError.REJECTED, Optional.of(e)));
116+
}
117+
} else PermissifyAPI.get().ifPresent(api -> api.getDisplayUtil().displayError(ConnectionError.REJECTED, Optional.empty()));
92118
}
93119

94120
@Override
@@ -224,6 +250,7 @@ public boolean createGroup(String name, String prefix, String suffix, String cha
224250
if (cachedGroups.stream().anyMatch(group -> group.getName().equalsIgnoreCase(name))) return false;
225251
// Add the new group to the cache
226252
cachedGroups.add(new PermissionGroup(name, chatColor, prefix, suffix));
253+
groupNames.add(name);
227254

228255
Optional<Connection> connection = getConnection();
229256
if (!connection.isPresent()) {
@@ -253,6 +280,7 @@ public boolean deleteGroup(String name) {
253280
if (getGroups().stream().noneMatch(group -> group.getName().equalsIgnoreCase(name))) return false;
254281
// Delete from the cache
255282
cachedGroups.removeIf(group -> group.getName().equalsIgnoreCase(name));
283+
groupNames.removeIf(entry -> entry.equalsIgnoreCase(name));
256284

257285
Optional<Connection> connection = getConnection();
258286
if (!connection.isPresent()) {
@@ -272,6 +300,36 @@ public boolean deleteGroup(String name) {
272300
return true;
273301
}
274302

303+
@Override
304+
public Optional<PermissionGroup> getGroup(String name) {
305+
if (!groupNames.contains(name)) return Optional.empty();
306+
Optional<PermissionGroup> cached = cachedGroups.stream().filter(group -> group.getName().equalsIgnoreCase(name)).findFirst();
307+
if (cached.isPresent()) return cached;
308+
// Not a cached group, and it's a real group. Must be pulled from DB.
309+
Optional<Connection> connection = getConnection();
310+
if (!connection.isPresent()) {
311+
PermissifyAPI.get().ifPresent(api -> api.getDisplayUtil().displayError(ConnectionError.REJECTED, Optional.empty()));
312+
return Optional.empty();
313+
}
314+
315+
try {
316+
PreparedStatement statement = connection.get().prepareStatement("SELECT * FROM groups WHERE name=?");
317+
statement.setString(1, name);
318+
ResultSet results = statement.executeQuery();
319+
if (results.next()) {
320+
PermissionGroup group = new PermissionGroup(results.getString("name"), results.getString("chatcolor"), results.getString("prefix"), results.getString("suffix"));
321+
cachedGroups.add(group);
322+
return Optional.of(group);
323+
}
324+
results.close();
325+
statement.close();
326+
connection.get().close();
327+
} catch (SQLException e) {
328+
PermissifyAPI.get().ifPresent(api -> api.getDisplayUtil().displayError(ConnectionError.REJECTED, Optional.of(e)));
329+
}
330+
return Optional.empty();
331+
}
332+
275333
@Override
276334
public boolean addPlayerToGroup(UUID uuid, PermissionGroup group) {
277335
if (group.hasPlayer(uuid)) return false;
@@ -498,29 +556,7 @@ public void addSuperAdmin(UUID uuid) {
498556

499557
@Override
500558
public boolean isSuperAdmin(UUID uuid) {
501-
if (superAdmins.contains(uuid)) return true;
502-
Optional<Connection> connection = getConnection();
503-
if (!connection.isPresent()) {
504-
PermissifyAPI.get().ifPresent(api -> api.getDisplayUtil().displayError(ConnectionError.REJECTED, Optional.empty()));
505-
return false;
506-
}
507-
508-
try {
509-
PreparedStatement statement = connection.get().prepareStatement("SELECT uuid FROM superAdmin");
510-
ResultSet results = statement.executeQuery();
511-
while (results.next()) {
512-
if (results.getString("uuid").equals(uuid.toString())) {
513-
superAdmins.add(UUID.fromString(results.getString("uuid")));
514-
return true;
515-
}
516-
}
517-
results.close();
518-
statement.close();
519-
connection.get().close();
520-
} catch (SQLException e) {
521-
PermissifyAPI.get().ifPresent(api -> api.getDisplayUtil().displayError(ConnectionError.REJECTED, Optional.of(e)));
522-
}
523-
return false;
559+
return superAdmins.contains(uuid);
524560
}
525561

526562
@Override

Spigot/src/main/java/me/innectic/permissify/spigot/commands/PermissifyCommand.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import me.innectic.permissify.api.util.ArgumentUtil;
2929
import me.innectic.permissify.spigot.PermissifyMain;
3030
import me.innectic.permissify.spigot.utils.ColorUtil;
31+
import me.innectic.permissify.spigot.utils.PermissionUtil;
3132
import org.bukkit.Bukkit;
3233
import org.bukkit.command.Command;
3334
import org.bukkit.command.CommandExecutor;
@@ -61,10 +62,10 @@ public boolean onCommand(CommandSender sender, Command command, String s, String
6162
plugin.getPermissifyAPI().getDatabaseHandler().get().addSuperAdmin(player.getUniqueId());
6263
} else if (sender instanceof Player) {
6364
Player player = (Player) sender;
64-
if (!player.hasPermission(PermissifyConstants.PERMISSIFY_BASIC) && !plugin.getPermissifyAPI().getDatabaseHandler().get().isSuperAdmin(((Player) sender).getUniqueId())) {
65+
if (!PermissionUtil.hasPermissionOrSuperAdmin(player, PermissifyConstants.PERMISSIFY_BASIC)) {
6566
player.sendMessage(ColorUtil.makeReadable(PermissifyConstants.INSUFFICIENT_PERMISSIONS));
6667
}
67-
if (args[0].equalsIgnoreCase("help")) {
68+
if (args.length >= 1 && args[0].equalsIgnoreCase("help")) {
6869
int page = 0;
6970
if (args.length >= 2) {
7071
try {
@@ -75,6 +76,10 @@ public boolean onCommand(CommandSender sender, Command command, String s, String
7576
if (page < 0) page = 0;
7677
sendHelp(player, page);
7778
return;
79+
} else if (args.length >= 1 && args[0].equalsIgnoreCase("cache")) {
80+
CommandResponse response = plugin.getCacheCommand().handleCache(sender, ArgumentUtil.getRemainingArgs(1, args));
81+
sendResponse(response, player);
82+
return;
7883
}
7984
if (args.length < 2) {
8085
sendHelp(player);
@@ -125,9 +130,6 @@ else if (args[1].equalsIgnoreCase("listgroups"))
125130
} else if (args[0].equalsIgnoreCase("format")) {
126131
CommandResponse response = plugin.getFormatCommand().handleSetFormat(sender, ArgumentUtil.getRemainingArgs(1, args));
127132
sender.sendMessage(ColorUtil.makeReadable(response.getResponse()));
128-
} else if (args[0].equalsIgnoreCase("cache")) {
129-
CommandResponse response = plugin.getCacheCommand().handleCache(sender, ArgumentUtil.getRemainingArgs(1, args));
130-
sendResponse(response, player);
131133
}
132134
}
133135
});
@@ -146,11 +148,11 @@ private void sendResponse(String response, CommandSender source) {
146148
source.sendMessage(ColorUtil.makeReadable(response)); // XXX: Probably don't need ColorUtil anymore...
147149
}
148150

149-
private void sendHelp(Player player) {
151+
private void sendHelp(CommandSender player) {
150152
sendHelp(player, 0);
151153
}
152154

153-
private void sendHelp(Player player, int page) {
155+
private void sendHelp(CommandSender player, int page) {
154156
sendResponse(PermissifyConstants.PERMISSIFY_HELP_HEADER, player);
155157
sendResponse(PermissifyConstants.PERMISSIFY_HELP_PAGES.get(page), player);
156158
sendResponse(PermissifyConstants.PERMISSIFY_HELP_FOOTER, player);

Spigot/src/main/java/me/innectic/permissify/spigot/commands/permissify/CacheCommand.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66
import me.innectic.permissify.spigot.PermissifyMain;
77
import me.innectic.permissify.spigot.commands.CommandResponse;
88
import me.innectic.permissify.spigot.utils.PermissionUtil;
9+
import org.bukkit.Bukkit;
910
import org.bukkit.command.Command;
1011
import org.bukkit.command.CommandSender;
1112
import org.bukkit.entity.Player;
1213

14+
import java.util.stream.Collectors;
15+
1316
/**
1417
* @author Innectic
1518
* @since 7/2/2017
@@ -19,7 +22,7 @@ public class CacheCommand {
1922
public CommandResponse handleCache(CommandSender sender, String[] args) {
2023
if (!PermissionUtil.hasPermissionOrSuperAdmin((Player) sender, PermissifyConstants.PERMISSIFY_CACHE))
2124
return new CommandResponse(PermissifyConstants.INSUFFICIENT_PERMISSIONS, false);
22-
if (args[0].equalsIgnoreCase("purge")) return handleCachePurge(sender, ArgumentUtil.getRemainingArgs(1, args));
25+
if (args.length >= 1 && args[0].equalsIgnoreCase("purge")) return handleCachePurge(sender, ArgumentUtil.getRemainingArgs(1, args));
2326
if (!PermissifyMain.getInstance().getPermissifyAPI().getDatabaseHandler().isPresent())
2427
return new CommandResponse(PermissifyConstants.UNABLE_OTHER.replace("<REASON>", "No database handler"), false);
2528
// Show information about the current cache
@@ -32,7 +35,7 @@ public CommandResponse handleCache(CommandSender sender, String[] args) {
3235
private CommandResponse handleCachePurge(CommandSender sender, String[] args) {
3336
if (!PermissifyMain.getInstance().getPermissifyAPI().getDatabaseHandler().isPresent())
3437
return new CommandResponse(PermissifyConstants.UNABLE_OTHER.replace("<REASON>", "No database handler"), false);
35-
PermissifyMain.getInstance().getPermissifyAPI().getDatabaseHandler().get().clear();
38+
PermissifyMain.getInstance().getPermissifyAPI().getDatabaseHandler().get().clear(Bukkit.getOnlinePlayers().stream().map(Player::getUniqueId).collect(Collectors.toList()));
3639
return new CommandResponse(PermissifyConstants.CACHE_PURGED, true);
3740
}
3841
}

0 commit comments

Comments
 (0)