mirror of git://git.psyced.org/git/pypsyc
298 lines
11 KiB
Python
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)
|