import * as Pusher from 'pusher-js'; import * as dotenv from 'dotenv'; import { LogService } from '../core/LogService' import { MessageMapper } from '../core/MessageMapper'; import { Message } from '../../model/Message'; dotenv.config(); export class EventService { private API_KEY = process.env.PUSHER_API_KEY; private CLUSTER = 'mt1'; private PUSHER_ENDPOINT = 'http://maildots.herokuapp.com/api/v0.4/pusher/auth'; private LOGS = process.env.LOGS; private ACCESS_TOKEN = process.env.ACCOUNT_TOKEN; private BOT_TOKEN = process.env.BOT_TOKEN; private BOT_CHANNEL = process.env.BOT_CHANNEL; private BOT_ADDRESS = process.env.BOT_ADDRESS; private BOT_ACCOUNT_CHANNEL = process.env.BOT_ACCOUNT_CHANNEL; private event: Pusher.Pusher; private messaging: Pusher.Pusher; private logService: LogService; constructor() { this.event = new Pusher(this.API_KEY, { cluster: this.CLUSTER, authEndpoint: this.PUSHER_ENDPOINT, auth: { params: { 'access_token': this.ACCESS_TOKEN, 'bot_token': this.BOT_TOKEN } } }) this.messaging = new Pusher(this.API_KEY, { cluster: this.CLUSTER, authEndpoint: this.PUSHER_ENDPOINT, auth: { params: { 'access_token': this.ACCESS_TOKEN } } }) if (this.LOGS && this.LOGS === 'true') { this.logService = LogService.getInstance(); } } onNewEvent(callback: (data: any) => void): void { let channel = this.event.subscribe(this.BOT_CHANNEL) channel.bind('new-event', async (data: any) => { if (data.event === 'onInstall' && data.data === 'true') { if (this.LOGS && this.LOGS === 'true') { await this.saveAccount(data); } } callback(this.buildEventData(data)); }); } onNewMessage(callback: (message: Message) => void): void { let channel = this.messaging.subscribe(this.BOT_ACCOUNT_CHANNEL) channel.bind('new-message', async (message: any) => { if (this.LOGS && this.LOGS === 'true') { let bd = await this.logService.saveMessage(message, this.BOT_ADDRESS); } let mapper = new MessageMapper() callback(mapper.toMessage(message)); }); } //TODO: CHECK JSON FORMAT private async saveAccount(data: any): Promise { let account = await this.logService.findAccount(data.account_address); if (!account) { await this.logService.saveAccount(data); } } private buildEventData(data: any) { let e = {} if (data.event === 'onInstall') { if (data.data === 'true') { e = { event: data.event, accountAddress: data.account_address } } else { e = { event: 'onUninstall', accountAddress: data.account_address } } } else { e = data; } return e; } }