66import net .kyori .adventure .text .minimessage .tag .resolver .Formatter ;
77import net .kyori .adventure .text .minimessage .tag .resolver .Placeholder ;
88import org .bukkit .OfflinePlayer ;
9+ import org .bukkit .permissions .Permissible ;
910import org .jetbrains .annotations .NotNull ;
1011import org .jetbrains .annotations .Nullable ;
1112
1213import java .time .ZoneOffset ;
14+ import java .util .ArrayList ;
1315import java .util .Arrays ;
1416import java .util .Calendar ;
1517import java .util .Date ;
@@ -187,7 +189,7 @@ public Messages() {
187189 .deserialize (Objects .requireNonNull (config .getString (member .isActive () ? "nation.members.status.active" : "nation.members.status.inactive" )));
188190 }
189191
190- public @ NotNull Component nationMembersList (final @ NotNull Nation nation ) {
192+ public @ NotNull Component nationMembersList (final @ NotNull Nation nation , final @ NotNull Permissible sender ) {
191193 final @ NotNull HashSet <@ NotNull Member > members = nation .members ();
192194 final @ NotNull Component header = MiniMessage .miniMessage ()
193195 .deserialize (Objects .requireNonNull (config .getString ("nation.members.list.header" ))
@@ -198,7 +200,98 @@ public Messages() {
198200 Placeholder .unparsed ("nation-inactive-members" , members .stream ().filter (m -> !m .isActive ()).count () + "" ),
199201 Placeholder .unparsed ("nation-total-members" , members .size () + "" )
200202 );
201- return header ;
203+
204+ final @ NotNull List <@ NotNull Component > list = new ArrayList <>();
205+
206+ final @ NotNull Member leader = members .stream ().filter (m -> m .uuid .equals (nation .leaderUUID )).findFirst ().orElseThrow (IllegalStateException ::new );
207+ list .add (nationMembersListEntry (nation , leader , sender ));
208+
209+ final @ NotNull Member vice = members .stream ().filter (m -> m .uuid .equals (nation .viceLeaderUUID )).findFirst ().orElseThrow (IllegalStateException ::new );
210+ if (!vice .uuid .equals (leader .uuid ))
211+ list .add (nationMembersListEntry (nation , vice , sender ));
212+
213+ final @ NotNull List <@ NotNull Component > citizens = members .stream ().filter (m -> !m .uuid .equals (leader .uuid ) && !m .uuid .equals (vice .uuid ) && m .isActive ()).map (m -> nationMembersListEntry (nation , m , sender )).toList ();
214+ list .addAll (citizens );
215+
216+ final @ NotNull List <@ NotNull Component > inactive = members .stream ().filter (m -> !m .uuid .equals (leader .uuid ) && !m .uuid .equals (vice .uuid ) && !m .isActive ()).map (m -> nationMembersListEntry (nation , m , sender )).toList ();
217+ list .addAll (inactive );
218+
219+ final @ NotNull TextComponent .Builder listComponent = Component .text ();
220+ for (int i = 0 ; i < list .size (); i ++) {
221+ listComponent .append (list .get (i ));
222+ if (i + 1 < list .size ()) listComponent .append (Component .newline ());
223+ }
224+
225+ return Component .text ().append (header ).append (Component .newline ()).append (listComponent .build ()).build ();
226+ }
227+
228+ private @ NotNull Component nationMembersListEntry (final @ NotNull Nation nation , final @ NotNull Member member , final @ NotNull Permissible sender ) {
229+ if (member .uuid .equals (nation .leaderUUID )) {
230+ return MiniMessage .miniMessage ()
231+ .deserialize (Objects .requireNonNull (config .getString ("nation.members.list.entry.leader" ))
232+ .replaceAll ("<color>" , "<#" + nation .color + ">" )
233+ .replaceAll ("</color>" , "</#" + nation .color + ">" )
234+ .replaceAll ("<member-name>" , Optional .ofNullable (member .player ().getName ()).orElse (member .uuid .toString ())),
235+ Placeholder .component ("member-status" , nationMembersStatus (member )),
236+ Placeholder .component ("buttons" , nationMembersListButtons (nation , member , sender ))
237+ );
238+ }
239+ if (member .uuid .equals (nation .viceLeaderUUID )) {
240+ return MiniMessage .miniMessage ()
241+ .deserialize (Objects .requireNonNull (config .getString ("nation.members.list.entry.vice" ))
242+ .replaceAll ("<color>" , "<#" + nation .color + ">" )
243+ .replaceAll ("</color>" , "</#" + nation .color + ">" )
244+ .replaceAll ("<member-name>" , Optional .ofNullable (member .player ().getName ()).orElse (member .uuid .toString ())),
245+ Placeholder .component ("member-status" , nationMembersStatus (member )),
246+ Placeholder .component ("buttons" , nationMembersListButtons (nation , member , sender ))
247+ );
248+ }
249+ if (member .isActive ()) {
250+ return MiniMessage .miniMessage ()
251+ .deserialize (Objects .requireNonNull (config .getString ("nation.members.list.entry.citizen" ))
252+ .replaceAll ("<color>" , "<#" + nation .color + ">" )
253+ .replaceAll ("</color>" , "</#" + nation .color + ">" )
254+ .replaceAll ("<member-name>" , Optional .ofNullable (member .player ().getName ()).orElse (member .uuid .toString ())),
255+ Placeholder .component ("member-status" , nationMembersStatus (member )),
256+ Placeholder .component ("buttons" , nationMembersListButtons (nation , member , sender ))
257+ );
258+ }
259+ return MiniMessage .miniMessage ()
260+ .deserialize (Objects .requireNonNull (config .getString ("nation.members.list.entry.inactive-citizen" ))
261+ .replaceAll ("<color>" , "<#" + nation .color + ">" )
262+ .replaceAll ("</color>" , "</#" + nation .color + ">" )
263+ .replaceAll ("<member-name>" , Optional .ofNullable (member .player ().getName ()).orElse (member .uuid .toString ())),
264+ Placeholder .component ("member-status" , nationMembersStatus (member )),
265+ Placeholder .component ("buttons" , nationMembersListButtons (nation , member , sender ))
266+ );
267+ }
268+
269+ private @ NotNull Component nationMembersListButtons (final @ NotNull Nation nation , final @ NotNull Member member , final @ NotNull Permissible sender ) {
270+ final @ NotNull List <@ NotNull Component > buttons = new ArrayList <>();
271+ if (sender .hasPermission (Permission .NATION_MEMBERS_KICK ) && !(member .uuid .equals (nation .leaderUUID ) || member .uuid .equals (nation .viceLeaderUUID )))
272+ buttons .add (nationMembersListButton ("kick" , nation , member ));
273+ if (sender .hasPermission (Permission .NATION_VICE_DEMOTE ) && member .uuid .equals (nation .viceLeaderUUID ) && !member .uuid .equals (nation .leaderUUID ))
274+ buttons .add (nationMembersListButton ("demote" , nation , member ));
275+ if (sender .hasPermission (Permission .NATION_VICE_PROMOTE ) && nation .viceLeaderUUID .equals (nation .leaderUUID ) && !(member .uuid .equals (nation .leaderUUID ) || member .uuid .equals (nation .viceLeaderUUID )) && member .isActive ())
276+ buttons .add (nationMembersListButton ("promote" , nation , member ));
277+
278+ final @ NotNull TextComponent .Builder buttonsComponent = Component .text ();
279+ if (!buttons .isEmpty ()) buttonsComponent .append (MiniMessage .miniMessage ().deserialize (Objects .requireNonNull (config .getString ("nation.members.list.buttons.prefix" ))));
280+ for (int i = 0 ; i < buttons .size (); i ++) {
281+ buttonsComponent .append (buttons .get (i ));
282+ if (i + 1 < buttons .size ()) buttonsComponent .append (MiniMessage .miniMessage ().deserialize (Objects .requireNonNull (config .getString ("nation.members.list.buttons.separator" ))));
283+ }
284+ if (!buttons .isEmpty ()) buttonsComponent .append (MiniMessage .miniMessage ().deserialize (Objects .requireNonNull (config .getString ("nation.members.list.buttons.suffix" ))));
285+
286+ return Component .text ().append (buttonsComponent .build ()).build ();
287+ }
288+
289+ private @ NotNull Component nationMembersListButton (final @ NotNull String button , final @ NotNull Nation nation , final @ NotNull Member member ) {
290+ return MiniMessage .miniMessage ()
291+ .deserialize (Objects .requireNonNull (config .getString ("nation.members.list.buttons." + button ))
292+ .replaceAll ("<color>" , "<#" + nation .color + ">" )
293+ .replaceAll ("</color>" , "</#" + nation .color + ">" )
294+ .replaceAll ("<member-name>" , Optional .ofNullable (member .player ().getName ()).orElse (member .uuid .toString ())));
202295 }
203296
204297 // errors
0 commit comments