# -*- 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 = {}
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 = 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."""
name = input_data.lower()
# fail if there are non-alphanumeric characters
- if name != filter(
- lambda x: x >= "0" and x <= "9" or x >= "a" and x <= "z", name
- ):
+ if name != "".join(filter(
+ lambda x: x >= "0" and x <= "9" or x >= "a" and x <= "z",
+ name)):
user.error = "bad_name"
# if that account exists, time to request a password
# make sure the password is strong--at least one upper, one lower and
# one digit, seven or more characters in length
if len(input_data) > 6 and len(
- filter(lambda x: x >= "0" and x <= "9", input_data)
+ list(filter(lambda x: x >= "0" and x <= "9", input_data))
) and len(
- filter(lambda x: x >= "A" and x <= "Z", input_data)
+ list(filter(lambda x: x >= "A" and x <= "Z", input_data))
) and len(
- filter(lambda x: x >= "a" and x <= "z", input_data)
+ list(filter(lambda x: x >= "a" and x <= "z", input_data))
):
# hash and store it, then move on to verification