This repo contains the code for https://twitch.discord.barrycarlyon.co.uk, a Twitch Go Live Notification System for Discord
It's written in NodeJS
It uses the following API reference documentation
- Twitch OAuth authorization code flow for Authentication
- Twitch Eventsub for Channel/Stream Notifications
- Discord oAuth2 for Discord webhook Setup and Login
- Discord Webhooks for talking to Webhooks
This system uses MySQL as a Database backend and Redis for session handling and message brokering between the two services
-
Import
sql/barrys_discord_twitch.sql
to your MySQL database -
Copy
.env.sample
to.env
-
Revise the settings within, for your Discord Application and Twitch Applications.
-
Revise that database access settings
-
Make sure to update the URLs, and Twitch EventSub
-
npm install
It's expected to your PM2 as a process manager. So you can either use PM2 or run the two jobs another way
- pm2 start app.json
or start the two jobs manually
- node server.js
- node utils/runner.js
You can use the Twitch-cli to test your Eventsub callback see https://github.com/twitchdev/twitch-cli/ and look under Events
Example:
twitch event verify-subscription stream.online -s "THESECRETISCOOL" -F "https://twitch.discord.barrycarlyon.co.uk/eventsub/"
You would naturally swap the URL to the URL for your instance of the project.
This project is Licensed under DO WHAT THE FUCK YOU WANT Image/logo assets remain the property/licensing of their resepective owners
Thank you for the help I want to give you beer/coffee money -> Check the Funding/Sponsor details
This is an example, so doesn't contain all the best security practices.
Since this uses cookies to manage logins you should change the session code to something like.
And the paired app.user
to sanity check/enforce the right domain for cookies to behave
app.use(session({
store: new RedisStore({
client: redis_client
}),
secret,
resave: true,
saveUninitialized: false,
cookie: {
secure: true,
httpOnly: true,
domain: config.server.domain
},
rolling: true
}));
app.use((req, res, next) => {
if (req.hostname != config.server.domain) {
res.redirect(`https://${config.server.domain}/${req.originalUrl}`);
return;
}
Change the domain as needed!
See also Production Best Practices: Security
If you are putting this nodeJS HTTP server beind NGINX, your NGINX declartion for the location will need additional fields:
server {
listen IPv4:443;
listen [::]:443;
server_name example.com;
root /some/path/to/files;
ssl on;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
# Cookie Flags
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Cookie Flags
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
# Other
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://this_server_relay;
}
}
upstream this_server_relay {
server 127.0.0.1:5000;
keepalive 8;
}