Skip to content

Commit e48d1f0

Browse files
committed
Fix (hopefully) the final bugs before 1.0.0!
1 parent 74c134c commit e48d1f0

File tree

19 files changed

+250
-86
lines changed

19 files changed

+250
-86
lines changed

API/src/main/java/me/ifydev/dimensify/api/DimensifyAPI.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import me.ifydev.dimensify.api.backend.AbstractDataHandler;
2929
import me.ifydev.dimensify.api.backend.BackendType;
3030
import me.ifydev.dimensify.api.backend.ConnectionInformation;
31+
import me.ifydev.dimensify.api.util.DisplayUtil;
3132

3233
import java.lang.reflect.InvocationTargetException;
3334
import java.util.Optional;
@@ -43,9 +44,11 @@ public class DimensifyAPI {
4344
private static Optional<DimensifyAPI> api;
4445

4546
@Getter private Optional<AbstractDataHandler> databaseHandler;
47+
@Getter private DisplayUtil displayUtil;
4648

47-
public void initialize(String defaultWorld, Class<? extends AbstractDataHandler> handler, BackendType backendType, Optional<ConnectionInformation> connectionInformation) throws Exception {
49+
public void initialize(String defaultWorld, DisplayUtil displayUtil, Class<? extends AbstractDataHandler> handler, BackendType backendType, Optional<ConnectionInformation> connectionInformation) throws Exception {
4850
api = Optional.of(this);
51+
this.displayUtil = displayUtil;
4952

5053
try {
5154
// If we don't have a database handler, then we default to the flat-file handler.

API/src/main/java/me/ifydev/dimensify/api/DimensifyConstants.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
*/
2525
package me.ifydev.dimensify.api;
2626

27+
import java.util.ArrayList;
2728
import java.util.Arrays;
2829
import java.util.List;
2930

@@ -35,6 +36,7 @@ public class DimensifyConstants {
3536
private static final String DIMENSIFY_PREFIX = "&a&lDimensify> ";
3637

3738
public static final String YOU_ARENT_A_PLAYER = DIMENSIFY_PREFIX + "You must be a player for this command!";
39+
public static final String YOU_DONT_HAVE_PERMISSION = DIMENSIFY_PREFIX + "&c&lYou don't have permission for this command!";
3840

3941
// Not enough arguments responses
4042
private static final String NOT_ENOUGH_ARGUMENTS_BASE = DIMENSIFY_PREFIX + "&c&lNot enough arguments: ";
@@ -82,6 +84,21 @@ public class DimensifyConstants {
8284
public static final String DEFAULT_WORLD_SET = DIMENSIFY_PREFIX + "&2&lDefault world set to: <WORLD>!";
8385
public static final String COULD_NOT_SET_DEFAULT_WORLD = DIMENSIFY_PREFIX + "&2&lCould not set default world.";
8486

87+
// Permissions
88+
public static final String DIMENSIFY_ADMIN = "dimensify.admin";
89+
public static final String DIMENSIFY_BASE = "dimensify.command.base";
90+
public static final String DIMENSIFY_ADD_PORTAL = "dimensify.portal.create";
91+
public static final String DIMENSIFY_REMOVE_PORTAL = "dimensify.portal.delete";
92+
public static final String DIMENSIFY_CREATE_DIMENSION = "dimensify.dimension.create";
93+
public static final String DIMENSIFY_REMOVE_DIMENSION = "dimensify.dimension.delete";
94+
public static final String DIMENSIFY_LIST_PORTALS = "dimensify.list.portals";
95+
public static final String DIMENSIFY_LIST_DIMENSIONS = "dimensify.list.dimensions";
96+
public static final String DIMENSIFY_LINK = "dimensify.portal.link";
97+
public static final String DIMENSIFY_DEFAULT = "dimensify.default";
98+
public static final String DIMENSIFY_GO = "dimensify.go";
99+
public static final String DIMENSIFY_SEND = "dimensify.send";
100+
public static final String DIMENSIFY_PORTAL = "dimensify.command.portal";
101+
85102
// Help response
86103
// TODO: This should automatically paginate.
87104
public static final String DIMENSIFY_HELP_HEADER = "&e================== &a&lDimensify Help &e==================";
@@ -98,4 +115,9 @@ public class DimensifyConstants {
98115
"&a&l/dimensify portal <list|link|create|remove> [args...]"
99116
)
100117
);
118+
119+
public static final List<String> DIMENSIFY_ERROR = new ArrayList<>(Arrays.asList(
120+
"&c&lError encountered: <ERROR_TYPE>",
121+
"&c&lShould this be reported?: <SHOULD_REPORT>"
122+
));
101123
}

API/src/main/java/me/ifydev/dimensify/api/backend/AbstractDataHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public abstract class AbstractDataHandler {
4949

5050
public abstract boolean createDimension(Dimension dimension);
5151
public abstract boolean removeDimension(String name);
52-
public abstract List<Dimension> getDimensions();
52+
public abstract List<Dimension> getDimensions(boolean skipCache);
5353

5454
public abstract Optional<Dimension> getDimension(String name);
5555
public abstract Optional<PortalMeta> getPortal(String name);

API/src/main/java/me/ifydev/dimensify/api/backend/ConnectionError.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
public enum ConnectionError {
1212

1313
REJECTED("Connection to the database server rejected."),
14-
DATABASE_EXPECTION("Exception in the database handler.");
14+
DATABASE_EXCEPTION("Exception in the database handler.");
1515

1616
@Getter private String display;
1717
}

API/src/main/java/me/ifydev/dimensify/api/backend/impl/SQLHandler.java

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package me.ifydev.dimensify.api.backend.impl;
22

3+
import me.ifydev.dimensify.api.DimensifyAPI;
34
import me.ifydev.dimensify.api.backend.AbstractDataHandler;
5+
import me.ifydev.dimensify.api.backend.ConnectionError;
46
import me.ifydev.dimensify.api.backend.ConnectionInformation;
57
import me.ifydev.dimensify.api.dimensions.Dimension;
68
import me.ifydev.dimensify.api.portal.PortalMeta;
@@ -44,8 +46,7 @@ private Optional<Connection> getConnection() {
4446
String connectionURL = baseConnectionUrl + "/" + connectionInformation.getDatabase();
4547
return Optional.ofNullable(DriverManager.getConnection(connectionURL, connectionInformation.getUsername(), connectionInformation.getPassword()));
4648
} catch (SQLException e) {
47-
// TODO
48-
// PermissifyAPI.get().ifPresent(api -> api.getDisplayUtil().displayError(ConnectionError.REJECTED, Optional.of(e)));
49+
DimensifyAPI.get().ifPresent(api -> api.getDisplayUtil().displayError(ConnectionError.REJECTED, Optional.of(e)));
4950
}
5051
return Optional.empty();
5152
}
@@ -55,30 +56,35 @@ public void initialize(String defaultWorld) {
5556
this.dimensions = new ArrayList<>();
5657

5758
try {
58-
Optional<Connection> connection = getConnection();
59-
if (!connection.isPresent()) return;
59+
Connection connection;
60+
if (isUsingSQLite) connection = DriverManager.getConnection(baseConnectionUrl);
61+
else connection = DriverManager.getConnection(baseConnectionUrl, connectionInformation.getUsername(), connectionInformation.getPassword());
62+
if (connection == null) {
63+
DimensifyAPI.get().ifPresent(api -> api.getDisplayUtil().displayError(ConnectionError.REJECTED, Optional.empty()));
64+
return;
65+
}
6066

6167
String database = connectionInformation.getDatabase();
6268

6369
if (!isUsingSQLite) {
64-
PreparedStatement statement = connection.get().prepareStatement("CREATE DATABASE IF NOT EXISTS " + database);
70+
PreparedStatement statement = connection.prepareStatement("CREATE DATABASE IF NOT EXISTS " + database);
6571
statement.execute();
6672
statement.close();
6773
database += ".";
6874
} else database = "";
6975

70-
PreparedStatement dimensionsStatement = connection.get().prepareStatement("CREATE TABLE IF NOT EXISTS " + database +
76+
PreparedStatement dimensionsStatement = connection.prepareStatement("CREATE TABLE IF NOT EXISTS " + database +
7177
"dimensions (`name` VARCHAR(50) NOT NULL, `type` VARCHAR(20) NOT NULL, meta VARCHAR(767), `default` TINYINT NOT NULL)");
7278
dimensionsStatement.execute();
7379
dimensionsStatement.close();
7480

75-
PreparedStatement portalsStatement = connection.get().prepareStatement("CREATE TABLE IF NOT EXISTS " + database +
81+
PreparedStatement portalsStatement = connection.prepareStatement("CREATE TABLE IF NOT EXISTS " + database +
7682
"portals (`world` VARCHAR(50) NOT NULL, x1 INTEGER NOT NULL, x2 INTEGER NOT NULL, y1 INTEGER NOT NULL, y2 INTEGER NOT NULL" +
7783
", z1 INTEGER NOT NULL, z2 INTEGER NOT NULL, destination VARCHAR(60), `type` VARCHAR(60) NOT NULL, `name` VARCHAR(60) NOT NULL)");
7884
portalsStatement.execute();
7985
portalsStatement.close();
8086

81-
connection.get().close();
87+
connection.close();
8288
} catch (SQLException e) {
8389
e.printStackTrace();
8490
}
@@ -106,7 +112,7 @@ public void reload() {
106112
this.drop();
107113

108114
this.portals = this.getPortals();
109-
this.dimensions = this.getDimensions();
115+
this.dimensions = this.getDimensions(true);
110116
}
111117

112118
@Override
@@ -118,7 +124,11 @@ public void drop() {
118124
@Override
119125
public boolean createPortal(PortalMeta meta) {
120126
Optional<Connection> connection = getConnection();
121-
if (!connection.isPresent()) return false;
127+
if (!connection.isPresent()) {
128+
DimensifyAPI.get().ifPresent(api -> api.getDisplayUtil().displayError(ConnectionError.REJECTED, Optional.empty()));
129+
return false;
130+
}
131+
this.portals.add(meta);
122132

123133
try {
124134
PreparedStatement statement = connection.get().prepareStatement("INSERT INTO portals " +
@@ -150,7 +160,10 @@ public boolean createPortal(PortalMeta meta) {
150160
@Override
151161
public boolean removePortal(String name) {
152162
Optional<Connection> connection = getConnection();
153-
if (!connection.isPresent()) return false;
163+
if (!connection.isPresent()) {
164+
DimensifyAPI.get().ifPresent(api -> api.getDisplayUtil().displayError(ConnectionError.REJECTED, Optional.empty()));
165+
return false;
166+
}
154167

155168
try {
156169
PreparedStatement statement = connection.get().prepareStatement("DELETE FROM portals WHERE `name`=?");
@@ -193,7 +206,10 @@ public List<PortalMeta> getPortals() {
193206
@Override
194207
public boolean setPortalDestination(String portal, String destination) {
195208
Optional<Connection> connection = getConnection();
196-
if (!connection.isPresent()) return false;
209+
if (!connection.isPresent()) {
210+
DimensifyAPI.get().ifPresent(api -> api.getDisplayUtil().displayError(ConnectionError.REJECTED, Optional.empty()));
211+
return false;
212+
}
197213

198214
this.destinations.put(portal, destination);
199215

@@ -213,7 +229,9 @@ public boolean setPortalDestination(String portal, String destination) {
213229
}
214230

215231
@Override
216-
public List<Dimension> getDimensions() {
232+
public List<Dimension> getDimensions(boolean skipCache) {
233+
if (!skipCache) return this.dimensions;
234+
217235
Optional<Connection> connection = getConnection();
218236
if (!connection.isPresent()) return Collections.emptyList();
219237

@@ -255,7 +273,10 @@ public boolean setDefaultDimension(String name) {
255273
this.defaultWorld = dimension.get().getName();
256274

257275
Optional<Connection> connection = getConnection();
258-
if (!connection.isPresent()) return false;
276+
if (!connection.isPresent()) {
277+
DimensifyAPI.get().ifPresent(api -> api.getDisplayUtil().displayError(ConnectionError.REJECTED, Optional.empty()));
278+
return false;
279+
}
259280
try {
260281
PreparedStatement removeCurrent = connection.get().prepareStatement("UPDATE dimensions SET `default`=0 WHERE `default`=1");
261282
removeCurrent.execute();
@@ -275,14 +296,17 @@ public boolean setDefaultDimension(String name) {
275296
@Override
276297
public String getDefaultDimension(boolean skipCache) {
277298
if (skipCache)
278-
for (Dimension dimension : this.getDimensions()) if (dimension.isDefault()) return dimension.getName();
299+
for (Dimension dimension : this.getDimensions(false)) if (dimension.isDefault()) return dimension.getName();
279300
return defaultWorld;
280301
}
281302

282303
@Override
283304
public boolean createDimension(Dimension dimension) {
284305
Optional<Connection> connection = getConnection();
285-
if (!connection.isPresent()) return false;
306+
if (!connection.isPresent()) {
307+
DimensifyAPI.get().ifPresent(api -> api.getDisplayUtil().displayError(ConnectionError.REJECTED, Optional.empty()));
308+
return false;
309+
}
286310

287311
if (dimensions.stream().anyMatch(d -> d.getName().equalsIgnoreCase(dimension.getName()))) return false;
288312
this.dimensions.add(dimension);
@@ -309,7 +333,10 @@ public boolean createDimension(Dimension dimension) {
309333
@Override
310334
public boolean removeDimension(String name) {
311335
Optional<Connection> connection = getConnection();
312-
if (!connection.isPresent()) return false;
336+
if (!connection.isPresent()) {
337+
DimensifyAPI.get().ifPresent(api -> api.getDisplayUtil().displayError(ConnectionError.REJECTED, Optional.empty()));
338+
return false;
339+
}
313340

314341
Optional<Dimension> dimension = this.dimensions.stream().filter(d -> d.getName().equalsIgnoreCase(name)).findFirst();
315342
if (!dimension.isPresent()) return false;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package me.ifydev.dimensify.api.util;
2+
3+
import me.ifydev.dimensify.api.backend.ConnectionError;
4+
5+
import java.util.Optional;
6+
7+
/**
8+
* @author Innectic
9+
* @since 06/30/2018
10+
*/
11+
public interface DisplayUtil {
12+
/**
13+
* Display an error to online players with the `permissify.admin` permission.
14+
*
15+
* @param error type type of error thrown.
16+
* @param exception the exception thrown
17+
*/
18+
void displayError(ConnectionError error, Optional<Exception> exception);
19+
}

DimensifySpigot/src/main/java/me/ifydev/dimensifyspigot/DimensifyMain.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import me.ifydev.dimensifyspigot.events.PlayerJoin;
3333
import me.ifydev.dimensifyspigot.events.PlayerPortal;
3434
import me.ifydev.dimensifyspigot.portal.PortalRegistry;
35+
import me.ifydev.dimensifyspigot.util.DisplayUtil;
3536
import me.ifydev.dimensifyspigot.util.Verifier;
3637
import me.ifydev.dimensifyspigot.world.DimensifyWorld;
3738
import me.ifydev.dimensifyspigot.world.WorldController;
@@ -74,7 +75,7 @@ public void onEnable() {
7475
getLogger().info("Initializing Dimensify API...");
7576
api = new DimensifyAPI();
7677
try {
77-
api.initialize(Bukkit.getWorlds().get(0).getName(), SpigotFlatFileHandler.class, backendType.get(), Verifier.verifyConnectionInformation(backendType.get()));
78+
api.initialize(Bukkit.getWorlds().get(0).getName(), new DisplayUtil(), SpigotFlatFileHandler.class, backendType.get(), Verifier.verifyConnectionInformation(backendType.get()));
7879
} catch (Exception e) {
7980
getLogger().severe("Could not initialize Dimensify API!");
8081
e.printStackTrace();

DimensifySpigot/src/main/java/me/ifydev/dimensifyspigot/backend/SpigotFlatFileHandler.java

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import java.io.File;
1616
import java.io.IOException;
1717
import java.util.ArrayList;
18-
import java.util.Collections;
1918
import java.util.List;
2019
import java.util.Optional;
2120

@@ -48,12 +47,8 @@ public void initialize(String defaultWorld) {
4847
DimensifyMain plugin = DimensifyMain.get();
4948
File data = plugin.getDataFolder();
5049

51-
this.defaultWorld = defaultWorld;
52-
String defaultDimension = this.getDefaultDimension(true);
53-
if (!defaultDimension.equals("")) this.defaultWorld = defaultDimension;
54-
5550
// Ensure the files exist
56-
storageFile = new File(data, plugin.getConfig().getString("connection.file", "storage.yml"));
51+
storageFile = new File(data, "storage.yml");
5752
if (!storageFile.exists()) {
5853
storageFile.getParentFile().mkdirs();
5954
plugin.saveResource("storage.yml", false);
@@ -66,6 +61,10 @@ public void initialize(String defaultWorld) {
6661
plugin.getLogger().severe("Could not create storage.yml");
6762
e.printStackTrace();
6863
}
64+
65+
this.defaultWorld = defaultWorld;
66+
String defaultDimension = this.getDefaultDimension(true);
67+
if (!defaultDimension.equals("")) this.defaultWorld = defaultDimension;
6968
}
7069

7170
@Override
@@ -78,7 +77,7 @@ public void reload() {
7877
this.drop();
7978

8079
this.portals = this.getPortals();
81-
this.dimensions = this.getDimensions();
80+
this.dimensions = this.getDimensions(true);
8281
}
8382

8483
@Override
@@ -94,13 +93,13 @@ public boolean createPortal(PortalMeta meta) {
9493
if (portal.isPresent()) return false;
9594
this.portals.add(meta);
9695

97-
storage.set("portal." + meta.getName() + "x1", meta.getX1());
98-
storage.set("portal." + meta.getName() + "y1", meta.getY1());
99-
storage.set("portal." + meta.getName() + "z1", meta.getZ1());
96+
storage.set("portal." + meta.getName() + ".x1", meta.getX1());
97+
storage.set("portal." + meta.getName() + ".y1", meta.getY1());
98+
storage.set("portal." + meta.getName() + ".z1", meta.getZ1());
10099

101-
storage.set("portal." + meta.getName() + "x1", meta.getX2());
102-
storage.set("portal." + meta.getName() + "y1", meta.getY2());
103-
storage.set("portal." + meta.getName() + "z1", meta.getZ2());
100+
storage.set("portal." + meta.getName() + ".x2", meta.getX2());
101+
storage.set("portal." + meta.getName() + ".y2", meta.getY2());
102+
storage.set("portal." + meta.getName() + ".z2", meta.getZ2());
104103

105104
storage.set("portal." + meta.getName() + ".world", meta.getWorld());
106105
storage.set("portal." + meta.getName() + ".type", meta.getType().name());
@@ -135,9 +134,9 @@ public boolean removePortal(String name) {
135134
@Override
136135
public List<PortalMeta> getPortals() {
137136
ConfigurationSection portalSection = storage.getConfigurationSection("portal");
138-
if (portalSection == null) return Collections.emptyList();
139-
140137
List<PortalMeta> portals = new ArrayList<>();
138+
if (portalSection == null) return portals;
139+
141140
portalSection.getKeys(false).forEach(key -> {
142141
String base = key + ".";
143142
if (!portalSection.isInt(base + "x1") || !portalSection.isInt(base + "y1") || !portalSection.isInt(base + "z1") ||
@@ -210,10 +209,14 @@ public boolean removeDimension(String name) {
210209
}
211210

212211
@Override
213-
public List<Dimension> getDimensions() {
214-
ConfigurationSection dimensions = storage.getConfigurationSection("dimensions");
212+
public List<Dimension> getDimensions(boolean skipCache) {
213+
if (!skipCache) return this.dimensions;
215214

215+
ConfigurationSection dimensions = storage.getConfigurationSection("dimensions");
216216
List<Dimension> loadedDimensions = new ArrayList<>();
217+
218+
if (dimensions == null) return loadedDimensions;
219+
217220
dimensions.getKeys(false).forEach(dimension -> {
218221
if (!dimensions.isString(dimension + ".name") || !dimensions.isString(dimension + "type") ||
219222
!dimensions.isString(dimension + "meta") || !dimensions.isBoolean(dimension + "default")) {
@@ -222,7 +225,8 @@ public List<Dimension> getDimensions() {
222225
}
223226
String name = dimensions.getString(dimension + ".name");
224227
String type = dimensions.getString(dimension + ".type");
225-
String meta = dimensions.getString(dimension + ".meta", null);
228+
String meta = dimensions.getString(dimension + ".meta", "");
229+
meta = meta.trim().equals("") ? null : meta;
226230
boolean isDefault = dimensions.getBoolean(dimension + ".default");
227231

228232
loadedDimensions.add(new Dimension(name, type, Optional.ofNullable(meta), isDefault));
@@ -257,7 +261,7 @@ public boolean setDefaultDimension(String name) {
257261
@Override
258262
public String getDefaultDimension(boolean skipCache) {
259263
if (skipCache)
260-
for (Dimension dimension : this.getDimensions()) if (dimension.isDefault()) return dimension.getName();
264+
for (Dimension dimension : this.getDimensions(false)) if (dimension.isDefault()) return dimension.getName();
261265
return defaultWorld;
262266
}
263267
}

0 commit comments

Comments
 (0)