Initial commit
This commit is contained in:
commit
1706be9cf9
7 changed files with 223 additions and 0 deletions
12
.editorconfig
Normal file
12
.editorconfig
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
node_modules
|
||||||
|
.vscode
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*.DS_Store
|
23
README.md
Normal file
23
README.md
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# Twitch Color Bot
|
||||||
|
|
||||||
|
Setup the following environment variables:
|
||||||
|
|
||||||
|
- `TWITCH_BOT_KEY` (required)
|
||||||
|
- You can generate a key here: https://twitchapps.com/tmi/
|
||||||
|
- `TWITCH_BOT_USERNAME` (required)
|
||||||
|
- `TWITCH_BOT_COLOR_MODE`
|
||||||
|
- Currently supports `random` and `loop`
|
||||||
|
- Random will select a random color with varying hue, saturation, and lightness.
|
||||||
|
- Loop will increment the hue value through the spectrum and loop.
|
||||||
|
- `TWITCH_BOT_INTERVAL`
|
||||||
|
- Time between color changes in seconds. Default 10 seconds.
|
||||||
|
|
||||||
|
## Running locally
|
||||||
|
|
||||||
|
Install dependencies with `yarn install`.
|
||||||
|
|
||||||
|
Run app
|
||||||
|
|
||||||
|
```bash
|
||||||
|
node index.js
|
||||||
|
```
|
15
colorbot.config.js
Normal file
15
colorbot.config.js
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
module.exports = {
|
||||||
|
apps : [
|
||||||
|
{
|
||||||
|
name: "colorbot-twitch",
|
||||||
|
script: "./index.js",
|
||||||
|
watch: true,
|
||||||
|
env: {
|
||||||
|
"TWITCH_BOT_KEY": "",
|
||||||
|
"TWITCH_BOT_USERNAME": "",
|
||||||
|
"TWITCH_BOT_COLOR_MODE": "loop",
|
||||||
|
"TWITCH_BOT_INTERVAL": 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
90
index.js
Normal file
90
index.js
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
const tmi = require("tmi.js");
|
||||||
|
const convert = require("color-convert");
|
||||||
|
const chalk = require("chalk");
|
||||||
|
|
||||||
|
const sleep = (waitTimeInMs) => new Promise(resolve => setTimeout(resolve, waitTimeInMs));
|
||||||
|
|
||||||
|
let hue = 48;
|
||||||
|
let sat = 89;
|
||||||
|
let light = 50;
|
||||||
|
|
||||||
|
let connected = false;
|
||||||
|
|
||||||
|
if (!process.env.TWITCH_BOT_KEY || !process.env.TWITCH_BOT_USERNAME) {
|
||||||
|
console.log(
|
||||||
|
"TWITCH_BOT_KEY and TWITCH_BOT_USERNAME must be available as environment variables"
|
||||||
|
);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const colorMode = process.env.TWITCH_BOT_COLOR_MODE || "loop";
|
||||||
|
|
||||||
|
const client = new tmi.Client({
|
||||||
|
connection: {
|
||||||
|
reconnect: true,
|
||||||
|
secure: true
|
||||||
|
},
|
||||||
|
identity: {
|
||||||
|
username: process.env.TWITCH_BOT_USERNAME,
|
||||||
|
password: process.env.TWITCH_BOT_KEY
|
||||||
|
},
|
||||||
|
channels: [process.env.TWITCH_BOT_USERNAME.toLowerCase()]
|
||||||
|
});
|
||||||
|
|
||||||
|
client.on("connected", onConnected);
|
||||||
|
client.on("disconnected", onDisconnected);
|
||||||
|
|
||||||
|
client.connect();
|
||||||
|
|
||||||
|
function onConnected(addr, port) {
|
||||||
|
console.log(`* Connected to ${addr}:${port}`);
|
||||||
|
|
||||||
|
connected = true;
|
||||||
|
updateColor();
|
||||||
|
}
|
||||||
|
|
||||||
|
function onDisconnected(reason) {
|
||||||
|
console.log(`* Disconnected: ${reason}`);
|
||||||
|
|
||||||
|
connected = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateRandomColor() {
|
||||||
|
hue = Math.floor(Math.random() * 360);
|
||||||
|
sat = 20 + Math.floor(Math.random() * 60);
|
||||||
|
light = 40 + Math.floor(Math.random() * 40);
|
||||||
|
}
|
||||||
|
|
||||||
|
function incrementColorLoop() {
|
||||||
|
if (hue < 351) {
|
||||||
|
hue += 2;
|
||||||
|
} else {
|
||||||
|
hue = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateColor() {
|
||||||
|
if (!connected) {
|
||||||
|
console.log('tried to update color while not connected.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (colorMode === "random") {
|
||||||
|
generateRandomColor();
|
||||||
|
} else {
|
||||||
|
incrementColorLoop();
|
||||||
|
}
|
||||||
|
|
||||||
|
const color = convert.hsl.hex(hue, sat, light);
|
||||||
|
console.log(
|
||||||
|
`* Updating username color to`,
|
||||||
|
chalk.hex(`#${color}`)(`#${color}`)
|
||||||
|
);
|
||||||
|
client.color(`#${color}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const intervalTime = process.env.TWITCH_BOT_INTERVAL * 1000 || 10000;
|
||||||
|
|
||||||
|
interval = setInterval(function () {
|
||||||
|
updateColor();
|
||||||
|
}, intervalTime);
|
15
package.json
Normal file
15
package.json
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
"name": "colorbot-twitch",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"main": "index.js",
|
||||||
|
"author": "Manuel Hüsers",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"chalk": "^4.1.0",
|
||||||
|
"color-convert": "^2.0.1",
|
||||||
|
"tmi.js": "^1.5.0"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"start": "node index.js"
|
||||||
|
}
|
||||||
|
}
|
60
yarn.lock
Normal file
60
yarn.lock
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||||
|
# yarn lockfile v1
|
||||||
|
|
||||||
|
|
||||||
|
ansi-styles@^4.1.0:
|
||||||
|
version "4.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
|
||||||
|
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
|
||||||
|
dependencies:
|
||||||
|
color-convert "^2.0.1"
|
||||||
|
|
||||||
|
chalk@^4.1.0:
|
||||||
|
version "4.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
|
||||||
|
integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==
|
||||||
|
dependencies:
|
||||||
|
ansi-styles "^4.1.0"
|
||||||
|
supports-color "^7.1.0"
|
||||||
|
|
||||||
|
color-convert@^2.0.1:
|
||||||
|
version "2.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
|
||||||
|
integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
|
||||||
|
dependencies:
|
||||||
|
color-name "~1.1.4"
|
||||||
|
|
||||||
|
color-name@~1.1.4:
|
||||||
|
version "1.1.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
|
||||||
|
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
|
||||||
|
|
||||||
|
has-flag@^4.0.0:
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
|
||||||
|
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
|
||||||
|
|
||||||
|
node-fetch@2.6.1:
|
||||||
|
version "2.6.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
|
||||||
|
integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
|
||||||
|
|
||||||
|
supports-color@^7.1.0:
|
||||||
|
version "7.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
|
||||||
|
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
|
||||||
|
dependencies:
|
||||||
|
has-flag "^4.0.0"
|
||||||
|
|
||||||
|
tmi.js@^1.5.0:
|
||||||
|
version "1.7.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/tmi.js/-/tmi.js-1.7.5.tgz#da5ce238b8bb38c01c3c6717b73441b9f1c8ae84"
|
||||||
|
integrity sha512-j3kAnJ8KkWbvwhKhQchleyzZEuPa/5rWdeV7MNBEYEAqGhbZuXR+FfI1QgKphYqUrJ4qFAB3WjHG2YlhGq3PDg==
|
||||||
|
dependencies:
|
||||||
|
node-fetch "2.6.1"
|
||||||
|
ws "7.4.3"
|
||||||
|
|
||||||
|
ws@7.4.3:
|
||||||
|
version "7.4.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.3.tgz#1f9643de34a543b8edb124bdcbc457ae55a6e5cd"
|
||||||
|
integrity sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA==
|
Loading…
Reference in a new issue