Skip to content

Commit 7a7c87f

Browse files
DaRacciRacci
authored and
Racci
committed
feat: Added Log events for all main sources
1 parent ec039c5 commit 7a7c87f

File tree

3 files changed

+277
-2
lines changed

3 files changed

+277
-2
lines changed

src/main/kotlin/dev/racci/elixir/ElixirBot.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import dev.kord.gateway.Intent
1111
import dev.kord.gateway.PrivilegedIntent
1212
import dev.racci.elixir.database.DatabaseManager
1313
import dev.racci.elixir.events.JoinLeaveEvent
14+
import dev.racci.elixir.events.LogEvents
1415
import dev.racci.elixir.events.MessageEvents
1516
import dev.racci.elixir.extensions.StatChannels
1617
import dev.racci.elixir.extensions.commands.moderation.Moderation
@@ -68,12 +69,13 @@ suspend fun main() {
6869
add(::Github)
6970
add(::Custom)
7071
add(::StatChannels)
72+
add(::LogEvents)
7173
add(::RoleSelector)
7274

7375
extPhishing {
7476
appName = "Elixir Bot"
7577
detectionAction = DetectionAction.Kick
76-
logChannelName = "anti-phishing-logs"
78+
logChannelName = "☲⋯logs"
7779
requiredCommandPermission = null
7880
}
7981

Lines changed: 266 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,266 @@
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\nMessage 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\nMessage 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\nMessage 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}\nMember 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}\nMember 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+
}

src/main/kotlin/dev/racci/elixir/extensions/commands/util/Ping.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
package dev.racci.elixir.extensions.commands.util
33

44
import com.kotlindiscord.kord.extensions.DISCORD_GREEN
5+
import com.kotlindiscord.kord.extensions.DISCORD_RED
56
import com.kotlindiscord.kord.extensions.DISCORD_YELLOW
67
import com.kotlindiscord.kord.extensions.extensions.Extension
78
import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
@@ -22,7 +23,7 @@ class Ping: Extension() {
2223
override suspend fun setup() {
2324
val actionLog = kord.getGuild(GUILD_ID)?.getChannel(MOD_ACTION_LOG) as GuildMessageChannelBehavior
2425

25-
ResponseHelper.responseEmbedInChannel(actionLog, "Elixir is now online!", null, DISCORD_GREEN, null)
26+
// ResponseHelper.responseEmbedInChannel(actionLog, "Elixir is now online!", null, DISCORD_GREEN, null)
2627

2728
publicSlashCommand {
2829
name = "ping"
@@ -48,4 +49,10 @@ class Ping: Extension() {
4849
}
4950
}
5051
}
52+
53+
override suspend fun unload() {
54+
val actionLog = kord.getGuild(GUILD_ID)?.getChannel(MOD_ACTION_LOG) as GuildMessageChannelBehavior
55+
56+
ResponseHelper.responseEmbedInChannel(actionLog, "Elixir is now offline!", null, DISCORD_RED, null)
57+
}
5158
}

0 commit comments

Comments
 (0)