def __init__(self, ServerControl):
     self.CommandTable = OrderedDict()
     self.ServerControl = ServerControl
     self.LogFile = None
     if ServerControl.LogCommands:
         try:
             self.LogFile = open("Logs/commands.log", "a")
         except IOError:
             Console.Warning("Logging", "Unable to open file \"Logs/commands.log\" - logging disabled")
 def _SortCommands(self):
     self.CommandTable = OrderedDict(sorted(self.CommandTable.items(), key = lambda i: i[0]))
class CommandHandler(object):
    '''Stores all the commands available on opticraft and processes any command messages'''
    def __init__(self, ServerControl):
        self.CommandTable = OrderedDict()
        self.ServerControl = ServerControl
        self.LogFile = None
        if ServerControl.LogCommands:
            try:
                self.LogFile = open("Logs/commands.log", "a")
            except IOError:
                Console.Warning("Logging", "Unable to open file \"Logs/commands.log\" - logging disabled")

    def HandleCommand(self, pPlayer, Message):
        '''Called when a player types a slash command'''
        if Message == '':
            pPlayer.SendMessage("&RPlease enter in a command!")
            return
        Tokens = Message.split()
        Command = Tokens[0].lower()
        if self.CommandTable.has_key(Command) == False:
            pPlayer.SendMessage("&RNo such command. Type /cmdlist for a list of commands")
            return
        else:
            CommandObj = self.CommandTable[Command]
            CommandObj.Execute(pPlayer, Message)

    def AddCommandObj(self, CmdObj):
        self._AddCommandObj(CmdObj, CmdObj.Name)
        for Alias in CmdObj.Aliases:
            self._AddCommandObj(CmdObj, Alias)
            
    def _AddCommandObj(self, CmdObj, Name):
        if self.CommandTable.has_key(Name.lower()):
            Console.Warning("Commands", "Command %s has been defined twice. Posible plugin conflict" % Name)
        self.CommandTable[Name.lower()] = CmdObj
        
        Permission = self.ServerControl.ConfigValues.GetValue("commandoverrides", Name, '')
        if Permission != '':
            if self.ServerControl.IsValidRank(Permission):
                Console.Out("CommandOverride", "Overrode command %s to rank %s" % (Name, Permission))
                self.OverrideCommandPermissions(CmdObj, Permission)
            else:
                Console.Warning("CommandOverride", "Failed to override command %s, rank %s does not exist" % (Name, Permission))
        self._SortCommands()
            
    def _SortCommands(self):
        self.CommandTable = OrderedDict(sorted(self.CommandTable.items(), key = lambda i: i[0]))

    def RemoveCommand(self, CmdObj):
        ToRemove = []
        for CommandName in self.CommandTable:
            if self.CommandTable[CommandName] == CmdObj:
                ToRemove.append(CommandName)
                
        while len(ToRemove) > 0:
            del self.CommandTable[ToRemove.pop()]

    def OverrideCommandPermissions(self, CmdObj, NewPermission):
        CmdObj.Permissions = NewPermission.lower()
        CmdObj.PermissionLevel = self.ServerControl.GetRankLevel(NewPermission.lower())
        return True