From 95c7ef264e833661688dd71ab5b61f7c6f85b41d Mon Sep 17 00:00:00 2001 From: MLGPenguin Date: Tue, 26 Dec 2023 20:48:41 +1000 Subject: [PATCH] + Counting Ready to go! --- .env.example | 4 +- build.gradle.kts | 1 + libs/Math-Evaluator-1.2.0.jar | Bin 0 -> 19186 bytes src/main/kotlin/com/learnspigot/bot/Server.kt | 1 + .../bot/counting/CountingListener.kt | 106 ++++++++++++++++++ .../com/learnspigot/bot/profile/Profile.kt | 27 ++++- .../bot/profile/ProfileRegistry.kt | 15 ++- .../kotlin/com/learnspigot/bot/util/Mongo.kt | 2 + 8 files changed, 149 insertions(+), 7 deletions(-) create mode 100644 libs/Math-Evaluator-1.2.0.jar create mode 100644 src/main/kotlin/com/learnspigot/bot/counting/CountingListener.kt diff --git a/.env.example b/.env.example index 10cb08f..05bc6ec 100644 --- a/.env.example +++ b/.env.example @@ -18,6 +18,7 @@ PROJECTS_CHANNEL_ID= STARBOARD_CHANNEL_ID= SHOWCASE_CHANNEL_ID= NEWS_CHANNEL_ID= +COUNTING_CHANNEL_ID= STUDENT_ROLE_ID= SUPPORT_ROLE_ID= @@ -26,9 +27,8 @@ MANAGEMENT_ROLE_ID= VERIFIER_ROLE_ID= RIGHT_ARROW_EMOJI_ID= - UPVOTE_EMOJI_ID= DOWNVOTE_EMOJI_ID= - NOSTARBOARD_EMOJI_ID= + STARBOARD_AMOUNT= diff --git a/build.gradle.kts b/build.gradle.kts index 57491cb..75bccba 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -21,6 +21,7 @@ dependencies { implementation("gg.flyte:neptune:2.4") implementation("org.mongodb:mongodb-driver-sync:4.9.0") implementation("io.github.cdimascio:dotenv-kotlin:6.4.1") + implementation(files("libs/Math-Evaluator-1.2.0.jar")) } application { diff --git a/libs/Math-Evaluator-1.2.0.jar b/libs/Math-Evaluator-1.2.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..5bad21c2514bef26a11b26667bf1597ed6b4e133 GIT binary patch literal 19186 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 Jz=0qj{}0Z@bD#hK literal 0 HcmV?d00001 diff --git a/src/main/kotlin/com/learnspigot/bot/Server.kt b/src/main/kotlin/com/learnspigot/bot/Server.kt index 028c5d3..53492b2 100644 --- a/src/main/kotlin/com/learnspigot/bot/Server.kt +++ b/src/main/kotlin/com/learnspigot/bot/Server.kt @@ -17,6 +17,7 @@ object Server { val starboardChannel = guild.getTextChannelById(Environment.get("STARBOARD_CHANNEL_ID"))!! val helpChannel = guild.getForumChannelById(Environment.get("HELP_CHANNEL_ID"))!! val knowledgebaseChannel = guild.getForumChannelById(Environment.get("KNOWLEDGEBASE_CHANNEL_ID"))!! + val countingChannel = guild.getTextChannelById(Environment.get("COUNTING_CHANNEL_ID"))!! val upvoteEmoji = Emoji.fromCustom("upvote", Environment.get("UPVOTE_EMOJI_ID").toLong(), false) val downvoteEmoji = Emoji.fromCustom("downvote", Environment.get("DOWNVOTE_EMOJI_ID").toLong(), false) diff --git a/src/main/kotlin/com/learnspigot/bot/counting/CountingListener.kt b/src/main/kotlin/com/learnspigot/bot/counting/CountingListener.kt new file mode 100644 index 0000000..0a0c032 --- /dev/null +++ b/src/main/kotlin/com/learnspigot/bot/counting/CountingListener.kt @@ -0,0 +1,106 @@ +package com.learnspigot.bot.counting + +import com.learnspigot.bot.Environment +import com.learnspigot.bot.Server +import com.learnspigot.bot.profile.ProfileRegistry +import com.learnspigot.bot.util.Mongo +import com.mongodb.client.model.Filters +import gg.flyte.neptune.annotation.Inject +import me.superpenguin.mathevaluator.Evaluator +import net.dv8tion.jda.api.entities.Message +import net.dv8tion.jda.api.entities.User +import net.dv8tion.jda.api.entities.channel.Channel +import net.dv8tion.jda.api.events.message.MessageDeleteEvent +import net.dv8tion.jda.api.events.message.MessageReceivedEvent +import net.dv8tion.jda.api.events.message.MessageUpdateEvent +import net.dv8tion.jda.api.hooks.ListenerAdapter +import org.bson.Document + +class CountingListener: ListenerAdapter() { + + @Inject private lateinit var profileRegistry: ProfileRegistry + + private val mongoCollection = Mongo.countingCollection + + var topServerCount: Int = 0 + var serverTotalCounts: Int = 0 + var currentCount = 0 + + var lastCount: Message? = null + + init { + val document = mongoCollection.find().first() + if (document == null) { + val newDoc = Document() + newDoc["highestCount"] = 0 + newDoc["currentCount"] = 0 + newDoc["serverTotalCounts"] = 0 + mongoCollection.insertOne(newDoc) + } else { + topServerCount = document.getInteger("highestCount", 0) + currentCount = document.getInteger("currentCount", 0) + serverTotalCounts = document.getInteger("serverTotalCounts", 0) + } + } + + fun incrementCount(user: User) { + currentCount++ + serverTotalCounts++ + profileRegistry.findByUser(user).incrementCount(currentCount) + if (currentCount > topServerCount) topServerCount = currentCount + val newDoc = mongoCollection.find().first()!! + newDoc["highestCount"] = topServerCount + newDoc["currentCount"] = currentCount + newDoc["serverTotalCounts"] = serverTotalCounts + mongoCollection.replaceOne(Filters.eq("_id", newDoc.getObjectId("_id")), newDoc) + } + + fun fuckedUp(user: User) { + currentCount = 0 + lastCount = null + profileRegistry.findByUser(user).fuckedUpCounting() + } + + private fun Channel.isCounting() = id == Environment.get("COUNTING_CHANNEL_ID") + + override fun onMessageReceived(event: MessageReceivedEvent) { + if (event.author.isBot || !event.isFromGuild || !event.channel.isCounting() || event.guild.id != Server.guildId) return + if (event.message.embeds.isNotEmpty()) return + + val msg = event.message.contentRaw + val userId = event.author.id + if (Evaluator.isValidSyntax(msg)) { + val evaluated = Evaluator.eval(msg).intValue() + if (evaluated == currentCount + 1) { + if (userId.equals(lastCount?.author?.id, true)) return run { + event.message.addReaction(Server.downvoteEmoji) + event.message.reply("You can't count twice in a row, let someone else join in!").queue() + fuckedUp(event.author) + } + lastCount = event.message + event.message.addReaction(Server.upvoteEmoji).queue() + incrementCount(event.author) + } else { + val next = currentCount + 1 + fuckedUp(event.author) + event.message.addReaction(Server.downvoteEmoji).queue() + event.message.reply("The next number was $next").queue() + } + } + } + + override fun onMessageDelete(event: MessageDeleteEvent) { + if (!event.channel.isCounting()) return + if (event.messageId == lastCount?.id) { + Server.countingChannel.sendMessage("${lastCount?.author?.asMention} deleted their count of $currentCount").queue() + } + } + + override fun onMessageUpdate(event: MessageUpdateEvent) { + if (!event.channel.isCounting()) return + if (event.messageId == lastCount?.id) { + Server.countingChannel.sendMessage("${event.author.asMention} edited their count of $currentCount").queue() + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/com/learnspigot/bot/profile/Profile.kt b/src/main/kotlin/com/learnspigot/bot/profile/Profile.kt index 9d98f81..6f6fa27 100644 --- a/src/main/kotlin/com/learnspigot/bot/profile/Profile.kt +++ b/src/main/kotlin/com/learnspigot/bot/profile/Profile.kt @@ -18,7 +18,10 @@ data class Profile( var udemyProfileUrl: String?, val reputation: NavigableMap, val notifyOnRep: Boolean, - var intellijKeyGiven: Boolean + var intellijKeyGiven: Boolean, + var highestCount: Int, + var totalCounts: Int, + var countingFuckUps: Int ) { fun addReputation(user: User, fromUserId: String, fromPostId: String, amount: Int) { @@ -58,7 +61,29 @@ data class Profile( document["reputation"] = reputationDocument document["notifyOnRep"] = notifyOnRep document["intellijKeyGiven"] = intellijKeyGiven + document["highestCount"] = highestCount + document["totalCounts"] = totalCounts + document["countingFuckUps"] = countingFuckUps Mongo.userCollection.replaceOne(Filters.eq("_id", id), document, ReplaceOptions().upsert(true)) } + fun incrementCount(currentCount: Int) { + totalCounts++ + if (currentCount > highestCount) highestCount = currentCount + saveCounting() + } + + fun fuckedUpCounting() { + countingFuckUps++ + saveCounting() + } + + private fun saveCounting() { + val doc = Mongo.userCollection.find(Filters.eq("_id", id)).first()!! + doc["highestCount"] = highestCount + doc["totalCounts"] = totalCounts + doc["countingFuckUps"] = countingFuckUps + Mongo.userCollection.replaceOne(Filters.eq("_id", id), doc, ReplaceOptions().upsert(true)) + } + } diff --git a/src/main/kotlin/com/learnspigot/bot/profile/ProfileRegistry.kt b/src/main/kotlin/com/learnspigot/bot/profile/ProfileRegistry.kt index c1e6b50..938fdf0 100644 --- a/src/main/kotlin/com/learnspigot/bot/profile/ProfileRegistry.kt +++ b/src/main/kotlin/com/learnspigot/bot/profile/ProfileRegistry.kt @@ -5,7 +5,6 @@ import com.learnspigot.bot.util.Mongo import net.dv8tion.jda.api.entities.Message import net.dv8tion.jda.api.entities.User import org.bson.Document -import java.net.URL import java.util.* class ProfileRegistry { @@ -32,8 +31,12 @@ class ProfileRegistry { document.getString("tag"), document.getString("udemyProfileUrl"), reputation, - document.getBoolean("notifyOnRep") ?: true, - document.getBoolean("intellijKeyGiven") ?: false).let { + document.getBoolean("notifyOnRep", true), + document.getBoolean("intellijKeyGiven", false), + document.getInteger("highestCount", 0), + document.getInteger("totalCounts", 0), + document.getInteger("countingFuckUps", 0) + ).let { profileCache[it.id] = it if (it.udemyProfileUrl != null) urlProfiles[it.udemyProfileUrl!!] = it @@ -64,7 +67,11 @@ class ProfileRegistry { null, TreeMap(), true, - false).apply { + false, + 0, + 0, + 0, + ).apply { profileCache[user.id] = this save() } diff --git a/src/main/kotlin/com/learnspigot/bot/util/Mongo.kt b/src/main/kotlin/com/learnspigot/bot/util/Mongo.kt index 1cb929b..1c51acd 100644 --- a/src/main/kotlin/com/learnspigot/bot/util/Mongo.kt +++ b/src/main/kotlin/com/learnspigot/bot/util/Mongo.kt @@ -13,5 +13,7 @@ object Mongo { val userCollection: MongoCollection = database.getCollection("users") val starboardCollection: MongoCollection = database.getCollection("starboard") val docsCollection: MongoCollection = database.getCollection("spigot-docs") + val countingCollection: MongoCollection = database.getCollection("counting") + } \ No newline at end of file