import sqlite from 'sqlite3' import { currentTime } from './utility' const db = new sqlite.Database('bot.db') db.run( `CREATE TABLE IF NOT EXISTS chats ( chatId INTEGER, UNIQUE(chatId) )`) db.run( `CREATE TABLE IF NOT EXISTS playerLogouts ( displayName STRING, lastLogoutTime DATETIME, UNIQUE(displayName) )`) db.run( `CREATE TABLE IF NOT EXISTS playerKills ( displayName STRING, entityName STRING, killCount INTEGER, UNIQUE(displayName, entityName) )`) db.run( `CREATE TABLE IF NOT EXISTS levelUps ( displayName STRING, levelUpCount INTEGER DEFAULT 0, UNIQUE(displayName) )`) db.run( `CREATE TABLE IF NOT EXISTS playerData ( displayName STRING, level INTEGER DEFAULT 0, online INTEGER DEFAULT 0, UNIQUE(displayName) )` ) const run = (sql, params) => new Promise((resolve, reject) => { db.run(sql, params, (err) => { if (err) { reject(err) } else { resolve() } }) }) const get = (sql, params, column, defaultParam = null) => new Promise((resolve, reject) => { db.get(sql, params, (err, row) => { if (err) { reject(err) } else { resolve(row ? row[column] : defaultParam) } }) }) const all = (sql, params = [], defaultParam = null) => new Promise((resolve, reject) => { db.all(sql, params, (err, rows) => { if (err) { reject(err) } else { resolve(rows.length ? rows : defaultParam) } }) }) export const saveChat = id => run(`INSERT OR IGNORE INTO chats (chatId) VALUES (?)`, [ id ]) export const getChats = () => all('SELECT * FROM chats') export const saveLogoutTime = displayName => run( `INSERT OR REPLACE INTO playerLogouts (displayName, lastLogoutTime) VALUES (?, ?)`, [ displayName, currentTime() ] ) export const getLastLogoutTime = displayName => get( `SELECT lastLogoutTime FROM playerLogouts WHERE displayName = ?`, [ displayName ], 'lastLogoutTime', null ) export const saveKillCount = (displayName, entityName, killCount) => run( `INSERT OR REPLACE INTO playerKills (displayName, entityName, killCount) VALUES (?, ?, ?)`, [ displayName, entityName, killCount ] ) export const getKillCount = (displayName, entityName) => get( `SELECT killCount FROM playerKills WHERE displayName = ? AND entityName = ?`, [ displayName, entityName ], 'killCount', 0 ) export const getAllKills = displayName => all('SELECT * FROM playerKills WHERE displayName = ?', [ displayName ]) export const saveLevelUp = (displayName, levelUpCount) => run( `INSERT OR REPLACE INTO levelUps (displayName, levelUpCount) VALUES (?, ?)`, [ displayName, levelUpCount ] ) export const getLevelUpCount = displayName => get( `SELECT levelUpCount FROM levelUps WHERE displayName = ?`, [ displayName ], 'levelUpCount', 0 ) export const saveLevel = (displayName, newLevel) => run( `INSERT OR REPLACE INTO playerData (displayName, level, online) VALUES (?, ?, 1)`, [ displayName, newLevel ] ) export const setOnlineState = displayName => run( `UPDATE playerData SET online = 1 WHERE displayName = ?`, [ displayName ] ) export const setOfflineState = displayName => run( `UPDATE playerData SET online = 0 WHERE displayName = ?`, [ displayName ] ) export const getPlayersData = () => all('SELECT * FROM playerData ORDER BY online DESC, displayName ASC')