117 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/python3
 | 
						|
# -*- coding: utf-8 -*-
 | 
						|
import logging
 | 
						|
import asyncio
 | 
						|
import sys
 | 
						|
import re
 | 
						|
import traceback
 | 
						|
import math
 | 
						|
from importlib import reload
 | 
						|
from . import Commandsmg
 | 
						|
 | 
						|
class CommandHandlermg():
 | 
						|
	def __init__(self, Torchlight):
 | 
						|
		self.Logger = logging.getLogger(__class__.__name__)
 | 
						|
		self.Torchlight = Torchlight
 | 
						|
		self.Commands = []
 | 
						|
		self.NeedsReload = False
 | 
						|
 | 
						|
	def Setup(self):
 | 
						|
		Counter = len(self.Commands)
 | 
						|
		self.Commands.clear()
 | 
						|
		if Counter:
 | 
						|
			self.Logger.info(sys._getframe().f_code.co_name + " Unloaded {0} commands!".format(Counter))
 | 
						|
 | 
						|
		Counter = 0
 | 
						|
		for subklass in sorted(Commandsmg.BaseCommand.__subclasses__(), key = lambda x: x.Order, reverse = True):
 | 
						|
			try:
 | 
						|
				Command = subklass(self.Torchlight)
 | 
						|
				if hasattr(Command, "_setup"):
 | 
						|
					Command._setup()
 | 
						|
			except Exception as e:
 | 
						|
				self.Logger.error(traceback.format_exc())
 | 
						|
			else:
 | 
						|
				self.Commands.append(Command)
 | 
						|
				Counter += 1
 | 
						|
 | 
						|
		self.Logger.info(sys._getframe().f_code.co_name + " Loaded {0} commands!".format(Counter))
 | 
						|
 | 
						|
	def Reload(self):
 | 
						|
		try:
 | 
						|
			reload(Commandsmg)
 | 
						|
		except Exception as e:
 | 
						|
			self.Logger.error(traceback.format_exc())
 | 
						|
		else:
 | 
						|
			self.Setup()
 | 
						|
 | 
						|
	async def HandleCommand(self, line, player):
 | 
						|
		Message = line.split(sep = ' ', maxsplit = 1)
 | 
						|
		if len(Message) < 2:
 | 
						|
			Message.append("")
 | 
						|
		Message[1] = Message[1].strip()
 | 
						|
 | 
						|
		if Message[1] and self.Torchlight().LastUrl:
 | 
						|
			Message[1] = Message[1].replace("!last", self.Torchlight().LastUrl)
 | 
						|
			line = Message[0] + ' ' + Message[1]
 | 
						|
 | 
						|
		Level = 0
 | 
						|
		if player.Access:
 | 
						|
			Level = player.Access["level"]
 | 
						|
 | 
						|
		RetMessage = None
 | 
						|
		Ret = None
 | 
						|
		for Command in self.Commands:
 | 
						|
			for Trigger in Command.Triggers:
 | 
						|
				Match = False
 | 
						|
				RMatch = None
 | 
						|
				if isinstance(Trigger, tuple):
 | 
						|
					if Message[0].lower().startswith(Trigger[0], 0, Trigger[1]):
 | 
						|
						Match = True
 | 
						|
				elif isinstance(Trigger, str):
 | 
						|
					if Message[0].lower() == Trigger.lower():
 | 
						|
						Match = True
 | 
						|
				else: # compiled regex
 | 
						|
					RMatch = Trigger.search(line)
 | 
						|
					if RMatch:
 | 
						|
						Match = True
 | 
						|
 | 
						|
				if not Match:
 | 
						|
					continue
 | 
						|
 | 
						|
				self.Logger.debug(sys._getframe().f_code.co_name + " \"{0}\" Match -> {1} | {2}".format(player.Name, Command.__class__.__name__, Trigger))
 | 
						|
 | 
						|
				if Level < Command.Level:
 | 
						|
					RetMessage = "You do not have access to this command! (You: {0} | Required: {1})".format(Level, Command.Level)
 | 
						|
					continue
 | 
						|
 | 
						|
				try:
 | 
						|
					if RMatch:
 | 
						|
						Ret = await Command._rfunc(line, RMatch, player)
 | 
						|
					else:
 | 
						|
						Ret = await Command._func(Message, player)
 | 
						|
				except Exception as e:
 | 
						|
					self.Logger.error(traceback.format_exc())
 | 
						|
					self.Torchlight().SayChat("Error: {0}".format(str(e)))
 | 
						|
 | 
						|
				RetMessage = None
 | 
						|
 | 
						|
				if isinstance(Ret, str):
 | 
						|
					Message = Ret.split(sep = ' ', maxsplit = 1)
 | 
						|
					Ret = None
 | 
						|
 | 
						|
				if Ret != None and Ret > 0:
 | 
						|
					break
 | 
						|
 | 
						|
			if Ret != None and Ret >= 0:
 | 
						|
				break
 | 
						|
 | 
						|
		if RetMessage:
 | 
						|
			self.Torchlight().SayPrivate(player, RetMessage)
 | 
						|
 | 
						|
		if self.NeedsReload:
 | 
						|
			self.NeedsReload = False
 | 
						|
			self.Reload()
 | 
						|
 | 
						|
		return Ret
 | 
						|
 |