Skip to content
This repository was archived by the owner on Aug 18, 2020. It is now read-only.

Commit 95d22cc

Browse files
committed
Merge branch 'feature/131-cheer,host,raid-events' into feature/129-streamelements-connector
2 parents 9c2cf49 + 8f24998 commit 95d22cc

File tree

3 files changed

+101
-63
lines changed

3 files changed

+101
-63
lines changed

src/main/scala/org/codeoverflow/chatoverflow/requirement/service/tipeeestream/TipeeestreamConnector.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ class TipeeestreamConnector(override val sourceIdentifier: String) extends Event
3535
private def startSocket(): Boolean = {
3636
@volatile var connected: Option[Boolean] = None
3737
val thread = Thread.currentThread
38-
socket = Some(IO.socket(SOCKET_URL).connect())
38+
val url = s"$SOCKET_URL?access_token=${credentials.get.getValue("apiKey").get}"
39+
socket = Some(IO.socket(url).connect())
3940
socket.get.on(Socket.EVENT_CONNECT, (_: Any) => {
4041
logger info "Connected to TipeeeStream Socket.io"
4142
socket.get.emit("join-room", AUTH_OBJECT)
@@ -93,4 +94,7 @@ object TipeeestreamConnector {
9394
private[tipeeestream] case class SubscriptionEventJSON(json: JSONObject) extends TipeeestreamEventJSON(json)
9495
private[tipeeestream] case class DonationEventJSON(json: JSONObject) extends TipeeestreamEventJSON(json)
9596
private[tipeeestream] case class FollowEventJSON(json: JSONObject) extends TipeeestreamEventJSON(json)
97+
private[tipeeestream] case class CheerEventJSON(json: JSONObject) extends TipeeestreamEventJSON(json)
98+
private[tipeeestream] case class RaidEventJSON(json: JSONObject) extends TipeeestreamEventJSON(json)
99+
private[tipeeestream] case class HostEventJSON(json: JSONObject) extends TipeeestreamEventJSON(json)
96100
}

src/main/scala/org/codeoverflow/chatoverflow/requirement/service/tipeeestream/TipeeestreamListener.scala

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,16 @@ class TipeeestreamListener extends EventManager {
1111
val event: JSONObject = json.getJSONObject("event")
1212
val eventType: String = event.getString("type")
1313

14-
val eventOption: Option[TipeeestreamEventJSON] = Option(eventType match {
15-
case "subscription" => SubscriptionEventJSON(event)
16-
case "donation" => DonationEventJSON(event)
17-
case "follow" => FollowEventJSON(event)
18-
case _ => null // gets None if converted to an option
14+
// Fire events for connector if we are looking for that type of event
15+
Option(eventType match {
16+
case "subscription" => call(SubscriptionEventJSON(event))
17+
case "donation" => call(DonationEventJSON(event))
18+
case "superchat" => call(DonationEventJSON(event))
19+
case "follow" => call(FollowEventJSON(event))
20+
case "cheer" => call(CheerEventJSON(event))
21+
case "raid" => call(RaidEventJSON(event))
22+
case "hosting" => call(HostEventJSON(event))
23+
case _ =>
1924
})
20-
21-
if (eventOption.isDefined)
22-
call(eventOption.get) // send event to connector
2325
}
2426
}

src/main/scala/org/codeoverflow/chatoverflow/requirement/service/tipeeestream/impl/TipeeestreamEventInputImpl.scala

Lines changed: 86 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -2,89 +2,121 @@ package org.codeoverflow.chatoverflow.requirement.service.tipeeestream.impl
22

33
import java.time.OffsetDateTime
44
import java.time.format.{DateTimeFormatter, DateTimeFormatterBuilder}
5-
import java.util.Currency
5+
import java.util.{Currency, Locale}
66

77
import org.codeoverflow.chatoverflow.WithLogger
88
import org.codeoverflow.chatoverflow.api.io.dto.User
9-
import org.codeoverflow.chatoverflow.api.io.dto.stat.stream.tipeeestream.{TipeeestreamDonation, TipeeestreamFollow, TipeeestreamProvider, TipeeestreamSubscription}
10-
import org.codeoverflow.chatoverflow.api.io.event.stream.tipeeestream.{TipeeestreamDonationEvent, TipeeestreamEvent, TipeeestreamFollowEvent, TipeeestreamSubscriptionEvent}
9+
import org.codeoverflow.chatoverflow.api.io.dto.stat.stream.SubscriptionTier
10+
import org.codeoverflow.chatoverflow.api.io.dto.stat.stream.tipeeestream._
11+
import org.codeoverflow.chatoverflow.api.io.event.stream.tipeeestream._
1112
import org.codeoverflow.chatoverflow.api.io.input.event.TipeeestreamEventInput
1213
import org.codeoverflow.chatoverflow.registry.Impl
1314
import org.codeoverflow.chatoverflow.requirement.impl.EventInputImpl
1415
import org.codeoverflow.chatoverflow.requirement.service.tipeeestream.TipeeestreamConnector
1516
import org.codeoverflow.chatoverflow.requirement.service.tipeeestream.TipeeestreamConnector._
1617
import org.json.JSONException
1718

19+
import scala.reflect.ClassTag
20+
1821
@Impl(impl = classOf[TipeeestreamEventInput], connector = classOf[TipeeestreamConnector])
1922
class TipeeestreamEventInputImpl extends EventInputImpl[TipeeestreamEvent, TipeeestreamConnector] with TipeeestreamEventInput with WithLogger {
2023
private val DATE_FORMATTER = new DateTimeFormatterBuilder()
2124
.parseCaseInsensitive().append(DateTimeFormatter.ISO_LOCAL_DATE_TIME).appendOffset("+HHMM", "Z").toFormatter
2225

2326
override def start(): Boolean = {
24-
sourceConnector.get.registerEventHandler(onFollow _)
25-
sourceConnector.get.registerEventHandler(onSubscription _)
26-
sourceConnector.get.registerEventHandler(onDonation _)
27+
sourceConnector.get.registerEventHandler(handleExceptions(onFollow))
28+
sourceConnector.get.registerEventHandler(handleExceptions(onSubscription))
29+
sourceConnector.get.registerEventHandler(handleExceptions(onDonation))
30+
sourceConnector.get.registerEventHandler(handleExceptions(onCheer))
31+
sourceConnector.get.registerEventHandler(handleExceptions(onRaid))
32+
sourceConnector.get.registerEventHandler(handleExceptions(onHost))
2733
true
2834
}
2935

30-
private def onDonation(eventJson: DonationEventJSON): Unit = {
36+
private def handleExceptions[T: ClassTag](handler: T => Unit): T => Unit = event => {
3137
try {
32-
val event = eventJson.json
33-
val parameter = event.getJSONObject("parameters")
34-
val user = new User(parameter.getString("username"))
35-
val message = parameter.getString("formattedMessage")
36-
val amount = parameter.getDouble("amount").toFloat
37-
val currency = Currency.getInstance(parameter.getString("currency"))
38-
val time = OffsetDateTime.parse(event.getString("created_at"), DATE_FORMATTER)
39-
val donation = new TipeeestreamDonation(user, amount, currency, time, message)
40-
call(new TipeeestreamDonationEvent(donation))
38+
handler(event)
4139
} catch {
42-
case e: JSONException =>
43-
logger warn "Error while parsing donation json:"
44-
logger warn s"${e.getClass.getName} - ${e.getMessage}"
45-
case e: IllegalArgumentException =>
46-
logger warn "Error while parsing donation json:"
40+
case e@(_: JSONException | _: IllegalArgumentException) =>
41+
val jsonClass = implicitly[ClassTag[T]].runtimeClass
42+
logger warn s"Error while parsing follow json of type ${jsonClass.getSimpleName}:"
4743
logger warn s"${e.getClass.getName} - ${e.getMessage}"
4844
}
4945
}
5046

47+
private def onDonation(eventJson: DonationEventJSON): Unit = {
48+
val event = eventJson.json
49+
val parameter = event.getJSONObject("parameters")
50+
val user = new User(parameter.getString("username"))
51+
val message = parameter.optString("formattedMessage")
52+
val amount = parameter.getDouble("amount").toFloat
53+
val currency = if (parameter.has("currency")) Currency.getInstance(parameter.getString("currency"))
54+
else Currency.getInstance(Locale.getDefault)
55+
val time = OffsetDateTime.parse(event.getString("created_at"), DATE_FORMATTER)
56+
val donation = new TipeeestreamDonation(user, amount, currency, time, message)
57+
call(new TipeeestreamDonationEvent(donation))
58+
}
59+
5160
private def onSubscription(eventJson: SubscriptionEventJSON): Unit = {
52-
try {
53-
val event = eventJson.json
54-
val parameter = event.getJSONObject("parameters")
55-
val user = new User(parameter.getString("username"))
56-
val time = OffsetDateTime.parse(event.getString("created_at"), DATE_FORMATTER)
57-
val resub = parameter.getInt("resub")
58-
val provider = TipeeestreamProvider.parse(event.getString("origin"))
59-
val sub = new TipeeestreamSubscription(user, resub, time, provider)
60-
call(new TipeeestreamSubscriptionEvent(sub))
61-
} catch {
62-
case e: JSONException =>
63-
logger warn "Error while parsing subscription json:"
64-
logger warn s"${e.getClass.getName} - ${e.getMessage}"
65-
case e: IllegalArgumentException =>
66-
logger warn "Error while parsing subscription json:"
67-
logger warn s"${e.getClass.getName} - ${e.getMessage}"
68-
}
61+
val event = eventJson.json
62+
val parameter = event.getJSONObject("parameters")
63+
val user = new User(parameter.getString("username"))
64+
val time = OffsetDateTime.parse(event.getString("created_at"), DATE_FORMATTER)
65+
val resub = parameter.optInt("resub", 0)
66+
val provider = TipeeestreamProvider.parse(event.optString("origin"))
67+
val gifted = parameter.has("gifter")
68+
val donor = if (gifted) new User(parameter.getString("gifter")) else null
69+
val tier = SubscriptionTier.parse({
70+
if (parameter.optInt("twitch_prime") == 1)
71+
0
72+
else
73+
parameter.optInt("plan", 1000) / 1000
74+
})
75+
val sub = new TipeeestreamSubscription(user, time, resub, tier, gifted, donor, provider)
76+
call(new TipeeestreamSubscriptionEvent(sub))
6977
}
7078

7179
private def onFollow(eventJson: FollowEventJSON): Unit = {
72-
try {
73-
val event = eventJson.json
74-
val parameter = event.getJSONObject("parameters")
75-
val user = new User(parameter.getString("username"))
76-
val time = OffsetDateTime.parse(event.getString("created_at"), DATE_FORMATTER)
77-
val provider = TipeeestreamProvider.parse(event.getString("origin"))
78-
val follow = new TipeeestreamFollow(user, time, provider)
79-
call(new TipeeestreamFollowEvent(follow))
80-
} catch {
81-
case e: JSONException =>
82-
logger warn "Error while parsing follow json:"
83-
logger warn s"${e.getClass.getName} - ${e.getMessage}"
84-
case e: IllegalArgumentException =>
85-
logger warn "Error while parsing follow json:"
86-
logger warn s"${e.getClass.getName} - ${e.getMessage}"
87-
}
80+
val event = eventJson.json
81+
val parameter = event.getJSONObject("parameters")
82+
val user = new User(parameter.getString("username"))
83+
val time = OffsetDateTime.parse(event.getString("created_at"), DATE_FORMATTER)
84+
val provider = TipeeestreamProvider.parse(event.optString("origin"))
85+
val follow = new TipeeestreamFollow(user, time, provider)
86+
call(new TipeeestreamFollowEvent(follow))
87+
}
88+
89+
private def onCheer(eventJson: CheerEventJSON): Unit = {
90+
val event = eventJson.json
91+
val parameter = event.getJSONObject("parameters")
92+
val user = new User(parameter.getString("username"))
93+
val time = OffsetDateTime.parse(event.getString("created_at"), DATE_FORMATTER)
94+
val amount = event.getInt("formattedAmount")
95+
val message = parameter.getString("formattedMessage")
96+
val cheer = new TipeeestreamCheer(user, amount, message, time)
97+
call(new TipeeestreamCheerEvent(cheer))
98+
}
99+
100+
private def onRaid(eventJson: RaidEventJSON): Unit = {
101+
val event = eventJson.json
102+
val parameter = event.getJSONObject("parameters")
103+
val user = new User(parameter.getString("username"))
104+
val time = OffsetDateTime.parse(event.getString("created_at"), DATE_FORMATTER)
105+
val message = parameter.getString("formattedMessage")
106+
val viewers = parameter.getInt("viewers")
107+
val raid = new TipeeestreamRaid(user, message, viewers, time)
108+
call(new TipeeestreamRaidEvent(raid))
109+
}
110+
111+
private def onHost(eventJson: HostEventJSON): Unit = {
112+
val event = eventJson.json
113+
val parameter = event.getJSONObject("parameters")
114+
val user = new User(parameter.getString("username"))
115+
val time = OffsetDateTime.parse(event.getString("created_at"), DATE_FORMATTER)
116+
val message = parameter.getString("formattedMessage")
117+
val viewers = parameter.getInt("viewers")
118+
val host = new TipeeestreamHost(user, message, viewers, time)
119+
call(new TipeeestreamHostEvent(host))
88120
}
89121

90122
override def stop(): Boolean = {

0 commit comments

Comments
 (0)