Fixing error in sending commands to closed process queue

This commit is contained in:
Rafael Vargas
2022-07-31 19:50:59 -04:00
parent 5b61947904
commit 4fd23c56b6
9 changed files with 49 additions and 7 deletions

View File

@@ -4,6 +4,7 @@ from discord.ext.commands import Context
from Music.VulkanBot import VulkanBot from Music.VulkanBot import VulkanBot
from Handlers.AbstractHandler import AbstractHandler from Handlers.AbstractHandler import AbstractHandler
from Handlers.HandlerResponse import HandlerResponse from Handlers.HandlerResponse import HandlerResponse
from Parallelism.ProcessInfo import ProcessInfo
class ClearHandler(AbstractHandler): class ClearHandler(AbstractHandler):
@@ -13,7 +14,7 @@ class ClearHandler(AbstractHandler):
async def run(self) -> HandlerResponse: async def run(self) -> HandlerResponse:
# Get the current process of the guild # Get the current process of the guild
processManager = self.config.getProcessManager() processManager = self.config.getProcessManager()
processInfo = processManager.getRunningPlayerInfo(self.guild) processInfo: ProcessInfo = processManager.getRunningPlayerInfo(self.guild)
if processInfo: if processInfo:
# Clear the playlist # Clear the playlist
playlist = processInfo.getPlaylist() playlist = processInfo.getPlaylist()

View File

@@ -2,6 +2,7 @@ from discord.ext.commands import Context
from Handlers.AbstractHandler import AbstractHandler from Handlers.AbstractHandler import AbstractHandler
from Handlers.HandlerResponse import HandlerResponse from Handlers.HandlerResponse import HandlerResponse
from Parallelism.Commands import VCommands, VCommandsType from Parallelism.Commands import VCommands, VCommandsType
from Parallelism.ProcessInfo import ProcessInfo, ProcessStatus
from Music.VulkanBot import VulkanBot from Music.VulkanBot import VulkanBot
from typing import Union from typing import Union
from discord import Interaction from discord import Interaction
@@ -13,8 +14,12 @@ class PauseHandler(AbstractHandler):
async def run(self) -> HandlerResponse: async def run(self) -> HandlerResponse:
processManager = self.config.getProcessManager() processManager = self.config.getProcessManager()
processInfo = processManager.getRunningPlayerInfo(self.guild) processInfo: ProcessInfo = processManager.getRunningPlayerInfo(self.guild)
if processInfo: if processInfo:
if processInfo.getStatus() == ProcessStatus.SLEEPING:
embed = self.embeds.NOT_PLAYING()
return HandlerResponse(self.ctx, embed)
# Send Pause command to be execute by player process # Send Pause command to be execute by player process
command = VCommands(VCommandsType.PAUSE, None) command = VCommands(VCommandsType.PAUSE, None)
queue = processInfo.getQueueToPlayer() queue = processInfo.getQueueToPlayer()

View File

@@ -1,6 +1,7 @@
from discord.ext.commands import Context from discord.ext.commands import Context
from Handlers.AbstractHandler import AbstractHandler from Handlers.AbstractHandler import AbstractHandler
from Handlers.HandlerResponse import HandlerResponse from Handlers.HandlerResponse import HandlerResponse
from Parallelism.ProcessInfo import ProcessInfo, ProcessStatus
from Parallelism.Commands import VCommands, VCommandsType from Parallelism.Commands import VCommands, VCommandsType
from Music.VulkanBot import VulkanBot from Music.VulkanBot import VulkanBot
from typing import Union from typing import Union
@@ -14,8 +15,12 @@ class ResetHandler(AbstractHandler):
async def run(self) -> HandlerResponse: async def run(self) -> HandlerResponse:
# Get the current process of the guild # Get the current process of the guild
processManager = self.config.getProcessManager() processManager = self.config.getProcessManager()
processInfo = processManager.getRunningPlayerInfo(self.guild) processInfo: ProcessInfo = processManager.getRunningPlayerInfo(self.guild)
if processInfo: if processInfo:
if processInfo.getStatus() == ProcessStatus.SLEEPING:
embed = self.embeds.NOT_PLAYING()
return HandlerResponse(self.ctx, embed)
command = VCommands(VCommandsType.RESET, None) command = VCommands(VCommandsType.RESET, None)
queue = processInfo.getQueueToPlayer() queue = processInfo.getQueueToPlayer()
queue.put(command) queue.put(command)

View File

@@ -1,6 +1,7 @@
from discord.ext.commands import Context from discord.ext.commands import Context
from Handlers.AbstractHandler import AbstractHandler from Handlers.AbstractHandler import AbstractHandler
from Handlers.HandlerResponse import HandlerResponse from Handlers.HandlerResponse import HandlerResponse
from Parallelism.ProcessInfo import ProcessInfo, ProcessStatus
from Parallelism.Commands import VCommands, VCommandsType from Parallelism.Commands import VCommands, VCommandsType
from Music.VulkanBot import VulkanBot from Music.VulkanBot import VulkanBot
from typing import Union from typing import Union
@@ -13,8 +14,12 @@ class ResumeHandler(AbstractHandler):
async def run(self) -> HandlerResponse: async def run(self) -> HandlerResponse:
processManager = self.config.getProcessManager() processManager = self.config.getProcessManager()
processInfo = processManager.getRunningPlayerInfo(self.guild) processInfo: ProcessInfo = processManager.getRunningPlayerInfo(self.guild)
if processInfo: if processInfo:
if processInfo.getStatus() == ProcessStatus.SLEEPING:
embed = self.embeds.NOT_PLAYING()
return HandlerResponse(self.ctx, embed)
# Send Resume command to be execute by player process # Send Resume command to be execute by player process
command = VCommands(VCommandsType.RESUME, None) command = VCommands(VCommandsType.RESUME, None)
queue = processInfo.getQueueToPlayer() queue = processInfo.getQueueToPlayer()

View File

@@ -3,6 +3,7 @@ from Handlers.AbstractHandler import AbstractHandler
from Config.Exceptions import BadCommandUsage, ImpossibleMove from Config.Exceptions import BadCommandUsage, ImpossibleMove
from Handlers.HandlerResponse import HandlerResponse from Handlers.HandlerResponse import HandlerResponse
from Music.VulkanBot import VulkanBot from Music.VulkanBot import VulkanBot
from Parallelism.ProcessInfo import ProcessInfo, ProcessStatus
from Parallelism.Commands import VCommands, VCommandsType from Parallelism.Commands import VCommands, VCommandsType
from typing import Union from typing import Union
from discord import Interaction from discord import Interaction
@@ -19,8 +20,12 @@ class SkipHandler(AbstractHandler):
return HandlerResponse(self.ctx, embed, error) return HandlerResponse(self.ctx, embed, error)
processManager = self.config.getProcessManager() processManager = self.config.getProcessManager()
processInfo = processManager.getRunningPlayerInfo(self.guild) processInfo: ProcessInfo = processManager.getRunningPlayerInfo(self.guild)
if processInfo: # Verify if there is a running process if processInfo: # Verify if there is a running process
if processInfo.getStatus() == ProcessStatus.SLEEPING:
embed = self.embeds.NOT_PLAYING()
return HandlerResponse(self.ctx, embed)
playlist = processInfo.getPlaylist() playlist = processInfo.getPlaylist()
if playlist.isLoopingOne(): if playlist.isLoopingOne():
embed = self.embeds.ERROR_DUE_LOOP_ONE_ON() embed = self.embeds.ERROR_DUE_LOOP_ONE_ON()

View File

@@ -2,6 +2,7 @@ from discord.ext.commands import Context
from Handlers.AbstractHandler import AbstractHandler from Handlers.AbstractHandler import AbstractHandler
from Handlers.HandlerResponse import HandlerResponse from Handlers.HandlerResponse import HandlerResponse
from Music.VulkanBot import VulkanBot from Music.VulkanBot import VulkanBot
from Parallelism.ProcessInfo import ProcessInfo, ProcessStatus
from Parallelism.Commands import VCommands, VCommandsType from Parallelism.Commands import VCommands, VCommandsType
from typing import Union from typing import Union
from discord import Interaction from discord import Interaction
@@ -13,8 +14,12 @@ class StopHandler(AbstractHandler):
async def run(self) -> HandlerResponse: async def run(self) -> HandlerResponse:
processManager = self.config.getProcessManager() processManager = self.config.getProcessManager()
processInfo = processManager.getRunningPlayerInfo(self.guild) processInfo: ProcessInfo = processManager.getRunningPlayerInfo(self.guild)
if processInfo: if processInfo:
if processInfo.getStatus() == ProcessStatus.SLEEPING:
embed = self.embeds.NOT_PLAYING()
return HandlerResponse(self.ctx, embed)
# Send command to player process stop # Send command to player process stop
command = VCommands(VCommandsType.STOP, None) command = VCommands(VCommandsType.STOP, None)
queue = processInfo.getQueueToPlayer() queue = processInfo.getQueueToPlayer()

View File

@@ -247,6 +247,7 @@ class PlayerProcess(Process):
if self.__guild.voice_client.is_connected(): if self.__guild.voice_client.is_connected():
with self.__playlistLock: with self.__playlistLock:
self.__playlist.loop_off() self.__playlist.loop_off()
self.__playlist.clear()
# Send a command to the main process put this to sleep # Send a command to the main process put this to sleep
sleepCommand = VCommands(VCommandsType.SLEEPING) sleepCommand = VCommands(VCommandsType.SLEEPING)

View File

@@ -1,8 +1,14 @@
from enum import Enum
from multiprocessing import Process, Queue, Lock from multiprocessing import Process, Queue, Lock
from discord import TextChannel from discord import TextChannel
from Music.Playlist import Playlist from Music.Playlist import Playlist
class ProcessStatus(Enum):
RUNNING = 'Running'
SLEEPING = 'Sleeping'
class ProcessInfo: class ProcessInfo:
""" """
Class to store the reference to all structures to maintain a player process Class to store the reference to all structures to maintain a player process
@@ -15,10 +21,17 @@ class ProcessInfo:
self.__playlist = playlist self.__playlist = playlist
self.__lock = lock self.__lock = lock
self.__textChannel = textChannel self.__textChannel = textChannel
self.__status = ProcessStatus.RUNNING
def setProcess(self, newProcess: Process) -> None: def setProcess(self, newProcess: Process) -> None:
self.__process = newProcess self.__process = newProcess
def getStatus(self) -> ProcessStatus:
return self.__status
def setStatus(self, status: ProcessStatus) -> None:
self.__status = status
def getProcess(self) -> Process: def getProcess(self) -> Process:
return self.__process return self.__process

View File

@@ -11,7 +11,7 @@ from Music.MessagesController import MessagesController
from Music.Song import Song from Music.Song import Song
from Parallelism.PlayerProcess import PlayerProcess from Parallelism.PlayerProcess import PlayerProcess
from Music.Playlist import Playlist from Music.Playlist import Playlist
from Parallelism.ProcessInfo import ProcessInfo from Parallelism.ProcessInfo import ProcessInfo, ProcessStatus
from Parallelism.Commands import VCommands, VCommandsType from Parallelism.Commands import VCommands, VCommandsType
from Music.VulkanBot import VulkanBot from Music.VulkanBot import VulkanBot
@@ -170,6 +170,8 @@ class ProcessManager(Singleton):
queue1.join_thread() queue1.join_thread()
queue2.close() queue2.close()
queue2.join_thread() queue2.join_thread()
# Set the status of this process as sleeping, only the playlist object remains
self.__playersProcess[guildID].setStatus(ProcessStatus.SLEEPING)
async def showNowPlaying(self, guildID: int, song: Song) -> None: async def showNowPlaying(self, guildID: int, song: Song) -> None:
messagesController = self.__playersMessages[guildID] messagesController = self.__playersMessages[guildID]