aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/TimeTowerReminder.java
blob: 6ed11676a350d94c0676560bcfb1064db5b14d68 (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
package de.hysky.skyblocker.skyblock.chocolatefactory;

import com.mojang.brigadier.Message;
import de.hysky.skyblocker.SkyblockerMod;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.events.SkyblockEvents;
import de.hysky.skyblocker.utils.Constants;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.scheduler.Scheduler;
import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
import net.minecraft.client.MinecraftClient;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.util.regex.Pattern;
import java.util.stream.Stream;

public class TimeTowerReminder {
	private static final String TIME_TOWER_FILE = "time_tower.txt";
	private static final Pattern TIME_TOWER_PATTERN = Pattern.compile("^TIME TOWER! Your Chocolate Factory production has increased by \\+[\\d.]+x for \\dh!$");
	private static final Logger LOGGER = LoggerFactory.getLogger("Skyblocker Time Tower Reminder");
	private static boolean scheduled = false;

	private TimeTowerReminder() {
	}

	public static void init() {
		SkyblockEvents.JOIN.register(TimeTowerReminder::checkTempFile);
		ClientReceiveMessageEvents.GAME.register(TimeTowerReminder::checkIfTimeTower);
	}

	public static void checkIfTimeTower(Message message, boolean overlay) {
		if (!TIME_TOWER_PATTERN.matcher(message.getString()).matches() || scheduled) return;
		Scheduler.INSTANCE.schedule(TimeTowerReminder::sendMessage, 60 * 60 * 20); // 1 hour
		scheduled = true;
		File tempFile = SkyblockerMod.CONFIG_DIR.resolve(TIME_TOWER_FILE).toFile();
		if (!tempFile.exists()) {
			try {
				tempFile.createNewFile();
			} catch (IOException e) {
				LOGGER.error("[Skyblocker Time Tower Reminder] Failed to create temp file for Time Tower Reminder!", e);
				return;
			}
		}

		try (FileWriter writer = new FileWriter(tempFile)) {
			writer.write(String.valueOf(System.currentTimeMillis())); //Overwrites the file so no need to handle case where the file already exists and has text
		} catch (IOException e) {
			LOGGER.error("[Skyblocker Time Tower Reminder] Failed to write to temp file for Time Tower Reminder!", e);
		}
	}

	private static void sendMessage() {
		if (MinecraftClient.getInstance().player == null || !Utils.isOnSkyblock()) return;
		if (SkyblockerConfigManager.get().helpers.chocolateFactory.enableTimeTowerReminder) {
			MinecraftClient.getInstance().player.sendMessage(Constants.PREFIX.get().append(Text.literal("Your Chocolate Factory's Time Tower has deactivated!").formatted(Formatting.RED)));
		}
		File tempFile = SkyblockerMod.CONFIG_DIR.resolve(TIME_TOWER_FILE).toFile();
		try {
			scheduled = false;
			if (tempFile.exists()) Files.delete(tempFile.toPath());
		} catch (Exception e) {
			LOGGER.error("[Skyblocker Time Tower Reminder] Failed to delete temp file for Time Tower Reminder!", e);
		}
	}

	private static void checkTempFile() {
		File tempFile = SkyblockerMod.CONFIG_DIR.resolve(TIME_TOWER_FILE).toFile();
		if (!tempFile.exists() || scheduled) return;

		long time;
		try (Stream<String> file = Files.lines(tempFile.toPath())) {
			time = Long.parseLong(file.findFirst().orElseThrow());
		} catch (Exception e) {
			LOGGER.error("[Skyblocker Time Tower Reminder] Failed to read temp file for Time Tower Reminder!", e);
			return;
		}

		if (System.currentTimeMillis() - time >= 60 * 60 * 1000) sendMessage();
		else {
			Scheduler.INSTANCE.schedule(TimeTowerReminder::sendMessage, 60 * 60 * 20 - (int) ((System.currentTimeMillis() - time) / 50)); // 50 milliseconds is 1 tick
			scheduled = true;
		}
	}
}