Construímos este módulo Comfy Twitch Chat ao vivo no Twitch para Coding Cafe!
Agradecimentos especiais: Comfy.JS é possível graças ao tmi.js mantido por @AlcaDesign
Comfy.JS permite integração com o bate-papo do Twitch para seu canal Twitch SUPER FACILMENTE em apenas algumas linhas de código. Aqui está um vídeo rápido de 3 minutos sobre como usá-lo: (Clique na imagem para abrir o vídeo)
Gostou desses projetos? A melhor maneira de apoiar meus projetos de código aberto é se tornar um patrocinador do Comfy no GitHub!
https://github.com/sponsors/instafluff
Venha e divirta-se conosco no Comfiest Corner no Twitch!
https://twitch.tv/instafluff
comfy.js
npm install comfy.js --save
var ComfyJS = require ( "comfy.js" ) ;
ComfyJS . onCommand = ( user , command , message , flags , extra ) => {
if ( flags . broadcaster && command === "test" ) {
console . log ( "!test was typed in chat" ) ;
}
}
ComfyJS . Init ( "MyTwitchChannel" ) ;
comfy.js
da pasta dist
ou inclua do JSDelivr CDN: < script src = "comfy.min.js" > < / script >
OU
< script src = "https://cdn.jsdelivr.net/npm/comfy.js@latest/dist/comfy.min.js" > < / script >
< html >
< head >
< script src =" https://cdn.jsdelivr.net/npm/comfy.js@latest/dist/comfy.min.js " > </ script >
</ head >
< body >
< script type =" text/javascript " >
ComfyJS . onCommand = ( user , command , message , flags , extra ) => {
if ( flags . broadcaster && command === "test" ) {
console . log ( "!test was typed in chat" ) ;
}
}
ComfyJS . Init ( "MyTwitchChannel" ) ;
</ script >
</ body >
</ html >
Atualmente, os flags possíveis em onCommand()
e onChat()
são:
Atualmente, o parâmetro extra
para onCommand()
contém os seguintes campos:
Se a mensagem for um comando, o parâmetro extra
conterá um campo adicional:
que contém as informações sobre os períodos de tempo em ms
desde a última vez que qualquer usuário, ou usuário específico, usou o mesmo comando. Este campo pode ser conveniente para ser usado para definir filtros globais de resfriamento ou spam. Veja exemplos abaixo:
ComfyJS . onChat = ( user , message , flags , self , extra ) => {
if ( flags . broadcaster && command === "test" ) {
if ( extra . sinceLastCommand . any < 100 ) {
console . log (
`The last '!test' command by any user was sent less than 100 ms ago`
) ;
}
if ( extra . sinceLastCommand . user < 100 ) {
console . log (
`The last '!test' command by this specific user (as denoted by the 'user' parameter) was sent less than 100 ms ago`
) ;
}
}
}
Você pode ler mensagens de bate-papo usando o manipulador onChat()
ComfyJS . onChat = ( user , message , flags , self , extra ) => {
console . log ( user , message ) ;
}
O envio de mensagens de bate-papo pode ser feito por meio de ComfyJS.Say( message )
mas requer uma senha OAUTH ao conectar-se ao bate-papo.
dotenv
npm install dotenv --save
.env
parecido com este: TWITCHUSER = [ YOUR - USERNAME - HERE ]
OAUTH = [ YOUR - OAUTH - PASS HERE ] # e . g . OAUTH = oauth : kjh12bn1hsj78445234
var ComfyJS = require ( "comfy.js" ) ;
ComfyJS . onCommand = ( user , command , message , flags , extra ) => {
if ( command === "test" ) {
ComfyJS . Say ( "replying to !test" ) ;
}
}
ComfyJS . Init ( process . env . TWITCHUSER , process . env . OAUTH ) ;
Você pode ingressar em um canal ou grupo de canais diferente especificando no Init()
ComfyJS . Init ( "MyTwitchChannel" , null , "ChannelToJoin" ) ;
ComfyJS . Init ( "MyTwitchChannel" , null , [ "ChannelA" , "ChannelB" , "ChannelC" ] ) ;
Os resgates de recompensas de pontos do canal exigem escopos de permissão extras do Twitch OAuth (e devem ser o OAuth do proprietário do canal !)
Você pode usar esta ferramenta: https://twitchapps.com/tokengen/
Escopos: channel:manage:redemptions channel:read:redemptions user:read:email chat:edit chat:read
ComfyJS . onReward = ( user , reward , cost , message , extra ) => {
console . log ( user + " redeemed " + reward + " for " + cost ) ;
}
Comfy.JS inclui funções para gerenciar recompensas de pontos de canal. Essas funções requerem o ClientID usado para obter a senha Twitch OAuth para o canal.
( clientId, manageableOnly = true )
( clientId, rewardInfo )
( clientId, rewardId, rewardInfo )
( clientId, rewardId )
let channelRewards = await ComfyJS . GetChannelRewards ( clientId , true ) ;
let customReward = await ComfyJS . CreateChannelReward ( clientId , {
title : "Test Reward" ,
prompt : "Test Description" ,
cost : 100 ,
is_enabled : true ,
background_color : "#00E5CB" ,
is_user_input_required : false ,
is_max_per_stream_enabled : false ,
max_per_stream : 0 ,
is_max_per_user_per_stream_enabled : false ,
max_per_user_per_stream : 0 ,
is_global_cooldown_enabled : false ,
global_cooldown_seconds : 0 ,
should_redemptions_skip_request_queue : true
} ) ;
let updatedReward = await ComfyJS . UpdateChannelReward ( clientId , customReward . id , {
title : "Test Reward (Updated)" ,
prompt : "Updated Description" ,
cost : 200 ,
is_enabled : true ,
} ) ;
await ComfyJS . DeleteChannelReward ( clientId , customReward . id ) ;
Você pode se desconectar do servidor e de todos os canais usando Disconnect()
.
ComfyJS . Disconnect ( ) ;
( user, command, message, flags, extra )
( user, message, flags, self, extra )
( user, message, flags, self, extra )
( id, extra )
( user, reward, cost, message, extra )
( user, self, extra )
( user, self, extra )
( user, viewers, autohost, extra )
( bannedUsername, extra )
( timedOutUsername, durationInSeconds, extra )
( user, viewers, extra )
( user, message, bits, flags, extra )
( user, message, subTierInfo, extra )
( user, message, streamMonths, cumulativeMonths, subTierInfo, extra )
( gifterUser, streakMonths, recipientUser, senderCount, subTierInfo, extra )
( gifterUser, numbOfSubs, senderCount, subTierInfo, extra )
( user, sender, extra )
( address, port, isFirstConnect )
( reconnectCount )
( error )
Obrigado a todos os participantes deste projeto!
Instafluff, Instafriend, Neo_TA, ChatTranslator, fydo, That_MS_Gamer, MrRayKoma, Amarogine, HunWalk, simrose4u, sparky_pugwash, soggycoffee, blackdawn1980, BooobieTrap, lizardqueen, TastyGamers101, MalForTheWin, SourBeers, Stay_Hydrated_Bot, codeaurora, DutchGamer46, TheHungerService, BungalowGlow, koralina_211, TominationTime, itsDeke, fd_god92, SushiDay, FlyToto_, Docpinecone, katori15, ScrtSolstice, QeraiX, superravemonster, Jwh1o1, Deitypotato, Stobie, Chlapicek99, tehWokes, SuperChihuahua, FranC312, FuriousFur, Moopaloo, CreativeBuilds, donaldwm, Zorchenhimer, Grognardian, ravavyr, Chibigirl24, DR4G0N_S4MUR41, PokemoHero, rekaj3773, cunavrito, TheGeekGeneration, DevMerlin, julieee22, malfunct, blazeninja3, pookiepew, xxMiabellexx, Rlchibi
Obrigado a todos que ajudaram a transformar o Comfy.JS em um módulo de navegador!
Instafluff, Instafriend, ChatTranslator, Gilokk0, qbotv3, That_MS_Gamer, KitAnnLIVE, simrose4u, MacabreMan2, LuRiMer313, sparky_pugwash, AbbyFabby, sethorizer, julieee22, Numb3rY, Jwh1o1, baileydale, kevkab, Stay_Hydrated_Bot, DrJavaSaurus, teste de estresse, BungalowGlow, Dr_Zero, NiteCrawla, fd_god92, DrEriksen, codeheir, Talk2meGooseman, sneelps, cottonsmiles, DutchGamer46, LilyHazel, Kyoslilmonster, guthron, DragosNox, sciondragons, HonestDanGames, Xynal, MerlinLeWizard, FablesGames, BrainoidGames, donaldwm, Gharrotey, RIKACHET, HeyOhKei, DevMerlin, CrimsonKnightZero, ellie_pop, ItsNaomiArt, SomaPills, TheSabbyLife, bktdakid31, IsaisChannel, thegooseofwild, itsDeke, bubblesandunicorns, jellydance, MalForTheWin, Chibigirl24, Pearcington, RikuRinku, rockysenpai24, DEAD_P1XL, codeaurora, EndlessMoonfall, fromtheannex, Optik_Nerve, qerwtr546, REAZNxxx, GoonPontoon, JesseSkinner, roberttables, pookiepew, Lannonbr, SoG_Cuicui, Deitypotato, shalomhanukkahbneishimon, UpmostKek, xeiu, skatesubzero, kingswerv, K1ng440, Kaisuke, Kinbiko, malfunct, BooobieTrap, Kara_Kim
Obrigado a todos que participaram da adição do suporte do Twitch PubSub para resgates de recompensas de pontos do canal ao Comfy.JS!
Instafluff, Instafriend, informathemusic, aRandomTim, tonsofpixie, That_MS_Gamer, ToeNeeHee, httpJunkie, ryanchetty_1, calguru, chrislocality, Atanerah, rekaj3773, moshiko777, fizhes, AnnaCodes, Smokestormx, TheGeekGeneration, SavenaV, KotaKlan, rosebutterfly24, Simpathey, Spationaute, DjDesidera, JupiterZky, judybelle1, Shaezonai, shineslove, airsickmammal, walaber, jellydance, LilyHazel, PainArtist, Nickloop_TTV, VerbatimStudios, silversurfer1989, BellaTriXrbsa, Holloway87, Asherroth86, Tiwesday, not_your_point, JenDevelops, tenaciousw, Cuicui_off, stevis5, aranhawaii, DevMerlin, wabes1, jeckle, opti_21, sparky_pugwash, tommunist_64, DutchGamer46, DoctorArgus, simrose4u, DreamGardenPanda, onelineofme, stuyksoft, Sployed, JustinZedly, Rhedone, DrMikachu, Gurkenkater, MrDemonWolf, saltipretzelz, MerlinLeWizard, Kurokirisu, Juscekame, FuriousFur, andresurrego, MissNightcrawler, karatewump, DrillsKibo, florinpop17, Axell99Design, Ahmed_Riad_1, Keegan_GDiegen, PortaalGaming, mjewl, cheppy4444dude, Soccerdude4444, klforthwind, penguinian, 10TenArt, Atndesign, DNIStream, LoveSudoNimh, prosto_artem27, lucasnramos, A_Ninja_For_Jesus_Bruh, RedChrisMS, Lineyatronic, Totte292, A_Gold_Fish, ShiDotMoe, tbdgamer, MatthewDGroves, dota2attitude, mistersyntax, SekaCakes, llamakid29, CryptoCoyote, MurdocTurner, JeanValjean80, walpolea, Jessi8712, butschibuuuu, Cmiley6, TheFlamingWings, hehe24h, cryogen_sw, DrJavaSaurus, rota22_, julieee22, bronick16, ScrtSolstice, ghostlupo86, wake_the_beast, williamcameron2, GizmoPugLife, OG24com