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