1- package dev .pgm .community .util ;
1+ package dev .pgm .community .nick ;
22
33import static dev .pgm .community .util .PlayerUtils .PLAYER_UTILS ;
44
55import java .util .Collection ;
66import java .util .HashMap ;
7+ import java .util .HashSet ;
78import java .util .Map ;
89import java .util .UUID ;
910import org .bukkit .entity .Player ;
1213import tc .oc .pgm .util .skin .Skin ;
1314
1415@ NullMarked
15- public final class FakeIdentityStore {
16- public static final FakeIdentityStore fakeIdentityStore = new FakeIdentityStore ();
16+ public final class PlayerIdentity {
17+ public static final int MAX_NICK_LENGTH = 16 ;
18+ public static final PlayerIdentity PLAYER_IDENTITY = new PlayerIdentity ();
1719
1820 private final Map <UUID , Map <UUID , Skin >> playerSkins = new HashMap <>();
1921 private final Map <UUID , Map <UUID , String >> playerNames = new HashMap <>();
2022 private final Map <UUID , Map <UUID , String >> playerDisplayNames = new HashMap <>();
21- private final Map <UUID , Map <String , String >> viewerEntryTeams = new HashMap <>();
23+ private final Map <UUID , Map <String , HashSet < String >>> viewerTeamEntries = new HashMap <>();
2224 private final Map <UUID , Map <String , String >> viewerVisibleNames = new HashMap <>();
2325
24- private FakeIdentityStore () {}
26+ private PlayerIdentity () {}
2527
2628 public void set (
2729 Player player ,
2830 Player viewer ,
2931 @ Nullable String displayName ,
3032 @ Nullable String nick ,
3133 @ Nullable Skin skin ) {
34+ validateNick (nick );
35+
3236 UUID playerId = player .getUniqueId ();
3337 UUID viewerId = viewer .getUniqueId ();
3438
@@ -52,6 +56,13 @@ private static <T> void set(
5256 identities .computeIfAbsent (playerId , k -> new HashMap <>()).put (viewerId , value );
5357 }
5458
59+ public static void validateNick (@ Nullable String name ) {
60+ if (name != null && name .length () > MAX_NICK_LENGTH ) {
61+ throw new IllegalArgumentException (
62+ "Player nick names are limited to " + MAX_NICK_LENGTH + " characters in length" );
63+ }
64+ }
65+
5566 public void clearPlayer (UUID playerId , String realName ) {
5667 playerSkins .remove (playerId );
5768 playerNames .remove (playerId );
@@ -66,7 +77,7 @@ public void clearViewer(UUID viewerId) {
6677 clearViewer (playerSkins , viewerId );
6778 clearViewer (playerNames , viewerId );
6879 clearViewer (playerDisplayNames , viewerId );
69- viewerEntryTeams .remove (viewerId );
80+ viewerTeamEntries .remove (viewerId );
7081 viewerVisibleNames .remove (viewerId );
7182 }
7283
@@ -81,7 +92,7 @@ public void clearAll() {
8192 playerSkins .clear ();
8293 playerNames .clear ();
8394 playerDisplayNames .clear ();
84- viewerEntryTeams .clear ();
95+ viewerTeamEntries .clear ();
8596 viewerVisibleNames .clear ();
8697 }
8798
@@ -108,12 +119,22 @@ private void clearVisibleName(UUID viewerId, String realName) {
108119 }
109120
110121 public @ Nullable String getTeamName (UUID viewerId , String entry ) {
111- Map <String , String > entryTeams = viewerEntryTeams .get (viewerId );
112- return entryTeams == null ? null : entryTeams .get (entry );
122+ Map <String , HashSet <String >> teamEntries = viewerTeamEntries .get (viewerId );
123+ if (teamEntries == null ) return null ;
124+
125+ for (Map .Entry <String , HashSet <String >> team : teamEntries .entrySet ()) {
126+ if (team .getValue ().contains (entry )) return team .getKey ();
127+ }
128+
129+ return null ;
113130 }
114131
115132 public boolean hasTeamEntry (UUID viewerId , String teamName , String entry ) {
116- return teamName .equals (getTeamName (viewerId , entry ));
133+ Map <String , HashSet <String >> teamEntries = viewerTeamEntries .get (viewerId );
134+ if (teamEntries == null ) return false ;
135+
136+ HashSet <String > entries = teamEntries .get (teamName );
137+ return entries != null && entries .contains (entry );
117138 }
118139
119140 public void createTeam (UUID viewerId , String teamName , Collection <String > entries ) {
@@ -122,27 +143,33 @@ public void createTeam(UUID viewerId, String teamName, Collection<String> entrie
122143 }
123144
124145 public void removeTeam (UUID viewerId , String teamName ) {
125- Map <String , String > entryTeams = viewerEntryTeams .get (viewerId );
126- if (entryTeams == null ) return ;
146+ Map <String , HashSet < String >> teamEntries = viewerTeamEntries .get (viewerId );
147+ if (teamEntries == null ) return ;
127148
128- entryTeams . values (). removeIf ( teamName :: equals );
129- if (entryTeams .isEmpty ()) viewerEntryTeams .remove (viewerId );
149+ teamEntries . remove ( teamName );
150+ if (teamEntries .isEmpty ()) viewerTeamEntries .remove (viewerId );
130151 }
131152
132153 public void addTeamEntries (UUID viewerId , String teamName , Collection <String > entries ) {
133154 if (entries .isEmpty ()) return ;
134155
135- Map <String , String > entryTeams =
136- viewerEntryTeams .computeIfAbsent (viewerId , k -> new HashMap <>());
137- entries .forEach (entry -> entryTeams .put (entry , teamName ));
156+ Map <String , HashSet <String >> teamEntries =
157+ viewerTeamEntries .computeIfAbsent (viewerId , k -> new HashMap <>());
158+ teamEntries .values ().forEach (team -> team .removeAll (entries ));
159+ teamEntries .values ().removeIf (Collection ::isEmpty );
160+ teamEntries .computeIfAbsent (teamName , k -> new HashSet <>()).addAll (entries );
138161 }
139162
140163 public void removeTeamEntries (UUID viewerId , String teamName , Collection <String > entries ) {
141- Map <String , String > entryTeams = viewerEntryTeams .get (viewerId );
142- if (entryTeams == null ) return ;
164+ Map <String , HashSet < String >> teamEntries = viewerTeamEntries .get (viewerId );
165+ if (teamEntries == null ) return ;
143166
144- entries .forEach (entry -> entryTeams .remove (entry , teamName ));
145- if (entryTeams .isEmpty ()) viewerEntryTeams .remove (viewerId );
167+ HashSet <String > team = teamEntries .get (teamName );
168+ if (team == null ) return ;
169+
170+ team .removeAll (entries );
171+ if (team .isEmpty ()) teamEntries .remove (teamName );
172+ if (teamEntries .isEmpty ()) viewerTeamEntries .remove (viewerId );
146173 }
147174
148175 public String getDisplayName (Player player , Player viewer ) {
@@ -152,20 +179,33 @@ public String getDisplayName(Player player, Player viewer) {
152179 return player .getDisplayName ();
153180 }
154181
182+ public boolean hasDisplayName (Player player , Player viewer ) {
183+ return get (playerDisplayNames , player .getUniqueId (), viewer .getUniqueId ()) != null ;
184+ }
185+
155186 public String getName (Player player , Player viewer ) {
156187 String name = get (playerNames , player .getUniqueId (), viewer .getUniqueId ());
157188 if (name != null ) return name ;
158189
159190 return player .getName ();
160191 }
161192
193+ public boolean hasName (Player player , Player viewer ) {
194+ return get (playerNames , player .getUniqueId (), viewer .getUniqueId ()) != null ;
195+ }
196+
162197 public Skin getSkin (Player player , Player viewer ) {
163198 Skin skin = get (playerSkins , player .getUniqueId (), viewer .getUniqueId ());
164199 if (skin != null && !skin .isEmpty ()) return skin ;
165200
166201 return PLAYER_UTILS .getPlayerSkin (player );
167202 }
168203
204+ public boolean hasSkin (Player player , Player viewer ) {
205+ Skin skin = get (playerSkins , player .getUniqueId (), viewer .getUniqueId ());
206+ return skin != null && !skin .isEmpty ();
207+ }
208+
169209 private static <T > @ Nullable T get (
170210 Map <UUID , Map <UUID , T >> identities , UUID playerId , UUID viewerId ) {
171211 Map <UUID , T > viewers = identities .get (playerId );
0 commit comments