From 387ee4cb431e89f03741b8efcb85b59fa27f43ce Mon Sep 17 00:00:00 2001 From: smsteel Date: Fri, 8 Feb 2019 18:29:45 +0300 Subject: [PATCH] quit event, join event now fires only once in a while for the same player --- bot.js | 29 ++++++++++++++----------- database.js | 62 +++++++++++++++++++++++++++++++++++------------------ main.js | 12 ----------- types.js | 1 + utility.js | 1 + 5 files changed, 59 insertions(+), 46 deletions(-) create mode 100644 utility.js diff --git a/bot.js b/bot.js index 2179865..2802296 100644 --- a/bot.js +++ b/bot.js @@ -1,5 +1,5 @@ import Telegraf from 'telegraf' -import { saveChat, getChats } from './database' +import { saveChat, getChats, saveLogout, getLastLogoutTime } from './database' import { TYPE_JOIN, TYPE_DEATH, DEATH_TYPE_CONTACT, DEATH_TYPE_BLOCK_EXPLOSION, DEATH_TYPE_ENTITY_ATTACK, DEATH_TYPE_ENTITY_SWEEP_ATTACK, DEATH_TYPE_PROJECTILE, DEATH_TYPE_FALL, DEATH_TYPE_FIRE, @@ -7,23 +7,19 @@ import { DEATH_TYPE_ENTITY_EXPLOSION, DEATH_TYPE_VOID, DEATH_TYPE_LIGHTNING, DEATH_TYPE_SUICIDE, DEATH_TYPE_STARVATION, DEATH_TYPE_POISON, DEATH_TYPE_MAGIC, DEATH_TYPE_FALLING_BLOCK, DEATH_TYPE_THORNS, DEATH_TYPE_DRAGON_BREATH, DEATH_TYPE_CUSTOM, DEATH_TYPE_HOT_FLOOR, - DEATH_TYPE_FLY_INTO_WALL, DEATH_TYPE_CRAMMING, DEATH_TYPE_DRYOUT + DEATH_TYPE_FLY_INTO_WALL, DEATH_TYPE_CRAMMING, DEATH_TYPE_DRYOUT, TYPE_QUIT } from './types' +import { currentTime } from './utility' const bot = new Telegraf('643297173:AAGuqfZx3GhiiARwvY7AtWTTFw1T-2FiwCM') bot.start(({ message: { chat: { id } } }) => saveChat(id)) bot.launch() -const sendMessageToAll = text => { - getChats() - .then(chats => chats.map(({ chatId }) => chatId)) - .then(chatIds => { - for (let id of chatIds) { - bot.telegram.sendMessage(id, text) - } - }) -} +const sendMessageToAll = text => getChats() + .then(chats => chats.map(({ chatId }) => chatId) + .forEach(chatId => bot.telegram.sendMessage(chatId, text)) + ) const getEntityDeathMessage = payload => { switch (payload.deathType) { @@ -84,14 +80,21 @@ const getEntityDeathMessage = payload => { } } +const JOIN_NOTIFICATION_LIMIT = 60 * 60 // 1h + export const sendEvent = ({ type, ...payload }) => { switch (type) { case TYPE_JOIN: - sendMessageToAll(`Игрок ${payload.displayName} присоединился!`) + getLastLogoutTime(payload.displayName) + .then(lastLogoutTime => lastLogoutTime < currentTime() - JOIN_NOTIFICATION_LIMIT && + sendMessageToAll(`Игрок ${payload.displayName} присоединился!`)) + break + case TYPE_QUIT: + saveLogout(payload.displayName) break case TYPE_DEATH: console.log({ payload }) - sendMessageToAll(`Игрок ${payload.displayName} ${getEntityDeathMessage(payload)}. Убийца: ${payload.killerName}`) + sendMessageToAll(`Игрок ${payload.displayName} ${getEntityDeathMessage(payload)} :(`) break } } diff --git a/database.js b/database.js index efaa006..f86f5cf 100644 --- a/database.js +++ b/database.js @@ -1,4 +1,5 @@ import sqlite from 'sqlite3' +import { currentTime } from './utility' const db = new sqlite.Database('bot.db') db.run( @@ -7,26 +8,45 @@ db.run( UNIQUE(chatId) )`) -export const saveChat = id => { - return new Promise((resolve, reject) => { - db.run(`INSERT OR IGNORE INTO chats (chatId) VALUES (?)`, [ id ], (err) => { - if (err) { - reject(err) - } else { - resolve({ id }) - } - }) - }) -} +db.run( + `CREATE TABLE IF NOT EXISTS logouts ( + displayName INTEGER, + lastLogoutTime DATETIME, + UNIQUE(displayName) + )`) -export const getChats = () => { - return new Promise((resolve, reject) => { - db.all('SELECT * FROM chats', [], (err, rows) => { - if (err) { - reject(err) - } else { - resolve(rows) - } - }) +const run = (sql, params) => new Promise((resolve, reject) => { + db.run(sql, params, (err) => { + if (err) { + reject(err) + } else { + resolve() + } }) -} +}) + +export const saveChat = id => run(`INSERT OR IGNORE INTO chats (chatId) VALUES (?)`, [ id ]) +export const getChats = () => new Promise((resolve, reject) => { + db.all('SELECT * FROM chats', [], (err, rows) => { + if (err) { + reject(err) + } else { + resolve(rows) + } + }) +}) + +export const saveLogout = displayName => run( + `INSERT OR REPLACE INTO logouts (displayName, lastLogoutTime) VALUES (?, ?)`, + [ displayName, currentTime() ] +) +export const getLastLogoutTime = displayName => new Promise((resolve, reject) => { + db.get(`SELECT lastLogoutTime FROM logouts WHERE displayName = ?`, [ displayName ], (err, row) => { + if (err) { + reject(err) + } else { + console.log({ row }) + resolve(row ? row.lastLogoutTime : null) + } + }) +}) diff --git a/main.js b/main.js index 6cb2567..c6a235f 100644 --- a/main.js +++ b/main.js @@ -1,18 +1,6 @@ import express from 'express' import { sendEvent } from './bot' -(function() { - var childProcess = require("child_process"); - var oldSpawn = childProcess.spawn; - function mySpawn() { - console.log('spawn called'); - console.log(arguments); - var result = oldSpawn.apply(this, arguments); - return result; - } - childProcess.spawn = mySpawn; -})(); - const web = express() web.use(express.json()) diff --git a/types.js b/types.js index 58de160..555bd40 100644 --- a/types.js +++ b/types.js @@ -1,4 +1,5 @@ export const TYPE_JOIN = 'join' +export const TYPE_QUIT = 'quit' export const TYPE_DEATH = 'death' /** diff --git a/utility.js b/utility.js new file mode 100644 index 0000000..1ce3ed7 --- /dev/null +++ b/utility.js @@ -0,0 +1 @@ +export const currentTime = () => Math.round(new Date().getTime() / 1000)