From a2c0db53800c353b3b8154964645e7d6499d17ab Mon Sep 17 00:00:00 2001 From: ThatGravyBoat Date: Mon, 27 Sep 2021 18:24:10 -0230 Subject: Updated build.gradle to make built jars need the minimal amount of shadowed libs. Added Config and a config command. - Made it so that you can disable the confirmation popup. Fixed some classes have the wrong names. Added a backup plan to disable the mod via the ExternalConfiguration. --- .../tech/thatgravyboat/rewardclaim/Command.kt | 13 ++++ .../tech/thatgravyboat/rewardclaim/Config.kt | 39 +++++++++++ .../rewardclaim/ExternalConfiguration.kt | 44 +++++++++++++ .../tech/thatgravyboat/rewardclaim/RewardClaim.kt | 76 +++++++++++++--------- .../rewardclaim/RewardConfiguration.kt | 54 --------------- .../thatgravyboat/rewardclaim/RewardLanguage.kt | 18 ----- .../thatgravyboat/rewardclaim/types/RewardData.kt | 7 +- .../rewardclaim/types/RewardLanguage.kt | 18 +++++ .../thatgravyboat/rewardclaim/types/WebData.kt | 1 - .../thatgravyboat/rewardclaim/ui/RewardClaimGui.kt | 48 ++++++++------ .../tech/thatgravyboat/rewardclaim/ui/UIReward.kt | 6 +- .../rewardclaim/ui/UISelectedReward.kt | 6 +- 12 files changed, 194 insertions(+), 136 deletions(-) create mode 100644 src/main/kotlin/tech/thatgravyboat/rewardclaim/Command.kt create mode 100644 src/main/kotlin/tech/thatgravyboat/rewardclaim/Config.kt create mode 100644 src/main/kotlin/tech/thatgravyboat/rewardclaim/ExternalConfiguration.kt delete mode 100644 src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardConfiguration.kt delete mode 100644 src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardLanguage.kt create mode 100644 src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardLanguage.kt (limited to 'src/main/kotlin') diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/Command.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/Command.kt new file mode 100644 index 0000000..8ba49e0 --- /dev/null +++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/Command.kt @@ -0,0 +1,13 @@ +package tech.thatgravyboat.rewardclaim + +import gg.essential.api.EssentialAPI +import gg.essential.api.commands.Command +import gg.essential.api.commands.DefaultHandler + +class Command : Command("rewardclaim") { + + @DefaultHandler + fun handle() { + EssentialAPI.getGuiUtil().openScreen(Config.gui()) + } +} \ No newline at end of file diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/Config.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/Config.kt new file mode 100644 index 0000000..682b109 --- /dev/null +++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/Config.kt @@ -0,0 +1,39 @@ +package tech.thatgravyboat.rewardclaim + +import gg.essential.universal.UDesktop +import gg.essential.vigilance.Vigilant +import gg.essential.vigilance.data.Property +import gg.essential.vigilance.data.PropertyType +import java.io.File +import java.net.URI + +@Suppress("unused") +object Config : Vigilant(File("./config/rewardclaim.toml")) { + + @Property(type = PropertyType.SWITCH, "Show Confirmation", "General", description = "Shows a confirmation before you claim an item to make sure you don't by accidently claim an reward you didn't want.") + var showConfirmation = true + + @Property(type = PropertyType.BUTTON, "Discord", "General", "Self Promotion", placeholder = "Visit") + fun discord() { + UDesktop.browse(URI("https://discord.gg/jRhkYFmpCa")) + } + + @Property(type = PropertyType.BUTTON, "Twitter", "General", "Self Promotion", placeholder = "Visit") + fun twitter() { + UDesktop.browse(URI("https://twitter.com/ThatGravyBoat")) + } + + @Property(type = PropertyType.BUTTON, "Github", "General", "Self Promotion", placeholder = "Visit") + fun github() { + UDesktop.browse(URI("https://github.com/ThatGravyBoat/RewardClaim")) + } + + @Property(type = PropertyType.BUTTON, "YouTube", "General", "Self Promotion", placeholder = "Visit") + fun rickroll() { + UDesktop.browse(URI("https://www.youtube.com/watch?v=dQw4w9WgXcQ")) + } + + init { + initialize() + } +} \ No newline at end of file diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/ExternalConfiguration.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/ExternalConfiguration.kt new file mode 100644 index 0000000..89ad572 --- /dev/null +++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/ExternalConfiguration.kt @@ -0,0 +1,44 @@ +package tech.thatgravyboat.rewardclaim + +import com.google.gson.Gson +import gg.essential.api.utils.WebUtil +import tech.thatgravyboat.rewardclaim.types.ImageType +import tech.thatgravyboat.rewardclaim.types.RewardImage + +private val GSON = Gson() +private val DEFAULT_IMAGE_TYPE = ImageType(142, 100, false) + +object ExternalConfiguration { + private lateinit var imageTypes: HashMap + lateinit var textures: HashMap + lateinit var rewardMessageRegex: Regex + lateinit var rewardMissedMessageRegex: Regex + lateinit var userAgent: String + var disabled = false + lateinit var disabledMessage: String + + fun getImageType(type: String?) = if (type == null) DEFAULT_IMAGE_TYPE else imageTypes.getOrDefault(type, DEFAULT_IMAGE_TYPE) + + fun loadData() { + WebUtil.fetchString("https://raw.githubusercontent.com/ThatGravyBoat/RewardClaim/master/data.json")?.let { + val config = GSON.fromJson(it, JsonConfig::class.java) + textures = config.textures + imageTypes = config.imageTypes + rewardMessageRegex = Regex(config.rewardRegex) + rewardMissedMessageRegex = Regex(config.missedRewardRegex) + userAgent = config.userAgent + disabled = config.disabled + disabledMessage = config.disabledMessage + } + } + + private data class JsonConfig( + val imageTypes: HashMap = hashMapOf(), + val textures: HashMap = hashMapOf(), + val rewardRegex: String = "Click the link to visit our website and claim your reward: https://rewards\\.hypixel\\.net/claim-reward/(?[A-Za-z0-9]{8})", + val missedRewardRegex: String = "We noticed you haven't claimed your free Daily Reward yet!\\nTo choose your reward you have to click the link to visit our website! As a reminder, here's your link for today: https://rewards\\.hypixel\\.net/claim-reward/(?[A-Za-z0-9]{8})", + val userAgent: String = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36", + val disabled: Boolean = false, + val disabledMessage: String = "Reward Claim was disabled by the mod author for an unknown reason." + ) +} \ No newline at end of file diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardClaim.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardClaim.kt index 5656692..788b6d6 100644 --- a/src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardClaim.kt +++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardClaim.kt @@ -15,46 +15,58 @@ import tech.thatgravyboat.rewardclaim.ui.RewardClaimGui name = "RewardClaim", modid = "gravyrewardclaim", version = "1.0.0", - modLanguageAdapter = "gg.essential.api.utils.KotlinAdapter" -) -object ForgeTemplate { + modLanguageAdapter = "gg.essential.api.utils.KotlinAdapter") +object RewardClaim { - private var rewardClaimTime: Long = 0 + private var rewardClaimTime: Long = 0 - @Mod.EventHandler - fun onFMLInitialization(event: FMLInitializationEvent?) { - MinecraftForge.EVENT_BUS.register(this) - } + @Mod.EventHandler + fun onFMLInitialization(event: FMLInitializationEvent?) { + MinecraftForge.EVENT_BUS.register(this) + EssentialAPI.getCommandRegistry().registerCommand(Command()) + } - @Mod.EventHandler - fun onPreInit(event: FMLPreInitializationEvent?) { - RewardConfiguration.loadData() - } + @Mod.EventHandler + fun onPreInit(event: FMLPreInitializationEvent?) { + ExternalConfiguration.loadData() + } - @SubscribeEvent - fun onChatMessage(event: ClientChatReceivedEvent) { - RewardConfiguration.rewardMessageRegex.matchEntire(event.message.unformattedText.trim())?.apply { + @SubscribeEvent + fun onChatMessage(event: ClientChatReceivedEvent) { + ExternalConfiguration.rewardMessageRegex.matchEntire(event.message.unformattedText.trim()) + ?.apply { + if (!ExternalConfiguration.disabled) { EssentialAPI.getGuiUtil().openScreen(RewardClaimGui(groups["id"]!!.value)) rewardClaimTime = System.currentTimeMillis() + } else { + EssentialAPI.getNotifications() + .push("Mod Disabled", ExternalConfiguration.disabledMessage) + } } - RewardConfiguration.rewardMissedMessageRegex.matchEntire(event.message.unformattedText.trim())?.apply { - EssentialAPI.getNotifications().push( - "Reward Claim Missed!", - "You missed a reward claim, click on this to open the reward claim gui to claim your reward." - ) { EssentialAPI.getGuiUtil().openScreen(RewardClaimGui(groups["id"]!!.value)) } - event.isCanceled = true + ExternalConfiguration.rewardMissedMessageRegex.matchEntire(event.message.unformattedText.trim()) + ?.apply { + EssentialAPI.getNotifications().push( + "Reward Claim Missed!", + "You missed a reward claim, click on this to open the reward claim gui to claim your reward.") { + if (!ExternalConfiguration.disabled) { + EssentialAPI.getGuiUtil().openScreen(RewardClaimGui(groups["id"]!!.value)) + } else { + EssentialAPI.getNotifications() + .push("Mod Disabled", ExternalConfiguration.disabledMessage) + } + } + event.isCanceled = true } - } + } - @SubscribeEvent - fun onScreen(event: GuiOpenEvent) { - if (EssentialAPI.getGuiUtil() - .openedScreen() is RewardClaimGui && event.gui is GuiScreenBook && System.currentTimeMillis() - rewardClaimTime <= 3000 - ) { - event.isCanceled = true - rewardClaimTime = 0 - } + @SubscribeEvent + fun onScreen(event: GuiOpenEvent) { + if (EssentialAPI.getGuiUtil().openedScreen() is RewardClaimGui && + event.gui is GuiScreenBook && + System.currentTimeMillis() - rewardClaimTime <= 3000) { + event.isCanceled = true + rewardClaimTime = 0 } - -} \ No newline at end of file + } +} diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardConfiguration.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardConfiguration.kt deleted file mode 100644 index 01e2af1..0000000 --- a/src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardConfiguration.kt +++ /dev/null @@ -1,54 +0,0 @@ -package tech.thatgravyboat.rewardclaim - -import com.google.gson.Gson -import tech.thatgravyboat.rewardclaim.types.ImageType -import tech.thatgravyboat.rewardclaim.types.RewardImage -import java.io.IOException -import java.net.URL -import java.util.* -import kotlin.collections.HashMap - -private val GSON = Gson() -private val DEFAULT_IMAGE_TYPE = ImageType(142, 100, false) - -object RewardConfiguration { - private lateinit var imageTypes: HashMap - lateinit var textures: HashMap - lateinit var rewardMessageRegex: Regex - lateinit var rewardMissedMessageRegex: Regex - lateinit var userAgent: String - - fun getImageType(type: String?) = if (type == null) DEFAULT_IMAGE_TYPE else imageTypes.getOrDefault(type, DEFAULT_IMAGE_TYPE) - - fun loadData() { - val config = GSON.fromJson(readData(), JsonConfig::class.java) - textures = config.textures - imageTypes = config.imageTypes - rewardMessageRegex = Regex(config.rewardRegex) - rewardMissedMessageRegex = Regex(config.missedRewardRegex) - userAgent = config.userAgent - } - - private fun readData(): String { - try { - Scanner( - URL("https://raw.githubusercontent.com/ThatGravyBoat/RewardClaim/master/data.json").openStream(), - "UTF-8" - ).use { scanner -> - scanner.useDelimiter("\\A") - return if (scanner.hasNext()) scanner.next() else "" - } - } catch (e: IOException) { - e.printStackTrace() - } - return "" - } - - private data class JsonConfig( - val imageTypes: HashMap = hashMapOf(), - val textures: HashMap = hashMapOf(), - val rewardRegex: String = "Click the link to visit our website and claim your reward: https://rewards\\.hypixel\\.net/claim-reward/(?[A-Za-z0-9]{8})", - val missedRewardRegex: String = "We noticed you haven't claimed your free Daily Reward yet!\\nTo choose your reward you have to click the link to visit our website! As a reminder, here's your link for today: https://rewards\\.hypixel\\.net/claim-reward/(?[A-Za-z0-9]{8})", - val userAgent: String = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36" - ) -} \ No newline at end of file diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardLanguage.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardLanguage.kt deleted file mode 100644 index 8a9ab36..0000000 --- a/src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardLanguage.kt +++ /dev/null @@ -1,18 +0,0 @@ -package tech.thatgravyboat.rewardclaim - -private val TRANSLATION_LINE_REGEX = Regex("\"(?.*)\": ?\"(?.*)\",?") - -class RewardLanguage(translationDataFromHtml: String) { - - private val translations = hashMapOf() - - fun translate(key: String) = translations.getValue(key) - - //We have to do it this way as this is easier than fixing all the things that isn't - //valid in normal json but is valid in javascript objects. Such as escaped single quotes and trailing commas. - init { - TRANSLATION_LINE_REGEX.findAll(translationDataFromHtml.replace("\\'", "'")).apply { - this.forEach { translations[it.groups["key"]!!.value] = it.groups["text"]!!.value } - } - } -} \ No newline at end of file diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardData.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardData.kt index 320f0b7..b2d1b5c 100644 --- a/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardData.kt +++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardData.kt @@ -1,8 +1,7 @@ package tech.thatgravyboat.rewardclaim.types import com.google.gson.annotations.SerializedName -import tech.thatgravyboat.rewardclaim.RewardConfiguration -import tech.thatgravyboat.rewardclaim.RewardLanguage +import tech.thatgravyboat.rewardclaim.ExternalConfiguration import java.util.* @@ -86,9 +85,9 @@ data class RewardData( rewardPackage?.let { item -> if (id == "housing_package") { val packageId = item.replace("specialoccasion_reward_card_skull_", "") - RewardConfiguration.textures[id + "_" + packageId]?.let { image -> return image } + ExternalConfiguration.textures[id + "_" + packageId]?.let { image -> return image } } } - return RewardConfiguration.textures[id] + return ExternalConfiguration.textures[id] } } \ No newline at end of file diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardLanguage.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardLanguage.kt new file mode 100644 index 0000000..fae577d --- /dev/null +++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardLanguage.kt @@ -0,0 +1,18 @@ +package tech.thatgravyboat.rewardclaim.types + +private val TRANSLATION_LINE_REGEX = Regex("\"(?.*)\": ?\"(?.*)\",?") + +class RewardLanguage(translationDataFromHtml: String) { + + private val translations = hashMapOf() + + fun translate(key: String) = translations.getValue(key) + + //We have to do it this way as this is easier than fixing all the things that isn't + //valid in normal json but is valid in javascript objects. Such as escaped single quotes and trailing commas. + init { + TRANSLATION_LINE_REGEX.findAll(translationDataFromHtml.replace("\\'", "'")).apply { + this.forEach { translations[it.groups["key"]!!.value] = it.groups["text"]!!.value } + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/WebData.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/WebData.kt index bdaafe1..ca47587 100644 --- a/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/WebData.kt +++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/WebData.kt @@ -1,7 +1,6 @@ package tech.thatgravyboat.rewardclaim.types import com.google.gson.Gson -import tech.thatgravyboat.rewardclaim.RewardLanguage private val GSON = Gson() diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/RewardClaimGui.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/RewardClaimGui.kt index 0e5b054..acdc2f7 100644 --- a/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/RewardClaimGui.kt +++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/RewardClaimGui.kt @@ -10,7 +10,8 @@ import gg.essential.universal.ChatColor import gg.essential.universal.UDesktop import gg.essential.vigilance.gui.VigilancePalette import org.apache.commons.io.IOUtils -import tech.thatgravyboat.rewardclaim.RewardConfiguration +import tech.thatgravyboat.rewardclaim.Config +import tech.thatgravyboat.rewardclaim.ExternalConfiguration import tech.thatgravyboat.rewardclaim.types.WebData import java.awt.Color import java.net.* @@ -40,7 +41,7 @@ class RewardClaimGui(private val id: String) : WindowScreen() { (url.openConnection() as HttpURLConnection).apply { requestMethod = "GET" useCaches = true - addRequestProperty("User-Agent", RewardConfiguration.userAgent) + addRequestProperty("User-Agent", ExternalConfiguration.userAgent) readTimeout = 15000 connectTimeout = 15000 doOutput = true @@ -141,7 +142,10 @@ class RewardClaimGui(private val id: String) : WindowScreen() { button.onMouseEnter { setColor(BUTTON_HOVER) } button.onMouseLeave { setColor(VigilancePalette.getAccent()) } button.onMouseClick { event -> - if (event.mouseButton == 0 && selected != -1) confirmPopup() + if (event.mouseButton == 0 && selected != -1) { + if (Config.showConfirmation) confirmPopup() + else claimReward() + } event.stopPropagation() } } @@ -239,28 +243,30 @@ class RewardClaimGui(private val id: String) : WindowScreen() { { removePopup() }, "${ChatColor.BOLD}Back", null, - { - runAsync { - try { - (URL("https://rewards.hypixel.net/claim-reward/claim?option=$selected&id=$id&activeAd=${data.activeAd}&_csrf=${data.securityToken}&watchedFallback=false").openConnection() as HttpURLConnection).apply { - requestMethod = "POST" - useCaches = true - addRequestProperty("User-Agent", RewardConfiguration.userAgent) - readTimeout = 15000 - connectTimeout = 15000 - responseCode - CookieManager.setDefault(null) - restorePreviousScreen() - } - } catch (ignored: Exception) { - //IGNORED - } - } - }, + { claimReward() }, "${ChatColor.BOLD}Continue" ) childOf this.window } + private fun claimReward() { + runAsync { + try { + (URL("https://rewards.hypixel.net/claim-reward/claim?option=$selected&id=$id&activeAd=${data.activeAd}&_csrf=${data.securityToken}&watchedFallback=false").openConnection() as HttpURLConnection).apply { + requestMethod = "POST" + useCaches = true + addRequestProperty("User-Agent", ExternalConfiguration.userAgent) + readTimeout = 15000 + connectTimeout = 15000 + responseCode + CookieManager.setDefault(null) + restorePreviousScreen() + } + } catch (ignored: Exception) { + //IGNORED + } + } + } + private fun removePopup() { Window.enqueueRenderOperation { popup?.let { diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UIReward.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UIReward.kt index 02408d4..ffc698a 100644 --- a/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UIReward.kt +++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UIReward.kt @@ -12,9 +12,9 @@ import gg.essential.elementa.utils.withAlpha import gg.essential.universal.ChatColor import gg.essential.vigilance.gui.VigilancePalette import tech.thatgravyboat.rewardclaim.MappedImageCache -import tech.thatgravyboat.rewardclaim.RewardConfiguration -import tech.thatgravyboat.rewardclaim.RewardLanguage +import tech.thatgravyboat.rewardclaim.ExternalConfiguration import tech.thatgravyboat.rewardclaim.types.RewardData +import tech.thatgravyboat.rewardclaim.types.RewardLanguage class UIReward(xConstraint: XConstraint, yConstraint: YConstraint) : UIBlock(VigilancePalette.getHighlight().withAlpha(204)) { @@ -96,7 +96,7 @@ class UIReward(xConstraint: XConstraint, yConstraint: YConstraint) : data.image?.let { it.url?.let { url -> - val imageType = RewardConfiguration.getImageType(it.imageType) + val imageType = ExternalConfiguration.getImageType(it.imageType) UIImage.ofURL(url, MappedImageCache).constrain { width = imageType.width.percent() height = imageType.height.percent() diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UISelectedReward.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UISelectedReward.kt index 863ebc5..447c3c5 100644 --- a/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UISelectedReward.kt +++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UISelectedReward.kt @@ -12,9 +12,9 @@ import gg.essential.elementa.utils.withAlpha import gg.essential.universal.ChatColor import gg.essential.vigilance.gui.VigilancePalette import tech.thatgravyboat.rewardclaim.MappedImageCache -import tech.thatgravyboat.rewardclaim.RewardConfiguration -import tech.thatgravyboat.rewardclaim.RewardLanguage +import tech.thatgravyboat.rewardclaim.ExternalConfiguration import tech.thatgravyboat.rewardclaim.types.RewardData +import tech.thatgravyboat.rewardclaim.types.RewardLanguage class UISelectedReward(middle: XConstraint) : UIBlock(VigilancePalette.getHighlight().withAlpha(204)) { @@ -76,7 +76,7 @@ class UISelectedReward(middle: XConstraint) : UIBlock(VigilancePalette.getHighli data.image?.let { it.url?.let { url -> - val imageType = RewardConfiguration.getImageType(it.imageType) + val imageType = ExternalConfiguration.getImageType(it.imageType) image?.let(imageBackground::removeChild) image = UIImage.ofURL(url, MappedImageCache).constrain { width = imageType.width.percent() -- cgit