Загрузил архивные файлы
This commit is contained in:
		
							
								
								
									
										593
									
								
								bot.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										593
									
								
								bot.js
									
									
									
									
									
										Normal file
									
								
							@@ -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----------------------
 | 
				
			||||||
 | 
					<b>Команды администратора:</b>`;
 | 
				
			||||||
 | 
							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 = `<b>Вход выполнен успешно</b>
 | 
				
			||||||
 | 
					Авторизован: ${new_user.info.name}
 | 
				
			||||||
 | 
					`;
 | 
				
			||||||
 | 
								var zones = await new_user.getMyZones();
 | 
				
			||||||
 | 
								answer += `Зоны работы: `;
 | 
				
			||||||
 | 
								for(var zone in zones) answer += `<code>${zone}</code>; `
 | 
				
			||||||
 | 
								answer += `\n\n<i>Для изменений отслеживаемой зоны работы используйте</i> /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 == `<b>Переавторизация</b>\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 = `<b>Выбрана точка:</b> ${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<minimal) {
 | 
				
			||||||
 | 
									answer = zone_name;
 | 
				
			||||||
 | 
									minimal = a;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var answer = `По вашему запросу ничего не найдено...
 | 
				
			||||||
 | 
					Возможно вы имели ввиду <code>${answer}</code>`;
 | 
				
			||||||
 | 
						} else if(answer == '') answer = 'Не найдено сопадений'
 | 
				
			||||||
 | 
						else {
 | 
				
			||||||
 | 
							answer = `<b>Найденные лавки:</b>
 | 
				
			||||||
 | 
					`;
 | 
				
			||||||
 | 
							for(var name of names){
 | 
				
			||||||
 | 
								answer+=`<code>${name}</code>\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<users_.length;i++) {
 | 
				
			||||||
 | 
									var user_data = {
 | 
				
			||||||
 | 
										id: users_[i].id,
 | 
				
			||||||
 | 
										username: users_[i].username,
 | 
				
			||||||
 | 
										password: users_[i].password,
 | 
				
			||||||
 | 
										token: users_[i].token,
 | 
				
			||||||
 | 
										mode: users_[i].mode,
 | 
				
			||||||
 | 
										zones: users_[i].zones.split(',')
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									users[user_data.id] = new Courier(user_data);
 | 
				
			||||||
 | 
									if(!(await users[user_data.id].getInfo()))
 | 
				
			||||||
 | 
										auth_needed++;
 | 
				
			||||||
 | 
								}*/
 | 
				
			||||||
 | 
								console.log(`Из базы данных загружено пользователей: ${users_.length}, нужна повторная авторизация: ${auth_needed}`)
 | 
				
			||||||
 | 
								if(!bd_loaded){
 | 
				
			||||||
 | 
									setTimeout(saveNewUsers, 5000);
 | 
				
			||||||
 | 
									bd_loaded = false;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						})()
 | 
				
			||||||
 | 
						.catch(e => {
 | 
				
			||||||
 | 
							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);
 | 
				
			||||||
 | 
						});
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										166
									
								
								config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								config.js
									
									
									
									
									
										Normal file
									
								
							@@ -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 : 
 | 
				
			||||||
 | 
					`<b>Помощь для входа</b>
 | 
				
			||||||
 | 
					Для авторизации введите /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 : `<b>Найденные лавки:</b>
 | 
				
			||||||
 | 
					`,
 | 
				
			||||||
 | 
							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 : `<b>Список доступных команд:</b>`,
 | 
				
			||||||
 | 
						/*	have_description : true,
 | 
				
			||||||
 | 
							description : `Список доступных команд`,
 | 
				
			||||||
 | 
							show_after_login : true*/
 | 
				
			||||||
 | 
						}]
 | 
				
			||||||
 | 
					]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					config.admin_commands = new Map([
 | 
				
			||||||
 | 
						[`/query`, { 
 | 
				
			||||||
 | 
							need_auth : false, 
 | 
				
			||||||
 | 
							need_admin : true,
 | 
				
			||||||
 | 
							answer : `<b>Ответ бд:</b>\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 : `<b>Переавторизация</b>\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 : `<b>Найденные лавки:</b>
 | 
				
			||||||
 | 
					`,
 | 
				
			||||||
 | 
							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;
 | 
				
			||||||
							
								
								
									
										460
									
								
								curier_api.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										460
									
								
								curier_api.js
									
									
									
									
									
										Normal file
									
								
							@@ -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 = '<b>Запланированные слоты:</b>\n\n';
 | 
				
			||||||
 | 
							for(var date in this.planned){
 | 
				
			||||||
 | 
								answer += `<i>(${convertDate(date)}, ${weekdays[new Date(date).getDay()]})</i>\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 == '<b>Запланированные слоты:</b>\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 = '<b>Свободные слоты:</b>\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 == '<b>Свободные слоты:</b>\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 = '<b>Доступны новые слоты:</b>\n\n';
 | 
				
			||||||
 | 
							for(var date in newslots){
 | 
				
			||||||
 | 
								answer += `<i>(${convertDate(date)}, ${weekdays[new Date(date).getDay()]})</i>\n`
 | 
				
			||||||
 | 
								for(var slot of newslots[date]){
 | 
				
			||||||
 | 
									answer += `Слот с ${slot.startsAt.substring(0,5)} до ${slot.endsAt.substring(0,5)}
 | 
				
			||||||
 | 
					`
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								answer += '\n';
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if(answer == '<b>Доступны новые слоты:</b>\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 += `<b>Заказ N:</b> <i>${order.orderNr}</i>
 | 
				
			||||||
 | 
					<b>Адрес:</b> ${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 += `<b>Комментарий:</b> ${order.comment}\n`;
 | 
				
			||||||
 | 
									answer += `<b>Вес:</b> ${order.weight/1000} кг.\n`;
 | 
				
			||||||
 | 
									answer += `<b>Цена:</b> ${order.subtotal} ${order.currency.sign}\n`;
 | 
				
			||||||
 | 
									if(order.deliveryFee!='0')
 | 
				
			||||||
 | 
										answer += `<b>Платная доставка:</b> ${order.deliveryFee} ${order.currency.sign}\n`;
 | 
				
			||||||
 | 
									answer += `\n<b>Блюда:</b>\n`
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									for(var item of order.cartItems)
 | 
				
			||||||
 | 
										answer += `${item.quantity} ${item.name}\n`
 | 
				
			||||||
 | 
									answer += `\n`
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									answer += `<b>Клиент:</b> <i>${order.customer.firstName||''} ${order.customer.lastName||''}</i>
 | 
				
			||||||
 | 
						<b>Телефон:</b> <i>${order.customer.phoneNumber}</i>
 | 
				
			||||||
 | 
						`
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							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
 | 
				
			||||||
							
								
								
									
										886
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										886
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							@@ -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=="
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										24
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							@@ -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"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										1
									
								
								starter.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								starter.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					require('./bot')
 | 
				
			||||||
		Reference in New Issue
	
	Block a user