essential-actions

Clone or download

Merge pull request #21 from j4ckofalltrades/implement-twitch-chat-commands

Implement Twitch chat commands

Modified Files

PK
#mR4AW_META-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMuRp,HLHUM,KS033r*)f$ADRtR&3PK4AW_PK
#mR META-INF/PK
#mRaddstreammarker/PK
#mRMETA-INF/maven/PK
#mRMETA-INF/maven/com.stream-pi/PK
#mR6META-INF/maven/com.stream-pi/twitch-add-stream-marker/PK
#mRyTmodule-info.classmNN0ДGyzAi^8 KW1iWC.|pJ)b-=|{p^cB86e!՝NLՕΟ yCh| ' #]pp<k
R/lD6kn)IRk(fjZU( LwXZzb훈& Sas%:#2)1EyQnL=x2}4L#@X׎;bϽ7h8l: \>Z)¡G_PKyTPK
#mRn;r}+addstreammarker/AddStreamMarkerAction.classW{=[X6@ `j 
H܌dCZW, p[%״i/toIL㒴!?=v_|3zջs}[o8$YL+؀QRg|ZԺ(fD]a$фˢ3`^Ԧ+2`a1 G%WES$z!KI<ψx^_gDy I|/&q/)/W
^5_W L%^|[w|W$4u61}xXsI MY|tlPhx,cZuu]=Wp3sB&d&EI LOKwuOIHd"lə1V^5I}2{[Sk~EMO^,zk苋`b1GPAfluJUhJ8,͔̌kRYkT-xcy s7
Fئ 9ǎY,,E 1ㆄ
(o'~v](A!7k'H ?Cv_ߤSJ,8y_/,02~@/g[))&fqFBK(ޢG0H"U'S$TCHDLR?ƫse\-wuT1sd}\3\2SQ-s_Nd|y]CF*Job3mߘsu?s{I{fPKJP5S 8%2Yo:*~+;gkeoJQUeA'_eMqKxC®Z {lZE1oo EqeQq
oaE?|DLS-`|
X]AIj_c΍י(fž:^7ыb)[Ŕ yٛ*Y)]Jsi Ro;*ZY"؆::YO‘2.&^f,%Gop3G{`[7z37rDVg;.s)3gMFri xoBuQ(6pPٟFFF0)5+Ku cUC}/ɥ'{TQz@cW3y5/E qY/[Jܖ)a%LH!#Lץq 4T<gl~sga{eרdm>+ǭX
ȃrOm[xE."j ׸5rv6M\l΂5X+MA"nVlvV"]򶭖\\$4/u7s%bkۼIyj:3Y39%W^NEH8^?MC ><خgeԳJ/CJkۈmԥrZS4i1^At"_Fs-i%@4,m [-movc'>hQ"H5,β텸b!׈3zxڴ{ۖyѶѣ PAo^mߦRO'zv²_1>ُ=x=uQ"TMD|]<V #'(析uQpU*fM<jBF߼pؓWH ;3ƙ}|/@o`M T߻ *څHK'g:ޗ}79B[O$VphZ;YG߹ELs.80H0ژZLAXb8NUy*0J}rD 1<I_m0m>$GlC=d˸2,#Ӵ!rSk.Lq`nD:MBjGcd4uZ;CLP|o&v.03oR_L
|PF bR0T8O I;PKn;r}PK
mRMݔ) =META-INF/maven/com.stream-pi/twitch-add-stream-marker/pom.xmlV]o }ϯeqUU*J1Il'M=p.\KcY,DH&*XyJY U+f3 rKK'
.2x~+=b鸗GI;pe~\"N-QHTab$)[sLZqU⒧xr;OX °2k`^AeX J@CaC.CdrœȭZWDӉ4TSݓ@Z`DQ G&QSY͈reklӰaL?4LzHpƴffh4EZx>u _FlmA*.׿~9@C4MTi1i7R"1^ڌ>n:8ϋ"kZ4SUQgzt =jw'dxvtcDc6E 8##1AQ"R}MHĈ2ɆCJQ!Xzp_%pH쵇0ګy\hD0g/4˯]~~$ÚT/Pt_KRg$L bޱ<db "*ͨgەY7 C O;M-ź aνo>]'ߓ,PKMݔ) PK
#mR|_gDMETA-INF/maven/com.stream-pi/twitch-add-stream-marker/pom.properties-ʱ
ݯ=!K0床 tZr> j2%*d :@(.7bu1ﶁjPK|_gPK#mR4AW_META-INF/MANIFEST.MFPK
#mR AMETA-INF/PK
#mRAaddstreammarker/PK
#mRAMETA-INF/maven/PK
#mRAMETA-INF/maven/com.stream-pi/PK
#mR6AVMETA-INF/maven/com.stream-pi/twitch-add-stream-marker/PK#mRyTmodule-info.classPK#mRn;r}+addstreammarker/AddStreamMarkerAction.classPKmRMݔ) =
META-INF/maven/com.stream-pi/twitch-add-stream-marker/pom.xmlPK#mR|_gD META-INF/maven/com.stream-pi/twitch-add-stream-marker/pom.propertiesPK

PK
mR4AW_META-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMuRp,HLHUM,KS033r*)f$ADRtR&3PK4AW_PK
mR META-INF/PK
mRconnect/PK
mR connect/chat/PK
mRMETA-INF/maven/PK
mRMETA-INF/maven/com.stream-pi/PK
mR1META-INF/maven/com.stream-pi/twitch-chat-connect/PK
mR module-info.classUP]O0=Wɇ | 1&NjdywG6@i{O9=k9hYd*qDh'yG}*%z_@._ Eys C⸋z?Y…2,d]jj*2i)+&%rIXoSLL:G c~] :{#4W^~ ކiy7.Z#,XiT"e@XyWprp>j\(b'lZPK PK
mRVԱ%connect/TwitchChatConnectAction.classW [=#cy 8x#KdlA 44FcČ:3%ަK/ޤDviM'f$!`7w˻zWo8q0F.MG#@Ju炨Ƙ02AbsS,Z⑕zvN5\؀BAzxIYAxL-b;ڻA<q
OBC|X>QOSAx|Zgl럗 uXW"12+>rkXB6E39MaKXLLwHt J'v2ˬOft͎zJ7]C8)NOӹ Q'z4ime9׵L*]}0 pӐ굽s=ftJj!6ļX GŽ^52d:ܘґt Zq̀meu5t
\ooHڄ.>Ihں615'>Y_t4(}ɤ8ָnZl ']zV_$Ⱥeyd%!Jrn;IZrOzZfl;Ȫe(bSct=fMQMCFMi;GG'5uqD|¦dpV0~qrvR?nn]ĕB b:ɍ񌄚/
g|ϒmq뜖ɸƛsLtRȯ*.+YhtpӹY齔}||M^t1[s=g7,dsZ0GP~h8 <oJw1,a2Te,o)6#]&\n)ռ,qVQV]<q/Yy p9(3'y+JرF'({
⚂㺂Ǐc?AӲ\et7m:lpF W%ܽ@Xi-j*1#WJHԧ-'Ɏ1))06COzŘFmM̳bH9벼;jSSSZh{pVV*[֮_ iq"j&y&J0Uݶ-[Mkj%9թ4|x<5O鰧UmL3Vǫ^,eO2&Ũn^UzъhA2ގdSiLfs6d8ƨ1/_΀f{-|VHTspe{zzbP5Ižptzbgp旘NwY
vUҖՉS=*4b]*chӾkTBI[yIYy7Pt{ |$GMd4;RY ҝgj)Bg/Ԁ{${Q1g/+Q+b@.wAyNUD'&KZ3S"Ziby۶бŜZȭ]i~ď-ڲPZD$J:NښWt*
p9:0eZb^9Wk&fg2IZx}+
\ȎE=+l1 eK®[>`xJ^ )oBHt&Ξj H"H*U<VGBr5TWUV GM$䱆ká3{"y"U׹Ryyg+j܄*lF[P;Єbn'"'yp ]|K8^$VV5lm3#zo_k mRdu.V6'ZYX4؍5؃"Y bA)@Xï'M*ᨂƒes&'~ vpj<v˛n*Nw=s1'amt<ų0Wz)͎"zA5`sp K| NalG~`&:NZ=9QZTd_}l9DɣG<*ZT<"]הP[9g~LP^O/bt)uQ%C$l5}Wp q%l^!wVLP=)&=CL8 qO?0fҜ)y֑abtP
WF:n~gx+!T<?7f{ L{ߏPKVԱPK
mRyg$(connect/chat/TwitchChatCredentials.classRN@=R°6>" &&& LdHmoX(mm}s3o/Zҡ`]CU*j*6J֐/ %wuo9<{:yض=JۡiSٽ=LAS1CD2<e6=M_]w(Ri{6wzܗp(j*^5 ] RH,@%;}e8цvGtD^Jsaw(hllH䙤3̓Q$i$v ePIkqPI&U.b)<yBfB*9MLWb-"\jYY">PKyg$PK
mRL@r`8connect/chat/TwitchChatCredentials$ChatCredentials.classT]OA=nY([RPqAR Wh0 @H,ԯUD}߄ƻB mqsϽ3ۃ__\q 7xZqaBm pv];K*nZps qϮ†]{C4=ɠmu. TJ[߰Jsp_5YE
|REB%~hHˡHk㕐NiԞs7\"4|C*j{Dp9Ȟ1qՆ"Pui;O*Sk@C{zTzYۃƠ٘kL7VN^wcR_Sl
H:i1uHۥeaU(ZabMa T 7+780VvM]SFfX &PPO ˆng& ]X! z6 u'dEP*7곢7܆M g>B_B-`E;fFs,AՂ4tfD(4\#"c?1=;hj+ㄎ7SZR=:"4ْ=LUG—(e_
&y\S&ikbx f/E^$nXiz '0@cHx~" WF&=:6mU ):쿞HN+8K$KIVj]2*ɦN7wq2C?8I((F'MEs=e螴PKL@r`PK
mR"}08META-INF/maven/com.stream-pi/twitch-chat-connect/pom.xmlU]o0}W dLSL*^mjW$ڪ&$l0MG^'^ߠcMTHƋ,ٔǬHV/6R%jم\R%9>.y\2:(Yǯ 8nSsB*\j$[J qmb{X,UPc=Gv 61DG@*Aq 6,{DPL4 )VE%C[7F(t%~5-sI5JC5M%˨W( _RX$Te5+.oh.ٳil><".ϓb٥-|~ط| p3%Lqq~:,vLi[D7Im'dp%]#˚MQU6x[_[뺋j2{~kr<W9{h&u=uz2W*OPQLᾂ)42ꋲap>֠6DG^F®݈!o,ʯ]Qy䣉tn kǴE?GA#MƄz?}3|}w؇<&J'ɇ_{ ~SW9>jdz_=ln &cb75hPK"}0PK
mRyI#]b?META-INF/maven/com.stream-pi/twitch-chat-connect/pom.properties ; НS8`H
@x{(SAW9i8u|e)GhhJPX%H<A(rJLn-4`PKyI#]bPKmR4AW_META-INF/MANIFEST.MFPK
mR AMETA-INF/PK
mRAconnect/PK
mR Aconnect/chat/PK
mRAMETA-INF/maven/PK
mRA>META-INF/maven/com.stream-pi/PK
mR1AyMETA-INF/maven/com.stream-pi/twitch-chat-connect/PKmR module-info.classPKmRVԱ%connect/TwitchChatConnectAction.classPKmRyg$(: connect/chat/TwitchChatCredentials.classPKmRL@r`8 connect/chat/TwitchChatCredentials$ChatCredentials.classPKmR"}08nMETA-INF/maven/com.stream-pi/twitch-chat-connect/pom.xmlPKmRyI#]b?QMETA-INF/maven/com.stream-pi/twitch-chat-connect/pom.propertiesPK 
PK
mR4AW_META-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMuRp,HLHUM,KS033r*)f$ADRtR&3PK4AW_PK
mR META-INF/PK
mR
clearchat/PK
mRMETA-INF/maven/PK
mRMETA-INF/maven/com.stream-pi/PK
mR/META-INF/maven/com.stream-pi/twitch-clear-chat/PK
mRȌGUclearchat/ClearChatAction.classWwYfk[lE-!`4 aL81uҳ=x<Ό7M5-isi[wgd[{{?4m؊KsJy_a:2_4!Y|8?1ۆilJaNde*'pyҨࣲPMcp]Hc/1_qH)|Jǧg8R|
_E u3n-gԲpպf˝CvG4t=7-7Ұ)nvJRn^\Eܤdh=ivD) ɼW&Ҭ'YG6d9So˺NL vaO('0<NBsSL^Ex<}FIUdW`sZ9+:5c}Vb˹e칱ؼcUYCa{pj_ږň:Q1Fl~ޱ@8Fx$\d860ڰ"n#cU ySǗ -.Tuz#]~I68vP00aBq鷙Rc8F%#<id N*^6
^Jޜ8oU`59~nWC]S~@x_3u|CÙ0OfBuvp{܊^.8FXyy
#{ 6u|#3]Ql4:Iǫ~'~a?u/+MVB*NY~~+~g8?sr$]M2U`miܘALe"険2^)g\/\3s9TL/gyv5lYxq*+-!ݫ W
d{;1w=i5srbg}* y:Y
㾳*'d{vpy-*QTaJ,m<z.ݭcccBL \Dzz \kk +ͶWrZώp{H`+4C
:ii;8rSjΪ:]FlQQ5J* W!hsR򼺛p {T}@~Q..Qt'#mgFnzX^.oG܋͊]]XP-7y8x7J.Z,IoQ}P$ 6Jְ&ϧmri=.?.礉])ll#M-/ۢfS:$(-0vh%4>,8>0
r[4g@q2x3K1b1.ZaSlA&jHeͶ;hN&+0jȚ5l^t;(:v҄]ڍ؃>m_IRz;"qL-o\AWV>sG }3;}vM:p]8HQd(T E*0vjؓaR{jxݱo Wpq(&pyGk蹉=wpd̚}?/ m'80Ȉw繓<y%|!%I­s8g"Q\?
Jتg4w9^"MO vnbK!VMɰb3Y9XL -i[ hDLFLDaDvj"PKȌGUPK
mRjImodule-info.classmNN0ДGy;qUWUWG!R*K "{[R]k>F1mbZ)!!JC"F8"tNJdnpi(D8!95iC6kXL5? .m+x7aW¹'% )Y%-2aFrWW?
(d#ճ7k\dž/_TU\a-,7PKjIPK
mRi0" 6META-INF/maven/com.stream-pi/twitch-clear-chat/pom.xmlV]o }ϯeqUU*J1uHlcN2Mﻀ?k7yùp9.y63(֋-sVP"]/xRls`jh]^b=+) 0$dOh {yTtXY2?n@jN^(M
l·m ;|qTC/bX%E²'؎E +*&19RZ2%p
!&#2#r-uZ rɀΔf`gL"%*IYDLe#.m_SuɟN5&2~҃E>aے=5}FWBq-d r@<\vd*pO1ⶈgQU)܋v7MyxwufϦugGw+Tzh,Baϱ-)T:5S,lrCx$epH6SRA2jԛ؆<*1#Ez`=n\sOc'BEJhhMhby?RµawJV$zt tƔhu{aw,؆C;a}JS73v9),4vyDÅ}LeއKŮgPKi0" PK
mR9<\`=META-INF/maven/com.stream-pi/twitch-clear-chat/pom.properties 1
0 (87T7qr1F[жĨ{A;/H7'@ $_e\:ÕhP4H>Q)8Q@57sjPK9<\`PKmR4AW_META-INF/MANIFEST.MFPK
mR AMETA-INF/PK
mR
Aclearchat/PK
mRAMETA-INF/maven/PK
mRAMETA-INF/maven/com.stream-pi/PK
mR/APMETA-INF/maven/com.stream-pi/twitch-clear-chat/PKmRȌGUclearchat/ClearChatAction.classPKmRjImodule-info.classPKmRi0" 6 META-INF/maven/com.stream-pi/twitch-clear-chat/pom.xmlPKmR9<\`= META-INF/maven/com.stream-pi/twitch-clear-chat/pom.propertiesPK

PK
$mR4AW_META-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMuRp,HLHUM,KS033r*)f$ADRtR&3PK4AW_PK
$mR META-INF/PK
$mR hostchannel/PK
$mRMETA-INF/maven/PK
$mRMETA-INF/maven/com.stream-pi/PK
$mR1META-INF/maven/com.stream-pi/twitch-host-channel/PK
$mR0#hostchannel/HostChannelAction.classW=cYc9 BR0ƉX3pIto;)ii(~ܑ,/ hޛ{ϹwI܋^R+:1ôԗcPK1|X)>!|m(HÌs**Vc!v R;1ڕ1x2ߏ#@91\8cI漢c>.''>gTGK*>1|!7WT|UA<_4Ǵ5y㪑 g. <˙;mupI.
:jB-(̜ {2RRGI˱S
n6g-+/Κބ1kYҮuF+ؓ-^xFlWOuh]{nˤZD<X)Y#1꟥RQS$.XGN;w=oDFb\9l[ɼkcT) ,U| v*Fh JH CL8. C[#0jB:qNXκ׈;s^<oûsNFL11GrVzwF(9.#hJTi$*f 4|ojM ö( W,;s|LVk] +A?aM:1Iu}Ae@|9`99Ab#o' Ժ~*?RHn Rů4744S{ 5 7jgʖ]0= M x
oi p'UPXFL%0;V#<QU;a`+òp`Z#}` VH'i<8Bqu~_do&o)a3(|jZ҇v繞- ϕw\oq%~2cac%>52|33]wd@7qưpu=^&-ߚl+Xqr əA&VN=]»%922"qd3is?й2T"#c(xh-KLxY/Rut0ezwp 3%NPu]{=NAAEs#ɃvP_5#<X[i)cy2`,7JGeOm;FIqoUQ\6q}' 6.L wdfk#Q<+{5O7cmm/wjwiٳp.g7'mm<P935I`5H{޴#&b.z;ʗ[˧z-Nۈm4
Ԕ5 7Um*,)-B `BemWn>ЃD}؉E$=8͙Z6`I֣wOMoa2imi}{;3VGG]{8/{sS\m3z}8҄tAJ#h
:<) pQ H{h vP!F_Φ+ؓ 7UѰ6Ƹ89g?xHF/J 9̔>5C- DD˿(#+J1qlt$<4Y:4*\jph /ѥGɹrhUFUtS5Qan"2B￁lH~xvlsɕ%ViFN J8t9d8JMSd'67\DPK0PK
$mR0!b?module-info.classmNN0ДGyn8 3BB .p !i|>Blkya~|~a?"э#B'/E]75U}5˾ :+ <{8!WT&2wYH73NTFؔ* y:p&&և5o&p ;mBWz<LNdRG
zAjD jpypu]a|JMFmUu~
w .߽_PK0!b?PK
$mRPkB^b?META-INF/maven/com.stream-pi/twitch-host-channel/pom.properties ʱ
ݯ=
!R(0
zy<oBV%]yZ49(,6$A OU yus!EA PKPkB^bPK
mR19$ 8META-INF/maven/com.stream-pi/twitch-host-channel/pom.xmlV]o }ϯeqUU*J1IlcN2Mﻀ?p4yùp9.E>2(WgSVR2]͞WxURS`j5˴dJD*B3L{ aq{;nCe~C$Ҥ)Th[{80<,UB$,v;XİR)kSQ %#EP+BfA&hFʒ ;ݒ[5b@gPMv;xs&,fi"SDzoJOӟ4OdCäG+mFը>1InM(rs-"|$Z^xmI7R<66TCbp7]/5ϛ)*S.nCϝ`́Qώ^ ЫMFk
lhmLzЇ})XׯdFx$epH6RRAr5ԛ؆<|"=h'r±|i-ɡEM7h&#,|'beG:@[4pG}tÇ#-ρ0ym1<PiuVfSrA3 l7<Sao6(>އKĮ'PK19$ PK$mR4AW_META-INF/MANIFEST.MFPK
$mR AMETA-INF/PK
$mR Ahostchannel/PK
$mRAMETA-INF/maven/PK
$mRAMETA-INF/maven/com.stream-pi/PK
$mR1ARMETA-INF/maven/com.stream-pi/twitch-host-channel/PK$mR0#hostchannel/HostChannelAction.classPK$mR0!b?" module-info.classPK$mRPkB^b?e
META-INF/maven/com.stream-pi/twitch-host-channel/pom.propertiesPKmR19$ 80 META-INF/maven/com.stream-pi/twitch-host-channel/pom.xmlPK
*
PK
%mR4AW_META-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMuRp,HLHUM,KS033r*)f$ADRtR&3PK4AW_PK
%mR META-INF/PK
%mR raidchannel/PK
%mRMETA-INF/maven/PK
%mRMETA-INF/maven/com.stream-pi/PK
%mR1META-INF/maven/com.stream-pi/twitch-raid-channel/PK
%mRbmodule-info.classmNN0ДGyn8 B⌐8 W !ԡWG!6IK[<އgf>\`>"ɍIB's"MΌ}qU+Bj tXe_`esK*S29yH?5^dPI7Z|V^J*I f!g^;~ޖOSΙ^d]b}U\68zƧul{c1_hUUXa-,wPKbPK
%mR?/#raidchannel/RaidChannelAction.classW=#ɞ3fs@d[ -` q#96Mݱ4cgpIto;)ii(~ܑ,/ hޛ{ϹwI܋^p0%e ~IÇ#LgThEA+RϪSa` qp4,Jj8''EQ|_#@9Q\8cI漢c>.''>3*^#ץYSy _F|Qz
9u-9kI7tg3
Z<n0a:eKA{MbܻhڅP)f
yo13k/,dž̸|vhؐWY۵Fˋ3?n83ak`.)ؓif<#ߧ&F|hmQDVp"DV
|\.36ŪRQS$.XGN;w=oEFb<9s#uk[My*Xn`NI(ONj}!,!aG>S soh \`FbS_'n͕5缲; u<S3uQJOM#eDM*\,oM·I}P~b:N;2g•\Qe&
At<( 3'E/ B,~ Y B?9h<Uu??a]SϤy@"~{78[/Kku'TQb)Nu7uܒ)/x[ Tq[G
J`Fy;wa \@%VeF@,Nx`+;J}c%+K sִsW$l®>|l(`+ +?Ο-PQsؙG tg Wgek.3cKn!9+84f&DSO9ݜθWSIAo2Ws?й2T$g<[hmGT&]*:Ru 鰮ezwp 3%Pu]{=NAAEȳ#ɃvPt[n[k:y_ӬC dhXnͣ*%۱Vw =ުh+ 7*mQn6l]0lނ:(LGiFjknpڨ_@0^S̷+g\nO4$VxGxVk< x. a/Gxӎn˛Cv/#~7OL-CIۈm4
ԔUВVO*Sw:FV^[L!β6Omv"݁^a"nLjg0ZY⊄ng]F-l]0mtU-ml`GvH}F7Gd4ttn2్֗@oFc7G@<HXidMTԀR9'4Wϲ?ƞuUUԮU6hl=
F􌄍X179XF26|Qj#d?w}@]d&OZ?nG^%"XY㫓+C8z t%J-/<DSИp1SND%QQZ;UTtU5^an"2B￁lHqx6lsɕ%ViFA J8t9d8JI_)B1Y M_PK?/PK
%mR=J(`b?META-INF/maven/com.stream-pi/twitch-raid-channel/pom.properties 10 = -CՉGi,$2/TF_?HWaξDm.dC+F%(JTVV#PK=J(`bPK
mR$ 8META-INF/maven/com.stream-pi/twitch-raid-channel/pom.xmlV]o }ϯe*MjV{$'M=p.\K1{*$fbN cV$jqP)5BnRipIJ |~?e6wQ8aeSsB*\j$[K q-)Q ,xUPc=Gv 63DG@*Aq 6,{DP"i 0⢠޸bG[rﯦe.SiHx2* 4
CGF UcYr{`7h~S~'ŲLhMZ5&fx5Ex >'j@ВKo_-S`;8,nG*EƆRЧMyq[KŲzJTfUoFs6zywufϨugGw/X?jXtžc[=RRSau
**Yׯd%x8lا$gը7 y$"=6h'r±!xeI%P~EM7h&v#,\|ǴEߏPwηԡ4(NhOGZ̟0żcy6EE;;T0V/gqft3 l7<Sk7AgTJ_/Tv}x^:}_hPK$ PK%mR4AW_META-INF/MANIFEST.MFPK
%mR AMETA-INF/PK
%mR Araidchannel/PK
%mRAMETA-INF/maven/PK
%mRAMETA-INF/maven/com.stream-pi/PK
%mR1ARMETA-INF/maven/com.stream-pi/twitch-raid-channel/PK%mRbmodule-info.classPK%mR?/#raidchannel/RaidChannelAction.classPK%mR=J(`b?e
META-INF/maven/com.stream-pi/twitch-raid-channel/pom.propertiesPKmR$ 82 META-INF/maven/com.stream-pi/twitch-raid-channel/pom.xmlPK
+
PK
PK
,cR4AW_META-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMuRp,HLHUM,KS033r*)f$ADRtR&3PK4AW_PK
,cR4AW_META-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMuRp,HLHUM,KS033r*)f$ADRtR&3PK4AW_PK
,cR META-INF/PK
,cR META-INF/PK
,cRsendchannelmsg/PK
,cRsendchannelmsg/PK
,cRMETA-INF/maven/PK
,cRMETA-INF/maven/PK
,cRMETA-INF/maven/com.stream-pi/PK
,cRMETA-INF/maven/com.stream-pi/PK
,cR5META-INF/maven/com.stream-pi/twitch-send-channel-msg/PK
,cR5META-INF/maven/com.stream-pi/twitch-send-channel-msg/PK
,cRB module-info.classmP]O0=Ua*`t̘LL1M;Bu[ɫ?xHmzsz=7zp-z`D*Vd&Y:~2Y
,cRB module-info.classmP]O0=Ua*`t̘LL1M;Bu[ɫ?xHmzsz=7zp-z`D*Vd&Y:~2Y
ꠐ\3T|=m>aлޏ\8tqA-ù4OmD4knOU<3*ҩVEJõ2CκX֍\3CVrvQ=F 0\P[yI"7,H^@b7arV FXw]vPKB PK
ꠐ\3T|=m>aлޏ\8tqA-ù4OmD4knOU<3*ҩVEJõ2CκX֍\3CVrvQ=F 0\P[yI"7,H^@b7arV FXw]vPKB PK
,cR ')<W-sendchannelmsg/SendChannelMessageAction.classW֒B^q9B@P#7rM iȋ+ew8mMz7JOzЦLCMKMޮlFfͼffo؅wULFQˆi"0?b:(,!f"/(x:g\xQB9sҟ<#Dϊ'P>>g؄d(>ωU|!|Q/E ,WVQ| _*"Dqߕ{|_\GOGS'R f& N<68 9ӓnY1>-zVPp2@;o:d3ɂ9=gRS~6
,cR ')<W-sendchannelmsg/SendChannelMessageAction.classW֒B^q9B@P#7rM iȋ+ew8mMz7JOzЦLCMKMޮlFfͼffo؅wULFQˆi"0?b:(,!f"/(x:g\xQB9sҟ<#Dϊ'P>>g؄d(>ωU|!|Q/E ,WVQ| _*"Dqߕ{|_\GOGS'R f& N<68 9ӓnY1>-zVPp2@;o:d3ɂ9=gRS~6
B]c
B]c
©bVeL.LΨ>iF1[cc
©bVeL.LΨ>iF1[cc
] {S;v>7۶a͸d* ơgm[)Fbp<ӠpsUnX}DL܄0,ɅAU٬(-1 :x!gDb:p`ܴW`\P^>1홺ZTiIYJ\ 'r^NyZ&uMCj5fhzznzH/ L6؛H,z)Bwt%&2hq 1GKE;;Uϓ#-qԔ,xt闽PCpWui ^i)^3yv{nxF,UBط,ògZsҭXЋ_j.+򼒻7ʓ}#AƯƞ{uwXr
] {S;v>7۶a͸d* ơgm[)Fbp<ӠpsUnX}DL܄0,ɅAU٬(-1 :x!gDb:p`ܴW`\P^>1홺ZTiIYJ\ 'r^NyZ&uMCj5fhzznzH/ L6؛H,z)Bwt%&2hq 1GKE;;Uϓ#-qԔ,xt闽PCpWui ^i)^3yv{nxF,UBط,ògZsҭXЋ_j.+򼒻7ʓ}#AƯƞ{uwXr
ڂM2ONw<dR~/i ,Ŗu&B5k#jxxA՘/39޸0b.u5/bF+8<bksSFn: 7ekEJV`qfPvt7]N8S_xUkp :+X_<\6h kxCxS[ i;֐%
ڂM2ONw<dR~/i ,Ŗu&B5k#jxxA՘/39޸0b.u5/bF+8<bksSFn: 7ekEJV`qfPvt7]N8S_xUkp :+X_<\6h kxCxS[ i;֐%
83q=W/Tlv  mnH}Uxl\/M\Z힘<05po3߫Wv 'w/nwuړo)]tf996p;^p'wz]LÂLjtI2ٴ5k<#-U)\AC<○t:-Q
83q=W/Tlv  mnH}Uxl\/M\Z힘<05po3߫Wv 'w/nwuړo)]tf996p;^p'wz]LÂLjtI2ٴ5k<#-U)\AC<○t:-Q
Օy_paxaq=:[cMxp'xqdt$,}6؅Lg<:h7a026=}v~׺MX0;~SjIJ7|g,*`59XN++r m&#T `\I9e"]Ѻ޼|4ɫSr_@U) حeyhx)9h1g]=2!>R XMz ?8ǧ C4Pb Xp"XASC5T"qp(4
Օy_paxaq=:[cMxp'xqdt$,}6؅Lg<:h7a026=}v~׺MX0;~SjIJ7|g,*`59XN++r m&#T `\I9e"]Ѻ޼|4ɫSr_@U) حeyhx)9h1g]=2!>R XMz ?8ǧ C4Pb Xp"XASC5T"qp(4
DW}nAZi#JXvl`xI~ܤȡvp /Cױj<Ж鉭'v_ЙjG:j zlL-`+Z m@'FWf *gc8N{j|aB=~X/QRU["3B9B,5l$z*xV]ǦX<y[JT
DW}nAZi#JXvl`xI~ܤȡvp /Cױj<Ж鉭'v_ЙjG:j zlL-`+Z m@'FWf *gc8N{j|aB=~X/QRU["3B9B,5l$z*xV]ǦX<y[JT
Vm':bx2;CwГx{OJWAe}CDP/^ÀغJGNp2
Vm':bx2;CwГx{OJWAe}CDP/^ÀغJGNp2
35o i7WH0qeO<Ԑg-W d q>,!W yBOw/ B#&nbVU 56ț7I54<C7=<r 5|Ano#|acuG8egƋ/V+~
35o i7WH0qeO<Ԑg-W d q>,!W yBOw/ B#&nbVU 56ț7I54<C7=<r 5|Ano#|acuG8egƋ/V+~
Lh;-~XL$%*p| ftaiB|6$:M7@<p+>ڟOԝP\k1_kr6rK60/pc|+PK ')<WPK
Lh;-~XL$%*p| ftaiB|6$:M7@<p+>ڟOԝP\k1_kr6rK60/pc|+PK ')<WPK
cRrѣ: <META-INF/maven/com.stream-pi/twitch-send-channel-msg/pom.xmlVo ~_E{54UuUU]+J1IlcN2Mwm)9ߖt͕:h>TTKt2;O&Vrəgܘ㒮yhMYΑTƟL{բo6Y8<?OS+ɨqpcSF% )eʋGĭ<&)҄i8-ZBϔ0FGWirZUJpK+xm úεDݑ Z\!-xz2nƼx+.aݏۻ7Jy08" 95dqAk
cRrѣ: <META-INF/maven/com.stream-pi/twitch-send-channel-msg/pom.xmlVo ~_E{54UuUU]+J1IlcN2Mwm)9ߖt͕:h>TTKt2;O&Vrəgܘ㒮yhMYΑTƟL{բo6Y8<?OS+ɨqpcSF% )eʋGĭ<&)҄i8-ZBϔ0FGWirZUJpK+xm úεDݑ Z\!-xz2nƼx+.aݏۻ7Jy08" 95dqAk
98R #ծ"=4Y
98R #ծ"=4Y
mBB,~QEbSCwpx/$Q!I]4ܗ~owfгM5o= o˒vA嬱ݡw`Wpmơ~!sybţ"9sH$-k 3~##IN{܉o]c+rⱊ0Y=Qt_~[E|较:Zڷp۰;5CxUvvݗJQ)Ȉ' a2u1vT2̈́ɛ'YJZwݟMqwpsHe_{N}`I^G(PKrѣ: PK
mBB,~QEbSCwpx/$Q!I]4ܗ~owfгM5o= o˒vA嬱ݡw`Wpmơ~!sybţ"9sH$-k 3~##IN{܉o]c+rⱊ0Y=Qt_~[E|较:Zڷp۰;5CxUvvݗJQ)Ȉ' a2u1vT2̈́ɛ'YJZwݟMqwpsHe_{N}`I^G(PKrѣ: PK
,cRQLbfCMETA-INF/maven/com.stream-pi/twitch-send-channel-msg/pom.properties ʱ
,cRQLbfCMETA-INF/maven/com.stream-pi/twitch-send-channel-msg/pom.properties ʱ
0 н_QpnP7q>"F[iis{Zv)HO;k)'hJ4X5nH^Q)åkYzPKQLbfPK,cR4AW_META-INF/MANIFEST.MFPK
0 н_QpnP7q>"F[iis{Zv)HO;k)'hJ4X5nH^Q)åkYzPKQLbfPK,cR4AW_META-INF/MANIFEST.MFPK
,cR AMETA-INF/PK
,cR AMETA-INF/PK
,cRAsendchannelmsg/PK
,cRAsendchannelmsg/PK
,cRAMETA-INF/maven/PK
,cRAMETA-INF/maven/PK
,cRAMETA-INF/maven/com.stream-pi/PK
,cRAMETA-INF/maven/com.stream-pi/PK
,cR5AUMETA-INF/maven/com.stream-pi/twitch-send-channel-msg/PK,cRB module-info.classPK,cR ')<W-sendchannelmsg/SendChannelMessageAction.classPKcRrѣ: < META-INF/maven/com.stream-pi/twitch-send-channel-msg/pom.xmlPK,cRQLbfCMETA-INF/maven/com.stream-pi/twitch-send-channel-msg/pom.propertiesPK
,cR5AUMETA-INF/maven/com.stream-pi/twitch-send-channel-msg/PK,cRB module-info.classPK,cR ')<W-sendchannelmsg/SendChannelMessageAction.classPKcRrѣ: < META-INF/maven/com.stream-pi/twitch-send-channel-msg/pom.xmlPK,cRQLbfCMETA-INF/maven/com.stream-pi/twitch-send-channel-msg/pom.propertiesPK
|
|
PK
mR4AW_META-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMuRp,HLHUM,KS033r*)f$ADRtR&3PK4AW_PK
mR META-INF/PK
mR setcolor/PK
mRMETA-INF/maven/PK
mRMETA-INF/maven/com.stream-pi/PK
mR.META-INF/maven/com.stream-pi/twitch-set-color/PK
mRPeLFsetcolor/SetColorAction.classW=#Y=fap-E 0I
88شuҳ=x<RgFi}t7A$TsG ?{{=oxo%pqLW# Sq|TjK8
RuZ1#8椶u\1 p(I]cR{Rqqe~%E\O`7yI'RA|JO $Y|.BEiIǗu|%2~#o-V\W9#ւ4k֢q,w6<۝К-~`T<K%뚂7aGPZ'3&%m4];xZC4ux\C,[*֜´ƬiG Rr-ϖv3پ9_ɫ t~%W*+/''(JCFks5lYxZ*+5e~kF2u7KB*Pɭ:va^5D ѺkPx_w>;gٵN zY} (ᲣdE Mmjӑ^*Ԑ0?lCu|,\%8[NR+$s#|n[󤆎bBIhdh
9ŐW ?kG q**dztU,*'xd?6Tù ('3d0WX[ՊR B,mjֳ]?7 R@L: Z)6BQS:nhOx57j︥aoyb;EE ᖁH^7pU8ci˄`/N_ %`;(]@a9i80j[EA))Ϫ䊠u_Ȗ*N1閂3diOߓwQ/Yvd-%Yv${A뱾ψ&<O<vn^;J-y +ʌȃ NfjjvmOsv gd-Q}{v`i+[z 8\9kSSOW99544$ Y_czRwߊ SN=cƖ֜44' <s XzHcW:keZe5cUUI<hgeVہy]]=."A"Yx(W<sw,kE:ۢ<z(7'v-.oGmzkOm j ie6VWY'>zDMrkUgSl[~y"d>&f
ù| 6 t9̛֚Uq$_|<g0 ("gʫb gʲ_cݑ^6#Mh.6 ؊q:lp4 hfszڌWђVH[0w:FVִ^EǚGIc7=ak/xdᄎs3U2LA=|y ۖ5wTU^Bj}^8'{'b}*Y&@9Hh7b
03&}ȡ?Cng"J^xz؟"iF8PEp؈#D{﫢6Rב R=NDwWEM$O"3a|>$rxG޺E,]
QEø|)cxȎa;EN3k]TQL2HL3GVpz&c::ut @j_
Rň$<~0ԣ汕tJc5=ȽNDmERÎpOa "d \(iPKPeLFPK
mRimodule-info.classmNN0ДG84g .^cTCW^.|j'R<ޝ'1 ĔT:Q^jD]W}E1>]g` 'N ?SgҤt]j+gPVBZm2Bǻ'Q-0$kT5?9!˔Gx=:#\:Q+Hj"z fhO;@hbqZk
+Vu=XPKiPK
mR)@! 5META-INF/maven/com.stream-pi/twitch-set-color/pom.xmlV]o }ϯe*MjV{$'M=p.\Kձȗ{*$&*XҒ&x|^WUo)QK.&Ȕ.!,WdpwXYKǽ<J8-jw?tjCVJKBmd·`e ;rqC:b
*xB'؎!8
^W_H%(.Š!†b/(S$ %U!9z(GnָN
^˩ׂ8RXTMe5#.]#uŞΎg2a҃U&ꆗ <7ﱦ] gFnĆ).z;4Ēx˔v0 KZ&)w|^\Uyk-6]ޝp9pi]-㏽d]h؎@}GJek7aIc#N>$))ǹb Mla|Dk[aWԉ^x,vtN'tn kZ2яG:@X}~O?#aym!6ww4e*nWrfnxqo6o(m^_Tv}xA:}xPK)@! PK
mR0.[_<META-INF/maven/com.stream-pi/twitch-set-color/pom.properties ʱ@@ 5Db3#KKg~x뻄@V+ sKr@!EjqAF[ldu7krPPK0.[_PKmR4AW_META-INF/MANIFEST.MFPK
mR AMETA-INF/PK
mR Asetcolor/PK
mRAMETA-INF/maven/PK
mRAMETA-INF/maven/com.stream-pi/PK
mR.AOMETA-INF/maven/com.stream-pi/twitch-set-color/PKmRPeLFsetcolor/SetColorAction.classPKmRi2 module-info.classPKmR)@! 5t
META-INF/maven/com.stream-pi/twitch-set-color/pom.xmlPKmR0.[_<h META-INF/maven/com.stream-pi/twitch-set-color/pom.propertiesPK
-
PK
'mR4AW_META-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMuRp,HLHUM,KS033r*)f$ADRtR&3PK4AW_PK
'mR META-INF/PK
'mRstartcommercial/PK
'mRMETA-INF/maven/PK
'mRMETA-INF/maven/com.stream-pi/PK
'mR5META-INF/maven/com.stream-pi/twitch-start-commercial/PK
'mR$?umodule-info.classmNN0ДGyzAig .^cTCW^.|ؤ<K¡+rmnlb=9ٳ/jͻ*%!4b9BIW@
8pBhB8.S&Vz {&V%J{2B4jtׅ \Fjb XMkxp΢h)ViXt_ ?GÒ_/ ԱMl{c1m*Vخp PK$?uPK
'mRq+startcommercial/StartCommercialAction.classW {=#ˌǎY !bE`A$r 6iX[#uf8M5i[MwPi(Im Fg-9wߛ7ʫ_QtOD{>&KQzRT(Jnj*,3+aE /+'EEEp>ЄY<%OG 1|P~TDGQOEi5?+ϩ/D|Y_k
ZEݶ kP15fIJgszTsL{ꀂtv=Fub(h*T3K7ikLjʜNԈT_qдMDǨpT"dMLΈ>ab׭Q1_*ؕ%ǣɛEtGZذS*gTmZQ9>slt_,FmY.g zB(K6b4@f%;h-3?m
,qHUu꧋^*2$-uQ/9PR扟|qe}Rky;Y7Ƞdhp˕*N8nt0(h-|Ʀϸyyow_-腀E\`k^mLgO&u`#ӷ޼ϴR ǥhP jX+V&zmЭpy>nni{T@Cv]G*~G(~L?%5D@hK}Ⱏe ?E<_*~׸2~
j5  ຊiW5lw+U0  ?ᰊ74!L-R`ȶ.YM .mu:[lKrD΀-ĽR]d
ӥU%x2t׈{l\MGC?%"vh*n8NQjx=ovəԠߙ{< S󄻆5[$&Hhިez;g8<D98mIqQ\ɩG*^QxHd2FE?8mLщ' ;>N#e[y<3}we&l/b«ng]+VpuvOfr#ܻs2chR.QneWZ)qK9gORB<H8hK,"i ^ ޥWwp˺[qS͂wwn2lK^ͧoC<[=˵ie"2oz=ĽBXM7ퟍftfҴW,ކDqBn&k]]O.o 8ʤ$f>oy<>e6D [-|ӤoHb/ĿaxH_d,{+&$chHWјBM"UL6TMƚВ<nhCK$cU[HL"r|b=b6H7b[{q/qmQ8<B\!׿`^Gl,s|wV3 /c#Gb8պm=(ŸX‹~y5ld 6t]*$ otI tI>tѝݜ߃ RxcU>x@FO*>w£)_vz
!{ԷgJm٥K /DȑkؒbkmP۫1wAgssvCGɫL^]'uog;w *Uױg,@w{_D[&g܃&0"p'8w3'I z yͰQ #a Ok(gl@\.Mc*N7Ԃ^Dk/</- y^t,t1db|9^AA"Dl%B\BxK'FG3$PKqPK
mR9f#( <META-INF/maven/com.stream-pi/twitch-start-commercial/pom.xmlVn }WD^ 2MU个*MjV{$'.`;8<t{\D"nT\Y)+HxfO_u<*)֌)KeZWK e%"CB=0d˽ۡ2?!yR RiRRf_* J-1^% ,A<a ˟c;61TTHiHT<-l(DjJP︦Y{:IIacR-W+t jU<g)QK0`T2=Ռ,~C7W::O<IVی[QඑFyn5M g nƾk!w/ēx5l0OZ汱/p>/xyLUypqzw'dxvtwcMd^m2Z.PslG`{Fkc
u}G)mk7b#I T\&a?$FxH<h[aWBЉPQX~ptΌ#,|'beouoQў~?GD/#!.*򸃾C)Y?MA70L] <<\/Tv}x^:}ߞxPK9f#( PK
'mRb:bfCMETA-INF/maven/com.stream-pi/twitch-start-commercial/pom.properties 10 @= Ė!\cK C7ox*_?H7~fruT244*@>+F)4-tYIn&0?PKb:bfPK'mR4AW_META-INF/MANIFEST.MFPK
'mR AMETA-INF/PK
'mRAstartcommercial/PK
'mRAMETA-INF/maven/PK
'mRAMETA-INF/maven/com.stream-pi/PK
'mR5AVMETA-INF/maven/com.stream-pi/twitch-start-commercial/PK'mR$?umodule-info.classPK'mRq+startcommercial/StartCommercialAction.classPKmR9f#( < META-INF/maven/com.stream-pi/twitch-start-commercial/pom.xmlPK'mRb:bfCMETA-INF/maven/com.stream-pi/twitch-start-commercial/pom.propertiesPK

PK
"mR4AW_META-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMuRp,HLHUM,KS033r*)f$ADRtR&3PK4AW_PK
"mR META-INF/PK
"mRunhost/PK
"mRMETA-INF/maven/PK
"mRMETA-INF/maven/com.stream-pi/PK
"mR+META-INF/maven/com.stream-pi/twitch-unhost/PK
"mR0Qmodule-info.classmNN0ZӔGyʁ#N8s\CbW^.|phĮ< v ѝK^<%
T6Vș$to1 t1c=K!8`8d8"-DTnDm2[9kvGY9aJj*NYcR]7;|%yQKزyKķqC(-~cg]Om(`?AoPK0QPK
"mRG 7 unhost/UnhostAction.classWwGVVz$8I(X%IMĭEq+)`x+vWI\
-BiM -P}N9T)wwG\4Iܙ{wsgO &gAZ`R2LeO6ЏK2y:O
Og`؄ jB(e ǼL] dge B(C$ZZׅ.xF2x6؏/ :aְ=O{AW]pmoPǛ;a{ad{є 5'װ\
s|!&e@ s5OiH:6OUZ *g]%Nف#35Pp50*<S=TA(n;>h8 @ 3M`23g3[,|t-RqzM5eb%Iྗ|]6R \Պ,UW^n˔/6쨸`8(v ZT/15 [7T#6nƑjQ[AM;k8&Moc̴&>aW}J0e_Njr6_]7
M|C9q WUta*b%/6+FkvlU$1XH8^;5~Kl"0ԥtbU|[VLeb\=ߓ|/~G&^&~#&~7ti- ;-ǭ/_p2kmeK9j
,g ͂g#?[rbANJ~˭g=?z-٦Pe`1kَ7&^uS4UA҉roB=?XX.B%,ك4lZPEysh
)'tf׉K^U,$,I]>n=ՊwoT* h?W16b٘#0$ʣ~' I.QCe :M^L` C][nra:MȮ٫׵#?!h|pQ򜺙q8 [Z,V"uKhH [r4m>t<Se]P/v;4Ꚗ&:-tˣ*l8hM'h2TYw"_*IKϯ 9[aԝ {,7˞C=^~KV]tVozLk@tg fykĺr} 00̧VmNl'PZ߉ce&q'H5|hR1R#7iJ#֖6Gml!߹3RmU;
a=y[\{IҤ9N@j *N%ҤbGy6Rm|{.0G{ {.}mP6*7[#K;1̘Wf30rʾDy_8e3@|/8(28ǹ$pu8MGμϒ'% ;ЍrƘUXvC uٍ$/s<TYɟՁ-Ձ-u_)E%s<Fj7EPKG 7 PK
mR'^Y 2META-INF/maven/com.stream-pi/twitch-unhost/pom.xmlV]o }ϯeqUU*J1Il'M=p.\KcY,DH&*XyJY U+f3 rKK'
.2x~+=b鸗GI;pe~\"N-QHTab$)[sLZqU⒧xr;OX °2k`^AeX J@Ú\z#ȜDn"NF-$b8=2ȈjF\=F> +?*ZdCä+M gL{lfYnHSĮW3XnĆ*.z;4DdKPCv#(c@S +⹦E3e\uDxvwMMgGw#H?jZt c;9\Sau
*"Yׯd$Ix(#l8dr57 yUb '^{؊oNsBZ1n~{;L7GY1NIEX_uPN7ӱ4()%:>h1F/C!*rAߡҌ~?]؛~0DmPۼϟvub:?;/PK'^Y PK
!mRZ\9META-INF/maven/com.stream-pi/twitch-unhost/pom.properties 1 W8hL
@bwR_=g$zQ0Β:K*L
I~'ysGƥ=PKZ\PK"mR4AW_META-INF/MANIFEST.MFPK
"mR AMETA-INF/PK
"mRAunhost/PK
"mRAMETA-INF/maven/PK
"mRAMETA-INF/maven/com.stream-pi/PK
"mR+AMMETA-INF/maven/com.stream-pi/twitch-unhost/PK"mR0Qmodule-info.classPK"mRG 7 unhost/UnhostAction.classPKmR'^Y 2 META-INF/maven/com.stream-pi/twitch-unhost/pom.xmlPK!mRZ\9 META-INF/maven/com.stream-pi/twitch-unhost/pom.propertiesPK
X
PK
 mR4AW_META-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMuRp,HLHUM,KS033r*)f$ADRtR&3PK4AW_PK
 mR META-INF/PK
 mRunraid/PK
 mRMETA-INF/maven/PK
 mRMETA-INF/maven/com.stream-pi/PK
 mR+META-INF/maven/com.stream-pi/twitch-unraid/PK
 mR2Gmodule-info.classmNN1#!摖_!QP Aԑqb#GZ>!DbWvf v 靭TWP^iUNyY
B&R =B+C>d#$yCg`  \Җ|hk/'2N豐^[CԻaJ6jr"(;z\YelJQ4Dv=Ұoak!k\FhlL&:K#v#navPK2GPK
 mR\ƌ unraid/UnraidAction.classWwFy<60@ bI"dcQJ ,MN85i뎥5x<Όi.I{礧{i[?wgG=r|޽˻_ ĥ &OfAZ`R2LeЏ6Џ2y6 O'a؄ jB(Wd ǼL] dd B(C$Zz7.xNǧ3x>؏
^s:>aְ=O{A]PU]pmoPǛ;a{ad{є u'װ\
s|!&e@IsG5OiH:6OUZ *g]%Nف#35PpS/<ӵ=TA(n;>h8 @ 3M`23g3[,|t-RqFM5eb%Iྗ|]6R \Պ,UW^n /6쨸`8(v ZT/15 [7T#6nƑEjQ[AM;k8&MQoc̴!0o%LLYalKxW+F]W/=&9n
B.L%TW5 Q XKQ5;*}ҊA}Nb,$V/Rs.uhRs:a6˭wĚ6z&+^5}uoM?Q?ďtOS?[vv;?gZ[WL_p4+m0ko weK9j
,g mL=ٚՔ[[z~m}4tl,f9MAm[:NY~X/M QēzϒMH"z]QZ?wm֟vvs6ά:bɫ%_UQIo]>n=݊woT* lhx(W~# 6\ْ\lXouRq G'vr(ݥ2k~u¦k/&Y-7h-0NwFY?d+ܳj4{޿yN8w^六@ax:3$y^6[Y]2߮ZmtAKxEw:}^^\6]y&yœu[G`ìf ;ҍ/ 'ՇE^nm0Nц|4Knmhp<?^@yp"z/A[wѓml[m62y #鞞%m 66>Aq܂460[ ;A;h}'sX $IhBKĦi+'XK*X[mzH{V!+@48=4 NnMTwpQ<F8K;e$ߪ$Rk|:֪8ߔHV6v۸Jq__d<wMo]xփm<66UnbF0whc1;Ek=1<#f;|gaZa"}4.r<ODg:^qPcpяIK%=:6qy'OK<'v$؍1솎AI-_y橲?[[ H=SJ*x o>=PK\ƌ PK
 mR~Z\9META-INF/maven/com.stream-pi/twitch-unraid/pom.properties 1 W8hHP@j{I]_; +%`gvwKz AЇ59JrqN:PK~Z\PK
mR0)v 2META-INF/maven/com.stream-pi/twitch-unraid/pom.xmlV]o }ϯeqUU*J1Il'M=p.\KcY,DH&*XyJY U+f3 rKK'
.2x~+=b鸗GI;pe~\"N-QHTab$)[sLZqU⒧xr;OX °2k`^AeX J@Ú Dz#ȜDn"NF-$b8=2ȈjF\=F> +?*ZdCä+M gL{lfYnHSĮW3XnĆ*.z;4DdKPCv#(c@S +⹦E3e\uDxvwMMgGw#H?jZt c;9\Sau
*"Yׯd$Ix(#l8dr57 yUb '^{؊oNsBZ1n~{;L7GY1NIEX_uPN7ӱ4()%:>h1F/C!*rAߡҌ~?]؛~0DmPۼϟvub:?;/PK0)v PK mR4AW_META-INF/MANIFEST.MFPK
 mR AMETA-INF/PK
 mRAunraid/PK
 mRAMETA-INF/maven/PK
 mRAMETA-INF/maven/com.stream-pi/PK
 mR+AMMETA-INF/maven/com.stream-pi/twitch-unraid/PK mR2Gmodule-info.classPK mR\ƌ unraid/UnraidAction.classPK mR~Z\9 META-INF/maven/com.stream-pi/twitch-unraid/pom.propertiesPKmR0)v 2e
META-INF/maven/com.stream-pi/twitch-unraid/pom.xmlPK
T
PK
mR4AW_META-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMuRp,HLHUM,KS033r*)f$ADRtR&3PK4AW_PK
mR META-INF/PK
mRwhisper/PK
mRMETA-INF/maven/PK
mRMETA-INF/maven/com.stream-pi/PK
mR,META-INF/maven/com.stream-pi/twitch-whisper/PK
mR module-info.classmNN0ДG)AH=s8VŐQ4WG:IKZ<3`C`\+ 1/e.tj BN'|pDaFN<\g$,VʈW.2 iI :?-1VDŽ&f"ӄd$4i]eucw¥`&OD}3\/F˭@XՖ;5nc+tvz.z7op"{PK PK
mRwHwhisper/WhisperAction.classW=#y<6fY]" $[ P SC[:y:38M6-I}/].Tf+/@~c7λs}w(>Lzq9+pQ4h$fE_QQC %Q S|jhXHE$$. c.
n`IyA'E|R~|J4/ XV,'$(K
e9"~%&5_ % Zq^-ݮKk
OVÐ,WC6tkBjj@-GLO(8R4mc0kSeNYuHLOŽ"/o:6w 㓮CoB 'Xպūk=]ʯD֖h3bR(uD?p _ Y 1ㆄu\fˮQ1l-O7_š4Fmp yaҠ˜)b6)4J0$ژ^b,Uq\?,Rrn8gYaG\W8W)zG
#9RW^N<%&^W-|k5ݲ|WsM+p="O]%w<*kC&00a޽~eHtȴ}~`eO9QUTg<FS/KRkFM<߫OxCžVtô*"o nx Qq'd6*qGBor0" gKäNa9SIN!cQ3\aURo072+Ru=K)5\*w;*6Z32\ס筓;3m;Jǃʊ?qpse=h_޽WlQYѴ陳eKvp"Js7bL_z Q!T~t$ VA<kXu<ژZX{i3>,,pG+C ר/YЄ7 A
i%^RNϼ?yNFx"䪱QDÝ5\cpg{q
G %mk;DE|PtF-.E7><]8йئuUއDTA۬ص%"NIT]29~Ms~k
W-TL/‚}U:+o ` p㣉;8$Q+ۧ8z|F2ː2Z6-qm 9%ěP2Zgj.f2ؒzz+pm
>z·>@?v. b7!~<͙jpq\og]h3Z-l[/mobGVĮ,A&¯c9m~~͉{<[IJMo3}?bOh!K#$, L38KY[ P$] h:uz+&$ v{&4bMkb`,$8&9{t51xH7qsCMdn"u<qmHf3c4T/"',y k S18<RfD)~Q$" TI4.rFqoq8cbɄ^c2IFC_ A!1C7S ~@;MF7r͔(ez^\
8lpz$ Pʈ] &u \_I$1PKwHPK
mR!Lϐ 3META-INF/maven/com.stream-pi/twitch-whisper/pom.xmlV]o }ϯeqUU*J1IlǙM=p.\Kc/DHvjI ev%X]ŋ|GZj6UTy aT"E
O`gY,(iǯ^Z2Iz)-|1R .G80<UW
<c` JʯIyAI#†/+*uFeID!ltC_H+S%PM}v'zݒD+IRHDMe5#.^c#uIΎg2a҃&C3M63,MC)bkl"
7bC_mRrIIJ{k( MJq)w|^\Ѽ2**՗[mS{;&s&dz;${h- )d:,n2CF<}H6RRr9ԛ؆<*1Ez`=l^sOS'9{i%X~EM7hO&#,|'$,OG:@X}~O?#a"!dhg9PiJUV=@rfnxqo6/(m^_Tv}xA:}̿xPK!Lϐ PK
mR>RZ]:META-INF/maven/com.stream-pi/twitch-whisper/pom.properties 1 W8`LXBJ{Yv}vJ ݶzsJ|Ҳ>^֫MlPZA_V7pN$d؁g~PK>RZ]PKmR4AW_META-INF/MANIFEST.MFPK
mR AMETA-INF/PK
mRAwhisper/PK
mRAMETA-INF/maven/PK
mRAMETA-INF/maven/com.stream-pi/PK
mR,ANMETA-INF/maven/com.stream-pi/twitch-whisper/PKmR module-info.classPKmRwHwhisper/WhisperAction.classPKmR!Lϐ 3=
META-INF/maven/com.stream-pi/twitch-whisper/pom.xmlPKmR>RZ]:. META-INF/maven/com.stream-pi/twitch-whisper/pom.propertiesPK

M README.md
+24 −2
# Stream-Pi Essential Actions
# Stream-Pi Essential Actions
Set of trusted, pre-bundled actions and integrations for Stream-Pi using the [Stream-Pi Action API](https://github.com/stream-pi/actionapi).
Set of trusted, pre-bundled actions and integrations for Stream-Pi using the [Stream-Pi Action API](https://github.com/stream-pi/actionapi).
## Prerequisites
## Prerequisites
- Java >= 11
- Java >= 11
- Maven >= 3.6.3
- Maven >= 3.6.3
## List of Actions
## List of Actions
- Hotkey
- Hotkey
- Website
- Website
- Twitter
- Twitter
- OBS Actions
- OBS Actions
- Run Command
- Run Command
- Text Block
- Text Block
- Media File
- Media File
- Media Key
- Media Key
- Twitch
- Twitch
## Actions Help Guide
## Actions Help Guide
### Twitch Chat Integration
### Twitch Chat Integration
The first step is to acquire an OAuth token from https://twitchapps.com/tmi/, the generated OAuth token should look something like `oauth:xxxxx`.
The first step is to acquire an OAuth token from https://twitchapps.com/tmi/, the generated OAuth token should look something like `oauth:xxxxx`.
In the Stream-Pi Server's Plugin page enter your Twitch username, and the generated token then click on `Save Twitch chat credentials` button. You should then be able to use the pre-bundled Twitch chat actions.
In the Stream-Pi Server's Plugin page enter your Twitch username, and the generated token then click on `Save Twitch Chat credentials` button. You should then be able to use the pre-bundled Twitch chat actions.
### Supported actions
### Supported actions (see [Chat Commands](https://help.twitch.tv/s/article/chat-commands?language=en_US) for full documentation)
#### All Users
- Set username color
- Normal users can choose between Blue, Coral, DodgerBlue, SpringGreen, YellowGreen, Green, OrangeRed, Red, GoldenRod, HotPink, CadetBlue, SeaGreen, Chocolate, BlueViolet, and Firebrick. Twitch Turbo users can use any Hex value (i.e: #000000).
- Send channel message
- Send channel message
- Whisper (send user message)
#### Broadcaster and Mods
- Clear chat
- Toggle slow mode (TBA - pending toggle-button functionality)
- Toggle followers-only mode (TBA - pending toggle-button functionality)
- Toggle subs-only mode (TBA - pending toggle-button functionality)
- Toggle emotes-only mode (TBA - pending toggle-button functionality)
#### Broadcaster and channel editors
- Run commercial
- Host
- Unhost
- Raid
- Unraid
- Add stream marker
### Running locally
### Running locally
Copy the `twitch-chat-connect`, `twitch-send-channel-msg`, and `Java-Twirk` jar files from the `PreBuiltPlugins` directory to your Stream-Pi server plugins' directory.
Copy the `twitch-chat-connect`, `twitch-send-channel-msg`, and `Java-Twirk` jar files from the `PreBuiltPlugins` directory to your Stream-Pi server plugins' directory.
---
---
## Quick Start
## Quick Start
Build all actions by executing `make build-all` from the command line or specific actions i.e. `make build-twitch-chat-action`, see [Makefile](Makefile) for complete list.
Build all actions by executing `make build-all` from the command line or specific actions i.e. `make build-twitch-chat-action`, see [Makefile](Makefile) for complete list.
To test these actions out in your local environment you'll need to run the [Stream-Pi Server](https://github.com/stream-pi/server) and copy the contents of `PreBuiltPlugins/` to the server's
To test these actions out in your local environment you'll need to run the [Stream-Pi Server](https://github.com/stream-pi/server) and copy the contents of `PreBuiltPlugins/` to the server's
Plugins directory (`data/Plugins` by default), especially if you're writing your own custom action / integration.
Plugins directory (`data/Plugins` by default), especially if you're writing your own custom action / integration.
M build.sh
+28 −1
#!/bin/bash
#!/bin/bash
FOLD=../PreBuiltPlugins
FOLD=../PreBuiltPlugins
hotkey() {
hotkey() {
pushd . || exit
pushd . || exit
cd hotkeyaction && mvn clean package
cd hotkeyaction && mvn clean package
mv target/hotkeyaction-1.0.0.jar $FOLD/hotkeyaction.jar
mv target/hotkeyaction-1.0.0.jar $FOLD/hotkeyaction.jar
popd || exit
popd || exit
}
}
mediakey() {
mediakey() {
pushd . || exit
pushd . || exit
cd mediakeyaction && mvn clean package
cd mediakeyaction && mvn clean package
mv target/mediakeyaction-1.0.0.jar $FOLD/mediakeyaction.jar
mv target/mediakeyaction-1.0.0.jar $FOLD/mediakeyaction.jar
popd || exit
popd || exit
}
}
obssuite() {
obssuite() {
pushd . || exit
pushd . || exit
cd obssuite/mother && mvn clean install package
cd obssuite/mother && mvn clean install package
mv target/obssuite_motheraction-1.0.0.jar ../$FOLD/obssuite_motheraction.jar
mv target/obssuite_motheraction-1.0.0.jar ../$FOLD/obssuite_motheraction.jar
cd ../setcurrentprofile && mvn clean package
cd ../setcurrentprofile && mvn clean package
mv target/obssuite_setcurrentprofileaction-1.0.0.jar ../$FOLD/obssuite_setcurrentprofileaction.jar
mv target/obssuite_setcurrentprofileaction-1.0.0.jar ../$FOLD/obssuite_setcurrentprofileaction.jar
cd ../setcurrentscene && mvn clean package
cd ../setcurrentscene && mvn clean package
mv target/obssuite_setcurrentsceneaction-1.0.0.jar ../$FOLD/obssuite_setcurrentsceneaction.jar
mv target/obssuite_setcurrentsceneaction-1.0.0.jar ../$FOLD/obssuite_setcurrentsceneaction.jar
cd ../setcurrenttransition && mvn clean package
cd ../setcurrenttransition && mvn clean package
mv target/obssuite_setcurrenttransitionaction-1.0.0.jar ../$FOLD/obssuite_setcurrenttransitionaction.jar
mv target/obssuite_setcurrenttransitionaction-1.0.0.jar ../$FOLD/obssuite_setcurrenttransitionaction.jar
cd ../setmute && mvn clean package
cd ../setmute && mvn clean package
mv target/obssuite_setmuteaction-1.0.0.jar ../$FOLD/obssuite_setmuteaction.jar
mv target/obssuite_setmuteaction-1.0.0.jar ../$FOLD/obssuite_setmuteaction.jar
cd ../setcurrentprofile && mvn clean package
cd ../setcurrentprofile && mvn clean package
mv target/obssuite_setcurrentprofileaction-1.0.0.jar ../$FOLD/obssuite_setcurrentprofileaction.jar
mv target/obssuite_setcurrentprofileaction-1.0.0.jar ../$FOLD/obssuite_setcurrentprofileaction.jar
cd ../setpreviewscene && mvn clean package
cd ../setpreviewscene && mvn clean package
mv target/obssuite_setpreviewsceneaction-1.0.0.jar ../$FOLD/obssuite_setpreviewsceneaction.jar
mv target/obssuite_setpreviewsceneaction-1.0.0.jar ../$FOLD/obssuite_setpreviewsceneaction.jar
cd ../setrecording && mvn clean package
cd ../setrecording && mvn clean package
mv target/obssuite_setrecordingaction-1.0.0.jar ../$FOLD/obssuite_setrecordingaction.jar
mv target/obssuite_setrecordingaction-1.0.0.jar ../$FOLD/obssuite_setrecordingaction.jar
cd ../setreplaybuffer && mvn clean package
cd ../setreplaybuffer && mvn clean package
mv target/obssuite_setreplaybufferaction-1.0.0.jar ../$FOLD/obssuite_setreplaybufferaction.jar
mv target/obssuite_setreplaybufferaction-1.0.0.jar ../$FOLD/obssuite_setreplaybufferaction.jar
cd ../setstreaming && mvn clean package
cd ../setstreaming && mvn clean package
mv target/obssuite_setstreamingaction-1.0.0.jar ../$FOLD/obssuite_setstreamingaction.jar
mv target/obssuite_setstreamingaction-1.0.0.jar ../$FOLD/obssuite_setstreamingaction.jar
cd ../setstudiomode && mvn clean package
cd ../setstudiomode && mvn clean package
mv target/obssuite_setstudiomodeaction-1.0.0.jar ../$FOLD/obssuite_setstudiomodeaction.jar
mv target/obssuite_setstudiomodeaction-1.0.0.jar ../$FOLD/obssuite_setstudiomodeaction.jar
cd ../setvolume && mvn clean package
cd ../setvolume && mvn clean package
mv target/obssuite_setvolumeaction-1.0.0.jar ../$FOLD/obssuite_setvolumeaction.jar
mv target/obssuite_setvolumeaction-1.0.0.jar ../$FOLD/obssuite_setvolumeaction.jar
popd || exit
popd || exit
}
}
playaudioclip() {
playaudioclip() {
pushd . || exit
pushd . || exit
cd playaudioclipaction && mvn clean package
cd playaudioclipaction && mvn clean package
mv target/playaudioclipaction-1.0.0.jar $FOLD/playaudioclipaction.jar
mv target/playaudioclipaction-1.0.0.jar $FOLD/playaudioclipaction.jar
popd || exit
popd || exit
}
}
runcommand() {
runcommand() {
pushd . || exit
pushd . || exit
cd runcommandaction && mvn clean package
cd runcommandaction && mvn clean package
mv target/runcommandaction-1.0.0.jar $FOLD/runcommandaction.jar
mv target/runcommandaction-1.0.0.jar $FOLD/runcommandaction.jar
popd || exit
popd || exit
}
}
textblock() {
textblock() {
pushd . || exit
pushd . || exit
cd textblockaction && mvn clean package
cd textblockaction && mvn clean package
mv target/textblockaction-1.0.0.jar $FOLD/textblockaction.jar
mv target/textblockaction-1.0.0.jar $FOLD/textblockaction.jar
popd || exit
popd || exit
}
}
twitter() {
twitter() {
pushd . || exit
pushd . || exit
cd twitteraction && mvn clean package
cd twitteraction && mvn clean package
mv target/twitteraction-1.0.0.jar $FOLD/twitteraction.jar
mv target/twitteraction-1.0.0.jar $FOLD/twitteraction.jar
popd || exit
popd || exit
}
}
twitchchat() {
twitchchat() {
pushd . || exit
pushd . || exit
cd twitch/twitch-chat-connect && mvn clean install package
cd twitch/twitch-chat-connect && mvn clean install package
mv target/twitch-chat-connect-1.0.0.jar ../$FOLD/twitch-chat-connect.jar
mv target/twitch-chat-connect-1.0.0.jar ../$FOLD/twitch-chat-connect.jar
cd ../send-channel-msg && mvn clean package
cd ../send-channel-msg && mvn clean install package
mv target/twitch-send-channel-msg-1.0.0.jar ../$FOLD/twitch-send-channel-msg.jar
mv target/twitch-send-channel-msg-1.0.0.jar ../$FOLD/twitch-send-channel-msg.jar
cd ../clear-chat && mvn clean install package
mv target/twitch-clear-chat-1.0.0.jar ../$FOLD/twitch-clear-chat.jar
cd ../set-color && mvn clean install package
mv target/twitch-set-color-1.0.0.jar ../$FOLD/twitch-set-color.jar
cd ../whisper && mvn clean install package
mv target/twitch-whisper-1.0.0.jar ../$FOLD/twitch-whisper.jar
cd ../unraid && mvn clean install package
mv target/twitch-unraid-1.0.0.jar ../$FOLD/twitch-unraid.jar
cd ../unhost && mvn clean install package
mv target/twitch-unhost-1.0.0.jar ../$FOLD/twitch-unhost.jar
cd ../add-stream-marker && mvn clean install package
mv target/twitch-add-stream-marker-1.0.0.jar ../$FOLD/twitch-add-stream-marker.jar
cd ../host-channel && mvn clean install package
mv target/twitch-host-channel-1.0.0.jar ../$FOLD/twitch-host-channel.jar
cd ../raid-channel && mvn clean install package
mv target/twitch-raid-channel-1.0.0.jar ../$FOLD/twitch-raid-channel.jar
cd ../start-commercial && mvn clean install package
mv target/twitch-start-commercial-1.0.0.jar ../$FOLD/twitch-start-commercial.jar
popd || exit
popd || exit
}
}
websiteaction() {
websiteaction() {
pushd . || exit
pushd . || exit
cd websiteaction && mvn clean package
cd websiteaction && mvn clean package
mv target/websiteaction-1.0.0.jar $FOLD/websiteaction.jar
mv target/websiteaction-1.0.0.jar $FOLD/websiteaction.jar
popd || exit
popd || exit
}
}
case "$1" in
case "$1" in
hotkey)
hotkey)
hotkey
hotkey
;;
;;
mediakey)
mediakey)
mediakey
mediakey
;;
;;
playaudioclip)
playaudioclip)
playaudioclip
playaudioclip
;;
;;
runcommand)
runcommand)
runcommand
runcommand
;;
;;
textblock)
textblock)
textblock
textblock
;;
;;
twitter)
twitter)
twitter
twitter
;;
;;
website)
website)
website
website
;;
;;
obssuite)
obssuite)
obssuite
obssuite
;;
;;
twitchchat)
twitchchat)
twitchchat
twitchchat
;;
;;
*)
*)
# build all actions as default
# build all actions as default
hotkey
hotkey
mediakey
mediakey
obssuite
obssuite
playaudioclip
playaudioclip
runcommand
runcommand
textblock
textblock
twitter
twitter
twitchchat
twitchchat
website
website
;;
;;
esac
esac
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.stream-pi</groupId>
<artifactId>twitch-add-stream-marker</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<streamPiActionApiVersion>1.0.0</streamPiActionApiVersion>
<streamPiUtilVersion>1.0.0</streamPiUtilVersion>
<streamPiTwitchChatConnectVersion>1.0.0</streamPiTwitchChatConnectVersion>
<javaTwirkVersion>0.6.3</javaTwirkVersion>
</properties>
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>test-jar</id>
<phase>package</phase>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>util</artifactId>
<version>${streamPiUtilVersion}</version>
</dependency>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>action-api</artifactId>
<version>${streamPiActionApiVersion}</version>
</dependency>
<dependency>
<groupId>com.github.gikkman</groupId>
<artifactId>Java-Twirk</artifactId>
<version>${javaTwirkVersion}</version>
</dependency>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>twitch-chat-connect</artifactId>
<version>${streamPiTwitchChatConnectVersion}</version>
</dependency>
</dependencies>
</project>
package addstreammarker;
import com.gikk.twirk.Twirk;
import com.gikk.twirk.TwirkBuilder;
import com.stream_pi.action_api.actionproperty.property.Property;
import com.stream_pi.action_api.actionproperty.property.Type;
import com.stream_pi.action_api.normalaction.NormalAction;
import com.stream_pi.util.exception.StreamPiException;
import com.stream_pi.util.version.Version;
import connect.chat.TwitchChatCredentials;
public class AddStreamMarkerAction extends NormalAction
{
private final String channelNameKey = "channel_name_asm";
private final String descriptionKey = "description_asm";
private Twirk twirk;
public AddStreamMarkerAction()
{
setName("Add stream marker");
setCategory("Twitch Chat");
setVisibilityInServerSettingsPane(false);
setAuthor("j4ckofalltrades");
setVersion(new Version(1, 0, 0));
setHelpLink("https://github.com/stream-pi/essentialactions#twitch-chat-integration");
}
@Override
public void initProperties() throws Exception
{
Property channelName = new Property(channelNameKey, Type.STRING);
channelName.setDisplayName("Channel Name");
channelName.setDefaultValueStr("channel_name");
channelName.setCanBeBlank(false);
Property description = new Property(descriptionKey, Type.STRING);
description.setDisplayName("Description (Optional, max 140 chars)");
addClientProperties(channelName, description);
}
@Override
public void initAction() throws Exception
{
}
@Override
public void onActionClicked() throws Exception
{
final TwitchChatCredentials.ChatCredentials credentials = TwitchChatCredentials.getCredentials();
credentials.ensureCredentialsInitialized();
final String channel = getClientProperties().getSingleProperty(channelNameKey).getStringValue();
final String description = getClientProperties().getSingleProperty(descriptionKey).getStringValue();
try
{
twirk = new TwirkBuilder(channel, credentials.getNickname(), credentials.getOauthToken()).build();
twirk.connect();
if (description != null && !description.isEmpty()) {
twirk.channelMessage(String.format("/marker %s", description));
} else {
twirk.channelMessage("/marker");
}
} catch (Exception ex)
{
throw new StreamPiException(
"Failed to add marker to stream", "Could not add stream marker, please try again."
);
}
}
@Override
public void onShutDown() throws Exception
{
if (twirk != null) {
try
{
twirk.disconnect();
} catch (Exception ex) {
throw new StreamPiException("Twitch connection error", "Please try again.");
}
}
}
}
module com.stream_pi.twitch.addstreammarkeraction {
requires com.stream_pi.util;
requires com.stream_pi.action_api;
requires com.stream_pi.twitchchatconnectaction;
requires Java.Twirk;
provides com.stream_pi.action_api.normalaction.NormalAction with addstreammarker.AddStreamMarkerAction;
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.stream-pi</groupId>
<artifactId>twitch-clear-chat</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<streamPiActionApiVersion>1.0.0</streamPiActionApiVersion>
<streamPiUtilVersion>1.0.0</streamPiUtilVersion>
<streamPiTwitchChatConnectVersion>1.0.0</streamPiTwitchChatConnectVersion>
<javaTwirkVersion>0.6.3</javaTwirkVersion>
</properties>
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>test-jar</id>
<phase>package</phase>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>util</artifactId>
<version>${streamPiUtilVersion}</version>
</dependency>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>action-api</artifactId>
<version>${streamPiActionApiVersion}</version>
</dependency>
<dependency>
<groupId>com.github.gikkman</groupId>
<artifactId>Java-Twirk</artifactId>
<version>${javaTwirkVersion}</version>
</dependency>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>twitch-chat-connect</artifactId>
<version>${streamPiTwitchChatConnectVersion}</version>
</dependency>
</dependencies>
</project>
package clearchat;
import com.gikk.twirk.Twirk;
import com.gikk.twirk.TwirkBuilder;
import com.stream_pi.action_api.actionproperty.property.Property;
import com.stream_pi.action_api.actionproperty.property.Type;
import com.stream_pi.action_api.normalaction.NormalAction;
import com.stream_pi.util.exception.StreamPiException;
import com.stream_pi.util.version.Version;
import connect.chat.TwitchChatCredentials;
public class ClearChatAction extends NormalAction
{
private final String channelNameKey = "channel_name_cc";
private Twirk twirk;
@Override
public void initProperties() throws Exception
{
setName("Clear Chat");
setCategory("Twitch Chat");
setVisibilityInServerSettingsPane(false);
setAuthor("j4ckofalltrades");
setVersion(new Version(1, 0, 0));
setHelpLink("https://github.com/stream-pi/essentialactions#twitch-chat-integration");
}
@Override
public void initAction() throws Exception
{
Property channelName = new Property(channelNameKey, Type.STRING);
channelName.setDisplayName("Channel Name");
channelName.setDefaultValueStr("channel_name");
channelName.setCanBeBlank(false);
addClientProperties(channelName);
}
@Override
public void onActionClicked() throws Exception
{
final TwitchChatCredentials.ChatCredentials credentials = TwitchChatCredentials.getCredentials();
credentials.ensureCredentialsInitialized();
final String channel = getClientProperties().getSingleProperty(channelNameKey).getStringValue();
try
{
twirk = new TwirkBuilder(channel, credentials.getNickname(), credentials.getOauthToken()).build();
twirk.connect();
twirk.channelMessage("/clear");
} catch (Exception ex)
{
throw new StreamPiException(
"Failed to clear channel chat",
String.format("Could not clear chat for '%s' channel, please try again.", channel)
);
}
}
@Override
public void onShutDown() throws Exception
{
if (twirk != null) {
try
{
twirk.disconnect();
} catch (Exception ex) {
throw new StreamPiException("Twitch Connection error", "Please try again.");
}
}
}
}
module com.stream_pi.twitch.clearchataction {
requires com.stream_pi.util;
requires com.stream_pi.action_api;
requires com.stream_pi.twitchchatconnectaction;
requires Java.Twirk;
provides com.stream_pi.action_api.normalaction.NormalAction with clearchat.ClearChatAction;
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.stream-pi</groupId>
<artifactId>twitch-host-channel</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<streamPiActionApiVersion>1.0.0</streamPiActionApiVersion>
<streamPiUtilVersion>1.0.0</streamPiUtilVersion>
<streamPiTwitchChatConnectVersion>1.0.0</streamPiTwitchChatConnectVersion>
<javaTwirkVersion>0.6.3</javaTwirkVersion>
</properties>
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>test-jar</id>
<phase>package</phase>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>util</artifactId>
<version>${streamPiUtilVersion}</version>
</dependency>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>action-api</artifactId>
<version>${streamPiActionApiVersion}</version>
</dependency>
<dependency>
<groupId>com.github.gikkman</groupId>
<artifactId>Java-Twirk</artifactId>
<version>${javaTwirkVersion}</version>
</dependency>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>twitch-chat-connect</artifactId>
<version>${streamPiTwitchChatConnectVersion}</version>
</dependency>
</dependencies>
</project>
package hostchannel;
import com.gikk.twirk.Twirk;
import com.gikk.twirk.TwirkBuilder;
import com.stream_pi.action_api.actionproperty.property.Property;
import com.stream_pi.action_api.actionproperty.property.Type;
import com.stream_pi.action_api.normalaction.NormalAction;
import com.stream_pi.util.exception.StreamPiException;
import com.stream_pi.util.version.Version;
import connect.chat.TwitchChatCredentials;
public class HostChannelAction extends NormalAction
{
private final String channelKey = "channel_hc";
private final String channelToHostKey = "channel_to_host_hc";
private Twirk twirk;
public HostChannelAction()
{
setName("Host Channel");
setCategory("Twitch Chat");
setVisibilityInServerSettingsPane(false);
setAuthor("j4ckofalltrades");
setVersion(new Version(1, 0, 0));
setHelpLink("https://github.com/stream-pi/essentialactions#twitch-chat-integration");
}
@Override
public void initProperties() throws Exception
{
Property channel = new Property(channelKey, Type.STRING);
channel.setDisplayName("Channel");
channel.setDefaultValueStr("channel");
channel.setCanBeBlank(false);
Property channelToHost = new Property(channelToHostKey, Type.STRING);
channelToHost.setDisplayName("Channel to host");
channelToHost.setDefaultValueStr("channel_to_host");
channelToHost.setCanBeBlank(false);
addClientProperties(channel, channelToHost);
}
@Override
public void initAction() throws Exception
{
}
@Override
public void onActionClicked() throws Exception
{
final TwitchChatCredentials.ChatCredentials credentials = TwitchChatCredentials.getCredentials();
credentials.ensureCredentialsInitialized();
final String channel = getClientProperties().getSingleProperty(channelKey).getStringValue();
final String channelToHost = getClientProperties().getSingleProperty(channelToHostKey).getStringValue();
try
{
twirk = new TwirkBuilder(channel, credentials.getNickname(), credentials.getOauthToken()).build();
twirk.connect();
twirk.channelMessage(String.format("/host %s", channelToHost));
} catch (Exception ex)
{
throw new StreamPiException(
"Failed to host channel",
String.format("Could not host channel '%s', please try again.", channelToHost));
}
}
@Override
public void onShutDown() throws Exception
{
if (twirk != null) {
try
{
twirk.disconnect();
} catch (Exception ex) {
throw new StreamPiException("Twitch connection error", "Please try again.");
}
}
}
}
module com.stream_pi.twitch.hostchannelaction {
requires com.stream_pi.util;
requires com.stream_pi.action_api;
requires com.stream_pi.twitchchatconnectaction;
requires Java.Twirk;
provides com.stream_pi.action_api.normalaction.NormalAction with hostchannel.HostChannelAction;
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.stream-pi</groupId>
<artifactId>twitch-raid-channel</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<streamPiActionApiVersion>1.0.0</streamPiActionApiVersion>
<streamPiUtilVersion>1.0.0</streamPiUtilVersion>
<streamPiTwitchChatConnectVersion>1.0.0</streamPiTwitchChatConnectVersion>
<javaTwirkVersion>0.6.3</javaTwirkVersion>
</properties>
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>test-jar</id>
<phase>package</phase>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>util</artifactId>
<version>${streamPiUtilVersion}</version>
</dependency>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>action-api</artifactId>
<version>${streamPiActionApiVersion}</version>
</dependency>
<dependency>
<groupId>com.github.gikkman</groupId>
<artifactId>Java-Twirk</artifactId>
<version>${javaTwirkVersion}</version>
</dependency>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>twitch-chat-connect</artifactId>
<version>${streamPiTwitchChatConnectVersion}</version>
</dependency>
</dependencies>
</project>
module com.stream_pi.twitch.raidchannelaction {
requires com.stream_pi.util;
requires com.stream_pi.action_api;
requires com.stream_pi.twitchchatconnectaction;
requires Java.Twirk;
provides com.stream_pi.action_api.normalaction.NormalAction with raidchannel.RaidChannelAction;
}
package raidchannel;
import com.gikk.twirk.Twirk;
import com.gikk.twirk.TwirkBuilder;
import com.stream_pi.action_api.actionproperty.property.Property;
import com.stream_pi.action_api.actionproperty.property.Type;
import com.stream_pi.action_api.normalaction.NormalAction;
import com.stream_pi.util.exception.StreamPiException;
import com.stream_pi.util.version.Version;
import connect.chat.TwitchChatCredentials;
public class RaidChannelAction extends NormalAction
{
private final String channelKey = "channel_rc";
private final String channelToRaidKey = "channel_to_raid_rc";
private Twirk twirk;
public RaidChannelAction()
{
setName("Raid Channel");
setCategory("Twitch Chat");
setVisibilityInServerSettingsPane(false);
setAuthor("j4ckofalltrades");
setVersion(new Version(1, 0, 0));
setHelpLink("https://github.com/stream-pi/essentialactions#twitch-chat-integration");
}
@Override
public void initProperties() throws Exception
{
Property channel = new Property(channelKey, Type.STRING);
channel.setDisplayName("Channel");
channel.setDefaultValueStr("channel");
channel.setCanBeBlank(false);
Property channelToRaid = new Property(channelToRaidKey, Type.STRING);
channelToRaid.setDisplayName("Channel to raid");
channelToRaid.setDefaultValueStr("channel_to_raid");
channelToRaid.setCanBeBlank(false);
addClientProperties(channel, channelToRaid);
}
@Override
public void initAction() throws Exception
{
}
@Override
public void onActionClicked() throws Exception
{
final TwitchChatCredentials.ChatCredentials credentials = TwitchChatCredentials.getCredentials();
credentials.ensureCredentialsInitialized();
final String channel = getClientProperties().getSingleProperty(channelKey).getStringValue();
final String channelToRaid = getClientProperties().getSingleProperty(channelToRaidKey).getStringValue();
try
{
twirk = new TwirkBuilder(channel, credentials.getNickname(), credentials.getOauthToken()).build();
twirk.connect();
twirk.channelMessage(String.format("/raid %s", channelToRaid));
} catch (Exception ex)
{
throw new StreamPiException(
"Failed to raid channel",
String.format("Could not raid channel '%s', please try again.", channelToRaid));
}
}
@Override
public void onShutDown() throws Exception
{
if (twirk != null) {
try
{
twirk.disconnect();
} catch (Exception ex) {
throw new StreamPiException("Twitch connection error", "Please try again.");
}
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<modelVersion>4.0.0</modelVersion>
<groupId>com.stream-pi</groupId>
<groupId>com.stream-pi</groupId>
<artifactId>twitch-send-channel-msg</artifactId>
<artifactId>twitch-send-channel-msg</artifactId>
<version>1.0.0</version>
<version>1.0.0</version>
<properties>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.target>11</maven.compiler.target>
<streamPiActionApiVersion>1.0.0-SNAPSHOT</streamPiActionApiVersion>
<streamPiActionApiVersion>1.0.0</streamPiActionApiVersion>
<streamPiUtilVersion>1.0.0-SNAPSHOT</streamPiUtilVersion>
<streamPiUtilVersion>1.0.0</streamPiUtilVersion>
<streamPiTwitchChatConnectVersion>1.0.0</streamPiTwitchChatConnectVersion>
<streamPiTwitchChatConnectVersion>1.0.0</streamPiTwitchChatConnectVersion>
<javaTwirkVersion>0.6.3</javaTwirkVersion>
<javaTwirkVersion>0.6.3</javaTwirkVersion>
</properties>
</properties>
<repositories>
<repositories>
<repository>
<repository>
<id>jitpack.io</id>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
<url>https://jitpack.io</url>
</repository>
</repository>
</repositories>
</repositories>
<build>
<build>
<plugins>
<plugins>
<plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<version>3.1.0</version>
<executions>
<executions>
<execution>
<execution>
<id>test-jar</id>
<id>test-jar</id>
<phase>package</phase>
<phase>package</phase>
<goals>
<goals>
<goal>test-jar</goal>
<goal>test-jar</goal>
</goals>
</goals>
</execution>
</execution>
</executions>
</executions>
</plugin>
</plugin>
<plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<version>3.8.1</version>
<configuration>
<configuration>
<release>11</release>
<release>11</release>
</configuration>
</configuration>
</plugin>
</plugin>
</plugins>
</plugins>
</build>
</build>
<dependencies>
<dependencies>
<dependency>
<dependency>
<groupId>com.stream-pi</groupId>
<groupId>com.stream-pi</groupId>
<artifactId>util</artifactId>
<artifactId>util</artifactId>
<version>${streamPiUtilVersion}</version>
<version>${streamPiUtilVersion}</version>
</dependency>
</dependency>
<dependency>
<dependency>
<groupId>com.stream-pi</groupId>
<groupId>com.stream-pi</groupId>
<artifactId>action-api</artifactId>
<artifactId>action-api</artifactId>
<version>${streamPiActionApiVersion}</version>
<version>${streamPiActionApiVersion}</version>
</dependency>
</dependency>
<dependency>
<dependency>
<groupId>com.github.gikkman</groupId>
<groupId>com.github.gikkman</groupId>
<artifactId>Java-Twirk</artifactId>
<artifactId>Java-Twirk</artifactId>
<version>${javaTwirkVersion}</version>
<version>${javaTwirkVersion}</version>
</dependency>
</dependency>
<dependency>
<dependency>
<groupId>com.stream-pi</groupId>
<groupId>com.stream-pi</groupId>
<artifactId>twitch-chat-connect</artifactId>
<artifactId>twitch-chat-connect</artifactId>
<version>${streamPiTwitchChatConnectVersion}</version>
<version>${streamPiTwitchChatConnectVersion}</version>
</dependency>
</dependency>
</dependencies>
</dependencies>
</project>
</project>
module com.stream_pi.twitch.sendchannelmsgaction {
module com.stream_pi.twitch.sendchannelmsgaction {
requires com.stream_pi.util;
requires com.stream_pi.util;
requires com.stream_pi.action_api;
requires com.stream_pi.action_api;
requires com.stream_pi.twitchchatconnectaction;
requires com.stream_pi.twitchchatconnectaction;
requires Java.Twirk;
requires Java.Twirk;
provides com.stream_pi.action_api.normalaction.NormalAction with sendchannelmsg.SendChannelMessageAction;
provides com.stream_pi.action_api.normalaction.NormalAction with sendchannelmsg.SendChannelMessageAction;
}
}
package sendchannelmsg;
package sendchannelmsg;
import com.gikk.twirk.Twirk;
import com.gikk.twirk.Twirk;
import com.gikk.twirk.TwirkBuilder;
import com.gikk.twirk.TwirkBuilder;
import com.stream_pi.action_api.actionproperty.property.Property;
import com.stream_pi.action_api.actionproperty.property.Property;
import com.stream_pi.action_api.actionproperty.property.Type;
import com.stream_pi.action_api.actionproperty.property.Type;
import com.stream_pi.action_api.normalaction.NormalAction;
import com.stream_pi.action_api.normalaction.NormalAction;
import com.stream_pi.util.exception.StreamPiException;
import com.stream_pi.util.exception.StreamPiException;
import com.stream_pi.util.version.Version;
import com.stream_pi.util.version.Version;
import connect.chat.TwitchChatCredentials;
import connect.chat.TwitchChatCredentials;
import static connect.chat.TwitchChatCredentials.DEFAULT_TWITCH_NICKNAME;
import static connect.chat.TwitchChatCredentials.DEFAULT_TWITCH_TOKEN;
public class SendChannelMessageAction extends NormalAction
public class SendChannelMessageAction extends NormalAction
{
{
private static final String TWITCH_CHANNEL_NAME_KEY = "twitch_channel_name";
private final String channelNameKey = "channel_name_scm";
private static final String TWITCH_CHANNEL_MSG_KEY = "twitch_channel_msg";
private final String channelMsgKey = "channel_msg_scm";
private Twirk twirk;
private Twirk twirk;
public SendChannelMessageAction()
public SendChannelMessageAction()
{
{
setName("Send Channel Message");
setName("Send Channel Message");
setCategory("Twitch Chat");
setCategory("Twitch Chat");
setVisibilityInServerSettingsPane(false);
setVisibilityInServerSettingsPane(false);
setAuthor("j4ckofalltrades");
setAuthor("j4ckofalltrades");
setVersion(new Version(1, 0, 0));
setVersion(new Version(1, 0, 0));
setHelpLink("https://github.com/stream-pi/essentialactions");
setHelpLink("https://github.com/stream-pi/essentialactions#twitch-chat-integration");
}
}
@Override
@Override
public void initProperties() throws Exception
public void initProperties() throws Exception
{
{
Property channelName = new Property(TWITCH_CHANNEL_NAME_KEY, Type.STRING);
Property channelName = new Property(channelNameKey, Type.STRING);
channelName.setDisplayName("Channel Name");
channelName.setDisplayName("Channel Name");
channelName.setDefaultValueStr("channel_name");
channelName.setDefaultValueStr("channel_name");
channelName.setCanBeBlank(false);
channelName.setCanBeBlank(false);
Property channelMessage = new Property(TWITCH_CHANNEL_MSG_KEY, Type.STRING);
Property channelMessage = new Property(channelMsgKey, Type.STRING);
channelMessage.setDisplayName("Message");
channelMessage.setDisplayName("Message");
channelMessage.setDefaultValueStr("channel_msg");
channelMessage.setDefaultValueStr("channel_msg");
channelMessage.setCanBeBlank(false);
channelMessage.setCanBeBlank(false);
addClientProperties(channelName, channelMessage);
addClientProperties(channelName, channelMessage);
}
}
@Override
@Override
public void initAction() throws Exception
public void initAction() throws Exception
{
{
}
}
@Override
@Override
public void onActionClicked() throws Exception
public void onActionClicked() throws Exception
{
{
TwitchChatCredentials.ChatCredentials credentials = TwitchChatCredentials.getCredentials();
final TwitchChatCredentials.ChatCredentials credentials = TwitchChatCredentials.getCredentials();
if (!isChatCredentialsInitialized(credentials))
credentials.ensureCredentialsInitialized();
{
throw new StreamPiException("Twitch Chat uninitialized.","Please check that the Twitch Chat plugin configuration is correct.");
}
final String channel = getClientProperties().getSingleProperty(TWITCH_CHANNEL_NAME_KEY).getStringValue();
final String channel = getClientProperties().getSingleProperty(channelNameKey).getStringValue();
final String message = getClientProperties().getSingleProperty(TWITCH_CHANNEL_MSG_KEY).getStringValue();
final String message = getClientProperties().getSingleProperty(channelMsgKey).getStringValue();
try
try
{
{
twirk = new TwirkBuilder(
twirk = new TwirkBuilder(channel, credentials.getNickname(), credentials.getOauthToken()).build();
getClientProperties().getSingleProperty(TWITCH_CHANNEL_NAME_KEY).getStringValue(),
credentials.getNickname(),
credentials.getOauthToken())
.build();
twirk.connect();
twirk.connect();
twirk.channelMessage(message);
twirk.channelMessage(message);
} catch (Exception ex)
} catch (Exception ex)
{
{
throw new StreamPiException(
throw new StreamPiException(
"Failed to send channel message",
"Failed to send channel message",
String.format("Could not send message '%s' to '%s' channel, please try again.",
String.format("Could not send message '%s' to '%s' channel, please try again.",
channel, message)
channel, message)
);
);
}
}
}
}
private boolean isChatCredentialsInitialized(TwitchChatCredentials.ChatCredentials credentials)
{
if (credentials == null)
{
return false;
}
final String twitchNickname = credentials.getNickname();
boolean isNicknameInitialized = twitchNickname != null &&
!twitchNickname.isEmpty() &&
!twitchNickname.equalsIgnoreCase(DEFAULT_TWITCH_NICKNAME);
final String twitchChatOauthToken = credentials.getOauthToken();
boolean isTokenInitialized = twitchChatOauthToken != null &&
!twitchChatOauthToken.isEmpty() &&
!twitchChatOauthToken.equalsIgnoreCase(DEFAULT_TWITCH_TOKEN);
return isNicknameInitialized && isTokenInitialized;
}
@Override
@Override
public void onShutDown() throws Exception
public void onShutDown() throws Exception
{
{
twirk.close();
if (twirk != null) {
try
{
twirk.disconnect();
} catch (Exception ex) {
throw new StreamPiException("Twitch connection error", "Please try again.");
}
}
}
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.stream-pi</groupId>
<artifactId>twitch-set-color</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<streamPiActionApiVersion>1.0.0</streamPiActionApiVersion>
<streamPiUtilVersion>1.0.0</streamPiUtilVersion>
<streamPiTwitchChatConnectVersion>1.0.0</streamPiTwitchChatConnectVersion>
<javaTwirkVersion>0.6.3</javaTwirkVersion>
</properties>
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>test-jar</id>
<phase>package</phase>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>util</artifactId>
<version>${streamPiUtilVersion}</version>
</dependency>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>action-api</artifactId>
<version>${streamPiActionApiVersion}</version>
</dependency>
<dependency>
<groupId>com.github.gikkman</groupId>
<artifactId>Java-Twirk</artifactId>
<version>${javaTwirkVersion}</version>
</dependency>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>twitch-chat-connect</artifactId>
<version>${streamPiTwitchChatConnectVersion}</version>
</dependency>
</dependencies>
</project>
module com.stream_pi.twitch.setcoloraction {
requires com.stream_pi.util;
requires com.stream_pi.action_api;
requires com.stream_pi.twitchchatconnectaction;
requires Java.Twirk;
provides com.stream_pi.action_api.normalaction.NormalAction with setcolor.SetColorAction;
}
package setcolor;
import com.gikk.twirk.Twirk;
import com.gikk.twirk.TwirkBuilder;
import com.stream_pi.action_api.actionproperty.property.Property;
import com.stream_pi.action_api.actionproperty.property.Type;
import com.stream_pi.action_api.normalaction.NormalAction;
import com.stream_pi.util.exception.StreamPiException;
import com.stream_pi.util.version.Version;
import connect.chat.TwitchChatCredentials;
public class SetColorAction extends NormalAction
{
private final String channelNameKey = "channel_name_sc";
private final String usernameColorKey = "username_color_sc";
private Twirk twirk;
@Override
public void initProperties() throws Exception
{
setName("Set Color");
setCategory("Twitch Chat");
setVisibilityInServerSettingsPane(false);
setAuthor("j4ckofalltrades");
setVersion(new Version(1, 0, 0));
setHelpLink("https://github.com/stream-pi/essentialactions#twitch-chat-integration");
}
@Override
public void initAction() throws Exception
{
Property channelName = new Property(channelNameKey, Type.STRING);
channelName.setDisplayName("Channel Name");
channelName.setDefaultValueStr("channel_name");
channelName.setCanBeBlank(false);
Property usernameColor = new Property(usernameColorKey, Type.STRING);
usernameColor.setDisplayName("Color");
usernameColor.setDefaultValueStr("color");
usernameColor.setCanBeBlank(false);
addClientProperties(channelName, usernameColor);
}
@Override
public void onActionClicked() throws Exception
{
final TwitchChatCredentials.ChatCredentials credentials = TwitchChatCredentials.getCredentials();
credentials.ensureCredentialsInitialized();
final String channel = getClientProperties().getSingleProperty(channelNameKey).getStringValue();
final String color = getClientProperties().getSingleProperty(usernameColorKey).getStringValue();
try
{
twirk = new TwirkBuilder(channel, credentials.getNickname(), credentials.getOauthToken()).build();
twirk.connect();
twirk.channelMessage(String.format("/color %s", color));
} catch (Exception ex)
{
throw new StreamPiException(
"Failed to change username color",
String.format("Could not change username color to '%s' for '%s' channel, please try again.",
color, channel)
);
}
}
@Override
public void onShutDown() throws Exception
{
if (twirk != null) {
try
{
twirk.disconnect();
} catch (Exception ex) {
throw new StreamPiException("Twitch connection error", "Please try again.");
}
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.stream-pi</groupId>
<artifactId>twitch-start-commercial</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<streamPiActionApiVersion>1.0.0</streamPiActionApiVersion>
<streamPiUtilVersion>1.0.0</streamPiUtilVersion>
<streamPiTwitchChatConnectVersion>1.0.0</streamPiTwitchChatConnectVersion>
<javaTwirkVersion>0.6.3</javaTwirkVersion>
</properties>
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>test-jar</id>
<phase>package</phase>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>util</artifactId>
<version>${streamPiUtilVersion}</version>
</dependency>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>action-api</artifactId>
<version>${streamPiActionApiVersion}</version>
</dependency>
<dependency>
<groupId>com.github.gikkman</groupId>
<artifactId>Java-Twirk</artifactId>
<version>${javaTwirkVersion}</version>
</dependency>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>twitch-chat-connect</artifactId>
<version>${streamPiTwitchChatConnectVersion}</version>
</dependency>
</dependencies>
</project>
module com.stream_pi.twitch.startcommercialaction {
requires com.stream_pi.util;
requires com.stream_pi.action_api;
requires com.stream_pi.twitchchatconnectaction;
requires Java.Twirk;
provides com.stream_pi.action_api.normalaction.NormalAction with startcommercial.StartCommercialAction;
}
package startcommercial;
import com.gikk.twirk.Twirk;
import com.gikk.twirk.TwirkBuilder;
import com.stream_pi.action_api.actionproperty.property.Property;
import com.stream_pi.action_api.actionproperty.property.Type;
import com.stream_pi.action_api.normalaction.NormalAction;
import com.stream_pi.util.exception.StreamPiException;
import com.stream_pi.util.version.Version;
import connect.chat.TwitchChatCredentials;
import java.util.List;
public class StartCommercialAction extends NormalAction
{
private final String channelNameKey = "channel_name_sca";
private final String durationKey = "duration_sca";
private Twirk twirk;
public StartCommercialAction()
{
setName("Start commercial");
setCategory("Twitch Chat");
setVisibilityInServerSettingsPane(false);
setAuthor("j4ckofalltrades");
setVersion(new Version(1, 0, 0));
setHelpLink("https://github.com/stream-pi/essentialactions#twitch-chat-integration");
}
@Override
public void initProperties() throws Exception
{
Property channelName = new Property(channelNameKey, Type.STRING);
channelName.setDisplayName("Channel Name");
channelName.setDefaultValueStr("channel_name");
channelName.setCanBeBlank(false);
Property duration = new Property(durationKey, Type.LIST);
duration.setDisplayName("Duration");
duration.setListValue(List.of(
String.valueOf(30),
String.valueOf(60),
String.valueOf(90),
String.valueOf(120),
String.valueOf(150),
String.valueOf(180)));
addClientProperties(channelName, duration);
}
@Override
public void initAction() throws Exception
{
}
@Override
public void onActionClicked() throws Exception
{
final TwitchChatCredentials.ChatCredentials credentials = TwitchChatCredentials.getCredentials();
credentials.ensureCredentialsInitialized();
final String channel = getClientProperties().getSingleProperty(channelNameKey).getStringValue();
final String duration = getClientProperties().getSingleProperty(durationKey).getStringValue();
try
{
twirk = new TwirkBuilder(channel, credentials.getNickname(), credentials.getOauthToken()).build();
twirk.connect();
twirk.channelMessage(String.format("/commercial %s", duration));
} catch (Exception ex)
{
throw new StreamPiException(
"Failed to start commercial", "Could not start commercial, please try again.");
}
}
@Override
public void onShutDown() throws Exception
{
if (twirk != null) {
try
{
twirk.disconnect();
} catch (Exception ex) {
throw new StreamPiException("Twitch connection error", "Please try again.");
}
}
}
}
package connect;
package connect;
import com.stream_pi.action_api.actionproperty.property.Property;
import com.stream_pi.action_api.actionproperty.property.Property;
import com.stream_pi.action_api.actionproperty.property.Type;
import com.stream_pi.action_api.actionproperty.property.Type;
import com.stream_pi.action_api.normalaction.NormalAction;
import com.stream_pi.action_api.normalaction.NormalAction;
import com.stream_pi.util.alert.StreamPiAlert;
import com.stream_pi.util.alert.StreamPiAlert;
import com.stream_pi.util.alert.StreamPiAlertType;
import com.stream_pi.util.alert.StreamPiAlertType;
import com.stream_pi.util.exception.MinorException;
import com.stream_pi.util.exception.MinorException;
import com.stream_pi.util.version.Version;
import com.stream_pi.util.version.Version;
import connect.chat.TwitchChatCredentials;
import connect.chat.TwitchChatCredentials;
import javafx.scene.control.Button;
import javafx.scene.control.Button;
public class TwitchChatConnectAction extends NormalAction
public class TwitchChatConnectAction extends NormalAction
{
{
private static final String TWITCH_ACCESS_TOKEN_KEY = "twitch_access_token";
private static final String ACCESS_TOKEN_KEY = "twitch_chat_access_token";
private static final String TWITCH_NICKNAME_KEY = "twitch_nickname";
private static final String NICKNAME_KEY = "twitch_chat_nickname";
private final Button clearCredentialsBtn;
private final Button clearCredentialsBtn;
public TwitchChatConnectAction()
public TwitchChatConnectAction()
{
{
setName("Twitch Chat Plugin");
setName("Twitch Chat Plugin");
setCategory("Twitch Chat");
setCategory("Twitch Chat");
setVisibilityInPluginsPane(false);
setVisibilityInPluginsPane(false);
setAuthor("j4ckofalltrades");
setAuthor("j4ckofalltrades");
setVersion(new Version(1, 0, 0));
setVersion(new Version(1, 0, 0));
setHelpLink("https://github.com/Stream-Pi/essentialactions");
setHelpLink("https://github.com/stream-pi/essentialactions#twitch-chat-integration");
clearCredentialsBtn = new Button("Clear Twitch chat credentials");
clearCredentialsBtn = new Button("Clear Twitch chat credentials");
onClearCredentials();
onClearCredentials();
setButtonBar(clearCredentialsBtn);
setButtonBar(clearCredentialsBtn);
}
}
@Override
@Override
public void initProperties()
public void initProperties()
{
{
Property twitchNicknameProp = new Property(TWITCH_NICKNAME_KEY, Type.STRING);
Property twitchNicknameProp = new Property(NICKNAME_KEY, Type.STRING);
twitchNicknameProp.setDisplayName("Twitch Username");
twitchNicknameProp.setDisplayName("Twitch Username");
Property twitchAccessTokenProp = new Property(TWITCH_ACCESS_TOKEN_KEY, Type.STRING);
Property twitchAccessTokenProp = new Property(ACCESS_TOKEN_KEY, Type.STRING);
twitchAccessTokenProp.setDisplayName("Access Token");
twitchAccessTokenProp.setDisplayName("Access Token");
addServerProperties(twitchNicknameProp, twitchAccessTokenProp);
addServerProperties(twitchNicknameProp, twitchAccessTokenProp);
}
}
@Override
@Override
public void initAction() throws MinorException
public void initAction() throws MinorException
{
{
clearCredentialsBtn.setDisable(isEmptyCredentials());
clearCredentialsBtn.setDisable(isEmptyCredentials());
TwitchChatCredentials.setCredentials(
TwitchChatCredentials.setCredentials(
new TwitchChatCredentials.ChatCredentials()
new TwitchChatCredentials.ChatCredentials()
.setOauthToken(getServerProperties().getSingleProperty(TWITCH_ACCESS_TOKEN_KEY).getStringValue())
.setOauthToken(getServerProperties().getSingleProperty(ACCESS_TOKEN_KEY).getStringValue())
.setNickname(getServerProperties().getSingleProperty(TWITCH_NICKNAME_KEY).getStringValue()));
.setNickname(getServerProperties().getSingleProperty(NICKNAME_KEY).getStringValue()));
}
}
private boolean isEmptyCredentials() throws MinorException {
private boolean isEmptyCredentials() throws MinorException {
final String twitchNickname = getServerProperties().getSingleProperty(TWITCH_NICKNAME_KEY).getStringValue();
final String twitchNickname = getServerProperties().getSingleProperty(NICKNAME_KEY).getStringValue();
final String twitchChatOauthToken = getServerProperties().getSingleProperty(TWITCH_ACCESS_TOKEN_KEY).getStringValue();
final String twitchChatOauthToken = getServerProperties().getSingleProperty(ACCESS_TOKEN_KEY).getStringValue();
return (twitchNickname == null || twitchNickname.isEmpty()) &&
return (twitchNickname == null || twitchNickname.isEmpty()) &&
(twitchChatOauthToken == null || twitchChatOauthToken.isEmpty());
(twitchChatOauthToken == null || twitchChatOauthToken.isEmpty());
}
}
private void onClearCredentials()
private void onClearCredentials()
{
{
clearCredentialsBtn.setOnAction(action ->
clearCredentialsBtn.setOnAction(action ->
{
{
try
try
{
{
getServerProperties().getSingleProperty(TWITCH_ACCESS_TOKEN_KEY).setStringValue("");
getServerProperties().getSingleProperty(ACCESS_TOKEN_KEY).setStringValue("");
getServerProperties().getSingleProperty(TWITCH_NICKNAME_KEY).setStringValue("");
getServerProperties().getSingleProperty(NICKNAME_KEY).setStringValue("");
saveServerProperties();
saveServerProperties();
new StreamPiAlert(
new StreamPiAlert(
"Twitch chat credentials cleared",
"Twitch chat credentials cleared",
"To revoke token access, disconnect \"Twitch Chat OAuth Token Generator\" from your Twitch settings (https://www.twitch.tv/settings/connections).",
"To revoke token access, disconnect \"Twitch Chat OAuth Token Generator\" from your Twitch settings (https://www.twitch.tv/settings/connections).",
StreamPiAlertType.INFORMATION)
StreamPiAlertType.INFORMATION)
.show();
.show();
} catch (Exception e)
} catch (Exception e)
{
{
new StreamPiAlert(
new StreamPiAlert(
"Failed to save chat credentials",
"Failed to save chat credentials",
"An error has occurred while clearing chat credentials, please try again.",
"An error has occurred while clearing chat credentials, please try again.",
StreamPiAlertType.WARNING)
StreamPiAlertType.WARNING)
.show();
.show();
}
}
});
});
}
}
@Override
@Override
public void onActionClicked() throws Exception
public void onActionClicked() throws Exception
{
{
}
}
@Override
@Override
public void onShutDown() throws Exception
public void onShutDown() throws Exception
{
{
}
}
}
}
package connect.chat;
package connect.chat;
import com.stream_pi.util.exception.StreamPiException;
public final class TwitchChatCredentials
public final class TwitchChatCredentials
{
{
public static final String DEFAULT_TWITCH_NICKNAME = "twitch_username";
public static final String DEFAULT_TWITCH_TOKEN = "twitch_token";
private static ChatCredentials credentials;
private static ChatCredentials credentials;
public static ChatCredentials getCredentials()
public static ChatCredentials getCredentials()
{
{
return credentials;
return credentials;
}
}
public static void setCredentials(ChatCredentials chatCredentials)
public static void setCredentials(ChatCredentials chatCredentials)
{
{
credentials = chatCredentials;
credentials = chatCredentials;
}
}
public static class ChatCredentials
public static class ChatCredentials
{
{
String nickname;
String nickname;
String oauthToken;
String oauthToken;
public void ensureCredentialsInitialized() throws Exception {
final String twitchNickname = nickname;
boolean isNicknameInitialized = twitchNickname != null && !twitchNickname.isEmpty();
final String twitchChatOauthToken = oauthToken;
boolean isTokenInitialized = twitchChatOauthToken != null && !twitchChatOauthToken.isEmpty();
if (!isNicknameInitialized && !isTokenInitialized) {
throw new StreamPiException(
"Twitch Chat config uninitialized.",
"Please check that the Twitch Chat plugin configuration is correct.");
}
}
public String getNickname()
public String getNickname()
{
{
return nickname;
return nickname;
}
}
public ChatCredentials setNickname(String nickname)
public ChatCredentials setNickname(String nickname)
{
{
this.nickname = nickname;
this.nickname = nickname;
return this;
return this;
}
}
public String getOauthToken()
public String getOauthToken()
{
{
return oauthToken;
return oauthToken;
}
}
public ChatCredentials setOauthToken(String oauthToken)
public ChatCredentials setOauthToken(String oauthToken)
{
{
this.oauthToken = oauthToken;
this.oauthToken = oauthToken;
return this;
return this;
}
}
}
}
}
}
module com.stream_pi.twitchchatconnectaction {
module com.stream_pi.twitchchatconnectaction {
requires com.stream_pi.action_api;
requires com.stream_pi.action_api;
requires com.stream_pi.util;
requires com.stream_pi.util;
requires Java.Twirk;
requires Java.Twirk;
exports connect.chat;
exports connect.chat;
provides com.stream_pi.action_api.normalaction.NormalAction with connect.TwitchChatConnectAction;
provides com.stream_pi.action_api.normalaction.NormalAction with connect.TwitchChatConnectAction;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.stream-pi</groupId>
<artifactId>twitch-unhost</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<streamPiActionApiVersion>1.0.0</streamPiActionApiVersion>
<streamPiUtilVersion>1.0.0</streamPiUtilVersion>
<streamPiTwitchChatConnectVersion>1.0.0</streamPiTwitchChatConnectVersion>
<javaTwirkVersion>0.6.3</javaTwirkVersion>
</properties>
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>test-jar</id>
<phase>package</phase>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>util</artifactId>
<version>${streamPiUtilVersion}</version>
</dependency>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>action-api</artifactId>
<version>${streamPiActionApiVersion}</version>
</dependency>
<dependency>
<groupId>com.github.gikkman</groupId>
<artifactId>Java-Twirk</artifactId>
<version>${javaTwirkVersion}</version>
</dependency>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>twitch-chat-connect</artifactId>
<version>${streamPiTwitchChatConnectVersion}</version>
</dependency>
</dependencies>
</project>
module com.stream_pi.twitch.unhostaction {
requires com.stream_pi.util;
requires com.stream_pi.action_api;
requires com.stream_pi.twitchchatconnectaction;
requires Java.Twirk;
provides com.stream_pi.action_api.normalaction.NormalAction with unhost.UnhostAction;
}
package unhost;
import com.gikk.twirk.Twirk;
import com.gikk.twirk.TwirkBuilder;
import com.stream_pi.action_api.actionproperty.property.Property;
import com.stream_pi.action_api.actionproperty.property.Type;
import com.stream_pi.action_api.normalaction.NormalAction;
import com.stream_pi.util.exception.StreamPiException;
import com.stream_pi.util.version.Version;
import connect.chat.TwitchChatCredentials;
public class UnhostAction extends NormalAction
{
private final String channelNameKey = "channel_name_uh";
private Twirk twirk;
public UnhostAction()
{
setName("Unhost");
setCategory("Twitch Chat");
setVisibilityInServerSettingsPane(false);
setAuthor("j4ckofalltrades");
setVersion(new Version(1, 0, 0));
setHelpLink("https://github.com/stream-pi/essentialactions#twitch-chat-integration");
}
@Override
public void initProperties() throws Exception
{
Property channel = new Property(channelNameKey, Type.STRING);
channel.setDisplayName("Channel");
channel.setDefaultValueStr("channel_name");
channel.setCanBeBlank(false);
addClientProperties(channel);
}
@Override
public void initAction() throws Exception
{
}
@Override
public void onActionClicked() throws Exception
{
final TwitchChatCredentials.ChatCredentials credentials = TwitchChatCredentials.getCredentials();
credentials.ensureCredentialsInitialized();
final String channel = getClientProperties().getSingleProperty(channelNameKey).getStringValue();
try
{
twirk = new TwirkBuilder(channel, credentials.getNickname(), credentials.getOauthToken()).build();
twirk.connect();
twirk.channelMessage("/unhost");
} catch (Exception ex)
{
throw new StreamPiException(
"Failed to cancel channel hosting",
"Could not cancel channel hosting, please try again.");
}
}
@Override
public void onShutDown() throws Exception
{
if (twirk != null) {
try
{
twirk.disconnect();
} catch (Exception ex) {
throw new StreamPiException("Twitch connection error", "Please try again.");
}
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.stream-pi</groupId>
<artifactId>twitch-unraid</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<streamPiActionApiVersion>1.0.0</streamPiActionApiVersion>
<streamPiUtilVersion>1.0.0</streamPiUtilVersion>
<streamPiTwitchChatConnectVersion>1.0.0</streamPiTwitchChatConnectVersion>
<javaTwirkVersion>0.6.3</javaTwirkVersion>
</properties>
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>test-jar</id>
<phase>package</phase>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>util</artifactId>
<version>${streamPiUtilVersion}</version>
</dependency>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>action-api</artifactId>
<version>${streamPiActionApiVersion}</version>
</dependency>
<dependency>
<groupId>com.github.gikkman</groupId>
<artifactId>Java-Twirk</artifactId>
<version>${javaTwirkVersion}</version>
</dependency>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>twitch-chat-connect</artifactId>
<version>${streamPiTwitchChatConnectVersion}</version>
</dependency>
</dependencies>
</project>
module com.stream_pi.twitch.unraidaction {
requires com.stream_pi.util;
requires com.stream_pi.action_api;
requires com.stream_pi.twitchchatconnectaction;
requires Java.Twirk;
provides com.stream_pi.action_api.normalaction.NormalAction with unraid.UnraidAction;
}
package unraid;
import com.gikk.twirk.Twirk;
import com.gikk.twirk.TwirkBuilder;
import com.stream_pi.action_api.actionproperty.property.Property;
import com.stream_pi.action_api.actionproperty.property.Type;
import com.stream_pi.action_api.normalaction.NormalAction;
import com.stream_pi.util.exception.StreamPiException;
import com.stream_pi.util.version.Version;
import connect.chat.TwitchChatCredentials;
public class UnraidAction extends NormalAction
{
private final String channelNameKey = "channel_name_ur";
private Twirk twirk;
public UnraidAction()
{
setName("Unraid");
setCategory("Twitch Chat");
setVisibilityInServerSettingsPane(false);
setAuthor("j4ckofalltrades");
setVersion(new Version(1, 0, 0));
setHelpLink("https://github.com/stream-pi/essentialactions#twitch-chat-integration");
}
@Override
public void initProperties() throws Exception
{
Property channel = new Property(channelNameKey, Type.STRING);
channel.setDisplayName("Channel");
channel.setDefaultValueStr("channel_name");
channel.setCanBeBlank(false);
addClientProperties(channel);
}
@Override
public void initAction() throws Exception
{
}
@Override
public void onActionClicked() throws Exception
{
final TwitchChatCredentials.ChatCredentials credentials = TwitchChatCredentials.getCredentials();
credentials.ensureCredentialsInitialized();
final String channel = getClientProperties().getSingleProperty(channelNameKey).getStringValue();
try
{
twirk = new TwirkBuilder(channel, credentials.getNickname(), credentials.getOauthToken()).build();
twirk.connect();
twirk.channelMessage("/unraid");
} catch (Exception ex)
{
throw new StreamPiException(
"Failed to cancel channel raid",
"Could not cancel channel raid, please try again.");
}
}
@Override
public void onShutDown() throws Exception
{
if (twirk != null) {
try
{
twirk.disconnect();
} catch (Exception ex) {
throw new StreamPiException("Twitch connection error", "Please try again.");
}
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.stream-pi</groupId>
<artifactId>twitch-whisper</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<streamPiActionApiVersion>1.0.0</streamPiActionApiVersion>
<streamPiUtilVersion>1.0.0</streamPiUtilVersion>
<streamPiTwitchChatConnectVersion>1.0.0</streamPiTwitchChatConnectVersion>
<javaTwirkVersion>0.6.3</javaTwirkVersion>
</properties>
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>test-jar</id>
<phase>package</phase>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>util</artifactId>
<version>${streamPiUtilVersion}</version>
</dependency>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>action-api</artifactId>
<version>${streamPiActionApiVersion}</version>
</dependency>
<dependency>
<groupId>com.github.gikkman</groupId>
<artifactId>Java-Twirk</artifactId>
<version>${javaTwirkVersion}</version>
</dependency>
<dependency>
<groupId>com.stream-pi</groupId>
<artifactId>twitch-chat-connect</artifactId>
<version>${streamPiTwitchChatConnectVersion}</version>
</dependency>
</dependencies>
</project>
module com.stream_pi.twitch.whisperaction {
requires com.stream_pi.util;
requires com.stream_pi.action_api;
requires com.stream_pi.twitchchatconnectaction;
requires Java.Twirk;
provides com.stream_pi.action_api.normalaction.NormalAction with whisper.WhisperAction;
}
package whisper;
import com.gikk.twirk.Twirk;
import com.gikk.twirk.TwirkBuilder;
import com.stream_pi.action_api.actionproperty.property.Property;
import com.stream_pi.action_api.actionproperty.property.Type;
import com.stream_pi.action_api.normalaction.NormalAction;
import com.stream_pi.util.exception.StreamPiException;
import com.stream_pi.util.version.Version;
import connect.chat.TwitchChatCredentials;
public class WhisperAction extends NormalAction
{
private final String usernameKey = "username_wa";
private final String messageKey = "message_wa";
private Twirk twirk;
public WhisperAction()
{
setName("Whisper");
setCategory("Twitch Chat");
setVisibilityInServerSettingsPane(false);
setAuthor("j4ckofalltrades");
setVersion(new Version(1, 0, 0));
setHelpLink("https://github.com/stream-pi/essentialactions#twitch-chat-integration");
}
@Override
public void initProperties() throws Exception
{
Property usernameProp = new Property(usernameKey, Type.STRING);
usernameProp.setDisplayName("Twitch Username");
usernameProp.setDefaultValueStr("username");
usernameProp.setCanBeBlank(false);
Property messageProp = new Property(messageKey, Type.STRING);
messageProp.setDisplayName("Message");
messageProp.setDefaultValueStr("message");
messageProp.setCanBeBlank(false);
addClientProperties(usernameProp, messageProp);
}
@Override
public void initAction() throws Exception
{
}
@Override
public void onActionClicked() throws Exception
{
final TwitchChatCredentials.ChatCredentials credentials = TwitchChatCredentials.getCredentials();
credentials.ensureCredentialsInitialized();
final String username = getClientProperties().getSingleProperty(usernameKey).getStringValue();
final String message = getClientProperties().getSingleProperty(messageKey).getStringValue();
try
{
twirk = new TwirkBuilder(username, credentials.getNickname(), credentials.getOauthToken()).build();
twirk.connect();
twirk.whisper(username, message);
} catch (Exception ex)
{
throw new StreamPiException(
"Failed to send message to user",
String.format("Could not send message '%s' to user '%s', please try again.",
username, message)
);
}
}
@Override
public void onShutDown() throws Exception
{
if (twirk != null) {
try
{
twirk.disconnect();
} catch (Exception ex) {
throw new StreamPiException("Twitch connection error", "Please try again.");
}
}
}
}