generated from PDBA/module-template
92 lines
3.7 KiB
Python
92 lines
3.7 KiB
Python
from mod_base import BaseModule
|
|
from config.config_types import factory
|
|
import config.config_types as c_t
|
|
from config import Config
|
|
import os
|
|
|
|
|
|
class BaseCommand(BaseModule):
|
|
def __init__(self, client):
|
|
super().__init__(client)
|
|
self.com_config = self.client.get_config(path=os.path.join(client.config["data_folder"], "commands", "config.toml"))
|
|
self.com_config.register("prefix", factory(c_t.Str))
|
|
self.config.register("command_text", factory(c_t.Str))
|
|
|
|
self.com_config.set({"prefix": "!"}, no_save=True)
|
|
self.config.set({"command_text": self.name.lower()}, no_save=True)
|
|
|
|
self.com_config.load()
|
|
self.config.load()
|
|
|
|
@staticmethod
|
|
def _parse_command_content(content):
|
|
if not len(content.split()):
|
|
return "", [], []
|
|
# Sub_command
|
|
sub_command = content.split()[0]
|
|
args_ = [sub_command]
|
|
kwargs = []
|
|
if len(content.split()) > 1:
|
|
# Remove subcommand
|
|
content = content.lstrip(sub_command)
|
|
# Take the other part of command_text
|
|
content = content.lstrip().replace("\"", "\"\"")
|
|
# Splitting around quotes
|
|
quotes = [element.split("\" ") for element in content.split(" \"")]
|
|
# Split all sub chains but raw chains and flat the resulting list
|
|
args = [item.split() if item[0] != "\"" else [item, ] for sublist in quotes for item in sublist]
|
|
# Second plating
|
|
args = [item for sublist in args for item in sublist]
|
|
# args_ are arguments, kwargs are options with arguments
|
|
i = 0
|
|
while i < len(args):
|
|
if args[i].startswith("\""):
|
|
args_.append(args[i][1:-1])
|
|
elif args[i].startswith("--"):
|
|
if i + 1 >= len(args):
|
|
kwargs.append((args[i].lstrip("-"), None))
|
|
break
|
|
if args[i + 1][0] != "-":
|
|
kwargs.append((args[i].lstrip("-"), args[i + 1].strip("\"")))
|
|
i += 1
|
|
else:
|
|
kwargs.append((args[i].lstrip("-"), None))
|
|
elif args[i].startswith("-"):
|
|
if len(args[i]) == 2:
|
|
if i + 1 >= len(args):
|
|
break
|
|
if args[i + 1][0] != "-":
|
|
kwargs.append((args[i].lstrip("-"), args[i + 1].strip("\"")))
|
|
i += 1
|
|
else:
|
|
kwargs.append((args[i].lstrip("-"), None))
|
|
else:
|
|
kwargs.extend([(arg, None) for arg in args[i][1:]])
|
|
else:
|
|
args_.append(args[i])
|
|
i += 1
|
|
return sub_command, args_, kwargs
|
|
|
|
async def parse_command(self, message):
|
|
command = self.com_config["prefix"] + self.config["command_text"]
|
|
if message.content.startswith(command):
|
|
content = message.content.split(command, 1)[1]
|
|
sub_command, args, kwargs = self._parse_command_content(content)
|
|
sub_command_method = "com_" + sub_command
|
|
if sub_command_method in dir(self):
|
|
await self.__getattribute__(sub_command_method)(message, args, kwargs)
|
|
else:
|
|
await self.command(message, args, kwargs)
|
|
|
|
async def on_message(self, message):
|
|
if message.author.bot:
|
|
return
|
|
await self.parse_command(message)
|
|
|
|
async def command(self, message, args, kwargs):
|
|
pass
|
|
|
|
async def on_config_update(self):
|
|
super().on_config_update()
|
|
self.com_config.load()
|