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"/> | 			<attribute name="optional" value="true"/> | ||||||
| 		</attributes> | 		</attributes> | ||||||
| 	</classpathentry> | 	</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> | 		<attributes> | ||||||
| 			<attribute name="maven.pomderived" value="true"/> | 			<attribute name="maven.pomderived" value="true"/> | ||||||
| 		</attributes> | 		</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.AdminCommand; | ||||||
| import eu.m724.realweather.commands.GeoCommand; | import eu.m724.realweather.commands.GeoCommand; | ||||||
| import eu.m724.realweather.commands.LocalTimeCommand; | import eu.m724.realweather.commands.LocalTimeCommand; | ||||||
| import eu.m724.realweather.commands.UpdateCommand; |  | ||||||
| import eu.m724.realweather.mapper.Mapper; | import eu.m724.realweather.mapper.Mapper; | ||||||
| import eu.m724.realweather.mapper.MapperConfig; | import eu.m724.realweather.mapper.MapperConfig; | ||||||
| import eu.m724.realweather.object.UserException; | import eu.m724.realweather.object.UserException; | ||||||
|  |  | ||||||
|  | @ -8,12 +8,16 @@ import org.bukkit.command.CommandSender; | ||||||
| import org.bukkit.entity.Player; | import org.bukkit.entity.Player; | ||||||
| 
 | 
 | ||||||
| import eu.m724.realweather.GlobalConstants; | import eu.m724.realweather.GlobalConstants; | ||||||
|  | import eu.m724.realweather.weather.PlayerWeatherDirectory; | ||||||
| import eu.m724.wtapi.object.Coordinates; | 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.ChatColor; | ||||||
| import net.md_5.bungee.api.chat.BaseComponent; | import net.md_5.bungee.api.chat.BaseComponent; | ||||||
| import net.md_5.bungee.api.chat.ComponentBuilder; | import net.md_5.bungee.api.chat.ComponentBuilder; | ||||||
| 
 | 
 | ||||||
| public class GeoCommand implements CommandExecutor { | public class GeoCommand implements CommandExecutor { | ||||||
|  | 	PlayerWeatherDirectory playerWeatherDirectory = | ||||||
|  | 			GlobalConstants.getPlayerWeatherDirectory(); | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { | 	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); | 				Coordinates coordinates = GlobalConstants.getMapper().locationToCoordinates(location); | ||||||
| 				 | 				 | ||||||
| 				BaseComponent[] component = new ComponentBuilder("\nGeolocation: ").color(ChatColor.GOLD) | 				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("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 | 						.create(); // TODO improve readability | ||||||
| 				 | 				 | ||||||
| 				player.spigot().sendMessage(component); | 				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 { | 			} else { | ||||||
| 				sender.sendMessage("Add arguments to use this command in console"); | 				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); | 			Location location = GlobalConstants.getMapper().coordinatesToLocation(player.getWorld(), coordinates); | ||||||
| 			 | 			 | ||||||
| 			BaseComponent[] component = new ComponentBuilder("\nPosition: ").color(ChatColor.GOLD) | 			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("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(); | 					.create(); | ||||||
| 			 | 			 | ||||||
| 			player.spigot().sendMessage(component); | 			player.spigot().sendMessage(component); | ||||||
|  |  | ||||||
|  | @ -3,7 +3,6 @@ package eu.m724.realweather.commands; | ||||||
| import java.util.concurrent.CompletableFuture; | import java.util.concurrent.CompletableFuture; | ||||||
| 
 | 
 | ||||||
| import org.bukkit.command.Command; | import org.bukkit.command.Command; | ||||||
| import org.bukkit.command.CommandExecutor; |  | ||||||
| import org.bukkit.command.CommandSender; | import org.bukkit.command.CommandSender; | ||||||
| 
 | 
 | ||||||
| import eu.m724.realweather.updater.Updater; | 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) | 				.append(currentMetadata.label).color(ChatColor.DARK_AQUA) | ||||||
| 				.build(); | 				.build(); | ||||||
| 		 | 		 | ||||||
| 		DebugLogger.info(updateMessage.toString(), 0); | 		DebugLogger.info(updateMessage.toPlainText(), 0); | ||||||
| 		DebugLogger.info(updateActionMessage.toString(), 0); | 		DebugLogger.info(updateActionMessage.toPlainText(), 0); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -26,13 +26,16 @@ public class MetadataRetriever { | ||||||
| 		this.channel = channel; | 		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} | 	 * the completablefuture can throw a completionexception with {@link eu.m724.realweather.updater.metadata.MetadataServerException} | ||||||
| 	 */ | 	 */ | ||||||
| 	private CompletableFuture<VersionMetadata> getMetadataOf(String version) { | 	private CompletableFuture<VersionMetadata> getMetadataOf(String version) { | ||||||
| 		String url = String.format( | 		String url = getFileUrl(version, "meta-v1.json"); | ||||||
| 				"https://git.724.rocks/Minecon724/realweather-metadata/raw/branch/master/data/%s/%s/%s", |  | ||||||
| 				channel, version, "meta-v1.json"); |  | ||||||
| 		 | 		 | ||||||
| 		HttpRequest request = HttpRequest.newBuilder() | 		HttpRequest request = HttpRequest.newBuilder() | ||||||
| 				.uri(URI.create(url)) | 				.uri(URI.create(url)) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Minecon724
				Minecon724