Nous avons construit ce module de chat Comfy Twitch en direct sur Twitch pour Coding Cafe !
Remerciements spéciaux : Comfy.JS est possible grâce à tmi.js maintenu par @AlcaDesign
Comfy.JS vous permet d'intégrer le chat Twitch pour votre chaîne Twitch SUPER FACILEMENT en quelques lignes de code. Voici une courte vidéo de 3 minutes expliquant comment l'utiliser : (Cliquez sur l'image pour ouvrir la vidéo)
Vous aimez ces projets ? La meilleure façon de soutenir mes projets open source est de devenir un sponsor Comfy sur GitHub !
https://github.com/sponsors/instafluff
Venez passer du temps avec nous au Comfiest Corner sur 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
à partir du dossier dist
ou incluez-le à partir du CDN JSDelivr : < 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 >
Actuellement, les indicateurs possibles dans onCommand()
et onChat()
sont :
Actuellement, le paramètre extra
pour onCommand()
contient les champs suivants :
Si le message est une commande, le paramètre extra
contiendra un champ supplémentaire :
qui contient les informations sur les périodes en ms
depuis la dernière fois qu'un utilisateur, ou l'utilisateur spécifique, a utilisé la même commande. Ce champ peut être pratique pour définir des filtres de refroidissement globaux ou de spam. Voir les exemples ci-dessous :
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`
) ;
}
}
}
Vous pouvez lire les messages de discussion en utilisant le gestionnaire onChat()
ComfyJS . onChat = ( user , message , flags , self , extra ) => {
console . log ( user , message ) ;
}
L'envoi de messages de discussion peut être effectué via ComfyJS.Say( message )
mais nécessite un mot de passe OAUTH lors de la connexion au chat.
dotenv
npm install dotenv --save
.env
qui ressemble à ceci : 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 ) ;
Vous pouvez rejoindre un autre canal ou un autre groupe de canaux en spécifiant dans Init()
ComfyJS . Init ( "MyTwitchChannel" , null , "ChannelToJoin" ) ;
ComfyJS . Init ( "MyTwitchChannel" , null , [ "ChannelA" , "ChannelB" , "ChannelC" ] ) ;
Les échanges de récompenses de points de chaîne nécessitent des étendues d'autorisation Twitch OAuth supplémentaires (et doivent être l'OAuth du propriétaire de la chaîne !)
Vous pouvez utiliser cet outil : https://twitchapps.com/tokengen/
Portées : 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 comprend des fonctions pour gérer les récompenses Channel Point. Ces fonctions nécessitent le ClientID utilisé pour obtenir le mot de passe Twitch OAuth pour la chaîne.
( 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 ) ;
Vous pouvez vous déconnecter du serveur et de tous les canaux en utilisant 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 )
Merci à tous les participants de ce projet !
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, dysfonctionnement, blazeninja3, pookiepew, xxMiabellexx, Rlchibi
Merci à tous ceux qui ont contribué à transformer Comfy.JS en module de navigateur !
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, stresstest, 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, dysfonctionnement, BooobieTrap, Kara_Kim
Merci à tous ceux qui ont participé à l'ajout de la prise en charge de Twitch PubSub pour les échanges de récompenses de points de chaîne à Comfy.JS !
Instafluff, Instafriend, informathemusic, aRandomTim, nuances de pixie, 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, Simployed, 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, pingouin, 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