quit event, join event now fires only once in a while for the same player
This commit is contained in:
parent
a58e01f7e5
commit
387ee4cb43
29
bot.js
29
bot.js
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
38
database.js
38
database.js
@ -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
12
main.js
@ -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())
|
||||||
|
1
types.js
1
types.js
@ -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
1
utility.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export const currentTime = () => Math.round(new Date().getTime() / 1000)
|
Loading…
x
Reference in New Issue
Block a user