mirror of
https://github.com/Shiewk/SModeration.git
synced 2026-04-28 05:54:16 +02:00
Migrate older container version to new version on server start
This commit is contained in:
@@ -10,6 +10,7 @@ import de.shiewk.smoderation.paper.punishments.Kick;
|
|||||||
import de.shiewk.smoderation.paper.punishments.Mute;
|
import de.shiewk.smoderation.paper.punishments.Mute;
|
||||||
import de.shiewk.smoderation.paper.punishments.PunishmentManager;
|
import de.shiewk.smoderation.paper.punishments.PunishmentManager;
|
||||||
import de.shiewk.smoderation.paper.translation.TranslatorManager;
|
import de.shiewk.smoderation.paper.translation.TranslatorManager;
|
||||||
|
import de.shiewk.smoderation.paper.util.SModLegacy;
|
||||||
import de.shiewk.smoderation.paper.util.SchedulerUtil;
|
import de.shiewk.smoderation.paper.util.SchedulerUtil;
|
||||||
import io.papermc.paper.command.brigadier.Commands;
|
import io.papermc.paper.command.brigadier.Commands;
|
||||||
import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents;
|
import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents;
|
||||||
@@ -79,6 +80,12 @@ public final class SModerationPaper extends JavaPlugin {
|
|||||||
this.punishmentManager.registerType("mute", new Mute.Factory());
|
this.punishmentManager.registerType("mute", new Mute.Factory());
|
||||||
this.punishmentManager.registerType("ban", new Ban.Factory());
|
this.punishmentManager.registerType("ban", new Ban.Factory());
|
||||||
this.punishmentManager.registerType("kick", new Kick.Factory());
|
this.punishmentManager.registerType("kick", new Kick.Factory());
|
||||||
|
|
||||||
|
SModLegacy.migrateV1PunishmentsFile(
|
||||||
|
this.punishmentManager,
|
||||||
|
getDataPath().resolve("container.gz"),
|
||||||
|
getDataPath().resolve("v1-backup.gz")
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isFeatureEnabled(String feature){
|
public boolean isFeatureEnabled(String feature){
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ public final class PunishmentManager {
|
|||||||
return List.copyOf(typeRegistry.keySet());
|
return List.copyOf(typeRegistry.keySet());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void appendToSave(Punishment punishment) throws IOException {
|
public void appendToSave(Punishment punishment) throws IOException {
|
||||||
synchronized (ioLock) {
|
synchronized (ioLock) {
|
||||||
Path file = getTargetFile(punishment.getTargetID());
|
Path file = getTargetFile(punishment.getTargetID());
|
||||||
if (!Files.exists(file)) {
|
if (!Files.exists(file)) {
|
||||||
|
|||||||
@@ -1,7 +1,18 @@
|
|||||||
package de.shiewk.smoderation.paper.util;
|
package de.shiewk.smoderation.paper.util;
|
||||||
|
|
||||||
|
import de.shiewk.smoderation.paper.punishments.*;
|
||||||
|
|
||||||
|
import java.io.EOFException;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
import java.util.zip.GZIPInputStream;
|
||||||
|
|
||||||
|
import static de.shiewk.smoderation.paper.SModerationPaper.LOGGER;
|
||||||
|
|
||||||
public final class SModLegacy {
|
public final class SModLegacy {
|
||||||
private SModLegacy() {}
|
private SModLegacy() {}
|
||||||
@@ -54,4 +65,76 @@ public final class SModLegacy {
|
|||||||
return buffer.array();
|
return buffer.array();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static byte[] readStreamInternal(InputStream stream, int len) throws IOException {
|
||||||
|
final byte[] bytes = stream.readNBytes(len);
|
||||||
|
if (bytes.length != len){
|
||||||
|
throw new EOFException("Stream has ended before enough bytes were read");
|
||||||
|
}
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void migrateV1PunishmentsFile(PunishmentManager manager, Path path, Path copy) {
|
||||||
|
int count = 0;
|
||||||
|
try {
|
||||||
|
if (Files.isRegularFile(path)) {
|
||||||
|
LOGGER.info("Migrating V1 punishment file: {}", path);
|
||||||
|
try (InputStream in = new FileInputStream(path.toFile());
|
||||||
|
GZIPInputStream gzin = new GZIPInputStream(in)){
|
||||||
|
while (gzin.available() > 0){
|
||||||
|
int type = bytesToInt(readStreamInternal(gzin, 4));
|
||||||
|
long time = bytesToLong(readStreamInternal(gzin, 8));
|
||||||
|
long until = bytesToLong(readStreamInternal(gzin, 8));
|
||||||
|
UUID by = bytesToUuid(readStreamInternal(gzin, 16));
|
||||||
|
UUID to = bytesToUuid(readStreamInternal(gzin, 16));
|
||||||
|
int reasonLen = bytesToInt(readStreamInternal(gzin, 4));
|
||||||
|
String reason = new String(readStreamInternal(gzin, reasonLen));
|
||||||
|
UUID canceller = null;
|
||||||
|
boolean cancelled = gzin.read() == 1;
|
||||||
|
if (cancelled){
|
||||||
|
canceller = bytesToUuid(readStreamInternal(gzin, 16));
|
||||||
|
}
|
||||||
|
// Type 0: mute; 1: kick; 2: ban
|
||||||
|
Punishment p = switch (type){
|
||||||
|
case 0 -> new Mute(
|
||||||
|
Punishment.generateUUID(),
|
||||||
|
time,
|
||||||
|
by,
|
||||||
|
to,
|
||||||
|
reason,
|
||||||
|
until - time,
|
||||||
|
canceller
|
||||||
|
);
|
||||||
|
case 1 -> new Kick(
|
||||||
|
Punishment.generateUUID(),
|
||||||
|
time,
|
||||||
|
by,
|
||||||
|
to,
|
||||||
|
reason
|
||||||
|
);
|
||||||
|
case 2 -> new Ban(
|
||||||
|
Punishment.generateUUID(),
|
||||||
|
time,
|
||||||
|
by,
|
||||||
|
to,
|
||||||
|
reason,
|
||||||
|
until - time,
|
||||||
|
canceller
|
||||||
|
);
|
||||||
|
default -> throw new IllegalArgumentException("Invalid legacy type for punishment: " + type);
|
||||||
|
};
|
||||||
|
count++;
|
||||||
|
manager.appendToSave(p);
|
||||||
|
LOGGER.info("Migrated: {}", p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LOGGER.info("Successfully loaded {} items.", count);
|
||||||
|
Files.move(path, copy);
|
||||||
|
}
|
||||||
|
} catch (EOFException e) {
|
||||||
|
LOGGER.error("The file was not correctly saved, {} items could be recovered!", count);
|
||||||
|
} catch (IOException e){
|
||||||
|
LOGGER.error("An error occurred while loading", e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user