aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-API-Patches/0056-Basic-PlayerProfile-API.patch
blob: 0786ec966cd87053c7ff50e40525c77000f1d0a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
From 7def00d86d228835b95d99b7526e25e62064723a Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Mon, 15 Jan 2018 21:46:46 -0500
Subject: [PATCH] Basic PlayerProfile API

Provides basic elements of a PlayerProfile to be used by future API/events

diff --git a/src/main/java/com/destroystokyo/paper/profile/PlayerProfile.java b/src/main/java/com/destroystokyo/paper/profile/PlayerProfile.java
new file mode 100644
index 00000000..476151d2
--- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/profile/PlayerProfile.java
@@ -0,0 +1,145 @@
+package com.destroystokyo.paper.profile;
+
+import java.util.Collection;
+import java.util.Set;
+import java.util.UUID;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Represents a players profile for the game, such as UUID, Name, and textures.
+ */
+public interface PlayerProfile {
+
+    /**
+     * @return The players name, if set
+     */
+    @Nullable
+    String getName();
+
+    /**
+     * Sets this profiles Name
+     *
+     * @param name The new Name
+     * @return The previous Name
+     */
+    @NotNull
+    String setName(@Nullable String name);
+
+    /**
+     * @return The players unique identifier, if set
+     */
+    @Nullable UUID getId();
+
+    /**
+     * Sets this profiles UUID
+     *
+     * @param uuid The new UUID
+     * @return The previous UUID
+     */
+    @Nullable
+    UUID setId(@Nullable UUID uuid);
+
+    /**
+     * @return A Mutable set of this players properties, such as textures.
+     * Values specified here are subject to implementation details.
+     */
+    @NotNull Set<ProfileProperty> getProperties();
+
+    /**
+     * Check if the Profile has the specified property
+     * @param property Property name to check
+     * @return If the property is set
+     */
+    boolean hasProperty(@Nullable String property);
+
+    /**
+     * Sets a property. If the property already exists, the previous one will be replaced
+     * @param property Property to set.
+     */
+    void setProperty(@NotNull ProfileProperty property);
+
+    /**
+     * Sets multiple properties. If any of the set properties already exist, it will be replaced
+     * @param properties The properties to set
+     */
+    void setProperties(@NotNull Collection<ProfileProperty> properties);
+
+    /**
+     * Removes a specific property from this profile
+     * @param property The property to remove
+     * @return If a property was removed
+     */
+    boolean removeProperty(@Nullable String property);
+
+    /**
+     * Removes a specific property from this profile
+     * @param property The property to remove
+     * @return If a property was removed
+     */
+    default boolean removeProperty(@NotNull ProfileProperty property) {
+        return removeProperty(property.getName());
+    }
+
+    /**
+     * Removes all properties in the collection
+     * @param properties The properties to remove
+     * @return If any property was removed
+     */
+    default boolean removeProperties(@NotNull Collection<ProfileProperty> properties) {
+        boolean removed = false;
+        for (ProfileProperty property : properties) {
+            if (removeProperty(property)) {
+                removed = true;
+            }
+        }
+        return removed;
+    }
+
+    /**
+     * Clears all properties on this profile
+     */
+    void clearProperties();
+
+    /**
+     * @return If the profile is now complete (has UUID and Name)
+     */
+    boolean isComplete();
+
+    /**
+     * Like {@link #complete(boolean)} but will try only from cache, and not make network calls
+     * Does not account for textures.
+     *
+     * @return If the profile is now complete (has UUID and Name)
+     */
+    boolean completeFromCache();
+
+    /**
+     * If this profile is not complete, then make the API call to complete it.
+     * This is a blocking operation and should be done asynchronously.
+     *
+     * This will also complete textures. If you do not want to load textures, use {{@link #complete(boolean)}}
+     * @return If the profile is now complete (has UUID and Name) (if you get rate limited, this operation may fail)
+     */
+    default boolean complete() {
+        return complete(true);
+    }
+
+    /**
+     * If this profile is not complete, then make the API call to complete it.
+     * This is a blocking operation and should be done asynchronously.
+     *
+     * Optionally will also fill textures.
+     * @param textures controls if we should fill the profile with texture properties
+     * @return If the profile is now complete (has UUID and Name) (if you get rate limited, this operation may fail)
+     */
+    boolean complete(boolean textures);
+
+    /**
+     * Whether or not this Profile has textures associated to it
+     * @return If has a textures property
+     */
+    default boolean hasTextures() {
+        return hasProperty("textures");
+    }
+}
diff --git a/src/main/java/com/destroystokyo/paper/profile/ProfileProperty.java b/src/main/java/com/destroystokyo/paper/profile/ProfileProperty.java
new file mode 100644
index 00000000..7b3b6ef5
--- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/profile/ProfileProperty.java
@@ -0,0 +1,72 @@
+package com.destroystokyo.paper.profile;
+
+import com.google.common.base.Preconditions;
+
+import java.util.Objects;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Represents a property on a {@link PlayerProfile}
+ */
+public class ProfileProperty {
+    private final String name;
+    private final String value;
+    private final String signature;
+
+    public ProfileProperty(@NotNull String name, @NotNull String value) {
+        this(name, value, null);
+    }
+
+    public ProfileProperty(@NotNull String name, @NotNull String value, @Nullable String signature) {
+        this.name = Preconditions.checkNotNull(name, "ProfileProperty name can not be null");
+        this.value = Preconditions.checkNotNull(value, "ProfileProperty value can not be null");
+        this.signature = signature;
+    }
+
+    /**
+     * @return The property name, ie "textures"
+     */
+    @NotNull
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * @return The property value, likely to be base64 encoded
+     */
+    @NotNull
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * @return A signature from Mojang for signed properties
+     */
+    @Nullable
+    public String getSignature() {
+        return signature;
+    }
+
+    /**
+     * @return If this property has a signature or not
+     */
+    public boolean isSigned() {
+        return this.signature != null;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        ProfileProperty that = (ProfileProperty) o;
+        return Objects.equals(name, that.name) &&
+                Objects.equals(value, that.value) &&
+                Objects.equals(signature, that.signature);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(name);
+    }
+}
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
index 92bc8eb6..7c97b11b 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
@@ -1572,6 +1572,40 @@ public final class Bukkit {
     public static boolean suggestPlayerNamesWhenNullTabCompletions() {
         return server.suggestPlayerNamesWhenNullTabCompletions();
     }
+
+    /**
+     * Creates a PlayerProfile for the specified uuid, with name as null
+     * @param uuid UUID to create profile for
+     * @return A PlayerProfile object
+     */
+    @NotNull
+    public static com.destroystokyo.paper.profile.PlayerProfile createProfile(@NotNull UUID uuid) {
+        return server.createProfile(uuid);
+    }
+
+    /**
+     * Creates a PlayerProfile for the specified name, with UUID as null
+     * @param name Name to create profile for
+     * @return A PlayerProfile object
+     */
+    @NotNull
+    public static com.destroystokyo.paper.profile.PlayerProfile createProfile(@NotNull String name) {
+        return server.createProfile(name);
+    }
+
+    /**
+     * Creates a PlayerProfile for the specified name/uuid
+     *
+     * Both UUID and Name can not be null at same time. One must be supplied.
+     *
+     * @param uuid UUID to create profile for
+     * @param name Name to create profile for
+     * @return A PlayerProfile object
+     */
+    @NotNull
+    public static com.destroystokyo.paper.profile.PlayerProfile createProfile(@Nullable UUID uuid, @Nullable String name) {
+        return server.createProfile(uuid, name);
+    }
     // Paper end
 
     @NotNull
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
index 9fa704e3..bf75e6a2 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
@@ -1377,5 +1377,33 @@ public interface Server extends PluginMessageRecipient {
      * @return true if player names should be suggested
      */
     boolean suggestPlayerNamesWhenNullTabCompletions();
+
+    /**
+     * Creates a PlayerProfile for the specified uuid, with name as null
+     * @param uuid UUID to create profile for
+     * @return A PlayerProfile object
+     */
+    @NotNull
+    com.destroystokyo.paper.profile.PlayerProfile createProfile(@NotNull UUID uuid);
+
+    /**
+     * Creates a PlayerProfile for the specified name, with UUID as null
+     * @param name Name to create profile for
+     * @return A PlayerProfile object
+     */
+    @NotNull
+    com.destroystokyo.paper.profile.PlayerProfile createProfile(@NotNull String name);
+
+    /**
+     * Creates a PlayerProfile for the specified name/uuid
+     *
+     * Both UUID and Name can not be null at same time. One must be supplied.
+     *
+     * @param uuid UUID to create profile for
+     * @param name Name to create profile for
+     * @return A PlayerProfile object
+     */
+    @NotNull
+    com.destroystokyo.paper.profile.PlayerProfile createProfile(@Nullable UUID uuid, @Nullable String name);
     // Paper end
 }
-- 
2.21.0