107 lines
3.7 KiB
Python
107 lines
3.7 KiB
Python
from PySide.QtCore import *
|
|
from PySide.QtGui import *
|
|
import sys, qt4reactor
|
|
|
|
app = QApplication(sys.argv)
|
|
qt4reactor.install()
|
|
|
|
from twisted.words.protocols import irc
|
|
from twisted.internet import reactor, protocol
|
|
from twisted.python import log
|
|
|
|
import time, sys
|
|
|
|
class IRCCore(irc.IRCClient):
|
|
nickname = 'dosdsdssd'
|
|
def connectionMade(self):
|
|
self.nickname = self.factory.window.nickName.text().encode('ascii')
|
|
self.factory.window.protocol = self
|
|
irc.IRCClient.connectionMade(self)
|
|
self.log('connected!!')
|
|
def connectionLost(self, reason):
|
|
self.log('disconnected... :( %s'%reason)
|
|
def signedOn(self):
|
|
chanName = self.factory.window.channelName.text().encode('ascii')
|
|
self.join(chanName)
|
|
def joined(self, channel):
|
|
self.log('joined %s'%channel)
|
|
def privmsg(self, user, channel, msg):
|
|
self.log('%s %s %s'%(user, channel, msg))
|
|
def action(self, user, channel, msg):
|
|
self.log('action: %s %s %s'%(user, channel, msg))
|
|
def log(self, str):
|
|
self.factory.window.view.addItem(str)
|
|
|
|
class IRCCoreFactory(protocol.ClientFactory):
|
|
protocol = IRCCore
|
|
def __init__(self, window):
|
|
self.window = window
|
|
def clientConnectionLost(self, connector, reason):
|
|
# reconnect to server if lose connection
|
|
connector.connect()
|
|
def clientConnectionFailed(self, connector, reason):
|
|
print('connection failed! :(', reason)
|
|
reactor.stop()
|
|
|
|
class MainWindow(QMainWindow):
|
|
def __init__(self):
|
|
super(MainWindow, self).__init__()
|
|
connectLayout = QHBoxLayout()
|
|
connectLayout.addWidget(QLabel('Server:'))
|
|
self.serverName = QLineEdit('irc.freenode.org')
|
|
connectLayout.addWidget(self.serverName)
|
|
connectLayout.addWidget(QLabel('Channel:'))
|
|
self.channelName = QLineEdit('#pangaea')
|
|
connectLayout.addWidget(self.channelName)
|
|
connectLayout.addWidget(QLabel('Nick:'))
|
|
self.nickName = QLineEdit('ceruleanwave9832')
|
|
connectLayout.addWidget(self.nickName)
|
|
self.connectButton = QPushButton('Connect!')
|
|
connectLayout.addWidget(self.connectButton)
|
|
self.connectButton.clicked.connect(self.connectIRC)
|
|
|
|
self.view = QListWidget()
|
|
self.entry = QLineEdit()
|
|
self.entry.returnPressed.connect(self.sendMessage)
|
|
irc = QWidget(self)
|
|
vbox = QVBoxLayout()
|
|
vbox.addLayout(connectLayout)
|
|
vbox.addWidget(self.view)
|
|
vbox.addWidget(self.entry)
|
|
irc.setLayout(vbox)
|
|
self.setCentralWidget(irc)
|
|
self.setWindowTitle('IRC')
|
|
self.setUnifiedTitleAndToolBarOnMac(True)
|
|
self.showMaximized()
|
|
|
|
self.protocol = None
|
|
def connectIRC(self):
|
|
self.connectButton.setDisabled(True)
|
|
self.channelName.setDisabled(True)
|
|
self.nickName.setDisabled(True)
|
|
self.serverName.setDisabled(True)
|
|
ircCoreFactory = IRCCoreFactory(self)
|
|
serverName = self.serverName.text().encode('ascii')
|
|
reactor.connectTCP(serverName, 6667, ircCoreFactory)
|
|
#reactor.runReturn()
|
|
#app.exit()
|
|
#app.exit()
|
|
reactor.run()
|
|
def sendMessage(self):
|
|
if self.protocol:
|
|
chanName = self.channelName.text().encode('ascii')
|
|
message = self.entry.text().encode('ascii')
|
|
self.protocol.msg(chanName, message)
|
|
self.view.addItem('%s <%s> %s'%(chanName, self.protocol.nickname, message))
|
|
else:
|
|
self.view.addItem('Not connected.')
|
|
self.entry.setText('')
|
|
def closeEvent(self, event):
|
|
print('Attempting to close the main window!')
|
|
reactor.stop()
|
|
event.accept()
|
|
|
|
if __name__ == '__main__':
|
|
mainWin = MainWindow()
|
|
sys.exit(app.exec_())
|