@@ -2,89 +2,121 @@ package org.codeoverflow.chatoverflow.requirement.service.tipeeestream.impl
22
33import java .time .OffsetDateTime
44import java .time .format .{DateTimeFormatter , DateTimeFormatterBuilder }
5- import java .util .Currency
5+ import java .util .{ Currency , Locale }
66
77import org .codeoverflow .chatoverflow .WithLogger
88import 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 ._
1112import org .codeoverflow .chatoverflow .api .io .input .event .TipeeestreamEventInput
1213import org .codeoverflow .chatoverflow .registry .Impl
1314import org .codeoverflow .chatoverflow .requirement .impl .EventInputImpl
1415import org .codeoverflow .chatoverflow .requirement .service .tipeeestream .TipeeestreamConnector
1516import org .codeoverflow .chatoverflow .requirement .service .tipeeestream .TipeeestreamConnector ._
1617import org .json .JSONException
1718
19+ import scala .reflect .ClassTag
20+
1821@ Impl (impl = classOf [TipeeestreamEventInput ], connector = classOf [TipeeestreamConnector ])
1922class 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