From 6df60e612a5a191fe05ccdc684e6fa1730431686 Mon Sep 17 00:00:00 2001 From: LocutusV0nB0rg Date: Wed, 24 Feb 2021 15:25:36 +0100 Subject: [PATCH] Added all the proper code --- build.gradle | 14 +++- .../borg/locutus/moneyshot/MessageUtils.java | 9 +++ .../borg/locutus/moneyshot/MoneyShot.java | 68 ++++++++++++++++++- .../payments/IncomingTransactionListener.java | 37 ++++++++++ .../payments/OutgoingTransactionListener.java | 38 +++++++++++ .../moneyshot/scheduling/SyncTask.java | 23 +++++++ .../scheduling/SyncTickScheduler.java | 36 ++++++++++ .../screenshot/ScreenshotCreator.java | 50 ++++++++++++++ src/main/resources/addon.json | 2 +- 9 files changed, 270 insertions(+), 7 deletions(-) create mode 100644 src/main/java/borg/locutus/moneyshot/MessageUtils.java create mode 100644 src/main/java/borg/locutus/moneyshot/payments/IncomingTransactionListener.java create mode 100644 src/main/java/borg/locutus/moneyshot/payments/OutgoingTransactionListener.java create mode 100644 src/main/java/borg/locutus/moneyshot/scheduling/SyncTask.java create mode 100644 src/main/java/borg/locutus/moneyshot/scheduling/SyncTickScheduler.java create mode 100644 src/main/java/borg/locutus/moneyshot/screenshot/ScreenshotCreator.java diff --git a/build.gradle b/build.gradle index 48d3ca7..c1ee8f7 100644 --- a/build.gradle +++ b/build.gradle @@ -20,9 +20,11 @@ plugins { id "net.minecraftforge.gradle.forge" version "2.0.2" } */ -version = "1.0" -group= "com.yourname.modid" // http://maven.apache.org/guides/mini/guide-naming-conventions.html -archivesBaseName = "modid" +version = "0.1" +group= "borg.locutus.moneyshot" // http://maven.apache.org/guides/mini/guide-naming-conventions.html +archivesBaseName = "MoneyShot" + +compileJava.options.encoding = 'UTF-8' minecraft { version = "1.8.9-11.15.1.1855" @@ -80,3 +82,9 @@ processResources exclude 'mcmod.info' } } + +reobf { + jar { + useNotchSrg() + } +} diff --git a/src/main/java/borg/locutus/moneyshot/MessageUtils.java b/src/main/java/borg/locutus/moneyshot/MessageUtils.java new file mode 100644 index 0000000..35c9b64 --- /dev/null +++ b/src/main/java/borg/locutus/moneyshot/MessageUtils.java @@ -0,0 +1,9 @@ +package borg.locutus.moneyshot; + +import net.labymod.main.LabyMod; + +public class MessageUtils { + public static void displayLocalMessage(String message) { + LabyMod.getInstance().displayMessageInChat(message); + } +} \ No newline at end of file diff --git a/src/main/java/borg/locutus/moneyshot/MoneyShot.java b/src/main/java/borg/locutus/moneyshot/MoneyShot.java index 373ffad..e9a3a4e 100644 --- a/src/main/java/borg/locutus/moneyshot/MoneyShot.java +++ b/src/main/java/borg/locutus/moneyshot/MoneyShot.java @@ -1,23 +1,85 @@ package borg.locutus.moneyshot; +import borg.locutus.moneyshot.payments.IncomingTransactionListener; +import borg.locutus.moneyshot.payments.OutgoingTransactionListener; +import borg.locutus.moneyshot.scheduling.SyncTickScheduler; import net.labymod.api.LabyModAddon; -import net.labymod.settings.elements.SettingsElement; +import net.labymod.settings.elements.*; +import net.labymod.utils.Consumer; +import net.labymod.utils.Material; +import net.minecraft.client.Minecraft; +import java.io.File; import java.util.List; +import java.util.concurrent.TimeUnit; public class MoneyShot extends LabyModAddon { + public static boolean incomingPayments = true; + public static boolean outgoingPayments = true; + public static int daysOfSaving = 7; + public static String pathOfSaveFolder = ""; + @Override public void onEnable() { + getApi().getEventManager().register(new IncomingTransactionListener()); + getApi().getEventManager().register(new OutgoingTransactionListener()); + + getApi().registerForgeListener(new SyncTickScheduler()); + SyncTickScheduler.scheduleNewSyncTask(new Runnable() { + @Override + public void run() { + deleteOldFiles(); + } + }, 200); } @Override public void loadConfig() { - + incomingPayments = !getConfig().has("incomingPayments") || getConfig().get("incomingPayments").getAsBoolean(); + outgoingPayments = !getConfig().has("outgoingPayments") || getConfig().get("outgoingPayments").getAsBoolean(); + daysOfSaving = getConfig().has( "daysOfSaving" ) ? getConfig().get( "daysOfSaving" ).getAsInt() : 7; + pathOfSaveFolder = getConfig().has( "pathOfSaveFolder" ) ? getConfig().get( "pathOfSaveFolder" ).getAsString(): ""; } @Override - protected void fillSettings(List list) { + protected void fillSettings(List subSettings) { + subSettings.add( new HeaderElement("Protokoll-Einstellungen")); + subSettings.add( new BooleanElement( "Eingehende Zahlungen protokollieren", this, new ControlElement.IconData( Material.LEVER ), "incomingPayments", incomingPayments ) ); + subSettings.add( new BooleanElement( "Ausgehende Zahlungen protokollieren", this, new ControlElement.IconData( Material.LEVER ), "outgoingPayments", outgoingPayments ) ); + + subSettings.add( new HeaderElement("Dateispeicherung")); + subSettings.add( new SliderElement( "Speicherdauer in Tagen", this, new ControlElement.IconData( Material.ITEM_FRAME ), "daysOfSaving", daysOfSaving ).setRange( 1, 31 ) ); + + StringElement channelStringElement = new StringElement( "Dateispeicherpfad", this, new ControlElement.IconData( Material.PAPER ), "pathOfSaveFolder", pathOfSaveFolder); + subSettings.add( channelStringElement ); + subSettings.add( new HeaderElement("Pfad leer lassen, damit der Standard-Ordner von Minecraft verwendet wird")); + } + + private void deleteOldFiles() { + File dir = pathOfSaveFolder.equals("") ? new File(Minecraft.getMinecraft().mcDataDir, "screenshots") : new File(pathOfSaveFolder, "screenshots"); + File[] directoryListing = dir.listFiles(); + if (directoryListing != null) { + for (File child : directoryListing) { + if (child.isDirectory()) continue; + if (!child.getName().contains("dispensing") && !child.getName().contains("received")) continue; + + long lastModified = child.lastModified(); + long currentTime = System.currentTimeMillis(); + + long timePassed = currentTime - lastModified; + long days = TimeUnit.MILLISECONDS.toDays(timePassed); + if (days >= daysOfSaving) { + if(child.delete()) { + System.out.println("File deleted successfully"); + } else { + System.out.println("Failed to delete the file"); + } + } + } + } else { + throw new RuntimeException("Der in der Config angegebene Pfad ist kein Ordner"); + } } } diff --git a/src/main/java/borg/locutus/moneyshot/payments/IncomingTransactionListener.java b/src/main/java/borg/locutus/moneyshot/payments/IncomingTransactionListener.java new file mode 100644 index 0000000..c7b0f16 --- /dev/null +++ b/src/main/java/borg/locutus/moneyshot/payments/IncomingTransactionListener.java @@ -0,0 +1,37 @@ +package borg.locutus.moneyshot.payments; + + +import borg.locutus.moneyshot.MoneyShot; +import borg.locutus.moneyshot.screenshot.ScreenshotCreator; +import net.labymod.api.events.MessageReceiveEvent; +import org.apache.commons.lang3.StringUtils; + +public class IncomingTransactionListener implements MessageReceiveEvent { + public boolean onReceive(String message, String unformattedMessage) { + if (!MoneyShot.incomingPayments) { + return false; + } + + if (!checkIfMessageIdValidPayment(message)) { + return false; + } + + String[] args = unformattedMessage.split(" "); + String playername = args[2]; + String money = args[5].substring(1).replace(",", ""); + money = StringUtils.substringBefore(money, "."); + int moneyint = Integer.parseInt(money); + if (moneyint == 0) + return false; + + ScreenshotCreator.takeScreenshotOfValidPayment(playername, moneyint, "received"); + + return false; + } + + private boolean checkIfMessageIdValidPayment(String message) { + return message.startsWith("§r") && message.endsWith("§r") && message.contains("§a") && + !message.contains(":") && message.contains("hat dir") && message.contains("gegeben") && message + .contains("$") && !message.split(" ")[2].endsWith("§f"); + } +} \ No newline at end of file diff --git a/src/main/java/borg/locutus/moneyshot/payments/OutgoingTransactionListener.java b/src/main/java/borg/locutus/moneyshot/payments/OutgoingTransactionListener.java new file mode 100644 index 0000000..a90689a --- /dev/null +++ b/src/main/java/borg/locutus/moneyshot/payments/OutgoingTransactionListener.java @@ -0,0 +1,38 @@ +package borg.locutus.moneyshot.payments; + +import borg.locutus.moneyshot.MoneyShot; +import borg.locutus.moneyshot.screenshot.ScreenshotCreator; +import net.labymod.api.events.MessageReceiveEvent; +import org.apache.commons.lang3.StringUtils; + +public class OutgoingTransactionListener implements MessageReceiveEvent { + public boolean onReceive(String message, String unformattedMessage) { + if (!MoneyShot.outgoingPayments) { + return false; + } + + if (!checkIfMessageIdValidPayment(message)) { + return false; + } + + String[] args = unformattedMessage.split(" "); + String playername = args[4]; + String money = args[5].substring(1).replace(",", ""); + money = StringUtils.substringBefore(money, "."); + int moneyint = Integer.parseInt(money); + if (moneyint == 0) + return false; + + ScreenshotCreator.takeScreenshotOfValidPayment(playername, moneyint, "dispensing"); + + return false; + } + + private boolean checkIfMessageIdValidPayment(String message) { + + //§r§aDu hast §r§bDeveloper§r§8 ┃ §r§bLocutusVonBorg§r§a $1 gegeben.§r + return message.startsWith("§r§aDu hast") && message.endsWith("§r") && message.contains("§a") && + !message.contains(":") && message.contains("gegeben") && message + .contains("$") && !message.split(" ")[2].endsWith("§f"); + } +} \ No newline at end of file diff --git a/src/main/java/borg/locutus/moneyshot/scheduling/SyncTask.java b/src/main/java/borg/locutus/moneyshot/scheduling/SyncTask.java new file mode 100644 index 0000000..1184ad9 --- /dev/null +++ b/src/main/java/borg/locutus/moneyshot/scheduling/SyncTask.java @@ -0,0 +1,23 @@ +package borg.locutus.moneyshot.scheduling; + +public class SyncTask { + private final long creationTime = System.currentTimeMillis(); + private final int tickDelay; + private final Runnable runnable; + + public SyncTask(int tickDelay, Runnable runnable) { + this.tickDelay = tickDelay; + this.runnable = runnable; + } + + public void runTask() { + runnable.run(); + } + + public boolean waitTimeExceeded() { + long delayInMillis = tickDelay * 50; + long currentTime = System.currentTimeMillis(); + + return (creationTime + delayInMillis <= currentTime); + } +} diff --git a/src/main/java/borg/locutus/moneyshot/scheduling/SyncTickScheduler.java b/src/main/java/borg/locutus/moneyshot/scheduling/SyncTickScheduler.java new file mode 100644 index 0000000..e1c53c5 --- /dev/null +++ b/src/main/java/borg/locutus/moneyshot/scheduling/SyncTickScheduler.java @@ -0,0 +1,36 @@ +package borg.locutus.moneyshot.scheduling; + +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; + +import java.util.ArrayList; +import java.util.List; + + +public class SyncTickScheduler { + @SubscribeEvent + public void onTick( TickEvent.ClientTickEvent event ) { + + List ranTasks = new ArrayList(); + + for (SyncTask task : tasks) { + if (task.waitTimeExceeded()) { + task.runTask(); + ranTasks.add(task); + } + } + + for (SyncTask task : ranTasks) { + tasks.remove(task); + } + } + + private static final List tasks = new ArrayList(); + + public static void scheduleNewSyncTask(Runnable runnable, int tickDelay) { + SyncTask newTask = new SyncTask(tickDelay, runnable); + + tasks.add(newTask); + } + +} diff --git a/src/main/java/borg/locutus/moneyshot/screenshot/ScreenshotCreator.java b/src/main/java/borg/locutus/moneyshot/screenshot/ScreenshotCreator.java new file mode 100644 index 0000000..170ae12 --- /dev/null +++ b/src/main/java/borg/locutus/moneyshot/screenshot/ScreenshotCreator.java @@ -0,0 +1,50 @@ +package borg.locutus.moneyshot.screenshot; + +import borg.locutus.moneyshot.MessageUtils; +import borg.locutus.moneyshot.MoneyShot; +import borg.locutus.moneyshot.scheduling.SyncTickScheduler; +import net.minecraft.client.Minecraft; +import net.minecraft.util.ScreenShotHelper; + +import java.io.File; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class ScreenshotCreator { + private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); + + private static void saveProofScreenshot(String playerName, int amount, String suffix) { + String screenshotFileName = generateNameForProofScreenshot(playerName, amount, suffix); + + if (MoneyShot.pathOfSaveFolder.equals("")) { + ScreenShotHelper.saveScreenshot(Minecraft.getMinecraft().mcDataDir, screenshotFileName, Minecraft.getMinecraft().displayWidth, + Minecraft.getMinecraft().displayHeight, Minecraft.getMinecraft().getFramebuffer()); + } else { + File directory = new File(MoneyShot.pathOfSaveFolder); + + if (!directory.exists()) { + MessageUtils.displayLocalMessage("§f[§eMoneyShot§f]§r §cDas angegebene Verzeichnis §b" + MoneyShot.pathOfSaveFolder + "konnte nicht gefunden werden."); + MessageUtils.displayLocalMessage("§4§lDER SCREENSHOT WURDE NICHT GESPEICHERT!"); + return; + } + + ScreenShotHelper.saveScreenshot(directory, screenshotFileName, Minecraft.getMinecraft().displayWidth, + Minecraft.getMinecraft().displayHeight, Minecraft.getMinecraft().getFramebuffer()); + } + } + + private static String generateNameForProofScreenshot(String playerName, int amount, String suffix) { + String dateString = dateFormat.format(new Date()); + return dateString + "_" + playerName + "_" + amount + "_" + suffix + ".png"; + } + + public static void takeScreenshotOfValidPayment(final String playerName, final int amount, final String suffix) { + SyncTickScheduler.scheduleNewSyncTask(new Runnable() { + @Override + public void run() { + ScreenshotCreator.saveProofScreenshot(playerName, amount, suffix); + } + }, 2); + } +} diff --git a/src/main/resources/addon.json b/src/main/resources/addon.json index 59c1d79..85e238f 100644 --- a/src/main/resources/addon.json +++ b/src/main/resources/addon.json @@ -6,5 +6,5 @@ "version": 0.1, "author": "LocutusVonBorg", "category": 2, - "icon": "https://imgur.com/a/UXn3VyP" + "icon": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/5/50/Book_JE2_BE2.png/revision/latest/scale-to-width-down/150?cb=20190530235325" }