Spotify playlist hdcon
This commit is contained in:
+123
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user