# -*- coding: utf-8 -*-
"""Miscellaneous functions for the mudpy engine."""
-# Copyright (c) 2004-2012 Jeremy Stanley <fungi@yuggoth.org>. Permission
+# Copyright (c) 2004-2013 Jeremy Stanley <fungi@yuggoth.org>. Permission
# to use, copy, modify, and distribute this software is granted under
# terms provided in the LICENSE file distributed with this software.
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):
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)) == "<type 'unicode'>":
+ # TODO: remove this check after the switch to py3k
+ if repr(type(value)) == "<type 'unicode'>":
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)
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 = {}
# and the ansi escape to return to normal text
if not just_prompt and prepend_padding:
if not self.output_queue \
- or not self.output_queue[-1].endswith("\r\n"):
+ or not self.output_queue[-1].endswith(b"\r\n"):
output = "$(eol)" + output
elif not self.output_queue[-1].endswith(
- "\r\n\x1b[0m\r\n"
+ b"\r\n\x1b[0m\r\n"
) and not self.output_queue[-1].endswith(
- "\r\n\r\n"
+ b"\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":
try:
raw_input = self.connection.recv(1024)
except:
- raw_input = ""
+ raw_input = b""
# we got something
if raw_input:
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:
# 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"):
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."""
# 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
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:
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