1+ package net .imprex .zip .command ;
2+
3+ import java .util .Arrays ;
4+ import java .util .List ;
5+ import java .util .Locale ;
6+
7+ import org .bukkit .command .CommandSender ;
8+ import org .bukkit .entity .Player ;
9+ import org .bukkit .inventory .ItemStack ;
10+ import org .bukkit .inventory .PlayerInventory ;
11+ import org .bukkit .inventory .meta .ItemMeta ;
12+
13+ import net .imprex .zip .BackpackPlugin ;
14+ import net .imprex .zip .config .GeneralConfig ;
15+ import net .imprex .zip .config .MessageKey ;
16+ import net .md_5 .bungee .api .ChatColor ;
17+ import net .md_5 .bungee .api .chat .ClickEvent ;
18+ import net .md_5 .bungee .api .chat .HoverEvent ;
19+ import net .md_5 .bungee .api .chat .TextComponent ;
20+ import net .md_5 .bungee .api .chat .hover .content .Text ;
21+
22+ public class LoreCommand extends BackpackSubCommand {
23+
24+ private final GeneralConfig generalConfig ;
25+
26+ private final String syntaxMessage ;
27+
28+ public LoreCommand (BackpackPlugin plugin ) {
29+ super (plugin , MessageKey .CommandHelpLore , "zeroinventoryproblems.lore" , "lore" );
30+ this .generalConfig = plugin .getBackpackConfig ().general ();
31+
32+ StringBuilder stringBuilder = new StringBuilder ();
33+ stringBuilder .append (this .messageConfig .getWithoutPrefix (MessageKey .CommandHelpStart ));
34+ stringBuilder .append ("\n " );
35+ stringBuilder .append (this .messageConfig .getWithoutPrefix (MessageKey .CommandHelpLoreSyntax ));
36+ stringBuilder .append ("\n " );
37+ stringBuilder .append (this .messageConfig .getWithoutPrefix (MessageKey .CommandHelpEnd ));
38+ this .syntaxMessage = stringBuilder .toString ();
39+ }
40+
41+ @ Override
42+ public void onCommand (CommandSender sender , String [] args ) {
43+ Player player = this .isPlayer (sender );
44+ if (player == null ) {
45+ return ;
46+ }
47+
48+ if (args .length == 0 ) {
49+ sender .sendMessage (this .syntaxMessage );
50+ return ;
51+ }
52+
53+ PlayerInventory playerInventory = player .getInventory ();
54+ ItemStack item = playerInventory .getItemInMainHand ();
55+ if (item == null || !this .backpackHandler .isBackpack (item )) {
56+ this .messageConfig .send (sender , MessageKey .YouNeedToHoldABackpackInYourHand );
57+ return ;
58+ }
59+
60+ ItemMeta meta = item .getItemMeta ();
61+ List <String > lore = meta .getLore ();
62+
63+ boolean apply = switch (args [0 ]) {
64+ case "add" , "create" -> this .handleAdd (sender , Arrays .copyOfRange (args , 1 , args .length ), lore );
65+ case "edit" , "change" -> this .handleChange (sender , Arrays .copyOfRange (args , 1 , args .length ), lore );
66+ case "del" , "delete" -> this .handleDelete (sender , Arrays .copyOfRange (args , 1 , args .length ), lore );
67+ case "list" -> this .handleList (sender , args , lore );
68+ default -> {
69+ sender .sendMessage (this .syntaxMessage );
70+ yield false ;
71+ }
72+ };
73+
74+ if (apply ) {
75+ meta .setLore (lore );
76+ item .setItemMeta (meta );
77+ } else {
78+
79+ }
80+ }
81+
82+ public boolean handleAdd (CommandSender sender , String [] args , List <String > lore ) {
83+ if (args .length < 1 ) {
84+ sender .sendMessage (this .syntaxMessage );
85+ return false ;
86+ }
87+
88+ if (lore .size () + 1 > this .generalConfig .maxLoreCount ) {
89+ this .messageConfig .send (sender , MessageKey .MaxLoreCountReached , this .generalConfig .maxLoreCount );
90+ return false ;
91+ }
92+
93+ String message = String .join (" " , args );
94+ if (!message .startsWith ("&" )) {
95+ message = "&r&7" + message ;
96+ }
97+ message = ChatColor .translateAlternateColorCodes ('&' , message );
98+ lore .add (message );
99+ this .messageConfig .send (sender , MessageKey .LoreLineCreate , lore .size ());
100+ return true ;
101+ }
102+
103+ public boolean handleChange (CommandSender sender , String [] args , List <String > lore ) {
104+ if (args .length < 2 ) {
105+ sender .sendMessage (this .syntaxMessage );
106+ return false ;
107+ }
108+
109+ int line = this .readNumber (sender , args [0 ], 1 , lore .size ());
110+ if (line < 1 ) {
111+ return false ;
112+ }
113+
114+ String message = String .join (" " , Arrays .copyOfRange (args , 1 , args .length ));
115+ if (!message .startsWith ("&" )) {
116+ message = "&r&7" + message ;
117+ }
118+ message = ChatColor .translateAlternateColorCodes ('&' , message );
119+ lore .set (line - 1 , message );
120+ this .messageConfig .send (sender , MessageKey .LoreLineChange , line );
121+ return true ;
122+ }
123+
124+ public boolean handleDelete (CommandSender sender , String [] args , List <String > lore ) {
125+ if (args .length < 1 ) {
126+ sender .sendMessage (this .syntaxMessage );
127+ return false ;
128+ }
129+
130+ int line = this .readNumber (sender , args [0 ], 1 , lore .size ());
131+ if (line < 1 ) {
132+ return false ;
133+ }
134+
135+ lore .remove (line - 1 );
136+ this .messageConfig .send (sender , MessageKey .LoreLineDelete , line );
137+ return true ;
138+ }
139+
140+ public boolean handleList (CommandSender sender , String [] args , List <String > lore ) {
141+ TextComponent component = new TextComponent ();
142+ component .addExtra (this .messageConfig .getWithoutPrefix (MessageKey .CommandLoreStart ));
143+ component .addExtra ("\n " );
144+
145+ for (int line = 1 ; line < lore .size () + 1 ; line ++) {
146+ String entry = lore .get (line - 1 );
147+ String messageContent = this .messageConfig .getWithoutPrefix (MessageKey .CommandLoreContent , line , entry );
148+ String messageEdit = this .messageConfig .getWithoutPrefix (MessageKey .CommandLoreButtonEdit );
149+ String messageEditHover = this .messageConfig .getWithoutPrefix (MessageKey .CommandLoreButtonEditHover );
150+ String messageDelete = this .messageConfig .getWithoutPrefix (MessageKey .CommandLoreButtonDelete );
151+ String messageDeleteHover = this .messageConfig .getWithoutPrefix (MessageKey .CommandLoreButtonDeleteHover );
152+
153+ TextComponent content = new TextComponent (messageContent );
154+ content .addExtra ("\n " );
155+
156+ String editSuggestEntry = entry .replace ("§" , "&" );
157+ TextComponent editButton = new TextComponent (messageEdit );
158+ editButton .setHoverEvent (new HoverEvent (HoverEvent .Action .SHOW_TEXT , new Text (messageEditHover )));
159+ editButton .setClickEvent (new ClickEvent (ClickEvent .Action .SUGGEST_COMMAND , String .format ("/zip lore edit %d %s" , line , editSuggestEntry )));
160+
161+ TextComponent deleteButton = new TextComponent (messageDelete );
162+ deleteButton .setHoverEvent (new HoverEvent (HoverEvent .Action .SHOW_TEXT , new Text (messageDeleteHover )));
163+ deleteButton .setClickEvent (new ClickEvent (ClickEvent .Action .SUGGEST_COMMAND , String .format ("/zip lore delete %d" , line )));
164+
165+ editButton .addExtra (new TextComponent (" " ));
166+ editButton .addExtra (deleteButton );
167+
168+ content .addExtra (" " );
169+ content .addExtra (editButton );
170+
171+ component .addExtra (content );
172+ component .addExtra ("\n " );
173+ }
174+
175+ component .addExtra (this .messageConfig .getWithoutPrefix (MessageKey .CommandLoreEnd ));
176+ sender .spigot ().sendMessage (component );
177+ return false ;
178+ }
179+
180+ public int readNumber (CommandSender sender , String argument , int min , int max ) {
181+ int line ;
182+ try {
183+ line = Integer .valueOf (argument );
184+ } catch (NumberFormatException e ) {
185+ this .messageConfig .send (sender , MessageKey .PleaseEnterANumber );
186+ return -1 ;
187+ }
188+
189+ if (line < min || line > max ) {
190+ this .messageConfig .send (sender , MessageKey .EnterANumberBetweenArgsAndArgs , min , max );
191+ return -1 ;
192+ }
193+
194+ return line ;
195+ }
196+
197+ @ Override
198+ public void onTabComplete (CommandSender sender , String [] args , List <String > result ) {
199+ if (sender instanceof Player player ) {
200+ if (args .length == 0 ) {
201+ result .add ("add" );
202+ result .add ("edit" );
203+ result .add ("delete" );
204+ result .add ("list" );
205+ } else if (args .length == 1 ) {
206+ String subCommand = args [0 ].toLowerCase (Locale .ROOT );
207+ if ("add" .startsWith (subCommand )) {
208+ result .add ("add" );
209+ }
210+ if ("edit" .startsWith (subCommand )) {
211+ result .add ("edit" );
212+ }
213+ if ("delete" .startsWith (subCommand )) {
214+ result .add ("delete" );
215+ }
216+ if ("list" .startsWith (subCommand )) {
217+ result .add ("list" );
218+ }
219+ } else if (args .length == 2 ) {
220+ String subCommand = args [0 ].toLowerCase (Locale .ROOT );
221+ if (!("edit" .startsWith (subCommand ) || "delete" .startsWith (subCommand ))) {
222+ return ;
223+ }
224+
225+ PlayerInventory playerInventory = player .getInventory ();
226+ ItemStack item = playerInventory .getItemInMainHand ();
227+ if (item == null || !this .backpackHandler .isBackpack (item )) {
228+ return ;
229+ }
230+
231+ String value = args [1 ];
232+ ItemMeta meta = item .getItemMeta ();
233+ for (int line = 1 ; line < meta .getLore ().size () + 1 ; line ++) {
234+ String lineAsString = String .valueOf (line );
235+ if (lineAsString .startsWith (value )) {
236+ result .add (lineAsString );
237+ }
238+ }
239+ }
240+ }
241+ }
242+ }
0 commit comments