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

Add stuff

This commit is contained in:
Steffo 2019-04-23 16:45:21 +02:00
parent 00733c4ef1
commit 3621e60dea
3 changed files with 41 additions and 25 deletions

View file

@ -42,10 +42,10 @@ class ErrorHandlerCommand(Command):
await call.reply("⚠️ Il bot non è stato configurato correttamente, quindi questo comando non può essere eseguito. L'errore è stato segnalato all'amministratore.") await call.reply("⚠️ Il bot non è stato configurato correttamente, quindi questo comando non può essere eseguito. L'errore è stato segnalato all'amministratore.")
return return
if isinstance(exception, RoyalnetError): if isinstance(exception, RoyalnetError):
await call.reply(f"⚠️ La richiesta a Royalnet ha restituito un errore: {exception.exc}") await call.reply(f"⚠️ La richiesta a Royalnet ha restituito un errore: [p]{exception.exc}[/p]")
return return
if isinstance(exception, ExternalError): if isinstance(exception, ExternalError):
await call.reply("⚠️ Una risorsa esterna necessaria per l'esecuzione del comando non ha funzionato correttamente, quindi il comando è stato annullato.") await call.reply("⚠️ Una risorsa esterna necessaria per l'esecuzione del comando non ha funzionato correttamente, quindi il comando è stato annullato.")
return return
await call.reply(f"❌ Eccezione non gestita durante l'esecuzione del comando:\n[b]{exception.__class__.__name__}[/b]\n{exception}") await call.reply(f"❌ Eccezione non gestita durante l'esecuzione del comando:\n[b]{exception.__class__.__name__}[/b]\n[p]{exception}[/p]")
log.error(f"Unhandled exception - {exception.__class__.__name__}: {exception}") log.error(f"Unhandled exception - {exception.__class__.__name__}: {exception}")

View file

@ -3,7 +3,7 @@ import asyncio
import youtube_dl import youtube_dl
import ffmpeg import ffmpeg
from ..utils import Command, Call, NetworkHandler, asyncify from ..utils import Command, Call, NetworkHandler, asyncify
from ..network import Message, RequestSuccessful, RequestError from ..network import Message, RequestSuccessful
from ..error import TooManyFoundError, NoneFoundError from ..error import TooManyFoundError, NoneFoundError
from ..audio import RoyalPCMAudio, YtdlInfo from ..audio import RoyalPCMAudio, YtdlInfo
if typing.TYPE_CHECKING: if typing.TYPE_CHECKING:
@ -52,6 +52,15 @@ class PlayNH(NetworkHandler):
return PlaySuccessful(info_list=[source.rpf.info for source in audio_sources]) return PlaySuccessful(info_list=[source.rpf.info for source in audio_sources])
async def notify_on_timeout(call: Call, url: str, time: float, repeat: bool = False):
"""Send a message after a while to let the user know that the bot is still downloading the files and hasn't crashed."""
while True:
await asyncio.sleep(time)
await call.reply(f" Il download di [c]{url}[/c] sta richiedendo più tempo del solito, ma è ancora in corso!")
if not repeat:
break
class PlayCommand(Command): class PlayCommand(Command):
command_name = "play" command_name = "play"
command_description = "Riproduce una canzone in chat vocale." command_description = "Riproduce una canzone in chat vocale."
@ -62,40 +71,46 @@ class PlayCommand(Command):
@classmethod @classmethod
async def common(cls, call: Call): async def common(cls, call: Call):
guild, url = call.args.match(r"(?:\[(.+)])?\s*(.+)") guild, url = call.args.match(r"(?:\[(.+)])?\s*(.+)")
response: typing.Union[RequestError, PlaySuccessful] = await call.net_request(PlayMessage(url, guild), "discord") download_task = loop.create_task(call.net_request(PlayMessage(url, guild), "discord"))
if isinstance(response, RequestError): notify_task = loop.create_task(notify_on_timeout(call, url, time=20, repeat=True))
try:
response: PlaySuccessful = await download_task
except Exception as exc:
# RoyalPCMFile errors # RoyalPCMFile errors
if isinstance(response.exc, FileExistsError): if isinstance(exc, FileExistsError):
await call.reply(f"❌ Scaricare [c]{url}[/c] significherebbe sovrascrivere un file già esistente.\nQuesto è un bug, e non dovrebbe mai succedere. Se è appena successo, segnalate il problema a https://github.com/Steffo99/royalnet/issues.\n[p]{response.exc}[/p]") await call.reply(f"❌ Scaricare [c]{url}[/c] significherebbe sovrascrivere un file già esistente.\nQuesto è un bug, e non dovrebbe mai succedere. Se è appena successo, segnalate il problema a https://github.com/Steffo99/royalnet/issues.\n[p]{exc}[/p]")
return return
# ffmpeg errors # ffmpeg errors
if isinstance(response.exc, ffmpeg.Error): if isinstance(exc, ffmpeg.Error):
await call.reply(f"⚠️ Errore durante la conversione a PCM di [c]{url}[/c]:\n[p]{response.exc}[/p]") await call.reply(f"⚠️ Errore durante la conversione a PCM di [c]{url}[/c]:\n[p]{exc}[/p]")
return return
# youtube_dl errors # youtube_dl errors
if isinstance(response.exc, youtube_dl.utils.ContentTooShortError): if isinstance(exc, youtube_dl.utils.ContentTooShortError):
await call.reply(f"⚠️ Mentre era in corso il download di [c]{url}[/c], la connessione è stata interrotta, quindi la riproduzione è stata annullata.\n[p]{response.exc}[/p]") await call.reply(f"⚠️ Mentre era in corso il download di [c]{url}[/c], la connessione è stata interrotta, quindi la riproduzione è stata annullata.\n[p]{exc}[/p]")
return return
if isinstance(response.exc, youtube_dl.utils.UnavailableVideoError): if isinstance(exc, youtube_dl.utils.UnavailableVideoError):
await call.reply(f"⚠️ Non è disponibile nessun audio su [c]{url}[/c].\n[p]{response.exc}[/p]") await call.reply(f"⚠️ Non è disponibile nessun audio su [c]{url}[/c].\n[p]{exc}[/p]")
return return
if isinstance(response.exc, youtube_dl.utils.SameFileError): if isinstance(exc, youtube_dl.utils.SameFileError):
await call.reply(f"❌ Scaricare [c]{url}[/c] significherebbe scaricare due file diversi sullo stesso nome.\nQuesto è un bug, e non dovrebbe mai succedere. Se è appena successo, segnalate il problema a https://github.com/Steffo99/royalnet/issues.\n[p]{response.exc}[/p]") await call.reply(f"❌ Scaricare [c]{url}[/c] significherebbe scaricare due file diversi sullo stesso nome.\nQuesto è un bug, e non dovrebbe mai succedere. Se è appena successo, segnalate il problema a https://github.com/Steffo99/royalnet/issues.\n[p]{exc}[/p]")
return return
if isinstance(response.exc, youtube_dl.utils.GeoRestrictedError): if isinstance(exc, youtube_dl.utils.GeoRestrictedError):
await call.reply(f"⚠️ [c]{url}[/c] non può essere visualizzato nel paese in cui si trova il bot e non può essere scaricato.\n[p]{response.exc}[/p]") await call.reply(f"⚠️ [c]{url}[/c] non può essere visualizzato nel paese in cui si trova il bot e non può essere scaricato.\n[p]{exc}[/p]")
return return
if isinstance(response.exc, youtube_dl.utils.UnsupportedError): if isinstance(exc, youtube_dl.utils.UnsupportedError):
await call.reply(f"⚠️ [c]{url}[/c] non è supportato da YoutubeDL e non può essere scaricato.\n[p]{response.exc}[/p]") await call.reply(f"⚠️ [c]{url}[/c] non è supportato da YoutubeDL e non può essere scaricato.\n[p]{exc}[/p]")
return return
if isinstance(response.exc, youtube_dl.utils.ExtractorError): if isinstance(exc, youtube_dl.utils.ExtractorError):
await call.reply(f"⚠️ Errore nella ricerca di info per [c]{url}[/c]:\n[p]{response.exc}[/p]") await call.reply(f"⚠️ Errore nella ricerca di info per [c]{url}[/c]:\n[p]{exc}[/p]")
return return
if isinstance(response.exc, youtube_dl.utils.DownloadError): if isinstance(exc, youtube_dl.utils.DownloadError):
await call.reply(f"⚠️ Errore nel download di [c]{url}[/c]:\n[p]{response.exc}[/p]") await call.reply(f"⚠️ Errore nel download di [c]{url}[/c]:\n[p]{exc}[/p]")
return return
if isinstance(response.exc, youtube_dl.utils.YoutubeDLError): if isinstance(exc, youtube_dl.utils.YoutubeDLError):
await call.reply(f"⚠️ Errore di youtube_dl per [c]{url}[/c]:\n[p]{response.exc}[/p]") await call.reply(f"⚠️ Errore di youtube_dl per [c]{url}[/c]:\n[p]{exc}[/p]")
return return
raise
finally:
notify_task.cancel()
for info in response.info_list: for info in response.info_list:
await call.reply(f"⬇️ Download di [i]{info.title}[/i] completato.") await call.reply(f"⬇️ Download di [i]{info.title}[/i] completato.")

View file

@ -4,5 +4,6 @@ import typing
async def asyncify(function: typing.Callable, *args, **kwargs): async def asyncify(function: typing.Callable, *args, **kwargs):
# TODO: make cancellable somehow
loop = asyncio.get_running_loop() loop = asyncio.get_running_loop()
return await loop.run_in_executor(None, functools.partial(function, *args, **kwargs)) return await loop.run_in_executor(None, functools.partial(function, *args, **kwargs))