X-Git-Url: https://mudpy.org/gitweb?p=mudpy.git;a=blobdiff_plain;f=lib%2Fmudpy%2Fmisc.py;h=d78eac6633b0a2fe557626bcd8b70330bca071b1;hp=50d026924cf83302e0d39ff471a588730531a643;hb=015ea384dafbc17070d3c11e84004ca27b866eb9;hpb=a070bffc3f4f6f21232c2349805b0a208d7b4cbf diff --git a/lib/mudpy/misc.py b/lib/mudpy/misc.py index 50d0269..d78eac6 100644 --- a/lib/mudpy/misc.py +++ b/lib/mudpy/misc.py @@ -1,10 +1,26 @@ # -*- coding: utf-8 -*- """Miscellaneous functions for the mudpy engine.""" -# Copyright (c) 2004-2013 Jeremy Stanley . Permission +# Copyright (c) 2004-2014 Jeremy Stanley . Permission # to use, copy, modify, and distribute this software is granted under # terms provided in the LICENSE file distributed with this software. +import codecs +import ctypes +import ctypes.util +import os +import random +import re +import signal +import socket +import sys +import syslog +import time +import traceback +import unicodedata + +import mudpy + class Element: @@ -12,8 +28,6 @@ class Element: def __init__(self, key, universe, filename=None): """Set up a new element.""" - import mudpy.data - import os.path # keep track of our key name self.key = key @@ -71,7 +85,7 @@ class Element: def reload(self): """Create a new element and replace this one.""" - new_element = Element(self.key, self.universe, self.origin.filename) + Element(self.key, self.universe, self.origin.filename) del(self) def destroy(self): @@ -169,7 +183,6 @@ class Element: def getlist(self, facet, default=None): """Return values as list type.""" - import mudpy.data if default is None: default = [] value = self.get(facet) @@ -180,7 +193,6 @@ class Element: def getdict(self, facet, default=None): """Return values as dict type.""" - import mudpy.data if default is None: default = {} value = self.get(facet) @@ -192,9 +204,6 @@ class Element: def set(self, facet, value): """Set values.""" if not self.has_facet(facet) or not self.get(facet) == value: - # TODO: remove this check after the switch to py3k - if repr(type(value)) == "": - value = str(value) if not type(value) is str: value = repr(value) self.origin.data.set(self.key, facet, value) @@ -208,16 +217,6 @@ class Element: newlist.append(value) self.set(facet, newlist) - def new_event(self, action, when=None): - """Create, attach and enqueue an event element.""" - - # if when isn't specified, that means now - if not when: - when = self.universe.get_time() - - # events are elements themselves - event = Element("event:" + self.key + ":" + counter) - def send( self, message, @@ -370,7 +369,6 @@ class Element: def portals(self): """Map the portal directions for a room to neighbors.""" - import re portals = {} if re.match("""^location:-?\d+,-?\d+,-?\d+$""", self.key): coordinates = [(int(x)) @@ -420,14 +418,10 @@ class Universe: def __init__(self, filename="", load=False): """Initialize the universe.""" - import os - import os.path self.categories = {} self.contents = {} self.default_origins = {} self.loglines = [] - self.pending_events_long = {} - self.pending_events_short = {} self.private_files = [] self.reload_flag = False self.startdir = os.getcwd() @@ -456,7 +450,6 @@ class Universe: def load(self): """Load universe data from persistent storage.""" - import mudpy.data # the files dict must exist and filename needs to be read-only if not hasattr( @@ -469,7 +462,7 @@ class Universe: # clear out all read-only files if hasattr(self, "files"): - for data_filename in self.files.keys(): + for data_filename in list(self.files.keys()): if not self.files[data_filename].is_writeable(): del self.files[data_filename] @@ -518,7 +511,6 @@ class Universe: def initialize_server_socket(self): """Create and open the listening socket.""" - import socket # need to know the local address and port number for the listener host = self.categories["internal"]["network"].get("host") @@ -574,7 +566,6 @@ class User: def __init__(self): """Default values for the in-memory user variables.""" - import mudpy.telnet self.account = None self.address = "" self.authenticated = False @@ -754,7 +745,6 @@ class User: def adjust_echoing(self): """Adjust echoing to match state menu requirements.""" - import mudpy.telnet if mudpy.telnet.is_enabled(self, mudpy.telnet.TELOPT_ECHO, mudpy.telnet.US): if menu_echo_on(self.state): @@ -780,7 +770,6 @@ class User: prepend_padding=True ): """Send arbitrary text to a connected user.""" - import mudpy.telnet # unless raw mode is on, clean it up all nice and pretty if not raw: @@ -800,15 +789,15 @@ class User: # 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": @@ -917,8 +906,6 @@ class User: def enqueue_input(self): """Process and enqueue any new input.""" - import mudpy.telnet - import unicodedata # check for some input try: @@ -1059,10 +1046,6 @@ def broadcast(message, add_prompt=True): def log(message, level=0): """Log a message.""" - import codecs - import os.path - import syslog - import time # a couple references we need file_name = universe.categories["internal"]["logging"].get("file") @@ -1176,7 +1159,6 @@ def get_loglines(level, start, stop): def glyph_columns(character): """Convenience function to return the column width of a glyph.""" - import unicodedata if unicodedata.east_asian_width(character) in "FW": return 2 else: @@ -1185,7 +1167,6 @@ def glyph_columns(character): def wrap_ansi_text(text, width): """Wrap text with arbitrary width while ignoring ANSI colors.""" - import unicodedata # the current position in the entire text string, including all # characters, printable or otherwise @@ -1272,7 +1253,6 @@ def wrap_ansi_text(text, width): def weighted_choice(data): """Takes a dict weighted by value and returns a random key.""" - import random # this will hold our expanded list of keys from the data expanded = [] @@ -1288,7 +1268,6 @@ def weighted_choice(data): def random_name(): """Returns a random character name.""" - import random # the vowels and consonants needed to create romaji syllables vowels = [ @@ -1340,9 +1319,6 @@ def random_name(): def replace_macros(user, text, is_input=False): """Replaces macros in text output.""" - import codecs - import mudpy.data - import os.path # third person pronouns pronouns = { @@ -1354,15 +1330,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 @@ -1439,7 +1415,6 @@ def first_word(text, separator=" "): def on_pulse(): """The things which should happen on each pulse, aside from reloads.""" - import time # open the listening socket if it hasn't been already if not hasattr(universe, "listening_socket"): @@ -1514,7 +1489,6 @@ def reload_data(): def check_for_connection(listening_socket): """Check for a waiting connection and return a new user object.""" - import mudpy.telnet # try to accept a new connection try: @@ -1731,7 +1705,6 @@ def get_choice_action(user, choice): def handle_user_input(user): """The main handler, branches to a state-specific handler.""" - import mudpy.telnet # if the user's client echo is off, send a blank line for aesthetics if mudpy.telnet.is_enabled(user, mudpy.telnet.TELOPT_ECHO, @@ -1809,7 +1782,6 @@ def handler_entering_account_name(user): def handler_checking_password(user): """Handle the login account password.""" - import mudpy.password # get the next waiting line of input input_data = user.input_queue.pop(0) @@ -1843,7 +1815,6 @@ def handler_checking_password(user): def handler_entering_new_password(user): """Handle a new password entry.""" - import mudpy.password # get the next waiting line of input input_data = user.input_queue.pop(0) @@ -1884,7 +1855,6 @@ def handler_entering_new_password(user): def handler_verifying_new_password(user): """Handle the re-entered new password for verification.""" - import mudpy.password # get the next waiting line of input input_data = user.input_queue.pop(0) @@ -2100,7 +2070,6 @@ def command_look(actor, parameters): def command_say(actor, parameters): """Speak to others in the same room.""" - import unicodedata # check for replacement macros and escape them parameters = escape_macros(parameters) @@ -2191,7 +2160,6 @@ def command_chat(actor): def command_show(actor, parameters): """Show program data.""" - import re message = "" arguments = parameters.split() if not parameters: @@ -2415,7 +2383,6 @@ def command_delete(actor, parameters): def command_error(actor, input_data): """Generic error for an unrecognized command word.""" - import random # 90% of the time use a generic error if random.randrange(10): @@ -2431,12 +2398,6 @@ def command_error(actor, input_data): def daemonize(universe): """Fork and disassociate from everything.""" - import codecs - import ctypes - import ctypes.util - import os - import os.path - import sys # only if this is what we're configured to do if universe.contents["internal:process"].getboolean("daemon"): @@ -2516,9 +2477,6 @@ def daemonize(universe): def create_pidfile(universe): """Write a file containing the current process ID.""" - import codecs - import os - import os.path pid = str(os.getpid()) log("Process ID: " + pid) file_name = universe.contents["internal:process"].get("pidfile") @@ -2533,8 +2491,6 @@ def create_pidfile(universe): def remove_pidfile(universe): """Remove the file containing the current process ID.""" - import os - import os.path file_name = universe.contents["internal:process"].get("pidfile") if file_name: if not os.path.isabs(file_name): @@ -2545,7 +2501,6 @@ def remove_pidfile(universe): def excepthook(excepttype, value, tracebackdata): """Handle uncaught exceptions.""" - import traceback # assemble the list of errors into a single string message = "".join( @@ -2567,7 +2522,6 @@ def excepthook(excepttype, value, tracebackdata): def sighook(what, where): """Handle external signals.""" - import signal # a generic message message = "Caught signal: " @@ -2592,20 +2546,17 @@ def sighook(what, where): def override_excepthook(): """Redefine sys.excepthook with our own.""" - import sys sys.excepthook = excepthook def assign_sighook(): """Assign a customized handler for some signals.""" - import signal signal.signal(signal.SIGHUP, sighook) signal.signal(signal.SIGTERM, sighook) def setup(): """This contains functions to be performed when starting the engine.""" - import sys # see if a configuration file was specified if len(sys.argv) > 1: