11package org .yetiman .yetisutils ;
22
33import org .bukkit .Bukkit ;
4- import org .bukkit .ChatColor ;
4+ import org .bukkit .Location ;
55import org .bukkit .Material ;
66import org .bukkit .entity .Player ;
77import org .bukkit .event .EventHandler ;
1111import org .bukkit .inventory .ItemStack ;
1212import org .bukkit .inventory .meta .ItemMeta ;
1313
14+ import java .text .ParseException ;
1415import java .text .SimpleDateFormat ;
15- import java .util .ArrayList ;
16- import java .util .List ;
17- import java .util .UUID ;
16+ import java .util .*;
1817
1918public class ReportGUI implements Listener {
2019 private final YETIsUtils plugin ;
@@ -23,117 +22,134 @@ public class ReportGUI implements Listener {
2322 public ReportGUI (YETIsUtils plugin , ReportHandler reportHandler ) {
2423 this .plugin = plugin ;
2524 this .reportHandler = reportHandler ;
25+ Bukkit .getPluginManager ().registerEvents (this , plugin );
2626 }
2727
28- public static void openReportGUI (Player player , ReportHandler reportHandler ) {
29- Inventory inv = Bukkit .createInventory (null , 54 , "Player Reports" );
28+ public void openReportMenu (Player player ) {
29+ List <Map .Entry <String , Map <String , String >>> sortedReports = getSortedReports ();
30+ Inventory reportMenu = Bukkit .createInventory (null , 54 , "Reports" );
3031
31- List <Report > allReports = reportHandler .getAllReports ();
32- SimpleDateFormat dateFormatter = new SimpleDateFormat ("dd-MM-yy HH-mm" );
32+ for (int i = 0 ; i < sortedReports .size (); i ++) {
33+ Map .Entry <String , Map <String , String >> entry = sortedReports .get (i );
34+ String reportId = entry .getKey ();
35+ Map <String , String > report = entry .getValue ();
3336
34- for (int i = 0 ; i < allReports .size (); i ++) {
35- Report report = allReports .get (i );
36- ItemStack paper = new ItemStack (Material .PAPER );
37- ItemMeta meta = paper .getItemMeta ();
37+ ItemStack item = new ItemStack (Material .PAPER );
38+ ItemMeta meta = item .getItemMeta ();
3839 if (meta != null ) {
39- meta .setDisplayName (ChatColor . YELLOW + "Report #" + ( i + 1 ) );
40- List < String > lore = new ArrayList <>();
41- lore . add ( ChatColor . GOLD + "Reporter : " + report .getReporter ());
42- lore . add ( ChatColor . GOLD + "Issue: " + report .getIssue ());
43- lore . add ( ChatColor . AQUA + "Date: " + dateFormatter . format ( report .getDate ()));
44- meta . setLore ( lore );
45- paper .setItemMeta (meta );
40+ meta .setDisplayName ("Report #" + reportId );
41+ meta . setLore ( Arrays . asList (
42+ "Player : " + report .get ( "player" ),
43+ "Issue: " + report .get ( "issue" ),
44+ "Date: " + report .get ( "date" )
45+ ) );
46+ item .setItemMeta (meta );
4647 }
47- inv .addItem (paper );
48+ reportMenu .addItem (item );
4849 }
4950
50- player .openInventory (inv );
51+ player .openInventory (reportMenu );
5152 }
5253
53- public static void openReportDetailGUI (Player player , Report report , int reportIndex ) {
54- Inventory inv = Bukkit .createInventory (null , 27 , "Report Details" );
55-
56- ItemStack paper = new ItemStack (Material .PAPER );
57- ItemMeta meta = paper .getItemMeta ();
58- if (meta != null ) {
59- meta .setDisplayName (ChatColor .YELLOW + "Report Details" );
60- List <String > lore = new ArrayList <>();
61- lore .add (ChatColor .GOLD + "Reporter: " + report .getReporter ());
62- lore .add (ChatColor .GOLD + "Issue: " + report .getIssue ());
63- lore .add (ChatColor .AQUA + "Date: " + new SimpleDateFormat ("dd-MM-yy HH-mm" ).format (report .getDate ()));
64- meta .setLore (lore );
65- paper .setItemMeta (meta );
54+ public void openReportDetails (Player player , String reportId ) {
55+ Map <String , String > report = reportHandler .getReports ().get (reportId );
56+ Inventory reportDetails = Bukkit .createInventory (null , 27 , "Report Details" );
57+
58+ ItemStack reportItem = new ItemStack (Material .PAPER );
59+ ItemMeta reportMeta = reportItem .getItemMeta ();
60+ if (reportMeta != null ) {
61+ reportMeta .setDisplayName ("Report #" + reportId );
62+ reportMeta .setLore (Arrays .asList (
63+ "Player: " + report .get ("player" ),
64+ "Issue: " + report .get ("issue" ),
65+ "Date: " + report .get ("date" )
66+ ));
67+ reportItem .setItemMeta (reportMeta );
6668 }
67- inv .setItem (13 , paper ); // Center the paper in the inventory
6869
69- ItemStack closeButton = createGuiItem (Material .RED_STAINED_GLASS_PANE , ChatColor .RED + "Close Report" );
70- inv .setItem (26 , closeButton ); // Place the close button in the bottom right
70+ ItemStack backButton = new ItemStack (Material .BARRIER );
71+ ItemMeta backMeta = backButton .getItemMeta ();
72+ if (backMeta != null ) {
73+ backMeta .setDisplayName ("Back" );
74+ backButton .setItemMeta (backMeta );
75+ }
76+
77+ ItemStack teleportButton = new ItemStack (Material .ENDER_PEARL );
78+ ItemMeta teleportMeta = teleportButton .getItemMeta ();
79+ if (teleportMeta != null ) {
80+ teleportMeta .setDisplayName ("Teleport to Location" );
81+ teleportButton .setItemMeta (teleportMeta );
82+ }
83+
84+ ItemStack closeButton = new ItemStack (Material .RED_STAINED_GLASS_PANE );
85+ ItemMeta closeMeta = closeButton .getItemMeta ();
86+ if (closeMeta != null ) {
87+ closeMeta .setDisplayName ("Close Report" );
88+ closeButton .setItemMeta (closeMeta );
89+ }
7190
72- inv .setItem (18 , createGuiItem (Material .ARROW , ChatColor .GREEN + "Back to Reports" ));
91+ reportDetails .setItem (10 , reportItem );
92+ reportDetails .setItem (12 , teleportButton );
93+ reportDetails .setItem (14 , closeButton );
94+ reportDetails .setItem (16 , backButton );
7395
74- player .openInventory (inv );
96+ player .openInventory (reportDetails );
7597 }
7698
7799 @ EventHandler
78100 public void onInventoryClick (InventoryClickEvent event ) {
79- if (event .getView ().getTitle ().equals ("Player Reports" )) {
101+ if (!(event .getWhoClicked () instanceof Player )) return ;
102+ Player player = (Player ) event .getWhoClicked ();
103+
104+ if (event .getView ().getTitle ().equals ("Reports" )) {
80105 event .setCancelled (true );
81- if (event .getCurrentItem () == null || event .getCurrentItem ().getType () != Material .PAPER ) {
82- return ;
83- }
106+ ItemStack clickedItem = event .getCurrentItem ();
107+ if (clickedItem == null || !clickedItem .hasItemMeta ()) return ;
84108
85- Player player = (Player ) event .getWhoClicked ();
86- int reportIndex = event .getSlot ();
87- List <Report > allReports = reportHandler .getAllReports ();
88- if (reportIndex < allReports .size ()) {
89- Report report = allReports .get (reportIndex );
90- openReportDetailGUI (player , report , reportIndex );
91- }
109+ String reportId = clickedItem .getItemMeta ().getDisplayName ().split ("#" )[1 ];
110+ openReportDetails (player , reportId );
92111 } else if (event .getView ().getTitle ().equals ("Report Details" )) {
93112 event .setCancelled (true );
94- if (event .getCurrentItem () == null ) {
95- return ;
96- }
97-
98- Player player = (Player ) event .getWhoClicked ();
99113 ItemStack clickedItem = event .getCurrentItem ();
100- ItemMeta meta = clickedItem .getItemMeta ();
101- if (meta == null ) {
102- return ;
103- }
114+ if (clickedItem == null || !clickedItem .hasItemMeta ()) return ;
104115
105- if (clickedItem .getType () == Material .RED_STAINED_GLASS_PANE && meta .getDisplayName ().equals (ChatColor .RED + "Close Report" )) {
106- int reportIndex = event .getInventory ().getItem (13 ).getAmount () - 1 ;
107- List <Report > allReports = reportHandler .getAllReports ();
108- if (reportIndex < allReports .size ()) {
109- Report report = allReports .get (reportIndex );
110- UUID reporterId = reportHandler .getReporterUUID (report );
111- if (reporterId != null ) {
112- reportHandler .removeReport (reporterId , reportIndex );
113- player .sendMessage (ChatColor .GREEN + "Report closed." );
114- player .closeInventory ();
115- openReportGUI (player , reportHandler );
116- }
116+ ItemMeta meta = clickedItem .getItemMeta ();
117+ if (meta == null ) return ;
118+
119+ String displayName = meta .getDisplayName ();
120+ String reportId = event .getInventory ().getItem (10 ).getItemMeta ().getDisplayName ().split ("#" )[1 ];
121+
122+ if (displayName .equals ("Back" )) {
123+ openReportMenu (player );
124+ } else if (displayName .equals ("Teleport to Location" )) {
125+ Location location = reportHandler .getReportLocation (reportId );
126+ if (location != null ) {
127+ player .teleport (location );
128+ player .sendMessage ("Teleported to the report location." );
129+ } else {
130+ player .sendMessage ("Failed to find the report location." );
117131 }
118- } else if (clickedItem .getType () == Material .ARROW && meta .getDisplayName ().equals (ChatColor .GREEN + "Back to Reports" )) {
119- player .closeInventory ();
120- openReportGUI (player , reportHandler );
132+ } else if (displayName .equals ("Close Report" )) {
133+ reportHandler .clearReport (reportId );
134+ player .sendMessage ("Report #" + reportId + " has been closed." );
135+ openReportMenu (player );
121136 }
122137 }
123138 }
124139
125- private static ItemStack createGuiItem (Material material , String name , String ... lore ) {
126- ItemStack item = new ItemStack (material );
127- ItemMeta meta = item .getItemMeta ();
128- if (meta != null ) {
129- meta .setDisplayName (name );
130- List <String > metaLore = new ArrayList <>();
131- for (String loreEntry : lore ) {
132- metaLore .add (loreEntry );
140+ private List <Map .Entry <String , Map <String , String >>> getSortedReports () {
141+ List <Map .Entry <String , Map <String , String >>> entries = new ArrayList <>(reportHandler .getReports ().entrySet ());
142+
143+ entries .sort (Comparator .comparing (entry -> {
144+ String dateString = entry .getValue ().get ("date" );
145+ try {
146+ return new SimpleDateFormat ("dd-MM-yy HH:mm" ).parse (dateString );
147+ } catch (ParseException e ) {
148+ e .printStackTrace ();
149+ return new Date (0 ); // fallback to epoch time in case of parse error
133150 }
134- meta .setLore (metaLore );
135- item .setItemMeta (meta );
136- }
137- return item ;
151+ }));
152+
153+ return entries ;
138154 }
139155}
0 commit comments