## Python equivalent of the var.lua file
import pickle
## basic version
#def mcpickle(o):
# return str(o)
#
#def mcunpickle(s):
# return s
PICKLE_SIGNATURE = "~~~"
def mcpickle(o):
if isinstance(o, (bool, int, long, float, complex, str, unicode)):
return str(o)
# we have a non-simple type, time for pickling!
return PICKLE_SIGNATURE + pickle.dumps(o)
def mcunpickle(s):
if s.startswith(PICKLE_SIGNATURE):
# unpickle
return pickle.loads(s[len(PICKLE_SIGNATURE):])
if s.lower() == 'true':
return True
if s.lower() == 'false':
return False
try:
return int(s) # also catches long
except ValueError:
pass
try:
return float(s)
except ValueError:
pass
try:
if s.startswith('(') and s.endswith(')'): # might be complex!
return complex(s[1:-1])
return complex(s)
except ValueError:
pass
# probably an actual string
return s
class varIterator(object):
def __init__(self, klass, rettype='name'):
self.klass = klass
self.variable_list = klass.keys()
self.rettype = rettype
def __iter__(self):
return self
def next(self):
value = None
while value == None and len(self.variable_list):
name = self.variable_list.pop(0)
value = klass[name]
if value == None and len(self.variable_list) == 0:
raise StopIteration
if self.rettype == 'value':
return value
if self.rettype == 'pairs':
return (name, value)
return name
class var(object):
def __getvar(self, name):
return world.GetVariable(name)
def __setvar(self, name, value):
return world.SetVariable(name, value)
def __delvar(self, name):
return world.DeleteVariable(name)
def __getvarlist(self):
return world.GetVariableList
def __getitem__(self, name):
r = self.__getvar(name)
if None == r:
raise KeyError(name)
return mcunpickle(r)
def __setitem__(self, name, value):
if value == None:
r = self.__delvar(name)
else:
r = self.__setvar(name, mcpickle(value))
if r == eVariableNotFound:
raise KeyError(name)
if r == eInvalidObjectLabel:
raise TypeError("'%s' is not a valid MUSHclient variable name" % name)
def __delitem__(self, name):
r = self.__delvar(name)
if r == eVariableNotFound:
raise KeyError(name)
if r == eInvalidObjectLabel:
raise TypeError("'%s' is not a valid MUSHclient variable name" % name)
def keys(self):
return sorted(list(self.__getvarlist()))
def values(self):
return [e for e in self.itervalues()]
def items(self):
return [e for e in self.iteritems()]
def __len__(self):
return len(self.keys())
def __iter__(self):
return self.iterkeys()
def iterkeys(self):
return varIterator(self)
def itervalues(self):
return varIterator(self, 'value')
def iteritems(self):
return varIterator(self, 'pairs')
def __contains__(self, name):
try:
self[name]
return True
except KeyError:
return False
def __getattr__(self, name):
try:
return self.__getitem__(name)
except KeyError:
raise AttributeError("MUSHclient has no variable '%s'" % name)
except TypeError:
raise SyntaxError("'%s' is not a valid MUSHclient variable name" % name)
def __setattr__(self, name, value):
try:
return self.__setitem__(name, value)
except KeyError:
raise AttributeError("MUSHclient has no variable '%s'" % name)
except TypeError:
raise SyntaxError("'%s' is not a valid MUSHclient variable name" % name)
def __delattr__(self, name):
try:
self.__delitem__(name)
except KeyError:
raise AttributeError("MUSHclient has no variable '%s'" % name)
except TypeError:
raise SyntaxError("'%s' is not a valid MUSHclient variable name" % name)
def __str__(self):
return repr(self)
def __repr__(self):
return repr(tuple(self.keys()))
class PluginVar(var):
def __new__(klass, plugin, *p, **k):
if not '_the_instance_dict' in klass.__dict__:
klass._the_instance_dict = {}
if not plugin in klass._the_instance_dict:
klass._the_instance_dict[plugin] = object.__new__(klass, *p, **k)
return klass._the_instance_dict[plugin]
def __init__(self, plugin):
self.plugin = plugin
if not world.IsPluginInstalled(self.plugin):
raise ValueError("Plugin '%s' is not installed" % self.plugin)
self.checkEnabled()
def isPluginEnabled(self):
return bool(world.GetPluginInfo(self.plugin, 17))
def checkEnabled(self):
if not self.isPluginEnabled():
raise ValueError("Plugin '%s' is not enabled" % self.plugin)
def __getvar(self, name):
self.checkEnabled()
return world.GetPluginVariable(self.plugin, name)
def __setvar(self, name, value):
self.checkEnabled()
return world.SetPluginVariable(self.plugin, name, value)
def __delvar(self, name):
self.checkEnabled()
return world.DeletePluginVariable(self.plugin, name)
def __getvarlist(self):
self.checkEnabled()
return world.GetPluginVariableList(self.plugin)
var = var()
|