This commit is contained in:
Stephen Dranger 2011-01-24 01:34:07 -06:00
parent 088e6f0a58
commit 7caefa6971
3 changed files with 200 additions and 75 deletions

View file

@ -1,7 +1,8 @@
{ {
"chums": ["gamblingGenocider", "chums": ["gamblingGenocider",
"grimAuxiliatrix", "grimAuxiliatrix",
"gardenGnostic" "gardenGnostic",
"ghostDunk"
], ],
"theme": "pesterchum" "theme": "pesterchum"
} }

View file

@ -9,7 +9,6 @@ from PyQt4 import QtGui, QtCore
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.INFO)
class Mood(object): class Mood(object):
moods = ["chummy", "rancorous", "offline"] moods = ["chummy", "rancorous", "offline"]
def __init__(self, mood): def __init__(self, mood):
@ -22,65 +21,32 @@ class Mood(object):
def name(self): def name(self):
return self.moods[self.mood] return self.moods[self.mood]
class PesterIRC(QtCore.QObject): class PesterProfile(object):
def __init__(self, window): def __init__(self, handle, color=None, mood=None):
QtCore.QObject.__init__(self) self.handle = handle
self.window = window self.color = color
def IRCConnect(self): self.mood = mood
self.cli = IRCClient(PesterHandler, host="irc.tymoon.eu", port=6667, nick=self.window.currentHandle) def initials(self):
self.cli.command_handler.window = self.window handle = self.handle
self.conn = self.cli.connect() caps = [l for l in handle if l.isupper()]
if not caps:
caps = [""]
return (handle[0]+caps[0]).upper()
@QtCore.pyqtSlot()
def updateIRC(self):
self.conn.next()
class PesterHandler(DefaultCommandHandler): class pesterTheme(dict):
def privmsg(self, nick, chan, msg):
# display msg, do other stuff
handle = nick[0:nick.find("!")]
if chan == "#pesterchum":
# follow instructions
if msg[0:6] == "MOOD >":
try:
mood = Mood(int(msg[6:]))
except ValueError:
mood = Mood(0)
self.window.updateMood(handle, mood)
elif msg[0:7] == "GETMOOD":
mychumhandle = self.window.currentHandle
mymood = self.window.currentMood.value()
if msg.find(mychumhandle, 8) != -1:
helpers.msg(self.client, "#pesterchum",
"MOOD >%d" % (mymood))
else:
# private message
pass
def welcome(self, server, nick, msg):
helpers.join(self.client, "#pesterchum")
mychumhandle = self.window.currentHandle
mymood = self.window.currentMood.value()
helpers.msg(self.client, "#pesterchum", "MOOD >%d" % (mymood))
chums = self.window.chumList.chums
chumglob = "GETMOOD "
for c in chums:
if len(chumglob+c) >= 510:
helpers.msg(self.client, "#pesterchum", chumglob)
chumglob = "GETMOOD "
chumglob += c
if chumglob != "GETMOOD ":
helpers.msg(self.client, "#pesterchum", chumglob)
class pesterTheme(object):
def __init__(self, name): def __init__(self, name):
self.path = "themes/%s" % (name) self.path = "themes/%s" % (name)
fp = open(self.path+"/style.js") fp = open(self.path+"/style.js")
self.theme = json.load(fp, object_hook=self.pathHook) theme = json.load(fp, object_hook=self.pathHook)
self.update(theme)
fp.close() fp.close()
def getSection(self, section): def __getitem__(self, key):
return self.theme[section] keys = key.split("/")
v = dict.__getitem__(self, keys.pop(0))
for k in keys:
v = v[k]
return v
def pathHook(self, d): def pathHook(self, d):
from string import Template from string import Template
for (k, v) in d.iteritems(): for (k, v) in d.iteritems():
@ -108,10 +74,11 @@ class exitButton(QtGui.QPushButton):
self.setAutoDefault(False) self.setAutoDefault(False)
class chumListing(QtGui.QListWidgetItem): class chumListing(QtGui.QListWidgetItem):
def __init__(self, chumhandle, moodtheme): def __init__(self, chum, theme):
QtGui.QListWidgetItem.__init__(self, chumhandle) QtGui.QListWidgetItem.__init__(self, chum.handle)
self.theme = moodtheme self.theme = theme["main/chums/moods"]
self.handle = chumhandle self.chum = chum
self.handle = chum.handle
self.setMood(Mood("offline")) self.setMood(Mood("offline"))
def setMood(self, mood): def setMood(self, mood):
self.mood = mood self.mood = mood
@ -125,17 +92,18 @@ class chumListing(QtGui.QListWidgetItem):
class chumArea(QtGui.QListWidget): class chumArea(QtGui.QListWidget):
def __init__(self, chums, theme, parent=None): def __init__(self, chums, theme, parent=None):
QtGui.QListWidget.__init__(self, parent) QtGui.QListWidget.__init__(self, parent)
geometry = theme["loc"] + theme["size"] geometry = theme["main/chums/loc"] + theme["main/chums/size"]
self.setGeometry(*geometry) self.setGeometry(*geometry)
self.setStyleSheet(theme["style"]) self.setStyleSheet(theme["main/chums/style"])
self.chums = chums self.chums = chums
for c in self.chums: for c in self.chums:
if not self.findItems(c, QtCore.Qt.MatchFlags(0)): chandle = c.handle
chumLabel = chumListing(c, theme["moods"]) if not self.findItems(chandle, QtCore.Qt.MatchFlags(0)):
chumLabel = chumListing(c, theme)
self.addItem(chumLabel) self.addItem(chumLabel)
self.sortItems() self.sortItems()
def updateMood(self, nick, mood): def updateMood(self, handle, mood):
chums = self.findItems(nick, QtCore.Qt.MatchFlags(0)) chums = self.findItems(handle, QtCore.Qt.MatchFlags(0))
for c in chums: for c in chums:
c.setMood(mood) c.setMood(mood)
@ -160,14 +128,79 @@ class MovingWindow(QtGui.QFrame):
self.update() self.update()
self.moving = None self.moving = None
class PesterText(QtGui.QTextEdit):
def __init__(self, theme, parent=None):
QtGui.QTextEdit.__init__(self, parent)
self.setStyleSheet(theme["convo/textarea/style"])
self.setReadOnly(True)
def addMessage(self, text, chum):
if chum is None:
chum = self.parent().mainwindow.profile
color = chum.color
initials = chum.initials()
msg = str(text)
msg = msg.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
self.append("<span color='%s'>%s: %s</span>" % (color, initials, msg))
class PesterInput(QtGui.QLineEdit):
def __init__(self, theme, parent=None):
QtGui.QLineEdit.__init__(self, parent)
self.setStyleSheet(theme["convo/input/style"])
class PesterConvo(QtGui.QFrame):
def __init__(self, chumlisting, initiated, mainwindow, parent=None):
QtGui.QFrame.__init__(self, parent)
self.chumlisting = chumlisting
self.theme = mainwindow.theme
self.mainwindow = mainwindow
convo = self.theme["convo"]
self.resize(*convo["size"])
self.setStyleSheet(convo["style"])
self.setWindowIcon(chumlisting.icon())
self.setWindowTitle(chumlisting.handle)
self.chumLabel = QtGui.QLabel(chumlisting.handle, self)
self.chumLabel.setStyleSheet(self.theme["convo/chumlabel/style"])
self.textArea = PesterText(self.theme, self)
self.textInput = PesterInput(self.theme, self)
self.connect(self.textInput, QtCore.SIGNAL('returnPressed()'),
self, QtCore.SLOT('sentMessage()'))
self.layout = QtGui.QVBoxLayout()
self.layout.addWidget(self.chumLabel)
self.layout.addWidget(self.textArea)
self.layout.addWidget(self.textInput)
self.setLayout(self.layout)
def updateMood(self, mood):
icon = theme["chums/moods"][mood.name()]
self.setWindowIcon(icon)
# print mood update?
def addMessage(self, text, chum=None):
self.textArea.addMessage(text, chum)
@QtCore.pyqtSlot()
def sentMessage(self):
text = self.textInput.text()
# deal with quirks here
self.textInput.setText("")
self.addMessage(text, None)
self.messageSent.emit(text, self.chumlisting)
messageSent = QtCore.pyqtSignal(QtCore.QString, chumListing)
class PesterWindow(MovingWindow): class PesterWindow(MovingWindow):
def __init__(self, parent=None): def __init__(self, parent=None):
MovingWindow.__init__(self, parent, MovingWindow.__init__(self, parent,
flags=QtCore.Qt.CustomizeWindowHint) flags=QtCore.Qt.CustomizeWindowHint)
self.setObjectName("main") self.setObjectName("main")
self.config = userConfig() self.config = userConfig()
theme = self.config.getTheme() self.theme = self.config.getTheme()
main = theme.getSection("main") main = self.theme["main"]
width = int(main['width']) width = int(main['width'])
height = int(main['height']) height = int(main['height'])
self.setGeometry(100, 100, width, height) self.setGeometry(100, 100, width, height)
@ -179,17 +212,93 @@ class PesterWindow(MovingWindow):
self.closeButton.move(*closestyle["loc"]) self.closeButton.move(*closestyle["loc"])
self.connect(self.closeButton, QtCore.SIGNAL('clicked()'), self.connect(self.closeButton, QtCore.SIGNAL('clicked()'),
self, QtCore.SLOT('close()')) self, QtCore.SLOT('close()'))
self.chumList = chumArea(self.config.chums(), main["chums"], self) chums = [PesterProfile(c) for c in set(self.config.chums())]
self.chumList = chumArea(chums, self.theme, self)
self.connect(self.chumList, QtCore.SIGNAL('itemDoubleClicked(QListWidgetItem *)'),
self, QtCore.SLOT('newConversation(QListWidgetItem *)'))
self.currentHandle = "superGhost" self.profile = PesterProfile("superGhost", QtGui.QColor("red"), Mood(0))
self.currentMood = Mood(0)
self.convos = {} self.convos = {}
def updateMood(self, nick, mood): def closeEvent(self, event):
self.chumList.updateMood(nick, mood) for c in self.convos.itervalues():
def newConversation(self, nick): c.close()
convoWindow = PesterConvo(nick, self.theme) event.accept()
self.convos[nick] = convoWindow def newMessage(self, handle, msg):
pass
def updateMood(self, handle, mood):
self.chumList.updateMood(handle, mood)
if self.convos.has_key(handle):
self.convos[handle].updateMood(mood)
@QtCore.pyqtSlot(QtGui.QListWidgetItem)
def newConversation(self, chum, initiated=True):
convoWindow = PesterConvo(chum, initiated, self)
self.connect(convoWindow, QtCore.SIGNAL('messageSent(QString, PyQt_PyObject)'),
self, QtCore.SIGNAL('sendMessage(QString, PyQt_PyObject)'))
self.convos[chum.handle] = convoWindow
convoWindow.show()
sendMessage = QtCore.pyqtSignal(QtCore.QString, chumListing)
class PesterIRC(QtCore.QObject):
def __init__(self, window):
QtCore.QObject.__init__(self)
self.window = window
def IRCConnect(self):
self.cli = IRCClient(PesterHandler, host="irc.tymoon.eu", port=6667, nick=self.window.profile.handle)
self.cli.command_handler.window = self.window
self.conn = self.cli.connect()
@QtCore.pyqtSlot(QtCore.QString, chumListing)
def sendMessage(self, text, chumlisting):
handle = chumlisting.handle
helpers.msg(self.cli, handle, text)
@QtCore.pyqtSlot()
def updateIRC(self):
self.conn.next()
class PesterHandler(DefaultCommandHandler):
def privmsg(self, nick, chan, msg):
# display msg, do other stuff
handle = nick[0:nick.find("!")]
if chan == "#pesterchum":
# follow instructions
if msg[0:6] == "MOOD >":
try:
mood = Mood(int(msg[6:]))
except ValueError:
mood = Mood(0)
self.window.updateMood(handle, mood)
elif msg[0:7] == "GETMOOD":
mychumhandle = self.window.profile.handle
mymood = self.window.profile.mood.value()
if msg.find(mychumhandle, 8) != -1:
helpers.msg(self.client, "#pesterchum",
"MOOD >%d" % (mymood))
else:
# private message
self.window.newMessage(handle, msg)
pass
def welcome(self, server, nick, msg):
helpers.join(self.client, "#pesterchum")
mychumhandle = self.window.profile.handle
mymood = self.window.profile.mood.value()
helpers.msg(self.client, "#pesterchum", "MOOD >%d" % (mymood))
chums = self.window.chumList.chums
chumglub = "GETMOOD "
for c in chums:
chandle = c.handle
if len(chumglub+chandle) >= 510:
helpers.msg(self.client, "#pesterchum", chumglub)
chumglub = "GETMOOD "
chumglub += chandle
if chumglub != "GETMOOD ":
helpers.msg(self.client, "#pesterchum", chumglub)
def main(): def main():
@ -205,6 +314,9 @@ def main():
irc = PesterIRC(widget) irc = PesterIRC(widget)
irc.IRCConnect() irc.IRCConnect()
irc.connect(widget, QtCore.SIGNAL('sendMessage(QString, PyQt_PyObject)'),
irc, QtCore.SLOT('sendMessage(QString, PyQt_PyObject)'))
irctimer = QtCore.QTimer(widget) irctimer = QtCore.QTimer(widget)
widget.connect(irctimer, QtCore.SIGNAL('timeout()'), widget.connect(irctimer, QtCore.SIGNAL('timeout()'),
irc, QtCore.SLOT('updateIRC()')) irc, QtCore.SLOT('updateIRC()'))

View file

@ -19,5 +19,17 @@
"elements": [ "elements": [
{ "style": "" } { "style": "" }
] ]
},
"convo":
{"style": "background: #fdb302; font-family: 'Courier New'",
"size": [500, 500],
"chumlabel": { "style": "background: rgba(255, 255, 255, 25%);" },
"textarea": {
"style": "background: white;"
},
"input": {
"style": "background: white;"
} }
} }
}