Beispiel #1
0
 def checkAclTopics(topic2):
     if hasattr(topic2,"__call__"):
         topic2=topic2()
     if type(topic2)==tuple:
         if len(topic2)>2:
             acl_needed=topic2[2]
             if acl_needed<acl:
                 return None
         else:
             acl_needed=0
         topic=topic2[1]
     else:
         topic=topic2
     if type(topic)==dict:
         ret=dict()
         for subtopic in topic:
             newtopic=checkAclTopics(topic[subtopic])
             if newtopic!=None:
                 ret[subtopic]=newtopic
     elif type(topic)==list:
         ret=[]
         for command in topic:
             if AccessLevel.isAllowed(command,acl):
                 ret+=[command]
     elif type(topic)==str:
         if acl<=acl_needed: ret=topic
         else:               ret=""
     if len(ret): 
         if type(topic2)==tuple:
             ret=topic2[0:1]+(ret,)+topic2[2:]
         return ret
     else:        
         return None
Beispiel #2
0
def mode(acl, player, modename, when=None):
    if when!=None:
        ctype="set"
    else:
        ctype="vote"
    if locked:
        Armagetronad.PrintPlayerMessage(player, Messages.ModeLocked)
        return
    if modename.lower() not in SimpleMode.modes:
        Armagetronad.PrintPlayerMessage(player, Messages.ModeNotExist.format(mode=modename))
        return
    if SimpleMode.current_mode:
        if SimpleMode.current_mode.name.lower()==modename.lower() and ctype=="vote": #@UndefinedVariable
            Armagetronad.PrintPlayerMessage(player, Messages.ModeAlreadyPlaying)
            return

    def removeActivateMethods(l, name="activate", cls=SimpleMode.Mode):
        ret=[]
        for i in l:
            if not inspect.ismethod(i):
                ret.append(i)
                continue
            if not (i.__name__==name and i.__self__.__class__==cls):
                ret.append(i)
        return ret

    def activator(w="roundend"):
        w=w.lower()
        if w=="now":
            SimpleMode.modes[modename.lower()].activate(kill=True)
        elif w in ("roundend","matchend"):
            w=w.capitalize()
            handler_list=getattr(LadderLogHandlers, "at"+w)
            handler_list=removeActivateMethods(handler_list)
            handler_list.append(SimpleMode.modes[modename.lower()].activate) #UndefiniedVariable
            setattr(LadderLogHandlers, "at"+w, handler_list)
        
    if ctype=="vote":
        try:
            target="Mode '"+modename+"'"
            act=lambda: activator("roundend")
            if SimpleMode.current_mode and SimpleMode.current_mode.lives>10:
                act=lambda: activator("now")
            Poll.Add(target, act, player)
            Poll.current_poll.SetPlayerVote(player, True)
            Poll.current_poll.CheckResult(only_sure=True)
        except RuntimeError as r:
            if r.args[1]==1:
                Armagetronad.PrintPlayerMessage(player, Messages.PollAlreadyActive)
            elif r.args[1]==2:
                Armagetronad.PrintPlayerMessage(player, Messages.SpecNotAllowed)
                Poll.Cancel()
            return
    elif ctype=="set":
        when=when.lower()
        access_name="mode_set_"+when
        if AccessLevel.accessLevelSet(access_name) and not AccessLevel.isAllowed(access_name, acl):
            Armagetronad.PrintPlayerMessage(player, "0xff0000You're not allowed to do that. ")
            return
        activator(when)
        if when=="roundend":
            Armagetronad.PrintMessage(Messages.NextRoundMode.format(mode=modename.lower(), player=Player.players[player].name))
        elif when=="matchend":
            Armagetronad.PrintMessage(Messages.NextMatchMode.format(mode=modename.lower(), player=Player.players[player].name))
        elif when=="now":
            Armagetronad.PrintMessage(Messages.ModeChanged.format(mode=modename.lower(), player=Player.players[player].name))
Beispiel #3
0
def getArgs(command,acl):
    if command not in commands:
        command=getRealCommand(command)
    minargcount, maxargcount, defaultvalues, names=commandvalues[command][:4]
    allowed=lambda i: not AccessLevel.accessLevelSet(command.lower()+"_param_"+i.lower()) or AccessLevel.isAllowed(command.lower()+"_param_"+i, acl)
    optionalargs=names[minargcount:]
    newnames=[]
    for name in names:
        if not allowed(name):
            if name not in optionalargs:
                minargcount-=1
            elif name in optionalargs and optionalargs.index(name)==len(optionalargs)-1 and maxargcount==float("inf"):
                maxargcount=minargcount+len(optionalargs)
                continue
            maxargcount-=1
        else:
            newnames.append(name)
    return minargcount, maxargcount, defaultvalues, newnames
Beispiel #4
0
def InvalidCommand(command, player, ip, access, *args):
    # Check if the command is valid ####
    if not player in Player.players:
        log.error("Player „"+player+"“ doesn't exist.")
        Armagetronad.PrintPlayerMessage(player, Messages.PlayerNotExist, Messages.PlayerColorCode)
        return
    command=command[1:]
    if command.strip()=="":
        if "buffer" in Player.players[player].data:
            Player.players[player].data["buffer"].append(" ".join(args) )
        else:
            Player.players[player].data["buffer"]=[" ".join(args)]
        Armagetronad.PrintPlayerMessage(player," ".join(args) )
        return
    saved_command=command
    command=[realcommand for realcommand in Commands.getCommands() if realcommand.lower()==command]
    if len(command)>1:
        log.warning("More than one function for command "+command[0]+". Chosing 1st one.")
    elif len(command)<1:
        Armagetronad.PrintPlayerMessage(player, Messages.CommandNotFound.format(command=saved_command) )
        return
    command=command[0]
    if command in Commands.disabled:
        Armagetronad.PrintPlayerMessage(player, Messages.DisabledCommand)
        return    
    if Global.state in Commands.not_in_state:
        if command in Commands.not_in_state[Global.state]:
            Armagetronad.PrintPlayerMessage(player, Messages.WrongState.format(command=command) )
            return
    if Global.state in Commands.only_in_state:
        for state, commands in Commands.only_in_state.items():
            if command in commands and Global.state!=state:
                Armagetronad.PrintPlayerMessage(player, Messages.WrongState.format(command=command) )
                return
    if not AccessLevel.isAllowed(command,access):
        Armagetronad.PrintPlayerMessage(player, Messages.NotAllowed.format(command=command) )
        return
    if not Commands.checkUsage(command, access, *args):
        Armagetronad.PrintPlayerMessage(player, Commands.getHelp(command,access))
        return

    # Process command ####
    def ProcessCommand(command, args):
        global runningCommands
        args=(access,player) + args
        try:
            #imp.reload(sys.modules[Commands.commands[command].__module__])
            Commands.commands[command](*args)
        except Exception as e:
            raise e
        try:
            runningCommands.remove(threading.current_thread() )    
        except:
            log.debug("Command thread already removed. Command:"+command)
            pass
    if command=="reload_script": # we need to do this here
        raise Global.ReloadException()
    t=Thread(target=ProcessCommand, args=(command, args), name="HandleCommand"+command.capitalize() )
    t.daemon=True
    global runningCommands
    runningCommands.append(t)
    t.start()