def func(self): """ Get all connected players by polling session. """ player = self.player session_list = SESSIONS.get_sessions() session_list = sorted(session_list, key=lambda o: o.player.key) if self.cmdstring == "doing": show_session_data = False else: show_session_data = player.check_permstring( "Immortals") or player.check_permstring("Wizards") nplayers = (SESSIONS.player_count()) if show_session_data: # privileged info table = prettytable.PrettyTable([ "{wPlayer Name", "{wOn for", "{wIdle", "{wPuppeting", "{wRoom", "{wCmds", "{wProtocol", "{wHost" ]) for session in session_list: if not session.logged_in: continue delta_cmd = time.time() - session.cmd_last_visible delta_conn = time.time() - session.conn_time player = session.get_player() puppet = session.get_puppet() location = puppet.location.key if puppet else "None" table.add_row([ utils.crop(player.name, width=25), utils.time_format(delta_conn, 0), utils.time_format(delta_cmd, 1), utils.crop(puppet.key if puppet else "None", width=25), utils.crop(location, width=25), session.cmd_total, session.protocol_key, isinstance(session.address, tuple) and session.address[0] or session.address ]) else: # unprivileged table = prettytable.PrettyTable( ["{wPlayer name", "{wOn for", "{wIdle"]) for session in session_list: if not session.logged_in: continue delta_cmd = time.time() - session.cmd_last_visible delta_conn = time.time() - session.conn_time player = session.get_player() table.add_row([ utils.crop(player.key, width=25), utils.time_format(delta_conn, 0), utils.time_format(delta_cmd, 1) ]) isone = nplayers == 1 string = "{wPlayers:{n\n%s\n%s unique account%s logged in." % ( table, "One" if isone else nplayers, "" if isone else "s") self.msg(string)
def func(self): "Create the nickname" caller = self.caller switches = self.switches nicks = caller.nicks.get(return_obj=True) if 'list' in switches: table = prettytable.PrettyTable( ["{wNickType", "{wNickname", "{wTranslates-to"]) for nick in utils.make_iter(nicks): table.add_row( [nick.db_category, nick.db_key, nick.db_strvalue]) string = "{wDefined Nicks:{n\n%s" % table caller.msg(string) return if 'clearall' in switches: caller.nicks.clear() caller.msg("Cleared all aliases.") return if not self.args or not self.lhs: caller.msg("Usage: nick[/switches] nickname = [realname]") return nick = self.lhs real = self.rhs if real == nick: caller.msg( "No point in setting nick same as the string to replace...") return # check so we have a suitable nick type if not any(True for switch in switches if switch in ("object", "player", "inputline")): switches = ["inputline"] string = "" for switch in switches: oldnick = caller.nicks.get(key=nick, category=switch) #oldnick = Nick.objects.filter(db_obj=caller.dbobj, db_nick__iexact=nick, db_type__iexact=switch) if not real: # removal of nick if oldnick: # clear the alias string += "\nNick '%s' (= '%s') was cleared." % (nick, oldnick) caller.nicks.delete(nick, category=switch) else: string += "\nNo nick '%s' found, so it could not be removed." % nick else: # creating new nick if oldnick: string += "\nNick %s changed from '%s' to '%s'." % ( nick, oldnick, real) else: string += "\nNick set: '%s' = '%s'." % (nick, real) caller.nicks.add(nick, real, category=switch) caller.msg(string)
def func(self): "Show server time data in a table." table = prettytable.PrettyTable(["{wserver time statistic","{wtime"]) table.align = 'l' table.add_row(["Current server uptime", utils.time_format(gametime.uptime(), 3)]) table.add_row(["Total server running time", utils.time_format(gametime.runtime(), 2)]) table.add_row(["Total in-game time (realtime x %g" % (gametime.TIMEFACTOR), utils.time_format(gametime.gametime(), 2)]) table.add_row(["Server time stamp", datetime.datetime.now()]) self.caller.msg(str(table))
def func(self): "check inventory" items = self.caller.contents if not items: string = "You are not carrying anything." else: table = prettytable.PrettyTable(["name", "desc"]) table.header = False table.border = False for item in items: table.add_row(["{C%s{n" % item.name, item.db.desc and item.db.desc or ""]) string = "{wYou are carrying:\n%s" % table self.caller.msg(string)
def list_bans(banlist): """ Helper function to display a list of active bans. Input argument is the banlist read into the two commands @ban and @unban below. """ if not banlist: return "No active bans were found." table = prettytable.PrettyTable(["{wid", "{wname/ip", "{wdate", "{wreason"]) for inum, ban in enumerate(banlist): table.add_row([str(inum + 1), ban[0] and ban[0] or ban[1], ban[3], ban[4]]) string = "{wActive bans:{n\n%s" % table return string
def func(self): "Implement function" player = self.player sessions = player.get_all_sessions() table = prettytable.PrettyTable([ "{wsessid", "{wprotocol", "{whost", "{wpuppet/character", "{wlocation" ]) for sess in sorted(sessions, key=lambda x: x.sessid): sessid = sess.sessid char = player.get_puppet(sessid) table.add_row([ str(sessid), str(sess.protocol_key), type(sess.address) == tuple and sess.address[0] or sess.address, char and str(char) or "None", char and str(char.location) or "N/A" ]) string = "{wYour current session(s):{n\n%s" % table self.msg(string)
def func(self): "Show list." caller = self.caller # display active processes if not utils.host_os_is('posix'): string = "Process listings are only available under Linux/Unix." caller.msg(string) return global _resource, _idmapper if not _resource: import resource as _resource if not _idmapper: from src.utils.idmapper import base as _idmapper import resource loadavg = os.getloadavg() psize = _resource.getpagesize() pid = os.getpid() rmem = float( os.popen('ps -p %d -o %s | tail -1' % (pid, "rss")).read()) / 1000.0 # resident memory vmem = float( os.popen('ps -p %d -o %s | tail -1' % (pid, "vsz")).read()) / 1000.0 # virtual memory pmem = float( os.popen( 'ps -p %d -o %s | tail -1' % (pid, "%mem")).read()) # percent of resident memory to total rusage = resource.getrusage(resource.RUSAGE_SELF) if "mem" in self.switches: caller.msg( "Memory usage: RMEM: {w%g{n MB (%g%%), VMEM (res+swap+cache): {w%g{n MB." % (rmem, pmem, vmem)) return if "flushmem" in self.switches: caller.msg( "Flushed object idmapper cache. Python garbage collector recovered memory from %i objects." % _idmapper.flush_cache()) return # load table loadtable = prettytable.PrettyTable(["property", "statistic"]) loadtable.align = 'l' loadtable.add_row(["Server load (1 min)", "%g" % loadavg[0]]) loadtable.add_row(["Process ID", "%g" % pid]), loadtable.add_row(["Bytes per page", "%g " % psize]) loadtable.add_row([ "CPU time used (total)", "%s (%gs)" % (utils.time_format(rusage.ru_utime), rusage.ru_utime) ]) loadtable.add_row([ "CPU time used (user)", "%s (%gs)" % (utils.time_format(rusage.ru_stime), rusage.ru_stime) ]) loadtable.add_row(["Memory usage", "%g MB (%g%%)" % (rmem, pmem)]) loadtable.add_row([ "Virtual address space\n {x(resident+swap+caching){n", "%g MB" % vmem ]) loadtable.add_row([ "Page faults", "%g hard, %g soft, %g swapouts" % (rusage.ru_majflt, rusage.ru_minflt, rusage.ru_nswap) ]) loadtable.add_row([ "Disk I/O", "%g reads, %g writes" % (rusage.ru_inblock, rusage.ru_oublock) ]) loadtable.add_row([ "Network I/O", "%g in, %g out" % (rusage.ru_msgrcv, rusage.ru_msgsnd) ]) loadtable.add_row([ "Context switching", "%g vol, %g forced, %g signals" % (rusage.ru_nvcsw, rusage.ru_nivcsw, rusage.ru_nsignals) ]) string = "{wServer CPU and Memory load:{n\n%s" % loadtable if not is_pypy: # Cache size measurements are not available on PyPy # because it lacks sys.getsizeof # object cache size total_num, cachedict = _idmapper.cache_size() sorted_cache = sorted( [(key, num) for key, num in cachedict.items() if num > 0], key=lambda tup: tup[1], reverse=True) memtable = prettytable.PrettyTable( ["entity name", "number", "idmapper %%"]) memtable.align = 'l' for tup in sorted_cache: memtable.add_row([ tup[0], "%i" % tup[1], "%.2f" % (float(tup[1]) / total_num * 100) ]) # get sizes of other caches string += "\n{w Entity idmapper cache:{n %i items\n%s" % ( total_num, memtable) caller.msg(string)
def func(self): "Implement command" caller = self.caller switches = self.switches if switches and switches[0] not in ("list", "start", "stop", "delete"): caller.msg( "Usage: @service/<list|start|stop|delete> [servicename]") return # get all services sessions = caller.sessions if not sessions: return service_collection = SESSIONS.server.services if not switches or switches[0] == "list": # Just display the list of installed services and their # status, then exit. table = prettytable.PrettyTable( ["{wService{n (use @services/start|stop|delete)", "{wstatus"]) table.align = 'l' for service in service_collection.services: table.add_row([ service.name, service.running and "{gRunning" or "{rNot Running" ]) caller.msg(str(table)) return # Get the service to start / stop try: service = service_collection.getServiceNamed(self.args) except Exception: string = 'Invalid service name. This command is case-sensitive. ' string += 'See @service/list for valid service name (enter the full name exactly).' caller.msg(string) return if switches[0] in ("stop", "delete"): # Stopping/killing a service gracefully closes it and disconnects # any connections (if applicable). delmode = switches[0] == "delete" if not service.running: caller.msg('That service is not currently running.') return if service.name[:7] == 'Evennia': if delmode: caller.msg( "You cannot remove a core Evennia service (named 'Evennia***')." ) return string = "You seem to be shutting down a core Evennia service (named 'Evennia***'). Note that" string += "stopping some TCP port services will *not* disconnect users *already*" string += "connected on those ports, but *may* instead cause spurious errors for them. To " string += "safely and permanently remove ports, change settings file and restart the server." caller.msg(string) if delmode: service.stopService() service_collection.removeService(service) caller.msg("Stopped and removed service '%s'." % self.args) else: service.stopService() caller.msg("Stopped service '%s'." % self.args) return if switches[0] == "start": #Starts a service. if service.running: caller.msg('That service is already running.') return caller.msg("Starting service '%s'." % self.args) service.startService()
def func(self): "Show list." caller = self.caller # display active processes if not utils.host_os_is('posix'): string = "Process listings are only available under Linux/Unix." caller.msg(string) return global _resource, _idmapper if not _resource: import resource as _resource if not _idmapper: from src.utils.idmapper import base as _idmapper import resource loadavg = os.getloadavg() psize = _resource.getpagesize() pid = os.getpid() rmem = float(os.popen('ps -p %d -o %s | tail -1' % (pid, "rss")).read()) / 1024.0 # resident memory vmem = float(os.popen('ps -p %d -o %s | tail -1' % (pid, "vsz")).read()) / 1024.0 # virtual memory pmem = float(os.popen('ps -p %d -o %s | tail -1' % (pid, "%mem")).read()) # percent of resident memory to total rusage = resource.getrusage(resource.RUSAGE_SELF) # load table loadtable = prettytable.PrettyTable(["property", "statistic"]) loadtable.align = 'l' loadtable.add_row(["Server load (1 min)", "%g" % loadavg[0]]) loadtable.add_row(["Process ID", "%g" % pid]), loadtable.add_row(["Bytes per page", "%g " % psize]) loadtable.add_row(["CPU time used (total)", "%s (%gs)" % (utils.time_format(rusage.ru_utime), rusage.ru_utime)]) loadtable.add_row(["CPU time used (user)", "%s (%gs)" % (utils.time_format(rusage.ru_stime), rusage.ru_stime)]) loadtable.add_row(["Memory usage","%g MB (%g%%)" % (rmem, pmem)]) loadtable.add_row(["Virtual address space\n {x(resident+swap+caching){n", "%g MB" % vmem]) loadtable.add_row(["Page faults", "%g hard, %g soft, %g swapouts" % (rusage.ru_majflt, rusage.ru_minflt, rusage.ru_nswap)]) loadtable.add_row(["Disk I/O", "%g reads, %g writes" % (rusage.ru_inblock, rusage.ru_oublock)]) loadtable.add_row(["Network I/O", "%g in, %g out" % (rusage.ru_msgrcv, rusage.ru_msgsnd)]) loadtable.add_row(["Context switching", "%g vol, %g forced, %g signals" % (rusage.ru_nvcsw, rusage.ru_nivcsw, rusage.ru_nsignals)]) string = "{wServer CPU and Memory load:{n\n%s" % loadtable if not is_pypy: # Cache size measurements are not available on PyPy # because it lacks sys.getsizeof # object cache size cachedict = _idmapper.cache_size() totcache = cachedict["_total"] sorted_cache = sorted([(key, tup[0], tup[1]) for key, tup in cachedict.items() if key !="_total" and tup[0] > 0], key=lambda tup: tup[2], reverse=True) memtable = prettytable.PrettyTable(["entity name", "number", "cache (MB)", "idmapper %%"]) memtable.align = 'l' for tup in sorted_cache: memtable.add_row([tup[0], "%i" % tup[1], "%5.2f" % tup[2], "%.2f" % (float(tup[2] / totcache[1]) * 100)]) # get sizes of other caches attr_cache_info, prop_cache_info = get_cache_sizes() string += "\n{w Entity idmapper cache usage:{n %5.2f MB (%i items)\n%s" % (totcache[1], totcache[0], memtable) string += "\n{w On-entity Attribute cache usage:{n %5.2f MB (%i attrs)" % (attr_cache_info[1], attr_cache_info[0]) string += "\n{w On-entity Property cache usage:{n %5.2f MB (%i props)" % (prop_cache_info[1], prop_cache_info[0]) base_mem = vmem - totcache[1] - attr_cache_info[1] - prop_cache_info[1] string += "\n{w Base Server usage (virtmem-idmapper-attrcache-propcache):{n %5.2f MB" % base_mem caller.msg(string)