1+ package com .hackclub .hccore .tasks ;
2+
3+ import com .hackclub .hccore .HCCorePlugin ;
4+ import java .awt .Graphics2D ;
5+ import java .awt .RenderingHints ;
6+ import java .awt .image .BufferedImage ;
7+ import java .io .ByteArrayInputStream ;
8+ import java .io .IOException ;
9+ import java .net .URI ;
10+ import java .net .http .HttpClient ;
11+ import java .net .http .HttpRequest ;
12+ import java .net .http .HttpResponse ;
13+ import java .time .Duration ;
14+ import java .util .logging .Logger ;
15+ import javax .imageio .ImageIO ;
16+ import org .bukkit .Bukkit ;
17+
18+ public class IconTask implements Runnable {
19+ private final HCCorePlugin plugin ;
20+ private final HttpClient client ;
21+ public IconTask (HCCorePlugin plugin ) {
22+ this .plugin = plugin ;
23+ this .client = HttpClient .newHttpClient ();
24+ }
25+
26+ @ Override
27+ public void run () {
28+ Logger logger = plugin .getLogger ();
29+
30+ // get the icon url from Shrimp Shuffler
31+ HttpRequest ssRequest = HttpRequest .newBuilder ()
32+ .uri (URI .create ("https://shrimp-shuffler.a.hackclub.dev/api/current" ))
33+ .GET ()
34+ .timeout (Duration .ofSeconds (20 ))
35+ .build ();
36+ HttpResponse <String > ssResponse ;
37+ try {
38+ ssResponse = client .send (ssRequest , HttpResponse .BodyHandlers .ofString ());
39+ } catch (InterruptedException e ) {
40+ Thread .currentThread ().interrupt ();
41+ logger .severe ("Failed to get the current icon from Shrimp Shuffler!" );
42+ logger .severe (e .getMessage ());
43+ return ;
44+ } catch (IOException e ) {
45+ logger .severe ("Failed to get the current icon from Shrimp Shuffler!" );
46+ logger .severe (e .getMessage ());
47+ return ;
48+ }
49+ if (ssResponse == null || ssResponse .body () == null ) {
50+ logger .severe ("Failed to get the current icon from Shrimp Shuffler!" );
51+ return ;
52+ }
53+ // load that icon and save to a temp file
54+ HttpRequest cdnRequest = HttpRequest .newBuilder ()
55+ .uri (URI .create (ssResponse .body ()))
56+ .GET ()
57+ .timeout (Duration .ofSeconds (20 ))
58+ .build ();
59+ HttpResponse <byte []> cdnResponse ;
60+ try {
61+ cdnResponse = client .send (cdnRequest , HttpResponse .BodyHandlers .ofByteArray ());
62+ } catch (InterruptedException e ) {
63+ Thread .currentThread ().interrupt ();
64+ logger .severe ("Failed to get the current icon from the Hack Club CDN!" );
65+ logger .severe (e .getMessage ());
66+ return ;
67+ } catch (IOException e ) {
68+ logger .severe ("Failed to get the current icon from the Hack Club CDN!" );
69+ logger .severe (e .getMessage ());
70+ return ;
71+ }
72+ // load as a buffered image and cache in plugin
73+ BufferedImage image ;
74+ try {
75+ ByteArrayInputStream in = new ByteArrayInputStream (cdnResponse .body ());
76+ image = ImageIO .read (in );
77+ } catch (IOException e ) {
78+ logger .severe ("Failed to load the current icon from the CDN response!" );
79+ logger .severe (e .getMessage ());
80+ return ;
81+ }
82+ if (image == null ) {
83+ logger .severe ("Failed to load the current icon from the CDN response!" );
84+ return ;
85+ }
86+ BufferedImage serverIcon = resizeToIcon (image );
87+ Bukkit .getScheduler ().runTask (plugin , () -> {
88+ try {
89+ plugin .serverIcon = Bukkit .loadServerIcon (serverIcon );
90+ } catch (Exception e ) {
91+ logger .severe ("Failed to cache the current icon!" );
92+ logger .severe (e .getMessage ());
93+ }
94+ });
95+ }
96+ // little resizing method to make it work with minecraft's server list
97+ private static BufferedImage resizeToIcon (BufferedImage original ) {
98+ BufferedImage resizedImage = new BufferedImage (64 , 64 , BufferedImage .TYPE_INT_ARGB );
99+ Graphics2D graphics = resizedImage .createGraphics ();
100+ try {
101+ graphics .setRenderingHint (RenderingHints .KEY_INTERPOLATION , RenderingHints .VALUE_INTERPOLATION_BICUBIC );
102+ graphics .drawImage (original , 0 , 0 , 64 , 64 , null );
103+ } finally {
104+ graphics .dispose ();
105+ }
106+ return resizedImage ;
107+ }
108+ }
0 commit comments