Config hotloading

This commit is contained in:
Daniel Mills 2020-11-17 01:32:34 -05:00
parent 6d08faa30f
commit 802bc50102
2 changed files with 68 additions and 31 deletions

View File

@ -1,6 +1,5 @@
package com.volmit.iris; package com.volmit.iris;
import com.volmit.iris.nms.INMS;
import com.volmit.iris.manager.*; import com.volmit.iris.manager.*;
import com.volmit.iris.manager.command.CommandIris; import com.volmit.iris.manager.command.CommandIris;
import com.volmit.iris.manager.command.PermissionIris; import com.volmit.iris.manager.command.PermissionIris;
@ -8,6 +7,7 @@ import com.volmit.iris.manager.link.BKLink;
import com.volmit.iris.manager.link.CitizensLink; import com.volmit.iris.manager.link.CitizensLink;
import com.volmit.iris.manager.link.MultiverseCoreLink; import com.volmit.iris.manager.link.MultiverseCoreLink;
import com.volmit.iris.manager.link.MythicMobsLink; import com.volmit.iris.manager.link.MythicMobsLink;
import com.volmit.iris.nms.INMS;
import com.volmit.iris.object.IrisCompat; import com.volmit.iris.object.IrisCompat;
import com.volmit.iris.scaffold.IrisWorldCreator; import com.volmit.iris.scaffold.IrisWorldCreator;
import com.volmit.iris.scaffold.IrisWorlds; import com.volmit.iris.scaffold.IrisWorlds;
@ -47,6 +47,7 @@ public class Iris extends VolmitPlugin
public static boolean biome3d = doesSupport3DBiomes(); public static boolean biome3d = doesSupport3DBiomes();
public static boolean lowMemoryMode = false; public static boolean lowMemoryMode = false;
public static IrisCompat compat; public static IrisCompat compat;
public static FileWatcher configWatcher;
@Permission @Permission
public static PermissionIris perm; public static PermissionIris perm;
@ -158,14 +159,26 @@ public class Iris extends VolmitPlugin
linkBK = new BKLink(); linkBK = new BKLink();
linkMythicMobs = new MythicMobsLink(); linkMythicMobs = new MythicMobsLink();
edit = new EditManager(); edit = new EditManager();
configWatcher = new FileWatcher(getDataFile("settings.json"));
J.a(() -> IO.delete(getTemp())); J.a(() -> IO.delete(getTemp()));
J.a(this::bstats); J.a(this::bstats);
J.s(this::splash, 20); J.s(this::splash, 20);
J.sr(this::tickQueue, 0); J.sr(this::tickQueue, 0);
J.ar(this::checkConfigHotload, 50);
PaperLib.suggestPaper(this); PaperLib.suggestPaper(this);
super.onEnable(); super.onEnable();
} }
private void checkConfigHotload() {
if(configWatcher.checkModified())
{
IrisSettings.invalidate();
IrisSettings.get();
configWatcher.checkModified();
Iris.info("Hotloaded settings.json");
}
}
public void onDisable() public void onDisable()
{ {
if(IrisSettings.get().isStudio()) if(IrisSettings.get().isStudio())

View File

@ -108,6 +108,8 @@ public class IrisSettings
settings = new Gson().fromJson(ss, IrisSettings.class); settings = new Gson().fromJson(ss, IrisSettings.class);
J.a(() -> J.a(() ->
{
try
{ {
JSONObject j = new JSONObject(ss); JSONObject j = new JSONObject(ss);
boolean u = false; boolean u = false;
@ -121,7 +123,7 @@ public class IrisSettings
} }
} }
for(String i : j.keySet()) for(String i : new KSet<>(j.keySet()))
{ {
if(!def.has(i)) if(!def.has(i))
{ {
@ -139,19 +141,41 @@ public class IrisSettings
Iris.info("Updated Configuration Files"); Iris.info("Updated Configuration Files");
} }
catch(Throwable ignored) catch(Throwable e)
{ {
e.printStackTrace();
}
}
}
catch(Throwable ee)
{
Iris.error("Configuration Error in settings.json! " + ee.getClass().getSimpleName() + ": " + ee.getMessage());
Iris.warn("Attempting to fix configuration while retaining valid in-memory settings...");
try {
IO.writeAll(s, new JSONObject(new Gson().toJson(settings)).toString(4));
Iris.info("Configuration Fixed!");
} catch (IOException e) {
e.printStackTrace();
Iris.error("ERROR! CONFIGURATION IMPOSSIBLE TO READ! Using an unmodifiable configuration from memory. Please delete the settings.json at some point to try to restore configurability!");
} }
} }
}); });
} }
catch(JSONException | IOException e) catch(Throwable ee)
{ {
Iris.error("Configuration Error in settings.json! " + ee.getClass().getSimpleName() + ": " + ee.getMessage());
Iris.warn("Attempting to fix configuration while retaining valid in-memory settings...");
try {
IO.writeAll(s, new JSONObject(new Gson().toJson(settings)).toString(4));
Iris.info("Configuration Fixed!");
} catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
// noinspection ResultOfMethodCallIgnored Iris.error("ERROR! CONFIGURATION IMPOSSIBLE TO READ! Using an unmodifiable configuration from memory. Please delete the settings.json at some point to try to restore configurability!");
s.delete(); }
} }
} }