Skip to content

Commit 2b23792

Browse files
BENKACI Amiravsct-jburet
authored andcommitted
added send interactive message with img ant QR
1 parent fdc8d5e commit 2b23792

File tree

3 files changed

+105
-5
lines changed

3 files changed

+105
-5
lines changed

bot/connector-whatsapp-cloud/src/main/kotlin/WhatsAppCloudBuilder.kt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,43 @@ fun I18nTranslator.whatsAppCloudReplyButtonMessage(
137137
)
138138
)
139139

140+
fun I18nTranslator.whatsAppCloudReplyImgButtonMessage(
141+
imgUrl: String,
142+
text: CharSequence,
143+
vararg replies: QuickReply,
144+
145+
): WhatsAppCloudBotInteractiveMessage =
146+
whatsAppCloudReplyImgButtonMessage(imgUrl, text, replies.toList())
147+
148+
fun I18nTranslator.whatsAppCloudReplyImgButtonMessage(
149+
imgUrl: String,
150+
text: CharSequence,
151+
replies: List<QuickReply>,
152+
): WhatsAppCloudBotInteractiveMessage = WhatsAppCloudBotInteractiveMessage(
153+
messagingProduct = "whatsapp",
154+
recipientType = WhatsAppCloudBotRecipientType.individual,
155+
interactive = WhatsAppCloudBotInteractive(
156+
type = WhatsAppCloudBotInteractiveType.button,
157+
header = WhatsAppCloudBotInteractiveHeader(
158+
type = WhatsAppCloudBotHeaderType.image,
159+
image = WhatsAppCloudBotMediaImage(
160+
id = imgUrl
161+
)
162+
),
163+
body = WhatsAppCloudBotBody(translate(text).toString()),
164+
action = WhatsAppCloudBotAction(
165+
buttons = replies.map {
166+
WhatsAppCloudBotActionButton(
167+
reply = WhatsAppCloudBotActionButtonReply(
168+
id = it.payload.checkLength(WHATS_APP_BUTTONS_ID_MAX_LENGTH),
169+
title = translate(it.title).toString().checkLength(WHATS_APP_BUTTONS_TITLE_MAX_LENGTH),
170+
)
171+
)
172+
}
173+
)
174+
)
175+
)
176+
140177
fun I18nTranslator.whatsAppCloudUrlButtonMessage(
141178
text: CharSequence? = null,
142179
textButton: String,

bot/connector-whatsapp-cloud/src/main/kotlin/model/send/message/content/WhatsAppCloudBotInteractive.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ data class WhatsAppCloudBotInteractive(
3535
data class WhatsAppCloudBotInteractiveHeader(
3636
var type: WhatsAppCloudBotHeaderType,
3737
val document: WhatsAppCloudBotMedia? = null,
38-
val image: WhatsAppCloudBotMedia? = null,
38+
val image: WhatsAppCloudBotMediaImage? = null,
3939
val video: WhatsAppCloudBotMedia? = null,
4040
val text: String? = null
4141
)
@@ -52,6 +52,10 @@ data class WhatsAppCloudBotMedia(
5252
val provider: String? = null,
5353
)
5454

55+
data class WhatsAppCloudBotMediaImage(
56+
val id: String
57+
)
58+
5559
data class WhatsAppCloudBotBody(
5660
val text: String
5761
)

bot/connector-whatsapp-cloud/src/main/kotlin/services/WhatsAppCloudApiService.kt

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ import ai.tock.bot.connector.whatsapp.cloud.model.send.message.content.Component
3737
import ai.tock.bot.connector.whatsapp.cloud.model.send.message.content.HeaderParameter
3838
import ai.tock.bot.connector.whatsapp.cloud.model.send.message.content.PayloadParameter
3939
import ai.tock.bot.connector.whatsapp.cloud.model.send.message.content.WhatsAppCloudBotActionButton
40+
import ai.tock.bot.connector.whatsapp.cloud.model.send.message.content.WhatsAppCloudBotHeaderType
41+
import ai.tock.bot.connector.whatsapp.cloud.model.send.message.content.WhatsAppCloudBotInteractiveHeader
42+
import ai.tock.bot.connector.whatsapp.cloud.model.send.message.content.WhatsAppCloudBotMediaImage
4043
import ai.tock.bot.engine.BotRepository
4144
import ai.tock.shared.Executor
4245
import ai.tock.shared.TockProxyAuthenticator
@@ -117,7 +120,7 @@ class WhatsAppCloudApiService(private val apiClient: WhatsAppCloudApiClient) {
117120
}
118121
}
119122

120-
private fun handleInteractiveMessage(
123+
private fun handleInteractiveMessage2(
121124
phoneNumberId: String,
122125
token: String,
123126
messageRequest: WhatsAppCloudSendBotInteractiveMessage
@@ -127,7 +130,20 @@ class WhatsAppCloudApiService(private val apiClient: WhatsAppCloudApiClient) {
127130
val updateButtons = action.buttons.map { button ->
128131
updateButton(button)
129132
}
130-
sendUpdatedInteractiveMessage(phoneNumberId, token, messageRequest, updateButtons)
133+
134+
if(messageRequest.interactive.header!=null){
135+
val updateHeader = WhatsAppCloudBotInteractiveHeader(
136+
type = WhatsAppCloudBotHeaderType.image,
137+
image = WhatsAppCloudBotMediaImage(
138+
id = getRealIdImg(messageRequest, phoneNumberId, token)
139+
140+
)
141+
)
142+
sendUpdatedInteractiveMessage(phoneNumberId, token, messageRequest, updateButtons, updateHeader)
143+
}else{
144+
sendUpdatedInteractiveMessage(phoneNumberId, token, messageRequest, updateButtons)
145+
}
146+
131147
} else {
132148
send(messageRequest) {
133149
apiClient.graphApi.sendMessage(
@@ -140,6 +156,48 @@ class WhatsAppCloudApiService(private val apiClient: WhatsAppCloudApiClient) {
140156
}
141157
}
142158

159+
160+
private fun handleInteractiveMessage(
161+
phoneNumberId: String,
162+
token: String,
163+
messageRequest: WhatsAppCloudSendBotInteractiveMessage
164+
) {
165+
val action = messageRequest.interactive.action ?: return sendMessage(phoneNumberId, token, messageRequest)
166+
val updatedButtons = action.buttons.takeIf { !it.isNullOrEmpty() }?.map { updateButton(it) }
167+
val updatedHeader = messageRequest.interactive.header?.let {
168+
WhatsAppCloudBotInteractiveHeader(
169+
type = WhatsAppCloudBotHeaderType.image,
170+
image = WhatsAppCloudBotMediaImage(id = getRealIdImg(messageRequest, phoneNumberId, token))
171+
)
172+
}
173+
if (updatedButtons != null) {
174+
sendUpdatedInteractiveMessage(phoneNumberId, token, messageRequest, updatedButtons, updatedHeader)
175+
} else {
176+
send(messageRequest) {
177+
apiClient.graphApi.sendMessage(
178+
phoneNumberId,
179+
token,
180+
messageRequest
181+
).execute()
182+
}
183+
}
184+
}
185+
186+
private fun getRealIdImg(
187+
messageRequest: WhatsAppCloudSendBotInteractiveMessage,
188+
phoneNumberId: String,
189+
token: String
190+
): String {
191+
192+
val headerImageId = messageRequest.interactive.header?.image?.id
193+
194+
val client = OkHttpClient.Builder().apply(TockProxyAuthenticator::install).build()
195+
196+
val res = sendMedia(client, phoneNumberId, token, headerImageId.toString(), FileType.PNG.type)
197+
198+
return res.id
199+
}
200+
143201
private fun updateButton(button: WhatsAppCloudBotActionButton): WhatsAppCloudBotActionButton =
144202
if (button.reply.id.length >= 256) {
145203
val uuidPayload = UUID.randomUUID().toString()
@@ -162,11 +220,12 @@ class WhatsAppCloudApiService(private val apiClient: WhatsAppCloudApiClient) {
162220
phoneNumberId: String,
163221
token: String,
164222
messageRequest: WhatsAppCloudSendBotInteractiveMessage,
165-
updatedButtons: List<WhatsAppCloudBotActionButton>
223+
updatedButtons: List<WhatsAppCloudBotActionButton>,
224+
updateHeader: WhatsAppCloudBotInteractiveHeader? = null
166225
) {
167226
val updateAction = messageRequest.interactive.action?.copy(buttons = updatedButtons)
168227
val updateMessageRequest = messageRequest.copy(
169-
interactive = messageRequest.interactive.copy(action = updateAction)
228+
interactive = messageRequest.interactive.copy(header = updateHeader, action = updateAction)
170229
)
171230
send(updateMessageRequest) {
172231
apiClient.graphApi.sendMessage(

0 commit comments

Comments
 (0)