Command names instead of numbers

This commit is contained in:
Dylan Hackworth 2020-03-29 17:04:10 -05:00
parent 4c693205a7
commit 9b00214dd3
1 changed files with 63 additions and 47 deletions

View File

@ -6,52 +6,55 @@ import shlex
class MatrixModule(BotModule): class MatrixModule(BotModule):
def __init__(self, name): def __init__(self, name):
super().__init__(name) super().__init__(name)
self.commands = [] self.commands = {}
async def matrix_message(self, bot, room, event): async def matrix_message(self, bot, room, event):
args = shlex.split(event.body) args = shlex.split(event.body)
args.pop(0) args.pop(0)
if len(args) >= 2: # Message body possibilities:
# Get full command without using quotation marks # ["run", "echo", "Hello", "world"]
command = f"{args[1]}"
for part_of_command in args[2:]:
command += f" {part_of_command}"
if len(args) == 2:
if args[0] == 'run': if args[0] == 'run':
command_body = MatrixModule.stitch(args[1:])
bot.must_be_owner(event) bot.must_be_owner(event)
out = self.run_command(args[1], event.sender, room.display_name) out = self.run_command(command_body, event.sender, room.display_name)
await self.send_output(bot, room, out) await self.send_output(bot, room, out)
if args[0] == 'remove': # Message body possibilities:
# ["remove", "command_name"]
elif args[0] == 'remove':
command_name = args[1]
bot.must_be_owner(event) bot.must_be_owner(event)
command_number = int(args[1]) if command_name in self.commands:
if self.commands[command_number] is not None: await bot.send_text(room, f'Removed "{self.commands[command_name]}"')
await bot.send_text(room, f'Removed "{self.commands[command_number]}"') del self.commands[command_name]
self.commands.pop(command_number)
bot.save_settings() bot.save_settings()
else: else:
await bot.send_text(room, f'Could not find command #{command_number}') await bot.send_text(room, f'Could not find command "{command_name}"')
elif len(args) == 3: # Message body possibilities:
if args[0] == 'add': # ["add", "command_name", "echo", "Hello", "world"]
elif args[0] == 'add':
command_name = args[1]
command_body = MatrixModule.stitch(args[2:])
bot.must_be_owner(event) bot.must_be_owner(event)
self.commands.append(command) self.commands[command_name] = command_body
bot.save_settings() bot.save_settings()
await bot.send_text(room, 'Command added.') await bot.send_text(room, f'Added "{command_name}" -> "{command_body}".')
elif len(args) == 1: # Message body possibilities:
if args[0] == 'list': # ["list"]
elif args[0] == 'list':
if len(self.commands) == 0: if len(self.commands) == 0:
await bot.send_text(room, "No known commands") await bot.send_text(room, "No known commands")
else: else:
list_commands = "" known_commands = "Known commands:\n"
i = 0 for command_name in self.commands.keys():
for command_name in self.commands: command_body = self.commands[command_name]
list_commands += f"\n - {i}. \"{command_name}\"" known_commands += f' - "{command_name}" -> "{command_body}"\n'
i += 1 await bot.send_text(room, known_commands)
await bot.send_text(room, 'Known commands: ' + list_commands) # Message body possibilities:
# ["command_name"]
else: else:
command_number = int(args[0]) command_name = args[0]
target_command = self.commands[command_number] if command_name in self.commands:
if target_command is not None: target_command = self.commands[command_name]
self.logger.debug( self.logger.debug(
f"room: {room.display_name} sender: {event.sender} wants to run cmd {target_command}" f"room: {room.display_name} sender: {event.sender} wants to run cmd {target_command}"
) )
@ -73,6 +76,19 @@ class MatrixModule(BotModule):
if data.get('commands'): if data.get('commands'):
self.commands = data['commands'] self.commands = data['commands']
@staticmethod
def stitch(body: list) -> str:
"""
This is used for stitching arguments again
Examples:
["echo", "Hello", "world"] -> "echo Hello world"
Args:
body: str[]
Returns: str
"""
return " ".join(body)
def run_command(self, command, user, roomname): def run_command(self, command, user, roomname):
self.logger.info(f"Running command {command}..") self.logger.info(f"Running command {command}..")
environment = {'MATRIX_USER': user, 'MATRIX_ROOM': roomname} environment = {'MATRIX_USER': user, 'MATRIX_ROOM': roomname}