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
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.")
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) )
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
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
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))
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
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()