Skip to content

Commit

Permalink
jaicp-livechat-adapter: pr fixes
Browse files Browse the repository at this point in the history
- remove template generation from InvocableBotChannel.kt interface
- add exceptions for invocation http request
  • Loading branch information
Denire committed Mar 4, 2021
1 parent 30aac0e commit de7d43c
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,10 @@ import com.justai.jaicf.channel.facebook.messenger.Messenger
import com.justai.jaicf.channel.http.HttpBotRequest
import com.justai.jaicf.channel.http.HttpBotResponse
import com.justai.jaicf.channel.http.asTextHttpBotResponse
import com.justai.jaicf.channel.invocationapi.*
import com.justai.jaicf.channel.jaicp.JaicpCompatibleAsyncBotChannel
import com.justai.jaicf.channel.jaicp.JaicpCompatibleAsyncChannelFactory
import com.justai.jaicf.context.RequestContext
import com.justai.jaicf.channel.invocationapi.InvocableBotChannel
import com.justai.jaicf.channel.invocationapi.InvocationRequest
import java.util.*

class FacebookChannel private constructor(
Expand Down Expand Up @@ -59,9 +58,15 @@ class FacebookChannel private constructor(
internal const val REQUEST_TEMPLATE_PATH = "/FacebookRequestTemplate.json"
}

private fun generateRequestFromTemplate(request: InvocationRequest) =
getRequestTemplateFromResources(request, REQUEST_TEMPLATE_PATH)
.replace("\"{{ timestamp }}\"", System.currentTimeMillis().toString())
.replace("{{ messageId }}", UUID.randomUUID().toString())


override fun processInvocation(request: InvocationRequest, requestContext: RequestContext) {
val template = getRequestTemplateFromResources(request, REQUEST_TEMPLATE_PATH)
messenger.onReceiveEvents(template, Optional.empty()) { event ->
val generatedRequest = generateRequestFromTemplate(request)
messenger.onReceiveEvents(generatedRequest, Optional.empty()) { event ->
FacebookInvocationRequest.create(request, event.asTextMessageEvent())?.let {
botApi.process(it, FacebookReactions(messenger, it), requestContext)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.justai.jaicf.channel.jaicp.JaicpCompatibleAsyncChannelFactory
import com.justai.jaicf.context.RequestContext
import com.justai.jaicf.channel.invocationapi.InvocableBotChannel
import com.justai.jaicf.channel.invocationapi.InvocationRequest
import com.justai.jaicf.channel.invocationapi.getRequestTemplateFromResources
import com.justai.jaicf.helpers.http.toUrl
import com.justai.jaicf.helpers.kotlin.PropertyWithBackingField
import com.slack.api.Slack
Expand All @@ -23,6 +24,7 @@ import com.slack.api.methods.MethodsConfig
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.util.*
import java.util.concurrent.TimeUnit

class SlackChannel private constructor(
Expand Down Expand Up @@ -99,12 +101,14 @@ class SlackChannel private constructor(
botApi.process(request, reactions, RequestContext.fromHttp(httpBotRequest))
}

override fun provideTimestamp(): String = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()).toString()
private fun generateRequestFromTemplate(request: InvocationRequest) =
getRequestTemplateFromResources(request, REQUEST_TEMPLATE_PATH)
.replace("\"{{ timestamp }}\"", TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()).toString())
.replace("{{ messageId }}", UUID.randomUUID().toString())

override fun processInvocation(request: InvocationRequest, requestContext: RequestContext) {
val invocationRequest = SlackInvocationRequest.create(request) ?: return
val slackRequest =
buildSlackRequest(getRequestTemplateFromResources(request, REQUEST_TEMPLATE_PATH).asHttpBotRequest())
val slackRequest = buildSlackRequest(generateRequestFromTemplate(request).asHttpBotRequest())
botApi.process(invocationRequest, SlackReactions(slackRequest.context), requestContext)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import com.justai.jaicf.context.RequestContext
import com.justai.jaicf.helpers.kotlin.PropertyWithBackingField
import com.justai.jaicf.channel.invocationapi.InvocableBotChannel
import com.justai.jaicf.channel.invocationapi.InvocationRequest
import com.justai.jaicf.channel.invocationapi.getRequestTemplateFromResources
import java.util.*
import java.util.concurrent.TimeUnit

Expand Down Expand Up @@ -101,14 +102,15 @@ class TelegramChannel(
return null
}

override fun getRequestTemplateFromResources(request: InvocationRequest, resourceName: String): String =
super.getRequestTemplateFromResources(request, resourceName)
private fun generateRequestFromTemplate(request: InvocationRequest) =
getRequestTemplateFromResources(request, REQUEST_TEMPLATE_PATH)
.replace("\"{{ timestamp }}\"", TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()).toString())
.replace("{{ messageId }}", UUID.randomUUID().toString())


override fun processInvocation(request: InvocationRequest, requestContext: RequestContext) {
val template = getRequestTemplateFromResources(request, REQUEST_TEMPLATE_PATH)
val message = gson.fromJson(template, Update::class.java).message ?: return
val generatedRequest = generateRequestFromTemplate(request)
val message = gson.fromJson(generatedRequest, Update::class.java).message ?: return
val telegramRequest = TelegramInvocationRequest.create(request, message) ?: return
botApi.process(telegramRequest, TelegramReactions(bot, telegramRequest), requestContext)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,35 +24,6 @@ interface InvocableBotChannel : WithLogger {
* @see InvocableBotChannel
*/
fun processInvocation(request: InvocationRequest, requestContext: RequestContext)

/**
* Provides a messageId for substitution in request template
* */
fun provideMessageId(): String = UUID.randomUUID().toString()

/**
* Provides a timestamp for substitution in request template
* */
fun provideTimestamp(): String = System.currentTimeMillis().toString()

/**
* Loads a channel request template from resources and substitutes essential parameters (clientId, input) in request
*
* @return serialized JSON with substituted request parameters
* */
@Suppress("RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")
fun getRequestTemplateFromResources(request: InvocationRequest, resourceName: String) =
this.javaClass.getResource(resourceName).readText()
.replace("{{ clientId }}", request.clientId)
.replace("{{ text }}", request.input)

.replace("\"{{ timestamp }}\"", provideTimestamp())
.replace("{{ messageId }}", provideMessageId())

.replace("\"{{ randomInt }}\"", randomInt.toString())
.replace("\"{{ randomLong }}\"", randomLong.toString())

.also { logger.trace("Generated template request: $it") }
}

/**
Expand All @@ -79,3 +50,17 @@ private val randomInt get() = Random.nextInt()

private val randomLong get() = Random.nextLong()

/**
* Loads a channel request template from resources and substitutes essential parameters (clientId, input) in request
*
* @return serialized JSON with substituted request parameters
* */
fun InvocableBotChannel.getRequestTemplateFromResources(request: InvocationRequest, resourceName: String) =
this.javaClass.getResource(resourceName).readText()
.replace("{{ clientId }}", request.clientId)
.replace("{{ text }}", request.input)

.replace("\"{{ randomInt }}\"", randomInt.toString())
.replace("\"{{ randomLong }}\"", randomLong.toString())

.also { logger.trace("Generated template request: $it") }
Original file line number Diff line number Diff line change
Expand Up @@ -24,22 +24,23 @@ internal class InvocationQueryParams(queryParamsMap: Map<String, List<String>>)
val type: InvocationRequestType = when {
event != null -> InvocationRequestType.EVENT
query != null -> InvocationRequestType.QUERY
else -> error("event or query must be specified in query parameters")
else -> throw HttpRequestException("event or query must be specified in query parameters")
}

val input = when (type) {
InvocationRequestType.EVENT -> requireNotNull(event)
InvocationRequestType.QUERY -> requireNotNull(query)
}

val clientId: String = requireNotNull(queryParamsMap["clientId"]?.firstOrNull()) {
"clientId path variable must be specified for invocation api call"
}
val clientId: String = queryParamsMap["clientId"]?.firstOrNull()
?: throw HttpRequestException("clientId path variable must be specified for invocation api call")
}

/**
* Type of invocation request
* */
internal enum class InvocationRequestType {
EVENT, QUERY;
}
}

private class HttpRequestException(override val message: String) : RuntimeException()
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.justai.jaicf.channel.invocationapi

import io.ktor.application.*
import io.ktor.http.*
import io.ktor.request.*
import io.ktor.response.*
import io.ktor.routing.*

typealias RouteToInvocableChannel = Pair<String, InvocableBotChannel>
Expand Down

0 comments on commit de7d43c

Please sign in to comment.