Skip to content

Commit

Permalink
Refactor task interface, implement RatingDiffTask
Browse files Browse the repository at this point in the history
  • Loading branch information
Zomis committed Dec 15, 2019
1 parent 5ac1b12 commit 98156fb
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 14 deletions.
@@ -1,5 +1,7 @@
package net.zomis.duga.tasks

import net.zomis.duga.aws.DugaMessage

interface DugaTask {
fun perform(): Unit
fun perform(): List<DugaMessage>
}
@@ -1,14 +1,13 @@
package net.zomis.duga.tasks

import net.zomis.duga.aws.Duga
import net.zomis.duga.aws.DugaMessage
import java.time.Instant

class MessageTask(private val room: String, private val message: String) : DugaTask {

override fun perform() {
override fun perform(): List<DugaMessage> {
val msg = message.replace("%time%", Instant.now().toString())
Duga().send(DugaMessage(room, msg))
return listOf(DugaMessage(room, msg))
}

}
@@ -1,9 +1,69 @@
package net.zomis.duga.tasks

import com.fasterxml.jackson.databind.JsonNode
import net.zomis.duga.aws.DugaMessage
import net.zomis.duga.utils.StackExchangeAPI
import java.io.IOException

class RatingDiffTask(private val room: String, private val site: String, private val users: List<String>) : DugaTask {

override fun perform() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
val stackApi = StackExchangeAPI()

override fun perform(): List<DugaMessage> {
try {
val usersString = users.joinToString(",")
val result = stackApi.apiCall("users/$usersString", site, "!23IYXA.sS8.otifg5Aq.2")
val users = result["items"]
if (users.size() != 2) {
throw UnsupportedOperationException("Cannot check diff for anything other than two users")
}

val max = users.maxBy { it["reputation"].asInt() }!!
val min = users.minBy { it["reputation"].asInt() }!!
val str = StringBuilder()
str.append(clearName(max["display_name"].asText()) + " vs. " + clearName(min["display_name"].asText()) + ": ")
str.append(max["reputation"].asInt() - min["reputation"].asInt())
str.append(" diff. ")
diffStr(str, max, min, "Year") {it["reputation_change_year"].asInt()}
diffStr(str, max, min, "Quarter") {it["reputation_change_quarter"].asInt()}
diffStr(str, max, min, "Month") {it["reputation_change_month"].asInt()}
diffStr(str, max, min, "Week") {it["reputation_change_week"].asInt()}
diffStr(str, max, min, "Day") {it["reputation_change_day"].asInt()}
return listOf(DugaMessage(room, str.toString()))
} catch (e: IOException) {
e.printStackTrace()
return listOf()
}
}

fun chatName(displayName: String): String {
return clearName(displayName).replace(" ", "");
}

fun clearName(dispName: String): String {
var displayName = dispName
while (displayName.contains("&#")) {
var replacement = displayName.substring(displayName.indexOf("&#") + 2)
try {
replacement = replacement.substring(0, replacement.indexOf(';'))
val ch = Integer.parseInt(replacement)
displayName = displayName.replaceFirst("&#\\d+;", ch.toChar().toString())
} catch (ex: RuntimeException) {
displayName = displayName.replaceFirst("&#", "");
}
}
return displayName
}

fun diffStr(str: StringBuilder, max: JsonNode, min: JsonNode, string: String, function: (JsonNode) -> Int) {
str.append(string)
str.append(": ")
val maxValue = function(max)
val minValue = function(min)
val diff = maxValue - minValue
str.append(if (diff > 0) "+" else "")
str.append(diff)
str.append(". ")
}

}
16 changes: 12 additions & 4 deletions Duga/duga-aws/src/main/kotlin/net/zomis/duga/tasks/TaskLambda.kt
Expand Up @@ -3,6 +3,7 @@ package net.zomis.duga.tasks
import com.amazonaws.services.lambda.runtime.Context
import com.amazonaws.services.lambda.runtime.RequestHandler
import com.fasterxml.jackson.databind.ObjectMapper
import net.zomis.duga.aws.Duga

class TaskLambda : RequestHandler<Map<String, Any>, Map<String, Any>> {

Expand All @@ -11,8 +12,8 @@ class TaskLambda : RequestHandler<Map<String, Any>, Map<String, Any>> {
override fun handleRequest(input: Map<String, Any>?, context: Context?): Map<String, Any> {
val json = mapper.readTree(mapper.writeValueAsString(input))

// comments
val task: DugaTask? = when (json["type"].asText()) {
val type = json["type"].asText()
val task: DugaTask? = when (type) {
"mess" -> MessageTask(json["room"]!!.asText(), json["message"]!!.asText())
"questionScan" -> null
"ratingdiff" -> RatingDiffTask(json["room"]!!.asText(),
Expand All @@ -26,9 +27,16 @@ class TaskLambda : RequestHandler<Map<String, Any>, Map<String, Any>> {
else -> null
}

task?.perform()
if (task == null) {
return mapOf("error" to "No such task: $type")
}

val messages = task.perform()
if (!messages.isEmpty()) {
Duga().sendMany(messages)
}

return mapOf()
return mapOf("messages" to messages)
}

}
@@ -1,6 +1,5 @@
package net.zomis.duga.tasks

import net.zomis.duga.aws.Duga
import net.zomis.duga.aws.DugaMessage
import net.zomis.duga.utils.StackExchangeAPI
import org.slf4j.LoggerFactory
Expand All @@ -12,8 +11,8 @@ class UnansweredTask(private val room: String, private val site: String, private

private val api = StackExchangeAPI()

override fun perform() {
try {
override fun perform(): List<DugaMessage> {
return try {
val result = api.apiCall("info", site, "default")
val unanswered = result["items"][0]["total_unanswered"].asInt()
val total = result["items"][0]["total_questions"].asInt()
Expand All @@ -22,9 +21,10 @@ class UnansweredTask(private val room: String, private val site: String, private
var send = message
send = send.replace("%unanswered%", unanswered.toString())
send = send.replace("%percentage%", percentageStr)
Duga().send(DugaMessage(room, send))
listOf(DugaMessage(room, send))
} catch (e: IOException) {
logger.error("Error with StackExchange API Call", e)
listOf()
}
}

Expand Down

0 comments on commit 98156fb

Please sign in to comment.