@@ -129,6 +129,7 @@ public boolean citizens(
129129 case "list" -> listCitizens (member , nation , sender );
130130 case "kick" -> kickCitizen (member , nation , sender , command , argsSubset );
131131 case "invite" -> inviteCitizen (member , nation , sender , command , argsSubset );
132+ case "add" -> addCitizen (member , nation , sender , command , argsSubset );
132133 default -> citizensSubcommand (member , nation , sender , "/" + label );
133134 };
134135 }
@@ -171,6 +172,14 @@ public boolean citizensSubcommand(
171172 }, "Invite to join nation."
172173 ));
173174
175+ if ((!other && sender .hasPermission (Permission .NATION_CITIZEN_ADD ))
176+ || sender .hasPermission (Permission .NATION_CITIZEN_ADD_OTHER ))
177+ subCommandBuilder .append (Component .newline ()).append (SMPCore .messages ().subCommandEntry (
178+ label + " add " , "add" , new Messages .SubCommandArgument []{
179+ new Messages .SubCommandArgument ("member" , true )
180+ }, "Add member to nation."
181+ ));
182+
174183 return sendMessage (sender , subCommandBuilder .build ());
175184 }
176185
@@ -268,6 +277,45 @@ public boolean inviteCitizen(
268277 return true ;
269278 }
270279
280+ public boolean addCitizen (
281+ final @ Nullable Member member ,
282+ final @ NotNull Nation nation ,
283+ final @ NotNull CommandSender sender ,
284+ final @ NotNull String label ,
285+ final @ NotNull String @ NotNull [] args
286+ ) {
287+ if (
288+ !sender .hasPermission (Permission .NATION_CITIZEN_ADD )
289+ || (
290+ (member == null || !nation .id .equals (member .nationID ))
291+ && !sender .hasPermission (Permission .NATION_CITIZEN_ADD_OTHER )
292+ )
293+ )
294+ return sendMessage (sender , SMPCore .messages ().errorNoPermission ());
295+
296+ if (args .length < 1 )
297+ return sendMessage (sender , SMPCore .messages ().usage (label , "<member>" ));
298+
299+ final @ NotNull var targetPlayer = sender .getServer ().getOfflinePlayer (args [0 ]);
300+ final @ NotNull var target = Member .get (targetPlayer );
301+
302+ if (target .isEmpty ())
303+ return sendMessage (sender , SMPCore .messages ().errorNotMember (targetPlayer ));
304+
305+ if (nation .id .equals (target .get ().nationID ))
306+ return sendMessage (sender , SMPCore .messages ().errorAlreadyCitizen (target .get ()));
307+
308+ if (target .get ().nationID != null && !sender .hasPermission (Permission .NATION_CITIZEN_ADD_SWITCH ))
309+ return sendMessage (sender , SMPCore .messages ().errorOtherCitizen (target .get ()));
310+
311+ final var currentNation = target .get ().nation ().orElseThrow (() -> new IllegalStateException ("Could not find nation " + target .get ().nationID + " of member " + target .get ().uuid ));
312+ if (currentNation .leaderUUID .equals (targetPlayer .getUniqueId ()))
313+ return sendMessage (sender , SMPCore .messages ().errorKickLeadership ());
314+
315+ nation .add (target .get ());
316+ return true ;
317+ }
318+
271319 public boolean join (
272320 final @ Nullable Member member ,
273321 final @ NotNull CommandSender sender ,
0 commit comments