Skip to content

Commit b81228b

Browse files
authored
Merge pull request #88 from the-programmers-hangout/feat/add-reset-command
feat: add reset command
2 parents 47cdea9 + f88a0f2 commit b81228b

File tree

9 files changed

+131
-18
lines changed

9 files changed

+131
-18
lines changed

commands.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@
1919
| removeInfo | LowerMemberArg, Info ID | Remove an information message from a member record. |
2020

2121
## Infraction
22-
| Commands | Arguments | Description |
23-
| ---------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
24-
| badpfp | (cancel), LowerMemberArg | Notifies the user that they should change their profile pic and applies a 30 minute mute. Bans the user if they don't change picture. |
25-
| cleanse | LowerUserArg | Use this to delete (permanently) as user's infractions. |
26-
| removeInfraction | LowerUserArg, Infraction ID | Use this to delete (permanently) an infraction from a user. |
27-
| strike, s, S | LowerMemberArg, (Weight), Reason | Strike a user. |
28-
| warn, w, W | LowerMemberArg, Reason | Warn a user. |
22+
| Commands | Arguments | Description |
23+
| ------------------ | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
24+
| badpfp | (cancel), LowerMemberArg | Notifies the user that they should change their profile pic and applies a 30 minute mute. Bans the user if they don't change picture. |
25+
| cleanseInfractions | LowerUserArg | Use this to delete (permanently) as user's infractions. |
26+
| removeInfraction | LowerUserArg, Infraction ID | Use this to delete (permanently) an infraction from a user. |
27+
| strike, s, S | LowerMemberArg, (Weight), Reason | Strike a user. |
28+
| warn, w, W | LowerMemberArg, Reason | Warn a user. |
2929

3030
## Mute
3131
| Commands | Arguments | Description |
@@ -37,7 +37,7 @@
3737
## Notes
3838
| Commands | Arguments | Description |
3939
| ------------ | -------------------------------- | ------------------------------------------------- |
40-
| cleansenotes | LowerMemberArg | Use this to delete (permanently) as user's notes. |
40+
| cleanseNotes | LowerMemberArg | Use this to delete (permanently) as user's notes. |
4141
| deleteNote | LowerMemberArg, Note ID | Use this to add a delete a note from a user. |
4242
| editNote | User, Note to edit, Note Content | Use this to edit a note. |
4343
| note | User, Note Content | Use this to add a note to a user. |
@@ -60,6 +60,7 @@
6060
| getBanReason | User | Get a ban reason for a banned user |
6161
| history, h, H | User | Use this to view a user's record. |
6262
| link | Main Account, Alt Account | Link a user's alt account with their main |
63+
| reset | LowerUserArg | Reset a user's record, and any linked accounts |
6364
| selfHistory | | View your infraction history (contents will be DM'd) |
6465
| setBanReason | User, Reason | Set a ban reason for a banned user |
6566
| unban | User | Unban a banned member from this guild. |

src/main/kotlin/me/ddivad/judgebot/Main.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ suspend fun main(args: Array<String>) {
5757
field {
5858
name = "Build Info"
5959
value = "```" +
60-
"Version: 2.0.1\n" +
60+
"Version: 2.1.0\n" +
6161
"DiscordKt: ${versions.library}\n" +
6262
"Kotlin: $kotlinVersion" +
6363
"```"

src/main/kotlin/me/ddivad/judgebot/commands/InfractionCommands.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ fun createInfractionCommands(databaseService: DatabaseService,
9696
}
9797
}
9898

99-
guildCommand("cleanse") {
99+
guildCommand("cleanseInfractions") {
100100
description = "Use this to delete (permanently) as user's infractions."
101101
requiredPermissionLevel = PermissionLevel.Administrator
102102
execute(LowerUserArg) {

src/main/kotlin/me/ddivad/judgebot/commands/NoteCommands.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ fun noteCommands(databaseService: DatabaseService) = commands("Notes") {
5252
}
5353
}
5454

55-
guildCommand("cleansenotes") {
55+
guildCommand("cleanseNotes") {
5656
description = "Use this to delete (permanently) as user's notes."
5757
requiredPermissionLevel = PermissionLevel.Administrator
5858
execute(LowerMemberArg) {

src/main/kotlin/me/ddivad/judgebot/commands/UserCommands.kt

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package me.ddivad.judgebot.commands
22

33
import me.ddivad.judgebot.arguments.LowerUserArg
4+
import me.ddivad.judgebot.conversations.InfractionConversation
5+
import me.ddivad.judgebot.conversations.ResetUserConversation
46
import me.ddivad.judgebot.dataclasses.*
57
import me.ddivad.judgebot.embeds.createHistoryEmbed
68
import me.ddivad.judgebot.embeds.createCondensedHistoryEmbed
@@ -14,13 +16,16 @@ import me.ddivad.judgebot.services.requiredPermissionLevel
1416
import me.jakejmattson.discordkt.api.arguments.*
1517
import me.jakejmattson.discordkt.api.dsl.commands
1618
import me.jakejmattson.discordkt.api.extensions.sendPrivateMessage
19+
import me.jakejmattson.discordkt.api.extensions.toSnowflake
1720
import java.awt.Color
1821

1922
@Suppress("unused")
20-
fun createUserCommands(databaseService: DatabaseService,
21-
config: Configuration,
22-
loggingService: LoggingService,
23-
banService: BanService) = commands("User") {
23+
fun createUserCommands(
24+
databaseService: DatabaseService,
25+
config: Configuration,
26+
loggingService: LoggingService,
27+
banService: BanService
28+
) = commands("User") {
2429
guildCommand("history", "h", "H") {
2530
description = "Use this to view a user's record."
2631
requiredPermissionLevel = PermissionLevel.Moderator
@@ -43,7 +48,7 @@ fun createUserCommands(databaseService: DatabaseService,
4348
databaseService.users.incrementUserHistory(user, guild)
4449
val linkedAccounts = user.getLinkedAccounts(guild)
4550

46-
if(linkedAccounts.isEmpty()) {
51+
if (linkedAccounts.isEmpty()) {
4752
respond("User ${target.mention} has no alt accounts recorded.")
4853
return@execute
4954
}
@@ -166,4 +171,15 @@ fun createUserCommands(databaseService: DatabaseService,
166171
respond("Unlinked accounts ${main.mention} and ${alt.mention}")
167172
}
168173
}
174+
175+
guildCommand("reset") {
176+
description = "Reset a user's record, and any linked accounts"
177+
requiredPermissionLevel = PermissionLevel.Administrator
178+
execute(LowerUserArg) {
179+
val target = args.first
180+
ResetUserConversation(databaseService, config)
181+
.createResetConversation(guild, target)
182+
.startPublicly(discord, author, channel)
183+
}
184+
}
169185
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package me.ddivad.judgebot.conversations
2+
3+
import com.gitlab.kordlib.core.entity.Guild
4+
import com.gitlab.kordlib.core.entity.User
5+
import com.gitlab.kordlib.kordx.emoji.Emojis
6+
import com.gitlab.kordlib.kordx.emoji.toReaction
7+
import com.gitlab.kordlib.rest.Image
8+
import me.ddivad.judgebot.dataclasses.Configuration
9+
import me.ddivad.judgebot.embeds.createHistoryEmbed
10+
import me.ddivad.judgebot.services.DatabaseService
11+
import me.jakejmattson.discordkt.api.dsl.conversation
12+
import me.jakejmattson.discordkt.api.extensions.toSnowflake
13+
import java.awt.Color
14+
15+
class ResetUserConversation(private val databaseService: DatabaseService, private val configuration: Configuration) {
16+
fun createResetConversation(guild: Guild, target: User) = conversation("cancel") {
17+
val user = databaseService.users.getOrCreateUser(target, guild)
18+
val guildMember = databaseService.users.resetUserRecord(guild, user)
19+
var response = "Reset ${target.mention}"
20+
val linkedAccounts = user.getLinkedAccounts(guild)
21+
if (linkedAccounts.isNotEmpty()) {
22+
val linkedUsers = linkedAccounts.map { guild.kord.getUser(it.toSnowflake()) }
23+
val resetLinked = promptReaction(
24+
mapOf(
25+
Emojis.whiteCheckMark.toReaction() to true,
26+
Emojis.x.toReaction() to false
27+
)
28+
) {
29+
title = "Reset linked accounts"
30+
color = Color.MAGENTA
31+
thumbnail {
32+
url = target.asUser().avatar.url
33+
}
34+
description = """
35+
${target.mention} has linked accounts ${linkedUsers.joinToString { "${it?.mention}" }}
36+
37+
Reset linked accounts too? (${Emojis.whiteCheckMark.unicode} / ${Emojis.x.unicode})
38+
""".trimIndent()
39+
footer {
40+
icon = guild.getIconUrl(Image.Format.PNG) ?: ""
41+
text = guild.name
42+
}
43+
}
44+
if (resetLinked) {
45+
linkedUsers.forEach {
46+
val altRecord = it?.let { record -> databaseService.users.getOrCreateUser(record, guild) }
47+
if (altRecord != null) {
48+
databaseService.users.resetUserRecord(guild, altRecord)
49+
response += ", ${it.mention}"
50+
}
51+
}
52+
}
53+
}
54+
respond(response)
55+
respondMenu { createHistoryEmbed(target, guildMember, guild, configuration, databaseService) }
56+
}
57+
}

src/main/kotlin/me/ddivad/judgebot/dataclasses/GuildMember.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ data class GuildMember(
7878
this.notes.clear()
7979
}
8080

81+
private fun cleanseInfo(guild: Guild) = with(this.getGuildInfo(guild.id.value)) {
82+
this.info.clear()
83+
}
84+
8185
fun cleanseInfractions(guild: Guild) = with(this.getGuildInfo(guild.id.value)) {
8286
this.infractions.clear()
8387
this.points = 0
@@ -121,6 +125,15 @@ data class GuildMember(
121125
return@with this.points
122126
}
123127

128+
fun reset(guild: Guild) = with(this.getGuildInfo(guild.id.value)) {
129+
this.points = 0
130+
this.historyCount = 0
131+
this.deletedMessageCount.deleteReaction = 0
132+
cleanseInfo(guild)
133+
cleanseInfractions(guild)
134+
cleanseNotes(guild)
135+
}
136+
124137
fun ensureGuildDetailsPresent(guildId: String) {
125138
if (this.guilds.any { it.guildId == guildId }) return
126139
this.guilds.add(GuildMemberDetails(guildId))

src/main/kotlin/me/ddivad/judgebot/services/database/JoinLeaveOperations.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package me.ddivad.judgebot.services.database
22

33
import com.gitlab.kordlib.core.entity.Member
4+
import com.gitlab.kordlib.core.entity.User
45
import me.ddivad.judgebot.dataclasses.JoinLeave
56
import me.jakejmattson.discordkt.api.annotations.Service
67
import org.joda.time.DateTime
@@ -36,4 +37,11 @@ class JoinLeaveOperations(connection: ConnectionService) {
3637
)
3738
).toList()
3839
}
40+
41+
suspend fun createJoinLeaveRecordIfNotRecorded(guildId: String, target: Member) {
42+
if (this.getMemberJoinLeaveDataForGuild(guildId, target.id.value).isNotEmpty()) {
43+
return
44+
}
45+
this.createJoinLeaveRecord(guildId, target)
46+
}
3947
}

src/main/kotlin/me/ddivad/judgebot/services/database/UserOperations.kt

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,21 @@ import me.jakejmattson.discordkt.api.annotations.Service
1111
import org.litote.kmongo.eq
1212

1313
@Service
14-
class UserOperations(connection: ConnectionService, private val configuration: Configuration) {
14+
class UserOperations(
15+
connection: ConnectionService,
16+
private val configuration: Configuration,
17+
private val joinLeaveService: JoinLeaveOperations
18+
) {
1519
private val userCollection = connection.db.getCollection<GuildMember>("Users")
1620

1721
suspend fun getOrCreateUser(target: User, guild: Guild): GuildMember {
1822
val userRecord = userCollection.findOne(GuildMember::userId eq target.id.value)
1923
return if (userRecord != null) {
2024
userRecord.ensureGuildDetailsPresent(guild.id.value)
2125
userRecord.checkPointDecay(guild, configuration[guild.id.longValue]!!)
26+
target.asMemberOrNull(guild.id)?.let {
27+
joinLeaveService.createJoinLeaveRecordIfNotRecorded(guild.id.value, it)
28+
}
2229
userRecord
2330
} else {
2431
val guildMember = GuildMember(target.id.value)
@@ -37,7 +44,13 @@ class UserOperations(connection: ConnectionService, private val configuration: C
3744
return this.updateUser(user)
3845
}
3946

40-
suspend fun editNote(guild: Guild, user: GuildMember, noteId: Int, newContent: String, moderator: String): GuildMember {
47+
suspend fun editNote(
48+
guild: Guild,
49+
user: GuildMember,
50+
noteId: Int,
51+
newContent: String,
52+
moderator: String
53+
): GuildMember {
4154
user.editNote(guild, noteId, newContent, moderator)
4255
return this.updateUser(user)
4356
}
@@ -99,6 +112,11 @@ class UserOperations(connection: ConnectionService, private val configuration: C
99112
return this.updateUser(user)
100113
}
101114

115+
suspend fun resetUserRecord(guild: Guild, user: GuildMember): GuildMember {
116+
user.reset(guild)
117+
return this.updateUser(user)
118+
}
119+
102120
private suspend fun updateUser(user: GuildMember): GuildMember {
103121
userCollection.updateOne(GuildMember::userId eq user.userId, user)
104122
return user

0 commit comments

Comments
 (0)