implement downloader
This commit is contained in:
		
					parent
					
						
							
								2f8560fc41
							
						
					
				
			
			
				commit
				
					
						7af2a99b3f
					
				
			
		
					 8 changed files with 127 additions and 33 deletions
				
			
		| 
						 | 
				
			
			@ -26,7 +26,7 @@
 | 
			
		|||
			<attribute name="optional" value="true"/>
 | 
			
		||||
		</attributes>
 | 
			
		||||
	</classpathentry>
 | 
			
		||||
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17">
 | 
			
		||||
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-21">
 | 
			
		||||
		<attributes>
 | 
			
		||||
			<attribute name="maven.pomderived" value="true"/>
 | 
			
		||||
		</attributes>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,21 +0,0 @@
 | 
			
		|||
#release configuration
 | 
			
		||||
#Tue Jun 18 13:42:52 CEST 2024
 | 
			
		||||
completedPhase=check-poms
 | 
			
		||||
exec.pomFileName=pom.xml
 | 
			
		||||
exec.snapshotReleasePluginAllowed=false
 | 
			
		||||
pinExternals=false
 | 
			
		||||
preparationGoals=clean verify
 | 
			
		||||
project.scm.eu.m724\:realweather.developerConnection=scm\:git\:git@git.724.rocks\:Minecon724/realweather.git
 | 
			
		||||
project.scm.eu.m724\:realweather.tag=HEAD
 | 
			
		||||
projectVersionPolicyConfig=<projectVersionPolicyConfig>${projectVersionPolicyConfig}</projectVersionPolicyConfig>\n
 | 
			
		||||
projectVersionPolicyId=default
 | 
			
		||||
pushChanges=true
 | 
			
		||||
releaseStrategyId=default
 | 
			
		||||
remoteTagging=true
 | 
			
		||||
scm.branchCommitComment=@{prefix} prepare branch @{releaseLabel}
 | 
			
		||||
scm.commentPrefix=[maven-release-plugin] 
 | 
			
		||||
scm.developmentCommitComment=@{prefix} prepare for next development iteration
 | 
			
		||||
scm.releaseCommitComment=@{prefix} prepare release @{releaseLabel}
 | 
			
		||||
scm.rollbackCommitComment=@{prefix} rollback the release of @{releaseLabel}
 | 
			
		||||
scm.tagNameFormat=@{project.artifactId}-@{project.version}
 | 
			
		||||
scm.url=scm\:git\:git@git.724.rocks\:Minecon724/realweather.git
 | 
			
		||||
| 
						 | 
				
			
			@ -14,7 +14,6 @@ import com.google.common.base.Charsets;
 | 
			
		|||
import eu.m724.realweather.commands.AdminCommand;
 | 
			
		||||
import eu.m724.realweather.commands.GeoCommand;
 | 
			
		||||
import eu.m724.realweather.commands.LocalTimeCommand;
 | 
			
		||||
import eu.m724.realweather.commands.UpdateCommand;
 | 
			
		||||
import eu.m724.realweather.mapper.Mapper;
 | 
			
		||||
import eu.m724.realweather.mapper.MapperConfig;
 | 
			
		||||
import eu.m724.realweather.object.UserException;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,12 +8,16 @@ import org.bukkit.command.CommandSender;
 | 
			
		|||
import org.bukkit.entity.Player;
 | 
			
		||||
 | 
			
		||||
import eu.m724.realweather.GlobalConstants;
 | 
			
		||||
import eu.m724.realweather.weather.PlayerWeatherDirectory;
 | 
			
		||||
import eu.m724.wtapi.object.Coordinates;
 | 
			
		||||
import eu.m724.wtapi.object.Weather;
 | 
			
		||||
import net.md_5.bungee.api.ChatColor;
 | 
			
		||||
import net.md_5.bungee.api.chat.BaseComponent;
 | 
			
		||||
import net.md_5.bungee.api.chat.ComponentBuilder;
 | 
			
		||||
 | 
			
		||||
public class GeoCommand implements CommandExecutor {
 | 
			
		||||
	PlayerWeatherDirectory playerWeatherDirectory =
 | 
			
		||||
			GlobalConstants.getPlayerWeatherDirectory();
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
 | 
			
		||||
| 
						 | 
				
			
			@ -25,12 +29,19 @@ public class GeoCommand implements CommandExecutor {
 | 
			
		|||
				Coordinates coordinates = GlobalConstants.getMapper().locationToCoordinates(location);
 | 
			
		||||
				
 | 
			
		||||
				BaseComponent[] component = new ComponentBuilder("\nGeolocation: ").color(ChatColor.GOLD)
 | 
			
		||||
						.append(String.format("lat: %f, lon: %f\n", coordinates.latitude, coordinates.longitude)).color(ChatColor.AQUA)
 | 
			
		||||
						.append("lat: %f, lon: %f\n".formatted(coordinates.latitude, coordinates.longitude)).color(ChatColor.AQUA)
 | 
			
		||||
						.append("Position: ").color(ChatColor.GRAY)
 | 
			
		||||
						.append(String.format("x: %f, z: %f\n", location.getX(), location.getZ())).color(ChatColor.DARK_AQUA)
 | 
			
		||||
						.append("x: %f, z: %f".formatted(location.getX(), location.getZ())).color(ChatColor.DARK_AQUA)
 | 
			
		||||
						.create(); // TODO improve readability
 | 
			
		||||
				
 | 
			
		||||
				player.spigot().sendMessage(component);
 | 
			
		||||
				Weather weather = playerWeatherDirectory.getWeather(player);
 | 
			
		||||
				if (weather != null) {
 | 
			
		||||
					component = new ComponentBuilder("You're in ").color(ChatColor.GRAY)
 | 
			
		||||
							.append(weather.city + "\n").color(ChatColor.DARK_AQUA)
 | 
			
		||||
							.create();
 | 
			
		||||
					player.spigot().sendMessage(component);
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				sender.sendMessage("Add arguments to use this command in console");
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -49,9 +60,9 @@ public class GeoCommand implements CommandExecutor {
 | 
			
		|||
			Location location = GlobalConstants.getMapper().coordinatesToLocation(player.getWorld(), coordinates);
 | 
			
		||||
			
 | 
			
		||||
			BaseComponent[] component = new ComponentBuilder("\nPosition: ").color(ChatColor.GOLD)
 | 
			
		||||
					.append(String.format("x: %f, z: %f\n", location.getX(), location.getZ())).color(ChatColor.AQUA)
 | 
			
		||||
					.append("x: %f, z: %f\n".formatted(location.getX(), location.getZ())).color(ChatColor.AQUA)
 | 
			
		||||
					.append("Geolocation: ").color(ChatColor.GRAY)
 | 
			
		||||
					.append(String.format("lat: %f, lon: %f\n", coordinates.latitude, coordinates.longitude)).color(ChatColor.DARK_AQUA)
 | 
			
		||||
					.append("lat: %f, lon: %f\n".formatted(coordinates.latitude, coordinates.longitude)).color(ChatColor.DARK_AQUA)
 | 
			
		||||
					.create();
 | 
			
		||||
			
 | 
			
		||||
			player.spigot().sendMessage(component);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,6 @@ package eu.m724.realweather.commands;
 | 
			
		|||
import java.util.concurrent.CompletableFuture;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.command.Command;
 | 
			
		||||
import org.bukkit.command.CommandExecutor;
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
 | 
			
		||||
import eu.m724.realweather.updater.Updater;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										103
									
								
								src/main/java/eu/m724/realweather/updater/UpdateDownloader.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								src/main/java/eu/m724/realweather/updater/UpdateDownloader.java
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,103 @@
 | 
			
		|||
package eu.m724.realweather.updater;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.FileInputStream;
 | 
			
		||||
import java.io.FileOutputStream;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
import java.net.ProxySelector;
 | 
			
		||||
import java.net.URI;
 | 
			
		||||
import java.net.URISyntaxException;
 | 
			
		||||
import java.net.http.HttpClient;
 | 
			
		||||
import java.net.http.HttpRequest;
 | 
			
		||||
import java.net.http.HttpResponse;
 | 
			
		||||
import java.net.http.HttpClient.Redirect;
 | 
			
		||||
import java.net.http.HttpResponse.BodyHandlers;
 | 
			
		||||
import java.nio.file.Files;
 | 
			
		||||
import java.nio.file.StandardCopyOption;
 | 
			
		||||
import java.security.MessageDigest;
 | 
			
		||||
import java.security.NoSuchAlgorithmException;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.HexFormat;
 | 
			
		||||
import java.util.concurrent.CompletableFuture;
 | 
			
		||||
import java.util.concurrent.CompletionException;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.plugin.Plugin;
 | 
			
		||||
 | 
			
		||||
public class UpdateDownloader {
 | 
			
		||||
	private Plugin plugin;
 | 
			
		||||
	
 | 
			
		||||
	private File getRunningPluginFile() {
 | 
			
		||||
		try {
 | 
			
		||||
			return new File(plugin.getClass().getProtectionDomain().getCodeSource().getLocation().toURI());
 | 
			
		||||
		} catch (URISyntaxException e) {
 | 
			
		||||
			// TODO Auto-generated catch block
 | 
			
		||||
			e.printStackTrace();
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private CompletableFuture<File> download(String url) {
 | 
			
		||||
		
 | 
			
		||||
		HttpRequest request = HttpRequest.newBuilder()
 | 
			
		||||
				.uri(URI.create(url))
 | 
			
		||||
				.header("User-Agent", "rwu/1") // real weather updater v1
 | 
			
		||||
				.build();
 | 
			
		||||
		
 | 
			
		||||
		CompletableFuture<HttpResponse<InputStream>> responseFuture =
 | 
			
		||||
				HttpClient.newBuilder()
 | 
			
		||||
				.followRedirects(Redirect.NORMAL)
 | 
			
		||||
				.proxy(ProxySelector.getDefault()).build().
 | 
			
		||||
				sendAsync(request, BodyHandlers.ofInputStream());
 | 
			
		||||
		
 | 
			
		||||
		CompletableFuture<File> fileFuture =
 | 
			
		||||
				responseFuture.thenApply(response -> {
 | 
			
		||||
					File downloadFile = null;
 | 
			
		||||
					try {
 | 
			
		||||
						InputStream bodyStream = response.body();
 | 
			
		||||
						downloadFile = Files.createTempFile("realweather", null).toFile();
 | 
			
		||||
						FileOutputStream fileStream = new FileOutputStream(downloadFile);
 | 
			
		||||
			
 | 
			
		||||
						while (bodyStream.available() > 0) {
 | 
			
		||||
							bodyStream.transferTo(fileStream);
 | 
			
		||||
						}
 | 
			
		||||
						
 | 
			
		||||
						bodyStream.close();
 | 
			
		||||
					} catch (IOException e) {
 | 
			
		||||
						throw new CompletionException(e);
 | 
			
		||||
					}
 | 
			
		||||
					
 | 
			
		||||
					return downloadFile;
 | 
			
		||||
				});
 | 
			
		||||
		
 | 
			
		||||
		return fileFuture;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private void install(File file) throws IOException {
 | 
			
		||||
		// TODO what if we changed File to Path and every ref in this file
 | 
			
		||||
		Files.move(file.toPath(), getRunningPluginFile().toPath(), StandardCopyOption.REPLACE_EXISTING);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private byte[] computeFileSha256Hash(File file) throws IOException {
 | 
			
		||||
		MessageDigest digest = null;
 | 
			
		||||
		try {
 | 
			
		||||
			digest = MessageDigest.getInstance("SHA-256");
 | 
			
		||||
		} catch (NoSuchAlgorithmException e) {
 | 
			
		||||
			throw new RuntimeException(e);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		try (FileInputStream fileInputStream = new FileInputStream(file)) {
 | 
			
		||||
			byte[] buffer = new byte[16384];
 | 
			
		||||
			int len;
 | 
			
		||||
			
 | 
			
		||||
			while ((len = fileInputStream.read(buffer)) != -1)
 | 
			
		||||
				digest.update(buffer, 0, len);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return digest.digest();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private boolean compareBytesHex(byte[] bytes, String hecks) {
 | 
			
		||||
		return Arrays.equals(bytes, HexFormat.of().parseHex(hecks));
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -156,7 +156,7 @@ public class Updater extends BukkitRunnable implements Listener {
 | 
			
		|||
				.append(currentMetadata.label).color(ChatColor.DARK_AQUA)
 | 
			
		||||
				.build();
 | 
			
		||||
		
 | 
			
		||||
		DebugLogger.info(updateMessage.toString(), 0);
 | 
			
		||||
		DebugLogger.info(updateActionMessage.toString(), 0);
 | 
			
		||||
		DebugLogger.info(updateMessage.toPlainText(), 0);
 | 
			
		||||
		DebugLogger.info(updateActionMessage.toPlainText(), 0);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,13 +26,16 @@ public class MetadataRetriever {
 | 
			
		|||
		this.channel = channel;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public String getFileUrl(String version, String file) {
 | 
			
		||||
		return "https://git.724.rocks/Minecon724/realweather-metadata/raw/branch/master/data/%s/%s/%s"
 | 
			
		||||
				.formatted(channel, version, file);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * the completablefuture can throw a completionexception with {@link eu.m724.realweather.updater.metadata.MetadataServerException}
 | 
			
		||||
	 */
 | 
			
		||||
	private CompletableFuture<VersionMetadata> getMetadataOf(String version) {
 | 
			
		||||
		String url = String.format(
 | 
			
		||||
				"https://git.724.rocks/Minecon724/realweather-metadata/raw/branch/master/data/%s/%s/%s",
 | 
			
		||||
				channel, version, "meta-v1.json");
 | 
			
		||||
		String url = getFileUrl(version, "meta-v1.json");
 | 
			
		||||
		
 | 
			
		||||
		HttpRequest request = HttpRequest.newBuilder()
 | 
			
		||||
				.uri(URI.create(url))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue