You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
287 lines
11 KiB
287 lines
11 KiB
14 years ago
|
""" *==LICENSE==*
|
||
|
|
||
|
CyanWorlds.com Engine - MMOG client, server and tools
|
||
|
Copyright (C) 2011 Cyan Worlds, Inc.
|
||
|
|
||
|
This program is free software: you can redistribute it and/or modify
|
||
|
it under the terms of the GNU General Public License as published by
|
||
|
the Free Software Foundation, either version 3 of the License, or
|
||
|
(at your option) any later version.
|
||
|
|
||
|
This program is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
GNU General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License
|
||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com
|
||
|
or by snail mail at:
|
||
|
Cyan Worlds, Inc.
|
||
|
14617 N Newport Hwy
|
||
|
Mead, WA 99021
|
||
|
|
||
|
*==LICENSE==* """
|
||
|
""" pch - Plasma Console Helper
|
||
|
This module aids in the using the plasma console to debug PythonFileComponents.
|
||
|
"""
|
||
|
# plasma console helper
|
||
|
import Plasma
|
||
|
import PlasmaTypes
|
||
|
import sys
|
||
|
|
||
|
# globals for the outside and inside to grab
|
||
|
__pmods = []
|
||
|
__sel = 0
|
||
|
__selattr = 0
|
||
|
|
||
|
# help!
|
||
|
def help():
|
||
|
"display help"
|
||
|
print "functions:"
|
||
|
print " getmods() - gets all the modules available"
|
||
|
print " showmods() - show the modules (and the current selected module)"
|
||
|
print " selmod(i) - selects module 'i'; returns module object"
|
||
|
print " showmod() - shows detail of the module selected"
|
||
|
print " showdoc() - shows the doc field of the module selected"
|
||
|
print " showattribs() - shows all the plasma attributes of the module selected"
|
||
|
print " selattrib(id) - selects attribute 'id' in the selected module;"
|
||
|
print " returns attribute object"
|
||
|
print " setattrib(value) - sets the selected attribute to 'value'"
|
||
|
print " showglobals() - shows the globals for the selected module"
|
||
|
print " setglobal(name,value) - set global 'name' to 'value' in selected module"
|
||
|
print " getglobal(name) - returns global object"
|
||
|
print " showinst() - shows the instance of the ptModifier class for the selected"
|
||
|
print " module"
|
||
|
print " getinst() - returns the instance object"
|
||
|
print " showvars(inst) - shows the instance variables of the ptModifier class of"
|
||
|
print " the selected module"
|
||
|
print " showmethods(inst) - shows the methods of the ptModifier class of the"
|
||
|
print " selected module"
|
||
|
print " showfunc(method) - decompiles a method or function and shows source"
|
||
|
print " setvar(name,value) - sets instance variable 'name' to 'value' in the"
|
||
|
print " selected module"
|
||
|
print " getvar(name) - returns the instance variable object (in selected module)"
|
||
|
# modules
|
||
|
def getmods():
|
||
|
"get all the PythonFileComponent modules"
|
||
|
global __pmods,__sel
|
||
|
__pmods = [] # wipe the module list clean
|
||
|
print "Plasma modules:"
|
||
|
for modname in sys.modules.keys():
|
||
|
mod = sys.modules[modname]
|
||
|
if hasattr(mod,"glue_inst"):
|
||
|
if __sel == len(__pmods):
|
||
|
print "*%d. %s" % (len(__pmods),modname[:-13])
|
||
|
else:
|
||
|
print " %d. %s" % (len(__pmods),modname[:-13])
|
||
|
__pmods.append([modname,mod])
|
||
|
def showmods():
|
||
|
"show all the PythonFileComponent modules"
|
||
|
global __pmods
|
||
|
global __sel
|
||
|
idx = 0
|
||
|
print "Plasma modules:"
|
||
|
for mod in __pmods:
|
||
|
if idx == __sel:
|
||
|
print "*%d. %s" % (idx,mod[0][:-13])
|
||
|
else:
|
||
|
print " %d. %s" % (idx,mod[0][:-13])
|
||
|
idx += 1
|
||
|
def selmod(idx=None):
|
||
|
"select a module from the list"
|
||
|
global __pmods
|
||
|
global __sel
|
||
|
if type(idx) == type(None):
|
||
|
idx = __sel
|
||
|
elif type(idx) == type(""):
|
||
|
# its a string, then find it by module name
|
||
|
i = 0
|
||
|
for mod in __pmods:
|
||
|
if mod[0][:-13] == idx:
|
||
|
break
|
||
|
i += 1
|
||
|
# if we didn't find the module
|
||
|
if i == len(__pmods):
|
||
|
print "Module %s not found" % idx
|
||
|
return
|
||
|
idx = i
|
||
|
if idx < len(__pmods):
|
||
|
__sel = idx
|
||
|
print "%s selected" % (__pmods[idx][0][:-13])
|
||
|
return __pmods[__sel][1]
|
||
|
else:
|
||
|
print "Error: index not valid. There are %d modules" % (len(__pmods))
|
||
|
# find attributes
|
||
|
def showmod():
|
||
|
"show details of the selected module"
|
||
|
global __pmods
|
||
|
global __sel
|
||
|
print "Module: %s" % (__pmods[__sel][0][:-13])
|
||
|
showdoc()
|
||
|
showattribs()
|
||
|
showglobals()
|
||
|
showinst()
|
||
|
def showdoc():
|
||
|
"show the doc of the module selected"
|
||
|
global __pmods
|
||
|
global __sel
|
||
|
print "Doc:"
|
||
|
print __pmods[__sel][1].__doc__
|
||
|
def showattribs():
|
||
|
"show the plasma attributes of the module selected"
|
||
|
global __pmods
|
||
|
global __sel
|
||
|
global __selattr
|
||
|
print "Attributes in %s:" % (__pmods[__sel][0][:-13])
|
||
|
for name in __pmods[__sel][1].__dict__.keys():
|
||
|
ist = __pmods[__sel][1].__dict__[name]
|
||
|
if isinstance(ist,PlasmaTypes.ptAttribute):
|
||
|
if __selattr == ist.id:
|
||
|
print "*(%d) %s(%s) =" % (ist.id,name,ist.__class__.__name__),ist.value
|
||
|
else:
|
||
|
print " (%d) %s(%s) =" % (ist.id,name,ist.__class__.__name__),ist.value
|
||
|
def selattrib(id=None):
|
||
|
"select a plasma attribute by id in the selected module"
|
||
|
global __pmods
|
||
|
global __sel
|
||
|
global __selattr
|
||
|
if type(id) == type(None):
|
||
|
id = __selattr
|
||
|
for name in __pmods[__sel][1].__dict__.keys():
|
||
|
ist = __pmods[__sel][1].__dict__[name]
|
||
|
if isinstance(ist,PlasmaTypes.ptAttribute):
|
||
|
if id == ist.id:
|
||
|
__selattr = ist.id
|
||
|
print "%s(%s) =" % (name,ist.__class__.__name__),ist.value
|
||
|
return ist
|
||
|
print "Error: Attribute ID %d not found" % (id)
|
||
|
def setattrib(value):
|
||
|
"set the value of the selected plasma attribute in the selected module"
|
||
|
global __pmods
|
||
|
global __sel
|
||
|
global __selattr
|
||
|
for name in __pmods[__sel][1].__dict__.keys():
|
||
|
ist = __pmods[__sel][1].__dict__[name]
|
||
|
if isinstance(ist,PlasmaTypes.ptAttribute):
|
||
|
if __selattr == ist.id:
|
||
|
if type(ist.value) == type(None) or type(ist.value) == type(value):
|
||
|
# see if there is a __setvalue__ method
|
||
|
try:
|
||
|
ist.__setvalue__(value)
|
||
|
except AttributeError:
|
||
|
ist.value = value
|
||
|
else:
|
||
|
print "Error: value is not same type as attribute"
|
||
|
return
|
||
|
print "Error: Attribute ID %d not found" % (id)
|
||
|
# find globals
|
||
|
def showglobals():
|
||
|
"show the global variables of the selected module"
|
||
|
global __pmods
|
||
|
global __sel
|
||
|
print "Globals:"
|
||
|
for name in __pmods[__sel][1].__dict__.keys():
|
||
|
ist = __pmods[__sel][1].__dict__[name]
|
||
|
# make sure that its not something we already know about
|
||
|
if not hasattr(Plasma,name) and not hasattr(PlasmaTypes,name):
|
||
|
if not isinstance(ist,PlasmaTypes.ptAttribute) and not isinstance(ist,PlasmaTypes.ptModifier):
|
||
|
if name[:2] != '__' and name[:4] != 'glue':
|
||
|
if type(ist) != type(sys) and type(ist) != type(PlasmaTypes.ptAttribute):
|
||
|
print " %s =" % (name),ist
|
||
|
def setglobal(name,value):
|
||
|
"set a global variable to a value with in the selected module"
|
||
|
global __pmods
|
||
|
global __sel
|
||
|
# first see if there is already a glabal by that name
|
||
|
if not __pmods[__sel][1].__dict__.has_key(name):
|
||
|
print "Warning: creating new global!"
|
||
|
__pmods[__sel][1].__dict__[name] = value
|
||
|
print "%s = " % (name),__pmods[__sel][1].__dict__[name]
|
||
|
def getglobal(name):
|
||
|
"get a global variable with in the selected module"
|
||
|
global __pmods
|
||
|
global __sel
|
||
|
return __pmods[__sel][1].__dict__[name]
|
||
|
# find instance
|
||
|
def showinst():
|
||
|
"show details of the instance of the ptModifier class in the selected module"
|
||
|
global __pmods
|
||
|
global __sel
|
||
|
for name in __pmods[__sel][1].__dict__.keys():
|
||
|
ist = __pmods[__sel][1].__dict__[name]
|
||
|
if isinstance(ist,PlasmaTypes.ptModifier):
|
||
|
print "Instance of %s in module %s:" % (ist.__class__.__name__,__pmods[__sel][1].__name__[:-13])
|
||
|
print " Doc: ",ist.__doc__
|
||
|
showvars(ist)
|
||
|
showmethods(ist)
|
||
|
def getinst():
|
||
|
"gets the instance of the ptModifier class in the selected module"
|
||
|
global __pmods
|
||
|
global __sel
|
||
|
for name in __pmods[__sel][1].__dict__.keys():
|
||
|
ist = __pmods[__sel][1].__dict__[name]
|
||
|
if isinstance(ist,PlasmaTypes.ptModifier):
|
||
|
return ist
|
||
|
def showvars(instance):
|
||
|
"shows the variables of the instance"
|
||
|
print " Variables:"
|
||
|
if len(instance.__dict__) > 0:
|
||
|
for vname in instance.__dict__.keys():
|
||
|
print " %s =" % (vname),instance.__dict__[vname]
|
||
|
else:
|
||
|
print " (none)"
|
||
|
def showmethods(instance):
|
||
|
"shows the methods of the instance"
|
||
|
print " Methods:"
|
||
|
for mname in instance.__class__.__dict__.keys():
|
||
|
mist = instance.__class__.__dict__[mname]
|
||
|
# is it a function... see if it has code
|
||
|
if hasattr(mist,'func_code'):
|
||
|
# gather arguments
|
||
|
args = "("
|
||
|
for i in range(mist.func_code.co_argcount):
|
||
|
args += mist.func_code.co_varnames[i]
|
||
|
if i+1 < mist.func_code.co_argcount:
|
||
|
args += ","
|
||
|
args += ")"
|
||
|
print " %s%s" % (mist.__name__,args)
|
||
|
print " Doc:", mist.__doc__
|
||
|
def showfunc(f):
|
||
|
"decompiles function"
|
||
|
import decompyle
|
||
|
if hasattr(f,'func_code'):
|
||
|
# create the argument list
|
||
|
argstr = "("
|
||
|
argcount = 0
|
||
|
for arg in f.func_code.co_varnames[:f.func_code.co_argcount]:
|
||
|
argstr += arg
|
||
|
argcount += 1
|
||
|
if argcount < f.func_code.co_argcount:
|
||
|
argstr += ","
|
||
|
argstr += ")"
|
||
|
print "%s%s" % (f.func_name,argstr)
|
||
|
print " Doc:",f.__doc__
|
||
|
decompyle.decompyle(f.func_code)
|
||
|
def setvar(vname,value):
|
||
|
"set a variable within the instance of the ptModifier class in the selected module"
|
||
|
global __pmods
|
||
|
global __sel
|
||
|
for name in __pmods[__sel][1].__dict__.keys():
|
||
|
ist = __pmods[__sel][1].__dict__[name]
|
||
|
if isinstance(ist,PlasmaTypes.ptModifier):
|
||
|
# first see if there is already a glabal by that name
|
||
|
if not ist.__dict__.has_key(vname):
|
||
|
print "Warning: creating new class variable!"
|
||
|
ist.__dict__[vname] = value
|
||
|
print "%s = " % (vname),ist.__dict__[vname]
|
||
|
def getvar(vname):
|
||
|
"get the variable in the instance of the ptModifier class in the selected module"
|
||
|
global __pmods
|
||
|
global __sel
|
||
|
for name in __pmods[__sel][1].__dict__.keys():
|
||
|
ist = __pmods[__sel][1].__dict__[name]
|
||
|
if isinstance(ist,PlasmaTypes.ptModifier):
|
||
|
return ist.__dict__[vname]
|