const express = require("express"); class vk_event { constructor(type, object, group_id, event_id, secret) { this.type = type this.object = object this.group_id = group_id this.event_id = event_id this.secret = secret } } class group { constructor(id, return_str, secret_key) { this.id = id; this.return_str = return_str; this.secret_key = secret_key; } } function getUrl(host, port, ssl_protected = false) { if (ssl_protected == true) { if (port == 443) { return `https://${host}`; } else return `https://${host}:${port}`; } else { if (port == 80) { return `http://${host}`; } else return `http://${host}:${port}`; } } class VkEvent_handler { constructor (eventFunction, check = () => {}) { this.eventFunction = eventFunction; this.check = check; } } defaultHandler = new VkEvent_handler((group_obj, Event) => { console.log('Needs code\n=========='); console.log(`Group: ${group_obj.id}, Event:\ntype: ${Event.type}\ngroup_id: ${Event.group_id}\nevent_id: ${Event.event_id}\nsecret: ${Event.secret}\nobject:`, Event.object); }, () => console.log('[WARNING] You not connect vk event handler: VkEvent_handler')); class server { constructor(groups = [], _event = defaultHandler, host='localhost', port = 80, logger=false) { this.host = host; this.port = port; this.groups = groups; this.logger = Boolean(logger); _event.check(); this._event = _event.eventFunction; this.group_dict = new Object(); for (var index = 0; index < this.groups.length; ++index) { var item = this.groups[index]; this.group_dict[item.id] = item; } } log (event) { if (this.logger) console.log(event); } confirmation_secret (group_obj, Event, getTimeConfiramtor = (group_obj, Event) => true) { // console.log(123); if (Event.secret != group_obj.secret_key) { return "Invalid secret key"; } else if (Event.type == 'confirmation') { return group_obj.return_str; } else { if ( !getTimeConfiramtor(group_obj, Event) ) { // console.log(123); return "Request timeouted"; } else { setTimeout(async () => this._event(group_obj, Event), 10); return 'ok'; } } } start(callback = () => {}, print_serverInfo = console.log) { let app = express(); app.use(express.json()); app.route('/:group_id').post( async (req, res) => { try { var group_id = Number(req.params.group_id); group_id = String(group_id); var POST_DATA = req.body; if (this.group_dict[group_id] !== undefined) { var callback_event = new vk_event( POST_DATA.type, POST_DATA.object, POST_DATA.group_id, POST_DATA.event_id, POST_DATA.secret ); this.log(callback_event); res.send(this.confirmation_secret(this.group_dict[group_id], callback_event)); } else { res.send('group_id failed'); } } catch (err) { console.log(`Raised error: ${err.message}\n======================\n${err.stack}`); res.status(500).send(`Raised error: ${err.message}
\n${err.stack}`); } } ).get(async (req, res) => { res.send('Invalid secret key') }); app.listen(this.port, this.host, (err) => { if (err) { throw err; } else { print_serverInfo(`vk callback server listen in ${getUrl(this.host, this.port)}`); callback(); } }); this.server = app; } } module.exports = { VkEvent: vk_event, Group: group, Server: server, VkEventHandler: VkEvent_handler };