mod-commands/__init__.py
2020-04-28 08:49:20 +02:00

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()