fn: Add general SkinGenerationRequest class

This commit is contained in:
Oliver
2025-04-17 21:58:22 +02:00
parent 2b485302df
commit 6cbf0df897
5 changed files with 74 additions and 35 deletions

View File

@@ -2,11 +2,13 @@ package de.oliver.fancynpcs.skins;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
public interface SkinGenerationQueue<R> { public interface SkinGenerationQueue {
void run(); void run();
void add(R request); void add(SkinGenerationRequest request);
void clear();
ScheduledFuture<?> getScheduler(); ScheduledFuture<?> getScheduler();
} }

View File

@@ -0,0 +1,35 @@
package de.oliver.fancynpcs.skins;
import de.oliver.fancynpcs.api.skins.SkinData;
import org.mineskin.request.GenerateRequest;
public class SkinGenerationRequest {
private final String id;
private final SkinData.SkinVariant variant;
private final GenerateRequest mineskinRequest;
public SkinGenerationRequest(String id, SkinData.SkinVariant variant, GenerateRequest mineskinRequest) {
this.id = id;
this.variant = variant;
this.mineskinRequest = mineskinRequest;
}
public SkinGenerationRequest(String id, SkinData.SkinVariant variant) {
this.id = id;
this.variant = variant;
this.mineskinRequest = null;
}
public String getID() {
return id;
}
public SkinData.SkinVariant getVariant() {
return variant;
}
public GenerateRequest getMineskinRequest() {
return mineskinRequest;
}
}

View File

@@ -10,8 +10,6 @@ import de.oliver.fancynpcs.api.skins.SkinLoadException;
import de.oliver.fancynpcs.api.skins.SkinManager; import de.oliver.fancynpcs.api.skins.SkinManager;
import de.oliver.fancynpcs.skins.cache.SkinCache; import de.oliver.fancynpcs.skins.cache.SkinCache;
import de.oliver.fancynpcs.skins.cache.SkinCacheData; import de.oliver.fancynpcs.skins.cache.SkinCacheData;
import de.oliver.fancynpcs.skins.mineskin.MineSkinQueue;
import de.oliver.fancynpcs.skins.mojang.MojangQueue;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.lushplugins.chatcolorhandler.ChatColorHandler; import org.lushplugins.chatcolorhandler.ChatColorHandler;
@@ -37,10 +35,10 @@ public class SkinManagerImpl implements SkinManager, Listener {
private final SkinCache fileCache; private final SkinCache fileCache;
private final SkinCache memCache; private final SkinCache memCache;
private final SkinGenerationQueue<MojangQueue.SkinRequest> mojangQueue; private final SkinGenerationQueue mojangQueue;
private final SkinGenerationQueue<MineSkinQueue.SkinRequest> mineSkinQueue; private final SkinGenerationQueue mineSkinQueue;
public SkinManagerImpl(SkinCache fileCache, SkinCache memCache, SkinGenerationQueue<MojangQueue.SkinRequest> mojangQueue, SkinGenerationQueue<MineSkinQueue.SkinRequest> mineSkinQueue) { public SkinManagerImpl(SkinCache fileCache, SkinCache memCache, SkinGenerationQueue mojangQueue, SkinGenerationQueue mineSkinQueue) {
this.fileCache = fileCache; this.fileCache = fileCache;
this.memCache = memCache; this.memCache = memCache;
this.mojangQueue = mojangQueue; this.mojangQueue = mojangQueue;
@@ -86,7 +84,7 @@ public class SkinManagerImpl implements SkinManager, Listener {
return cached; return cached;
} }
mojangQueue.add(new MojangQueue.SkinRequest(uuid.toString(), variant)); mojangQueue.add(new SkinGenerationRequest(uuid.toString(), variant));
// GenerateRequest genReq = GenerateRequest.user(uuid); // GenerateRequest genReq = GenerateRequest.user(uuid);
// genReq.variant(Variant.valueOf(variant.name())); // genReq.variant(Variant.valueOf(variant.name()));
@@ -124,7 +122,7 @@ public class SkinManagerImpl implements SkinManager, Listener {
throw new SkinLoadException(SkinLoadException.Reason.INVALID_URL, "(URL = '" + url + "')"); throw new SkinLoadException(SkinLoadException.Reason.INVALID_URL, "(URL = '" + url + "')");
} }
genReq.variant(Variant.valueOf(variant.name())); genReq.variant(Variant.valueOf(variant.name()));
mineSkinQueue.add(new MineSkinQueue.SkinRequest(url, genReq)); mineSkinQueue.add(new SkinGenerationRequest(url, variant, genReq));
return new SkinData(url, variant); return new SkinData(url, variant);
} }
@@ -142,7 +140,7 @@ public class SkinManagerImpl implements SkinManager, Listener {
GenerateRequest genReq = GenerateRequest.upload(file); GenerateRequest genReq = GenerateRequest.upload(file);
genReq.variant(Variant.valueOf(variant.name())); genReq.variant(Variant.valueOf(variant.name()));
mineSkinQueue.add(new MineSkinQueue.SkinRequest(filePath, genReq)); mineSkinQueue.add(new SkinGenerationRequest(filePath, variant, genReq));
return new SkinData(filePath, variant); return new SkinData(filePath, variant);
} }

View File

@@ -4,21 +4,21 @@ import de.oliver.fancynpcs.FancyNpcs;
import de.oliver.fancynpcs.api.skins.SkinData; import de.oliver.fancynpcs.api.skins.SkinData;
import de.oliver.fancynpcs.api.skins.SkinGeneratedEvent; import de.oliver.fancynpcs.api.skins.SkinGeneratedEvent;
import de.oliver.fancynpcs.skins.SkinGenerationQueue; import de.oliver.fancynpcs.skins.SkinGenerationQueue;
import de.oliver.fancynpcs.skins.SkinGenerationRequest;
import de.oliver.fancynpcs.skins.SkinManagerImpl; import de.oliver.fancynpcs.skins.SkinManagerImpl;
import org.mineskin.data.SkinInfo; import org.mineskin.data.SkinInfo;
import org.mineskin.data.Variant; import org.mineskin.data.Variant;
import org.mineskin.request.GenerateRequest;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.Queue; import java.util.Queue;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class MineSkinQueue implements SkinGenerationQueue<MineSkinQueue.SkinRequest> { public class MineSkinQueue implements SkinGenerationQueue {
private static MineSkinQueue INSTANCE; private static MineSkinQueue INSTANCE;
private final MineSkinAPI api; private final MineSkinAPI api;
private final Queue<SkinRequest> queue; private final Queue<SkinGenerationRequest> queue;
private ScheduledFuture<?> scheduler; private ScheduledFuture<?> scheduler;
private long nextRequestTime = System.currentTimeMillis(); private long nextRequestTime = System.currentTimeMillis();
@@ -38,6 +38,7 @@ public class MineSkinQueue implements SkinGenerationQueue<MineSkinQueue.SkinRequ
return INSTANCE; return INSTANCE;
} }
@Override
public void run() { public void run() {
scheduler = SkinManagerImpl.EXECUTOR.scheduleWithFixedDelay(this::poll, 5, 1, TimeUnit.SECONDS); scheduler = SkinManagerImpl.EXECUTOR.scheduleWithFixedDelay(this::poll, 5, 1, TimeUnit.SECONDS);
} }
@@ -52,26 +53,26 @@ public class MineSkinQueue implements SkinGenerationQueue<MineSkinQueue.SkinRequ
return; return;
} }
SkinRequest req = this.queue.poll(); SkinGenerationRequest req = this.queue.poll();
if (req == null) { if (req == null) {
return; return;
} }
try { try {
FancyNpcs.getInstance().getFancyLogger().debug("Fetching skin from MineSkin: " + req.id()); FancyNpcs.getInstance().getFancyLogger().debug("Fetching skin from MineSkin: " + req.getID());
SkinInfo skin = this.api.generateSkin(req.request()); SkinInfo skin = this.api.generateSkin(req.getMineskinRequest());
if (skin == null) { if (skin == null) {
this.nextRequestTime = System.currentTimeMillis(); this.nextRequestTime = System.currentTimeMillis();
return; return;
} }
SkinData skinData = new SkinData( SkinData skinData = new SkinData(
req.id(), req.getID(),
skin.variant() == Variant.SLIM ? SkinData.SkinVariant.SLIM : SkinData.SkinVariant.AUTO, skin.variant() == Variant.SLIM ? SkinData.SkinVariant.SLIM : SkinData.SkinVariant.AUTO,
skin.texture().data().value(), skin.texture().data().value(),
skin.texture().data().signature() skin.texture().data().signature()
); );
new SkinGeneratedEvent(req.id(), skinData).callEvent(); new SkinGeneratedEvent(req.getID(), skinData).callEvent();
} catch (RatelimitException e) { } catch (RatelimitException e) {
this.nextRequestTime = e.getNextRequestTime(); this.nextRequestTime = e.getNextRequestTime();
this.queue.add(req); this.queue.add(req);
@@ -82,10 +83,11 @@ public class MineSkinQueue implements SkinGenerationQueue<MineSkinQueue.SkinRequ
this.nextRequestTime = System.currentTimeMillis(); this.nextRequestTime = System.currentTimeMillis();
} }
public void add(SkinRequest req) { @Override
public void add(SkinGenerationRequest req) {
// check if request is already in queue // check if request is already in queue
for (SkinRequest r : this.queue) { for (SkinGenerationRequest r : this.queue) {
if (r.id().equals(req.id())) { if (r.getID().equals(req.getID())) {
return; return;
} }
} }
@@ -93,14 +95,14 @@ public class MineSkinQueue implements SkinGenerationQueue<MineSkinQueue.SkinRequ
this.queue.add(req); this.queue.add(req);
} }
@Override
public void clear() { public void clear() {
this.queue.clear(); this.queue.clear();
} }
@Override
public ScheduledFuture<?> getScheduler() { public ScheduledFuture<?> getScheduler() {
return scheduler; return scheduler;
} }
public record SkinRequest(String id, GenerateRequest request) {
}
} }

View File

@@ -4,6 +4,7 @@ import de.oliver.fancynpcs.FancyNpcs;
import de.oliver.fancynpcs.api.skins.SkinData; import de.oliver.fancynpcs.api.skins.SkinData;
import de.oliver.fancynpcs.api.skins.SkinGeneratedEvent; import de.oliver.fancynpcs.api.skins.SkinGeneratedEvent;
import de.oliver.fancynpcs.skins.SkinGenerationQueue; import de.oliver.fancynpcs.skins.SkinGenerationQueue;
import de.oliver.fancynpcs.skins.SkinGenerationRequest;
import de.oliver.fancynpcs.skins.SkinManagerImpl; import de.oliver.fancynpcs.skins.SkinManagerImpl;
import de.oliver.fancynpcs.skins.mineskin.RatelimitException; import de.oliver.fancynpcs.skins.mineskin.RatelimitException;
@@ -12,11 +13,11 @@ import java.util.Queue;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class MojangQueue implements SkinGenerationQueue<MojangQueue.SkinRequest> { public class MojangQueue implements SkinGenerationQueue {
private static MojangQueue INSTANCE; private static MojangQueue INSTANCE;
private final Queue<SkinRequest> queue; private final Queue<SkinGenerationRequest> queue;
private final MojangAPI api; private final MojangAPI api;
private ScheduledFuture<?> scheduler; private ScheduledFuture<?> scheduler;
private long nextRequestTime = System.currentTimeMillis(); private long nextRequestTime = System.currentTimeMillis();
@@ -36,6 +37,7 @@ public class MojangQueue implements SkinGenerationQueue<MojangQueue.SkinRequest>
return INSTANCE; return INSTANCE;
} }
@Override
public void run() { public void run() {
scheduler = SkinManagerImpl.EXECUTOR.scheduleWithFixedDelay(this::pollMany, 5, 1, TimeUnit.SECONDS); scheduler = SkinManagerImpl.EXECUTOR.scheduleWithFixedDelay(this::pollMany, 5, 1, TimeUnit.SECONDS);
} }
@@ -56,15 +58,15 @@ public class MojangQueue implements SkinGenerationQueue<MojangQueue.SkinRequest>
return; return;
} }
SkinRequest req = this.queue.poll(); SkinGenerationRequest req = this.queue.poll();
if (req == null) { if (req == null) {
return; return;
} }
try { try {
FancyNpcs.getInstance().getFancyLogger().debug("Fetching skin from Mojang: " + req.uuid()); FancyNpcs.getInstance().getFancyLogger().debug("Fetching skin from Mojang: " + req.getID());
SkinData skinData = this.api.fetchSkin(req.uuid(), req.variant()); SkinData skinData = this.api.fetchSkin(req.getID(), req.getVariant());
new SkinGeneratedEvent(req.uuid(), skinData).callEvent(); new SkinGeneratedEvent(req.getID(), skinData).callEvent();
} catch (RatelimitException e) { } catch (RatelimitException e) {
this.nextRequestTime = e.getNextRequestTime(); this.nextRequestTime = e.getNextRequestTime();
this.queue.add(req); this.queue.add(req);
@@ -75,10 +77,11 @@ public class MojangQueue implements SkinGenerationQueue<MojangQueue.SkinRequest>
this.nextRequestTime = System.currentTimeMillis(); this.nextRequestTime = System.currentTimeMillis();
} }
public void add(SkinRequest req) { @Override
public void add(SkinGenerationRequest req) {
// check if request is already in queue // check if request is already in queue
for (SkinRequest r : this.queue) { for (SkinGenerationRequest r : this.queue) {
if (r.uuid().equals(req.uuid())) { if (r.getID().equals(req.getID())) {
return; return;
} }
} }
@@ -86,15 +89,14 @@ public class MojangQueue implements SkinGenerationQueue<MojangQueue.SkinRequest>
this.queue.add(req); this.queue.add(req);
} }
@Override
public void clear() { public void clear() {
this.queue.clear(); this.queue.clear();
} }
@Override
public ScheduledFuture<?> getScheduler() { public ScheduledFuture<?> getScheduler() {
return scheduler; return scheduler;
} }
public record SkinRequest(String uuid, SkinData.SkinVariant variant) {
}
} }