# -*- 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.
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 = {}
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."""