commit 03745c32965f4be50ff805ab28a91ee0a5062903 Author: FutureX Date: Thu Jul 22 20:05:59 2021 +0300 Загрузил архивные файлы diff --git a/Procfile b/Procfile new file mode 100644 index 0000000..6c768b6 --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +worker: node starter.js \ No newline at end of file diff --git a/bot.js b/bot.js new file mode 100644 index 0000000..c403287 --- /dev/null +++ b/bot.js @@ -0,0 +1,593 @@ +const DEF_DELAY = 1000; +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms || DEF_DELAY)); +} + +var config = require('./config'); + +var Bot = require('node-telegram-bot-api'); +var bot = new Bot(process.env.TOKEN||config.token, { polling: true }); + +console.log('Бот был запущен'); + +const Courier = require('./curier_api'); +var users = {}; + +bot.onText(/^/, function (msg) { + var id = msg.chat.id; + const args = msg.text.slice("/").trim().split(/ +/g); + const command = args.shift().toLowerCase(); + var text = args.join(" "); + start_answering(id,command,text); +}); + +//Запуск нужной функции +async function launchFunctionByName(data){ + switch(data.name){ + case 'login': + var answer = await command_login(data); + return answer; + break; + case 'relogin': + var answer = await command_relogin(data); + return answer; + break; + case 'relogin_all': + var answer = await command_relogin_all(data); + return answer; + break; + case 'logout': + var answer = await command_logout(data); + return answer; + break; + case 'help': + var answer = await command_help(data); + return answer; + break; + case 'myslots': + var answer = await command_myslots(data); + return answer; + break; + case 'freeslots': + var answer = await command_freeslots(data); + return answer; + break; + case 'orders': + var answer = await command_orders(data); + return answer; + break; + case 'query': + var answer = await command_query(data); + return answer; + break; + case 'reload_bd': + var answer = await command_reload_bd(data); + return answer; + break; + case 'search_point': + var answer = await command_search_point(data); + return answer; + break; + case 'test': + var answer = await command_test(data); + return answer; + break; + case 'newfreeslots': + var answer = await command_newfreeslots(data); + return answer; + break; + default: + return data.answer; + break; + } +} + +//Выполнить операцию с таблицей +async function command_query(data){ + var answer = data.answer; + + var client = await new Client({ + connectionString: process.env.DATABASE_URL, + ssl: { + rejectUnauthorized: false + } + }) + await client.connect() + .catch(e => { + console.error(e); + }) + + try { + var client_answer = await client.query(data.text); + //delete client_answer["builtins"]; + delete client_answer["_types"]; + delete client_answer["fields"]; + delete client_answer["_parsers"]; + delete client_answer["RowCtor"]; + delete client_answer["rowAsArray"]; + delete client_answer["oid"]; + answer += JSON.stringify(client_answer).replace(/{/g,'{\n').replace(/}/g,'\n}').replace(/,/g,',\n') + await client.end(); + } + catch(e){ + console.error(e); + await client.end(); + answer += 'Ошибка запроса' + }; + return answer; +} + +//Получить список всех доступных комманд +function command_help(data){ + var answer = data.answer; + config.commands.forEach(function (values,keys) { + if(values.have_description) + if((values.need_admin==data.is_Admin)||(!values.need_admin)) + if((values.need_auth==data.is_Auth)||(values.show_after_login&&data.is_Auth)) + answer += `\n ${keys} - ${values.description}`; + }); + if(data.is_Admin){ + answer += `\n---------------------- +Команды администратора:`; + config.admin_commands.forEach(function (values,keys) { + if(values.have_description) + if((values.need_auth==data.is_Auth)||(values.show_after_login&&data.is_Auth)) + answer += `\n ${keys} - ${values.description}`; + }); + } + return answer; +} + +//Авторизоваться +async function command_login(data){ + var answer = data.answer; + var dannie = data.text.split("-") + if(dannie.length == 2){ + var new_user_data = { + id: data.id, + username: dannie[0].trim(), + password: dannie[1].trim() + } + var new_user = users[data.id]; + if(!new_user) new_user = new Courier(new_user_data); + else new_user.updateUser(new_user_data); + + if(await new_user.auth()&&await new_user.getInfo()){ + answer = `Вход выполнен успешно +Авторизован: ${new_user.info.name} +`; + var zones = await new_user.getMyZones(); + answer += `Зоны работы: `; + for(var zone in zones) answer += `${zone}; ` + answer += `\n\nДля изменений отслеживаемой зоны работы используйте /setzone`; + } + else + answer = 'Возникла ошибка при авторизации'; + + users[data.id] = new_user; + newUsers.push(new_user.data()); + console.log('Авторизован пользователь id=' + data.id) + } + return answer; +} + +//Список запланнированных слотов +async function command_relogin(data){ + var answer = data.answer; + if(await users[data.id].auth()&&await users[data.id].getInfo()){ + answer += `Авторизован: ${users[data.id].info.name}`; + } + else + answer = `Возникла ошибка :( +Авторизуйтесь заново с помощью команды /login`; + update_users.push(data.id); + return answer; +} + +//Обновить для всех авторизацию +async function command_relogin_all(data){ + var answer = data.answer; + for await(var id of Object.keys(users)){ + if(!await users[id].getInfo()){ + if(await users[id].auth()&&await users[id].getInfo()){ + answer += `Авторизован: ${users[id].info.name}`; + update_users.push(id); + } + else + answer += `Не авторизован: ${users[id].username}`; + answer += `\n` + } + } + if(answer == `Переавторизация\n`) answer = `Все пользователи авторизованы` + return answer; +} + +//Список запланнированных слотов +async function command_logout(data){ + await users[data.id].reset(); + await update_users.push(data.id); + return data.answer; +} + +//Список запланнированных слотов +async function command_myslots(data){ + return await users[data.id].getPlanned(); +} + +//Список свободных слотов +async function command_freeslots(data){ + return await users[data.id].getFreeSlotsWeek(); +} + +//Текущий заказ +async function command_orders(data){ + return await users[data.id].getOrdersText(); +} + +//Список новых слотов +async function command_newfreeslots(data){ + users[data.id].is_waiting = false; + return await users[data.id].getNewFreeSlotsWeek(); +} + +//Перезапуск бд +async function command_reload_bd(data){ + await init_database() + return data.answer; +} + +const fuzzysearch = require('fuzzysearch'); +const levenshtein = require('js-levenshtein'); +//Поиск нужной лавки +async function command_search_point(data){ + var answer; + + if(data.text.length==0) return `Для использования команды введите название лавки после /setzone +Например: /setzone Ветеранов`; + + var names = []; + for(var zone_name in config.points){ + if(data.text.toLowerCase().split(' ').join('') == zone_name.toLowerCase().split(' ').join('')) { + names = [zone_name]; + break; + } + else if(fuzzysearch(data.text.toLowerCase().split(' ').join(''), zone_name.toLowerCase().split(' ').join(''))){ + names.push(zone_name) + } + } + + if(names.length == 1) { + answer = `Выбрана точка: ${names}(${config.points[names]})` + users[data.id].clearZones(); + users[data.id].addZone(config.points[names]); + await update_users.push(data.id); + // console.log(users[data.id]); + } + else if(names.length == 0){ + var minimal = 100; + for(var zone_name in config.points){ + var a = levenshtein(data.text.toLowerCase().split(' ').join(''), zone_name.toLowerCase().split(' ').join('')); + if(a${answer}`; + } else if(answer == '') answer = 'Не найдено сопадений' + else { + answer = `Найденные лавки: +`; + for(var name of names){ + answer+=`${name}\n` + } + } + return answer; +} + +//Тестовая команда +async function command_test(data){ + var answer = data.answer; + + //console.log('Выбрана точка работы: ', await users[data.id].getMainZone()); + + return answer; +} + +//Выбрать канал ответов для сообщения +function start_answering(id,command,text){ + if(!users[id]) + users[id] = new Courier({id:id}); + if(!users[id].is_waiting){ + var command_info = config.commands.get(command)||config.admin_commands.get(command); + if(!command_info) { + bot.sendMessage( id, config.defaulttext.unknown_command); + } + else { + if(command_info.need_api) + messages_wait_Yandex.push({ + id : id, + text : text, + command_info : command_info + }); + else + messages.push({ + id : id, + text : text, + command_info : command_info + }); + } + } + else bot.sendMessage( id, config.defaulttext.need_wait); +} + +setTimeout(() => setInterval(() => start_answering(247608317,'/newfreeslots'), 20000), 5000); + +//Ответ на сообщения не требующие API яндекса +messages = []; +answer_for_messages(); + +async function answer_for_messages(){ + var message = messages.shift(); + while (message) { + var id = message.id; + var command_info = message.command_info; + + var answer = ""; + var buttons = []; + + var user_is_admin = (users[id].mode > 1); + if(command_info.need_admin&&!user_is_admin) + answer = config.defaulttext.need_admin; + else { + var user_is_auth = users[id].checkAuth(); + if(command_info.need_auth&&!user_is_auth) { + answer = config.defaulttext.need_auth; + // buttons = getButtonsByNames(config.defaulttext.need_auth.buttons,id); + } + else { + answer = command_info.answer || 'no_answer'; + // buttons = getButtonsByNames(command_info.buttons,id); + if(command_info.function_name){ + var data = { + name : command_info.function_name, + id : id, + is_Auth : user_is_auth, + is_Admin : user_is_admin, + answer : answer, + text : message.text + } + try { + users[id].is_waiting = true; + answer = await launchFunctionByName(data); + } catch (e) { + console.log(e); + answer = 'Возникла ошибка'; + users[id].is_waiting = false; + } + } + } + } + + + message = messages.shift(); + users[id].is_waiting = false; + if(answer != 'no_answer'){ + if (answer.length >= 4000) + while(answer.length>0){ + await bot.sendMessage( id, answer.substring(0,4000), { + parse_mode: 'HTML', + reply_markup: { + inline_keyboard: buttons + } + }); + answer = answer.substring(4000); + } + else + bot.sendMessage( id, answer, { + parse_mode: 'HTML', + reply_markup: { + inline_keyboard: buttons + } + }); + } + + } + setTimeout(answer_for_messages, 100); +} + +var yandex_api = [1,1,1,1,1,1,1,1]; +messages_wait_Yandex = []; +messages_with_Yandex = []; + +add_messages_with_Yandex() +answer_for_messages_with_Yandex() + +async function add_messages_with_Yandex(){ + while((messages_wait_Yandex.length > 0) && (yandex_api.length > 0)){ + var message = messages_wait_Yandex.shift(); + var options = yandex_api.shift(); + //console.log(options); + await messages_with_Yandex.push(message); + } + setTimeout(add_messages_with_Yandex, 100); +} + +async function answer_for_messages_with_Yandex(){ + var message = messages_with_Yandex.shift(); + while (message) { + var id = message.id; + var command_info = message.command_info; + + var answer = ""; + var buttons = []; + + var user_is_admin = (users[id].mode > 1); + if(command_info.need_admin&&!user_is_admin) + answer = config.defaulttext.need_admin; + else { + var user_is_auth = users[id].checkAuth(); + if(command_info.need_auth&&!user_is_auth) { + answer = config.defaulttext.need_auth; + // buttons = getButtonsByNames(config.defaulttext.need_auth.buttons,id); + } + else { + answer = command_info.answer || 'no_answer'; + // buttons = getButtonsByNames(command_info.buttons,id); + if(command_info.function_name){ + var data = { + name : command_info.function_name, + id : id, + is_Auth : user_is_auth, + is_Admin : user_is_admin, + answer : answer, + text : message.text + } + try { + users[id].is_waiting = true; + answer = await launchFunctionByName(data); + } catch (e) { + console.log(e); + answer = 'Возникла ошибка'; + users[id].is_waiting = false; + } + } + } + } + + + message = messages_with_Yandex.shift(); + yandex_api.push(1); + users[id].is_waiting = false; + if(answer != 'no_answer'){ + if (answer.length >= 4000) + while(answer.length>0){ + await bot.sendMessage( id, answer.substring(0,4000), { + parse_mode: 'HTML', + reply_markup: { + inline_keyboard: buttons + } + }); + answer = answer.substring(4000); + } + else + bot.sendMessage( id, answer, { + parse_mode: 'HTML', + reply_markup: { + inline_keyboard: buttons + } + }); + } + + } + setTimeout(answer_for_messages_with_Yandex, 100); +} +/******************--- databaseConnect ----**************************/ +const { Client } = require('pg'); +const client = new Client({ + connectionString: process.env.DATABASE_URL, + ssl: { + rejectUnauthorized: false + } +}) +client.connect() +.catch(e => { + console.error(e); +}) +.then(()=>{init_database()}); + +var bd_loaded = false; + +function init_database(){ + (async () => { + var create_table = `CREATE TABLE IF NOT EXISTS USERS( + ID INT PRIMARY KEY NOT NULL, + TOKEN VARCHAR(1000) NOT NULL DEFAULT 'unauthorized', + USERNAME VARCHAR(45) NOT NULL DEFAULT 'no_username', + PASSWORD VARCHAR(20) NOT NULL DEFAULT 'no_password', + MODE INT NOT NULL DEFAULT 0, + ZONES TEXT NOT NULL DEFAULT 'no_zones' + );`; + await client.query(create_table) + + var load_users = `SELECT * FROM USERS;`; + await client.query(load_users, async (err,res) => { + var users_ = res.rows; + var auth_needed = 0; + for await(var user of users_) { + if(user.zones === 'no_zones') user.zones = ''; + user.zones = user.zones.split(',') + users[user.id] = new Courier(user); + if(!(await users[user.id].getInfo())) + auth_needed++; + }/*var i=0; i { + console.error(e); + setTimeout(init_database, 5000); + }); +} +/******************--- databaseConnect ----**************************/ + +var update_users = []; +const updateUsersClient = new Client({ + connectionString: process.env.DATABASE_URL, + ssl: { + rejectUnauthorized: false + } +}); +updateUsersClient.connect(); + +setTimeout(updateUsersOnServer, 5000); + +async function updateUsersOnServer(){ + (async () => { + var id = update_users.shift(); + while(id){ + let update = `UPDATE USERS SET TOKEN = '${users[id].token}', USERNAME = '${users[id].username}', PASSWORD = '${users[id].password}', MODE = ${users[id].mode}, ZONES = '${users[id].zones.join(",")}' WHERE ID = ${id};` + await updateUsersClient.query(update) + id = update_users.shift(); + } + setTimeout(updateUsersOnServer, 5000); + })() + .catch(e => { + console.error(e); + setTimeout(updateUsersOnServer, 5000); + }); +} + +var newUsers = []; + +function saveNewUsers(){ + (async () => { + var user = newUsers.shift(); + while (user){ + var add_user = `INSERT INTO USERS(ID, TOKEN, USERNAME, PASSWORD, MODE, ZONES) VALUES(${user.id}, '${user.token}', '${user.username}', '${user.password}', ${user.mode}, '${user.zones.join(",")}') ON CONFLICT (ID) DO UPDATE SET TOKEN = EXCLUDED.TOKEN, USERNAME = EXCLUDED.USERNAME, PASSWORD = EXCLUDED.PASSWORD;`; + //console.log('save ',user) + await client.query(add_user); + user = newUsers.shift(); + } + setTimeout(saveNewUsers, 5000); + })() + .catch(e => { + console.error(e); + }); +} diff --git a/config.js b/config.js new file mode 100644 index 0000000..eabd55b --- /dev/null +++ b/config.js @@ -0,0 +1,166 @@ +var config = {}; + +config.token = ''; + +config.defaulttext = { + unknown_command : `Такой команды не существует, проверьте правильность написания...`, + need_admin: `Для данной команды у вас недостаточно прав`, + need_auth: `Для данной команды необходимо авторизоваться`, + need_reauth: `Необходимо авторизоваться заново с помощью команды /relogin`, + need_wait : `Ожидайте выполнения предыдущей команды...` +} + +config.commands = new Map([ + [`/start`, { + need_auth : false, + answer : `Вас приветствует бот-помощник для курьеров Яндекс.Еды или Яндекс.Лавки + +Список доступных команд всегда можно получить с помощью /help` + }], + [`/login`, { + need_auth : false, + need_api : true, + function_name: `login`, + answer : +`Помощь для входа +Для авторизации введите /login [ваш логин] - [ваш пароль] +Например '/login Курьер - IUhjkdsf1' + +Данные для входа можно посмотреть в @FoodfoxCourierBot`, + have_description : true, + description : `Авторизация` + }], + [`/myslots`, { + need_auth : true, + need_api : true, + need_admin : false, + function_name: `myslots`, + answer : `no_answer`, + have_description : true, + description : `Запланнированные слоты` + }], + [`/freeslots`, { + need_auth : true, + need_api : true, + need_admin : false, + function_name: `freeslots`, + answer : `no_answer`, + have_description : true, + description : `Свободные слоты на неделю` + }], + [`/orders`, { + need_auth : true, + need_api : true, + need_admin : false, + function_name: `orders`, + answer : `no_answer`, + have_description : true, + description : `Текущие заказы` + }], + [`/setzone`, { + need_auth : true, + need_admin : false, + function_name: `search_point`, + answer : `Найденные лавки: +`, + have_description : true, + description : `Изменение отслеживаемой лавки` + }], + [`/relogin`, { + need_auth : true, + need_api : true, + need_admin : false, + function_name: `relogin`, + answer : `Успешная повторная авторизация\n`, + have_description : false, + description : `Используется для повторного входа с сохраненными данными` + }], + [`/logout`, { + need_auth : true, + function_name: `logout`, + answer : `Вы успешно вышли из аккаунта + +Авторизоваться можно с помощью /login`, + have_description : true, + description : `Выход из аккаунта` + }], + [`/help`, { + need_auth : false, + function_name: `help`, + answer : `Список доступных команд:`, + /* have_description : true, + description : `Список доступных команд`, + show_after_login : true*/ + }] +]); + +config.admin_commands = new Map([ + [`/query`, { + need_auth : false, + need_admin : true, + answer : `Ответ бд:\n`, + have_description : true, + description : `Запрос к базе данных`, + function_name : "query", + show_after_login : true + }], + [`/reload_bd`, { + need_auth : false, + need_api : false, + need_admin : true, + answer : `База данных загружена`, + have_description : true, + description : `Загрузить пользователей с сервера`, + function_name : "reload_bd", + show_after_login : true + }], + [`/relogin_all`, { + need_auth : false, + need_api : true, + need_admin : true, + answer : `Переавторизация\n`, + have_description : true, + description : `Обновление токенов доступа`, + function_name : "relogin_all", + show_after_login : true + }], + [`/search`, { + need_auth : false, + need_admin : true, + function_name: `search_point`, + answer : `Найденные лавки: +`, + have_description : true, + description : `Поиск по названию лавки`, + show_after_login : true + }], + [`/newfreeslots`, { + need_auth : true, + need_api : true, + need_admin : true, + function_name: `newfreeslots`, + answer : `no_answer`, + have_description : false, + description : `Свободные слоты на неделю` + }], + [`/test`, { + need_auth : false, + need_admin : true, + answer : `TEST`, + have_description : true, + description : `TEST`, + show_after_login : true + }], + [`/test1`, { + need_auth : true, + need_admin : true, + function_name: `test`, + answer : `TEST1`, + have_description : true, + description : `TEST1` + }] +]); + +config.points = {"Лавка-2й Муринский проспект":"7860","Лавка-Большеохтинский проспект":"7655","Лавка-Авиаконструкторов":"8035","Лавка-Бухарестская":"10605","Лавка-Большой пр-т Васильевского острова":"7434","Лавка-Бестужевская":"11173","Лавка-Белы Куна":"9178","Лавка-Белградская":"10670","Лавка-Адмирала Трибуца":"9504","Лавка-Боровая":"7425","Лавка-Васильевского острова":"7437","Лавка-Ефимова":"7419","Лавка-Морская набережная":"8333","Лавка-Жукова":"11259","Лавка-Лизы Чайкиной":"11513","Лавка-Ленинский проспект":"7660","Лавка-набережная Фонтанки":"7416","Лавка-наб. канала Грибоедова":"7422","Лавка-Королева":"7870","Лавка-Дивенская":"8743","Лавка-Левашовский проспект":"11562","Лавка-Красноармейская":"7410","Лавка-Кременчугская ":"7413","Лавка-Дунайский проспект":"7665","Лавка-Коллонтай":"9395","Лавка-Маршала Жукова":"10023","Лавка-Ленинградская(Пушкин)":"9193","Лавка-Малая Митрофаньевская":"11572","Лавка-Ленинский проспект148":"11254","Лавка-Вербная":"7680","Лавка-Лёни Голикова":"10590","Лавка-Краснопутиловская":"9203","Лавка-Маршала Казакова":"11138","Лавка-Новгородская ":"7428","Лавка-Савушкина":"8738","Лавка-Октябрьская набережная 124к7":"9599","Лавка-Ново-Александровская":"9881","Лавка-Пискаревский проспект":"7615","Лавка-Рихарда Зорге":"7670","Лавка-Оптиков":"7675","Лавка-Проспект Славы":"8863","Лавка-Обручевых":"9183","Лавка-Пироговская":"11183","Лавка-Непокорённых ":"9168","Лавка-Пятилеток":"8733","Лавка-Проспект Ветеранов":"8868","Лавка-Охтинская Аллея(Мурино)":"11465","Лавка-Новоизмайловский":"8728","Лавка-Парашютная":"10550","Лавка-Приморский":"10560","Лавка-Петровский бульвар":"8273","Лавка-Октябрьская набережная":"9208","Лавка-Павловская(Всеволожск)":"9470","Лавка-Энергетиков":"11826","Лавка-Харченко":"7855","Лавка-Типанова":"8025","Лавка-Энгельса":"8338","Лавка-Ткачей":"9430","Лавка-Центральная(Мурино)":"10555","Лавка-Скобелевский":"11567","Лавка-Стародеревенская":"8030","Лавка-Северный проспект":"9073","Лавка-Шаумяна":"8858","Лавка-Среднерогатская":"9058","Лавка-Ушинского":"7865","Лавка-Славы(Новое Девяткино)":"9803","Адмиралтейский":"6163","Академическая":"6175","Беговая":"6241","Бухаресткая":"6220","Василеостровский":"6169","Всеволожский":"7404","Выборгский":"7407","Кировский":"6190","Кировский завод":"6184","Красногвардейский":"6250","Красносельский":"6199","Кудрово":"6181","Купчино":"6223","Ладожская":"6193","Лахта":"6214","Лесная":"6178","Московский":"6235","Невский":"6205","Новый Петергоф":"6208","Озерки":"6226","Парнас":"6232","Петроградский":"6172","Пионерская":"6244","Пискаревский":"6196","Приморский":"6217","Проспект большевиков":"6202","Проспект Ветеранов":"6187","Рыбацкое":"6247","Удельная":"6229","Центральный":"6166","Электросила":"6238"} + +module.exports = config; diff --git a/curier_api.js b/curier_api.js new file mode 100644 index 0000000..95d9706 --- /dev/null +++ b/curier_api.js @@ -0,0 +1,460 @@ +const DEF_DELAY = 1200; +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms || DEF_DELAY)); +} + +var config = require('./config'); + +const request = require('request'); + +function isJson(str) { + return str.constructor === ({}).constructor; +} +function canBeJson(str) { + try { + JSON.parse(str); + } catch (e) { + return false; + } + return true; +} + +function convertDate(inputFormat) { + function pad(s) { return (s < 10) ? '0' + s : s; } + var d = new Date(inputFormat) + return [pad(d.getDate()), pad(d.getMonth()+1), d.getFullYear()].join('.') +} + +const weekdays = ['Воскресенье','Понедельник','Вторник','Среда','Четверг','Пятница','Суббота'] +class Courier{ + + free_slots = {}; + old_free_slots = []; + + is_waiting = false; + + constructor(user) { + this.id = user.id; + this.username = user.username||'no_username'; + this.password = user.password||'no_password'; + this.token = user.token||'unauthorized'; + this.mode = user.mode||0; + this.zones = user.zones||[]; + } + + updateUser(user) { + this.id = user.id||this.id; + this.username = user.username||this.username; + this.password = user.password||this.password; + this.token = user.token||this.token||'unauthorized'; + this.mode = user.mode||this.mode||0; + this.zones = user.zones||this.zones||[]; + } + + async auth(){ + var status = 'waiting'; + var token = this.token; + + await request.post(`https://courier.eda.yandex/api/v2/authenticate`,{ + headers: { + "x-app-version": " 5.2.5" + }, + body: JSON.stringify({ + "username": this.username, + "password": this.password + }) + }, await function(err, response, body) { + if(err) { + console.log(err) + return status = false; + } + + if(canBeJson(body))body=JSON.parse(body); + + if(body.isSuccess){ + token = body.payload.apiKey||'unauthorized'; + status = true; + } + else { + console.log(body) + return status = false; + } + }); + + while(status == 'waiting') { + await sleep(100); + } + this.token = token; + + return status; + } + + async getInfo(){ + var returned_info = { + isSuccess: 'waiting' + } + + await request.get(`https://courier.eda.yandex/api/v2/courier/info`,{ + headers: { + "x-api-token": this.token + } + },await function(err, response, body) { + if(err) return returned_info.isSuccess = 'false'; + + if(canBeJson(body))body=JSON.parse(body); + + if(body.isSuccess){ + returned_info.isSuccess = 'true'; + returned_info.user = { + id: body.payload.id, + name: body.payload.fullName.surname + ' ' + body.payload.fullName.firstName + ' ' + body.payload.fullName.patronymic, + status: body.payload.status + }; + } + else return returned_info.isSuccess = 'false'; + }); + + while(returned_info.isSuccess == 'waiting') { + await sleep(100); + } + this.info = returned_info.user; + + return returned_info.isSuccess == 'true'; + } + + async getPlannedFromServer(){ + var returned_info = { + isSuccess: 'waiting' + } + + await request.get(`https://ctt.eda.yandex/courier-shifts/actual`,{ + headers: { + "Authorization": 'Bearer ' + this.token + } + },await function(err, response, body) { + if(err) { + console.log(err) + return returned_info.isSuccess = 'false'; + } + + //console.log(body) + if(canBeJson(body))body=JSON.parse(body); + if(body.errors) { + returned_info.errors = body.errors; + return returned_info.isSuccess = 'false'; + } + if(body.data) + returned_info = body.data; + }); + + while(returned_info.isSuccess == 'waiting') { + await sleep(100); + } + + return returned_info; + } + + async getPlanned(){ + var info = await this.getPlannedFromServer(); + var slots_info = {} + for(var slot of info){ + if(slot.attributes.status == 'Planned'){ + var time_start = (new Date(Date.parse(slot.attributes.startsAt))); + var time_end = (new Date(Date.parse(slot.attributes.endsAt))); + if(!slots_info[time_start.toLocaleDateString({ timeZone: 'Europe/Moscow' })]) slots_info[time_start.toLocaleDateString({ timeZone: 'Europe/Moscow' })] = []; + var myslot = { + startsAt: time_start.toLocaleTimeString('ru-RU',{ timeZone: 'Europe/Moscow', hour12: false }), + endsAt: time_end.toLocaleTimeString('ru-RU',{ timeZone: 'Europe/Moscow', hour12: false }), + startPoint: slot.attributes.startPoint.attributes.name + } + if(slot.attributes.startLocation)myslot.startLocation = slot.attributes.startLocation.name; + slots_info[time_start.toLocaleDateString({ timeZone: 'Europe/Moscow' })].push(myslot)//.push('Работаю ' + (new Date(Date.parse(slot.attributes.startsAt))).toLocaleDateString()) + } + } + this.planned = slots_info; + return await this.getPlannedText(); + } + + async getPlannedText(){ + var answer = 'Запланированные слоты:\n\n'; + for(var date in this.planned){ + answer += `(${convertDate(date)}, ${weekdays[new Date(date).getDay()]})\n` + for(var slot of this.planned[date]){ + if(slot.startLocation) + answer += '>' + slot.startLocation + '\n'; + answer += `Слот с ${slot.startsAt.substring(0,5)} до ${slot.endsAt.substring(0,5)} +` + } + answer += '\n'; + } + if(answer == 'Запланированные слоты:\n\n') answer = 'Нет запланнированных слотов' + return answer; + } + + async getMyZones(){ + var info = await this.getPlannedFromServer(); + var zones = {} + for(var slot of info){ + if(!zones[slot.attributes.startPoint.attributes.name])zones[slot.attributes.startPoint.attributes.name]=0; + zones[slot.attributes.startPoint.attributes.name]++; + } + // console.log(zones) + /* var main_zone = ''; + var num = 0;*/ + this.clearZones(); + for(var zone in zones){ + /* if(zones[zone]>num){ + num = zones[zone]; + main_zone = zone; + }*/ + this.addZone(config.points[zone]); + } + /* if(main_zone!='') + this.addZone(config.points[main_zone]);*/ + return zones; + } + + async getFreeSlotsFromServer(date){ + var returned_info = { + isSuccess: 'waiting' + } + var zones_filter = ``; + for(var zone of this.zones) + zones_filter += `&filters%5Bzones%5D%5B%5D=${zone}`; + + await request.get(`https://ctt.eda.yandex/courier-shifts?filters%5Bdate%5D=${date}${zones_filter}`,{ + headers: { + "Authorization": 'Bearer ' + this.token, + "x-app-version": '5.3.2' + } + },await function(err, response, body) { + if(err) { + console.log(err) + return returned_info.isSuccess = 'false'; + } + + if(canBeJson(body))body=JSON.parse(body); + if(body.errors) { + returned_info.errors = body.errors; + return returned_info.isSuccess = 'false'; + } + if(body.data) + returned_info = body.data; + }); + + while(returned_info.isSuccess == 'waiting') { + await sleep(100); + } + + return returned_info; + } + + async getFreeSlots(date){ + var day_info = await this.getFreeSlotsFromServer(convertDate(date)); + if(day_info.isSuccess != 'false'){ + var returned_info = { + date: date, + // cols: day_info.opened.length, + slots: [] + } + for(var slot of day_info.opened){ + var time_start = (new Date(Date.parse(slot.attributes.startsAt))); + var time_end = (new Date(Date.parse(slot.attributes.endsAt))); + var myslot = { + id: slot.id, + startsAt: time_start.toLocaleTimeString('ru-RU',{ timeZone: 'Europe/Moscow', hour12: false }), + endsAt: time_end.toLocaleTimeString('ru-RU',{ timeZone: 'Europe/Moscow', hour12: false }), + startPoint: slot.attributes.startPoint.attributes.name, + } + if(slot.attributes.startLocation)myslot.startLocation = slot.attributes.startLocation.name; + this.free_slots[date+'_'+myslot.startsAt+'_'+myslot.endsAt]=myslot; + returned_info.slots.push(myslot) + } + return this.getFreeSlotsText(returned_info); + } + else return 'Возникла ошибка ( используйте /relogin )\n'; + } + + async getFreeSlotsText(day_info){ + var answer = ''; + if(day_info.slots.length>0){ + answer = `(${convertDate(day_info.date)}, ${weekdays[(new Date(day_info.date)).getDay()]})\n` + /* for(var slot of day_info.slots){ + answer += `Слот с ${slot.startsAt.substring(0,5)} до ${slot.endsAt.substring(0,5)}`; + if(this.zones.length>1) + answer+=`(${slot.startPoint})`; + answer+=`\n`; + }*/ + if(this.zones.length == 1) + for(var slot of day_info.slots){ + if(slot.startLocation) + answer += '>' + slot.startLocation + '\n'; + answer += `Слот с ${slot.startsAt.substring(0,5)} до ${slot.endsAt.substring(0,5)} +`; + } + else{ + var zones = {} + + for(var slot of day_info.slots){ + if(slot.startLocation){ + if(!zones[slot.startLocation])zones[slot.startLocation] = []; + zones[slot.startLocation].push(slot); + } + else { + if(!zones[slot.startPoint])zones[slot.startPoint] = []; + zones[slot.startPoint].push(slot); + } + } + + for(var zone in zones){ + answer += '>' + zones[zone][0].startLocation||zones[zone][0].startPoint + '\n'; + for (var slot of zones[zone]){ + answer += `Слот с ${slot.startsAt.substring(0,5)} до ${slot.endsAt.substring(0,5)}`; + answer += `\n`; + } + } + } + + answer += '\n' + } + return answer; + } + + async getFreeSlotsWeek(){ + var answer = 'Свободные слоты:\n\n'; + var date = new Date(Date.now()) + for(var i = 0; i<=10; i++){ + answer += await this.getFreeSlots(date.toLocaleDateString({ timeZone: 'Europe/Moscow'})); + date.setDate(date.getDate() + 1); + } + if(answer == 'Свободные слоты:\n\n') answer = 'Свободных слотов нет' + return answer; + } + + async getNewFreeSlotsWeek(){ + this.free_slots = {}; + var date = new Date(Date.now()) + for(var i = 0; i<=10; i++){ + await this.getFreeSlots(date.toLocaleDateString({ timeZone: 'Europe/Moscow'})); + date.setDate(date.getDate() + 1); + } + var newslots = {}; + for(var slot in this.free_slots){ + if(this.old_free_slots.indexOf(slot)==-1){ + let date = slot.split('_')[0]; + if(!newslots[date])newslots[date]=[]; + newslots[date].push(this.free_slots[slot]); + } + } + this.old_free_slots = Object.keys(this.free_slots); + return await this.getNewFreeSlotsWeekText(newslots); + } + + async getNewFreeSlotsWeekText(newslots){ + var answer = 'Доступны новые слоты:\n\n'; + for(var date in newslots){ + answer += `(${convertDate(date)}, ${weekdays[new Date(date).getDay()]})\n` + for(var slot of newslots[date]){ + answer += `Слот с ${slot.startsAt.substring(0,5)} до ${slot.endsAt.substring(0,5)} +` + } + answer += '\n'; + } + if(answer == 'Доступны новые слоты:\n\n') answer = 'no_answer' + return answer; + } + + async getOrders(){ + var returned_info = { + isSuccess: 'waiting' + } + + await request.get(`https://courier.eda.yandex/api/v2/orders`,{ + headers: { + "x-api-token": this.token + } + },await function(err, response, body) { + if(err) { + returned_info.err = err; + return returned_info.isSuccess = 'false'; + } + + if(canBeJson(body))body=JSON.parse(body); + if(body.errors) + returned_info.errors = body.errors; + if(!body.isSuccess){ + returned_info.body = body; + return returned_info.isSuccess = 'false'; + } + if(body.isSuccess) + returned_info = body; + }); + + while(returned_info.isSuccess == 'waiting') { + await sleep(100); + } + + return returned_info; + } + + async getOrdersText(orders_){ + var orders = orders_||await this.getOrders(); + var answer = ''; + if(orders.isSuccess){ + if(!orders.meta) return config.defaulttext.need_reauth; + if(orders.meta.count == 0) + return 'Нет заказов' + for await(var order of orders.payload.orders){ + console.log(order) + answer += `Заказ N: ${order.orderNr} +Адрес: ${order.customer.address.title}, подъезд ${order.customer.address.entrance||'-'}, этаж ${order.customer.address.floor||'-'}, квартира ${order.customer.address.office||order.customer.address.doorcode||'-'} +` + if(order.comment!=null) + answer += `Комментарий: ${order.comment}\n`; + answer += `Вес: ${order.weight/1000} кг.\n`; + answer += `Цена: ${order.subtotal} ${order.currency.sign}\n`; + if(order.deliveryFee!='0') + answer += `Платная доставка: ${order.deliveryFee} ${order.currency.sign}\n`; + answer += `\nБлюда:\n` + + for(var item of order.cartItems) + answer += `${item.quantity} ${item.name}\n` + answer += `\n` + + answer += `Клиент: ${order.customer.firstName||''} ${order.customer.lastName||''} + Телефон: ${order.customer.phoneNumber} + ` + } + } + else return 'Возникла ошибка'; + return answer; + } + + clearZones(){ + this.zones = []; + } + addZone(zone){ + this.zones.push(zone); + } + + data(){ + return { + id: this.id, + username: this.username, + password: this.password, + token: this.token, + mode: this.mode, + zones: this.zones + } + } + + reset(){ + this.token = 'unauthorized'; + } + + checkAuth(){ + return !(this.token == 'unauthorized'); + } +} + +module.exports = Courier diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..3007cc1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,886 @@ +{ + "name": "LavkaNotiferBot", + "version": "0.0.20072021", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "array.prototype.findindex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array.prototype.findindex/-/array.prototype.findindex-2.1.0.tgz", + "integrity": "sha512-25kJHCjXltdtljjwcyKvCTywmbUAeTJVB2ADVe0oP4jcefsd+K9pJJ3IdHPahLICoszcCLoNF+evWpEduzBlng==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.4" + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "fuzzysearch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fuzzysearch/-/fuzzysearch-1.0.3.tgz", + "integrity": "sha1-3/yA9tawQiPyImqnndGUIxCW0Ag=" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==" + }, + "is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==" + }, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + } + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" + }, + "mime-types": { + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "requires": { + "mime-db": "1.47.0" + } + }, + "node-telegram-bot-api": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/node-telegram-bot-api/-/node-telegram-bot-api-0.52.0.tgz", + "integrity": "sha512-HOOHJ14OcuAWcVZQb5kth2lrWJeeOdaO7XFdYXcJT9Dxpznm7iZDHBq9ODLknDTE4dhDMDL6TsjjgYV468gtDQ==", + "requires": { + "array.prototype.findindex": "^2.0.2", + "bl": "^1.2.3", + "bluebird": "^3.5.1", + "debug": "^3.1.0", + "depd": "^1.1.1", + "eventemitter3": "^3.0.0", + "file-type": "^3.9.0", + "mime": "^1.6.0", + "pump": "^2.0.0", + "request": "^2.83.0", + "request-promise": "^4.2.2" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pg": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.6.0.tgz", + "integrity": "sha512-qNS9u61lqljTDFvmk/N66EeGq3n6Ujzj0FFyNMGQr6XuEv4tgNTXvJQTfJdcvGit5p5/DWPu+wj920hAJFI+QQ==", + "requires": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.3.0", + "pg-protocol": "^1.5.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + } + }, + "pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + }, + "pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" + }, + "pg-pool": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.3.0.tgz", + "integrity": "sha512-0O5huCql8/D6PIRFAlmccjphLYWC+JIzvUhSzXSpGaf+tjTZc4nn+Lr7mLXBbFJfvwbP0ywDv73EiaBsxn7zdg==" + }, + "pg-protocol": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", + "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" + }, + "pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "requires": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + } + }, + "pgpass": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.4.tgz", + "integrity": "sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w==", + "requires": { + "split2": "^3.1.1" + } + }, + "postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" + }, + "postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" + }, + "postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" + }, + "postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "requires": { + "xtend": "^4.0.0" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "request-cookies": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/request-cookies/-/request-cookies-1.1.0.tgz", + "integrity": "sha1-dYHT2bKsXcQ25kWbIWpi48fmjPE=", + "requires": { + "tough-cookie": "0.12.x" + }, + "dependencies": { + "tough-cookie": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-0.12.1.tgz", + "integrity": "sha1-giDH4hq9WxPZaAQlS9WoHr8sfWI=", + "requires": { + "punycode": ">=0.2.0" + } + } + } + }, + "request-promise": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz", + "integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==", + "requires": { + "bluebird": "^3.5.0", + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "requires": { + "lodash": "^4.17.19" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "requires": { + "readable-stream": "^3.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..e824187 --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "LavkaNotiferBot", + "version": "0.0.20072021", + "description": "A simple yandex parsing bot", + "engines": { + "node": "12.x" + }, + "main": "starter.js", + "scripts": { + "start": "node starter.js" + }, + "dependencies": { + "fuzzysearch": "^1.0.3", + "js-levenshtein": "^1.1.6", + "node-telegram-bot-api": "^0.52.0", + "pg": "^8.6.0", + "request": "^2.88.2", + "request-cookies": "^1.1.0" + }, + "license": "MIT", + "devDependencies": {}, + "keywords": [], + "author": "FutureX" +} diff --git a/starter.js b/starter.js new file mode 100644 index 0000000..4f3d2ba --- /dev/null +++ b/starter.js @@ -0,0 +1 @@ +require('./bot')