Skip to content

Commit 2b1ccd0

Browse files
committed
auto update plugin
1 parent 8f1fd3f commit 2b1ccd0

10 files changed

Lines changed: 118 additions & 28 deletions

File tree

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ val PLUGIN_NAME = "OriginBlacklist"
1111
val PLUGIN_IDEN = "originblacklist"
1212
val PLUGIN_DOMN = "xyz.webmc"
1313
val PLUGIN_DESC = "An eaglercraft client blacklist plugin."
14-
val PLUGIN_VERS = "2.0.2"
14+
val PLUGIN_VERS = "2.0.3"
1515
val PLUGIN_SITE = "https://github.com/WebMCDevelopment/$PLUGIN_IDEN"
1616
val PLUGIN_DEPA = listOf("EaglercraftXServer")
1717
val PLUGIN_DEPB = listOf("EaglercraftXServer")

src/main/java/xyz/webmc/originblacklist/base/OriginBlacklist.java

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,13 @@
1010
import xyz.webmc.originblacklist.base.util.OPlayer;
1111
import xyz.webmc.originblacklist.base.util.UpdateChecker;
1212

13+
import java.io.InputStream;
1314
import java.io.OutputStream;
1415
import java.net.HttpURLConnection;
1516
import java.net.URL;
17+
import java.nio.file.Files;
18+
import java.nio.file.Path;
19+
import java.nio.file.StandardCopyOption;
1620
import java.util.ArrayList;
1721
import java.util.Base64;
1822
import java.util.List;
@@ -40,12 +44,11 @@ public final class OriginBlacklist {
4044

4145
private final IOriginBlacklistPlugin plugin;
4246
private final OriginBlacklistConfig config;
43-
private boolean updateAvailable;
47+
private String updateURL;
4448

4549
public OriginBlacklist(final IOriginBlacklistPlugin plugin) {
4650
this.plugin = plugin;
4751
this.config = new OriginBlacklistConfig(plugin);
48-
this.checkForUpdate();
4952
plugin.scheduleRepeat(() -> {
5053
this.checkForUpdate();
5154
}, 60, TimeUnit.MINUTES);
@@ -282,13 +285,48 @@ private final void sendWebhooks(final OriginBlacklistLoginEvent event, final Enu
282285
}
283286

284287
private final void checkForUpdate() {
285-
CompletableFuture.runAsync(() -> {
286-
this.updateAvailable = UpdateChecker.checkForUpdate(PLUGIN_REPO, this.plugin.getPluginVersion(),
287-
this.config.get("update_checker.allow_snapshots").getAsBoolean());
288-
if (this.updateAvailable) {
289-
this.plugin.log(EnumLogLevel.INFO, "An update is available! Download it at https://github.com/" + PLUGIN_REPO + ".git");
290-
}
291-
});
288+
if (this.config.get("update_checker.enabled").getAsBoolean()) {
289+
CompletableFuture.runAsync(() -> {
290+
this.updateURL = UpdateChecker.checkForUpdate(PLUGIN_REPO, this.plugin.getPluginVersion(),
291+
this.config.get("update_checker.allow_snapshots").getAsBoolean());
292+
if (isNonNull((this.updateURL))) {
293+
if (!this.config.get("update_checker.auto_update").getAsBoolean()) {
294+
this.plugin.log(EnumLogLevel.INFO, "An update is available! Download it at " + this.updateURL);
295+
} else {
296+
final Path jar = this.plugin.getPluginJarPath();
297+
final Path bak = jar.resolveSibling(jar.getFileName().toString() + ".bak");
298+
final Path tmp = jar.resolveSibling(jar.getFileName().toString() + ".tmp");
299+
try {
300+
Files.copy(jar, bak, StandardCopyOption.REPLACE_EXISTING);
301+
} catch (final Throwable t) {
302+
t.printStackTrace();
303+
}
304+
try {
305+
final URL url = new URL(this.updateURL);
306+
final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
307+
conn.setRequestMethod("GET");
308+
conn.setConnectTimeout(15000);
309+
conn.setReadTimeout(15000);
310+
conn.connect();
311+
try (final InputStream in = conn.getInputStream()) {
312+
Files.copy(in, tmp, StandardCopyOption.REPLACE_EXISTING);
313+
} finally {
314+
conn.disconnect();
315+
}
316+
Files.move(tmp, jar, StandardCopyOption.REPLACE_EXISTING);
317+
Files.delete(bak);
318+
} catch (final Throwable t) {
319+
t.printStackTrace();
320+
try {
321+
Files.move(bak, jar, StandardCopyOption.REPLACE_EXISTING);
322+
} catch (final Throwable _t) {
323+
_t.printStackTrace();
324+
}
325+
}
326+
}
327+
}
328+
});
329+
}
292330
}
293331

294332
public static final String getComponentString(final Component comp) {
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package xyz.webmc.originblacklist.base.command;
22

33
public interface CommandContext {
4-
String getPlayerName();
5-
void reply(final String message);
6-
boolean hasPermission(final String permission);
7-
String[] getArgs();
4+
public String getPlayerName();
5+
public void reply(final String message);
6+
public boolean hasPermission(final String permission);
7+
public String[] getArgs();
88
}

src/main/java/xyz/webmc/originblacklist/base/command/ICommand.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import java.util.List;
44

55
public interface ICommand {
6-
static final String NO_PERMISSION = "<red>You don't have permission to use this command.</red>";
7-
boolean execute(final CommandContext ctx);
8-
List<String> suggest(final CommandContext ctx);
9-
void usage(final CommandContext ctx);
6+
public static final String NO_PERMISSION = "<red>You don't have permission to use this command.</red>";
7+
public boolean execute(final CommandContext ctx);
8+
public List<String> suggest(final CommandContext ctx);
9+
public void usage(final CommandContext ctx);
1010
}

src/main/java/xyz/webmc/originblacklist/base/config/OriginBlacklistConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ private static final Json5Object getDefaultConfig() {
221221
final Json5Object uobj = new Json5Object();
222222
addJSONObj(uobj, "enabled", Json5Primitive.fromBoolean(true), null);
223223
addJSONObj(uobj, "allow_snapshots", Json5Primitive.fromBoolean(false), null);
224-
addJSONObj(uobj, "auto_update", Json5Primitive.fromBoolean(false), null);
224+
addJSONObj(uobj, "auto_update", Json5Primitive.fromBoolean(true), null);
225225
addJSONObj(obj, "update_checker", uobj, null);
226226
addJSONObj(obj, "bStats", Json5Primitive.fromBoolean(true), null);
227227
return obj;

src/main/java/xyz/webmc/originblacklist/base/util/IOriginBlacklistPlugin.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import xyz.webmc.originblacklist.base.events.OriginBlacklistLoginEvent;
55
import xyz.webmc.originblacklist.base.events.OriginBlacklistMOTDEvent;
66

7+
import java.nio.file.Path;
78
import java.util.concurrent.TimeUnit;
89

910
import net.kyori.adventure.text.Component;
@@ -12,6 +13,7 @@
1213
public interface IOriginBlacklistPlugin {
1314
public String getPluginId();
1415
public Semver getPluginVersion();
16+
public Path getPluginJarPath();
1517
public void log(final EnumLogLevel level, final String txt);
1618
public void kickPlayer(final Component txt, final OriginBlacklistLoginEvent event);
1719
public void setMOTD(final Component txt, final OriginBlacklistMOTDEvent event);

src/main/java/xyz/webmc/originblacklist/base/util/UpdateChecker.java

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package xyz.webmc.originblacklist.base.util;
22

3+
import xyz.webmc.originblacklist.base.OriginBlacklist;
4+
35
import java.io.BufferedReader;
46
import java.io.InputStreamReader;
57
import java.net.HttpURLConnection;
@@ -15,15 +17,16 @@
1517
public class UpdateChecker {
1618
private static final Json5 json5 = Json5.builder(builder -> builder.build());
1719

18-
public static final boolean checkForUpdate(final String repo, final Semver currentVersion, final boolean allowPreRelease) {
20+
public static final String checkForUpdate(final String repo, final Semver currentVersion, final boolean allowPreRelease) {
1921
try {
20-
final URL url = new URL("https://api.github.com/repos/" + repo + "/releases");
21-
final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
22+
URL url = new URL("https://api.github.com/repos/" + repo + "/releases");
23+
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
2224
conn.setRequestMethod("GET");
2325
conn.setConnectTimeout(5000);
2426
conn.setReadTimeout(5000);
2527
conn.connect();
26-
final BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
28+
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
29+
String ret = null;
2730
Json5Element element = json5.parse(reader);
2831
if (element instanceof Json5Array) {
2932
final Json5Array arr = element.getAsJson5Array();
@@ -34,16 +37,38 @@ public static final boolean checkForUpdate(final String repo, final Semver curre
3437
final String tag = obj.get("tag_name").getAsString();
3538
final Semver ver = new Semver(tag.substring(1));
3639
if (ver.isGreaterThan(currentVersion) && (allowPreRelease || currentVersion.diff(ver) != VersionDiff.BUILD)) {
37-
return true;
40+
element = obj.get("assets");
41+
if (element instanceof Json5Array) {
42+
final Json5Array aArr = element.getAsJson5Array();
43+
element = aArr.get(0);
44+
if (element instanceof Json5Object) {
45+
final Json5Object vObj = element.getAsJson5Object();
46+
ret = vObj.get("url").getAsString();
47+
}
48+
}
3849
}
3950
}
4051
}
4152
}
4253
conn.disconnect();
43-
return false;
54+
if (OriginBlacklist.isNonNull(ret)) {
55+
url = new URL(ret);
56+
conn = (HttpURLConnection) url.openConnection();
57+
conn.setRequestMethod("GET");
58+
conn.setConnectTimeout(5000);
59+
conn.setReadTimeout(5000);
60+
conn.connect();
61+
reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
62+
element = json5.parse(reader);
63+
if (element instanceof Json5Object) {
64+
final Json5Object obj = element.getAsJson5Object();
65+
ret = obj.get("browser_download_url").getAsString();
66+
}
67+
}
68+
return ret;
4469
} catch (final Throwable t) {
4570
t.printStackTrace();
46-
return false;
71+
return null;
4772
}
4873
}
4974
}

src/main/java/xyz/webmc/originblacklist/bukkit/OriginBlacklistBukkit.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212

1313
import java.awt.image.BufferedImage;
1414
import java.io.ByteArrayInputStream;
15+
import java.nio.file.Path;
16+
import java.nio.file.Paths;
1517
import java.util.Base64;
1618
import java.util.HashMap;
1719
import java.util.Map;
@@ -127,6 +129,11 @@ public final Semver getPluginVersion() {
127129
return new Semver(this.getDescription().getVersion());
128130
}
129131

132+
@Override
133+
public final Path getPluginJarPath() {
134+
return Paths.get(this.getFile().getAbsolutePath());
135+
}
136+
130137
@Override
131138
public final void log(final EnumLogLevel level, final String txt) {
132139
if (level == EnumLogLevel.WARN) {
@@ -224,7 +231,7 @@ public final String parsePlaceholders(final OPlayer player, final String txt) {
224231
public final void scheduleRepeat(final Runnable task, final int period, final TimeUnit unit) {
225232
long ms = unit.toMillis((long) period);
226233
long ticks = Math.max(1L, ms / 50L);
227-
Bukkit.getScheduler().runTaskTimer(this, task, ticks, ticks);
234+
Bukkit.getScheduler().runTaskTimer(this, task, 0, ticks);
228235
}
229236

230237
@Override

src/main/java/xyz/webmc/originblacklist/bungee/OriginBlacklistBungee.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import xyz.webmc.originblacklist.base.util.OPlayer;
1111
import xyz.webmc.originblacklist.bungee.command.OriginBlacklistCommandBungee;
1212

13+
import java.nio.file.Path;
14+
import java.nio.file.Paths;
1315
import java.util.HashMap;
1416
import java.util.Map;
1517
import java.util.concurrent.TimeUnit;
@@ -129,6 +131,11 @@ public final Semver getPluginVersion() {
129131
return new Semver(this.getDescription().getVersion());
130132
}
131133

134+
@Override
135+
public final Path getPluginJarPath() {
136+
return Paths.get(this.getFile().getAbsolutePath());
137+
}
138+
132139
@Override
133140
public final void log(final EnumLogLevel level, final String txt) {
134141
if (level == EnumLogLevel.WARN) {
@@ -188,7 +195,7 @@ public final String parsePlaceholders(final OPlayer player, final String txt) {
188195

189196
@Override
190197
public final void scheduleRepeat(final Runnable task, final int period, final TimeUnit unit) {
191-
this.proxy.getScheduler().schedule(this, task, period, period, unit);
198+
this.proxy.getScheduler().schedule(this, task, 0, period, unit);
192199
}
193200

194201
@Override

src/main/java/xyz/webmc/originblacklist/velocity/OriginBlacklistVelocity.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import xyz.webmc.originblacklist.base.util.OPlayer;
1111
import xyz.webmc.originblacklist.velocity.command.OriginBlacklistCommandVelocity;
1212

13+
import java.nio.file.Path;
14+
import java.nio.file.Paths;
1315
import java.util.HashMap;
1416
import java.util.List;
1517
import java.util.Map;
@@ -147,6 +149,15 @@ public final Semver getPluginVersion() {
147149
return new Semver(this.plugin.getDescription().getVersion().get());
148150
}
149151

152+
@Override
153+
public final Path getPluginJarPath() {
154+
try {
155+
return Paths.get(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI()).toAbsolutePath();
156+
} catch (Throwable t) {
157+
throw new RuntimeException("Unable to determine plugin JAR path");
158+
}
159+
}
160+
150161
@Override
151162
public final void log(final EnumLogLevel level, final String txt) {
152163
if (level == EnumLogLevel.WARN) {

0 commit comments

Comments
 (0)