1
Fork 0
mirror of https://github.com/RYGhub/royalnet.git synced 2024-11-27 13:34:28 +00:00

WIP: almost done

This commit is contained in:
Steffo 2018-12-04 10:18:00 +00:00
parent 954ba6faf4
commit 2a71a810e4

View file

@ -246,6 +246,8 @@ class LoopMode(enum.Enum):
LOOP_QUEUE = enum.auto() LOOP_QUEUE = enum.auto()
LOOP_SINGLE = enum.auto() LOOP_SINGLE = enum.auto()
FOLLOW_SUGGESTIONS = enum.auto() FOLLOW_SUGGESTIONS = enum.auto()
AUTO_SHUFFLE = enum.auto()
LOOPING_SHUFFLE = enum.auto()
class VideoQueue(): class VideoQueue():
@ -274,6 +276,7 @@ class VideoQueue():
self.list.insert(position, video) self.list.insert(position, video)
def advance_queue(self): def advance_queue(self):
"""Advance the queue to the next video."""
if self.loop_mode == LoopMode.NORMAL: if self.loop_mode == LoopMode.NORMAL:
try: try:
self.now_playing = self.list.pop(0) self.now_playing = self.list.pop(0)
@ -289,6 +292,16 @@ class VideoQueue():
self.now_playing = None self.now_playing = None
return return
self.now_playing = self.now_playing.suggestion() self.now_playing = self.now_playing.suggestion()
elif self.loop_mode == LoopMode.AUTO_SHUFFLE:
self.shuffle()
try:
self.now_playing = self.list.pop(0)
except IndexError:
self.now_playing = None
elif self.loop_mode == LoopMode.LOOPING_SHUFFLE:
self.shuffle()
self.add(self.list[0])
self.now_playing = self.list.pop(0)
def next_video(self) -> typing.Optional[Video]: def next_video(self) -> typing.Optional[Video]:
if len(self.list) == 0: if len(self.list) == 0:
@ -302,9 +315,6 @@ class VideoQueue():
self.list = None self.list = None
self.now_playing = None self.now_playing = None
def forward(self) -> None:
self.now_playing = self.list.pop(0)
def find_video(self, name: str) -> typing.Optional[Video]: def find_video(self, name: str) -> typing.Optional[Video]:
"""Returns the first video with a certain name.""" """Returns the first video with a certain name."""
for video in self.list: for video in self.list:
@ -430,7 +440,9 @@ class RoyalDiscordBot(discord.Client):
"!yes": self.null, "!yes": self.null,
"!no": self.null, "!no": self.null,
"!pause": self.cmd_pause, "!pause": self.cmd_pause,
"!resume": self.cmd_resume "!resume": self.cmd_resume,
"!loop": self.cmd_loop,
"!l": self.cmd_loop
} }
self.video_queue: VideoQueue = VideoQueue() self.video_queue: VideoQueue = VideoQueue()
self.load_config("config.ini") self.load_config("config.ini")
@ -513,13 +525,13 @@ class RoyalDiscordBot(discord.Client):
} }
}) })
if not message.content.startswith("!"): if not message.content.startswith("!"):
await message.channel.send(f":warning: In questa chat sono consentiti solo comandi per il bot.\n" await message.channel.send(f"⚠️ In questa chat sono consentiti solo comandi per il bot.\n"
f"Riinvia il tuo messaggio in un altro canale!") f"Riinvia il tuo messaggio in un altro canale!")
await message.delete() await message.delete()
return return
data = message.content.split(" ") data = message.content.split(" ")
if data[0] not in self.commands: if data[0] not in self.commands:
await message.channel.send(":warning: Comando non riconosciuto.") await message.channel.send("⚠️ Comando non riconosciuto.")
return return
logger.debug(f"Received command: {message.content}") logger.debug(f"Received command: {message.content}")
sentry.extra_context({ sentry.extra_context({
@ -802,7 +814,7 @@ class RoyalDiscordBot(discord.Client):
functools.partial(ytdl.extract_info, url=url, download=False)) functools.partial(ytdl.extract_info, url=url, download=False))
if info is None: if info is None:
logger.debug(f"No video found at {url}.") logger.debug(f"No video found at {url}.")
await self.main_channel.send(f" Non è stato trovato nessun video all'URL `{url}`," await self.main_channel.send(f" Non è stato trovato nessun video all'URL `{url}`,"
f" pertanto non è stato aggiunto alla coda.") f" pertanto non è stato aggiunto alla coda.")
return return
if "entries" in info: if "entries" in info:
@ -834,7 +846,7 @@ class RoyalDiscordBot(discord.Client):
royal_username=params[0], royal_username=params[0],
discord_user=author) discord_user=author)
except errors.AlreadyExistingError: except errors.AlreadyExistingError:
await channel.send(" Il tuo account Discord è già collegato a un account RYG " await channel.send(" Il tuo account Discord è già collegato a un account RYG "
"o l'account RYG che hai specificato è già collegato a un account Discord.") "o l'account RYG che hai specificato è già collegato a un account Discord.")
return return
session.add(d) session.add(d)
@ -846,13 +858,13 @@ class RoyalDiscordBot(discord.Client):
async def cmd_cv(self, channel: discord.TextChannel, author: discord.Member, params: typing.List[str]): async def cmd_cv(self, channel: discord.TextChannel, author: discord.Member, params: typing.List[str]):
"""Summon the bot in the author's voice channel.""" """Summon the bot in the author's voice channel."""
if author is None: if author is None:
await channel.send(" Questo comando richiede un autore.") await channel.send(" Questo comando richiede un autore.")
return return
if author.voice is None: if author.voice is None:
await channel.send(" Non sei in nessun canale!") await channel.send(" Non sei in nessun canale!")
return return
if author.voice.channel == self.main_guild.afk_channel: if author.voice.channel == self.main_guild.afk_channel:
await channel.send(" Non posso connettermi al canale AFK!") await channel.send(" Non posso connettermi al canale AFK!")
return return
if author.voice.channel.bitrate < 64000: if author.voice.channel.bitrate < 64000:
await channel.send(" Sei in un canale con un bitrate ridotto.\n" await channel.send(" Sei in un canale con un bitrate ridotto.\n"
@ -879,7 +891,7 @@ class RoyalDiscordBot(discord.Client):
@requires_connected_voice_client @requires_connected_voice_client
async def cmd_play(self, channel: discord.TextChannel, author: discord.Member, params: typing.List[str]): async def cmd_play(self, channel: discord.TextChannel, author: discord.Member, params: typing.List[str]):
if len(params) < 2: if len(params) < 2:
await channel.send(" Non hai specificato una canzone da riprodurre!\n" await channel.send(" Non hai specificato una canzone da riprodurre!\n"
"Sintassi: `!play <url|ricercayoutube|nomefile>`") "Sintassi: `!play <url|ricercayoutube|nomefile>`")
return return
channel.typing() channel.typing()
@ -916,13 +928,13 @@ class RoyalDiscordBot(discord.Client):
logger.debug(f"A song was skipped.") logger.debug(f"A song was skipped.")
break break
else: else:
await channel.send(" Non c'è nessun video in riproduzione.") await channel.send(" Non c'è nessun video in riproduzione.")
@command @command
@requires_connected_voice_client @requires_connected_voice_client
async def cmd_remove(self, channel: discord.TextChannel, author: discord.Member, params: typing.List[str]): async def cmd_remove(self, channel: discord.TextChannel, author: discord.Member, params: typing.List[str]):
if len(self.video_queue) == 0: if len(self.video_queue) == 0:
await channel.send(" Non c'è nessun video in coda.") await channel.send(" Non c'è nessun video in coda.")
return return
if len(params) == 1: if len(params) == 1:
index = len(self.video_queue) - 1 index = len(self.video_queue) - 1
@ -930,12 +942,12 @@ class RoyalDiscordBot(discord.Client):
try: try:
index = int(params[1]) - 1 index = int(params[1]) - 1
except ValueError: except ValueError:
await channel.send(" Il numero inserito non è valido.\n" await channel.send(" Il numero inserito non è valido.\n"
"Sintassi: `!remove [numerovideoiniziale] [numerovideofinale]`") "Sintassi: `!remove [numerovideoiniziale] [numerovideofinale]`")
return return
if len(params) < 3: if len(params) < 3:
if abs(index) >= len(self.video_queue): if abs(index) >= len(self.video_queue):
await channel.send(" Il numero inserito non corrisponde a nessun video nella playlist.\n" await channel.send(" Il numero inserito non corrisponde a nessun video nella playlist.\n"
"Sintassi: `!remove [numerovideoiniziale] [numerovideofinale]`") "Sintassi: `!remove [numerovideoiniziale] [numerovideofinale]`")
return return
video = self.video_queue.list.pop(index) video = self.video_queue.list.pop(index)
@ -945,27 +957,27 @@ class RoyalDiscordBot(discord.Client):
try: try:
start = int(params[1]) - 1 start = int(params[1]) - 1
except ValueError: except ValueError:
await channel.send(" Il numero iniziale inserito non è valido.\n" await channel.send(" Il numero iniziale inserito non è valido.\n"
"Sintassi: `!remove [numerovideoiniziale] [numerovideofinale]`") "Sintassi: `!remove [numerovideoiniziale] [numerovideofinale]`")
return return
if start >= len(self.video_queue): if start >= len(self.video_queue):
await channel.send(" Il numero iniziale inserito non corrisponde a nessun video nella" await channel.send(" Il numero iniziale inserito non corrisponde a nessun video nella"
" playlist.\n" " playlist.\n"
"Sintassi: `!remove [numerovideoiniziale] [numerovideofinale]`") "Sintassi: `!remove [numerovideoiniziale] [numerovideofinale]`")
return return
try: try:
end = int(params[2]) - 2 end = int(params[2]) - 2
except ValueError: except ValueError:
await channel.send(" Il numero finale inserito non è valido.\n" await channel.send(" Il numero finale inserito non è valido.\n"
"Sintassi: `!remove [numerovideoiniziale] [numerovideofinale]`") "Sintassi: `!remove [numerovideoiniziale] [numerovideofinale]`")
return return
if end >= len(self.video_queue): if end >= len(self.video_queue):
await channel.send(" Il numero finale inserito non corrisponde a nessun video nella" await channel.send(" Il numero finale inserito non corrisponde a nessun video nella"
" playlist.\n" " playlist.\n"
"Sintassi: `!remove [numerovideoiniziale] [numerovideofinale]`") "Sintassi: `!remove [numerovideoiniziale] [numerovideofinale]`")
return return
if start > end: if start > end:
await channel.send(" Il numero iniziale è maggiore del numero finale.\n" await channel.send(" Il numero iniziale è maggiore del numero finale.\n"
"Sintassi: `!remove [numerovideoiniziale] [numerovideofinale]`") "Sintassi: `!remove [numerovideoiniziale] [numerovideofinale]`")
return return
del self.video_queue.list[start:end] del self.video_queue.list[start:end]
@ -974,15 +986,61 @@ class RoyalDiscordBot(discord.Client):
@command @command
async def cmd_queue(self, channel: discord.TextChannel, author: discord.Member, params: typing.List[str]): async def cmd_queue(self, channel: discord.TextChannel, author: discord.Member, params: typing.List[str]):
msg = ""
if self.loop_mode == LoopMode.NORMAL:
msg += "Modalità attuale: ➡️ **Nessuna ripetizione**\n\n"
elif self.loop_mode == LoopMode.LOOP_QUEUE:
msg += "Modalità attuale: 🔁 **Ripeti intera coda**\n\n"
elif self.loop_mode == LoopMode.LOOP_SINGLE:
msg += "Modalità attuale: 🔂 **Ripeti canzone singola**\n\n"
elif self.loop_mode == LoopMode.FOLLOW_SUGGESTIONS:
msg += "Modalità attuale: 🔃 **Continua con video suggeriti**\n\n"
elif self.loop_mode == LoopMode.AUTO_SHUFFLE:
msg += "Modalità attuale: 🔀 **Video casuale dalla coda**\n\n"
elif self.loop_mode == LoopMode.LOOPING_SHUFFLE:
msg += "Modalità attuale: 🔄 **Ripeti casualmente dalla coda**\n\n"
msg += "**Video in coda:**\n"
if len(self.video_queue) == 0: if len(self.video_queue) == 0:
await channel.send("**Video in coda:**\n" msg += "☁️ _nessuno_"
"nessuno") if self.loop_mode == LoopMode.NORMAL:
return
msg = "**Video in coda:**\n"
for index, video in enumerate(self.video_queue.list[:10]): for index, video in enumerate(self.video_queue.list[:10]):
msg += f"{queue_emojis[index]} {str(video)}\n" msg += f"{queue_emojis[index]} {str(video)}\n"
if len(self.video_queue) > 10: if len(self.video_queue) > 10:
msg += f"più altri {len(self.video_queue) - 10} video!" msg += f"più altri {len(self.video_queue) - 10} video!"
elif self.loop_mode == LoopMode.LOOP_QUEUE:
for index, video in enumerate(self.video_queue.list[:10]):
msg += f"{queue_emojis[index]} {str(video)}\n"
if len(self.video_queue) > 10:
msg += f"più altri {len(self.video_queue) - 10} video che si ripetono!"
if len(self.video_queue) < 6:
count = len(self.video_queue)
while count < 10:
for index, video in enumerate(self.video_queue.list[:10]):
msg += f"*️⃣ {str(video)}\n"
count += len(self.video_queue)
elif self.loop_mode == LoopMode.LOOP_SINGLE:
video = self.video_queue[0]
msg += f"1{str(video)}\n"
for index in range(9):
msg += f"*️⃣ {str(video)}\n"
elif self.loop_mode == LoopMode.FOLLOW_SUGGESTIONS:
msg += "🌈"
elif self.loop_mode == LoopMode.AUTO_SHUFFLE:
for index, video in enumerate(self.video_queue.list[:10]):
msg += f"#️⃣ {str(video)}\n"
if len(self.video_queue) > 10:
msg += f"più altri {len(self.video_queue) - 10} video!"
elif self.loop_mode == LoopMode.LOOPING_SHUFFLE:
for index, video in enumerate(self.video_queue.list[:10]):
msg += f"#️⃣ {str(video)}\n"
if len(self.video_queue) > 10:
msg += f"più altri {len(self.video_queue) - 10} video che si ripetono!"
if len(self.video_queue) < 6:
count = len(self.video_queue)
while count < 10:
for index, video in enumerate(self.video_queue.list[:10]):
msg += f"*️⃣ {str(video)}\n"
count += len(self.video_queue)
await channel.send(msg) await channel.send(msg)
@command @command
@ -1070,6 +1128,34 @@ class RoyalDiscordBot(discord.Client):
logger.debug(f"The audio stream was resumed.") logger.debug(f"The audio stream was resumed.")
await channel.send(f"⏯ Riproduzione ripresa.") await channel.send(f"⏯ Riproduzione ripresa.")
@command
@requires_connected_voice_client
async def cmd_loop(self, channel: discord.TextChannel, author: discord.Member, params: typing.List[str]):
if len(params) < 2:
await channel.send("⚠ Sintassi del comando non valida.\n"
"Sintassi: `!loop <off|loop1|loopall|suggest|shuffle|loopshuffle>`")
if params[1] == "off":
self.video_queue.loop_mode = LoopMode.NORMAL
await channel.send("➡️ Modalità di coda impostata: **Nessuna ripetizione**")
elif params[1] == "loop1":
self.video_queue.loop_mode = LoopMode.LOOP_SINGLE
await channel.send("🔂 Modalità di coda impostata: **Ripeti canzone singola**")
elif params[1] == "loopall":
self.video_queue.loop_mode = LoopMode.LOOP_QUEUE
await channel.send("🔁 Modalità di coda impostata: **Ripeti intera coda**")
elif params[1] == "suggest":
# self.video_queue.loop_mode = LoopMode.FOLLOW_SUGGESTIONS
await channel.send("⚠️ La modalità **Continua con video suggeriti** non è ancora stata implementata.")
elif params[1] == "shuffle":
self.video_queue.loop_mode = LoopMode.AUTO_SHUFFLE
await channel.send("🔀 Modalità di coda impostata: **Video casuale dalla coda**")
elif params[1] == "loopshuffle":
self.video_queue.loop_mode = LoopMode.LOOPING_SHUFFLE
await channel.send("🔄 Modalità di coda impostata: **Ripeti casualmente dalla coda**")
else:
await channel.send("⚠️ Sintassi del comando non valida.\n"
"Sintassi: `!loop <off|loop1|loopall|suggest|shuffle|loopshuffle>`")
def process(users_connection=None): def process(users_connection=None):
logger.info("Initializing the bot...") logger.info("Initializing the bot...")