mirror of
https://github.com/RafaelSolVargas/Vulkan.git
synced 2025-10-29 16:57:23 +00:00
Changing folders names and adding more concrete classes of controllers and viewers
This commit is contained in:
parent
14705569c1
commit
2240c7535a
34
config/Colors.py
Normal file
34
config/Colors.py
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
from Config.Singleton import Singleton
|
||||||
|
|
||||||
|
|
||||||
|
class Colors(Singleton):
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self.__red = 0xDC143C
|
||||||
|
self.__green = 0x1F8B4C
|
||||||
|
self.__grey = 0x708090
|
||||||
|
self.__blue = 0x206694
|
||||||
|
self.__black = 0x23272A
|
||||||
|
|
||||||
|
@property
|
||||||
|
def RED(self) -> str:
|
||||||
|
return self.__red
|
||||||
|
|
||||||
|
@property
|
||||||
|
def GREEN(self) -> str:
|
||||||
|
return self.__green
|
||||||
|
|
||||||
|
@property
|
||||||
|
def GREY(self) -> str:
|
||||||
|
return self.__grey
|
||||||
|
|
||||||
|
@property
|
||||||
|
def BLUE(self) -> str:
|
||||||
|
return self.__blue
|
||||||
|
|
||||||
|
@property
|
||||||
|
def BLACK(self) -> str:
|
||||||
|
return self.__black
|
||||||
|
|
||||||
|
@property
|
||||||
|
def RED(self) -> str:
|
||||||
|
return self.__red
|
||||||
@ -1,5 +1,5 @@
|
|||||||
from config.Singleton import Singleton
|
from Config.Singleton import Singleton
|
||||||
from config.Config import Config
|
from Config.Config import Config
|
||||||
|
|
||||||
|
|
||||||
class Helper(Singleton):
|
class Helper(Singleton):
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
from decouple import config
|
from decouple import config
|
||||||
from config.Singleton import Singleton
|
from Config.Singleton import Singleton
|
||||||
|
|
||||||
|
|
||||||
class Config(Singleton):
|
class Config(Singleton):
|
||||||
@ -77,11 +77,13 @@ class Config(Singleton):
|
|||||||
self.MY_ERROR_BAD_COMMAND = 'This string serves to verify if some error was raised by myself on purpose'
|
self.MY_ERROR_BAD_COMMAND = 'This string serves to verify if some error was raised by myself on purpose'
|
||||||
self.BAD_COMMAND_TITLE = 'Misuse of command'
|
self.BAD_COMMAND_TITLE = 'Misuse of command'
|
||||||
self.BAD_COMMAND = f'❌ Bad usage of this command, type {self.BOT_PREFIX}help "command" to understand the command better'
|
self.BAD_COMMAND = f'❌ Bad usage of this command, type {self.BOT_PREFIX}help "command" to understand the command better'
|
||||||
|
self.INVITE_URL = 'https://discordapp.com/oauth2/authorize?client_id={}&scope=bot>'
|
||||||
|
self.VIDEO_UNAVAILABLE = '❌ Sorry. This video is unavailable for download.'
|
||||||
|
|
||||||
self.COLOURS = {
|
self.COLOURS = {
|
||||||
'red': 0xDC143C,
|
'red': 0xDC143C,
|
||||||
'green': 0x1F8B4C,
|
'green': 0x1F8B4C,
|
||||||
'grey': 0x708090,
|
'grey': 0x708090,
|
||||||
'blue': 0x206694,
|
'blue': 0x206694,
|
||||||
'black': 0x23272A
|
'black': 0x23272A
|
||||||
}
|
}
|
||||||
|
|||||||
39
vulkan/Exceptions/Exceptions.py
Normal file
39
vulkan/Exceptions/Exceptions.py
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
from config.Config import Config
|
||||||
|
|
||||||
|
|
||||||
|
class Error(Exception):
|
||||||
|
def __init__(self, message='', title='', *args: object) -> None:
|
||||||
|
self.__message = message
|
||||||
|
self.__title = title
|
||||||
|
super().__init__(*args)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def message(self) -> str:
|
||||||
|
return self.__message
|
||||||
|
|
||||||
|
@property
|
||||||
|
def title(self) -> str:
|
||||||
|
return self.__title
|
||||||
|
|
||||||
|
|
||||||
|
class ImpossibleMove(Error):
|
||||||
|
def __init__(self, message='', title='', *args: object) -> None:
|
||||||
|
config = Config()
|
||||||
|
if title == '':
|
||||||
|
title = config.IMPOSSIBLE_MOVE
|
||||||
|
super().__init__(message, title, *args)
|
||||||
|
|
||||||
|
|
||||||
|
class MusicUnavailable(Error):
|
||||||
|
def __init__(self, message='', title='', *args: object) -> None:
|
||||||
|
super().__init__(message, title, *args)
|
||||||
|
|
||||||
|
|
||||||
|
class BadCommandUsage(Error):
|
||||||
|
def __init__(self, message='', title='', *args: object) -> None:
|
||||||
|
super().__init__(message, title, *args)
|
||||||
|
|
||||||
|
|
||||||
|
class UnknownError(Error):
|
||||||
|
def __init__(self, message='', title='', *args: object) -> None:
|
||||||
|
super().__init__(message, title, *args)
|
||||||
@ -2,8 +2,8 @@ import discord
|
|||||||
from discord import Client
|
from discord import Client
|
||||||
from discord.ext.commands.errors import CommandNotFound, MissingRequiredArgument, UserInputError
|
from discord.ext.commands.errors import CommandNotFound, MissingRequiredArgument, UserInputError
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
from config.Config import Config
|
from Config.Config import Config
|
||||||
from config.Helper import Helper
|
from Config.Helper import Helper
|
||||||
|
|
||||||
helper = Helper()
|
helper = Helper()
|
||||||
|
|
||||||
|
|||||||
@ -2,11 +2,14 @@ from typing import Dict
|
|||||||
from discord import Guild, Client, Embed
|
from discord import Guild, Client, Embed
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
from discord.ext.commands import Context
|
from discord.ext.commands import Context
|
||||||
from config.Config import Config
|
from Config.Config import Config
|
||||||
from config.Helper import Helper
|
from Config.Helper import Helper
|
||||||
from vulkan.music.Player import Player
|
from Vulkan.Music.Player import Player
|
||||||
from vulkan.music.utils import is_connected
|
from Vulkan.Music.utils import is_connected
|
||||||
from vulkan.controllers.SkipController import SkipHandler
|
from Vulkan.Controllers.SkipController import SkipController
|
||||||
|
from Vulkan.Views.EmoteView import EmoteView
|
||||||
|
from Vulkan.Views.EmbedView import EmbedView
|
||||||
|
|
||||||
|
|
||||||
helper = Helper()
|
helper = Helper()
|
||||||
|
|
||||||
@ -69,8 +72,15 @@ class Music(commands.Cog):
|
|||||||
|
|
||||||
@commands.command(name="skip", help=helper.HELP_SKIP, description=helper.HELP_SKIP_LONG, aliases=['s', 'pular'])
|
@commands.command(name="skip", help=helper.HELP_SKIP, description=helper.HELP_SKIP_LONG, aliases=['s', 'pular'])
|
||||||
async def skip(self, ctx: Context) -> None:
|
async def skip(self, ctx: Context) -> None:
|
||||||
handler = SkipHandler(ctx, self.__bot)
|
controller = SkipController(ctx, self.__bot)
|
||||||
await handler.run()
|
|
||||||
|
response = await controller.run()
|
||||||
|
if response.success:
|
||||||
|
view = EmoteView(response)
|
||||||
|
else:
|
||||||
|
view = EmbedView(response)
|
||||||
|
|
||||||
|
await view.run()
|
||||||
|
|
||||||
@commands.command(name='stop', help=helper.HELP_STOP, description=helper.HELP_STOP_LONG, aliases=['parar'])
|
@commands.command(name='stop', help=helper.HELP_STOP, description=helper.HELP_STOP_LONG, aliases=['parar'])
|
||||||
async def stop(self, ctx: Context) -> None:
|
async def stop(self, ctx: Context) -> None:
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
from random import randint, random
|
from random import randint, random
|
||||||
import discord
|
import discord
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
from config.Config import Config
|
from Config.Config import Config
|
||||||
from config.Helper import Helper
|
from Config.Helper import Helper
|
||||||
|
|
||||||
helper = Helper()
|
helper = Helper()
|
||||||
|
|
||||||
|
|||||||
57
vulkan/controllers/AbstractController.py
Normal file
57
vulkan/controllers/AbstractController.py
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
from abc import ABC, abstractmethod
|
||||||
|
from discord.ext.commands import Context
|
||||||
|
from discord import Client, Guild
|
||||||
|
from Vulkan.Controllers.PlayerController import PlayersController
|
||||||
|
from Vulkan.Music.Player import Player
|
||||||
|
from Vulkan.Controllers.ControllerResponse import ControllerResponse
|
||||||
|
from Config.Config import Config
|
||||||
|
from Config.Helper import Helper
|
||||||
|
from Vulkan.Views.Embeds.Embeds import Embeds
|
||||||
|
|
||||||
|
|
||||||
|
class AbstractController(ABC):
|
||||||
|
def __init__(self, ctx: Context, bot: Client) -> None:
|
||||||
|
self.__bot: Client = bot
|
||||||
|
self.__controller = PlayersController(self.__bot)
|
||||||
|
self.__player: Player = self.__controller.get_player(ctx.guild)
|
||||||
|
self.__guild: Guild = ctx.guild
|
||||||
|
self.__ctx: Context = ctx
|
||||||
|
self.__config = Config()
|
||||||
|
self.__helper = Helper()
|
||||||
|
self.__embeds = Embeds()
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
async def run(self) -> ControllerResponse:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@property
|
||||||
|
def guild(self) -> Guild:
|
||||||
|
return self.__guild
|
||||||
|
|
||||||
|
@property
|
||||||
|
def player(self) -> Player:
|
||||||
|
return self.__player
|
||||||
|
|
||||||
|
@property
|
||||||
|
def controller(self) -> PlayersController:
|
||||||
|
return self.__controller
|
||||||
|
|
||||||
|
@property
|
||||||
|
def bot(self) -> Client:
|
||||||
|
return self.__bot
|
||||||
|
|
||||||
|
@property
|
||||||
|
def config(self) -> Config:
|
||||||
|
return self.__config
|
||||||
|
|
||||||
|
@property
|
||||||
|
def helper(self) -> Helper:
|
||||||
|
return self.__helper
|
||||||
|
|
||||||
|
@property
|
||||||
|
def ctx(self) -> Context:
|
||||||
|
return self.__ctx
|
||||||
|
|
||||||
|
@property
|
||||||
|
def embeds(self) -> Embeds:
|
||||||
|
return self.__embeds
|
||||||
@ -1,34 +0,0 @@
|
|||||||
from abc import ABC, abstractmethod
|
|
||||||
from discord.ext.commands import Context
|
|
||||||
from discord import Client, Guild
|
|
||||||
from vulkan.controllers.PlayerController import PlayersController
|
|
||||||
from vulkan.music.Player import Player
|
|
||||||
from vulkan.results.AbstractResult import AbstractResult
|
|
||||||
|
|
||||||
|
|
||||||
class AbstractHandler(ABC):
|
|
||||||
def __init__(self, ctx: Context, bot: Client) -> None:
|
|
||||||
self.__bot: Client = bot
|
|
||||||
self.__controller = PlayersController(self.__bot)
|
|
||||||
self.__player: Player = self.__controller.get_player(ctx.guild)
|
|
||||||
self.__guild: Guild = ctx.guild
|
|
||||||
|
|
||||||
@abstractmethod
|
|
||||||
async def run(self) -> AbstractResult:
|
|
||||||
pass
|
|
||||||
|
|
||||||
@property
|
|
||||||
def guild(self) -> Guild:
|
|
||||||
return self.__guild
|
|
||||||
|
|
||||||
@property
|
|
||||||
def player(self) -> Player:
|
|
||||||
return self.__player
|
|
||||||
|
|
||||||
@property
|
|
||||||
def controller(self) -> PlayersController:
|
|
||||||
return self.__controller
|
|
||||||
|
|
||||||
@property
|
|
||||||
def bot(self) -> Client:
|
|
||||||
return self.__bot
|
|
||||||
27
vulkan/controllers/ControllerResponse.py
Normal file
27
vulkan/controllers/ControllerResponse.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
from typing import Union
|
||||||
|
from discord.ext.commands import Context
|
||||||
|
from Vulkan.Exceptions.Exceptions import Error
|
||||||
|
from discord import Embed
|
||||||
|
|
||||||
|
|
||||||
|
class ControllerResponse:
|
||||||
|
def __init__(self, ctx: Context, embed: Embed = None, error: Error = None) -> None:
|
||||||
|
self.__ctx: Context = ctx
|
||||||
|
self.__error: Error = error
|
||||||
|
self.__embed: Embed = embed
|
||||||
|
self.__success = False if error else True
|
||||||
|
|
||||||
|
@property
|
||||||
|
def ctx(self) -> Context:
|
||||||
|
return self.__ctx
|
||||||
|
|
||||||
|
@property
|
||||||
|
def embed(self) -> Union[Embed, None]:
|
||||||
|
return self.__embed
|
||||||
|
|
||||||
|
def error(self) -> Union[Error, None]:
|
||||||
|
return self.__error
|
||||||
|
|
||||||
|
@property
|
||||||
|
def success(self) -> bool:
|
||||||
|
return self.__success
|
||||||
@ -1,26 +0,0 @@
|
|||||||
from abc import ABC, abstractmethod
|
|
||||||
|
|
||||||
|
|
||||||
class Error(Exception, ABC):
|
|
||||||
@abstractmethod
|
|
||||||
def message():
|
|
||||||
pass
|
|
||||||
|
|
||||||
@abstractmethod
|
|
||||||
def title():
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class MusicUnavailable(Error):
|
|
||||||
def __init__(self, message: str) -> None:
|
|
||||||
self.__message = message
|
|
||||||
super().__init__(message)
|
|
||||||
|
|
||||||
def message():
|
|
||||||
pass
|
|
||||||
|
|
||||||
def title():
|
|
||||||
pass
|
|
||||||
|
|
||||||
def __str__(self) -> str:
|
|
||||||
return self.__message
|
|
||||||
@ -1,7 +1,7 @@
|
|||||||
from typing import Dict, List, Union
|
from typing import Dict, List, Union
|
||||||
from config.Singleton import Singleton
|
from Config.Singleton import Singleton
|
||||||
from discord import Guild, Client, VoiceClient
|
from discord import Guild, Client, VoiceClient
|
||||||
from vulkan.music.Player import Player
|
from Vulkan.Music.Player import Player
|
||||||
|
|
||||||
|
|
||||||
class PlayersController(Singleton):
|
class PlayersController(Singleton):
|
||||||
|
|||||||
@ -1,26 +1,26 @@
|
|||||||
from discord.ext.commands import Context
|
from discord.ext.commands import Context
|
||||||
from discord import Client
|
from discord import Client
|
||||||
from vulkan.controllers.AbstractHandler import AbstractHandler
|
from Vulkan.Controllers.AbstractController import AbstractController
|
||||||
|
from Vulkan.Exceptions.Exceptions import BadCommandUsage
|
||||||
|
from Vulkan.Controllers.ControllerResponse import ControllerResponse
|
||||||
|
|
||||||
|
|
||||||
class SkipHandler(AbstractHandler):
|
class SkipController(AbstractController):
|
||||||
def __init__(self, ctx: Context, bot: Client) -> None:
|
def __init__(self, ctx: Context, bot: Client) -> None:
|
||||||
super().__init__(ctx, bot)
|
super().__init__(ctx, bot)
|
||||||
|
|
||||||
async def run(self) -> None:
|
async def run(self) -> ControllerResponse:
|
||||||
if self.player.playlist.looping_one:
|
if self.player.playlist.looping_one:
|
||||||
""" embed = Embed(
|
embed = self.__embeds.FAIL_DUE_TO_LOOP_ON
|
||||||
title=config.SONG_PLAYER,
|
error = BadCommandUsage('', '')
|
||||||
description=config.LOOP_ON,
|
response = ControllerResponse(self.ctx, embed, error)
|
||||||
colour=config.COLOURS['blue']
|
return response
|
||||||
)
|
|
||||||
await ctx.send(embed=embed)
|
|
||||||
return False
|
|
||||||
"""
|
|
||||||
return None
|
|
||||||
|
|
||||||
voice = self.controller.get_guild_voice(self.guild)
|
voice = self.controller.get_guild_voice(self.guild)
|
||||||
if voice is None:
|
if voice is None:
|
||||||
return None
|
response = ControllerResponse(self.ctx)
|
||||||
|
return response
|
||||||
else:
|
else:
|
||||||
voice.stop()
|
voice.stop()
|
||||||
|
response = ControllerResponse(self.ctx)
|
||||||
|
return response
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
from typing import List
|
from typing import List
|
||||||
from config.Config import Config
|
from Config.Config import Config
|
||||||
from yt_dlp import YoutubeDL
|
from yt_dlp import YoutubeDL
|
||||||
from concurrent.futures import ThreadPoolExecutor
|
from concurrent.futures import ThreadPoolExecutor
|
||||||
from vulkan.music.Song import Song
|
from Vulkan.Music.Song import Song
|
||||||
from vulkan.music.utils import is_url, run_async
|
from Vulkan.Music.utils import is_url, run_async
|
||||||
|
|
||||||
|
|
||||||
class Downloader():
|
class Downloader():
|
||||||
|
|||||||
@ -1,14 +1,14 @@
|
|||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
from config.Config import Config
|
from Config.Config import Config
|
||||||
from discord import Client, Guild, FFmpegPCMAudio, Embed
|
from discord import Client, Guild, FFmpegPCMAudio, Embed
|
||||||
from discord.ext.commands import Context
|
from discord.ext.commands import Context
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from vulkan.music.Downloader import Downloader
|
from Vulkan.Music.Downloader import Downloader
|
||||||
from vulkan.music.Playlist import Playlist
|
from Vulkan.Music.Playlist import Playlist
|
||||||
from vulkan.music.Searcher import Searcher
|
from Vulkan.Music.Searcher import Searcher
|
||||||
from vulkan.music.Song import Song
|
from Vulkan.Music.Song import Song
|
||||||
from vulkan.music.Types import Provider
|
from Vulkan.Music.Types import Provider
|
||||||
from vulkan.music.utils import *
|
from Vulkan.Music.utils import *
|
||||||
|
|
||||||
|
|
||||||
class Player(commands.Cog):
|
class Player(commands.Cog):
|
||||||
@ -21,7 +21,7 @@ class Player(commands.Cog):
|
|||||||
|
|
||||||
self.__timer = Timer(self.__timeout_handler)
|
self.__timer = Timer(self.__timeout_handler)
|
||||||
self.__playing = False
|
self.__playing = False
|
||||||
self.__config = Config.Config()
|
self.__config = Config()
|
||||||
|
|
||||||
# Flag to control if the player should stop totally the playing
|
# Flag to control if the player should stop totally the playing
|
||||||
self.__force_stop = False
|
self.__force_stop = False
|
||||||
@ -210,22 +210,6 @@ class Player(commands.Cog):
|
|||||||
|
|
||||||
return embed
|
return embed
|
||||||
|
|
||||||
async def skip(self, ctx: Context) -> bool:
|
|
||||||
if self.__playlist.looping_one:
|
|
||||||
embed = Embed(
|
|
||||||
title=self.__config.SONG_PLAYER,
|
|
||||||
description=self.__config.LOOP_ON,
|
|
||||||
colour=self.__config.COLOURS['blue']
|
|
||||||
)
|
|
||||||
await ctx.send(embed=embed)
|
|
||||||
return False
|
|
||||||
|
|
||||||
if self.__guild.voice_client != None:
|
|
||||||
self.__guild.voice_client.stop()
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
def history(self) -> Embed:
|
def history(self) -> Embed:
|
||||||
history = self.__playlist.songs_history
|
history = self.__playlist.songs_history
|
||||||
|
|
||||||
|
|||||||
@ -1,11 +1,10 @@
|
|||||||
from collections import deque
|
from collections import deque
|
||||||
from typing import List
|
from typing import List
|
||||||
from config.Config import Config
|
from Config.Config import Config
|
||||||
|
from Vulkan.Music.Interfaces import IPlaylist
|
||||||
|
from Vulkan.Music.Song import Song
|
||||||
import random
|
import random
|
||||||
|
|
||||||
from vulkan.music.Interfaces import IPlaylist
|
|
||||||
from vulkan.music.Song import Song
|
|
||||||
|
|
||||||
|
|
||||||
class Playlist(IPlaylist):
|
class Playlist(IPlaylist):
|
||||||
"""Class to manage and control the songs to play and played"""
|
"""Class to manage and control the songs to play and played"""
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
from vulkan.music.Types import Provider
|
from Vulkan.Music.Types import Provider
|
||||||
from vulkan.music.Spotify import SpotifySearch
|
from Vulkan.Music.Spotify import SpotifySearch
|
||||||
from vulkan.music.utils import is_url
|
from Vulkan.Music.utils import is_url
|
||||||
|
|
||||||
|
|
||||||
class Searcher():
|
class Searcher():
|
||||||
@ -16,6 +16,7 @@ class Searcher():
|
|||||||
Return -> A list of musics names and Provider Type
|
Return -> A list of musics names and Provider Type
|
||||||
"""
|
"""
|
||||||
provider = self.__identify_source(music)
|
provider = self.__identify_source(music)
|
||||||
|
print(provider)
|
||||||
|
|
||||||
if provider == Provider.YouTube:
|
if provider == Provider.YouTube:
|
||||||
return [music], Provider.YouTube
|
return [music], Provider.YouTube
|
||||||
@ -25,6 +26,7 @@ class Searcher():
|
|||||||
musics = self.__Spotify.search(music)
|
musics = self.__Spotify.search(music)
|
||||||
return musics, Provider.Name
|
return musics, Provider.Name
|
||||||
else:
|
else:
|
||||||
|
print('Spotify Not Connected')
|
||||||
return [], Provider.Unknown
|
return [], Provider.Unknown
|
||||||
|
|
||||||
elif provider == Provider.Name:
|
elif provider == Provider.Name:
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
from vulkan.music.Interfaces import ISong, IPlaylist
|
from Vulkan.Music.Interfaces import ISong, IPlaylist
|
||||||
|
|
||||||
|
|
||||||
class Song(ISong):
|
class Song(ISong):
|
||||||
|
|||||||
@ -1,15 +1,15 @@
|
|||||||
import spotipy
|
import spotipy
|
||||||
from spotipy.oauth2 import SpotifyClientCredentials
|
from spotipy.oauth2 import SpotifyClientCredentials
|
||||||
from config.Config import Config
|
from Config.Config import Config
|
||||||
|
|
||||||
|
|
||||||
class SpotifySearch():
|
class SpotifySearch():
|
||||||
"""Search a Spotify music or playlist and return the musics names"""
|
"""Search a Spotify music or playlist and return the musics names"""
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
|
self.__config = Config()
|
||||||
self.__connected = False
|
self.__connected = False
|
||||||
self.__connect()
|
self.__connect()
|
||||||
self.__config = Config()
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def connected(self):
|
def connected(self):
|
||||||
@ -19,10 +19,11 @@ class SpotifySearch():
|
|||||||
try:
|
try:
|
||||||
# Initialize the connection with Spotify API
|
# Initialize the connection with Spotify API
|
||||||
self.__api = spotipy.Spotify(auth_manager=SpotifyClientCredentials(
|
self.__api = spotipy.Spotify(auth_manager=SpotifyClientCredentials(
|
||||||
client_id=Config.SPOTIFY_ID, client_secret=self.__config.SPOTIFY_SECRET))
|
client_id=self.__config.SPOTIFY_ID, client_secret=self.__config.SPOTIFY_SECRET))
|
||||||
self.__connected = True
|
self.__connected = True
|
||||||
return True
|
return True
|
||||||
except:
|
except Exception as e:
|
||||||
|
print(f'DEVELOPER NOTE -> Spotify Connection {e}')
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def search(self, music=str) -> list:
|
def search(self, music=str) -> list:
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import re
|
import re
|
||||||
import asyncio
|
import asyncio
|
||||||
from config.Config import Config
|
from Config.Config import Config
|
||||||
from functools import wraps, partial
|
from functools import wraps, partial
|
||||||
config = Config()
|
config = Config()
|
||||||
|
|
||||||
|
|||||||
@ -1,20 +0,0 @@
|
|||||||
from typing import Union
|
|
||||||
from discord.ext.commands import Context
|
|
||||||
from vulkan.controllers.Exceptions import Error
|
|
||||||
|
|
||||||
|
|
||||||
class AbstractResult:
|
|
||||||
def __init__(self, ctx: Context, success: bool) -> None:
|
|
||||||
self.__success: bool = success
|
|
||||||
self.__ctx: Context = ctx
|
|
||||||
|
|
||||||
@property
|
|
||||||
def ctx(self) -> Context:
|
|
||||||
return self.__ctx
|
|
||||||
|
|
||||||
@property
|
|
||||||
def success(self) -> bool:
|
|
||||||
return self.__success
|
|
||||||
|
|
||||||
def error(self) -> Union[Error, None]:
|
|
||||||
pass
|
|
||||||
@ -1,9 +0,0 @@
|
|||||||
from vulkan.results import AbstractResult
|
|
||||||
from typing import Union
|
|
||||||
from discord.ext.commands import Context
|
|
||||||
from vulkan.controllers.Exceptions import Error
|
|
||||||
|
|
||||||
|
|
||||||
class SuccessResult(AbstractResult):
|
|
||||||
def __init__(self) -> None:
|
|
||||||
super().__init__()
|
|
||||||
@ -1,25 +1,23 @@
|
|||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
|
from Vulkan.Controllers.ControllerResponse import ControllerResponse
|
||||||
from numpy import result_type
|
|
||||||
from vulkan.results.AbstractResult import AbstractResult
|
|
||||||
from discord.ext.commands import Context
|
from discord.ext.commands import Context
|
||||||
from discord import Client, Message
|
from discord import Client, Message
|
||||||
|
|
||||||
|
|
||||||
class AbstractView(ABC):
|
class AbstractView(ABC):
|
||||||
def __init__(self, result: AbstractResult) -> None:
|
def __init__(self, response: ControllerResponse) -> None:
|
||||||
self.__result: AbstractResult = result
|
self.__response: ControllerResponse = response
|
||||||
self.__context: Context = result.ctx
|
self.__context: Context = response.ctx
|
||||||
self.__message: Message = result.ctx.message
|
self.__message: Message = response.ctx.message
|
||||||
self.__bot: Client = result.ctx.bot
|
self.__bot: Client = response.ctx.bot
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def result(self) -> AbstractResult:
|
def response(self) -> ControllerResponse:
|
||||||
return self.__result
|
return self.__response
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def bot(self) -> Client:
|
def bot(self) -> Client:
|
||||||
return self.__result.ctx.bot
|
return self.__bot
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def message(self) -> Message:
|
def message(self) -> Message:
|
||||||
@ -30,5 +28,5 @@ class AbstractView(ABC):
|
|||||||
return self.__context
|
return self.__context
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def run(self) -> None:
|
async def run(self) -> None:
|
||||||
pass
|
pass
|
||||||
|
|||||||
11
vulkan/views/EmbedView.py
Normal file
11
vulkan/views/EmbedView.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
from Vulkan.Views.AbstractView import AbstractView
|
||||||
|
from Vulkan.Controllers.ControllerResponse import ControllerResponse
|
||||||
|
|
||||||
|
|
||||||
|
class EmbedView(AbstractView):
|
||||||
|
def __init__(self, response: ControllerResponse) -> None:
|
||||||
|
super().__init__(response)
|
||||||
|
|
||||||
|
async def run(self) -> None:
|
||||||
|
if self.response.embed:
|
||||||
|
await self.context.send(embed=self.response.embed)
|
||||||
221
vulkan/views/Embeds/Embeds.py
Normal file
221
vulkan/views/Embeds/Embeds.py
Normal file
@ -0,0 +1,221 @@
|
|||||||
|
from discord import Embed
|
||||||
|
from Config.Config import Config
|
||||||
|
from Config.Colors import Colors
|
||||||
|
from datetime import timedelta
|
||||||
|
|
||||||
|
|
||||||
|
class Embeds:
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self.__config = Config()
|
||||||
|
self.__colors = Colors()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def INVALID_INPUT(self) -> Embed:
|
||||||
|
embed = Embed(
|
||||||
|
title=self.__config.ERROR_TITLE,
|
||||||
|
description=self.__config.INVALID_INPUT,
|
||||||
|
colours=self.__colors.BLUE)
|
||||||
|
return embed
|
||||||
|
|
||||||
|
@property
|
||||||
|
def UNAVAILABLE_VIDEO(self) -> Embed:
|
||||||
|
embed = Embed(
|
||||||
|
title=self.__config.ERROR_TITLE,
|
||||||
|
description=self.__config.VIDEO_UNAVAILABLE,
|
||||||
|
colours=self.__colors.BLUE)
|
||||||
|
return embed
|
||||||
|
|
||||||
|
@property
|
||||||
|
def DOWNLOADING_ERROR(self) -> Embed:
|
||||||
|
embed = Embed(
|
||||||
|
title=self.__config.ERROR_TITLE,
|
||||||
|
description=self.__config.DOWNLOADING_ERROR,
|
||||||
|
colours=self.__colors.BLUE)
|
||||||
|
return embed
|
||||||
|
|
||||||
|
@property
|
||||||
|
def SONG_ADDED(self, title: str) -> Embed:
|
||||||
|
embed = Embed(
|
||||||
|
title=self.__config.SONG_PLAYER,
|
||||||
|
description=self.__config.SONG_ADDED.format(title),
|
||||||
|
colours=self.__colors.BLUE)
|
||||||
|
return embed
|
||||||
|
|
||||||
|
@property
|
||||||
|
def SONGS_ADDED(self, quant: int) -> Embed:
|
||||||
|
embed = Embed(
|
||||||
|
title=self.__config.SONG_PLAYER,
|
||||||
|
description=self.__config.SONGS_ADDED.format(quant),
|
||||||
|
colour=self.__colors.BLUE)
|
||||||
|
return embed
|
||||||
|
|
||||||
|
@property
|
||||||
|
def SONG_INFO(self, info: dict, title: str, position='Playing Now') -> Embed:
|
||||||
|
embedvc = Embed(
|
||||||
|
title=title,
|
||||||
|
description=f"[{info['title']}]({info['original_url']})",
|
||||||
|
color=self.__config.COLOURS['blue']
|
||||||
|
)
|
||||||
|
|
||||||
|
embedvc.add_field(name=self.__config.SONGINFO_UPLOADER,
|
||||||
|
value=info['uploader'],
|
||||||
|
inline=False)
|
||||||
|
|
||||||
|
embedvc.add_field(name=self.__config.SONGINFO_REQUESTER,
|
||||||
|
value=info['requester'],
|
||||||
|
inline=True)
|
||||||
|
|
||||||
|
if 'thumbnail' in info.keys():
|
||||||
|
embedvc.set_thumbnail(url=info['thumbnail'])
|
||||||
|
|
||||||
|
if 'duration' in info.keys():
|
||||||
|
duration = str(timedelta(seconds=info['duration']))
|
||||||
|
embedvc.add_field(name=self.__config.SONGINFO_DURATION,
|
||||||
|
value=f"{duration}",
|
||||||
|
inline=True)
|
||||||
|
else:
|
||||||
|
embedvc.add_field(name=self.__config.SONGINFO_DURATION,
|
||||||
|
value=self.__config.SONGINFO_UNKNOWN_DURATION,
|
||||||
|
inline=True)
|
||||||
|
|
||||||
|
embedvc.add_field(name=self.__config.SONGINFO_POSITION,
|
||||||
|
value=position,
|
||||||
|
inline=True)
|
||||||
|
|
||||||
|
return embedvc
|
||||||
|
|
||||||
|
@property
|
||||||
|
def COMMAND_ERROR(self):
|
||||||
|
embed = Embed(
|
||||||
|
title=self.__config.ERROR_TITLE,
|
||||||
|
description=self.__config.ERROR_MISSING_ARGUMENTS,
|
||||||
|
colour=self.__colors.BLACK
|
||||||
|
)
|
||||||
|
return embed
|
||||||
|
|
||||||
|
@property
|
||||||
|
def COMMAND_NOT_FOUND(self) -> Embed:
|
||||||
|
embed = Embed(
|
||||||
|
title=self.__config.ERROR_TITLE,
|
||||||
|
description=self.__config.COMMAND_NOT_FOUND,
|
||||||
|
colour=self.__colors.BLACK
|
||||||
|
)
|
||||||
|
return embed
|
||||||
|
|
||||||
|
@property
|
||||||
|
def MY_ERROR_BAD_COMMAND(self) -> Embed:
|
||||||
|
embed = Embed(
|
||||||
|
title=self.__config.BAD_COMMAND_TITLE,
|
||||||
|
description=self.__config.BAD_COMMAND,
|
||||||
|
colour=self.__colors.BLACK
|
||||||
|
)
|
||||||
|
return embed
|
||||||
|
|
||||||
|
@property
|
||||||
|
def UNKNOWN_ERROR(self) -> Embed:
|
||||||
|
embed = Embed(
|
||||||
|
title=self.__config.ERROR_TITLE,
|
||||||
|
description=self.__config.UNKNOWN_ERROR,
|
||||||
|
colour=self.__colors.RED
|
||||||
|
)
|
||||||
|
return embed
|
||||||
|
|
||||||
|
@property
|
||||||
|
def FAIL_DUE_TO_LOOP_ON(self) -> Embed:
|
||||||
|
embed = Embed(
|
||||||
|
title=self.__config.SONG_PLAYER,
|
||||||
|
description=self.__config.LOOP_ON,
|
||||||
|
colour=self.__colors.BLUE
|
||||||
|
)
|
||||||
|
return embed
|
||||||
|
|
||||||
|
@property
|
||||||
|
def NOT_PREVIOUS_SONG(self) -> Embed:
|
||||||
|
embed = Embed(
|
||||||
|
title=self.__config.SONG_PLAYER,
|
||||||
|
description=self.__config.NOT_PREVIOUS,
|
||||||
|
colour=self.__colors.BLUE
|
||||||
|
)
|
||||||
|
return embed
|
||||||
|
|
||||||
|
@property
|
||||||
|
def HISTORY(self, description: str) -> Embed:
|
||||||
|
embed = Embed(
|
||||||
|
title=self.__config.HISTORY_TITLE,
|
||||||
|
description=description,
|
||||||
|
colour=self.__colors.BLUE)
|
||||||
|
return embed
|
||||||
|
|
||||||
|
@property
|
||||||
|
def NOT_PLAYING(self) -> Embed:
|
||||||
|
embed = Embed(
|
||||||
|
title=self.__config.SONG_PLAYER,
|
||||||
|
description=self.__config.PLAYER_NOT_PLAYING,
|
||||||
|
colour=self.__colors.BLUE)
|
||||||
|
return embed
|
||||||
|
|
||||||
|
@property
|
||||||
|
def QUEUE(self, title: str, description: str) -> Embed:
|
||||||
|
embed = Embed(
|
||||||
|
title=title,
|
||||||
|
description=description,
|
||||||
|
colour=self.__colors.BLUE
|
||||||
|
)
|
||||||
|
return embed
|
||||||
|
|
||||||
|
@property
|
||||||
|
def INVITE(self, bot_id: str) -> Embed:
|
||||||
|
link = self.__config.INVITE_URL
|
||||||
|
link.format(bot_id)
|
||||||
|
text = self.__config.INVITE_MESSAGE.format(link, link)
|
||||||
|
|
||||||
|
embed = Embed(
|
||||||
|
title="Invite Vulkan",
|
||||||
|
description=text,
|
||||||
|
colour=self.__colors.BLUE
|
||||||
|
)
|
||||||
|
return embed
|
||||||
|
|
||||||
|
@property
|
||||||
|
def ERROR_NUMBER(self) -> Embed:
|
||||||
|
embed = Embed(
|
||||||
|
description=self.__config.ERROR_NUMBER,
|
||||||
|
colour=self.__colors.RED
|
||||||
|
)
|
||||||
|
return embed
|
||||||
|
|
||||||
|
@property
|
||||||
|
def RANDOM_NUMBER(self, a: int, b: int, x: int) -> Embed:
|
||||||
|
embed = Embed(
|
||||||
|
title=f'Random number between [{a, b}]',
|
||||||
|
description=x,
|
||||||
|
colour=self.__colors.GREEN
|
||||||
|
)
|
||||||
|
return embed
|
||||||
|
|
||||||
|
@property
|
||||||
|
def CARA_COROA(self, result: str) -> Embed:
|
||||||
|
embed = Embed(
|
||||||
|
title='Cara Cora',
|
||||||
|
description=f'Result: {result}',
|
||||||
|
colour=self.__colors.GREEN
|
||||||
|
)
|
||||||
|
return embed
|
||||||
|
|
||||||
|
@property
|
||||||
|
def CHOSEN_THING(self, thing: str) -> Embed:
|
||||||
|
embed = Embed(
|
||||||
|
title='Choose something',
|
||||||
|
description=f'Chosen: {thing}',
|
||||||
|
colour=self.__config.COLOURS['green']
|
||||||
|
)
|
||||||
|
return embed
|
||||||
|
|
||||||
|
@property
|
||||||
|
def BAD_CHOOSE_USE(self) -> Embed:
|
||||||
|
embed = Embed(
|
||||||
|
title='Choose something',
|
||||||
|
description=f'Error: Use {self.__config.BOT_PREFIX}help choose to understand this command.',
|
||||||
|
colour=self.__colors.RED
|
||||||
|
)
|
||||||
|
return embed
|
||||||
@ -1,10 +1,14 @@
|
|||||||
from vulkan.views.AbstractView import AbstractView
|
from Vulkan.Views.AbstractView import AbstractView
|
||||||
from vulkan.results import AbstractResult
|
from Vulkan.Controllers.ControllerResponse import ControllerResponse
|
||||||
|
|
||||||
|
|
||||||
class EmoteView(AbstractView):
|
class EmoteView(AbstractView):
|
||||||
def __init__(self, result: AbstractResult) -> None:
|
|
||||||
super().__init__(result)
|
|
||||||
|
|
||||||
def run(self) -> None:
|
def __init__(self, response: ControllerResponse) -> None:
|
||||||
return super().run()
|
super().__init__(response)
|
||||||
|
|
||||||
|
async def run(self) -> None:
|
||||||
|
if self.response.success:
|
||||||
|
await self.message.add_reaction('✅')
|
||||||
|
else:
|
||||||
|
await self.message.add_reaction('❌')
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
from vulkan.views.AbstractView import AbstractView
|
from Vulkan.Views.AbstractView import AbstractView
|
||||||
from vulkan.results import AbstractResult
|
from Vulkan.Controllers.ControllerResponse import ControllerResponse
|
||||||
|
|
||||||
|
|
||||||
class MessageView(AbstractView):
|
class MessageView(AbstractView):
|
||||||
def __init__(self, result: AbstractResult) -> None:
|
def __init__(self, response: ControllerResponse) -> None:
|
||||||
super().__init__(result)
|
super().__init__(response)
|
||||||
|
|
||||||
def run(self) -> None:
|
async def run(self) -> None:
|
||||||
return super().run()
|
return super().run()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user