Twitch Bot – Juego inactivo: introducción y configuración

Twitch

Juego inactivo de Twitch Bot: introducción y configuración

Configuración de un bot de Twitch que ejecuta un juego inactivo simple como Cookie Clicker.


Introducción

La pila de tecnología para esto:

  • NodoJS
  • Redis y su paquete redis NPM asociado
  • tmi.js para interactuar con el chat de Twitch
  • toro para hacer cola en las interacciones con Redis
  • SQLite para almacenamiento de base de datos
  • Secuela para interactuar con SQLite
  • Programación orientada a objetos para hacer el código más ordenado

Este tutorial está destinado a programadores de nivel intermedio o superior. Asumirá que sabe cómo instalar Node,

Redis, etc., en su computadora y también cómo configurar un proyecto de Node. ¡Ahora comencemos!

Un juego inactivo es aquel en el que realizas una determinada acción, como hacer clic en algo, hasta que acumulas suficientes puntos para comprar cosas que hacen la acción por ti. Un par de ejemplos populares son Cookie Clicker y Adventure Capitalist.

El bot que estamos creando aquí acumulará puntos cuanto más tiempo esté un usuario en un canal de Twitch, y les permitirá comprar actualizaciones que acumulan aún más puntos para ellos. El usuario puede comprar múltiples niveles de cada actualización, lo que aumenta la cantidad de puntos que obtiene. Las actualizaciones son específicas del canal. Esto significa que puede tener 5 niveles de actualización en el canal A, 3 niveles de actualización en el canal B, y así sucesivamente.

Los puntos se ganan en un cierto intervalo, el valor predeterminado es de 10 segundos. Cada 10 segundos, el usuario obtiene 1 punto más los puntos obtenidos de sus actualizaciones.

Los datos sobre los usuarios, sus puntos y las actualizaciones que compraron se almacenarán en Redis. Los puntos se almacenan en claves del formato list:channel:username , mientras que las actualizaciones están en hashes del formato list:channel:username:upgrades .

Configuración de carpetas

Cree la carpeta e inicie el proyecto Node (mkdir twitch-idle; npm init, etc.) y ejecútelo para instalar los módulos Node necesarios:

Cree un archivo config.json para el siguiente paso.

Configuración de la cuenta de Twitch

Regístrese con una cuenta de Twitch si aún no tiene una. Para este tutorial usaré mi cuenta de Twitch, shawntc. El paquete Node que usará para interactuar con el chat de Twitch usa IRC, por lo que deberá crear un token OAuth. Vaya a https://twitchapps.com/tmi/, presione Conectar y realice el proceso rápido para obtener su token OAuth.

En config.json, ingrese su nombre de usuario, token de OAuth y el canal en el que probará (¡preferiblemente el suyo propio!) allí:

{
"username": "shawntc",
"password": "oauth:xxxxxxxxxxxxxxxxxxxxx",
"channels": ["shawntc"]
}

Conectar y ejecutar

En index.js, hacemos la conexión con el sistema de chat de Twitch y verificamos que estamos conectados por consola registrando todo lo que se envía en el canal.

const tmi = require('tmi.js');
const {username, password, channels} = require('./config.json');const client = new Client({
    options: {
        debug: true,
        messagesLogLevel: 'info'
    },
    connection: {
        reconnect: true,
        secure: true
    },
    identity: {
        username,
        password
    },
    channels
});try {
    client.connect();
} catch (ex) {
    console.log('Problem connecting: ', ex);
}client.on('message', (channel, tags, message, self) => {
    console.log(channel, message);
});

Al iniciar el script, la consola dirá lo siguiente:

[20:35] info: Connecting to irc-ws.chat.twitch.tv on port 443..
[20:35] info: Sending authentication to server..
[20:35] info: Connected to server.
[20:35] info: Executing command: JOIN #shawntc
[20:35] info: Joined #shawntc

Esto indica que la conexión funcionó. Ahora abra el canal en el sitio web/aplicación de Twitch y diga algo. Si la conexión es buena, se repetirá en la consola:

[20:36] info: [#shawntc] <shawntc>: this works!
#shawntc this works!

Configuración de la base de datos

Para este proyecto, solo tenemos una tabla, que describe las actualizaciones disponibles. En su editor de SQLite preferido, cree una base de datos llamada idle.sqlite y ejecute este comando:

CREAR actualización de TABLA (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, cost INTEGER, points INTEGER);

Luego llene la tabla. En aras de la simplicidad, este tutorial solo tiene 3 actualizaciones. ¡Puedes agregar el tuyo!

INSERT INTO upgrade (name, cost, points) VALUES 
("1 Extra Point", 10, 1), 
("10 Extra Points", 100, 10), 
("100 Extra Points", 1000, 100);

el cost es cuántos puntos se necesitan para comprar la actualización, y los points son cuántos puntos agrega al usuario por intervalo de tiempo.

Usaremos Sequelize para interactuar con la base de datos. Cree un archivo llamado database.js y agregue este código. Se conecta a la base de datos y define la tabla de actualización:

const {Sequelize} = require('sequelize');
const db = new Sequelize({
    dialect: 'sqlite',
    storage: __dirname + '/idle.sqlite'
});const Upgrade = db.define('upgrade', {
    id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true
    },
    name: Sequelize.STRING,
    cost: Sequelize.INTEGER,
    points: Sequelize.INTEGER,
}, {
    freezeTableName: true,
    timestamps: false
});

Tenga en cuenta que el archivo actualmente carece de exportaciones. Esto se debe a que, en el futuro, escribiremos un objeto que interactúe con la base de datos y, en su lugar, lo exportaremos.

En la siguiente sección, escribiremos el código para obtener la lista de personas en el chat y ponerlas en Redis. Afectará a varios archivos, por lo que si no está utilizando Git u otro sistema de control de versiones, lo recomiendo encarecidamente.

Así es como debería verse el código en este punto:

{
    "username": "shawntc",
    "password": "oauth:xxxxxxxxxxxxx",
    "channels": ["shawntc"]
}
const {Sequelize} = require('sequelize');
const db = new Sequelize({
    dialect: 'sqlite',
    storage: __dirname + '/idle.sqlite'
});

const Upgrade = db.define('upgrade', {
    id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true
    },
    name: Sequelize.STRING,
    cost: Sequelize.INTEGER,
    points: Sequelize.INTEGER
}, {
    freezeTableName: true,
    timestamps: false
});
const tmi = require('tmi.js');
const {username, password, channels} = require('./config.json');

const client = new tmi.Client({
    options: {
        debug: true,
        messagesLogLevel: 'info'
    },
    connection: {
        reconnect: true,
        secure: true
    },
    identity: {
        username, password
    },
    channels
});

try {
    client.connect();
} catch (ex) {
    console.log('Problem connecting:', ex);
}

client.on('message', (channel, tags, message, self) => {
    console.log(channel, message);
});

Si le interesa, puede echar un vistazo a algunos de los otros artículos que he escrito recientemente sobre Laravel:

Recent Post