1
+ package dev.racci.elixir.events
2
+
3
+ import com.kotlindiscord.kord.extensions.DISCORD_PINK
4
+ import com.kotlindiscord.kord.extensions.extensions.Extension
5
+ import com.kotlindiscord.kord.extensions.extensions.event
6
+ import com.kotlindiscord.kord.extensions.sentry.BreadcrumbType
7
+ import com.kotlindiscord.kord.extensions.utils.createdAt
8
+ import dev.kord.core.behavior.channel.GuildMessageChannelBehavior
9
+ import dev.kord.core.behavior.channel.createEmbed
10
+ import dev.kord.core.event.guild.InviteCreateEvent
11
+ import dev.kord.core.event.guild.MemberJoinEvent
12
+ import dev.kord.core.event.guild.MemberLeaveEvent
13
+ import dev.kord.core.event.message.MessageBulkDeleteEvent
14
+ import dev.kord.core.event.message.MessageDeleteEvent
15
+ import dev.kord.core.event.message.MessageUpdateEvent
16
+ import dev.racci.elixir.utils.GUILD_ID
17
+ import dev.racci.elixir.utils.MESSAGE_LOGS
18
+ import kotlinx.coroutines.flow.count
19
+ import kotlinx.coroutines.flow.toSet
20
+ import kotlinx.datetime.Clock
21
+ import kotlinx.datetime.TimeZone
22
+ import kotlinx.datetime.periodUntil
23
+
24
+ class LogEvents : Extension () {
25
+
26
+ override val name = " LogEvents"
27
+
28
+ override suspend fun setup () {
29
+ val logChannel = kord.getGuild(GUILD_ID )?.getChannel(MESSAGE_LOGS ) as GuildMessageChannelBehavior
30
+
31
+ event<MessageDeleteEvent > {
32
+ action {
33
+ if (event.message?.author?.id == kord.selfId) return @action
34
+ val messageContent = event.message?.asMessageOrNull()?.content.toString()
35
+ val eventMessage = event.message
36
+ val messageLocation = event.channel.id.value
37
+
38
+ logChannel.createEmbed {
39
+ color = DISCORD_PINK
40
+ title = " Message Deleted"
41
+ description = " Location: <#$messageLocation >"
42
+ timestamp = Clock .System .now()
43
+
44
+ field {
45
+ name = " Message Contents:"
46
+ value =
47
+ messageContent.ifEmpty {
48
+ " Failed to get content of message\n Message was likely from a Bot"
49
+ }
50
+ inline = false
51
+ }
52
+ field {
53
+ name = " Message Author:"
54
+ value = eventMessage?.author?.tag.toString()
55
+ inline = true
56
+ }
57
+ field {
58
+ name = " Author ID:"
59
+ value = eventMessage?.author?.id.toString()
60
+ inline = true
61
+ }
62
+ }
63
+
64
+ sentry.breadcrumb(BreadcrumbType .Info ) {
65
+ category = " events.messageevents.MessageDeleted"
66
+ message = " A message was deleted"
67
+ data[" content" ] = messageContent.ifEmpty {" Failed to get content of message" }
68
+ }
69
+ }
70
+ }
71
+
72
+ event<MessageUpdateEvent > {
73
+ action {
74
+ if (event.message.asMessageOrNull()?.author?.isBot == true ) return @action
75
+ val messageContentBefore = event.old?.content.toString()
76
+ val messageContentAfter = event.new.content.toString()
77
+ val eventMessage = event.message.asMessageOrNull()
78
+ val messageLocation = event.channel.id.value
79
+ val eventMember = event.message.asMessageOrNull()?.author ? : return @action
80
+
81
+ logChannel.createEmbed {
82
+ color = DISCORD_PINK
83
+ title = " Message Updated"
84
+ description = " Location: <#$messageLocation >"
85
+ timestamp = Clock .System .now()
86
+ thumbnail {
87
+ url = eventMember.avatar?.url
88
+ ? : eventMember.defaultAvatar.url
89
+ }
90
+
91
+ field {
92
+ name = " Old Message Contents:"
93
+ value =
94
+ messageContentBefore.ifEmpty {
95
+ " Failed to get content of message\n Message was likely from a Bot"
96
+ }
97
+ inline = false
98
+ }
99
+ field {
100
+ name = " New Message Contents:"
101
+ value =
102
+ messageContentAfter.ifEmpty {
103
+ " Failed to get content of message\n Message was likely from a Bot"
104
+ }
105
+ inline = false
106
+ }
107
+ field {
108
+ name = " Message Author:"
109
+ value = " @" + eventMessage?.author?.tag.toString()
110
+ inline = true
111
+ }
112
+ field {
113
+ name = " Author ID:"
114
+ value = eventMessage?.author?.id.toString()
115
+ inline = true
116
+ }
117
+ }
118
+
119
+ sentry.breadcrumb(BreadcrumbType .Info ) {
120
+ category = " events.LogEvents.MessageUpdated"
121
+ message = " A message was updated"
122
+ data[" oldContent" ] = messageContentBefore.ifEmpty {" Failed to get content of message" }
123
+ data[" newContent" ] = messageContentAfter.ifEmpty {" Failed to get content of message" }
124
+ }
125
+ }
126
+ }
127
+
128
+ event<MessageBulkDeleteEvent > {
129
+ action {
130
+ val deletedCount = event.messages.count()
131
+ val messageLocation = event.channel.id.value
132
+
133
+ logChannel.createEmbed {
134
+ color = DISCORD_PINK
135
+ title = " Bulk Message Deletion"
136
+ description = " Location: <#$messageLocation >"
137
+ timestamp = Clock .System .now()
138
+
139
+ field {
140
+ name = " Amount of messages deleted:"
141
+ value = deletedCount.toString()
142
+ inline = false
143
+ }
144
+ }
145
+
146
+ sentry.breadcrumb(BreadcrumbType .Info ) {
147
+ category = " events.LogEvents.BulkMessageDeletion"
148
+ message = " A bulk of messages was deleted"
149
+ data[" amount" ] = deletedCount
150
+ data[" messageIds" ] = event.messageIds
151
+ data[" messageContents" ] = event.messages
152
+ }
153
+ }
154
+ }
155
+
156
+ event<InviteCreateEvent > {
157
+ action {
158
+ val inviter = event.inviterMember?.nicknameMention ? : event.inviterId.toString()
159
+ val maxUses = event.maxUses.toString()
160
+ val maxAge = event.maxAge.toString()
161
+
162
+ logChannel.createEmbed {
163
+ color = DISCORD_PINK
164
+ title = " Created new invite"
165
+ timestamp = Clock .System .now()
166
+
167
+ field {
168
+ name = " Invite Author:"
169
+ value = inviter
170
+ inline = true
171
+ }
172
+ field {
173
+ name = " Invite max age:"
174
+ value = maxAge
175
+ inline = true
176
+ }
177
+ field {
178
+ name = " Invite max uses:"
179
+ value = maxUses
180
+ inline = true
181
+ }
182
+
183
+ sentry.breadcrumb(BreadcrumbType .Info ) {
184
+ category = " events.LogEvents.InviteCreated"
185
+ message = " An invite was created"
186
+ data[" author" ] = inviter
187
+ data[" age" ] = maxAge
188
+ data[" uses" ] = maxUses
189
+ }
190
+ }
191
+ }
192
+ }
193
+
194
+ event<MemberJoinEvent > {
195
+ action {
196
+ val eventMember = event.member
197
+ val guildMemberCount = event.getGuild().members.count()
198
+ val now = Clock .System .now()
199
+
200
+ logChannel.createEmbed {
201
+ color = DISCORD_PINK
202
+ title = " User Joined"
203
+ timestamp = now
204
+ description = eventMember.mention + " " + eventMember.username
205
+ thumbnail {
206
+ url = eventMember.avatar?.url
207
+ ? : eventMember.defaultAvatar.url
208
+ }
209
+ field {
210
+ name = " Account Age:"
211
+ value = eventMember.createdAt.periodUntil(now, TimeZone .UTC ).toString()
212
+ inline = false
213
+ }
214
+ footer {
215
+ text = " ID: ${eventMember.id} \n Member Count: $guildMemberCount "
216
+ }
217
+ sentry.breadcrumb(BreadcrumbType .Info ) {
218
+ category = " events.LogEvents.MemberJoin"
219
+ message = " Member joined"
220
+ data[" user" ] = eventMember.tag
221
+ }
222
+ }
223
+ }
224
+ }
225
+
226
+ event<MemberLeaveEvent > {
227
+ action {
228
+ val eventMember = event.old ? : return @action
229
+ val guildMemberCount = event.getGuild().members.count()
230
+ val now = Clock .System .now()
231
+ val roles = eventMember.roles.toSet()
232
+
233
+ logChannel.createEmbed {
234
+ color = DISCORD_PINK
235
+ title = " User Left"
236
+ timestamp = now
237
+ description = eventMember.mention + " " + eventMember.username
238
+ thumbnail {
239
+ url = eventMember.avatar?.url
240
+ ? : eventMember.defaultAvatar.url
241
+ }
242
+ field {
243
+ name = " Join date:"
244
+ value = eventMember.joinedAt.toString()
245
+ inline = false
246
+ }
247
+ field {
248
+ name = " Roles:"
249
+ value = roles.joinToString(" \n " ) { it.mention }
250
+ }
251
+ footer {
252
+ text = " ID: ${eventMember.id} \n Member Count: $guildMemberCount "
253
+ }
254
+ sentry.breadcrumb(BreadcrumbType .Info ) {
255
+ category = " events.LogEvents.MemberLeft"
256
+ message = " Member left"
257
+ data[" user" ] = eventMember.tag
258
+ }
259
+ }
260
+ }
261
+ }
262
+
263
+ }
264
+
265
+
266
+ }
0 commit comments