-
-
Notifications
You must be signed in to change notification settings - Fork 24
/
MessageEdit.kt
119 lines (111 loc) · 3.95 KB
/
MessageEdit.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package org.hyacinthbots.lilybot.extensions.events
import com.kotlindiscord.kord.extensions.DISCORD_YELLOW
import com.kotlindiscord.kord.extensions.checks.anyGuild
import com.kotlindiscord.kord.extensions.components.components
import com.kotlindiscord.kord.extensions.components.linkButton
import com.kotlindiscord.kord.extensions.extensions.Extension
import com.kotlindiscord.kord.extensions.extensions.event
import com.kotlindiscord.kord.extensions.modules.extra.pluralkit.api.PKMessage
import com.kotlindiscord.kord.extensions.modules.extra.pluralkit.events.ProxiedMessageUpdateEvent
import com.kotlindiscord.kord.extensions.modules.extra.pluralkit.events.UnProxiedMessageUpdateEvent
import com.kotlindiscord.kord.extensions.utils.getJumpUrl
import dev.kord.core.behavior.channel.asChannelOfOrNull
import dev.kord.core.behavior.channel.createMessage
import dev.kord.core.entity.Message
import dev.kord.core.entity.channel.GuildMessageChannel
import dev.kord.rest.builder.message.create.embed
import kotlinx.datetime.Clock
import org.hyacinthbots.lilybot.extensions.config.ConfigOptions
import org.hyacinthbots.lilybot.utils.attachmentsAndProxiedMessageInfo
import org.hyacinthbots.lilybot.utils.getLoggingChannelWithPerms
import org.hyacinthbots.lilybot.utils.ifNullOrEmpty
import org.hyacinthbots.lilybot.utils.requiredConfigs
import org.hyacinthbots.lilybot.utils.trimmedContents
/**
* The class for logging editing of messages to the guild message log.
* @since 4.1.0
*/
class MessageEdit : Extension() {
override val name = "message-edit"
override suspend fun setup() {
/**
* Logs edited messages to the message log channel.
* @see onMessageEdit
* @author trainb0y
*/
event<UnProxiedMessageUpdateEvent> {
check {
anyGuild()
requiredConfigs(ConfigOptions.MESSAGE_EDIT_LOGGING_ENABLED, ConfigOptions.MESSAGE_LOG)
failIf {
val message = event.message.asMessageOrNull()
message?.author?.isBot == true || event.old?.content == message?.content
}
}
action {
onMessageEdit(event.getMessageOrNull(), event.old, null)
}
}
/**
* Logs proxied edited messages to the message log channel.
* @see onMessageEdit
* @author trainb0y
*/
event<ProxiedMessageUpdateEvent> {
check {
anyGuild()
requiredConfigs(ConfigOptions.MESSAGE_EDIT_LOGGING_ENABLED, ConfigOptions.MESSAGE_LOG)
failIf {
event.old?.content == event.message.asMessageOrNull()?.content
}
}
action {
onMessageEdit(event.getMessageOrNull(), event.old, event.pkMessage)
}
}
}
/**
* If message logging is enabled, sends an embed describing the message edit to the guild's message log channel.
*
* @param message The current message
* @param old The original message
* @param proxiedMessage Extra data for PluralKit proxied messages
* @author trainb0y
*/
private suspend fun onMessageEdit(message: Message?, old: Message?, proxiedMessage: PKMessage?) {
message ?: return
val guild = message.getGuildOrNull() ?: return
val messageLog = getLoggingChannelWithPerms(ConfigOptions.MESSAGE_LOG, guild) ?: return
messageLog.createMessage {
embed {
color = DISCORD_YELLOW
author {
name = "Message Edited"
icon = proxiedMessage?.member?.avatarUrl ?: message.author?.avatar?.cdnUrl?.toUrl()
}
description =
"Location: ${message.channel.mention} " +
"(${message.channel.asChannelOfOrNull<GuildMessageChannel>()?.name
?: "Could not get channel name"})"
timestamp = Clock.System.now()
field {
name = "Previous contents"
value = old?.trimmedContents().ifNullOrEmpty { "Failed to retrieve previous message contents" }
inline = false
}
field {
name = "New contents"
value = message.trimmedContents().ifNullOrEmpty { "Failed to retrieve new message contents" }
inline = false
}
attachmentsAndProxiedMessageInfo(guild, message, proxiedMessage)
}
components {
linkButton {
label = "Jump"
url = message.getJumpUrl()
}
}
}
}
}