/*************************************/ //Хранит информацию о пользователях во время работы бота var users_keys = new Map(); //Некие константы var config = require('./config'); /** * Ждать ms милисекунд. * * @param {number} ms Количество милисекунд ожидания. */ const DEF_DELAY = 1000; function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms || DEF_DELAY)); } /*************************************/ //Запуск получения сообщений от телеграмм бота var Bot = require('node-telegram-bot-api'); var bot = new Bot(process.env.TOKEN, { polling: true }); //Ошибки от телеграмма bot.on('polling_error', (error) => { console.log('Ошибка polling:', error); }); //Авторизация в вк const easyvk = require('easyvk'); var vk; init(); async function init(){ vk = await easyvk({ token : process.env.VK_TOKEN }) } console.log('Бот был запущен'); /** * Получение конфигурации для прикрепления кнопок к сообщению в телеграмм. * * @param {array} buttons Массив с необходимыми кнопками для сообщения. * @param {number} id Id профиля telegram. */ function getButtonsByNames(buttons,id){ var returned_buttons = []; if(buttons.includes('auth')) returned_buttons.push([{ text: 'Авторизоваться', url: spotifyApi.createAuthorizeURL(config.scopes,id,true) }]); //if(buttons.includes('logout')) //returned_buttons.push([{ text: 'Выйти в браузере', url: 'https://www.spotify.com/ru/logout' }]); //если авторизован if(buttons.includes('profile_menu')) returned_buttons.push([{ text: 'Профиль', callback_data: JSON.stringify({command:"menu_profile"}) }]); if(buttons.includes('profile')) returned_buttons.push([{ text: 'Профиль пользователя', callback_data: JSON.stringify({command:"as_message",message:"/info"}) }]); if(buttons.includes('top_tracks')) returned_buttons.push([{ text: 'Топ треков', callback_data: JSON.stringify({command:"as_message",message:"/top_tracks"}) }]); if(buttons.includes('top_artists')) returned_buttons.push([{ text: 'Топ исполнителей', callback_data: JSON.stringify({command:"as_message",message:"/top_artists"}) }]); if(buttons.includes('player_menu')) returned_buttons.push([{ text: 'Сейчас играет', callback_data: JSON.stringify({command:"menu_player"}) }]); // callback_data: JSON.stringify({command:"as_message",message:"/remote_control"}) }]); /* if(buttons.includes('remote_control')) returned_buttons.push([ { text: '<', callback_data: JSON.stringify({command:"previous_track"}) }, { text: '||', callback_data: JSON.stringify({command:"play_pause"}) }, { text: '>', callback_data: JSON.stringify({command:"next_track"}) }]);*/ if(buttons.includes('download_track')) returned_buttons.push([{ text: 'Скачать текущий трек', callback_data: JSON.stringify({command:"download_track"}) }]); if(buttons.includes('create_playlist')) returned_buttons.push([{ text: 'Создать плейлист', callback_data: JSON.stringify({command:"menu_playlists"}) }]); if(buttons.includes('vk_menu')) returned_buttons.push([{ text: 'Импорт треков из VK', callback_data: JSON.stringify({command:"menu_vk"}) }]); if(buttons.includes('import_vk_profile')) returned_buttons.push([{ text: 'Треки профиля из VK', callback_data: JSON.stringify({command:"as_message",message:"/vk_to_playlist"}) }]); if(buttons.includes('import_vk_playlist')) returned_buttons.push([{ text: 'Треки плейлиста из VK', callback_data: JSON.stringify({command:"as_message",message:"/vk_get_playlist"}) }]); if(buttons.includes('settings')) returned_buttons.push([{ text: 'Настройки', callback_data: JSON.stringify({command:"menu_settings"}) }]); if(buttons.includes('help')) returned_buttons.push([{ text: 'Список доступных комманд', callback_data: JSON.stringify({command:"as_message",message:"/help"}) }]); if(buttons.includes('create_playlist_from_liked')) returned_buttons.push([{ text: 'Все избранные треки', callback_data: JSON.stringify({command:"as_message",message:"/save_to_playlist"}) }]); if(buttons.includes('create_dance_playlist_from_liked')) returned_buttons.push([{ text: 'Избранные танцевальные треки', callback_data: JSON.stringify({command:"as_message",message:"/save_dance_to_playlist"}) }]); if(buttons.includes('create_not_russian_playlist_from_liked')) returned_buttons.push([{ text: 'Избранные зарубежные треки', callback_data: JSON.stringify({command:"as_message",message:"/save_english_to_playlist"}) }]); let map = new Map();map.set(true,'Вкл.');map.set(false,'Выкл.'); if(buttons.includes('filter_explicit')) returned_buttons.push([{ text: `Только песни без мата: ${map.get(users_keys.get(id).only_not_explicit)}`, callback_data: JSON.stringify({command:"change_filter_explicit"}) }]); if(buttons.includes('filter_popular')) returned_buttons.push([{ text: `Только популярные песни: ${map.get(users_keys.get(id).only_popular)}`, callback_data: JSON.stringify({command:"change_filter_popular"}) }]); if(buttons.includes('logout')) returned_buttons.push([{ text: 'Выйти из профиля Spotify', callback_data: JSON.stringify({command:"as_message",message:"/logout"}) }]); if(buttons.includes('main_menu')) returned_buttons.push([{ text: 'Вернуться в главное меню', callback_data: JSON.stringify({command:"menu_main"}) }]); return returned_buttons; } /** * Запуск функций для разных комманд из telegram. * * @param {map} data Информация о пользователе и его команда. */ async function launchFunctionByName(data){ switch(data.name){ case 'login': var answer = await command_login(data); return answer; break; case 'server_login': var answer = await command_server_login(data); return answer; break; case 'help': var answer = await command_help(data); return answer; break; case 'info_about_user': var answer = await command_info_about_user(data); return answer; break; case 'user_tracks': var answer = await command_user_tracks(data); return answer; break; case 'top_tracks': var answer = await command_top_tracks(data); return answer; break; case 'top_artists': var answer = await command_top_artists(data); return answer; break; case 'remote_control': var answer = await command_remote_control(data); return answer; break; case 'create_playlist_from_liked': var answ = await command_get_liked(data); var new_message = { id: data.id, type: 'create_playlist', save_playlist: answ.save_playlist, name: config.defaulttext.playlist_create.playlist_name, description: config.defaulttext.playlist_create.playlist_description.replace('&{name}',answ.display_name), track_array: answ.track_array, bot_options: answ.bot_options, quite:data.quite } messages_wait_Spotify_server.push(new_message); return 'no_answer'; break; case 'create_english_playlist_from_liked': var answ = await command_get_liked(data); var new_message = { id: data.id, type: 'get_english_tracks', name: config.defaulttext.playlist_create.playlist_name_not_russian, description: config.defaulttext.playlist_create.playlist_description_not_russian.replace('&{name}',answ.display_name), track_array: answ.track_array, bot_options: answ.bot_options } messages_wait_Spotify_server.push(new_message); return 'no_answer'; break; case 'create_dance_playlist_from_liked': var answ = await command_get_liked(data); var new_message = { id: data.id, type: 'get_dance_tracks', name: config.defaulttext.playlist_create.playlist_name_dance, description: config.defaulttext.playlist_create.playlist_description_dance.replace('&{name}',answ.display_name), // audios: answ.audios, track_array: answ.track_array, bot_options: answ.bot_options } //console.log(new_message); messages_wait_Spotify_server.push(new_message); return 'no_answer'; break; case 'create_not_explicit_playlist_from_liked': var answ = await command_get_liked(data); var new_message = { id: data.id, type: 'get_not_explicit_tracks', name: config.defaulttext.playlist_create.playlist_name_not_explicit, description: config.defaulttext.playlist_create.playlist_description_not_explicit.replace('&{name}',answ.display_name), track_array: answ.track_array, bot_options: answ.bot_options } messages_wait_Spotify_server.push(new_message); return 'no_answer'; break; case 'logout': var answer = await command_logout(data); return answer; break; case 'show_list_of_users': var answer = await command_show_list_of_users(data); return answer; break; case 'update_all_liked': var answer = await command_update_all_liked(data); return answer; break; case 'get_info': var answer = await command_get_info(data); return answer; break; case 'create_playlist_from_vk': var answer = await command_create_playlist_from_vk(data); return answer; break; case 'create_playlist_from_vk_playlist': var answer = await command_create_playlist_from_vk_playlist(data); return answer; break; case 'create_playlist_in_vk': var answ = await command_get_liked(data); var new_message = { id: data.id, type: 'create_playlist_from_spotify', name: config.defaulttext.playlist_create.playlist_name, description: config.defaulttext.playlist_create.playlist_description.replace('&{name}',answ.display_name), track_array: answ.track_array, bot_options: answ.bot_options } //console.log(new_message); messages_with_vk_server.push(new_message); return 'no_answer'; break; case 'create_playlist_from_yandex': var answer = await command_get_liked_from_yandex(data); return answer; break; case 'yandex_login': var answer = await command_yandex_login(data); return answer; break; case 'like_playlist': var answ = await command_get_playlist(data); await command_like_tracks(answ); users_keys.get(data.id).is_waiting = false; return 'no_answer'; break; case 'download_track': var new_message = { id: data.id, type: 'download_track', text: data.text, refreshToken: data.refreshToken, options: data.options, answer: data.answer } messages_wait_Spotify_server.push(new_message); return 'no_answer'; /*var answer = await command_server_download_track(data); return answer;*/ break; case 'query': var answer = await command_query(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 { answer += JSON.stringify(await client.query(data.text)).replace(/{/g,'{\n').replace(/}/g,'\n}').replace(/,/g,',\n') await client.end(); } catch(e){ console.error(e); await client.end(); }; return answer; } //Отправить сообщение с ссылкой для авторизации async function command_login(data){ var answer = data.answer; return answer.replace('&{url}', spotifyApi.createAuthorizeURL(config.scopes,data.id,true)); } //Отправить сообщение со списком всех доступных комманд function command_help(data){ var answer = data.answer; config.commands.forEach(function (values,keys) { if(values.have_description) if((values.need_admin==data.is_Admin)||(!values.need_admin)) if((values.need_auth==data.is_Auth)||(values.show_after_login&&data.is_Auth)) answer += `\n ${keys} - ${values.description}`; }); if(data.is_Admin){ answer += `\n----------------------`; config.admin_commands.forEach(function (values,keys) { if(values.have_description) if((values.need_auth==data.is_Auth)||(values.show_after_login&&data.is_Auth)) answer += `\n ${keys} - ${values.description}`; }); } return answer; } //Выйти из профиля async function command_logout(data){ var del_user = `DELETE FROM USERS WHERE id = ${data.id};`; await client.query(del_user) users_keys.get(data.id).refreshToken = 'unauthorized'; return data.answer; } //Получить информацию о текущем профиле async function command_info_about_user(data){ var temp_spotifyApi = await getUserByRefreshToken(data.refreshToken,data.options); var answer = data.answer; const me = await temp_spotifyApi.getMe(); var current_song = await temp_spotifyApi.getMyCurrentPlayingTrack() .then(function(data) { if(data.body.item){ var song = data.body.item.name + ' - '; for (const artist of data.body.item.artists) song += artist.name + ', '; return song.substring(0,song.length-2); } else return false; }, function(err) { return false; }); if(current_song) answer +='\nСейчас играет: ' + current_song; const music = await temp_spotifyApi.getMySavedTracks({ limit : 1, offset: 0 }); return answer.replace('&{name}',me.body.display_name) .replace('&{email}',me.body.email) .replace('&{followers}',me.body.followers.total) .replace('&{total}',music.body.total); } //Получить 20 последних добавленных треков async function command_user_tracks(data){ var temp_spotifyApi = await getUserByRefreshToken(data.refreshToken,data.options); var answer = data.answer; const music = await temp_spotifyApi.getMySavedTracks({ limit : 20, offset: 0 }); for(var i=0; i0){ count++; var temp_spotifyApi = await getUserByRefreshToken(refreshToken,data.options); var user = await temp_spotifyApi.getMe(); answer += `\nПользователь: ${user.body.display_name} `; if(key[1].liked!=='nothing') answer += `💗`; if(key[0]==data.id) answer += ' (Вы)'; } } return answer.replace('&{count}',count); } var whitelist = [247608317,483162302,784291122,1239328626,955327894,374919212] async function command_update_all_liked(data){ var answer = data.answer; var command_info = config.commands.get('/save_to_playlist')||config.admin_commands.get('/save_to_playlist'); for await (const key of users_keys) { if(key[1].refreshToken !== 'unauthorized'&&whitelist.includes(key[0])) messages_wait_Spotify.push({ id : key[0], command : '/save_to_playlist', text : '', command_info : command_info, quite : true }); } return answer; } async function command_server_login(data){ var options = config.options.server_options; var answer = ""; for await (const server of options){ var temp_spotifyApi = await new SpotifyWebApi(server); answer += await data.answer.replace('&{url}', temp_spotifyApi.createAuthorizeURL(config.scopes,encodeURI(JSON.stringify(server)),true)); } return answer; } const got = require('got'); const PastebinAPI = require('pastebin-ts'); const pastebin = new PastebinAPI({ 'api_dev_key' : process.env.PASTEBIN_API_TOKEN }); async function spotify_addTracksToPlaylist(tracks,playlist_id,temp_spotifyApi,track_index){ try{ let ans = await temp_spotifyApi.addTracksToPlaylist(playlist_id, tracks, { position : track_index }); return ans; } catch (e) { await sleep(100); //console.log(e); return await spotify_addTracksToPlaylist(tracks,playlist_id,temp_spotifyApi,track_index); } } async function command_create_playlist(data){ data.temp_spotifyApi = await getUserByRefreshToken(data.options.refreshToken,data.options); if(data.save_playlist){ if(users_keys.get(data.id).liked == 'nothing'){ data.playlist_id = (await data.temp_spotifyApi.createPlaylist(data.name, { 'description': data.description, 'public': false })).body.id users_keys.get(data.id).liked=data.playlist_id; update_users.set(data.id); } else { data.playlist_id = users_keys.get(data.id).liked; data = await command_update_playlist(data); } } else data.playlist_id = (await data.temp_spotifyApi.createPlaylist(data.name, { 'description': data.description, 'public': false })).body.id var answer = config.defaulttext.playlist_created; if(data.quite === undefined) await bot.editMessageText(answer, data.bot_options); await command_add_tracks_to_playlist(data); return; } async function command_update_playlist(data){ data.text = 'spotifyplaylist/' + data.playlist_id; var tracks_in_playlist = await command_get_playlist(data); var track_array = []; for await(var track1 of data.track_array){ var isin = true; for await(var track2 of tracks_in_playlist.track_array) if(track1.id == track2.id) isin = false; if(isin) track_array.push(track1); } data.track_array = track_array; return data; } async function command_add_tracks_to_playlist(data){ let tracks_array = []; let track_index = 0; while(data.track_array.length>0){ let track = data.track_array.shift(); await tracks_array.push(track.uri); if(tracks_array.length==50||data.track_array.length==0){ await spotify_addTracksToPlaylist(tracks_array,data.playlist_id,data.temp_spotifyApi,track_index) track_index+=tracks_array.length; tracks_array = []; } } if(data.quite === undefined){ var reply = JSON.parse(data.bot_options.reply_markup); reply.inline_keyboard.push([ { text: config.defaulttext.playlist_save, callback_data: JSON.stringify({ command: "addP", p_id: data.playlist_id}) } ]); data.bot_options.parse_mode = 'HTML'; data.bot_options.reply_markup = JSON.stringify(reply); answer = config.defaulttext.playlist_done.replace('&{playlist_id}',data.playlist_id); await bot.editMessageText(answer, data.bot_options); } return; } async function command_addPlaylistToUser(data){ var refreshToken = users_keys.get(data.id).refreshToken; var temp_spotifyApi = await getUserByRefreshToken(refreshToken,data.options); await temp_spotifyApi.followPlaylist(data.playlist_id,{'public' : true}); await bot.answerCallbackQuery(data.msg_id,'Плейлист успешно добавлен'); return; } async function spotify_search(find,temp_spotifyApi,number){ try{ const ans = await temp_spotifyApi.searchTracks(find,{ limit : number||1 }); return ans; } catch (e) { await sleep(100); console.log(e); return await spotify_search(find,temp_spotifyApi,number); } } async function server_command_search_from_vk(data){ var answer = config.defaulttext.playlist_vk_create.playlist_in_process; await bot.editMessageText(answer ,{ chat_id: data.id, message_id : data.message_id, }); var audios = data.audios; var temp_spotifyApi = await getUserByRefreshToken(data.options.refreshToken,data.options); var done = 0; var errors = 0; var error_list = "Не удалось найти следующие треки:\n"; var total = audios.length; var track_array = []; var bot_options; while (audios.length>0) { let audio = audios.shift(); var find_ = `${audio.artist} ${audio.title}` .replace(/ x /g,' ') .replace(/(\[.*?\])/g, '') .trim().split(/(\(.*?\))/g); var find = ''; for await(const temp of find_) if(!temp.toLowerCase().startsWith('(prod.')&&!temp.toLowerCase().startsWith('(feat.')) find+=temp; find = find.replace(/feat./g,''); const ans = await spotify_search(find,temp_spotifyApi); if(ans.body.tracks.total>0){ done++; let track = ans.body.tracks.items[0]; let artists = []; for (const artist of track.artists) artists.push({id:artist.id,name:artist.name}) let track_info = { id:track.id, uri:track.uri, name:track.name, artists:artists }; await track_array.push(track_info); if(done%50==0){ bot_options = { chat_id: data.id, message_id : data.message_id, reply_markup : JSON.stringify({ inline_keyboard: [[ { text: config.defaulttext.playlist_vk_create.in_process.replace('&{done}',done).replace('&{total}',total).replace('&{errors}',errors), callback_data: JSON.stringify({command:"waiting"}) } ]] }) } await bot.editMessageText(answer ,bot_options); } } else{ errors++; error_list+=`${audio.title} | ${audio.artist}\n` } await sleep(10); } var url; await pastebin.createPaste({ text: error_list, title: data.name + "(не нашлись треки)", format: null, privacy: 1, expiration: '10M' }) .then((data) => { url = data; }) .catch((err) => { url = 'https://pastebin.com/XyBBXxLB'; }); bot_options = { chat_id: data.id, message_id : data.message_id, parse_mode: 'HTML', reply_markup : JSON.stringify({ inline_keyboard: [[ { text: config.defaulttext.playlist_vk_create.in_process.replace('&{done}',done).replace('&{total}',total).replace('&{errors}',errors), url: url } ]] }) } await bot.editMessageText(answer ,bot_options); var new_message = { id: data.id, type: 'create_playlist', name: data.name, description: data.description, track_array: track_array, bot_options: bot_options } messages_wait_Spotify_server.push(new_message); return; } function AllVariants(arr, prepend) { var i, version, el, result = []; prepend = prepend || []; if(arr.length === 1) return [arr]; for( i=0; i0) { let audio = audios.shift(); var find_ = `${audio.artist} ${audio.title}` .replace(/ x /g,' ') .replace(/(\[.*?\])/g, '') .trim().split(/(\(.*?\))/g); var find = ''; for await(const temp of find_) if(!temp.toLowerCase().startsWith('(prod.')&&!temp.toLowerCase().startsWith('(feat.')) find+=temp; find = find.replace(/feat./g,'').replace(/ – /gi,' ').replace(/ё/g,'е'); const ans = await spotify_search(find,temp_spotifyApi); if(ans.body.tracks.total>0){ done++; let track = ans.body.tracks.items[0]; let artists = []; for (const artist of track.artists) artists.push({id:artist.id,name:artist.name}) let track_info = { id:track.id, uri:track.uri, name:track.name, artists:artists }; await track_array.push(track_info); if(done%50==0){ bot_options = { chat_id: data.id, message_id : data.message_id, reply_markup : JSON.stringify({ inline_keyboard: [[ { text: config.defaulttext.playlist_vk_create.in_process.replace('&{done}',done).replace('&{total}',total).replace('&{errors}',errors), callback_data: JSON.stringify({command:"waiting"}) } ]] }) } await bot.editMessageText(answer ,bot_options); } } else{ errors++; error_list+=`${audio.title} | ${audio.artist}\n` } await sleep(10); } */ while(audios.length>0){ let track = audios.shift(); let combinations = AllVariants(track.artists); let ans = {body:{tracks:{total:0}}}; let track_name; while ( combinations.length>0) { let artists = combinations.shift(); artists = Array.from(artists, function (artist) {return artist.name} ).join(', '); track.albums.push({title:''}) while(ans.body.tracks.total == 0 && track.albums.length>0){ let album = track.albums.shift(); track_name = artists.replace(/ & /gi,' ').replace(/ x /gi,' ')/*track_name.substring(0,track_name.length-2)*/ + ' ' + track.title + ' ' + album.title; track_name = track_name.replace(/ – /gi,' ').replace(/ё/g,'е') ans = await spotify_search(track_name,temp_spotifyApi); } if(ans.body.tracks.total>0)break; } if(ans.body.tracks.total>0){ done++; let track = ans.body.tracks.items[0]; await track_array.push(track); if(done%50==0){ bot_options = { chat_id: data.id, message_id : data.message_id, reply_markup : JSON.stringify({ inline_keyboard: [[ { text: config.defaulttext.playlist_vk_create.in_process.replace('&{done}',done).replace('&{total}',total).replace('&{errors}',errors), callback_data: JSON.stringify({command:"waiting"}) } ]] }) } await bot.editMessageText(answer ,bot_options); } } else{ errors++; error_list+=`${track_name}\n` } } var url; await pastebin.createPaste({ text: error_list, title: data.name + "(не нашлись треки)", format: null, privacy: 1, expiration: '10M' }) .then((data) => { url = data; }) .catch((err) => { url = 'https://pastebin.com/XyBBXxLB'; }); bot_options = { chat_id: data.id, message_id : data.message_id, parse_mode: 'HTML', reply_markup : JSON.stringify({ inline_keyboard: [[ { text: config.defaulttext.playlist_vk_create.in_process.replace('&{done}',done).replace('&{total}',total).replace('&{errors}',errors), url: url } ]] }) } await bot.editMessageText(answer ,bot_options); var new_message = { id: data.id, type: 'create_playlist', name: data.name, description: data.description, track_array: track_array, bot_options: bot_options } messages_wait_Spotify_server.push(new_message); return; } async function haveRussianGenres(track,artist_genres){ let result = false; if( track.name.search(/[А-яЁё]/) != -1 ) result = true; for await (let artist of track.artists){ if( artist.name.search(/[А-яЁё]/) != -1 ) result = true; let genres = artist_genres.get(artist.id); if(genres.length==0) result = true; else for await (let genre of genres) if(genre.includes('russian')) result = true; } return result; } async function command_server_get_english_tracks(data){ //console.log(data); var temp_spotifyApi = await getUserByRefreshToken(data.options.refreshToken,data.options); let artists = []; let artist_genres = new Map(); for await (let track of data.track_array) for await (let artist of track.artists) if(!artists.includes(artist.id)) await artists.push(artist.id); let artist_array = []; while(artists.length>0){ let artist = artists.shift(); artist_array.push(artist); if(artist_array.length==50||artists.length==0){ let data = await temp_spotifyApi.getArtists(artist_array); ///////////////////////////////////////////////////////////////////// for (let art of data.body.artists) artist_genres.set(art.id,art.genres); artist_array = []; } } let result_track_array = []; for await (let track of data.track_array){ let isRussian = await haveRussianGenres(track,artist_genres); if(!isRussian) await result_track_array.push(track); // console.log(track.name); } return result_track_array; } async function command_server_get_dance_tracks(data){ //console.log(data); var temp_spotifyApi = await getUserByRefreshToken(data.options.refreshToken,data.options); let result_track_array = []; let tracks_array = []; while(data.track_array.length>0){ let track = data.track_array.shift(); await tracks_array.push(track.id); if(tracks_array.length==50||data.track_array.length==0){ let data = await temp_spotifyApi.getAudioFeaturesForTracks(tracks_array);////////////////////////////////////////////////////////////////// // console.log(data); for await (const track of data.body.audio_features) { if(track!=null) if(track.danceability>0.6) if(track.valence>0.6) { let track_info = { id:track.id, uri:track.uri } result_track_array.push(track_info); } } tracks_array = []; } // console.log(data.track_array.length); } //console.log(result_track_array.length); return result_track_array; } async function command_server_get_not_explicit_tracks(data){ let result_track_array = []; while(data.track_array.length>0){ let track = data.track_array.shift(); if(!track.explicit) await result_track_array.push(track); } return result_track_array; } const superagent = require('superagent'); async function command_create_playlist_from_vk(data){ await vk; var name = 'Аудиозаписи пользователя' var vk_id = data.text; if(!vk_id) return config.defaulttext.playlist_vk_create.rule; if(vk_id.startsWith('vk.com/')) vk_id = 'https://'+vk_id; if(vk_id.startsWith('https://vk.com/')){ await vk.call("users.get",{ user_ids: vk_id.slice(15), name_case: 'gen' }).then(async (response) => { vk_id = response[0].id; name = config.defaulttext.playlist_vk_create.playlist_name.replace('&{last_name}',response[0].last_name).replace('&{first_name}',response[0].first_name) }).catch(function(e) { console.log(e.error_msg); }); } else return config.defaulttext.playlist_vk_create.wrong_profile_url; if(!(/^\d+$/.test(vk_id))) return config.defaulttext.playlist_vk_create.wrong_id; //console.log(name); const msg = await bot.sendMessage(data.id, config.defaulttext.playlist_vk_create.playlist_vk_get); var next_from = true; var music_section = ''; var audios = []; while(next_from){ await vk.call("execute",{ profile_id: vk_id, next_from: next_from, music_section: music_section, code: ` var res = {}; var profile_id = Args.profile_id; res.next_from = Args.next_from; res.music_section = Args.music_section; res.audios = []; if (res.music_section == '') { var audios = API.catalog.getAudio({url:'https://vk.com/audios'+profile_id,need_blocks:1}); res.music_section = audios.catalog.sections[0].id; res.next_from = audios.catalog.sections[0].next_from; if(res.next_from){ res.audios = audios.audios; } } var i = 0; while(res.next_from != null && i < 20){ var audios_info = API.catalog.getSection({start_from: res.next_from, section_id: res.music_section}); var audios = audios_info.audios; if(audios!=null){ while(audios.length>0) res.audios.push(audios.shift()); } res.next_from = audios_info.section.next_from; i = i + 1; } return res;` }).then(async (response) => { while (response.getFullResponse().response.audios.length>0) await audios.push(response.getFullResponse().response.audios.shift()); next_from = response.getFullResponse().response.next_from; music_section = response.getFullResponse().response.music_section; bot_options = { chat_id: data.id, message_id : msg.message_id, reply_markup : JSON.stringify({ inline_keyboard: [[ { text: config.defaulttext.playlist_vk_create.vk_in_process.replace('&{done}',audios.length), callback_data: JSON.stringify({command:"waiting"}) } ]] }) } await bot.editMessageText(config.defaulttext.playlist_vk_create.playlist_vk_get ,bot_options); }).catch(function(e) { console.log(e.error_msg); }); await sleep(1000); } var message = { id: data.id, message_id: msg.message_id, type: 'search_from_vk', name: name, audios: audios, description : config.defaulttext.playlist_vk_create.playlist_description_profile } messages_wait_Spotify_server.push(message); return 'no_answer'; } async function command_create_playlist_from_vk_playlist(data){ var name = 'Плейлист из вк' var vk_url = data.text; if(!vk_url) return config.defaulttext.playlist_vk_create.playlist_rule; if(vk_url.startsWith('vk.com/')) vk_url = 'https://'+vk_url; var user_id = 0; var access_key; if(vk_url.startsWith('https://vk.com/audios')){ vk_url = vk_url.slice(21).split('?'); user_id = vk_url.shift(); vk_url = ('vk'+vk_url[0]).split('audio_playlist')[1].split('%2F') if(vk_url.length>1) access_key = vk_url[1]; vk_url = vk_url[0].split('/') if(vk_url.length>1) access_key = vk_url[1]; vk_url = 'https://vk.com/music?z=audio_playlist'+vk_url[0]+'/'+access_key; } if(vk_url.startsWith('https://vk.com/music/playlist/')) vk_url = 'https://vk.com/music?z=audio_playlist'+vk_url.slice(32); if(!vk_url.startsWith('https://vk.com/music?z=audio_playlist')) return config.defaulttext.playlist_vk_create.wrong_playlist_url; vk_url = vk_url.slice(37).split('/'); access_key = vk_url[1]; vk_url = vk_url[0].split(/_+/g); //console.log(vk_url,access_key); if(vk_url.length>2) access_key = vk_url[2]; var owner_id = vk_url[0],playlist_id = vk_url[1],offset=0,count=1000,fields,total=1; if(!((/^\d+$/.test(owner_id))&&(/^\d+$/.test(playlist_id)))) return config.defaulttext.playlist_vk_create.wrong_playlist_url; const msg = await bot.sendMessage(data.id, config.defaulttext.playlist_vk_create.playlist_vk_get); var first_name,last_name,description=''; var audios = []; while(total>offset){ await vk.call("execute",{ v: '5.144', user_id: user_id, owner_id: owner_id, playlist_id: playlist_id, offset: offset, access_key: access_key, count: count, fields: fields, code: ` var user_id = Args.user_id; var owner_id = Args.owner_id; if(user_id == 0) user_id = owner_id; var playlist_id = Args.playlist_id; var access_key = Args.access_key; var count = Args.count; var offset = Args.offset; var fields = Args.fields; var res = {}; if (offset == 0) { if(access_key == 'undefined'){ var playlists = API.catalog.getAudio({url:'https://vk.com/audios'+user_id,need_blocks:1}).playlists; while(playlists.length>0){ var playlist = playlists.shift(); if(playlist.original.playlist_id == playlist_id && playlist.original.owner_id == owner_id) access_key = playlist.original.access_key; } } res.playlist = API.audio.getPlaylistById({ owner_id: owner_id, playlist_id: playlist_id, access_key: access_key, ref: Args.ref }); if (res.playlist.type == 0) { if (owner_id < 0) { res.owner = API.groups.getById({ group_id: -owner_id, fields: fields }).groups[0]; } else { res.owner = API.users.get({ user_ids: owner_id, fields: fields })[0]; } } if (res.playlist.original != null) { if (res.playlist.original.owner_id < 0) { res.owner = API.groups.getById({ group_id: -res.playlist.original.owner_id, fields: fields }).groups[0]; } else { res.owner = API.users.get({ user_ids: res.playlist.original.owner_id, fields: fields })[0]; } } } res.audios = API.audio.get({ owner_id: owner_id, playlist_id: playlist_id, access_key: access_key, count: count, offset: offset, ref: Args.ref }).items; return res;` }).then(async (response) => { //console.log(response) //execute_errors = true; if(response.getFullResponse().response.playlist){ name = response.getFullResponse().response.playlist.title; total = response.getFullResponse().response.playlist.count; description = response.getFullResponse().response.playlist.description; access_key = response.getFullResponse().response.playlist.access_key; playlist_id = response.getFullResponse().response.playlist.id; owner_id = response.getFullResponse().response.playlist.owner_id; } if(response.getFullResponse().response.owner){ first_name = response.getFullResponse().response.owner.first_name; last_name = response.getFullResponse().response.owner.last_name; } //console.log(response.getFullResponse()) offset = offset + count; while(response.getFullResponse().response.audios.length>0) audios.push(response.getFullResponse().response.audios.shift()); bot_options = { chat_id: data.id, message_id : msg.message_id, reply_markup : JSON.stringify({ inline_keyboard: [[ { text: config.defaulttext.playlist_vk_create.vk_in_process.replace('&{done}',audios.length), callback_data: JSON.stringify({command:"waiting"}) } ]] }) } if(response.getFullResponse().execute_errors) await bot.editMessageText(config.defaulttext.playlist_vk_create.wrong_playlist_private,bot_options); else await bot.editMessageText(config.defaulttext.playlist_vk_create.playlist_vk_get ,bot_options); }).catch(function(e) { console.log(e.error_msg); }); await sleep(1000); } var message = { id: data.id, message_id: msg.message_id, type: 'search_from_vk', name: name, audios: audios, description : config.defaulttext.playlist_vk_create.playlist_description_playlist.replace('&{last_name}',last_name).replace('&{first_name}',first_name).replace('&{description)',description) } messages_wait_Spotify_server.push(message); return 'no_answer'; } const _yandex_config = { CLIENT_ID: "23cabbbdc6cd418abb4b39c32c41195d", CLIENT_SECRET: "53bc75238f0c4d08a118e51fe9203300", AUTH_URL: "https://oauth.yandex.ru/token", API_URL: "https://api.music.yandex.net:443" } async function command_yandex_login(data){ let credentials = data.text.split(" "); try{ let auth_body = (await superagent .post(_yandex_config.AUTH_URL) .send(`grant_type=password&client_id=${_yandex_config.CLIENT_ID}&client_secret=${_yandex_config.CLIENT_SECRET}&username=${credentials[0]}&password=${credentials[1]}`) .set('Content-Type', 'application/x-www-form-urlencoded') ).body; users_keys.get(data.id).yandex = { token: auth_body.access_token, uid: auth_body.uid } console.log(users_keys.get(data.id)); return JSON.stringify(auth_body); } catch(e){ console.log(e); return "Возникла ошибка при авторизации"; } } async function command_get_liked_from_yandex(data){ var name = 'Аудиозаписи яндекса'; try{ let tracks_body = (await superagent .get(`${_yandex_config.API_URL}/users/${users_keys.get(data.id).yandex.uid}/likes/tracks?if-modified-since-revision=0`) .set('Authorization', `OAuth ${users_keys.get(data.id).yandex.token}`) ).body.result; let tracks_array = tracks_body.library.tracks; let req = 'trackIds='; while(tracks_array.length>0){ let track = tracks_array.shift(); req+= track.id+':'+track.albumId+','; } if(req!='trackIds=')req=req.substring(0,req.length-1); let tracks_names = (await superagent .post(`${_yandex_config.API_URL}/tracks?with-positions=true`) .send(req) .set('Authorization', `OAuth ${users_keys.get(data.id).yandex.token}`) ).body.result; let audios = []; while (tracks_names.length>0) { let track = tracks_names.shift(); audios.push({title:track.title,artists:track.artists,albums:track.albums}) } const msg = await bot.sendMessage(data.id, "Аудио из яндекса получены"); //console.log(tracks_body.library.tracks.length); var message = { id: data.id, message_id: msg.message_id, type: 'search_from_yandex', name: name, audios: audios, description : "Аудио профиля яндекса:3" } messages_wait_Spotify_server.push(message); return "no_answer"; } catch(e){ console.log(e); return "Возникла ошибка при получении избранных треков"; } } async function command_get_info(data){ answer = data.answer; return answer; } async function get_vk_audio_id(track,i){ try { return (await superagent.get(`https://i120.kissvk.com/api/song/search/do?query=${track}`)).body; } catch(e){ console.log('ошибочка'); await sleep(200) if(i<10) { return await get_vk_audio_id(track,i+1); } else return {songs:[]}; } } async function vk_command_create_playlist(data){ var audios = []; for await (const track of data.track_array){ var track_name = ''; // console.log(track.artists); for await (var artist of track.artists) track_name += artist.name + ' '; track_name += track.name; audios.push(track_name) } await bot.editMessageText('Работает поиск треков в вк...',data.bot_options); var audios_ids = []; var i = 0; while(audios.length > 0){ var track = audios.shift(); const body = await get_vk_audio_id(encodeURI(track),0)//(await superagent.get(`https://i120.kissvk.com/api/song/search/do?query=${track}`)).body; if(body.songs.length>0) audios_ids.push(body.songs[0].id); // else console.log(track) await sleep(100); i++; if(i%10 == 0){ data.bot_options.reply_markup = JSON.stringify({ inline_keyboard: [[ { text: config.defaulttext.playlist_vk_create.vk_search_in_process.replace('&{done}',audios_ids.length).replace('&{errors}',i-audios_ids.length).replace('&{all}',i+audios.length), callback_data: JSON.stringify({command:"waiting"}) } ]] }) await bot.editMessageText('Работает поиск треков в вк...',data.bot_options); } } var playlist_id = -1; var profile_id = -1; var url = ''; await vk.call("execute",{ name: data.name, description: data.description, code: `var res = {}; var profile_id = API.users.get()[0].id; res.playlist_id = API.audio.createPlaylist({owner_id: profile_id, title: Args.name, description: Args.description}); return res;` }).then(async (response) => { playlist_id = response.getFullResponse().response.playlist_id.id; profile_id = response.getFullResponse().response.playlist_id.owner_id; url = `https://vk.com/music/playlist/${profile_id}_${playlist_id}_${response.getFullResponse().response.playlist_id.access_key}`; await bot.editMessageText(config.defaulttext.playlist_vk_create.vk_text_while_add_in_process,data.bot_options); }).catch(function(e) { console.log(e.error_msg); }); i = 0; var col = 0; var tracks_to_add = []; while(audios_ids.length>0) { tracks_to_add.push(audios_ids.shift()); i++; if(i%50 == 0 || audios_ids.length == 0){ //console.log(tracks_to_add); await vk.call("audio.addToPlaylist",{ audio_ids: tracks_to_add.join(','), playlist_id: playlist_id, owner_id: profile_id }).then(async (response) => { console.log(response) data.bot_options.reply_markup = JSON.stringify({ inline_keyboard: [[ { text: config.defaulttext.playlist_vk_create.vk_add_in_process.replace('&{done}',i), callback_data: JSON.stringify({command:"waiting"}) } ]] }) col += tracks_to_add.length; await bot.editMessageText(config.defaulttext.playlist_vk_create.vk_text_while_add_in_process,data.bot_options); }).catch(function(e) { console.log(e) console.log(e.error_msg); }); await sleep(1000); tracks_to_add = []; } } data.bot_options.reply_markup = JSON.stringify({ inline_keyboard: [[ { text: config.defaulttext.playlist_vk_create.vk_add_in_process.replace('&{done}',col), url: url } ]] }) await bot.editMessageText(config.defaulttext.playlist_vk_create.playlist_full_created,data.bot_options); console.log('закончил'); return ; } async function spotify_getPlaylistTracks(limit,offset,playlist_id,temp_spotifyApi){ try{ const ans = await temp_spotifyApi.getPlaylistTracks(playlist_id,{ limit : limit, offset: offset }); return ans; } catch (e) { await sleep(100); return await spotify_getPlaylistTracks(limit,offset,playlist_id,temp_spotifyApi); } } async function command_get_playlist(data){ var temp_spotifyApi = await getUserByRefreshToken(data.refreshToken||data.options.refreshToken,data.options); let playlist_id = data.text.split('playlist/')[1].split('?').shift(); var music = await spotify_getPlaylistTracks(1,0,playlist_id,temp_spotifyApi); var limit = 100; var total = music.body.total; var offset = 0; var track_array = []; if(total==0) return config.defaulttext.playlist_create.empty_playlist; var answer = config.defaulttext.playlist_create.playlist_get; var msg; if(data.quite === undefined) { if(data.bot_options) msg = await bot.editMessageText(answer, data.bot_options) else msg = await bot.sendMessage(data.id, answer, { reply_markup : JSON.stringify({ inline_keyboard: [[ { text: config.defaulttext.playlist_create.process_started.replace('&{total}',total), callback_data: JSON.stringify({command:"waiting"}) } ]] })}); } while (offset < total){ music = await spotify_getPlaylistTracks(limit,offset,playlist_id,temp_spotifyApi); for(var i=0; i0){ let track = data.track_array.shift(); await tracks_array.push(track.id); if(tracks_array.length==50||data.track_array.length==0){ var contains = await spotify_containsTracks(tracks_array,temp_spotifyApi) for(var i = 0;i0){ let track = track_array.shift(); await tracks_array.push(track); if(tracks_array.length==50||track_array.length==0){ await spotify_LikeTracks(tracks_array,temp_spotifyApi); tracks_array = []; } } answer = 'Работа закончена'; bot.editMessageText(answer, data.bot_options); return; } var music_ids = new Map(); async function command_server_get_track(data){ if(!data.text||data.text=="") return {err:`Пустой поисковый запрос... Используйте /download [текст для поиска] Например /download Lida Лиза`}; var temp_spotifyApi = await getUserByRefreshToken(data.options.refreshToken,data.options); var answer = await spotify_search(data.text,temp_spotifyApi) if(answer.body.tracks.total>0){ let track = answer.body.tracks.items[0]; return track; } else return {err:`Ничего не найдено`}; } const SpotifyDownloadApi = require('spotifydl-core').default async function command_server_download_track(data){ if(data.track.err) return await bot.sendMessage(data.id, data.track.err, {parse_mode: 'HTML'}); var track_name = ''; for await (var artist of data.track.artists) track_name += artist.name + ', '; track_name = track_name.substring(0,track_name.length-2) + ' - ' + data.track.name; if(music_ids.get(data.track.id)) return await bot.sendDocument(data.id, music_ids.get(data.track.id)) let msg = await bot.sendMessage(data.id, `Трек найден: ${track_name} Происходит загрузка с серверов Spotify...`,{parse_mode: 'HTML'}); let spotify = new SpotifyDownloadApi(options); let file = await spotify.downloadTrack(data.track.href); let fileOptions = { filename: `${data.track.name}.mp3`, contentType: `audio/mpeg`, }; await bot.editMessageText(`Трек найден: ${track_name} Загружаем в telegram...` ,{ chat_id: msg.chat.id, message_id : msg.message_id, parse_mode: 'HTML' }); file = await bot.sendDocument(data.id, file, {}, fileOptions); //console.log(file.audio); music_ids.set(data.track.id,file.audio.file_id) await bot.deleteMessage(msg.chat.id,msg.message_id); return; } /******************--- answer_for_messages ----**************************/ var messages = []; answer_for_messages(); var user_options = config.options.user_options; var messages_wait_Spotify = []; var messages_with_Spotify = []; add_messages_with_Spotify(); answer_for_messages_with_Spotify(); var server_options = config.options.server_options; var messages_wait_Spotify_server = []; var messages_with_Spotify_server = []; add_messages_with_Spotify_server(); answer_for_messages_with_Spotify_server(); var messages_with_vk_server = []; answer_for_messages_with_vk_server(); async function answer_for_messages_with_vk_server(){ var message = messages_with_vk_server.shift(); while (message) { var id = message.id; try { switch(message.type){ case 'create_playlist_from_spotify': await vk_command_create_playlist(message); console.log("создан плейлист вк"); break; /* case 'create_playlist': await command_create_playlist(message); users_keys.get(id).is_waiting = false; break;*/ } } catch (e) { console.log(e); // users_keys.get(id).is_waiting = false; } users_keys.get(id).is_waiting = false; message = messages_with_vk_server.shift(); } setTimeout(answer_for_messages_with_vk_server, 100); } async function add_messages_with_Spotify_server(){ while((messages_wait_Spotify_server.length > 0) && (server_options.length > 0)){ var message = messages_wait_Spotify_server.shift(); var options = server_options.shift(); message.options = options; await messages_with_Spotify_server.push(message); } setTimeout(add_messages_with_Spotify_server, 100); } async function answer_for_messages_with_Spotify_server(){ var message = messages_with_Spotify_server.shift(); while (message) { (async () => { var id = message.id; var opt = message.options; try { let data; switch(message.type){ case 'search_from_vk': await server_command_search_from_vk(message); break; case 'search_from_yandex': await server_command_search_from_yandex(message); break; case 'create_playlist': await command_create_playlist(message); break; case 'get_english_tracks': data = message; message.track_array = await command_server_get_english_tracks(data); await command_create_playlist(data); break; case 'get_dance_tracks': data = message; message.track_array = await command_server_get_dance_tracks(data); await command_create_playlist(data); break; case 'get_not_explicit_tracks': data = message; message.track_array = await command_server_get_not_explicit_tracks(data); await command_create_playlist(data); break; case 'download_track': data = message; data.track = await command_server_get_track(data); await command_server_download_track(data); break; } } catch (e) { console.log(e); users_keys.get(id).is_waiting = false; } server_options.push(opt); users_keys.get(id).is_waiting = false; })() .catch(e => { console.error(e); }); message = messages_with_Spotify_server.shift(); } setTimeout(answer_for_messages_with_Spotify_server, 100); } async function answer_for_messages(){ var message = messages.shift(); while (message) { var data = {}; var id = message.id; var command_info = message.command_info; var answer = ""; var buttons = []; var user_is_admin = (id == process.env.ADMIN_ID); if(command_info.need_admin&&!user_is_admin) answer = config.defaulttext.need_admin; else { var refreshToken = users_keys.get(id).refreshToken; var user_is_auth = !(refreshToken == 'unauthorized'); if(command_info.need_auth&&!user_is_auth) { answer = config.defaulttext.need_auth.answer; buttons = getButtonsByNames(config.defaulttext.need_auth.buttons,id); } else { if(command_info.another_after_login&&user_is_auth) { answer = command_info.answer_after_login; buttons = getButtonsByNames(command_info.buttons_after_login,id); } else { answer = command_info.answer || 'no_answer'; buttons = getButtonsByNames(command_info.buttons,id); if(command_info.function_name){ data = { name : command_info.function_name, id : id, answer : answer, is_Auth : user_is_auth, is_Admin : user_is_admin, refreshToken : refreshToken, text : message.text, msg : message.msg, quite : message.quite } try { users_keys.get(id).is_waiting = true; answer = await launchFunctionByName(data); } catch (e) { console.log(e); answer = 'Возникла ошибка'; users_keys.get(id).is_waiting = false; } } } } } message = messages.shift(); users_keys.get(id).is_waiting = false; if(answer != 'no_answer'){ if (answer.length >= 4000) while(answer.length>0&&data.quite === undefined){ await bot.sendMessage( id, answer.substring(0,4000), { parse_mode: 'HTML', reply_markup: { inline_keyboard: buttons } }); answer = answer.substring(4000); } else if(data.quite === undefined) bot.sendMessage( id, answer, { parse_mode: 'HTML', reply_markup: { inline_keyboard: buttons } }); } } setTimeout(answer_for_messages, 100); } async function add_messages_with_Spotify(){ while((messages_wait_Spotify.length > 0) && (user_options.length > 0)){ var message = messages_wait_Spotify.shift(); var options = user_options.shift(); message.options = options; //console.log(options); await messages_with_Spotify.push(message); } setTimeout(add_messages_with_Spotify, 100); } async function answer_for_messages_with_Spotify(){ var message = messages_with_Spotify.shift(); while (message) { var id = message.id; var answer = ""; var buttons = []; switch(message.type){ case 'add_playlist': try { await command_addPlaylistToUser(message); } catch (e) { console.log(e); bot.answerCallbackQuery(message.msg_id,'Возникла ошибка при добавлении плейлиста'); } users_keys.get(id).is_waiting = false; break; default: var command_info = message.command_info; var data = {}; var user_is_admin = (id == process.env.ADMIN_ID); if(command_info.need_admin&&!user_is_admin) answer = config.defaulttext.need_admin; else { var refreshToken = users_keys.get(id).refreshToken; var user_is_auth = !(refreshToken == 'unauthorized'); if(command_info.need_auth&&!user_is_auth) { answer = config.defaulttext.need_auth.answer; buttons = getButtonsByNames(config.defaulttext.need_auth.buttons,id); } else { if(command_info.another_after_login&&user_is_auth) { answer = command_info.answer_after_login; buttons = getButtonsByNames(command_info.buttons_after_login,id); } else { answer = command_info.answer || 'no_answer'; buttons = getButtonsByNames(command_info.buttons,id); if(command_info.function_name){ data = { name : command_info.function_name, id : id, answer : answer, is_Auth : user_is_auth, is_Admin : user_is_admin, refreshToken : refreshToken, text : message.text, options : message.options, msg : message.msg, quite : message.quite } if(message.msg) data.msg = message.msg; try { users_keys.get(id).is_waiting = true; answer = await launchFunctionByName(data); } catch (e) { console.log(e); answer = 'Возникла ошибка'; users_keys.get(id).is_waiting = false; } } } } } if(answer != 'no_answer'){ users_keys.get(id).is_waiting = false; if (answer.length >= 4000) while(answer.length>0&&data.quite === undefined){ await bot.sendMessage( id, answer.substring(0,4000), { parse_mode: 'HTML', reply_markup: { inline_keyboard: buttons } }); answer = answer.substring(4000); } else if(data.quite === undefined) bot.sendMessage( id, answer, { parse_mode: 'HTML', reply_markup: { inline_keyboard: buttons } }); } break; } user_options.push(message.options); message = messages_with_Spotify.shift(); } setTimeout(answer_for_messages_with_Spotify, 100); } /******************--- answer_for_messages ----**************************/ function start_answering(id,command,text){ if(!users_keys.get(id)) users_keys.set(id,{ refreshToken : 'unauthorized', only_not_explicit : false, only_popular : false, is_waiting : false }); if(!users_keys.get(id).is_waiting){ var command_info = config.commands.get(command)||config.admin_commands.get(command); if(!command_info) { bot.sendMessage( id, config.defaulttext.unknown); } else { if(command_info.using_spotifyApi||command_info.need_auth) messages_wait_Spotify.push({ id : id, command : command, text : text, command_info : command_info }); else messages.push({ id : id, command : command, text : text, command_info : command_info }); } } else bot.sendMessage( id, config.defaulttext.need_wait); } /******************--- bot.onText ----**************************/ bot.onText(/^/, function (msg) { //console.log(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); }); module.exports = bot; /******************--- bot.onText ----**************************/ bot.on("callback_query", function(data){ //console.log(data); const callbackId = data.id; var chatId; if(data.message) chatId = data.message.chat.id; let callback_data = JSON.parse(data.data); let buttons; switch (callback_data.command) { case "waiting": // console.log(chatId); bot.answerCallbackQuery(callbackId,'Ожидайте... Бот работает...'); //////////need_config_text break; case "addP": messages_wait_Spotify.push({ id : chatId, type : "add_playlist", playlist_id : callback_data.p_id, msg_id : callbackId }); break; case "download_track": start_answering(chatId,'/download',data.message.text.substring(31).replace('●','')); console.log(data.message.text.substring(31).replace('●',' - ')); bot.answerCallbackQuery(callbackId,'Выполнено!'); break; case "as_message": start_answering(chatId,callback_data.message); bot.answerCallbackQuery(callbackId,'Выполнено!'); break; case "menu_profile": buttons = getButtonsByNames(config.defaulttext.buttons_profile_menu,chatId); bot.editMessageText(config.defaulttext.menu_profile ,{ chat_id: chatId, message_id : data.message.message_id, parse_mode: 'HTML', reply_markup : JSON.stringify({ inline_keyboard: buttons }) }); break; case "menu_player": buttons = getButtonsByNames(config.defaulttext.buttons_player_menu,chatId); var command_info = config.commands.get('/remote_control')||config.admin_commands.get('/remote_control'); messages_wait_Spotify.push({ id : chatId, command : 'remote_control', text : '', command_info : command_info, msg : { chat_id: chatId, message_id : data.message.message_id, parse_mode: 'HTML', reply_markup : JSON.stringify({ inline_keyboard: buttons }) } }); break; case "menu_vk": buttons = getButtonsByNames(config.defaulttext.buttons_vk_menu,chatId); bot.editMessageText(config.defaulttext.menu_vk ,{ chat_id: chatId, message_id : data.message.message_id, parse_mode: 'HTML', reply_markup : JSON.stringify({ inline_keyboard: buttons }) }); break; case "menu_settings": buttons = getButtonsByNames(config.defaulttext.buttons_settings_menu,chatId); bot.editMessageText(config.defaulttext.menu_settings ,{ chat_id: chatId, message_id : data.message.message_id, parse_mode: 'HTML', reply_markup : JSON.stringify({ inline_keyboard: buttons }) }); break; case "menu_playlists": buttons = getButtonsByNames(config.defaulttext.buttons_playlists_menu,chatId); bot.editMessageText(config.defaulttext.menu_playlists ,{ chat_id: chatId, message_id : data.message.message_id, parse_mode: 'HTML', reply_markup : JSON.stringify({ inline_keyboard: buttons }) }); break; case "menu_main": buttons = getButtonsByNames(config.defaulttext.buttons_main_menu,chatId); bot.editMessageText(config.defaulttext.menu_main ,{ chat_id: chatId, message_id : data.message.message_id, parse_mode: 'HTML', reply_markup : JSON.stringify({ inline_keyboard: buttons }) }); break; case "change_filter_explicit": users_keys.get(chatId).only_not_explicit=!users_keys.get(chatId).only_not_explicit; buttons = getButtonsByNames(config.defaulttext.buttons_settings_menu,chatId); bot.editMessageText(config.defaulttext.menu_settings ,{ chat_id: chatId, message_id : data.message.message_id, parse_mode: 'HTML', reply_markup : JSON.stringify({ inline_keyboard: buttons }) }); update_users.set(chatId); break; case "change_filter_popular": users_keys.get(chatId).only_popular=!users_keys.get(chatId).only_popular; buttons = getButtonsByNames(config.defaulttext.buttons_settings_menu,chatId); bot.editMessageText(config.defaulttext.menu_settings ,{ chat_id: chatId, message_id : data.message.message_id, parse_mode: 'HTML', reply_markup : JSON.stringify({ inline_keyboard: buttons }) }); update_users.set(chatId); break; case "inline_dowload": inline_dowload_track(data.inline_message_id,callback_data.id) break; default: bot.answerCallbackQuery(callbackId,'Кнопка пока не работает'); //////need_config_text } }); /* bot.on("chosen_inline_result", function(data){ console.log(data); if(data.result_id!=0) inline_dowload_track(data.inline_message_id,data.result_id); });*/ async function inline_dowload_track(msgId,trackId){ if(music_ids.get(trackId)) bot.editMessageMedia({type:'document', media:music_ids.get(trackId), mime_type:"audio/mpeg",caption:""},{ inline_message_id: msgId}); else{ bot.editMessageText("Происходит загрузка с серверов Spotify..." ,{ inline_message_id: msgId }) let spotify = new SpotifyDownloadApi(options); let file = await spotify.downloadTrack("https://api.spotify.com/v1/tracks/"+trackId); bot.editMessageText("Загружаем в телеграмм..." ,{ inline_message_id: msgId }) file = await bot.sendDocument(-746476380,file); music_ids.set(trackId,file.audio.file_id) bot.editMessageMedia({type:'document', media:file.audio.file_id, mime_type:"audio/mpeg",caption:""},{ inline_message_id: msgId }) } } bot.on("inline_query", function(data){ let is_Auth = users_keys.get(data.from.id) != undefined; if(is_Auth) is_Auth = users_keys.get(data.from.id).refreshToken != 'unauthorized'; if(!is_Auth) { var answers = JSON.stringify([ {type:'article',id: "0", title:"Необходима авторизация", input_message_content:{message_text:"Для авторизации перейдите в чат @MySpotifyConnectBot"}, is_personal:true} ]); bot.answerInlineQuery(data.id,answers); } else search_and_answer_inline_query(data); }); async function search_and_answer_inline_query(data){ var temp_spotifyApi = await getUserByRefreshToken(users_keys.get(data.from.id).refreshToken,options); var find = await spotify_search(data.query,temp_spotifyApi,10); var answers = []; for await(var track of find.body.tracks.items) { var artists = ''; for (const artist of track.artists) artists += artist.name + ', '; artists = artists.substring(0,artists.length-2); if(music_ids.get(track.id)) answers.push({type:'document',id: track.id, title:track.name, description:artists, document_url:music_ids.get(track.id), mime_type:"audio/mpeg"}); else answers.push({type:'document',id: track.id, title:track.name, description:artists, caption:`Для загрузки ${track.name} - ${artists} нажмите кнопку`, document_url:'CQACAgIAAxkBAAIg7GGbzO7SzDUQqGzL8jNWVWorktCvAAIyEwACDEnhSMaVtC8QCrvPIgQ', mime_type:"audio/mpeg", thumb_url:track.album.images[0].url, /*input_message_content:{message_text:`Для загрузки ${track.name} - ${artists} нажмите кнопку`},*/ reply_markup:{parse_mode:"HTML",inline_keyboard:[[{ text: 'Скачать', callback_data: JSON.stringify({command:"inline_dowload",id:track.id}) }]]}}); } var answers = JSON.stringify(answers); bot.answerInlineQuery(data.id,answers); } /******************--- SpotifyInit ----**************************/ var SpotifyWebApi = require('spotify-web-api-node'); var spotifyClientId = process.env.SPOTIFY_CLIENT_ID; var spotifyClientSecret = process.env.SPOTIFY_CLIENT_SECRET; var spotifyRedirectUri = process.env.SPOTIFY_REDIRECT_URI; var options = { clientId: spotifyClientId, clientSecret: spotifyClientSecret, redirectUri: spotifyRedirectUri } var spotifyApi = new SpotifyWebApi(options); /******************--- SpotifyInit ----**************************/ /******************--- getAccessToken ----**************************/ async function getUserByRefreshToken(refreshToken, options){ // console.log(options); var temp_spotifyApi = new SpotifyWebApi(options); await temp_spotifyApi.setRefreshToken(refreshToken); const data = await temp_spotifyApi.refreshAccessToken(); temp_spotifyApi.setAccessToken(data.body['access_token']); return temp_spotifyApi; }/* async function getServerToken(options){ // console.log(options); var temp_spotifyApi = new SpotifyWebApi(options); const data = await temp_spotifyApi.clientCredentialsGrant(); temp_spotifyApi.setAccessToken(data.body['access_token']); return temp_spotifyApi; }*/ /******************--- getAccessToken ----**************************/ /******************--- 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(function(){ (async () => { var create_table = `CREATE TABLE IF NOT EXISTS USERS( ID INT PRIMARY KEY NOT NULL, REFRESH_TOKEN VARCHAR(150) NOT NULL DEFAULT 'unauthorized', ONLY_NOT_EXPLICIT BOOLEAN NOT NULL DEFAULT FALSE, ONLY_POPULAR BOOLEAN NOT NULL DEFAULT FALSE, LIKED VARCHAR(25) NOT NULL DEFAULT 'nothing', YANDEX VARCHAR(50) NOT NULL DEFAULT '{"token":"unauthorized"}' );`; await client.query(create_table) var load_users = `SELECT * FROM USERS;`; await client.query(load_users, (err,res) => { var users = res.rows; for(var i=0; i { console.error(e); }); }); /******************--- databaseConnect ----**************************/ /******************--- newUsersCheck ----**************************/ const newUsersClient = new Client({ connectionString: process.env.DATABASE_URL, ssl: { rejectUnauthorized: false } }); newUsersClient.connect(); function getUpdateUsers(){ (async () => { var load_users = `SELECT * FROM USERS;`; await newUsersClient.query(load_users, (err,res) => { var users = res.rows; for(var i=0; i { console.error(e); setTimeout(getUpdateUsers, 5000); }); } /******************--- newUsersCheck ----**************************/ var update_users = new Map(); const updateUsersClient = new Client({ connectionString: process.env.DATABASE_URL, ssl: { rejectUnauthorized: false } }); updateUsersClient.connect(); setTimeout(updateUsersOnServer, 5000); async function updateUsersOnServer(){ update_users.forEach(async(value,key,map)=>{ map.delete(key); let update = `UPDATE USERS SET ONLY_NOT_EXPLICIT = ${users_keys.get(key).only_not_explicit}, ONLY_POPULAR = ${users_keys.get(key).only_popular}, LIKED = '${users_keys.get(key).liked}' WHERE ID = ${key};` await updateUsersClient.query(update) }) setTimeout(updateUsersOnServer, 5000); }