import wx
from twisted.internet import wxreactor
#wxreactor.install()
from twisted.spread import pb
from twisted.internet import reactor, threads
from twisted.cred import credentials
import getpass
class ChatC(pb.Referenceable):
def connect(self):
# who = str(getpass.getuser()).upper()
name = raw_input("Username: ")
factory = pb.PBClientFactory()
#open connection
reactor.connectTCP("localhost", 1025, factory)
def1 = factory.login(credentials.UsernamePassword(name, "none"), client=self)
def1.addCallback(self.joinGroup)
#factory.getRootObject().addCallback(self.joinGroup)
reactor.run()
def joinGroup(self, user):
#recieve and store avatar object remote reference
print "got perspective/user ref:", user
self.user = user #the user object for this client instance...keep around!
groupN = raw_input('Group Name: ')
g = user.callRemote('joinGroup', groupN)
print "joined group!"
g.addCallback(self.chat)
#need to wait for user input and execute remote_print from server at the same time.
#threads? stackless? stdio?
def chat(self, group):
#take input from GUI
d = threads.deferToThread(self.write)
d.addCallback(lambda message: group.callRemote('send', message))
d.addCallback(self.chat)
# message = self.write()
#send to server
# s = group.callRemote('send', message)
# s.addCallback(self.chat)
def write(self):
message = raw_input(": ")
return message
def remote_print(self, message):
print "(S) %s" % (message)
# self.chat(groupObj)
def end(self):
reactor.stop()
# def userList(self):
# #list of online users
# #accept selections
# pass
# INTERFACE
# [http://wiki.wxpython.org/wxPythonAndTwisted]
#class Interface(wx.Frame):
# def __init__(self):
# wx.Frame.__init__(self, None, -1, "Test Chat", size = (400, 200))
# panel = wx.Panel(self)
# notebook = Notebook(panel)
# sizer = wx.BoxSizer(wx.VERTICAL)
# sizer.Add(notebook, 1, wx.EXPAND, 5)
# panel.SetSizer(sizer)
# self.Layout()
# self.Show()
#class Notebook(wx.Notebook):
# def __init__(self, parent):
# wx.Notebook.__init__(self, parent, -1, size = (380, 180), name = 'Chat')
# self.AddPage(ChatPanel(self), 'Chat')
# self.AddPage(ControlPanel(self), 'Controls')
# #create a generic tab creation function linked to click-on-online user/joining new groups
# #add tab(s) to chat tab
# sizer = wx.BoxSizer()
# sizer.Add(self, 0, wx.EXPAND)
# self.SetSizer(sizer)
# self.Layout()
# #add readonly and message entry textboxes to every chat tab
#class ChatPanel(wx.Panel):
# def __init__(self, parent):
# wx.Panel.__init__(self, parent = parent, id=wx.ID_ANY)
# sizer = wx.BoxSizer(wx.VERTICAL)
# self.text = wx.TextCtrl(self, style = wx.TE_MULTILINE | wx.TE_READONLY)
# self.ctrl = wx.TextCtrl(self, style = wx.TE_PROCESS_ENTER, size=(200, 25))
# sizer.Add(self.text, 5, wx.EXPAND)
# sizer.Add(self.ctrl, 0, wx.EXPAND)
# self.SetSizer(sizer)
# self.ctrl.Bind(wx.EVT_TEXT_ENTER, self.send)
# self.Layout()
## connect to client's remote_print and write methods
# def send(self, event):
# message = str(self.ctrl.GetValue())
# self.ctrl.SetValue("")
#class ControlPanel(wx.Panel):
# def __init__(self, parent):
# wx.Panel.__init__(self, parent = parent, id=wx.ID_ANY)
# sizer = wx.BoxSizer(wx.VERTICAL)
# self.userList = [] #ChatC().user.callRemote('userList')
# self.listCtrl = wx.ListCtrl(self, size=(-1,100))
# self.listCtrl.InsertColumn(0, '')
# self.listCtrl.InsertColumn(1, 'User')
#
# i = 0
# for user in self.userList:
# line = i
# self.list_ctrl.InsertStringItem(i, line)
# self.list_ctrl.SetStringItem(i, 1, name)
# self.list_ctrl.SetStringItem(i, 2, "online")
# i += 1
#
# sizer.Add(self.listCtrl, 0, wx.ALL|wx.EXPAND, 5)
# self.SetSizer(sizer)
# self.Layout()
if __name__ == "__main__":
# app = wx.App(False)
# frame = Interface()
# frame.Show()
ChatC().connect()
# app.MainLoop()