fds
This commit is contained in:
parent
088e6f0a58
commit
7caefa6971
3 changed files with 200 additions and 75 deletions
|
@ -1,7 +1,8 @@
|
||||||
{
|
{
|
||||||
"chums": ["gamblingGenocider",
|
"chums": ["gamblingGenocider",
|
||||||
"grimAuxiliatrix",
|
"grimAuxiliatrix",
|
||||||
"gardenGnostic"
|
"gardenGnostic",
|
||||||
|
"ghostDunk"
|
||||||
],
|
],
|
||||||
"theme": "pesterchum"
|
"theme": "pesterchum"
|
||||||
}
|
}
|
260
pesterchum.py
260
pesterchum.py
|
@ -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("&", "&").replace("<", "<").replace(">", ">")
|
||||||
|
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()'))
|
||||||
|
|
|
@ -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;"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue