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:
parent
954ba6faf4
commit
2a71a810e4
1 changed files with 115 additions and 29 deletions
144
discordbot.py
144
discordbot.py
|
@ -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
|
for index, video in enumerate(self.video_queue.list[:10]):
|
||||||
msg = "**Video in coda:**\n"
|
msg += f"{queue_emojis[index]} {str(video)}\n"
|
||||||
for index, video in enumerate(self.video_queue.list[:10]):
|
if len(self.video_queue) > 10:
|
||||||
msg += f"{queue_emojis[index]} {str(video)}\n"
|
msg += f"più altri {len(self.video_queue) - 10} video!"
|
||||||
if len(self.video_queue) > 10:
|
elif self.loop_mode == LoopMode.LOOP_QUEUE:
|
||||||
msg += f"più altri {len(self.video_queue) - 10} video!"
|
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...")
|
||||||
|
|
Loading…
Reference in a new issue