La implementacion tecnica de una economia unificada entre tres plataformas es mas accesible de lo que parece. Esta guia cubre la base de datos compartida, como cada plataforma se conecta a ella, y como implementar las transacciones entre plataformas de forma atomica y segura.
Antes de escribir codigo, decide:
-- Usuarios con IDs de las tres plataformas
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
discord_id TEXT UNIQUE,
twitch_login TEXT UNIQUE,
mc_uuid TEXT UNIQUE,
mc_name TEXT,
balance INTEGER DEFAULT 0,
level INTEGER DEFAULT 1,
joined_at DATETIME DEFAULT CURRENT_TIMESTAMP,
last_active DATETIME
);
-- Todas las transacciones de economia
CREATE TABLE ledger (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL REFERENCES users(id),
delta INTEGER NOT NULL, -- positivo=ingreso, negativo=gasto
balance_after INTEGER NOT NULL,
source TEXT NOT NULL, -- 'twitch_watch','discord_chat','mc_vote','purchase','transfer_in','transfer_out'
ref_id TEXT, -- ID externo (clip_id, item_id, etc.)
note TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- Tienda de items
CREATE TABLE shop_items (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
description TEXT,
cost INTEGER NOT NULL,
platform TEXT NOT NULL, -- 'discord','minecraft','twitch'
action TEXT NOT NULL, -- comando a ejecutar al comprar (JSON)
stock INTEGER DEFAULT -1, -- -1 = ilimitado
enabled BOOLEAN DEFAULT 1
);// Express API que todos los bots consultan
import express from 'express';
const app = express();
// GET /users/:id/balance
app.get('/users/:id/balance', async (req, res) => {
const user = await db.get('SELECT balance, level FROM users WHERE id = ?', req.params.id);
res.json(user || { error: 'not_found' });
});
// POST /transactions (transaccion atomica)
app.post('/transactions', async (req, res) => {
const { userId, delta, source, note, refId } = req.body;
await db.run('BEGIN TRANSACTION');
try {
const user = await db.get('SELECT balance FROM users WHERE id = ?', userId);
if (!user) throw new Error('user_not_found');
const newBalance = user.balance + delta;
if (newBalance < 0) throw new Error('insufficient_balance');
await db.run('UPDATE users SET balance = ?, last_active = CURRENT_TIMESTAMP WHERE id = ?', [newBalance, userId]);
await db.run('INSERT INTO ledger (user_id, delta, balance_after, source, ref_id, note) VALUES (?,?,?,?,?,?)',
[userId, delta, newBalance, source, refId, note]);
await db.run('COMMIT');
res.json({ success: true, newBalance });
} catch (err) {
await db.run('ROLLBACK');
res.status(400).json({ error: err.message });
}
});await fetch('/transactions', { method:'POST', body: JSON.stringify({
userId, delta: 10, source: 'twitch_watch', note: '10 min de watch time'
})});
await fetch('/transactions', { method:'POST', body: JSON.stringify({
userId, delta: 5, source: 'discord_chat', note: 'mensaje en #general'
})});
await fetch('/transactions', { method:'POST', body: JSON.stringify({
userId, delta: 100, source: 'mc_vote', note: 'voto en topg.org'
})});
El mayor reto tecnico es vincular a la misma persona en tres plataformas. La estrategia mas robusta:
/vincular-twitch en Discord genera un codigo de verificacion!vincular [codigo] en el chat de Twitch, bot valida y guarda twitch_login/vincular-mc [nick] en Discord + confirmacion in-game vincula MinecraftConecta tu comunidad al ecosistema Twitch+Discord+MC de OliveerF.
Ver Hosting