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;
public interface SkinGenerationQueue<R> {
public interface SkinGenerationQueue {
void run();
void add(R request);
void add(SkinGenerationRequest request);
void clear();
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.skins.cache.SkinCache;
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.Listener;
import org.lushplugins.chatcolorhandler.ChatColorHandler;
@@ -37,10 +35,10 @@ public class SkinManagerImpl implements SkinManager, Listener {
private final SkinCache fileCache;
private final SkinCache memCache;
private final SkinGenerationQueue<MojangQueue.SkinRequest> mojangQueue;
private final SkinGenerationQueue<MineSkinQueue.SkinRequest> mineSkinQueue;
private final SkinGenerationQueue mojangQueue;
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.memCache = memCache;
this.mojangQueue = mojangQueue;
@@ -86,7 +84,7 @@ public class SkinManagerImpl implements SkinManager, Listener {
return cached;
}
mojangQueue.add(new MojangQueue.SkinRequest(uuid.toString(), variant));
mojangQueue.add(new SkinGenerationRequest(uuid.toString(), variant));
// GenerateRequest genReq = GenerateRequest.user(uuid);
// 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 + "')");
}
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);
}
@@ -142,7 +140,7 @@ public class SkinManagerImpl implements SkinManager, Listener {
GenerateRequest genReq = GenerateRequest.upload(file);
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);
}

View File

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