mirror of
https://github.com/RafaelSolVargas/Vulkan.git
synced 2025-10-29 16:57:23 +00:00
Adding support to slash commands
This commit is contained in:
39
Messages/DiscordMessages.py
Normal file
39
Messages/DiscordMessages.py
Normal file
@@ -0,0 +1,39 @@
|
||||
from discord import Message, WebhookMessage
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
|
||||
class VAbstractMessage(ABC):
|
||||
"""
|
||||
Abstract class to allow create a pattern when dealing with multiple Discord
|
||||
messages types, such as Interaction Messages and the standard discord messages
|
||||
that contains two different ways of deletion
|
||||
"""
|
||||
@abstractmethod
|
||||
async def delete(self):
|
||||
pass
|
||||
|
||||
|
||||
class VWebHookMessage(VAbstractMessage):
|
||||
"""
|
||||
Holds a WebhookMessage instance
|
||||
"""
|
||||
|
||||
def __init__(self, message: WebhookMessage) -> None:
|
||||
self.__message = message
|
||||
super().__init__()
|
||||
|
||||
async def delete(self):
|
||||
await self.__message.delete()
|
||||
|
||||
|
||||
class VDefaultMessage(VAbstractMessage):
|
||||
"""
|
||||
Holds a Message instance, the basic Discord message type
|
||||
"""
|
||||
|
||||
def __init__(self, message: Message) -> None:
|
||||
self.__message = message
|
||||
super().__init__()
|
||||
|
||||
async def delete(self):
|
||||
await self.__message.delete()
|
||||
@@ -1,19 +1,20 @@
|
||||
from typing import Dict, List
|
||||
from discord import Message
|
||||
from Config.Singleton import Singleton
|
||||
from UI.Views.AbstractView import AbstractView
|
||||
from Messages.MessagesCategory import MessagesCategory
|
||||
from Messages.DiscordMessages import VAbstractMessage
|
||||
import traceback
|
||||
|
||||
|
||||
class MessagesManager(Singleton):
|
||||
def __init__(self) -> None:
|
||||
if not super().created:
|
||||
# For each guild, and for each category, there will be a list of messages
|
||||
self.__guildsMessages: Dict[int, Dict[MessagesCategory, List[Message]]] = {}
|
||||
self.__guildsMessages: Dict[int, Dict[MessagesCategory, List[VAbstractMessage]]] = {}
|
||||
# Will, for each message, store the AbstractView that controls it
|
||||
self.__messagesViews: Dict[Message, AbstractView] = {}
|
||||
self.__messagesViews: Dict[VAbstractMessage, AbstractView] = {}
|
||||
|
||||
def addMessage(self, guildID: int, category: MessagesCategory, message: Message, view: AbstractView = None) -> None:
|
||||
def addMessage(self, guildID: int, category: MessagesCategory, message: VAbstractMessage, view: AbstractView = None) -> None:
|
||||
if message is None:
|
||||
return
|
||||
|
||||
@@ -29,7 +30,7 @@ class MessagesManager(Singleton):
|
||||
self.__messagesViews[message] = view
|
||||
sendedMessages.append(message)
|
||||
|
||||
async def addMessageAndClearPrevious(self, guildID: int, category: MessagesCategory, message: Message, view: AbstractView = None) -> None:
|
||||
async def addMessageAndClearPrevious(self, guildID: int, category: MessagesCategory, message: VAbstractMessage, view: AbstractView = None) -> None:
|
||||
if message is None:
|
||||
return
|
||||
|
||||
@@ -66,7 +67,7 @@ class MessagesManager(Singleton):
|
||||
for message in categoriesMessages[category]:
|
||||
self.__deleteMessage(message)
|
||||
|
||||
async def __deleteMessage(self, message: Message) -> None:
|
||||
async def __deleteMessage(self, message: VAbstractMessage) -> None:
|
||||
try:
|
||||
# If there is a view for this message delete the key
|
||||
if message in self.__messagesViews.keys():
|
||||
@@ -75,6 +76,5 @@ class MessagesManager(Singleton):
|
||||
del messageView
|
||||
|
||||
await message.delete()
|
||||
except Exception as e:
|
||||
print(f'[ERROR DELETING MESSAGE] -> {e}')
|
||||
pass
|
||||
except Exception:
|
||||
print(f'[ERROR DELETING MESSAGE] -> {traceback.format_exc()}')
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
from Messages.Responses.AbstractCogResponse import AbstractCommandResponse
|
||||
from Handlers.HandlerResponse import HandlerResponse
|
||||
from Messages.MessagesCategory import MessagesCategory
|
||||
from Messages.DiscordMessages import VAbstractMessage, VDefaultMessage
|
||||
|
||||
|
||||
class EmbedCommandResponse(AbstractCommandResponse):
|
||||
@@ -9,16 +10,20 @@ class EmbedCommandResponse(AbstractCommandResponse):
|
||||
|
||||
async def run(self, deleteLast: bool = True) -> None:
|
||||
message = None
|
||||
# If the response has both embed and view to be sended
|
||||
if self.response.embed and self.response.view:
|
||||
message = await self.context.send(embed=self.response.embed, view=self.response.view)
|
||||
# Set the view to contain the sended message
|
||||
self.response.view.set_message(message)
|
||||
|
||||
# Or just a embed
|
||||
elif self.response.embed:
|
||||
message = await self.context.send(embed=self.response.embed)
|
||||
|
||||
if message:
|
||||
vMessage: VAbstractMessage = VDefaultMessage(message)
|
||||
# Only delete the previous message if this is not error and not forbidden by method caller
|
||||
if deleteLast and self.response.success:
|
||||
await self.manager.addMessageAndClearPrevious(self.context.guild.id, self.category, message, self.response.view)
|
||||
await self.manager.addMessageAndClearPrevious(self.context.guild.id, self.category, vMessage, self.response.view)
|
||||
else:
|
||||
self.manager.addMessage(self.context.guild.id, self.category, message)
|
||||
self.manager.addMessage(self.context.guild.id, self.category, vMessage)
|
||||
|
||||
@@ -11,6 +11,10 @@ class EmoteCommandResponse(AbstractCommandResponse):
|
||||
self.__emojis = VEmojis()
|
||||
|
||||
async def run(self, deleteLast: bool = True) -> None:
|
||||
# Now with Discord Interactions some commands are triggered without message
|
||||
if (self.message is None):
|
||||
return None
|
||||
|
||||
if self.response.success:
|
||||
await self.message.add_reaction(self.__emojis.SUCCESS)
|
||||
else:
|
||||
|
||||
35
Messages/Responses/SlashEmbedResponse.py
Normal file
35
Messages/Responses/SlashEmbedResponse.py
Normal file
@@ -0,0 +1,35 @@
|
||||
from Messages.Responses.AbstractCogResponse import AbstractCommandResponse
|
||||
from Handlers.HandlerResponse import HandlerResponse
|
||||
from Messages.MessagesCategory import MessagesCategory
|
||||
from Messages.DiscordMessages import VAbstractMessage, VWebHookMessage
|
||||
from discord import ApplicationContext
|
||||
|
||||
|
||||
class SlashEmbedResponse(AbstractCommandResponse):
|
||||
def __init__(self, response: HandlerResponse, ctx: ApplicationContext, category: MessagesCategory) -> None:
|
||||
self.__ctx = ctx
|
||||
super().__init__(response, category)
|
||||
|
||||
async def run(self, deleteLast: bool = True) -> None:
|
||||
message = None
|
||||
# If the response has both embed and view to send
|
||||
if self.response.embed and self.response.view:
|
||||
# Respond the Slash command and set the view to contain the sended message
|
||||
message = await self.__ctx.send_followup(embed=self.response.embed, view=self.response.view)
|
||||
self.response.view.set_message(message)
|
||||
|
||||
# If the response only has the embed then send the embed
|
||||
elif self.response.embed:
|
||||
message = await self.__ctx.send_followup(embed=self.response.embed)
|
||||
else:
|
||||
message = await self.__ctx.send_followup('Ok!')
|
||||
|
||||
# If any message was sended
|
||||
if message:
|
||||
# Convert the Discord message type to an Vulkan type
|
||||
vMessage: VAbstractMessage = VWebHookMessage(message)
|
||||
# Only delete the previous message if this is not error and not forbidden by method caller
|
||||
if deleteLast and self.response.success:
|
||||
await self.manager.addMessageAndClearPrevious(self.context.guild.id, self.category, vMessage, self.response.view)
|
||||
else:
|
||||
self.manager.addMessage(self.context.guild.id, self.category, vMessage)
|
||||
Reference in New Issue
Block a user