
Security News
Deno 2.2 Improves Dependency Management and Expands Node.js Compatibility
Deno 2.2 enhances Node.js compatibility, improves dependency management, adds OpenTelemetry support, and expands linting and task automation for developers.
We built this Comfy Twitch Chat Module live on Twitch for Coding Cafe!
Special Thanks: Comfy.JS is possible thanks to tmi.js maintained by @AlcaDesign
Comfy.JS lets you integrate with Twitch chat for your Twitch channel SUPER EASILY in just a few lines of code. Here's a quick 3-min video on how to use it: (Click image to open video)
Like these projects? The best way to support my open-source projects is by becoming a Comfy Sponsor on GitHub!
Come and hang out with us at the Comfiest Corner on Twitch!
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
from the dist
folder or include from the JSDelivr CDN:<script src="comfy.min.js"></script>
OR
<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>
Currently, the flags possible in onCommand()
and onChat()
are:
Currently, the extra
parameter for the onCommand()
contains the following fields:
If the message is a command, the extra
parameter will contain an additional field:
which contains the information on the time periods in ms
since the last time any user, or the specific user, has used the same
command. This field can be convenient to be used for setting global cooldown or spamming filters. See examples below:
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`
);
}
}
}
You can read chat messages by using the onChat()
handler
ComfyJS.onChat = ( user, message, flags, self, extra ) => {
console.log( user, message );
}
Sending Chat Messages can be done through ComfyJS.Say( message )
but requires an OAUTH password when connecting to chat.
dotenv
npm install dotenv --save
.env
that looks like this: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 );
You can join a different channel or groups of channels by specifying in the Init()
ComfyJS.Init( "MyTwitchChannel", null, "ChannelToJoin" );
ComfyJS.Init( "MyTwitchChannel", null, [ "ChannelA", "ChannelB", "ChannelC" ] );
Channel Point Reward Redemptions require extra Twitch OAuth permission scopes (and must be the OAuth of the channel owner!)
You can use this tool: https://twitchapps.com/tokengen/
Scopes: channel:manage:redemptions channel:read:redemptions user:read:email chat:edit chat:read
Instafluff's Scopes List: user:read:email user:read:chat chat:edit chat:read user:read:whispers user:manage:whispers channel:read:redemptions channel:read:hype_train channel:read:ads channel:read:charity channel:read:goals channel:read:guest_star channel:read:polls channel:read:predictions moderator:read:chatters moderator:read:followers user:write:chat channel:manage:redemptions moderator:manage:shoutouts channel:manage:polls channel:manage:predictions channel:manage:broadcast channel:manage:raids moderator:manage:announcements moderator:manage:automod moderator:manage:banned_users moderator:manage:chat_messages clips:edit
ComfyJS.onReward = ( user, reward, cost, message, extra ) => {
console.log( user + " redeemed " + reward + " for " + cost );
}
Comfy.JS includes functions to manage Channel Point Rewards. These functions require the ClientID used in getting the Twitch OAuth password for the channel.
( 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 );
You can disconnect from the server and all channels by using Disconnect()
.
ComfyJS.Disconnect();
( user, command, message, flags, extra )
( user, message, flags, self, extra )
( user, message, flags, self, extra )
user:read:whispers
, user:manage:whispers
( 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 )
( "begin" | "progress" | "end", level, progressToNextLevel, goalToNextLevel, totalHype, timeRemainingInMS, extra )
channel:read:hype_train
( channelDisplayName, viewerCount, timeRemainingInMS, extra )
moderator:read:shoutouts
, moderator:manage:shoutouts
( "begin" | "progress" | "end", title, choices, votes, timeRemainingInMS, extra )
channel:read:polls
, channel:manage:polls
( "begin" | "progress" | "lock" | "end", title, outcomes, topPredictors, timeRemainingInMS, extra )
channel:read:predictions
, channel:manage:predictions
( address, port, isFirstConnect )
( reconnectCount )
( error )
Thank you to all the participants of this project!
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
Thank you to everyone that helped in turning Comfy.JS into a browser module!
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, malfunct, BooobieTrap, Kara_Kim
Thanks to everyone who joined in on adding Twitch PubSub support for Channel Point Reward Redemptions to Comfy.JS!
Instafluff, Instafriend, informathemusic, aRandomTim, shadesofpixie, 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, 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
FAQs
Twitch-Integrated Bot Module for Coding Cafe
The npm package comfy.js receives a total of 72 weekly downloads. As such, comfy.js popularity was classified as not popular.
We found that comfy.js demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Deno 2.2 enhances Node.js compatibility, improves dependency management, adds OpenTelemetry support, and expands linting and task automation for developers.
Security News
React's CRA deprecation announcement sparked community criticism over framework recommendations, leading to quick updates acknowledging build tools like Vite as valid alternatives.
Security News
Ransomware payment rates hit an all-time low in 2024 as law enforcement crackdowns, stronger defenses, and shifting policies make attacks riskier and less profitable.