pypsyc/in-silico/gui/psycObjects.py

298 lines
11 KiB
Python

# -*- coding: latin-1 -*-
#from wxPython.wx import *
import wx
# XXX Please feel free to modify and vershclimmbesser this piece of code
# especially the bits marked with XXX
##from pypsyc.objects.PSYCObject import
from pypsyc.objects.client import ClientUser, ClientPlace, PSYCClient
from pypsyc.objects import PSYCObject
from pypsyc.center import ClientCenter
from pypsyc import netLocation, parsetext, UNL2Location
from displays import wxPFrame, wxPTab, wxPPlace, wxPUser, wxPClient
import asyncore, sys, os
import extras
class PObject(PSYCObject):
def __init___(self, netname, center):
PSYCObject.__init__(self, netname, center)
self.context = extras.Context()
self.display = extras.Display()
self.queue = [] # a place to store pakets
def create_display(self, display=None, parent=None, name = 'default'):
""" create a new display for this object """
# display := display object
# parent := if we don't have a display object we need to create one
# and perhaps need a parent
# name := the display needs a name so we can access it later
if name == 'default':
if self.display['default']:
print 'there is already a default display, \
if you want a new display give it a unique name'
return
else:
if display:
# a display has to have some basic functionality
self.display[name] = display
else:
# we're a bit confused now because we can't know what sort of
# display to create, but perhas someone comes up with a idea later
print 'HELP!'
def msg(self, vars, mc, data, caller):
PSYCObject.msg(self, vars, mc, data, caller)
# store things until we know what do with them
f = (vars, mc, data, caller)
self.queue.append(f)
class wxCenter(wx.App, ClientCenter):
def __init__(self): #vllt noch cmd line args uebergeben or so
wx.App.__init__(self, 0)
#self.run()
def OnInit(self):
ClientCenter.__init__(self)
self.context = extras.Context()
self.context.config = extras.Config()
self.config = self.context.config
self.frame = wxPFrame(psyc_parent=self) # nen frame um die tabs aufzuheben
self.timer = wx.PyTimer(self.socket_check)
self.timer.Start(100) # alle 100 ms
return True
def socket_check(self):
asyncore.poll(timeout=0.0) # das sollte vllt klappen
def run(self):
puni = UNL2Location(self.config['uni'])
self.client = PClient(puni, self)
self.create_server_place(netLocation(self.config['uni']))
# XXX extremly buggy here!!
#self.create_server_place('psyc://adamantine.fippo.int')
self.default_connection = netLocation(self.config['uni'])
self.client.online()
self.client.create_display(self)
self.SetTopWindow(self.client.display['default'])
self.client.display['default'].Show()
self.MainLoop()
def sendmsg(self, vars, mc, data, caller = None):
extras.print_psyc(vars, mc, data, 'center sending')
ClientCenter.sendmsg(self, vars, mc, data, caller)
def set_default_connection(self, uni):
#netLocation(self.uni)
print 'set_default_connect: ' + netLocation(uni)
self.default_connection = netLocation(uni)
def msg(self, vars, mc, data, caller):
source = vars['_context'] or vars['_source']
if not ClientCenter.msg(self, vars, mc, data, caller):
# create a psyc object of unknown type
#self.create_psyc_object(source)
#print '\n\n !!WE ARE IN TROUBLE!!\n\n\n'
print ''
def create_psyc_object(self, netname):
# this could do some better guessing about the type
self.create_server_place(netname)
# XXX
def create_user(self, netname):
t = PUser(netname, self)
#print 'i am a USER and my name is: ' + netname + ' / ' + netLocation(netname)
self.frame.addTab(t)
return t
def create_place(self, netname):
t = PPlace(netname, self)
#print 'i am a PLACE and my name is: ' + netname + ' / ' + netLocation(netname)
self.frame.addTab(t)
return t
def create_server_place(self, netname):
t = PServer(netname, self)
#print 'i am a SERVER and my name is: ' + netname + ' / ' + netLocation(netname)
self.frame.addTab(t)
self.client.create_display(name='server', display=t.display['default'])
#sys.stdout = extras.DevNull()
return t
class PPlace(ClientPlace):
def __init__(self, netname, center):
ClientPlace.__init__(self, netname, center)
self.display = extras.Display()
print 'i am a PLACE and my name is: ' + self.netname + ' / ' + netLocation(self.netname)
def create_display(self, parent = None, name = 'default', display = None):
if name == 'default':
self.display['default'] = wxPPlace(parent=parent, psyc_parent=self)
else:
self.display[name] = display
def msg(self, vars, mc, data, caller = None):
extras.print_psyc(vars, mc, data, 'place')
#print 'ddd' + str(type(data))
parsedtext = parsetext(vars, mc, data)
#print dir(parsedtext) , type(parsedtext)
#parsedtext = parsedtext.encode('iso-8859-15')
#print type(parsedtext)
if mc == '_message_public':
line = u''
if vars['_nick']:
line += vars['_nick']
else:
line += vars['_source']
if vars['_action']: line += ' ' + vars['_action'] + '>'
else: line += '>'
try:
line += ' ' + parsedtext.decode('iso-8859-15')
except:
line += ' ' + parsedtext
self.display.append1(line)
elif mc == '_message_public_question':
line = u''
line += vars['_nick']
if vars['_action']: line += ' ' + vars['_action'] + '>'
else: line += ' fragt>'
try:
line += ' ' + parsedtext.decode('iso-8859-15')
except:
line += ' ' + parsedtext
self.display.append1(line)
elif mc.startswith('_status_place_topic'):
self.display.append1('TOPIC: ' + parsedtext)
else:
self.display.append1(parsedtext)
class PUser(ClientUser):
def __init__(self, netname, center):
ClientUser.__init__(self, netname, center)
self.display = extras.Display()
print 'i am a USER and my name is: ' + self.netname + ' / ' + netLocation(self.netname)
def create_display(self, parent = None, name = 'default', display = None):
if name == 'default':
self.display['default'] = wxPUser(parent=parent, psyc_parent=self)
else:
self.display[name] = display
def msg(self, vars, mc, data, caller = None):
extras.print_psyc(vars, mc, data, caller)
parsedtext = parsetext(vars, mc,data)
#parsedtext = parsedtext.encode('iso-8859-15')
if mc == '_message_private':
self.display.append1(parsedtext)
else:
self.display.append1(parsedtext)
class PServer(PSYCObject):
def __init__(self, netname, center):
PSYCObject.__init__(self, netname, center)
print 'registered server'
#print 'PServer: ' + str(dir(self))
self.display = extras.Display()
print 'i am a SERVER and my name is: ' + self.netname + ' / ' + netLocation(self.netname)
def create_display(self, parent = None, name = 'default', display = None):
if name == 'default':
self.display['default'] = wxPPlace(parent=parent, psyc_parent=self)
else:
self.display[name] = display
def msg(self, vars, mc, data, caller = None):
extras.print_psyc(vars, mc, data, 'server')
parsedtext = parsetext(vars, mc,data)
#parsedtext = parsedtext.encode('iso-8859-15')
#self.center.Yield()
if mc == '_notice_circuit_established' and vars['_source'] == netLocation(self.center.config['uni']):
mc = '_request_link'
vars = {}
data =''
vars['_target'] = self.center.config['uni']
self.sendmsg(vars, mc, data)
self.display.append1(parsedtext)
else:
self.display.append1(parsedtext)
def write(self, text):
""" redirected stdout """
# we have problems if text contains \n and with print adding an extra \n
lines = text.split('\n')
for line in lines:
if line == '':
return
else:
self.display.append1('printed: ' + line)
def sendmsg(self, vars, mc, data, caller = None):
extras.print_psyc(vars, mc, data, 'server sending...')
PSYCObject.sendmsg(self, vars, mc, data, caller)
class PClient(PSYCClient):
def __init__(self, netname, center):
PSYCClient.__init__(self, netname, center)
self.display = extras.Display()
#self.extra_display = {} # XXX
#self.create_display(parent=None)
print 'default_conmnect is --> ' + self.center.default_connection
print 'i am a CLIENT and my name is: ' + self.netname + ' / ' + netLocation(self.netname)
def create_display(self, parent = None, name = 'default', display = None):
if name == 'default':
self.display[name] = wxPClient(parent=parent, psyc_parent=self)
else:
if self.display.has_key(name):
# XXX tempory hack for multi server connect
print 'HACKING GOING ON!'
return
else:
self.display[name] = display
def set_display(self, which, display):
self.display[which] = display
def msg(self, vars, mc, data, caller = None):
extras.print_psyc(vars, mc, data, 'client')
parsedtext = parsetext(vars, mc,data)
#parsedtext = parsedtext.encode('iso-8859-15')
if mc == '_query_password':
if self.center.config['password'] != '':
mc = '_set_password'
vars = {'_password' : self.center.config['password']}
vars['_target'] = self.netname
data =''
self.sendmsg(vars, mc, data)
else:
self.display['server'].append1("Please enter your password or choose a different nick if you don't know the password")
self.display['server'].entry_box.SetValue('/password ')
elif mc == '_status_friends':
self.display['server'].append1(parsedtext)
elif mc == '_error_invalid_password':
self.display['server'].append1(parsedtext)
self.display['server'].append1("Please enter your password or choose a different nick if you don't know the password")
self.display['server'].entry_box.SetValue('/password ')
else:
self.display['server'].append1(parsedtext)
def online(self):
self.center.connect(self.center.default_connection)
#mc = '_request_link'
#mmp = {}
#psyc = {}
#data =''
#mmp['_target'] = self.netname
#self.sendmsg(mmp, psyc, mc, data)