in space-slack-sync/src/main/kotlin/org/jetbrains/spaceSlackSync/slack/SlackMessageType.kt [99:211]
fun getSlackMessageEvent(requestBodyJson: JsonElement, requestBody: String): SlackMessageEvent? {
val eventJson = requestBodyJson.jsonObject["event"]
if (eventJson == null) {
log.debug("SKIP Slack message: `event` JSON field is not found")
return null
}
val type = getSlackMessageType(eventJson)
return when (type) {
SlackMessageType.NEW_MESSAGE -> {
val message = gson.fromJson(requestBody, MessagePayload::class.java)
val messageEvent = message.event
val attachmentBlocks = message.event.attachments.orEmpty().flatMap { it.blocks.orEmpty() }
val fields = message.event.attachments.orEmpty().flatMap { it.fields.orEmpty() }
val color = message.event.attachments.orEmpty().firstOrNull()?.color
SlackMessageEvent.MessageCreated(
channelId = messageEvent.channel,
teamId = messageEvent.team ?: message.teamId,
messageId = messageEvent.ts,
threadId = messageEvent.threadTs,
files = messageEvent.files,
blocks = messageEvent.blocks.orEmpty() + attachmentBlocks,
fields = fields,
text = messageEvent.text,
botProfile = messageEvent.botProfile,
userId = messageEvent.user,
color = color,
)
}
SlackMessageType.MESSAGE_EDITED -> {
val message = gson.fromJson(requestBody, MessagePayload::class.java)
val messageEvent = message.event
val newMessageJson = eventJson.jsonObject["message"]
if (newMessageJson == null) {
log.debug("SKIP Slack message: `event -> message` JSON field not found for ${SlackMessageType.MESSAGE_EDITED} message type")
return null
}
val previousMessageJson = eventJson.jsonObject["previous_message"]
if (previousMessageJson == null) {
log.debug("SKIP Slack message: `event -> previous_message` JSON field not found for ${SlackMessageType.MESSAGE_EDITED} message type")
return null
}
val previousMessage = gson.fromJson(previousMessageJson.toString(), MessageEvent::class.java)
val newMessage = gson.fromJson(newMessageJson.toString(), MessageEvent::class.java)
val fields = newMessage.attachments.orEmpty().flatMap { it.fields.orEmpty() }
val attachmentBlocks = newMessage.attachments.orEmpty().flatMap { it.blocks.orEmpty() }
val color = newMessage.attachments.orEmpty().firstOrNull()?.color
SlackMessageEvent.MessageUpdated(
channelId = messageEvent.channel,
teamId = newMessage.team ?: previousMessage.team ?: message.teamId,
messageId = previousMessage.ts,
threadId = previousMessage.threadTs,
files = newMessage.files,
blocks = newMessage.blocks.orEmpty() + attachmentBlocks,
fields = fields,
text = newMessage.text,
botProfile = newMessage.botProfile,
userId = newMessage.user,
editedTs = newMessage.ts,
color = color,
)
}
SlackMessageType.MESSAGE_DELETED -> {
val message = gson.fromJson(requestBody, MessagePayload::class.java)
val messageEvent = message.event
val previousMessageJson = eventJson.jsonObject["previous_message"]
if (previousMessageJson == null) {
log.debug("SKIP Slack message: `event -> previous_message` JSON field not found for ${SlackMessageType.MESSAGE_DELETED} message type")
return null
}
val previousMessage = gson.fromJson(previousMessageJson.toString(), MessageEvent::class.java)
SlackMessageEvent.MessageDeleted(
channelId = messageEvent.channel,
teamId = previousMessage.team ?: message.teamId,
messageId = previousMessage.ts,
threadId = previousMessage.threadTs,
userId = previousMessage.user,
)
}
SlackMessageType.USER_JOINED_CHANNEL -> {
val message = gson.fromJson(requestBody, MessagePayload::class.java)
val messageEvent = message.event
val invitedById = eventJson.jsonObject["inviter"]?.jsonPrimitive?.content
SlackMessageEvent.ChannelJoin(
teamId = message.teamId,
channelId = messageEvent.channel,
messageId = messageEvent.ts,
joinedUserId = messageEvent.user,
invitedById = invitedById
)
}
SlackMessageType.USER_LEFT_CHANNEL -> {
val message = gson.fromJson(requestBody, MessagePayload::class.java)
val messageEvent = message.event
SlackMessageEvent.ChannelLeave(
teamId = message.teamId,
channelId = messageEvent.channel,
messageId = messageEvent.ts,
leftUserId = messageEvent.user,
)
}
}
}