mirror of
https://github.com/RYGhub/royalnet.git
synced 2024-11-27 13:34:28 +00:00
Add stuff
This commit is contained in:
parent
00733c4ef1
commit
3621e60dea
3 changed files with 41 additions and 25 deletions
|
@ -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}")
|
||||||
|
|
|
@ -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.")
|
||||||
|
|
|
@ -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))
|
||||||
|
|
Loading…
Reference in a new issue