X-Git-Url: https://mudpy.org/gitweb?a=blobdiff_plain;f=lib%2Fmudpy%2Fmisc.py;h=2fe8e6fc851469423482ccc64a9cbeb72187f6d6;hb=248b078be3a9249a20db8de3860726e8a4ac57ac;hp=d67ff37341567dcf90a7c269c636cd3ea92ffa33;hpb=9c1165558bfa081bbb84650e321c603117493b45;p=mudpy.git diff --git a/lib/mudpy/misc.py b/lib/mudpy/misc.py index d67ff37..2fe8e6f 100644 --- a/lib/mudpy/misc.py +++ b/lib/mudpy/misc.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Miscellaneous functions for the mudpy engine.""" -# Copyright (c) 2004-2012 Jeremy Stanley . Permission +# Copyright (c) 2004-2013 Jeremy Stanley . Permission # to use, copy, modify, and distribute this software is granted under # terms provided in the LICENSE file distributed with this software. @@ -142,7 +142,7 @@ class Element: return default def getint(self, facet, default=None): - """Return values as int/long type.""" + """Return values as int type.""" if default is None: default = 0 if self.origin.data.has_option(self.key, facet): @@ -192,18 +192,17 @@ class Element: def set(self, facet, value): """Set values.""" if not self.has_facet(facet) or not self.get(facet) == value: - if type(value) is long or repr(type(value)) == "": + # TODO: remove this check after the switch to py3k + if repr(type(value)) == "": value = str(value) - elif not type(value) is str: + if not type(value) is str: value = repr(value) self.origin.data.set(self.key, facet, value) self.origin.modified = True def append(self, facet, value): - """Append value tp a list.""" - if type(value) is long: - value = str(value) - elif not type(value) is str: + """Append value to a list.""" + if not type(value) is str: value = repr(value) newlist = self.getlist(facet) newlist.append(value) @@ -590,7 +589,7 @@ class User: self.menu_seen = False self.negotiation_pause = 0 self.output_queue = [] - self.partial_input = "" + self.partial_input = b"" self.password_tries = 0 self.state = "initial" self.telopts = {} @@ -809,7 +808,7 @@ class User: "\r\n\r\n" ): output = "$(eol)" + output - output += eol + unichr(27) + "[0m" + output += eol + chr(27) + "[0m" # tack on a prompt if active if self.state == "active": @@ -925,7 +924,7 @@ class User: try: raw_input = self.connection.recv(1024) except: - raw_input = "" + raw_input = b"" # we got something if raw_input: @@ -937,18 +936,18 @@ class User: mudpy.telnet.negotiate_telnet_options(self) # separate multiple input lines - new_input_lines = self.partial_input.split("\n") + new_input_lines = self.partial_input.split(b"\n") # if input doesn't end in a newline, replace the # held partial input with the last line of it - if not self.partial_input.endswith("\n"): + if not self.partial_input.endswith(b"\n"): self.partial_input = new_input_lines.pop() # otherwise, chop off the extra null input and reset # the held partial input else: new_input_lines.pop() - self.partial_input = "" + self.partial_input = b"" # iterate over the remaining lines for line in new_input_lines: @@ -959,8 +958,8 @@ class User: # log non-printable characters remaining if mudpy.telnet.is_enabled(self, mudpy.telnet.TELOPT_BINARY, mudpy.telnet.HIM): - asciiline = "".join( - filter(lambda x: " " <= x <= "~", line)) + asciiline = b"".join( + filter(lambda x: b" " <= x <= b"~", line)) if line != asciiline: logline = "Non-ASCII characters from " if self.account and self.account.get("name"): @@ -971,10 +970,22 @@ class User: log(logline, 4) line = asciiline + try: + line = line.decode("utf-8") + except UnicodeDecodeError: + logline = "Non-UTF-8 characters from " + if self.account and self.account.get("name"): + logline += self.account.get("name") + ": " + else: + logline += "unknown user: " + logline += repr(line) + log(logline, 4) + return + + line = unicodedata.normalize("NFKC", line) + # put on the end of the queue - self.input_queue.append( - unicodedata.normalize("NFKC", line.decode("utf-8")) - ) + self.input_queue.append(line) def new_avatar(self): """Instantiate a new, unconfigured avatar for this user.""" @@ -1343,15 +1354,15 @@ def replace_macros(user, text, is_input=False): # a dict of replacement macros macros = { "eol": "\r\n", - "bld": unichr(27) + "[1m", - "nrm": unichr(27) + "[0m", - "blk": unichr(27) + "[30m", - "blu": unichr(27) + "[34m", - "cyn": unichr(27) + "[36m", - "grn": unichr(27) + "[32m", - "mgt": unichr(27) + "[35m", - "red": unichr(27) + "[31m", - "yel": unichr(27) + "[33m", + "bld": chr(27) + "[1m", + "nrm": chr(27) + "[0m", + "blk": chr(27) + "[30m", + "blu": chr(27) + "[34m", + "cyn": chr(27) + "[36m", + "grn": chr(27) + "[32m", + "mgt": chr(27) + "[35m", + "red": chr(27) + "[31m", + "yel": chr(27) + "[33m", } # add dynamic macros where possible @@ -2431,9 +2442,8 @@ def daemonize(universe): if universe.contents["internal:process"].getboolean("daemon"): # if possible, we want to rename the process to the same as the script - # (these will need to be byte type during 2to3 migration) - new_argv = "\0".join(sys.argv) + "\0" - new_short_argv0 = os.path.basename(sys.argv[0]) + "\0" + new_argv = b"\x00".join(x.encode("utf-8") for x in sys.argv) + b"\x00" + short_argv0 = os.path.basename(sys.argv[0]).encode("utf-8") + b"\x00" # attempt the linux way first try: @@ -2452,7 +2462,7 @@ def daemonize(universe): ctypes.memmove(argc.contents, new_argv, len(new_argv)) ctypes.CDLL(ctypes.util.find_library("c")).prctl( 15, - new_short_argv0, + short_argv0, 0, 0, 0