Beispiel #1
0
def getDescription(command, acl):
    if command not in commands:
        command=getRealCommand(command)
    acl=int(acl)
    paramstr=""
    desc=commandvalues[command][4]
    brief=desc[0]
    params=desc[1]
    ident_param=2
    ident_param_desc=10
    for param in params:
        acl_needed=float("inf")
        if AccessLevel.accessLevelSet(command.lower()+"_param_"+param[0].lower()):
            acl_needed=AccessLevel.getAccessLevel(command.lower()+"_param_"+param[0].lower())
        if not acl_needed>=acl:
            continue
        paramstr=paramstr+"\n"+" "*ident_param
        paramstr=paramstr+"0x0088ff"+param[0]+":"
        paramdesc=textwrap.wrap(param[1], width=80-ident_param_desc)
        paramstr=paramstr+(ident_param_desc-ident_param-len(param[0]))*" "+" 0xffffff"
        paramstr=paramstr+paramdesc[0]
        paramdesc=paramdesc[1:]
        for desc in paramdesc:
            paramstr=paramstr+"\n"+" "+" "*ident_param_desc+" 0xffffff"+desc+"\n"
    if len(paramstr)==0: paramstr="None"
    return brief, paramstr
Beispiel #2
0
def exit(normal=True, quiet=False):
    AccessLevel.save()
    if not quiet:
        log.info("Exit")
        if normal:
            Armagetronad.PrintMessage("0xff0000Script exited.")
        else:
            Armagetronad.PrintMessage("0xff0000Script crashed.")
Beispiel #3
0
def acl(acl, player, command, access=None):
    if access is None:
        Armagetronad.PrintPlayerMessage(player, "0x00ff00The minimal access level needed for "+command+" is "+str(AccessLevel.getAccessLevel(command)))
        return
    try:
        access=int(access)
    except:
        return
    AccessLevel.setAccessLevel(command, access)
    Armagetronad.PrintPlayerMessage(player, Messages.AccessLevelChanged.format(command=command, access=access) )
Beispiel #4
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 #5
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 #6
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 #7
0
def main(debug=False, disabledCommands=[], reloaded=False):
    if not reloaded:
        h=logging.StreamHandler()
        h.setLevel(logging.DEBUG)
        f=logging.Formatter("[%(name)s] (%(asctime)s) %(levelname)s: %(message)s")
        h.setFormatter(f)
        log.addHandler(h)
        log.setLevel(logging.INFO)
    #We need some special settings. Set it
    Global.set_script_settings()
    for x in dir(LadderLogHandlers):
        if not x[0].isupper():
            continue
        if inspect.isfunction(getattr(LadderLogHandlers,x)):
            x="".join([i.upper() if i.islower() else "_"+i for i in x])
            Armagetronad.SendCommand("LADDERLOG_WRITE"+x+" 1") # X has already a underscore at beginning.
    if not reloaded:
        if Global.debug:
            log.info("Starting in debug mode.")
            Player.enableLogging(logging.DEBUG)
            Team.enableLogging(logging.DEBUG)
            LadderLogHandlers.enableLogging(logging.DEBUG)
            Poll.enableLogging(logging.DEBUG)
        else:
            Player.enableLogging(logging.WARNING)
            Team.enableLogging(logging.WARNING)
            LadderLogHandlers.enableLogging(logging.INFO)
            Poll.enableLogging(logging.WARNING)

    Commands.disabled=Commands.disabled+disabledCommands    
    #Init
    AccessLevel.load()
    if not reloaded:
        log.info("Script started")    
        Armagetronad.PrintMessage("0xff0000Script started")
    else:
        log.info("Script reloaded")
    #We need to refresh player list
    Global.reloadPlayerList()
    while(True):
        line=""
        if Global.handleLadderLog==False:
            time.sleep(1)
            continue
        try:
            line=input()
        except KeyboardInterrupt:
            log.info("Exiting")
            break
        line=line.strip()
        keywords=line.split(" ")
        command=keywords[0]
        args=keywords[1:]
        del keywords
        #make command name CamelCase
        real_commandname=command.upper()
        command=command.lower()
        command=command.replace("_"," ")
        command=command.title()
        command=command.replace(" ","")
        #call handler
        if(hasattr(LadderLogHandlers,command) ):
                getattr(LadderLogHandlers,command)(*args)
        if real_commandname in LadderLogHandlers.extraHandlers:
            for extraHandler in LadderLogHandlers.extraHandlers[real_commandname]:
                try: extraHandler(*args)
                except TypeError as e: 
                    log.error("Extension "+extraHandler.__package__+" registered a wrong ladderlog handler. This is a bug.")
                    if debug: raise e
Beispiel #8
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()