quit event, join event now fires only once in a while for the same player

This commit is contained in:
smsteel 2019-02-08 18:29:45 +03:00
parent a58e01f7e5
commit 387ee4cb43
5 changed files with 59 additions and 46 deletions

29
bot.js
View File

@ -1,5 +1,5 @@
import Telegraf from 'telegraf' import Telegraf from 'telegraf'
import { saveChat, getChats } from './database' import { saveChat, getChats, saveLogout, getLastLogoutTime } from './database'
import { import {
TYPE_JOIN, TYPE_DEATH, DEATH_TYPE_CONTACT, DEATH_TYPE_BLOCK_EXPLOSION, DEATH_TYPE_ENTITY_ATTACK, 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, 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_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_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_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' } from './types'
import { currentTime } from './utility'
const bot = new Telegraf('643297173:AAGuqfZx3GhiiARwvY7AtWTTFw1T-2FiwCM') const bot = new Telegraf('643297173:AAGuqfZx3GhiiARwvY7AtWTTFw1T-2FiwCM')
bot.start(({ message: { chat: { id } } }) => saveChat(id)) bot.start(({ message: { chat: { id } } }) => saveChat(id))
bot.launch() bot.launch()
const sendMessageToAll = text => { const sendMessageToAll = text => getChats()
getChats() .then(chats => chats.map(({ chatId }) => chatId)
.then(chats => chats.map(({ chatId }) => chatId)) .forEach(chatId => bot.telegram.sendMessage(chatId, text))
.then(chatIds => { )
for (let id of chatIds) {
bot.telegram.sendMessage(id, text)
}
})
}
const getEntityDeathMessage = payload => { const getEntityDeathMessage = payload => {
switch (payload.deathType) { switch (payload.deathType) {
@ -84,14 +80,21 @@ const getEntityDeathMessage = payload => {
} }
} }
const JOIN_NOTIFICATION_LIMIT = 60 * 60 // 1h
export const sendEvent = ({ type, ...payload }) => { export const sendEvent = ({ type, ...payload }) => {
switch (type) { switch (type) {
case TYPE_JOIN: 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 break
case TYPE_DEATH: case TYPE_DEATH:
console.log({ payload }) console.log({ payload })
sendMessageToAll(`Игрок ${payload.displayName} ${getEntityDeathMessage(payload)}. Убийца: ${payload.killerName}`) sendMessageToAll(`Игрок ${payload.displayName} ${getEntityDeathMessage(payload)} :(`)
break break
} }
} }

View File

@ -1,4 +1,5 @@
import sqlite from 'sqlite3' import sqlite from 'sqlite3'
import { currentTime } from './utility'
const db = new sqlite.Database('bot.db') const db = new sqlite.Database('bot.db')
db.run( db.run(
@ -7,20 +8,25 @@ db.run(
UNIQUE(chatId) UNIQUE(chatId)
)`) )`)
export const saveChat = id => { db.run(
return new Promise((resolve, reject) => { `CREATE TABLE IF NOT EXISTS logouts (
db.run(`INSERT OR IGNORE INTO chats (chatId) VALUES (?)`, [ id ], (err) => { displayName INTEGER,
lastLogoutTime DATETIME,
UNIQUE(displayName)
)`)
const run = (sql, params) => new Promise((resolve, reject) => {
db.run(sql, params, (err) => {
if (err) { if (err) {
reject(err) reject(err)
} else { } else {
resolve({ id }) resolve()
} }
}) })
}) })
}
export const getChats = () => { export const saveChat = id => run(`INSERT OR IGNORE INTO chats (chatId) VALUES (?)`, [ id ])
return new Promise((resolve, reject) => { export const getChats = () => new Promise((resolve, reject) => {
db.all('SELECT * FROM chats', [], (err, rows) => { db.all('SELECT * FROM chats', [], (err, rows) => {
if (err) { if (err) {
reject(err) reject(err)
@ -28,5 +34,19 @@ export const getChats = () => {
resolve(rows) 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)
}
}) })
} })

12
main.js
View File

@ -1,18 +1,6 @@
import express from 'express' import express from 'express'
import { sendEvent } from './bot' 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() const web = express()
web.use(express.json()) web.use(express.json())

View File

@ -1,4 +1,5 @@
export const TYPE_JOIN = 'join' export const TYPE_JOIN = 'join'
export const TYPE_QUIT = 'quit'
export const TYPE_DEATH = 'death' export const TYPE_DEATH = 'death'
/** /**

1
utility.js Normal file
View File

@ -0,0 +1 @@
export const currentTime = () => Math.round(new Date().getTime() / 1000)