90 lines
1.9 KiB
Python
90 lines
1.9 KiB
Python
from enum import Enum
|
|
from functools import lru_cache
|
|
|
|
import constants
|
|
|
|
|
|
class Command(Enum):
|
|
CLEAR = "clear"
|
|
CURRENT = "current"
|
|
EXECUTE = "execute"
|
|
FAST_FORWARD = "ff"
|
|
HELP = "help"
|
|
JOIN = "join"
|
|
LEAVE = "leave"
|
|
LOOKUP = "lookup"
|
|
PAUSE = "pause"
|
|
PING = "ping"
|
|
PLAY = "play"
|
|
PLAYING = "playing"
|
|
PURGE = "purge"
|
|
QUEUE = "queue"
|
|
RELOAD = "reload"
|
|
RESUME = "resume"
|
|
SKIP = "skip"
|
|
STATUS = "status"
|
|
UPTIME = "uptime"
|
|
VOLUME = "volume"
|
|
|
|
|
|
@lru_cache
|
|
def match_token(token: str) -> list[Command]:
|
|
if token.lower() == "r":
|
|
return [Command.RELOAD]
|
|
|
|
if exact_match := list(
|
|
filter(
|
|
lambda command: command.value == token.lower(),
|
|
Command.__members__.values(),
|
|
)
|
|
):
|
|
return exact_match
|
|
|
|
return list(
|
|
filter(
|
|
lambda command: command.value.startswith(token.lower()),
|
|
Command.__members__.values(),
|
|
)
|
|
)
|
|
|
|
|
|
@lru_cache
|
|
def match(command: str) -> list[Command] | None:
|
|
if tokens := tokenize(command):
|
|
return match_token(tokens[0])
|
|
|
|
|
|
@lru_cache
|
|
def tokenize(string: str, remove_prefix: bool = True) -> list[str]:
|
|
tokens = []
|
|
token = ""
|
|
in_quotes = False
|
|
quote_char = None
|
|
escape = False
|
|
|
|
if remove_prefix:
|
|
string = string[len(constants.PREFIX) :]
|
|
|
|
for char in string:
|
|
if escape:
|
|
token += char
|
|
escape = False
|
|
elif char == "\\":
|
|
escape = True
|
|
elif char in ('"', "'") and not in_quotes:
|
|
in_quotes = True
|
|
quote_char = char
|
|
elif char == quote_char and in_quotes:
|
|
in_quotes = False
|
|
quote_char = None
|
|
elif char.isspace() and not in_quotes:
|
|
if token:
|
|
tokens.append(token)
|
|
token = ""
|
|
else:
|
|
token += char
|
|
|
|
if token:
|
|
tokens.append(token)
|
|
return tokens
|