level up fix

This commit is contained in:
smsteel
2019-02-09 20:15:43 +03:00
parent bdc2663018
commit 919257e2f0
4 changed files with 191 additions and 87 deletions

98
bot.js
View File

@ -1,15 +1,10 @@
import Telegraf from 'telegraf'
import { saveChat, getChats, saveLogout, getLastLogoutTime } from './database'
import { saveChat, getChats, saveLogout, getLastLogoutTime, saveKillCount, getKillCount } 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,
DEATH_TYPE_FIRE_TICK, DEATH_TYPE_SUFFOCATION, DEATH_TYPE_MELTING, DEATH_TYPE_LAVA, DEATH_TYPE_DROWNING,
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, TYPE_QUIT
EVENT_TYPE_JOIN, EVENT_TYPE_DEATH, EVENT_TYPE_QUIT, EVENT_TYPE_PLAYER_LEVEL_CHANGE, EVENT_TYPE_PLAYER_KILLED_ENTITY
} from './types'
import { currentTime } from './utility'
import { getEntityDeathMessage, getEntityName } from './ru'
const bot = new Telegraf('643297173:AAGuqfZx3GhiiARwvY7AtWTTFw1T-2FiwCM')
@ -21,79 +16,38 @@ const sendMessageToAll = text => getChats()
.forEach(chatId => bot.telegram.sendMessage(chatId, text))
)
const getEntityDeathMessage = payload => {
switch (payload.deathType) {
case DEATH_TYPE_CONTACT:
return 'умер от соприкосновения'
case DEATH_TYPE_BLOCK_EXPLOSION:
return 'взорвался'
case DEATH_TYPE_ENTITY_ATTACK:
return 'умер от существа'
case DEATH_TYPE_ENTITY_SWEEP_ATTACK:
return 'умер от урона по области'
case DEATH_TYPE_PROJECTILE:
return 'застрелили'
case DEATH_TYPE_SUFFOCATION:
return 'сплющило'
case DEATH_TYPE_FALL:
return 'упал насмерть'
case DEATH_TYPE_FIRE:
return 'сгорел'
case DEATH_TYPE_FIRE_TICK:
return 'умер от ожогов'
case DEATH_TYPE_MELTING:
return 'замерз'
case DEATH_TYPE_LAVA:
return 'от лавы'
case DEATH_TYPE_DROWNING:
return 'утонул'
case DEATH_TYPE_ENTITY_EXPLOSION:
return 'взорван вместе с существом'
case DEATH_TYPE_VOID:
return 'упал в бездну'
case DEATH_TYPE_LIGHTNING:
return 'скончался от удара молнией'
case DEATH_TYPE_SUICIDE:
return 'совершил самоубийство'
case DEATH_TYPE_STARVATION:
return 'скончался от голода'
case DEATH_TYPE_POISON:
return 'умер от яда'
case DEATH_TYPE_MAGIC:
return 'умер от магии'
case DEATH_TYPE_FALLING_BLOCK:
return 'погиб под упавшим блоком'
case DEATH_TYPE_THORNS:
return 'умер от шипов'
case DEATH_TYPE_DRAGON_BREATH:
return 'убит драконом'
case DEATH_TYPE_CUSTOM:
return ''
case DEATH_TYPE_FLY_INTO_WALL:
return 'убил сибя ап стену'
case DEATH_TYPE_HOT_FLOOR:
return 'не увидел, что пол - магма'
case DEATH_TYPE_CRAMMING:
return ''
case DEATH_TYPE_DRYOUT:
return ''
}
}
const JOIN_NOTIFICATION_LIMIT = 60 * 60 // 1h
const JOIN_NOTIFICATION_TIME_DELTA = 60 * 60 // 1h
const LEVEL_NOFIFICATION_EACH_LEVELS = 5
const KILL_NOTIFICATION_EACH_KILLS = 50
export const sendEvent = ({ type, ...payload }) => {
switch (type) {
case TYPE_JOIN:
case EVENT_TYPE_JOIN:
getLastLogoutTime(payload.displayName)
.then(lastLogoutTime => lastLogoutTime < currentTime() - JOIN_NOTIFICATION_LIMIT &&
.then(lastLogoutTime => lastLogoutTime < currentTime() - JOIN_NOTIFICATION_TIME_DELTA &&
sendMessageToAll(`Игрок ${payload.displayName} присоединился!`))
break
case TYPE_QUIT:
case EVENT_TYPE_QUIT:
saveLogout(payload.displayName)
break
case TYPE_DEATH:
case EVENT_TYPE_DEATH:
sendMessageToAll(`Игрок ${payload.displayName} ${getEntityDeathMessage(payload)} :(`)
break
case EVENT_TYPE_PLAYER_LEVEL_CHANGE:
const { newLevel } = payload
if (newLevel % LEVEL_NOFIFICATION_EACH_LEVELS === 0) {
sendMessageToAll(`Игрок ${payload.displayName} прокачался до уровня ${newLevel}!`)
}
break
case EVENT_TYPE_PLAYER_KILLED_ENTITY:
getKillCount(payload.displayName, payload.entityName)
.then(killCount => {
const newKillCount = killCount + 1
saveKillCount(payload.displayName, payload.entityName, newKillCount)
if (newKillCount % KILL_NOTIFICATION_EACH_KILLS === 0) {
sendMessageToAll(`${getEntityName(payload)} повержен(а) игроком ${payload.displayName}. Он убил ещё ${KILL_NOTIFICATION_EACH_KILLS}! Всего: ${newKillCount}`)
}
})
break
}
}