################################################################################
#
# utils.py
#
# Various utility functions used by other Python modules.
#
################################################################################
def parse_keywords(kw):
'''turns a comma-separated list of strings to a list of keywords'''
list = kw.lower().split(",")
for i in range(len(list)):
list[i] = list[i].strip()
return list
def is_one_keyword(kw, word, abbrev_ok = False):
'''returns whether or not the single word is a keyword in the list'''
for one_kw in kw:
if word == one_kw:
return True
elif abbrev_ok and len(one_kw)>len(word) and one_kw[0:len(word)]==word:
return True
return False
def is_keyword(kw, word, abbrev_ok = False):
'''returns whether or not the word (or list of words) is a keyword'''
kw = parse_keywords(kw)
word = parse_keywords(word)
for one_word in word:
if is_one_keyword(kw, one_word, abbrev_ok):
return True
return False
def has_proto(ch, proto):
'''returns whether or not the character has on his or her person an object
that inherits from the given prototype'''
for obj in ch.inv + ch.eq:
if obj.isinstance(proto):
return True
return False
def find_all_objs(looker, list, name, proto = None, must_see = True):
'''returns a list of all the objects that match the supplied constraints'''
found = []
for obj in list:
if must_see and not looker.cansee(obj):
continue
elif name != None and is_keyword(obj.keywords, name, True):
found.append(obj)
elif proto != None and obj.isinstance(proto):
found.append(obj)
return found
def find_obj(looker, list, num, name, proto = None, must_see = True):
'''returns the numth object to match the supplied constraints'''
count = 0
for obj in list:
if must_see and not looker.cansee(obj):
continue
elif name != None and is_keyword(obj.keywords, name, True):
count = count + 1
elif proto != None and obj.isinstance(proto):
count = count + 1
if count == num:
return obj
return None
def get_count(str):
'''separates a name and a count, and returns the two'''
parts = str.lower().split(".", 1)
# did we get two, or one?
if len(parts) == 1 and parts[0] == "all":
return "all", ""
elif len(parts) == 1:
return 1, str
if parts[0] == "all":
return "all", parts[1]
try:
return int(parts[0]), parts[1]
except:
return 1, str
def show_list(ch, list, s_func, m_func = None):
'''shows a list of things to the character. s_func is the description if
there is only a single item of the type. m_func is the description if
there are multiple occurences of the thing in the list'''
# maps descriptions to counts
counts = { }
# build up our counts
for thing in list:
if counts.has_key(s_func(thing)):
counts[s_func(thing)] = counts[s_func(thing)] + 1
else:
counts[s_func(thing)] = 1
# print out our counts
for thing in list:
# only display > 0 counts. Otherwise it has been displayed
if counts.has_key(s_func(thing)):
count = counts.pop(s_func(thing))
# display our item(s)
if count == 1:
ch.send(s_func(thing))
elif m_func == None or m_func(thing) == "":
ch.send("(" + str(count) + ") " + s_func(thing))
else:
ch.send(m_func(thing) % count)
else: pass