essential-actions

Clone or download

Implement clearing of Twitch Chat config

Modified Files

PK
PK
GaR4AW_META-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMuRp,HLHUM,KS033r*)f$ADRtR&3PK4AW_PK
GaR4AW_META-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMuRp,HLHUM,KS033r*)f$ADRtR&3PK4AW_PK
GaR META-INF/PK
GaR META-INF/PK
GaRconnect/PK
GaRconnect/PK
GaR connect/chat/PK
GaR connect/chat/PK
GaRMETA-INF/maven/PK
GaRMETA-INF/maven/PK
GaRMETA-INF/maven/com.stream-pi/PK
GaRMETA-INF/maven/com.stream-pi/PK
GaR1META-INF/maven/com.stream-pi/twitch-chat-connect/PK
GaR1META-INF/maven/com.stream-pi/twitch-chat-connect/PK
GaRdmodule-info.classUON1=W
GaRdmodule-info.classUON1=W
@vcڐ0эIcLБw:Ҧqk  GW&iBfL 85yZ]B#VC58"c.zRDZ)Opn\Ht6Y֛qy.'ԓ&Lz۔?pWq [‘jOdB&DZQLu#zJcXiTwj@X-UWhplr.V!v-}>PKdPK
@vcڐ0эIcLБw:Ҧqk  GW&iBfL 85yZ]B#VC58"c.zRDZ)Opn\Ht6Y֛qy.'ԓ&Lz۔?pWq [‘jOdB&DZQLu#zJcXiTwj@X-UWhplr.V!v-}>PKdPK
GaRMupB%connect/TwitchChatConnectAction.classW[-`$Ăa q{M-$i\#d0*B`KiKiAk]uww&N&"H4=~} ӧ}{Ǽ}^p 1ēf>%to 3A3lk"'0ބ!t ȟo;'R\dI"j}!k
GaRMupB%connect/TwitchChatConnectAction.classW[-`$Ăa q{M-$i\#d0*B`KiKiAk]uww&N&"H4=~} ӧ}{Ǽ}^p 1ēf>%to 3A3lk"'0ބ!t ȟo;'R\dI"j}!k
!>| i|, >لO!D>|6 ^Nf#Db(ΎGHkl):3攌ci܀i3ITx:Mdž|Q- Kͫ1t f+vN5T%ge`qLT7 9#>;)!afŒjeٌr\f8O68p(Ej 5(%$x\;̄eUTwmZlA,iAKe EMa4[{-z_2Ts9նjxZCCsj"$jkS5.* h24<Nj4FPrΙKCg 3ySs^ H3x
!>| i|, >لO!D>|6 ^Nf#Db(ΎGHkl):3攌ci܀i3ITx:Mdž|Q- Kͫ1t f+vN5T%ge`qLT7 9#>;)!afŒjeٌr\f8O68p(Ej 5(%$x\;̄eUTwmZlA,iAKe EMa4[{-z_2Ts9նjxZCCsj"$jkS5.* h24<Nj4FPrΙKCg 3ySs^ H3x
bgU׀0d:42͏P,Y9uXM8)/'Ҝf
bgU׀0d:42͏P,Y9uXM8)/'Ҝf
\,U|"qܼ9tݱX^E|/;u%GӕE^P&'7 ķh?(sS(s+7)@/^Ʒ}[3 sܟ\%6yD|pjǥ&6OAjqRC}x>Kjqrt?Ïy;|y_Wr#=4mSֈ ~*m4rT`ݍY~;0!!&~)"E(XK"~[Ȫ<ծVڳ&6̈Ib%tF94wḊ(Sj✢Ibeh;^Jg̨qcYs̐ sIVj9rɦzWhY'P?߉=^y?-QcRM 3ty1]p
\,U|"qܼ9tݱX^E|/;u%GӕE^P&'7 ķh?(sS(s+7)@/^Ʒ}[3 sܟ\%6yD|pjǥ&6OAjqRC}x>Kjqrt?Ïy;|y_Wr#=4mSֈ ~*m4rT`ݍY~;0!!&~)"E(XK"~[Ȫ<ծVڳ&6̈Ib%tF94wḊ(Sj✢Ibeh;^Jg̨qcYs̐ sIVj9rɦzWhY'P?߉=^y?-QcRM 3ty1]p
jY%-\"T 9.񬗊E]e*;ֲf^qIsKeFU1D\
jY%-\"T 9.񬗊E]e*;ֲf^qIsKeFU1D\
ت&x.L+fZ-lmF5g9ixĞ`?,WDSp2!.Gé[ɚU/i5OuF
ت&x.L+fZ-lmF5g9ixĞ`?,WDSp2!.Gé[ɚU/i5OuF
)?~r˳+8q= \$_3ًy'qjDtʸ'9.l˘'YVҽ[M1Y
)?~r˳+8q= \$_3ًy'qjDtʸ'9.l˘'YVҽ[M1Y
Y3E>Rv~Ng.9cߦJ1,0#O3m54րWjevu1Uǜltt^/M޸SY_W+x]ZW| [ٽ}h:A4 =>d^
Y3E>Rv~Ng.9cߦJ1,0#O3m54րWjevu1Uǜltt^/M޸SY_W+x]ZW| [ٽ}h:A4 =>d^
NG6xs2=<~q,Mj5MdɅLfR{5 i=*oqLP*5c )l *L|ȯUCx7o=Z~l"3lFnnQu9X.>MiUD;!%h4!Y4@HueG2vEhH2hj_A$BsSH#/=StõxB4>졷І K ,1
NG6xs2=<~q,Mj5MdɅLfR{5 i=*oqLP*5c )l *L|ȯUCx7o=Z~l"3lFnnQu9X.>MiUD;!%h4!Y4@HueG2vEhH2hj_A$BsSH#/=StõxB4>졷І K ,1
OJÂ8) A8\cFǔy`O**=TިYFWs=XLz1qcuTC\0ZsG fE8Q BЎ@eaGэazyoYs=UA"etWO7BS ۫c_S}u2z8rNZhX/!R1{*[[0A@d(Y
OJÂ8) A8\cFǔy`O**=TިYFWs=XLz1qcuTC\0ZsG fE8Q BЎ@eaGэazyoYs=UA"etWO7BS ۫c_S}u2z8rNZhX/!R1{*[[0A@d(Y
*ܖ ".
*ܖ ".
(UNl Z&+漲Z坰;ULoZj(}))&D
(UNl Z&+漲Z坰;ULoZj(}))&D
2=1w77yUI{Dni<E(gwOP R S͌j/.\߃2V"p7cݕIׯ:뾗˴x'?PKMupBPK
2=1w77yUI{Dni<E(gwOP R S͌j/.\߃2V"p7cݕIׯ:뾗˴x'?PKMupBPK
GaRh$(connect/chat/TwitchChatCredentials.classRN@=C хa.l|D7$&& aHImoX(mm}s3o/2b] U ֐-_ sו~A ͋a[x%١ j)!wbvxʠ= $qmWv7}wyߡH oG~TáMԵ?PUZ~ޘmBBjg.+o yfGV~D[NБAx!+& MAg}Ra9ܽ.#fأ_/#rΓ4ɳH3ٝg22'
GaRh$(connect/chat/TwitchChatCredentials.classRN@=C хa.l|D7$&& aHImoX(mm}s3o/2b] U ֐-_ sו~A ͋a[x%١ j)!wbvxʠ= $qmWv7}wyߡH oG~TáMԵ?PUZ~ޘmBBjg.+o yfGV~D[NБAx!+& MAg}Ra9ܽ.#fأ_/#rΓ4ɳH3ٝg22'
$Q"c夹gdkP"ʃ/'d&4iJTɤ+q*"e]PKh$PK
$Q"c夹gdkP"ʃ/'d&4iJTɤ+q*"e]PKh$PK
GaRnŏ8connect/chat/TwitchChatCredentials$ChatCredentials.classj@I,׉9 ۅ
GaRnŏ8connect/chat/TwitchChatCredentials$ChatCredentials.classj@I,׉9 ۅ
B! 酡`ܯ^GYN_B/}ٍIR[  ]ޙe]W֛k\sK5>fp#>ӓAt)CD*OCP> m(Ȅ;; %)}QJĝ' c/(h?LU`,$<KJ릜<M6sZwzN?{rSo=fq >Ks[U?-A"(<z(Pprq +M D3hL4;zIS6fZ&'L<` Z*Y^o7R:'6[dڏkifg2'*.*9HU$EP%E$M4eX~WQPKnŏPK
B! 酡`ܯ^GYN_B/}ٍIR[  ]ޙe]W֛k\sK5>fp#>ӓAt)CD*OCP> m(Ȅ;; %)}QJĝ' c/(h?LU`,$<KJ릜<M6sZwzN?{rSo=fq >Ks[U?-A"(<z(Pprq +M D3hL4;zIS6fZ&'L<` Z*Y^o7R:'6[dڏkifg2'*.*9HU$EP%E$M4eX~WQPKnŏPK
uaR^q8META-INF/maven/com.stream-pi/twitch-chat-connect/pom.xmlU]o }ϯeˤMVimWMb pie{\pA7\כ(hIk3VK|ݤ D-5P{Z`RPEO`wY, tkZ%NpjpM͓ZZlc\cd򀎣TWAhN5laXm5K T*nl(X(ҡ"EL
uaR^q8META-INF/maven/com.stream-pi/twitch-chat-connect/pom.xmlU]o }ϯeˤMVimWMb pie{\pA7\כ(hIk3VK|ݤ D-5P{Z`RPEO`wY, tkZ%NpjpM͓ZZlc\cd򀎣TWAhN5laXm5K T*nl(X(ҡ"EL
bZKniJjZj:jVR$oi 82ȩW\;%Fۆ=]ӟ+dK.icb7+<:З6\2Q ,2=#2oej#y|ݖ0ӋF^[VlsmD{hwFugs<93oj>c$F=PҚGЇ}iTp;d%Mx8lRrKb=ml0$"8Ӥ2t\dFxcy+T~E&GY7hCL#s0gh_nWD!_o!ω2JEmΏi1;͌6ƆvQN؍3;f͟}PK^qPK
bZKniJjZj:jVR$oi 82ȩW\;%Fۆ=]ӟ+dK.icb7+<:З6\2Q ,2=#2oej#y|ݖ0ӋF^[VlsmD{hwFugs<93oj>c$F=PҚGЇ}iTp;d%Mx8lRrKb=ml0$"8Ӥ2t\dFxcy+T~E&GY7hCL#s0gh_nWD!_o!ω2JEmΏi1;͌6ƆvQN؍3;f͟}PK^qPK
GaRyI#]b?META-INF/maven/com.stream-pi/twitch-chat-connect/pom.properties ; НS8`H
GaRyI#]b?META-INF/maven/com.stream-pi/twitch-chat-connect/pom.properties ; НS8`H
@x{(SAW9i8u|e)GhhJPX%H<A(rJLn-4`PKyI#]bPKGaR4AW_META-INF/MANIFEST.MFPK
@x{(SAW9i8u|e)GhhJPX%H<A(rJLn-4`PKyI#]bPKGaR4AW_META-INF/MANIFEST.MFPK
GaR AMETA-INF/PK
GaR AMETA-INF/PK
GaRAconnect/PK
GaRAconnect/PK
GaR Aconnect/chat/PK
GaR Aconnect/chat/PK
GaRAMETA-INF/maven/PK
GaRAMETA-INF/maven/PK
GaRA>META-INF/maven/com.stream-pi/PK
GaRA>META-INF/maven/com.stream-pi/PK
GaR1AyMETA-INF/maven/com.stream-pi/twitch-chat-connect/PKGaRdmodule-info.classPKGaRMupB%connect/TwitchChatConnectAction.classPKGaRh$( connect/chat/TwitchChatCredentials.classPKGaRnŏ8Y connect/chat/TwitchChatCredentials$ChatCredentials.classPKuaR^q8oMETA-INF/maven/com.stream-pi/twitch-chat-connect/pom.xmlPKGaRyI#]b?FMETA-INF/maven/com.stream-pi/twitch-chat-connect/pom.propertiesPK 
GaR1AyMETA-INF/maven/com.stream-pi/twitch-chat-connect/PKGaRdmodule-info.classPKGaRMupB%connect/TwitchChatConnectAction.classPKGaRh$( connect/chat/TwitchChatCredentials.classPKGaRnŏ8Y connect/chat/TwitchChatCredentials$ChatCredentials.classPKuaR^q8oMETA-INF/maven/com.stream-pi/twitch-chat-connect/pom.xmlPKGaRyI#]b?FMETA-INF/maven/com.stream-pi/twitch-chat-connect/pom.propertiesPK 
PK
PK
LaR4AW_META-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMuRp,HLHUM,KS033r*)f$ADRtR&3PK4AW_PK
LaR4AW_META-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMuRp,HLHUM,KS033r*)f$ADRtR&3PK4AW_PK
LaR META-INF/PK
LaR META-INF/PK
LaRsendchannelmsg/PK
LaRsendchannelmsg/PK
LaRMETA-INF/maven/PK
LaRMETA-INF/maven/PK
LaRMETA-INF/maven/com.stream-pi/PK
LaRMETA-INF/maven/com.stream-pi/PK
LaR5META-INF/maven/com.stream-pi/twitch-send-channel-msg/PK
LaR5META-INF/maven/com.stream-pi/twitch-send-channel-msg/PK
LaRVGO; module-info.classmNN0ДGy qig\ʽ2i I\N{8|I(kyk¡)rtԌD]1栒:Fp@{e` GRҤܺ\t4-SnU6Se*IDHMFh3~p:!73M8o4~t\p ѯ!ZeESBPţ5(kD՝oaY-^1]hU,]VEwPKVGO; PK
LaRVGO; module-info.classmNN0ДGy qig\ʽ2i I\N{8|I(kyk¡)rtԌD]1栒:Fp@{e` GRҤܺ\t4-SnU6Se*IDHMFh3~p:!73M8o4~t\p ѯ!ZeESBPţ5(kD՝oaY-^1]hU,]VEwPKVGO; PK
LaR[.-sendchannelmsg/SendChannelMessageAction.classW֒#0`-VB)` iܵ^HHڴIB6-=hSh"ФWJ4z|+۲̼ffko؆E0,Ƙsɇ~\Du01)zKFA0:8p#XbgD6s͓a| !!b 0>V'EX|.OBy1|V4/DЂE:r}>//0*|'pA4_ F\ߒm +u t<3,!7Qji\e:jCQ$,_ ޟ>Kܳ=A5Io&9(ZTK7uw@kې`r} 'G5{P54aQ!] yݑhf6WMS3&I29;I}UlW(\_P'cgښ:9RГ'7 TrvPlJlTB\F+9jվ!2a3ZVBvNBSڳ]J[j#;njnRKvPGp"&i+v3BT$]hrƋf&ՂJX; d{{I˶{vA14 1ODeGԢ&4bo4?b|o%G$mv@YV)b`/J0\2%wO
LaR[.-sendchannelmsg/SendChannelMessageAction.classW֒#0`-VB)` iܵ^HHڴIB6-=hSh"ФWJ4z|+۲̼ffko؆E0,Ƙsɇ~\Du01)zKFA0:8p#XbgD6s͓a| !!b 0>V'EX|.OBy1|V4/DЂE:r}>//0*|'pA4_ F\ߒm +u t<3,!7Qji\e:jCQ$,_ ޟ>Kܳ=A5Io&9(ZTK7uw@kې`r} 'G5{P54aQ!] yݑhf6WMS3&I29;I}UlW(\_P'cgښ:9RГ'7 TrvPlJlTB\F+9jվ!2a3ZVBvNBSڳ]J[j#;njnRKvPGp"&i+v3BT$]hrƋf&ՂJX; d{{I˶{vA14 1ODeGԢ&4bo4?b|o%G$mv@YV)b`/J0\2%wO
- kL5 V}+<5&^(':[pv&Y=n89'Ai'u\:vsKhj<"$
- kL5 V}+<5&^(':[pv&Y=n89'Ai'u\:vsKhj<"$
~ ?gV@&KeaRɯy8[M
~ ?gV@&KeaRɯy8[M
^2J
^2J
qU0TV588yTΊ
qU0TV588yTΊ
F11똞+ڪp-V4wTGeZf"
F11똞+ڪp-V4wTGeZf"
17np¶Y2~5\JV~-7
17np¶Y2~5\JV~-7
~)=ޔ1YVh-ğo+3QpX"aٞVL7V26[SVL MNTzTLͩ)qNq/B9f%wU62M˞G$?u_p9Gs O\THlzRCNifE5%sT5ezR֑Z6/^1~ZnBqH3
~)=ޔ1YVh-ğo+3QpX"aٞVL7V26[SVL MNTzTLͩ)qNq/B9f%wU62M˞G$?u_p9Gs O\THlzRCNifE5%sT5ezR֑Z6/^1~ZnBqH3
-y>r5?8Uacyj'vW{L~םNQ mL-*x-y!0i/UYަkԻӅ5nT49͟vo7pN1?vcǎ2tx.wO䭳88,UVړ?6wV'xps=^7 *.;,0UШ'$,#]嵽ڼxy֎SխnΩ|WUGe,EBR6nqRs(cXVa'!UF褐W Zv3 <֔G%jQpꆃ4"%ǣJ ]Sl7 v9X4MԾmX$b?9_zpƳeh? Wd_1ѥ%,k6ƬVWh3WU\MxuDsi0c)6ҼMPlA;ZMF]H1ߘ zip;8Q |3IfhoNKm+B:E,C\y*KX{Mװn8z_4v맱/Km,aS {J`Z+G+mlH_A("6 z*>D 7İ#}i1I<;elӇ8%)+o0 :IOGI8w: 1-PB-`AD r 8A.Zt!pd<_
-y>r5?8Uacyj'vW{L~םNQ mL-*x-y!0i/UYަkԻӅ5nT49͟vo7pN1?vcǎ2tx.wO䭳88,UVړ?6wV'xps=^7 *.;,0UШ'$,#]嵽ڼxy֎SխnΩ|WUGe,EBR6nqRs(cXVa'!UF褐W Zv3 <֔G%jQpꆃ4"%ǣJ ]Sl7 v9X4MԾmX$b?9_zpƳeh? Wd_1ѥ%,k6ƬVWh3WU\MxuDsi0c)6ҼMPlA;ZMF]H1ߘ zip;8Q |3IfhoNKm+B:E,C\y*KX{Mװn8z_4v맱/Km,aS {J`Z+G+mlH_A("6 z*>D 7İ#}i1I<;elӇ8%)+o0 :IOGI8w: 1-PB-`AD r 8A.Zt!pd<_
e,P C\_yx Z'B(pI՟i4&E;hnzKm,[CkCi
e,P C\_yx Z'B(pI՟i4&E;hnzKm,[CkCi
/ӗu jTIX2,3ryN&<8vA#zByaq:ڙOp.H\fXC Jz"i/
/ӗu jTIX2,3ryN&<8vA#zByaq:ڙOp.H\fXC Jz"i/
KѰ"88 vE*oJz%dFT!%1O1UPK[.PK
KѰ"88 vE*oJz%dFT!%1O1UPK[.PK
XaRh ' <META-INF/maven/com.stream-pi/twitch-send-channel-msg/pom.xmlVn }WD^ 2MU帪*MjV{$'.`;8<t{\WoT\T B`**R^eKx\%bͨR ׺ĸ$[V!R3$dOh{Wv;[Z"?n@jIB^)M*l·m ;|WCC "eœybb<fI_ӄ)-)ÚǸ H_4Ґ椪X*1)I+5:Sj
XaRh ' <META-INF/maven/com.stream-pi/twitch-send-channel-msg/pom.xmlVn }WD^ 2MU帪*MjV{$'.`;8<t{\WoT\T B`**R^eKx\%bͨR ׺ĸ$[V!R3$dOh{Wv;[Z"?n@jIB^)M*l·m ;|WCC "eœybb<fI_ӄ)-)ÚǸ H_4Ґ椪X*1)I+5:Sj
[j^0h$eIx|d4K1=Վ,{~M5V:9>LԼIVQ=1$M&[1~$Zȃ=4Ys & .b~Eb>n:<ϋ"^Sudp;\܅C 9X:Wی΢K ؞ƘB@QfJ}MDĈG2d!%PCEm8ïc<Rǝ0y\hD^xHr,?8`FQ oo磉rn kSVC7pzpNci(1%z>i1_;GlC Uq}J3~6To ahr}Jp!l?S٩u0{PKh ' PK
[j^0h$eIx|d4K1=Վ,{~M5V:9>LԼIVQ=1$M&[1~$Zȃ=4Ys & .b~Eb>n:<ϋ"^Sudp;\܅C 9X:Wی΢K ؞ƘB@QfJ}MDĈG2d!%PCEm8ïc<Rǝ0y\hD^xHr,?8`FQ oo磉rn kSVC7pzpNci(1%z>i1_;GlC Uq}J3~6To ahr}Jp!l?S٩u0{PKh ' PK
LaRQLbfCMETA-INF/maven/com.stream-pi/twitch-send-channel-msg/pom.properties ʱ
LaRQLbfCMETA-INF/maven/com.stream-pi/twitch-send-channel-msg/pom.properties ʱ
0 н_QpnP7q>"F[iis{Zv)HO;k)'hJ4X5nH^Q)åkYzPKQLbfPKLaR4AW_META-INF/MANIFEST.MFPK
0 н_QpnP7q>"F[iis{Zv)HO;k)'hJ4X5nH^Q)åkYzPKQLbfPKLaR4AW_META-INF/MANIFEST.MFPK
LaR AMETA-INF/PK
LaR AMETA-INF/PK
LaRAsendchannelmsg/PK
LaRAsendchannelmsg/PK
LaRAMETA-INF/maven/PK
LaRAMETA-INF/maven/PK
LaRAMETA-INF/maven/com.stream-pi/PK
LaRAMETA-INF/maven/com.stream-pi/PK
LaR5AUMETA-INF/maven/com.stream-pi/twitch-send-channel-msg/PKLaRVGO; module-info.classPKLaR[.-sendchannelmsg/SendChannelMessageAction.classPKXaRh ' < META-INF/maven/com.stream-pi/twitch-send-channel-msg/pom.xmlPKLaRQLbfCMETA-INF/maven/com.stream-pi/twitch-send-channel-msg/pom.propertiesPK
LaR5AUMETA-INF/maven/com.stream-pi/twitch-send-channel-msg/PKLaRVGO; module-info.classPKLaR[.-sendchannelmsg/SendChannelMessageAction.classPKXaRh ' < META-INF/maven/com.stream-pi/twitch-send-channel-msg/pom.xmlPKLaRQLbfCMETA-INF/maven/com.stream-pi/twitch-send-channel-msg/pom.propertiesPK


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 static final String TWITCH_CHANNEL_NAME_KEY = "twitch_channel_name";
private static final String TWITCH_CHANNEL_MSG_KEY = "twitch_channel_msg";
private static final String TWITCH_CHANNEL_MSG_KEY = "twitch_channel_msg";
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");
}
}
@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(TWITCH_CHANNEL_NAME_KEY, 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(TWITCH_CHANNEL_MSG_KEY, 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();
TwitchChatCredentials.ChatCredentials credentials = TwitchChatCredentials.getCredentials();
if (!isChatCredentialsInitialized(credentials))
if (!isChatCredentialsInitialized(credentials))
{
{
throw new StreamPiException("Twitch Chat uninitialized.","Please check that the Twitch Chat plugin configuration is correct.");
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(TWITCH_CHANNEL_NAME_KEY).getStringValue();
final String message = getClientProperties().getSingleProperty(TWITCH_CHANNEL_MSG_KEY).getStringValue();
final String message = getClientProperties().getSingleProperty(TWITCH_CHANNEL_MSG_KEY).getStringValue();
try
try
{
{
twirk = new TwirkBuilder(
twirk = new TwirkBuilder(
getClientProperties().getSingleProperty(TWITCH_CHANNEL_NAME_KEY).getStringValue(),
getClientProperties().getSingleProperty(TWITCH_CHANNEL_NAME_KEY).getStringValue(),
credentials.getNickname(),
credentials.getNickname(),
credentials.getOauthToken())
credentials.getOauthToken())
.build();
.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)
private boolean isChatCredentialsInitialized(TwitchChatCredentials.ChatCredentials credentials)
{
{
if (credentials == null)
if (credentials == null)
{
{
return false;
return false;
}
}
final String twitchNickname = credentials.getNickname();
final String twitchNickname = credentials.getNickname();
boolean isNicknameInitialized = twitchNickname != null &&
boolean isNicknameInitialized = twitchNickname != null &&
!twitchNickname.isEmpty() &&
!twitchNickname.isEmpty() &&
!twitchNickname.equalsIgnoreCase("twitch_nickname");
!twitchNickname.equalsIgnoreCase(DEFAULT_TWITCH_NICKNAME);
final String twitchChatOauthToken = credentials.getOauthToken();
final String twitchChatOauthToken = credentials.getOauthToken();
boolean isTokenInitialized = twitchChatOauthToken != null &&
boolean isTokenInitialized = twitchChatOauthToken != null &&
!twitchChatOauthToken.isEmpty() &&
!twitchChatOauthToken.isEmpty() &&
!twitchChatOauthToken.equalsIgnoreCase("twitch_oauth_token");
!twitchChatOauthToken.equalsIgnoreCase(DEFAULT_TWITCH_TOKEN);
return isNicknameInitialized && isTokenInitialized;
return isNicknameInitialized && isTokenInitialized;
}
}
@Override
@Override
public void onShutDown() throws Exception
public void onShutDown() throws Exception
{
{
twirk.close();
twirk.close();
}
}
}
}
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 TWITCH_ACCESS_TOKEN_KEY = "twitch_access_token";
private static final String TWITCH_NICKNAME_KEY = "twitch_nickname";
private static final String TWITCH_NICKNAME_KEY = "twitch_nickname";
private final Button saveCredentialsBtn;
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");
saveCredentialsBtn = new Button("Save Twitch chat credentials");
clearCredentialsBtn = new Button("Clear Twitch chat credentials");
setButtonBar(saveCredentialsBtn);
onClearCredentials();
setButtonBar(clearCredentialsBtn);
}
}
@Override
@Override
public void initProperties() throws Exception
public void initProperties()
{
{
Property twitchNicknameProp = new Property(TWITCH_NICKNAME_KEY, Type.STRING);
Property twitchNicknameProp = new Property(TWITCH_NICKNAME_KEY, Type.STRING);
twitchNicknameProp.setDisplayName("Twitch Username");
twitchNicknameProp.setDisplayName("Twitch Username");
twitchNicknameProp.setDefaultValueStr("twitch_nickname");
twitchNicknameProp.setCanBeBlank(false);
Property twitchAccessTokenProp = new Property(TWITCH_ACCESS_TOKEN_KEY, Type.STRING);
Property twitchAccessTokenProp = new Property(TWITCH_ACCESS_TOKEN_KEY, Type.STRING);
twitchAccessTokenProp.setDisplayName("Access Token");
twitchAccessTokenProp.setDisplayName("Access Token");
twitchAccessTokenProp.setDefaultValueStr("twitch_oauth_token");
twitchAccessTokenProp.setCanBeBlank(false);
addServerProperties(twitchNicknameProp, twitchAccessTokenProp);
addServerProperties(twitchNicknameProp, twitchAccessTokenProp);
}
}
@Override
@Override
public void initAction() throws Exception
public void initAction() throws MinorException
{
{
saveCredentialsBtn.setOnAction(action ->
clearCredentialsBtn.setDisable(isEmptyCredentials());
TwitchChatCredentials.setCredentials(
new TwitchChatCredentials.ChatCredentials()
.setOauthToken(getServerProperties().getSingleProperty(TWITCH_ACCESS_TOKEN_KEY).getStringValue())
.setNickname(getServerProperties().getSingleProperty(TWITCH_NICKNAME_KEY).getStringValue()));
}
private boolean isEmptyCredentials() throws MinorException {
final String twitchNickname = getServerProperties().getSingleProperty(TWITCH_NICKNAME_KEY).getStringValue();
final String twitchChatOauthToken = getServerProperties().getSingleProperty(TWITCH_ACCESS_TOKEN_KEY).getStringValue();
return (twitchNickname == null || twitchNickname.isEmpty()) &&
(twitchChatOauthToken == null || twitchChatOauthToken.isEmpty());
}
private void onClearCredentials()
{
clearCredentialsBtn.setOnAction(action ->
{
{
try
try
{
{
persistCredentials();
getServerProperties().getSingleProperty(TWITCH_ACCESS_TOKEN_KEY).setStringValue("");
getServerProperties().getSingleProperty(TWITCH_NICKNAME_KEY).setStringValue("");
saveServerProperties();
new StreamPiAlert(
new StreamPiAlert(
"Twitch chat credentials saved",
"Twitch chat credentials cleared",
"Chat credentials been saved, you can now start using Twitch chat integration actions.",
"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 saving chat credentials, please try again.",
"An error has occurred while clearing chat credentials, please try again.",
StreamPiAlertType.WARNING)
StreamPiAlertType.WARNING)
.show();
.show();
}
}
});
});
persistCredentials();
}
private void persistCredentials() throws MinorException
{
final String token = getServerProperties().getSingleProperty(TWITCH_ACCESS_TOKEN_KEY).getStringValue();
final String nickname = getServerProperties().getSingleProperty(TWITCH_NICKNAME_KEY).getStringValue();
TwitchChatCredentials.setCredentials(
new TwitchChatCredentials.ChatCredentials()
.setOauthToken(token)
.setNickname(nickname));
}
}
@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;
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 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;
}
}
}
}
}
}