1+ package net .potato .tuff ;
2+
3+ import com .google .gson .JsonObject ;
4+ import com .google .gson .JsonParser ;
5+ import org .bukkit .Bukkit ;
6+ import org .bukkit .plugin .java .JavaPlugin ;
7+ import org .bukkit .scheduler .BukkitRunnable ;
8+
9+ import java .io .File ;
10+ import java .io .FileOutputStream ;
11+ import java .io .InputStream ;
12+ import java .io .InputStreamReader ;
13+ import java .net .HttpURLConnection ;
14+ import java .net .URL ;
15+ import java .nio .channels .Channels ;
16+ import java .nio .channels .ReadableByteChannel ;
17+
18+ public class Updater {
19+
20+ private final JavaPlugin plugin ;
21+ private final String currentVersion ;
22+
23+ public Updater (JavaPlugin plugin ) {
24+ this .plugin = plugin ;
25+ this .currentVersion = plugin .getDescription ().getVersion ();
26+ }
27+
28+ public void scheduleCheck () {
29+ if (!plugin .getConfig ().getBoolean ("updater.enabled" , true )) return ;
30+ long interval = plugin .getConfig ().getLong ("updater.check-interval-minutes" , 60 ) * 60 * 20 ;
31+ new BukkitRunnable () {
32+ @ Override
33+ public void run () {
34+ checkForUpdates ();
35+ }
36+ }.runTaskTimerAsynchronously (plugin , 0L , interval );
37+ }
38+
39+ private void checkForUpdates () {
40+ String localLatestVersion = currentVersion ;
41+
42+ String versionUrl = "https://verytuffautoupdater.netlify.app/version-remote.json" ;
43+
44+ try {
45+ URL url = new URL (versionUrl );
46+ HttpURLConnection connection = (HttpURLConnection ) url .openConnection ();
47+ connection .setConnectTimeout (5000 );
48+
49+ if (connection .getResponseCode () == 200 ) {
50+ InputStreamReader reader = new InputStreamReader (connection .getInputStream ());
51+ JsonObject versionInfo = JsonParser .parseReader (reader ).getAsJsonObject ();
52+ reader .close ();
53+
54+ String webLatestVersion = versionInfo .get ("latestVersion" ).getAsString ();
55+
56+ if (isNewer (webLatestVersion , currentVersion )) {
57+ plugin .getLogger ().info ("A new version is available: " + webLatestVersion + "! Downloading..." );
58+ String downloadUrl = versionInfo .get ("downloadUrl" ).getAsString ();
59+ downloadUpdate (downloadUrl );
60+ } else {
61+ plugin .getLogger ().info ("You are running the latest version (" + currentVersion + ")." );
62+ }
63+ } else {
64+ plugin .getLogger ().warning ("Could not check for updates. (Response code: " + connection .getResponseCode () + ")" );
65+ }
66+ } catch (Exception e ) {
67+ plugin .getLogger ().warning ("An error occurred while checking for updates: " + e .getMessage ());
68+ }
69+ }
70+
71+ private String getLocalLatestVersion () {
72+ try (InputStream in = plugin .getResource ("version.json" )) {
73+ if (in == null ) {
74+ return "0.0.0" ;
75+ }
76+ InputStreamReader reader = new InputStreamReader (in );
77+ JsonObject json = JsonParser .parseReader (reader ).getAsJsonObject ();
78+ return json .get ("version" ).getAsString ();
79+ } catch (Exception e ) {
80+ plugin .getLogger ().warning ("Could not read internal latest.json file." );
81+ return "0.0.0" ;
82+ }
83+ }
84+
85+ private boolean isNewer (String latest , String current ) {
86+ return !latest .equalsIgnoreCase (current );
87+ }
88+
89+ private void downloadUpdate (String url ) {
90+ try {
91+ File updateFolder = plugin .getServer ().getUpdateFolderFile ();
92+ if (!updateFolder .exists ()) {
93+ updateFolder .mkdirs ();
94+ }
95+ File downloadTarget = new File (updateFolder , plugin .getName () + ".jar" );
96+
97+ URL downloadUrl = new URL (url );
98+ ReadableByteChannel rbc = Channels .newChannel (downloadUrl .openStream ());
99+ FileOutputStream fos = new FileOutputStream (downloadTarget );
100+ fos .getChannel ().transferFrom (rbc , 0 , Long .MAX_VALUE );
101+ fos .close ();
102+ rbc .close ();
103+
104+ plugin .getLogger ().info ("Successfully downloaded the new version to the 'update' folder." );
105+ plugin .getLogger ().info ("The update will be applied on the next server restart." );
106+
107+ if (plugin .getConfig ().getBoolean ("updater.restart-on-update" , false )) {
108+ plugin .getLogger ().info ("Restarting server to apply the update..." );
109+ new BukkitRunnable () {
110+ @ Override
111+ public void run () {
112+ Bukkit .dispatchCommand (Bukkit .getConsoleSender (), "restart" );
113+ }
114+ }.runTask (plugin );
115+ }
116+ } catch (Exception e ) {
117+ plugin .getLogger ().severe ("The update download failed: " + e .getMessage ());
118+ }
119+ }
120+ }
0 commit comments