119 lines
4.2 KiB
Python
119 lines
4.2 KiB
Python
from obspython import *
|
|
from services.Service import Service
|
|
import os.path
|
|
import random
|
|
import re
|
|
|
|
KNOWN_COMMANDS = ["cmd"]
|
|
|
|
SEPARATOR = ";"
|
|
SUBST_SEP = ".,"
|
|
PATTERN_ARGS = "\{[0-9]+\}"
|
|
|
|
class CommandService(Service):
|
|
|
|
title = "Command Service"
|
|
enabled = False
|
|
|
|
msg_cant_manage = ""
|
|
msg_unknown = ""
|
|
msg_wrong_arg_count = ""
|
|
|
|
file = ""
|
|
commands = {}
|
|
|
|
# Service -----
|
|
|
|
def knows(self, command):
|
|
return command.lower() in self.list_commands()
|
|
|
|
def eval(self, command, response, users):
|
|
if command == "cmd":
|
|
self.queue.append(self.manage(response))
|
|
else:
|
|
self.queue.append(self.custom(response["message"]))
|
|
|
|
def list_commands(self):
|
|
return KNOWN_COMMANDS + list(self.commands.keys())
|
|
|
|
def start(self):
|
|
if self.file == "" or not os.path.isfile(self.file):
|
|
return
|
|
with open(self.file, "r", encoding="utf-8") as file:
|
|
content = file.read().splitlines()
|
|
for line in content:
|
|
self.load_command(line)
|
|
|
|
def load_command(self, line):
|
|
components = line.split(SEPARATOR)
|
|
self.commands[components[0].lower()] = components[1].replace(SUBST_SEP, SEPARATOR).split("||")
|
|
|
|
# OBS subset -----
|
|
|
|
def create_properties(self):
|
|
props = obs_properties_create()
|
|
obs_properties_add_path(props, "cmd_file", "Commands list", OBS_PATH_FILE, "Text file (*.txt)", None)
|
|
obs_properties_add_text(props, "cmd_msg_cant_manage", "Message: Unauthorized", OBS_TEXT_DEFAULT)
|
|
obs_properties_add_text(props, "cmd_msg_unknown", "Message: Unknown command", OBS_TEXT_DEFAULT)
|
|
obs_properties_add_text(props, "cmd_msg_wrong_arg_count", "Message: Wrong argument count", OBS_TEXT_DEFAULT)
|
|
return props
|
|
|
|
def update(self, settings):
|
|
self.file = obs_data_get_string(settings, "cmd_file")
|
|
|
|
# Commands -----
|
|
|
|
def manage(self, response):
|
|
can_manage = False
|
|
for badge in response["tags"]["badges"]:
|
|
if badge["name"] in ["broadcaster", "moderator"]:
|
|
can_manage = True
|
|
if not can_manage:
|
|
return f"{self.msg_cant_manage}, @{response['username']}"
|
|
components = response["message"].split(" ", 3)
|
|
if len(components) < 3:
|
|
return f"{self.msg_wrong_arg_count}, @{response['username']}"
|
|
command, action, target_command = components[0], components[1], components[2].lower()
|
|
if len(components) == 4:
|
|
args = components[3]
|
|
if action in ["add", "edit", "update"]:
|
|
return self.add_command(target_command, args) + f", @{response['username']}"
|
|
elif action in ["del", "delete", "remove"]:
|
|
return self.del_command(target_command) + f", @{response['username']}"
|
|
else:
|
|
return f"{self.msg_unknown}, @{response['username']}"
|
|
|
|
def add_command(self, command, args):
|
|
self.commands[command.lstrip("!")] = args.split("||")
|
|
self.write()
|
|
return f"La commande '!{command}' a été ajoutée"
|
|
|
|
def del_command(self, command):
|
|
if command not in self.commands:
|
|
return f"La commande '!{command}' n'existe pas"
|
|
self.commands.pop(command)
|
|
self.write()
|
|
return f"La commande '!{command}' a été supprimée"
|
|
|
|
def write(self):
|
|
with open(self.file, "w", encoding="utf-8") as file:
|
|
for name in self.commands:
|
|
file.write(f"{name}{SEPARATOR}{'||'.join(self.commands[name]).replace(SEPARATOR, SUBST_SEP)}\n")
|
|
|
|
def custom(self, message):
|
|
components = message.split(" ", 1)
|
|
command_name = components[0][1:].lower()
|
|
command = self.commands[command_name][random.randint(0, len(self.commands[command_name]) - 1)]
|
|
args = list(dict.fromkeys(re.findall(PATTERN_ARGS, command)))
|
|
args.sort()
|
|
count = len(args)
|
|
if count >= 1:
|
|
msg_components = []
|
|
if len(components) > 1:
|
|
msg_components = components[1].split(" ")
|
|
if len(msg_components) != count:
|
|
return self.msg_wrong_arg_count
|
|
for i in range(0, count):
|
|
command = command.replace(args[i], msg_components[i].lstrip("@"))
|
|
return command
|