Spotify playlist hdcon

This commit is contained in:
Mark Hoekveen
2019-08-18 17:35:22 +02:00
parent 1c17e1a753
commit d50e746d2f
2 changed files with 125 additions and 0 deletions
+123
View File
@@ -0,0 +1,123 @@
import discord
from discord.ext import commands
from discord.ext.commands import Bot
import json
import spotipy
import spotipy.util as util
from spotipy.oauth2 import SpotifyClientCredentials
import asyncio
import random
import time
from json.decoder import JSONDecodeError
class Spotify(commands.Cog):
"""HD Con 2019 Playlist features! Alleen te gebruiken in het juiste kanaal"""
def __init__(self, bot):
self.bot = bot
#voting settings
self.desired_count = 2 # aantal upvotes dat nodig is om een liedje in de lijst te krijgen
self.veto_count = 2 # aantal downvotes dat nodig is om een liedje weg te stemmen
self.thumbs_up = '👌' #"\N{Ok Hand Sign}"
self.thumbs_down = '🙅' #"\N{Face With No Good Gesture}"
self.stemkanaal_naam = 'top2000' # naam van het stemkanaal
#All the spotipy settings
self.redirect = 'http://localhost' #must match app settings.
self.scope = 'user-read-private user-read-playback-state user-modify-playback-state playlist-modify-public playlist-modify-private'
self.username = self.bot.tokens["spotifyUsername"]
self.secret = self.bot.tokens["spotifySecret"]
self.client = self.bot.tokens["spotifyId"]
self.playlist_id = self.bot.tokens["spotifyPlaylist"]
#Create spotipy objects for authentication
client_credentials_manager = SpotifyClientCredentials(
client_id=self.client,
client_secret=self.secret)
self.token = util.prompt_for_user_token(
username=self.username,
scope=self.scope,
client_id=self.client,
client_secret=self.secret,
redirect_uri=self.redirect)
self.sp_app = spotipy.Spotify(client_credentials_manager=client_credentials_manager)
self.sp_user = spotipy.Spotify(auth=self.token)
@self.bot.event
@asyncio.coroutine
def on_reaction_add(reaction, user):
# Als kanaal niet top2000 is niet tellen
if not reaction.message.channel.name.startswith(self.stemkanaal_naam):
return
# Bij genoeg stemmen voor
if reaction.emoji == self.thumbs_up and reaction.count >= self.desired_count:
print(str(reaction.message.content)) # debugging
with open("lijst.txt", "a") as f:
f.write(str(reaction.message.content)+'\n')
self.nummer_toevoegen(str(reaction.message.content))
yield from reaction.message.delete() # verwijder poll
yield from reaction.message.channel.send("Dit nummer heeft genoeg stemmen ontvangen en is op de lijst gezet: " + str(reaction.message.content))
# Bij genoeg stemmen tegen
elif reaction.emoji == self.thumbs_down and reaction.count >= self.veto_count:
stemmen = reaction.message.reactions[0].count - 1 # tel het aantal voor-stemmen
if stemmen == 1: men = '' # om de grammar nazi's een plezier te doen
else: men = 'men'
yield from reaction.message.channel.send("Helaas, dit nummer heeft het ondanks " + str(stemmen) + " stem" + men + " niet gehaald: " + str(reaction.message.content))
try:
yield from ctx.message.delete()
except:
pass
#Properties and helper functions
@property
def playlist(self):
playlist_results = self.sp_user.user_playlist(self.username, self.playlist_id)
playlist_results = playlist_results['tracks']['items']
return playlist_results
def nummer_toevoegen(self, nummer):
tracks = ["spotify:track:"+nummer[31:]] # Het moet in een list
self.sp_user.user_playlist_add_tracks(user=self.username, playlist_id=self.playlist_id, tracks=tracks)
#User-facing commands
@commands.command(pass_context=True, hidden=False)
@asyncio.coroutine
def geefplaylist(self, ctx):
yield from ctx.channel.send(ctx.author.mention + " https://open.spotify.com/playlist/" + self.playlist_id)
try:
yield from ctx.message.delete()
except:
pass
@commands.command(pass_context=True, hidden=False)
@asyncio.coroutine
def nummers(self, ctx):
yield from ctx.channel.send(str(len(self.playlist)))
@commands.command(pass_context=True, hidden=False)
@asyncio.coroutine
def stem(self, ctx, *, text=None):
'''Stel een liedje voor dat in de HDcon afspeellijst moet komen! De rest mag dan stemmen.
Werkt alleen in het #top2000 kanaal.
Bijvoorbeeld:
!stem https://open.spotify.com/track/LOr3miP5uMd0l0R51t4m3T'''
# Maak lijst met links om dubbele nummers te vermijden
voorlopigelijst = [line.rstrip('\n') for line in open('lijst.txt')]
# if not ctx.channel.id == stemkanaal: # ??? kapoet ???
if not ctx.channel.name.startswith(self.stemkanaal_naam): # indien verkeerde kanaal
yield from ctx.channel.send(ctx.author.mention + ", stemmen doen we in het " + self.stemkanaal + " kanaal")
return
elif text in voorlopigelijst: # filter duplicaten
yield from ctx.channel.send(ctx.author.mention + ", je hebt geluk: dit liedje is reeds in de lijst opgenomen!")
return
if text != None and text.startswith("https://open.spotify.com/track/"): # indien geen leeg commando en valide link
message = yield from ctx.channel.send(text)
for emoji in (self.thumbs_up, self.thumbs_down): # geeft stemkeuze
yield from message.add_reaction(emoji)
else:
yield from ctx.channel.send(ctx.author.mention + ", je moet wel een valide link geven waar we op kunnen stemmen!")
try:
yield from ctx.message.delete()
except:
pass # pas op icm !stemtest