suspend fun buildMessage()

in space-slack-sync/src/main/kotlin/org/jetbrains/spaceSlackSync/slack/SlackMessageParsing.kt [21:80]


suspend fun buildMessage(
    slackClient: SlackClient,
    slackDomain: String,
    layoutBlocks: List<LayoutBlock>,
    fields: List<Field>,
    messageText: String?,
    slackUserDataById: Map<String, SlackUserData>,
    color: String?,
    principalName: String?,
): ChatMessage {
    val plainTextPart = buildString {
        principalName?.let { append("**$it** says:\n") }
        plainTextPart(layoutBlocks, slackClient, slackDomain, slackUserDataById, messageText)
    }

    val sectionBlocks = layoutBlocks.filterIsInstance<SectionBlock>()
    return if (sectionBlocks.isNotEmpty() || fields.isNotEmpty()) {
        message {
            if (plainTextPart.isNotEmpty()) {
                section {
                    text(plainTextPart, MessageStyle.PRIMARY)
                }
            }

            val messageStyle = getMessageStyle(color)
            sectionBlocks
                .mapNotNull { it.fields }
                .filter { it.isNotEmpty() }
                .forEach { fields ->
                    section(style = messageStyle) {
                        fields {
                            fields.forEach { field ->
                                val text = convertMarkdown(field.text)
                                val newLineIndex = text.indexOf('\n')
                                if (newLineIndex != -1) {
                                    val fieldName = text.substringBefore("\n")
                                    val fieldValue = text.substringAfter("\n")
                                    field(fieldName.take(64), fieldValue)
                                } else {
                                    field("", text)
                                }
                            }
                        }
                    }
                }

            if (fields.isNotEmpty()) {
                section(style = messageStyle) {
                    fields {
                        fields.forEach {
                            field(it.title.take(64), convertMarkdown(it.value))
                        }
                    }
                }
            }
        }
    } else {
        ChatMessage.Text(plainTextPart)
    }
}