summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardClaim.kt28
-rw-r--r--src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardConfiguration.kt45
-rw-r--r--src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardLanguage.kt8
-rw-r--r--src/main/kotlin/tech/thatgravyboat/rewardclaim/adapter/KotlinLanguageAdapter.kt27
-rw-r--r--src/main/kotlin/tech/thatgravyboat/rewardclaim/types/AdData.kt3
-rw-r--r--src/main/kotlin/tech/thatgravyboat/rewardclaim/types/ImageType.kt3
-rw-r--r--src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardData.kt54
-rw-r--r--src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardImage.kt5
-rw-r--r--src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardRarity.kt1
-rw-r--r--src/main/kotlin/tech/thatgravyboat/rewardclaim/types/StreakData.kt2
-rw-r--r--src/main/kotlin/tech/thatgravyboat/rewardclaim/types/WebData.kt68
-rw-r--r--src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/RewardClaimGui.kt134
-rw-r--r--src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UIButton.kt8
-rw-r--r--src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UIPopup.kt32
-rw-r--r--src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UIReward.kt34
-rw-r--r--src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UISelectedReward.kt17
16 files changed, 249 insertions, 220 deletions
diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardClaim.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardClaim.kt
index 29628ae..5656692 100644
--- a/src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardClaim.kt
+++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardClaim.kt
@@ -11,7 +11,12 @@ import net.minecraftforge.fml.common.event.FMLPreInitializationEvent
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
import tech.thatgravyboat.rewardclaim.ui.RewardClaimGui
-@Mod(name = "RewardClaim", modid = "gravyrewardclaim", version = "1.0.0", modLanguageAdapter = "tech.thatgravyboat.rewardclaim.adapter.KotlinLanguageAdapter")
+@Mod(
+ name = "RewardClaim",
+ modid = "gravyrewardclaim",
+ version = "1.0.0",
+ modLanguageAdapter = "gg.essential.api.utils.KotlinAdapter"
+)
object ForgeTemplate {
private var rewardClaimTime: Long = 0
@@ -28,26 +33,25 @@ object ForgeTemplate {
@SubscribeEvent
fun onChatMessage(event: ClientChatReceivedEvent) {
- val rewardMatcher = RewardConfiguration.rewardMessageRegex.matcher(event.message.unformattedText.trim())
- val rewardMissedMatcher = RewardConfiguration.rewardMissedMessageRegex.matcher(event.message.unformattedText.trim())
-
- if (rewardMatcher.matches()) {
- EssentialAPI.getGuiUtil().openScreen(RewardClaimGui(rewardMatcher.group("id")))
+ RewardConfiguration.rewardMessageRegex.matchEntire(event.message.unformattedText.trim())?.apply {
+ EssentialAPI.getGuiUtil().openScreen(RewardClaimGui(groups["id"]!!.value))
rewardClaimTime = System.currentTimeMillis()
}
- if (rewardMissedMatcher.matches()) {
+
+ 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(rewardMissedMatcher.group("id"))) }
- )
+ "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
}
}
@SubscribeEvent
fun onScreen(event: GuiOpenEvent) {
- if (EssentialAPI.getGuiUtil().openedScreen() is RewardClaimGui && event.gui is GuiScreenBook && System.currentTimeMillis() - rewardClaimTime <= 3000){
+ if (EssentialAPI.getGuiUtil()
+ .openedScreen() is RewardClaimGui && event.gui is GuiScreenBook && System.currentTimeMillis() - rewardClaimTime <= 3000
+ ) {
event.isCanceled = true
rewardClaimTime = 0
}
diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardConfiguration.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardConfiguration.kt
index 3d8a79a..01e2af1 100644
--- a/src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardConfiguration.kt
+++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardConfiguration.kt
@@ -1,41 +1,38 @@
package tech.thatgravyboat.rewardclaim
import com.google.gson.Gson
-import com.google.gson.JsonObject
-import net.minecraft.util.JsonUtils
+import tech.thatgravyboat.rewardclaim.types.ImageType
import tech.thatgravyboat.rewardclaim.types.RewardImage
import java.io.IOException
import java.net.URL
import java.util.*
-import java.util.regex.Pattern
+import kotlin.collections.HashMap
private val GSON = Gson()
+private val DEFAULT_IMAGE_TYPE = ImageType(142, 100, false)
object RewardConfiguration {
- val TEXTURES: MutableMap<String, RewardImage> = HashMap<String, RewardImage>()
- var rewardMessageRegex: Pattern = Pattern.compile("Click the link to visit our website and claim your reward: https://rewards\\.hypixel\\.net/claim-reward/(?<id>[A-Za-z0-9]{8})")
- var rewardMissedMessageRegex: Pattern = Pattern.compile("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/(?<id>[A-Za-z0-9]{8})")
- var userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"
+ private lateinit var imageTypes: HashMap<String, ImageType>
+ lateinit var textures: HashMap<String, RewardImage>
+ lateinit var rewardMessageRegex: Regex
+ lateinit var rewardMissedMessageRegex: Regex
+ lateinit var userAgent: String
- fun loadData() {
- val json = GSON.fromJson(readData(), JsonObject::class.java)
-
- json.get("textures")?.apply {
- for (texture in asJsonArray) {
- val image = texture.asJsonObject
- TEXTURES[image["id"].asString] = RewardImage(image["url"].asString, JsonUtils.getInt(image, "height", 142))
- }
- }
+ fun getImageType(type: String?) = if (type == null) DEFAULT_IMAGE_TYPE else imageTypes.getOrDefault(type, DEFAULT_IMAGE_TYPE)
- json.get("rewardRegex")?.apply { rewardMessageRegex = Pattern.compile(asString) }
- json.get("missedRewardRegex")?.apply { rewardMissedMessageRegex = Pattern.compile(asString) }
- json.get("userAgent")?.apply { userAgent = asString }
+ 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://gist.githubusercontent.com/ThatGravyBoat/05cf118ea1daced936f040a41a648819/raw/2410c868444b073fd212fbed1da5a063d79dc816/data.json").openStream(),
+ URL("https://raw.githubusercontent.com/ThatGravyBoat/RewardClaim/master/data.json").openStream(),
"UTF-8"
).use { scanner ->
scanner.useDelimiter("\\A")
@@ -46,4 +43,12 @@ object RewardConfiguration {
}
return ""
}
+
+ private data class JsonConfig(
+ val imageTypes: HashMap<String, ImageType> = hashMapOf(),
+ val textures: HashMap<String, RewardImage> = hashMapOf(),
+ val rewardRegex: String = "Click the link to visit our website and claim your reward: https://rewards\\.hypixel\\.net/claim-reward/(?<id>[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/(?<id>[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
index 6361bc5..8a9ab36 100644
--- a/src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardLanguage.kt
+++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/RewardLanguage.kt
@@ -1,8 +1,6 @@
package tech.thatgravyboat.rewardclaim
-import java.util.regex.Pattern
-
-private val TRANSLATION_LINE_REGEX = Pattern.compile("\"(?<key>.*)\": ?\"(?<text>.*)\",?")
+private val TRANSLATION_LINE_REGEX = Regex("\"(?<key>.*)\": ?\"(?<text>.*)\",?")
class RewardLanguage(translationDataFromHtml: String) {
@@ -13,8 +11,8 @@ class RewardLanguage(translationDataFromHtml: String) {
//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.matcher(translationDataFromHtml.replace("\\'", "'")).apply {
- while (find()) translations[group("key")] = group("text")
+ 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/adapter/KotlinLanguageAdapter.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/adapter/KotlinLanguageAdapter.kt
deleted file mode 100644
index 11b3188..0000000
--- a/src/main/kotlin/tech/thatgravyboat/rewardclaim/adapter/KotlinLanguageAdapter.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-package tech.thatgravyboat.rewardclaim.adapter
-
-import net.minecraftforge.fml.common.FMLModContainer
-import net.minecraftforge.fml.common.ILanguageAdapter
-import net.minecraftforge.fml.common.ModContainer
-import net.minecraftforge.fml.relauncher.Side
-import java.lang.reflect.Field
-import java.lang.reflect.Method
-
-class KotlinLanguageAdapter : ILanguageAdapter {
- override fun supportsStatics() = false
-
- override fun setProxy(target: Field, proxyTarget: Class<*>, proxy: Any) {
- target.set(proxyTarget.getDeclaredField("INSTANCE").get(null), proxy)
- }
-
- override fun getNewInstance(
- container: FMLModContainer,
- objectClass: Class<*>,
- classLoader: ClassLoader,
- factoryMarkedAnnotation: Method?
- ): Any {
- return objectClass.fields.find { it.name == "INSTANCE" }?.get(null) ?: objectClass.newInstance()
- }
-
- override fun setInternalProxies(mod: ModContainer?, side: Side?, loader: ClassLoader?) {}
-} \ No newline at end of file
diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/AdData.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/AdData.kt
new file mode 100644
index 0000000..fe3dcb2
--- /dev/null
+++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/AdData.kt
@@ -0,0 +1,3 @@
+package tech.thatgravyboat.rewardclaim.types
+
+data class AdData(val link: String, val duration: Int)
diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/ImageType.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/ImageType.kt
new file mode 100644
index 0000000..85b9b90
--- /dev/null
+++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/ImageType.kt
@@ -0,0 +1,3 @@
+package tech.thatgravyboat.rewardclaim.types
+
+data class ImageType(val height: Int, val width: Int, val center: Boolean)
diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardData.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardData.kt
index cc89422..4695cbf 100644
--- a/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardData.kt
+++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardData.kt
@@ -1,42 +1,54 @@
package tech.thatgravyboat.rewardclaim.types
+import com.google.gson.annotations.SerializedName
import tech.thatgravyboat.rewardclaim.RewardConfiguration
import tech.thatgravyboat.rewardclaim.RewardLanguage
import java.util.*
-import java.util.regex.Pattern
-private val ARMOR_PIECE_REGEX = Pattern.compile("^[a-z0-9_]+_([a-z]+)$", Pattern.CASE_INSENSITIVE)
-private val ARMOR_REGEX = Pattern.compile("_([a-z]+)$", Pattern.CASE_INSENSITIVE)
+private val ARMOR_PIECE_REGEX = Regex("^[a-z0-9_]+_([a-z]+)$", RegexOption.IGNORE_CASE)
+private val ARMOR_REGEX = Regex("_([a-z]+)$", RegexOption.IGNORE_CASE)
-class RewardData(val rarity: RewardRarity,
- private val reward : String,
- val amount : Int?,
- val boxes : Int?,
- private val gameMode : GameMode?,
- private val rewardPackage : String?,
- private val rewardKey : String?
- ) {
+data class RewardData(
+ val rarity: RewardRarity,
+ private val reward: String,
+ val amount: Int?,
+ val intlist: Array<Int>?,
+ private val gameType: GameMode?,
+ @SerializedName("package") private val rewardPackage: String?,
+ @SerializedName("key") private val rewardKey: String?
+) {
fun getDisplayName(language: RewardLanguage): String {
rewardPackage?.let { item ->
if (reward.equals("housing_package", ignoreCase = true)) {
- return "${rarity.color}${language.translate("housing.skull." + item.replace("specialoccasion_reward_card_skull_", ""))}"
+ return "${rarity.color}${
+ language.translate(
+ "housing.skull." + item.replace(
+ "specialoccasion_reward_card_skull_",
+ ""
+ )
+ )
+ }"
}
}
rewardKey?.let { key ->
if (reward.equals("add_vanity", ignoreCase = true)) {
- val pieceMatcher = ARMOR_PIECE_REGEX.matcher(key)
- val armorMatcher = ARMOR_REGEX.matcher(key)
- if ("suit" in key && pieceMatcher.find() && armorMatcher.find()) {
- return "${rarity.color}${language.translate("vanity." + armorMatcher.group(1))} ${language.translate("vanity.armor." + pieceMatcher.group(1))}"
+ val pieceMatcher = ARMOR_PIECE_REGEX.find(key)
+ val armorMatcher = ARMOR_REGEX.find(key)
+ if ("suit" in key && pieceMatcher != null && armorMatcher != null) {
+ return "${rarity.color}${language.translate("vanity." + armorMatcher.groups[1]!!.value)} ${
+ language.translate(
+ "vanity.armor." + pieceMatcher.groups[1]!!.value
+ )
+ }"
} else if ("emote" in key || "taunt" in key) {
return "${rarity.color}${language.translate("vanity.$key")}"
}
}
}
return if (reward.equals("tokens", ignoreCase = true) || reward.equals("coins", ignoreCase = true)) {
- "${rarity.color}${language.translate("type.$reward").replace("{\$game}", gameMode!!.displayName)}"
+ "${rarity.color}${language.translate("type.$reward").replace("{\$game}", gameType!!.displayName)}"
} else {
"${rarity.color}${language.translate("type.$reward")}"
}
@@ -53,7 +65,9 @@ class RewardData(val rarity: RewardRarity,
}
}
return if (reward.equals("tokens", ignoreCase = true) || reward.equals("coins", ignoreCase = true)) {
- "${rarity.color}${language.translate("type.$reward.description").replace("{\$game}", gameMode!!.displayName)}"
+ "${rarity.color}${
+ language.translate("type.$reward.description").replace("{\$game}", gameType!!.displayName)
+ }"
} else {
"${rarity.color}${language.translate("type.$reward.description")}"
}
@@ -74,9 +88,9 @@ class RewardData(val rarity: RewardRarity,
rewardPackage?.let { item ->
if (id == "housing_package") {
val packageId = item.replace("specialoccasion_reward_card_skull_", "")
- RewardConfiguration.TEXTURES[id + "_" + packageId]?.let { image -> return image }
+ RewardConfiguration.textures[id + "_" + packageId]?.let { image -> return image }
}
}
- return RewardConfiguration.TEXTURES[id]
+ return RewardConfiguration.textures[id]
}
} \ No newline at end of file
diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardImage.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardImage.kt
index fc8446a..d70143b 100644
--- a/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardImage.kt
+++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardImage.kt
@@ -1,13 +1,14 @@
package tech.thatgravyboat.rewardclaim.types
+import com.google.gson.annotations.SerializedName
import java.net.MalformedURLException
import java.net.URL
-class RewardImage(private val urlString: String, val height: Int) {
+data class RewardImage(@SerializedName("url") private val urlIn: String, val imageType: String) {
val url: URL?
get() {
return try {
- URL(urlString)
+ URL(urlIn)
} catch (ignored: MalformedURLException) {
null
}
diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardRarity.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardRarity.kt
index d4e45b1..43cce0c 100644
--- a/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardRarity.kt
+++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/RewardRarity.kt
@@ -3,6 +3,7 @@ package tech.thatgravyboat.rewardclaim.types
import gg.essential.universal.ChatColor
import java.awt.Color
+@Suppress("unused")
enum class RewardRarity(val translationKey: String, val color: ChatColor) {
COMMON("rarity.common", ChatColor.WHITE),
RARE("rarity.rare", ChatColor.AQUA),
diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/StreakData.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/StreakData.kt
index 4a5cb98..ef7e6fc 100644
--- a/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/StreakData.kt
+++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/StreakData.kt
@@ -1,3 +1,3 @@
package tech.thatgravyboat.rewardclaim.types
-class StreakData(val progress : Int, val current : Int, val highest : Int) \ No newline at end of file
+data class StreakData(val progress: Int, val current: Int, val highest: Int) \ 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 38318d1..bdaafe1 100644
--- a/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/WebData.kt
+++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/types/WebData.kt
@@ -1,60 +1,40 @@
package tech.thatgravyboat.rewardclaim.types
import com.google.gson.Gson
-import com.google.gson.JsonObject
-import net.minecraft.util.JsonUtils
import tech.thatgravyboat.rewardclaim.RewardLanguage
-import java.util.regex.Matcher
private val GSON = Gson()
-class WebData(security : Matcher, data : Matcher, i18n : Matcher) {
+class WebData(security: MatchResult, data: MatchResult, i18n: MatchResult) {
- val securityToken : String = security.group("token")
- val language : RewardLanguage = RewardLanguage(i18n.group("translations"))
+ val securityToken: String = security.groups["token"]!!.value
+ val language: RewardLanguage = RewardLanguage(i18n.groups["translations"]!!.value)
val rewards = mutableListOf<RewardData>()
- var streak : StreakData = StreakData(0,0,0)
- var activeAd : Int = 0
- var adLink : String = "https://store.hypixel.net/?utm_source=rewards-video&utm_medium=website&utm_content=TRsCiBNYY7M&utm_campaign=Rewards"
- var skippable : Boolean = false
- var duration : Int = 30
+ var streak: StreakData = StreakData(0, 0, 0)
+ var activeAd: Int = 0
+ var adLink: String =
+ "https://store.hypixel.net/?utm_source=rewards-video&utm_medium=website&utm_content=TRsCiBNYY7M&utm_campaign=Rewards"
+ var skippable: Boolean = false
+ var duration: Int = 30
init {
- val json = GSON.fromJson(data.group("data"), JsonObject::class.java)
- json.get("rewards")?.let {
- if (it.isJsonArray) {
- it.asJsonArray.forEach { jsonObject ->
- val rewardObject = jsonObject.asJsonObject
- rewards.add(RewardData(
- RewardRarity.valueOf(rewardObject.get("rarity").asString!!),
- rewardObject.get("reward").asString!!,
- if (rewardObject.has("amount")) rewardObject.get("amount").asInt else null,
- if (rewardObject.has("intlist")) rewardObject.get("intlist").asJsonArray.size() else null,
- if (rewardObject.has("gameType")) GameMode.getModeFromId(rewardObject.get("gameType").asString) else null,
- JsonUtils.getString(rewardObject, "package", null),
- JsonUtils.getString(rewardObject, "key", null),
- ))
- }
- }
+ GSON.fromJson(data.groups["data"]!!.value, JsonWebData::class.java)?.let {
+ rewards.addAll(it.rewards)
+ streak = it.dailyStreak
+ activeAd = it.activeAd
+ adLink = it.ad.link
+ duration = it.ad.duration
+ skippable = it.skippable
}
-
- json.get("dailyStreak")?.let {
- val streakObject = it.asJsonObject
- streak = StreakData(JsonUtils.getInt(streakObject, "value", 0),
- JsonUtils.getInt(streakObject, "score", 0),
- JsonUtils.getInt(streakObject, "highScore", 0)
- )
- }
-
- json.get("activeAd")?.let { activeAd = it.asInt }
- json.get("ad")?.let { jsonObject ->
- val adObject = jsonObject.asJsonObject
- adObject.get("link")?.let { adLink = it.asString }
- adObject.get("duration")?.let { duration = it.asInt }
- }
- json.get("skippable")?.let { skippable = it.asBoolean }
-
}
+ private data class JsonWebData(
+ val rewards: List<RewardData>,
+ val dailyStreak: StreakData,
+ val activeAd: Int,
+ val ad: AdData,
+ val skippable: Boolean
+ )
+
} \ No newline at end of file
diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/RewardClaimGui.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/RewardClaimGui.kt
index 8f1d535..0e5b054 100644
--- a/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/RewardClaimGui.kt
+++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/RewardClaimGui.kt
@@ -16,16 +16,14 @@ import java.awt.Color
import java.net.*
import java.nio.charset.Charset
import java.util.concurrent.TimeUnit
-import java.util.regex.Matcher
-import java.util.regex.Pattern
private val BUTTON_HOVER = Color(0, 212, 105)
-private val SECURITY_REGEX = Pattern.compile("window\\.securityToken = \"(?<token>.*)\";")
-private val DATA_REGEX = Pattern.compile("window\\.appData = '(?<data>\\{.*})';")
-private val I18N_REGEX = Pattern.compile("window.i18n = \\{(?<translations>.*)};", Pattern.DOTALL)
+private val SECURITY_REGEX = Regex("window\\.securityToken = \"(?<token>.*)\";")
+private val DATA_REGEX = Regex("window\\.appData = '(?<data>\\{.*})';")
+private val I18N_REGEX = Regex("window.i18n = \\{(?<translations>.*)};", RegexOption.DOT_MATCHES_ALL)
-class RewardClaimGui(private val id : String) : WindowScreen() {
+class RewardClaimGui(private val id: String) : WindowScreen() {
private var state: State = State.LOADING
private var selected = -1
@@ -48,32 +46,29 @@ class RewardClaimGui(private val id : String) : WindowScreen() {
doOutput = true
inputStream.use {
val html = IOUtils.toString(it, Charset.defaultCharset())
- val securityMatcher: Matcher = SECURITY_REGEX.matcher(html)
- val dataMatcher: Matcher = DATA_REGEX.matcher(html)
- val i18nMatcher: Matcher = I18N_REGEX.matcher(html)
- val securityFound = securityMatcher.find()
- val dataFound = dataMatcher.find()
- val i18nFound = i18nMatcher.find()
-
- if (securityFound && dataFound && i18nFound) {
+ val securityMatcher = SECURITY_REGEX.find(html)
+ val dataMatcher = DATA_REGEX.find(html)
+ val i18nMatcher = I18N_REGEX.find(html)
+
+ if (securityMatcher != null && dataMatcher != null && i18nMatcher != null) {
data = WebData(securityMatcher, dataMatcher, i18nMatcher)
if (data.rewards.isEmpty()) {
state = State.FAILED_REWARDS
errorPopup("Rewards were empty.")
- }else {
+ } else {
state = State.SUCCESSFUL
updateElements()
}
- if (data.skippable || data.duration == 0){
+ if (data.skippable || data.duration == 0) {
adPopup(true)
- }else {
+ } else {
schedule({ adPopup(true) }, data.duration.toLong(), TimeUnit.SECONDS)
}
} else {
state = State.FAILED_REWARDS
- errorPopup("Regex could not be found.\nSecurity: $securityFound\nI18n: $i18nFound\nData: $dataFound")
+ errorPopup("Regex could not be found.\nSecurity: ${securityMatcher != null}\nI18n: ${i18nMatcher != null}\nData: $${dataMatcher != null}")
}
}
}
@@ -171,7 +166,7 @@ class RewardClaimGui(private val id : String) : WindowScreen() {
} childOf background
}
- private val streaks = Array(9){ i ->
+ private val streaks = Array(9) { i ->
UICircle(5f, VigilancePalette.getDivider(), 15).let {
it.constrain {
x = ((15.percent() + (15.percent() - 0.5.pixel())) - 45.pixel()) + (it.getWidth() * i).pixel()
@@ -182,21 +177,22 @@ class RewardClaimGui(private val id : String) : WindowScreen() {
//endregion
- private val rewards = Array(3){ i -> UIReward(57.5.percent(), 30.percent() + (18 * i).percent()) childOf background}.also {
- for (reward in it) {
- reward.onMouseClick { event ->
- if (event.mouseButton == 0 && state == State.SUCCESSFUL) {
- for (j in 0..2) {
- it[j].setSelected(it[j] == reward)
- if (it[j] != event.currentTarget) continue
- selected = j
- selectedReward.updateInfo(data.rewards[selected], data.language)
+ private val rewards =
+ Array(3) { i -> UIReward(57.5.percent(), 30.percent() + (18 * i).percent()) childOf background }.also {
+ for (reward in it) {
+ reward.onMouseClick { event ->
+ if (event.mouseButton == 0 && state == State.SUCCESSFUL) {
+ for (j in 0..2) {
+ it[j].setSelected(it[j] == reward)
+ if (it[j] != event.currentTarget) continue
+ selected = j
+ selectedReward.updateInfo(data.rewards[selected], data.language)
+ }
}
}
+ reward.hide(true)
}
- reward.hide(true)
}
- }
private fun updateElements() {
data.let {
@@ -213,56 +209,62 @@ class RewardClaimGui(private val id : String) : WindowScreen() {
}
}
- private var popup : UIPopup? = null
+ private var popup: UIPopup? = null
- private fun errorPopup(error : String) {
+ private fun errorPopup(error: String) {
Window.enqueueRenderOperation {
popup?.let {
- if (it.parent.hasParent){
+ if (it.parent.hasParent) {
it.parent.removeChild(it)
popup = null
}
}
popup = UIPopup(
- "${ChatColor.RED}An Error Occurred!", error,
- UIImage.ofResourceCached("/vigilance/cancel.png"),
- { restorePreviousScreen() },
- "${ChatColor.BOLD}Close",
- UIImage.ofResourceCached("/rewardclaim/external_link.png"),
- { UDesktop.browse(URI("https://rewards.hypixel.net/claim-reward/${id}")) },
- "${ChatColor.BOLD}Reward"
+ "${ChatColor.RED}An Error Occurred!", error,
+ UIImage.ofResourceCached("/vigilance/cancel.png"),
+ { restorePreviousScreen() },
+ "${ChatColor.BOLD}Close",
+ UIImage.ofResourceCached("/rewardclaim/external_link.png"),
+ { UDesktop.browse(URI("https://rewards.hypixel.net/claim-reward/${id}")) },
+ "${ChatColor.BOLD}Reward"
) childOf this.window
}
}
private fun confirmPopup() {
- popup = UIPopup("Confirmation", "Are you sure you want to claim this reward. Click 'Back' if you would like to change which reward you would like to claim or 'Continue' if you like to go ahead with your reward.",
- null, { 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
+ popup = UIPopup(
+ "Confirmation",
+ "Are you sure you want to claim this reward. Click 'Back' if you would like to change which reward you would like to claim or 'Continue' if you like to go ahead with your reward.",
+ null,
+ { 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
}
- }, "${ChatColor.BOLD}Continue"
+ }
+ },
+ "${ChatColor.BOLD}Continue"
) childOf this.window
}
private fun removePopup() {
Window.enqueueRenderOperation {
popup?.let {
- if (it.parent.hasParent){
+ if (it.parent.hasParent) {
it.parent.removeChild(it)
popup = null
}
@@ -273,7 +275,7 @@ class RewardClaimGui(private val id : String) : WindowScreen() {
private fun adPopup(skip: Boolean) {
Window.enqueueRenderOperation {
popup?.let {
- if (it.parent.hasParent){
+ if (it.parent.hasParent) {
it.parent.removeChild(it)
popup = null
}
@@ -282,14 +284,20 @@ class RewardClaimGui(private val id : String) : WindowScreen() {
UIPopup(
"Reward Claim AD",
"Hypixel is a great server and as such we don't want to remove their ad for their store. You can click the skip button when it appears to remove this message and claim your reward.",
- UIImage.ofResourceCached("/rewardclaim/external_link.png"), { UDesktop.browse(URI(data.adLink)) }, "${ChatColor.BOLD}Store",
- null, { removePopup() }, "${ChatColor.BOLD}Skip"
+ UIImage.ofResourceCached("/rewardclaim/external_link.png"),
+ { UDesktop.browse(URI(data.adLink)) },
+ "${ChatColor.BOLD}Store",
+ null,
+ { removePopup() },
+ "${ChatColor.BOLD}Skip"
) childOf this.window
} else {
UIPopup(
"Reward Claim AD",
"Hypixel is a great server and as such we don't want to remove their ad for their store. You can click the skip button when it appears to remove this message and claim your reward.",
- UIImage.ofResourceCached("/rewardclaim/external_link.png"), { UDesktop.browse(URI(data.adLink)) }, "${ChatColor.BOLD}Store"
+ UIImage.ofResourceCached("/rewardclaim/external_link.png"),
+ { UDesktop.browse(URI(data.adLink)) },
+ "${ChatColor.BOLD}Store"
) childOf this.window
}
}
diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UIButton.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UIButton.kt
index e1037d0..ec92f25 100644
--- a/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UIButton.kt
+++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UIButton.kt
@@ -11,7 +11,13 @@ import java.awt.Color
private val BUTTON_HOVER = Color(0, 212, 105)
-class UIButton(private val image : UIImage?, private val widthIn : Float, private var xConstraint : XConstraint, private val text : UIText, alignment: Alignment) : UIBlock(VigilancePalette.getAccent()) {
+class UIButton(
+ private val image: UIImage?,
+ private val widthIn: Float,
+ private var xConstraint: XConstraint,
+ private val text: UIText,
+ alignment: Alignment
+) : UIBlock(VigilancePalette.getAccent()) {
init {
if (alignment == Alignment.LEFT) {
diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UIPopup.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UIPopup.kt
index a3b4363..62734c4 100644
--- a/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UIPopup.kt
+++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UIPopup.kt
@@ -12,11 +12,16 @@ import gg.essential.elementa.utils.withAlpha
import gg.essential.vigilance.gui.VigilancePalette
import gg.essential.vigilance.gui.VigilancePalette.getBackground
-class UIPopup private constructor(title : String, text : String) : UIBlock(getBackground().withAlpha(200)) {
+class UIPopup private constructor(title: String, text: String) : UIBlock(getBackground().withAlpha(200)) {
private val box: UIBlock
- constructor(title : String, text : String, image : UIImage? = null, event : (UIComponent.(event: UIClickEvent) -> Unit), buttonText : String
+ constructor(
+ title: String,
+ text: String,
+ image: UIImage? = null,
+ event: (UIComponent.(event: UIClickEvent) -> Unit),
+ buttonText: String
) : this(title, text) {
val btnText = UIText(buttonText, false)
@@ -25,9 +30,10 @@ class UIPopup private constructor(title : String, text : String) : UIBlock(getBa
UIButton(image, width, CenterConstraint(), btnText, Alignment.MIDDLE).onMouseClick(event) childOf box
}
- constructor(title : String, text : String,
- image1 : UIImage? = null, event1 : (UIComponent.(event: UIClickEvent) -> Unit), buttonText : String,
- image2 : UIImage? = null, event2 : (UIComponent.(event: UIClickEvent) -> Unit), buttonText2 : String
+ constructor(
+ title: String, text: String,
+ image1: UIImage? = null, event1: (UIComponent.(event: UIClickEvent) -> Unit), buttonText: String,
+ image2: UIImage? = null, event2: (UIComponent.(event: UIClickEvent) -> Unit), buttonText2: String
) : this(title, text) {
val btn1Text = UIText(buttonText, false)
@@ -37,8 +43,20 @@ class UIPopup private constructor(title : String, text : String) : UIBlock(getBa
val width = btn1Width.coerceAtLeast(btn2Width)
- UIButton(image1, width, CenterConstraint() - 5.percent(), btn1Text, Alignment.RIGHT).onMouseClick(event1) childOf box
- UIButton(image2, width, CenterConstraint() + 5.percent(), btn2Text, Alignment.LEFT).onMouseClick(event2) childOf box
+ UIButton(
+ image1,
+ width,
+ CenterConstraint() - 5.percent(),
+ btn1Text,
+ Alignment.RIGHT
+ ).onMouseClick(event1) childOf box
+ UIButton(
+ image2,
+ width,
+ CenterConstraint() + 5.percent(),
+ btn2Text,
+ Alignment.LEFT
+ ).onMouseClick(event2) childOf box
}
init {
diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UIReward.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UIReward.kt
index da5014f..02408d4 100644
--- a/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UIReward.kt
+++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UIReward.kt
@@ -3,6 +3,7 @@ package tech.thatgravyboat.rewardclaim.ui
import gg.essential.elementa.components.UIBlock
import gg.essential.elementa.components.UIImage
import gg.essential.elementa.components.UIText
+import gg.essential.elementa.constraints.CenterConstraint
import gg.essential.elementa.constraints.XConstraint
import gg.essential.elementa.constraints.YConstraint
import gg.essential.elementa.dsl.*
@@ -11,15 +12,17 @@ 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.types.RewardData
-class UIReward(xConstraint: XConstraint, yConstraint: YConstraint) : UIBlock(VigilancePalette.getHighlight().withAlpha(204)) {
+class UIReward(xConstraint: XConstraint, yConstraint: YConstraint) :
+ UIBlock(VigilancePalette.getHighlight().withAlpha(204)) {
- private val imageBackground : UIBlock
- private val title : UIText
- private val rarityDesc : UIText
- private val amountDesc : UIText
+ private val imageBackground: UIBlock
+ private val title: UIText
+ private val rarityDesc: UIText
+ private val amountDesc: UIText
init {
constrain {
@@ -64,20 +67,20 @@ class UIReward(xConstraint: XConstraint, yConstraint: YConstraint) : UIBlock(Vig
amountDesc = UIText("Amount: ${ChatColor.GOLD}0").constrain {
x = rightSideStart
- y = 26.percent() + (5+rarityDesc.getHeight()).pixel()
+ y = 26.percent() + (5 + rarityDesc.getHeight()).pixel()
} childOf this
amountDesc.hide(true)
}
- fun setSelected(selected : Boolean) {
+ fun setSelected(selected: Boolean) {
if (selected) {
enableEffect(OutlineEffect(VigilancePalette.getAccent(), 1F))
- }else {
+ } else {
removeEffect<OutlineEffect>()
}
}
- fun setData(data : RewardData, language : RewardLanguage) {
+ fun setData(data: RewardData, language: RewardLanguage) {
title.setText(data.getDisplayName(language))
rarityDesc.setText("Rarity: ${data.rarity.color}${language.translate(data.rarity.translationKey)}")
@@ -86,16 +89,21 @@ class UIReward(xConstraint: XConstraint, yConstraint: YConstraint) : UIBlock(Vig
amountDesc.unhide(true)
}
- data.boxes?.let {
- amountDesc.setText("Boxes: ${ChatColor.GOLD}$it")
+ data.intlist?.let {
+ amountDesc.setText("Boxes: ${ChatColor.GOLD}${it.size}")
amountDesc.unhide(true)
}
data.image?.let {
it.url?.let { url ->
+ val imageType = RewardConfiguration.getImageType(it.imageType)
UIImage.ofURL(url, MappedImageCache).constrain {
- width = 100.percent()
- height = it.height.percent()
+ width = imageType.width.percent()
+ height = imageType.height.percent()
+ if (imageType.center) {
+ x = CenterConstraint()
+ y = CenterConstraint()
+ }
} childOf imageBackground
}
}
diff --git a/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UISelectedReward.kt b/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UISelectedReward.kt
index 47763dc..863ebc5 100644
--- a/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UISelectedReward.kt
+++ b/src/main/kotlin/tech/thatgravyboat/rewardclaim/ui/UISelectedReward.kt
@@ -4,6 +4,7 @@ import gg.essential.elementa.components.UIBlock
import gg.essential.elementa.components.UIImage
import gg.essential.elementa.components.UIText
import gg.essential.elementa.components.UIWrappedText
+import gg.essential.elementa.constraints.CenterConstraint
import gg.essential.elementa.constraints.XConstraint
import gg.essential.elementa.dsl.*
import gg.essential.elementa.effects.OutlineEffect
@@ -11,12 +12,13 @@ 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.types.RewardData
-class UISelectedReward(middle : XConstraint) : UIBlock(VigilancePalette.getHighlight().withAlpha(204)) {
+class UISelectedReward(middle: XConstraint) : UIBlock(VigilancePalette.getHighlight().withAlpha(204)) {
- private var image : UIImage? = null
+ private var image: UIImage? = null
private val displayName = UIText("Select a Reward!").constrain {
x = 31.percent()
@@ -68,16 +70,21 @@ class UISelectedReward(middle : XConstraint) : UIBlock(VigilancePalette.getHighl
rarity.setText("Rarity: ${data.rarity.color}${language.translate(data.rarity.translationKey)}")
if (data.amount != null) amount.setText("Amount: ${ChatColor.GOLD}${data.amount}")
- else if (data.boxes != null) amount.setText("Boxes: ${ChatColor.GOLD}${data.boxes}")
+ else if (data.intlist != null) amount.setText("Boxes: ${ChatColor.GOLD}${data.intlist.size}")
else amount.setText("")
desc.setText(data.getDescription(language))
data.image?.let {
it.url?.let { url ->
+ val imageType = RewardConfiguration.getImageType(it.imageType)
image?.let(imageBackground::removeChild)
image = UIImage.ofURL(url, MappedImageCache).constrain {
- height = it.height.percent()
- width = 100.percent()
+ width = imageType.width.percent()
+ height = imageType.height.percent()
+ if (imageType.center) {
+ x = CenterConstraint()
+ y = CenterConstraint()
+ }
} childOf imageBackground
}
}