X-Git-Url: https://mudpy.org/gitweb?a=blobdiff_plain;f=lib%2Fmuff%2Fmuffmisc.py;h=6c2aa7c10bd473c4fd94cfc07bd754c6bfb14989;hb=b051f2573564ad980d1a3b276eaea78a51571267;hp=e52ffa9dcb84200e6a723942a1375b4948a62e50;hpb=9445c0c8b80b880dd24b2d0e5ef73c71340b9a77;p=mudpy.git diff --git a/lib/muff/muffmisc.py b/lib/muff/muffmisc.py index e52ffa9..6c2aa7c 100644 --- a/lib/muff/muffmisc.py +++ b/lib/muff/muffmisc.py @@ -3,15 +3,35 @@ # Copyright (c) 2005 MUDpy, The Fungi , all rights reserved. # Licensed per terms in the LICENSE file distributed with this software. +# used by several functions for random calls +import random + +# used to match the 'L' at the end of a long int in repr_long +import re + +# random_name uses string.strip +import string + +# the log function uses time.asctime for creating timestamps +import time + # hack to load all modules in the muff package import muff for module in muff.__all__: exec("import " + module) -def broadcast(output): +def broadcast(message): """Send a message to all connected users.""" - for each_user in muffvars.userlist: - each_user.send(output) + for each_user in muffvars.userlist: each_user.send("$(eol)" + message) + +def log(message): + """Log a message.""" + + # the time in posix log timestamp format + timestamp = time.asctime()[4:19] + + # send the timestamp and message to standard output + print(timestamp + " " + message) def wrap_ansi_text(text, width): """Wrap text with arbitrary width while ignoring ANSI colors.""" @@ -82,3 +102,121 @@ def wrap_ansi_text(text, width): # return the newly-wrapped text return text +def weighted_choice(data): + """Takes a dict weighted by value and returns a random key.""" + + # this will hold our expanded list of keys from the data + expanded = [] + + # create thee expanded list of keys + for key in data.keys(): + for count in range(data[key]): + expanded.append(key) + + # return one at random + return random.choice(expanded) + +def random_name(): + """Returns a random character name.""" + + # the vowels and consonants needed to create romaji syllables + vowels = [ "a", "i", "u", "e", "o" ] + consonants = ["'", "k", "z", "s", "sh", "z", "j", "t", "ch", "ts", "d", "n", "h", "f", "m", "y", "r", "w" ] + + # this dict will hold our weighted list of syllables + syllables = {} + + # generate the list with an even weighting + for consonant in consonants: + for vowel in vowels: + syllables[consonant + vowel] = 1 + + # we'll build the name into this string + name = "" + + # create a name of random length from the syllables + for syllable in range(random.randrange(2, 6)): + name += weighted_choice(syllables) + + # strip any leading quotemark, capitalize and return the name + return string.strip(name, "'").capitalize() + +def repr_long(value): + string_value = repr(value) + if re.match('\d*L$', string_value): return string_value.strip("L") + else: return string_value + +def getlong(config, section, option): + return int(config.get(section, option).strip("L")) + +def setlong(config, section, option, value): + return config.set(section, option, repr_long(value)) + +def replace_macros(user, text, is_input=False): + while True: + macro_start = string.find(text, "$(") + if macro_start == -1: break + macro_end = string.find(text, ")", macro_start) + 1 + macro = text[macro_start:macro_end] + if macro in muffvars.macros.keys(): + text = string.replace(text, macro, muffvars.macros[macro]) + + # the user's account name + elif macro == "$(account)": + text = string.replace(text, macro, user.name) + + # if we get here, log and replace it with null + else: + text = string.replace(text, macro, "") + if not is_input: + log("Unexpected replacement macro " + macro + " encountered.") + + # replace the look-like-a-macro sequence + text = string.replace(text, "$_(", "$(") + + return text + +def check_time(frequency): + """Check for a factor of the current increment count.""" + if type(frequency) is str: + frequency = muffconf.getint("time", frequency) + return not getlong(muffvars.variable_data, "time", "elapsed") % frequency + +def on_pulse(): + """The things which should happen on each pulse, aside from reloads.""" + + # open the listening socket if it hasn't been already + if not muffvars.newsocket: muffsock.initialize_server_socket() + + # assign a user if a new connection is waiting + user = muffsock.check_for_connection(muffvars.newsocket) + if user: muffvars.userlist.append(user) + + # iterate over the connected users + for user in muffvars.userlist: user.pulse() + + # update the log every now and then + if check_time("frequency_log"): + log(repr(len(muffvars.userlist)) + " connection(s)") + + # periodically save everything + if check_time("frequency_save"): + muffvars.save() + for user in muffvars.userlist: user.save() + + # pause for a configurable amount of time (decimal seconds) + time.sleep(muffconf.getfloat("time", "increment")) + + # increment the elapsed increment counter + setlong(muffvars.variable_data, "time", "elapsed", + getlong(muffvars.variable_data, "time", "elapsed") + 1) + +def reload_data(): + """Reload data into new persistent objects.""" + + # reload the users + temporary_userlist = [] + for user in muffvars.userlist: temporary_userlist.append(user) + for user in temporary_userlist: user.reload() + del(temporary_userlist) +