import Telegraf from 'telegraf' import TelegrafExtra from 'telegraf/extra' import { saveChat, getChats, saveLogoutTime, getLastLogoutTime, saveKillCount, getKillCount, saveLevelUp, getLevelUpCount, saveLevel, setOnlineState, setOfflineState, getPlayersData, getAllKills } from './database' import { 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, getKillNotificationEachKillsCount } from './data' import stringTable from 'string-table' const bot = new Telegraf('643297173:AAGuqfZx3GhiiARwvY7AtWTTFw1T-2FiwCM') const markdown = TelegrafExtra.markdown() const formattedStringTable = data => stringTable.create(data) .split('\n') .map(line => `\`\`\`${line.slice(0, -1)}\`\`\``) .join('\n') bot.start(({ message: { chat: { id } } }) => saveChat(id)) bot.command( 'players', ({ replyWithMarkdown }) => getPlayersData() .then(playersData => replyWithMarkdown( formattedStringTable( playersData.map(({ displayName, level, online }) => ({ 'имя': `👤 ${displayName}`, 'уровень': level, 'статус': `${online ? '✅ онлайн' : '❔ оффлайн'}` })) ) )) ) bot.hears( /^\/kills[ =](.+)$/, ctx => getAllKills(ctx.match[1]) .then(allKills => { console.log(allKills) if (!allKills) { ctx.reply('Не найдено') return } ctx.replyWithMarkdown( formattedStringTable( allKills.map(kills => ({ 'монстр': getEntityName(kills.entityName), 'убийств': kills.killCount })) ) ) }) ) bot.launch() const sendMessageToAll = text => getChats() .then(chats => chats.map(({ chatId }) => chatId) .forEach(chatId => bot.telegram.sendMessage(chatId, text, markdown)) ) const JOIN_NOTIFICATION_TIME_DELTA = 60 * 60 // 1h const LEVEL_NOFIFICATION_EACH_LEVELS = 5 export const sendEvent = ({ type, displayName, ...payload }) => { switch (type) { case EVENT_TYPE_JOIN: setOnlineState(displayName) getLastLogoutTime(displayName) .then(lastLogoutTime => lastLogoutTime < currentTime() - JOIN_NOTIFICATION_TIME_DELTA && sendMessageToAll(`👤 *${displayName}* присоединился 😼`)) break case EVENT_TYPE_QUIT: setOfflineState(displayName) saveLogoutTime(displayName) break case EVENT_TYPE_DEATH: sendMessageToAll(`👤 *${displayName}* ☠️ ${getEntityDeathMessage(payload)} ☠️`) break case EVENT_TYPE_PLAYER_LEVEL_CHANGE: const { newLevel, oldLevel } = payload saveLevel(displayName, newLevel) if (newLevel < oldLevel) { return } const levelUpCount = getLevelUpCount(displayName) if (newLevel % LEVEL_NOFIFICATION_EACH_LEVELS === 0 && levelUpCount >= LEVEL_NOFIFICATION_EACH_LEVELS ) { sendMessageToAll(`👤 *${displayName}* теперь уровня *${newLevel}* 👍`) saveLevelUp(displayName, 0) } else { saveLevelUp(displayName, levelUpCount + 1) } break case EVENT_TYPE_PLAYER_KILLED_ENTITY: getKillCount(displayName, payload.entityName) .then(killCount => { const newKillCount = killCount + 1 saveKillCount(displayName, payload.entityName, newKillCount) if (newKillCount % getKillNotificationEachKillsCount(payload) === 0) { sendMessageToAll(`👤 *${displayName}* 👻 VS 👻 *${getEntityName(payload)}*. Убито ещё ${getKillNotificationEachKillsCount(payload)}! Всего: ${newKillCount} 👍`) } }) break } }