127 lines
3.9 KiB
JavaScript
127 lines
3.9 KiB
JavaScript
const { EmbedBuilder } = require('@discordjs/builders');
|
|
const fs = require('fs');
|
|
|
|
async function getAllPlaylistTracks() {
|
|
let allTracks = [];
|
|
let offset = 0;
|
|
const limit = 100;
|
|
let total = 0;
|
|
|
|
do {
|
|
await fetch(
|
|
`https://api.spotify.com/v1/playlists/${process.env.spotifyPlaylistTracking}/tracks?limit=${limit}&offset=${offset}`,
|
|
{
|
|
method: 'GET',
|
|
headers: {
|
|
'Authorization': `Bearer ${process.env.spotifyAccessToken}`,
|
|
},
|
|
},
|
|
)
|
|
.then(response => response.json())
|
|
.then(response => {
|
|
allTracks = allTracks.concat(response.items);
|
|
total = response.total;
|
|
offset += limit;
|
|
})
|
|
.catch(err => {
|
|
console.log(err);
|
|
});
|
|
} while (allTracks.length < total);
|
|
|
|
return allTracks;
|
|
}
|
|
|
|
|
|
let seenTrackIds = new Set();
|
|
|
|
async function PostNewPlaylistUpdates(client) {
|
|
if (!process.env.spotifyPlaylistTracking || !process.env.spotifyPlaylistChannel || !process.env.spotifyAccessToken) {
|
|
return;
|
|
}
|
|
|
|
if (fs.existsSync('./playlistContent.json')) {
|
|
seenTrackIds = new Set(JSON.parse(fs.readFileSync('./playlistContent.json', 'utf-8')));
|
|
}
|
|
else {
|
|
seenTrackIds = new Set();
|
|
}
|
|
|
|
|
|
const tracks = await getAllPlaylistTracks();
|
|
if (tracks.length <= 1) return;
|
|
|
|
const currentIds = tracks.map(item => item.track.id);
|
|
|
|
let newTracks;
|
|
|
|
if (seenTrackIds.size > 0)
|
|
{
|
|
newTracks = currentIds.filter(id => !seenTrackIds.has(id));
|
|
} else {
|
|
newTracks = currentIds;
|
|
}
|
|
|
|
const channel = await client.channels.cache.get(process.env.spotifyPlaylistChannel);
|
|
|
|
for (const trackID of newTracks) {
|
|
// Send discord embeds;
|
|
const track = tracks.find(item => item.track.id === trackID);
|
|
|
|
console.log(track);
|
|
|
|
const embed = new EmbedBuilder()
|
|
|
|
.setColor(0x1db954)
|
|
.setTitle(`${track.track.name} added!`)
|
|
.setURL(track.track.external_urls.spotify)
|
|
.setFooter({ text: 'The Ochulus • 100 Games Challenge', iconURL: client.user.avatarURL() })
|
|
.setTimestamp();
|
|
|
|
if (track.added_by) {
|
|
await fetch(
|
|
`https://api.spotify.com/v1/users/${track.added_by.id}`,
|
|
{
|
|
method: 'GET',
|
|
headers: {
|
|
'Authorization': `Bearer ${process.env.spotifyAccessToken}`,
|
|
},
|
|
},
|
|
)
|
|
.then(response => response.json())
|
|
.then(response => {
|
|
if (response.images.length > 0) {
|
|
embed.setAuthor({ name: `${response.display_name} added a new song!`, iconURL: response.images[0].url });
|
|
}
|
|
else {
|
|
embed.setAuthor({ name: `${response.display_name} added a new song!` });
|
|
}
|
|
})
|
|
.catch(err => {
|
|
console.log(err);
|
|
});
|
|
}
|
|
|
|
embed.addFields({ name: 'Title', value: `[${track.track.name}](${track.track.external_urls.spotify})`, inline: true });
|
|
|
|
const artists = track.track.artists.map(artist => `[${artist.name}](${artist.external_urls.spotify})`).join(', ');
|
|
embed.addFields({ name: 'Artists', value: artists, inline: true });
|
|
|
|
embed.addFields({ name: 'Album', value: `[${track.track.album.name}](${track.track.album.external_urls.spotify})`, inline: true });
|
|
|
|
if (track.track.album.images.length > 0)
|
|
{
|
|
embed.setThumbnail(track.track.album.images[0].url);
|
|
}
|
|
|
|
await channel.send({ embeds: [embed] });
|
|
}
|
|
|
|
seenTrackIds = new Set(currentIds);
|
|
|
|
fs.writeFileSync('./playlistContent.json', JSON.stringify([...seenTrackIds]));
|
|
}
|
|
|
|
module.exports = {
|
|
getAllPlaylistTracks,
|
|
PostNewPlaylistUpdates,
|
|
}; |