Skip to content

Commit

Permalink
Switch to the Official MongoDB Driver. Needs testing
Browse files Browse the repository at this point in the history
  • Loading branch information
NoComment1105 committed Aug 15, 2023
1 parent 7a3341c commit 4f5b1fa
Show file tree
Hide file tree
Showing 37 changed files with 261 additions and 195 deletions.
3 changes: 2 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,8 @@ dependencies {
implementation(libs.github.api)

// KMongo
implementation(libs.kmongo)
//implementation(libs.kmongo)
implementation(libs.mongo.driver)

// Cozy's welcome module
implementation(libs.cozy.welcome)
Expand Down
2 changes: 2 additions & 0 deletions libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ logging = "5.1.0"
logback = "1.4.9"
github-api = "1.315"
kmongo = "4.9.0"
mongo-driver = "4.10.1"
cozy-welcome = "1.0.1-SNAPSHOT"
dma = "v0.2.1"
docgenerator = "0.1.2-SNAPSHOT"
Expand All @@ -27,6 +28,7 @@ logback = { module = "ch.qos.logback:logback-classic", version.ref = "logback" }
logging = { module = "io.github.oshai:kotlin-logging", version.ref = "logging" }
github-api = { module = "org.kohsuke:github-api", version.ref = "github-api" }
kmongo = { module = "org.litote.kmongo:kmongo-coroutine-serialization", version.ref = "kmongo" }
mongo-driver = { module = "org.mongodb:mongodb-driver-kotlin-coroutine", version.ref = "mongo-driver" }
detekt = { module = "io.gitlab.arturbosch.detekt:detekt-formatting", version.ref = "detekt"}
cozy-welcome = {module = "org.quiltmc.community:module-welcome", version.ref = "cozy-welcome"}
dma = { module = "org.hyacinthbots:discord-moderation-actions", version.ref = "dma"}
Expand Down
10 changes: 6 additions & 4 deletions src/main/kotlin/org/hyacinthbots/lilybot/database/Cleanups.kt
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package org.hyacinthbots.lilybot.database

import com.kotlindiscord.kord.extensions.koin.KordExKoinComponent
import com.mongodb.client.model.Filters
import dev.kord.core.Kord
import dev.kord.core.behavior.getChannelOfOrNull
import dev.kord.core.entity.channel.thread.ThreadChannel
import dev.kord.rest.request.KtorRequestException
import kotlinx.coroutines.flow.toList
import kotlinx.datetime.Clock
import mu.KotlinLogging
import org.hyacinthbots.lilybot.database.Cleanups.cleanupGuildData
Expand All @@ -24,7 +26,6 @@ import org.hyacinthbots.lilybot.database.collections.WelcomeChannelCollection
import org.hyacinthbots.lilybot.database.entities.GuildLeaveTimeData
import org.hyacinthbots.lilybot.database.entities.ThreadData
import org.koin.core.component.inject
import org.litote.kmongo.eq

/**
* This object contains the Database clean up functions, for removing old data from the database that Lily no longer
Expand All @@ -38,10 +39,10 @@ object Cleanups : KordExKoinComponent {
private val db: Database by inject()

@PublishedApi
internal val guildLeaveTimeCollection = db.mainDatabase.getCollection<GuildLeaveTimeData>()
internal val guildLeaveTimeCollection = db.mainDatabase.getCollection<GuildLeaveTimeData>("guildLeaveTimeData")

@PublishedApi
internal val threadDataCollection = db.mainDatabase.getCollection<ThreadData>()
internal val threadDataCollection = db.mainDatabase.getCollection<ThreadData>("threadData")

@PublishedApi
internal val cleanupsLogger = KotlinLogging.logger("Database Cleanups")
Expand Down Expand Up @@ -75,7 +76,8 @@ object Cleanups : KordExKoinComponent {
UtilityConfigCollection().clearConfig(it.guildId)
WarnCollection().clearWarns(it.guildId)
WelcomeChannelCollection().removeWelcomeChannelsForGuild(it.guildId, kord)
guildLeaveTimeCollection.deleteOne(GuildLeaveTimeData::guildId eq it.guildId)
val leaveFilters = Filters.eq(GuildLeaveTimeData::guildId.name, it.guildId)
guildLeaveTimeCollection.deleteOne(leaveFilters)
deletedGuildData += 1 // Increment the counter for logging
}
}
Expand Down
5 changes: 2 additions & 3 deletions src/main/kotlin/org/hyacinthbots/lilybot/database/Database.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,10 @@ package org.hyacinthbots.lilybot.database

import com.mongodb.ConnectionString
import com.mongodb.MongoClientSettings
import com.mongodb.kotlin.client.coroutine.MongoClient
import org.bson.UuidRepresentation
import org.hyacinthbots.lilybot.database.migrations.Migrator
import org.hyacinthbots.lilybot.utils.MONGO_URI
import org.litote.kmongo.coroutine.coroutine
import org.litote.kmongo.reactivestreams.KMongo

class Database {
// Connect to the database using the provided connection URL
Expand All @@ -16,7 +15,7 @@ class Database {
.applyConnectionString(ConnectionString(MONGO_URI))
.build()

private val client = KMongo.createClient(settings).coroutine
private val client = MongoClient.create(settings)

/** The main database for storing data. */
val mainDatabase get() = client.getDatabase("LilyBot")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.hyacinthbots.lilybot.database

import com.mongodb.client.model.Filters
import com.mongodb.client.model.Filters.and
import com.mongodb.kotlin.client.coroutine.FindFlow
import com.mongodb.kotlin.client.coroutine.MongoCollection
import kotlinx.coroutines.flow.firstOrNull
import org.bson.conversions.Bson

private fun <T : Any> MongoCollection<T>.find(vararg filters: Bson?): FindFlow<T> = find(and(*filters))

suspend fun <T : Any> MongoCollection<T>.findOne(filter: Bson): T? = find(filter).firstOrNull()

suspend fun <T : Any> MongoCollection<T>.findOne(vararg filters: Bson?): T? =
find(*filters).firstOrNull()

suspend fun <T : Any> MongoCollection<T>.deleteOne() = deleteOne(Filters.empty())

// TODO Make more cool useful functions
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package org.hyacinthbots.lilybot.database.collections

import com.kotlindiscord.kord.extensions.koin.KordExKoinComponent
import com.mongodb.client.model.Filters.eq
import dev.kord.common.entity.Snowflake
import kotlinx.coroutines.flow.toList
import org.hyacinthbots.lilybot.database.Database
import org.hyacinthbots.lilybot.database.entities.AutoThreadingData
import org.hyacinthbots.lilybot.database.findOne
import org.koin.core.component.inject
import org.litote.kmongo.eq

/**
* This class contains the functions for interacting with the [AutoThreading Database][AutoThreadingData]. This
Expand All @@ -22,7 +24,7 @@ class AutoThreadingCollection : KordExKoinComponent {
private val db: Database by inject()

@PublishedApi
internal val collection = db.mainDatabase.getCollection<AutoThreadingData>()
internal val collection = db.mainDatabase.getCollection<AutoThreadingData>("autoThreadingData")

/**
* Gets all auto threads for a given [inputGuildId].
Expand All @@ -33,7 +35,7 @@ class AutoThreadingCollection : KordExKoinComponent {
* @since 4.6.0
*/
suspend inline fun getAllAutoThreads(inputGuildId: Snowflake): List<AutoThreadingData> =
collection.find(AutoThreadingData::guildId eq inputGuildId).toList()
collection.find(eq(AutoThreadingData::guildId.name, inputGuildId)).toList()

/**
* Gets a single auto thread based off the channel ID.
Expand All @@ -44,7 +46,7 @@ class AutoThreadingCollection : KordExKoinComponent {
* @since 4.6.0
*/
suspend inline fun getSingleAutoThread(inputChannelId: Snowflake): AutoThreadingData? =
collection.findOne(AutoThreadingData::channelId eq inputChannelId)
collection.findOne(eq(AutoThreadingData::channelId.name, inputChannelId))

/**
* Sets a new auto thread.
Expand All @@ -54,7 +56,7 @@ class AutoThreadingCollection : KordExKoinComponent {
* @since 4.6.0
*/
suspend inline fun setAutoThread(inputAutoThreadData: AutoThreadingData) {
collection.deleteOne(AutoThreadingData::channelId eq inputAutoThreadData.channelId)
collection.deleteOne(eq(AutoThreadingData::channelId.name, inputAutoThreadData.channelId))
collection.insertOne(inputAutoThreadData)
}

Expand All @@ -66,7 +68,7 @@ class AutoThreadingCollection : KordExKoinComponent {
* @since 4.6.0
*/
suspend inline fun deleteAutoThread(inputChannelId: Snowflake) =
collection.deleteOne(AutoThreadingData::channelId eq inputChannelId)
collection.deleteOne(eq(AutoThreadingData::channelId.name, inputChannelId))

/**
* Deletes auto threads for a given guild.
Expand All @@ -76,5 +78,5 @@ class AutoThreadingCollection : KordExKoinComponent {
* @since 4.6.0
*/
suspend inline fun deleteGuildAutoThreads(inputGuildId: Snowflake) =
collection.deleteMany(AutoThreadingData::guildId eq inputGuildId)
collection.deleteMany(eq(AutoThreadingData::guildId.name, inputGuildId))
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package org.hyacinthbots.lilybot.database.collections

import com.kotlindiscord.kord.extensions.koin.KordExKoinComponent
import com.mongodb.client.model.Filters.eq
import dev.kord.common.entity.Snowflake
import org.hyacinthbots.lilybot.database.Database
import org.hyacinthbots.lilybot.database.entities.LoggingConfigData
import org.hyacinthbots.lilybot.database.entities.ModerationConfigData
import org.hyacinthbots.lilybot.database.entities.UtilityConfigData
import org.hyacinthbots.lilybot.database.findOne
import org.koin.core.component.inject
import org.litote.kmongo.eq

/**
* This class contains the functions for interacting with the [Logging Config Database][LoggingConfigData]. This class
Expand All @@ -22,7 +23,7 @@ class LoggingConfigCollection : KordExKoinComponent {
private val configDb: Database by inject()

@PublishedApi
internal val collection = configDb.configDatabase.getCollection<LoggingConfigData>()
internal val collection = configDb.configDatabase.getCollection<LoggingConfigData>("loggingConfigData")

/**
* Gets the logging config for the given guild using the [guildId][inputGuildId].
Expand All @@ -33,7 +34,7 @@ class LoggingConfigCollection : KordExKoinComponent {
* @since 4.0.0
*/
suspend inline fun getConfig(inputGuildId: Snowflake): LoggingConfigData? =
collection.findOne(LoggingConfigData::guildId eq inputGuildId)
collection.findOne(eq(LoggingConfigData::guildId.name, inputGuildId))

/**
* Adds the given [loggingConfig] to the database.
Expand All @@ -43,7 +44,7 @@ class LoggingConfigCollection : KordExKoinComponent {
* @since 4.0.0
*/
suspend inline fun setConfig(loggingConfig: LoggingConfigData) {
collection.deleteOne(LoggingConfigData::guildId eq loggingConfig.guildId)
collection.deleteOne(eq(LoggingConfigData::guildId.name, loggingConfig.guildId))
collection.insertOne(loggingConfig)
}

Expand All @@ -55,7 +56,7 @@ class LoggingConfigCollection : KordExKoinComponent {
* @since 4.0.0
*/
suspend inline fun clearConfig(inputGuildId: Snowflake) =
collection.deleteOne(LoggingConfigData::guildId eq inputGuildId)
collection.deleteOne(eq(LoggingConfigData::guildId.name, inputGuildId))
}

/**
Expand All @@ -71,7 +72,7 @@ class ModerationConfigCollection : KordExKoinComponent {
private val configDb: Database by inject()

@PublishedApi
internal val collection = configDb.configDatabase.getCollection<ModerationConfigData>()
internal val collection = configDb.configDatabase.getCollection<ModerationConfigData>("moderationConfigData")

/**
* Gets the Moderation config for the given guild using the [guildId][inputGuildId].
Expand All @@ -82,7 +83,7 @@ class ModerationConfigCollection : KordExKoinComponent {
* @since 4.0.0
*/
suspend inline fun getConfig(inputGuildId: Snowflake): ModerationConfigData? =
collection.findOne(ModerationConfigData::guildId eq inputGuildId)
collection.findOne(eq(ModerationConfigData::guildId.name, inputGuildId))

/**
* Adds the given [moderationConfig] to the database.
Expand All @@ -92,7 +93,7 @@ class ModerationConfigCollection : KordExKoinComponent {
* @since 4.0.0
*/
suspend inline fun setConfig(moderationConfig: ModerationConfigData) {
collection.deleteOne(ModerationConfigData::guildId eq moderationConfig.guildId)
collection.deleteOne(eq(ModerationConfigData::guildId.name, moderationConfig.guildId))
collection.insertOne(moderationConfig)
}

Expand All @@ -104,7 +105,7 @@ class ModerationConfigCollection : KordExKoinComponent {
* @since 4.0.0
*/
suspend inline fun clearConfig(inputGuildId: Snowflake) =
collection.deleteOne(ModerationConfigData::guildId eq inputGuildId)
collection.deleteOne(eq(ModerationConfigData::guildId.name, inputGuildId))
}

/**
Expand All @@ -120,7 +121,7 @@ class UtilityConfigCollection : KordExKoinComponent {
private val configDb: Database by inject()

@PublishedApi
internal val collection = configDb.configDatabase.getCollection<UtilityConfigData>()
internal val collection = configDb.configDatabase.getCollection<UtilityConfigData>("utilityConfigData")

/**
* Gets the Utility config for the given guild using the [guildId][inputGuildId].
Expand All @@ -131,7 +132,7 @@ class UtilityConfigCollection : KordExKoinComponent {
* @since 4.0.0
*/
suspend inline fun getConfig(inputGuildId: Snowflake): UtilityConfigData? =
collection.findOne(UtilityConfigData::guildId eq inputGuildId)
collection.findOne(eq(UtilityConfigData::guildId.name, inputGuildId))

/**
* Adds the given [utilityConfig] to the database.
Expand All @@ -141,7 +142,7 @@ class UtilityConfigCollection : KordExKoinComponent {
* @since 4.0.0
*/
suspend inline fun setConfig(utilityConfig: UtilityConfigData) {
collection.deleteOne(UtilityConfigData::guildId eq utilityConfig.guildId)
collection.deleteOne(eq(UtilityConfigData::guildId.name, utilityConfig.guildId))
collection.insertOne(utilityConfig)
}

Expand All @@ -153,5 +154,5 @@ class UtilityConfigCollection : KordExKoinComponent {
* @since 4.0.0
*/
suspend inline fun clearConfig(inputGuildId: Snowflake) =
collection.deleteOne(UtilityConfigData::guildId eq inputGuildId)
collection.deleteOne(eq(UtilityConfigData::guildId.name, inputGuildId))
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package org.hyacinthbots.lilybot.database.collections

import com.kotlindiscord.kord.extensions.koin.KordExKoinComponent
import com.mongodb.client.model.Filters.and
import com.mongodb.client.model.Filters.eq
import dev.kord.common.entity.Snowflake
import kotlinx.coroutines.flow.toList
import org.hyacinthbots.lilybot.database.Database
import org.hyacinthbots.lilybot.database.entities.GalleryChannelData
import org.koin.core.component.inject
import org.litote.kmongo.coroutine.CoroutineCollection
import org.litote.kmongo.eq

/**
* This class contains the functions for interacting with the [Gallery Channel Database][GalleryChannelData]. This
Expand All @@ -22,17 +23,17 @@ class GalleryChannelCollection : KordExKoinComponent {
private val db: Database by inject()

@PublishedApi
internal val collection = db.mainDatabase.getCollection<GalleryChannelData>()
internal val collection = db.mainDatabase.getCollection<GalleryChannelData>("galleryChannelData")

/**
* Collects every gallery channel in the database into a [List].
*
* @return The [CoroutineCollection] of [GalleryChannelData] for all the gallery channels in the database
* @return The [MongoCollection] of [GalleryChannelData] for all the gallery channels in the database
* @author NoComment1105
* @since 3.3.0
*/
suspend inline fun getChannels(inputGuildId: Snowflake): List<GalleryChannelData> =
collection.find(GalleryChannelData::guildId eq inputGuildId).toList()
collection.find(eq(GalleryChannelData::guildId.name, inputGuildId)).toList()

/**
* Stores a channel ID as input by the user, in the database, with it's corresponding guild, allowing us to find
Expand All @@ -56,8 +57,10 @@ class GalleryChannelCollection : KordExKoinComponent {
*/
suspend inline fun removeChannel(inputGuildId: Snowflake, inputChannelId: Snowflake) =
collection.deleteOne(
GalleryChannelData::channelId eq inputChannelId,
GalleryChannelData::guildId eq inputGuildId
and(
eq(GalleryChannelData::channelId.name, inputChannelId),
eq(GalleryChannelData::guildId.name, inputGuildId)
)
)

/**
Expand All @@ -68,5 +71,5 @@ class GalleryChannelCollection : KordExKoinComponent {
* @since 4.1.0
*/
suspend inline fun removeAll(inputGuildId: Snowflake) =
collection.deleteMany(GalleryChannelData::guildId eq inputGuildId)
collection.deleteMany(eq(GalleryChannelData::guildId.name, inputGuildId))
}
Loading

0 comments on commit 4f5b1fa

Please sign in to comment.