pesterchum/pesterchum.py

215 lines
7.2 KiB
Python
Raw Normal View History

2011-01-21 05:18:22 -05:00
# pesterchum
from oyoyo.client import IRCClient
from oyoyo.cmdhandler import DefaultCommandHandler
from oyoyo import helpers
import logging
import sys
import json
from PyQt4 import QtGui, QtCore
logging.basicConfig(level=logging.INFO)
2011-01-22 04:36:24 -05:00
class Mood(object):
moods = ["chummy", "rancorous", "offline"]
def __init__(self, mood):
if type(mood) is int:
self.mood = mood
else:
self.mood = self.moods.index(mood)
def value(self):
return self.mood
def name(self):
return self.moods[self.mood]
2011-01-21 19:37:02 -05:00
class PesterIRC(QtCore.QObject):
def __init__(self, window):
QtCore.QObject.__init__(self)
self.window = window
def IRCConnect(self):
2011-01-22 04:36:24 -05:00
self.cli = IRCClient(PesterHandler, host="irc.tymoon.eu", port=6667, nick=self.window.currentHandle)
2011-01-21 19:37:02 -05:00
self.cli.command_handler.window = self.window
self.conn = self.cli.connect()
@QtCore.pyqtSlot()
def updateIRC(self):
self.conn.next()
2011-01-21 05:18:22 -05:00
class PesterHandler(DefaultCommandHandler):
def privmsg(self, nick, chan, msg):
# display msg, do other stuff
2011-01-22 04:36:24 -05:00
handle = nick[0:nick.find("!")]
2011-01-21 05:18:22 -05:00
if chan == "#pesterchum":
# follow instructions
2011-01-22 04:36:24 -05:00
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))
2011-01-21 05:18:22 -05:00
else:
# private message
pass
def welcome(self, server, nick, msg):
helpers.join(self.client, "#pesterchum")
2011-01-22 04:36:24 -05:00
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):
self.path = "themes/%s" % (name)
fp = open(self.path+"/style.js")
self.theme = json.load(fp, object_hook=self.pathHook)
fp.close()
def getSection(self, section):
return self.theme[section]
def pathHook(self, d):
from string import Template
for (k, v) in d.iteritems():
if type(v) is unicode:
s = Template(v)
d[k] = s.substitute(path=self.path)
return d
2011-01-21 05:18:22 -05:00
class userConfig(object):
2011-01-22 04:36:24 -05:00
def __init__(self, handle="pesterchum"):
fp = open("%s.js" % (handle))
2011-01-21 05:18:22 -05:00
self.config = json.load(fp)
fp.close()
2011-01-22 04:36:24 -05:00
self.theme = pesterTheme(self.config["theme"])
2011-01-21 05:18:22 -05:00
def chums(self):
return self.config['chums']
2011-01-22 04:36:24 -05:00
def getTheme(self):
return self.theme
2011-01-21 05:18:22 -05:00
class exitButton(QtGui.QPushButton):
def __init__(self, icon, parent=None):
QtGui.QPushButton.__init__(self, icon, "", parent)
self.setFlat(True)
2011-01-22 04:36:24 -05:00
self.setStyleSheet("QPushButton { padding: 0px; }")
self.setAutoDefault(False)
class chumListing(QtGui.QListWidgetItem):
def __init__(self, chumhandle, moodtheme):
QtGui.QListWidgetItem.__init__(self, chumhandle)
self.theme = moodtheme
self.handle = chumhandle
self.setMood(Mood("offline"))
def setMood(self, mood):
self.mood = mood
self.setIcon(QtGui.QIcon(self.theme[self.mood.name()]["icon"]))
self.setTextColor(QtGui.QColor(self.theme[self.mood.name()]["color"]))
def __lt__(self, cl):
h1 = self.handle.lower()
h2 = cl.handle.lower()
return (h1 < h2)
2011-01-21 05:18:22 -05:00
class chumArea(QtGui.QListWidget):
2011-01-22 04:36:24 -05:00
def __init__(self, chums, theme, parent=None):
2011-01-21 05:18:22 -05:00
QtGui.QListWidget.__init__(self, parent)
2011-01-22 04:36:24 -05:00
geometry = theme["loc"] + theme["size"]
self.setGeometry(*geometry)
self.setStyleSheet(theme["style"])
2011-01-21 05:18:22 -05:00
self.chums = chums
for c in self.chums:
2011-01-22 04:36:24 -05:00
if not self.findItems(c, QtCore.Qt.MatchFlags(0)):
chumLabel = chumListing(c, theme["moods"])
self.addItem(chumLabel)
self.sortItems()
def updateMood(self, nick, mood):
chums = self.findItems(nick, QtCore.Qt.MatchFlags(0))
for c in chums:
c.setMood(mood)
2011-01-21 05:18:22 -05:00
2011-01-22 04:36:24 -05:00
class MovingWindow(QtGui.QFrame):
def __init__(self, *x, **y):
QtGui.QFrame.__init__(self, *x, **y)
2011-01-21 05:18:22 -05:00
self.moving = None
2011-01-21 19:37:02 -05:00
self.moveupdate = 0
2011-01-21 05:18:22 -05:00
def mouseMoveEvent(self, event):
if self.moving:
move = event.globalPos() - self.moving
2011-01-21 19:37:02 -05:00
self.move(move)
self.moveupdate += 1
if self.moveupdate > 5:
self.moveupdate = 0
self.update()
2011-01-21 05:18:22 -05:00
def mousePressEvent(self, event):
if event.button() == 1:
2011-01-21 19:37:02 -05:00
self.moving = event.globalPos() - self.pos()
2011-01-21 05:18:22 -05:00
def mouseReleaseEvent(self, event):
if event.button() == 1:
2011-01-21 19:37:02 -05:00
self.update()
2011-01-21 05:18:22 -05:00
self.moving = None
2011-01-22 04:36:24 -05:00
class PesterWindow(MovingWindow):
def __init__(self, parent=None):
MovingWindow.__init__(self, parent,
flags=QtCore.Qt.CustomizeWindowHint)
self.setObjectName("main")
self.config = userConfig()
theme = self.config.getTheme()
main = theme.getSection("main")
width = int(main['width'])
height = int(main['height'])
self.setGeometry(100, 100, width, height)
self.setWindowIcon(QtGui.QIcon(main["icon"]))
self.setStyleSheet("QFrame#main { "+main["style"]+" }")
closestyle = main["close"]
self.closeButton = exitButton(QtGui.QIcon(closestyle["image"]), self)
self.closeButton.move(*closestyle["loc"])
self.connect(self.closeButton, QtCore.SIGNAL('clicked()'),
self, QtCore.SLOT('close()'))
self.chumList = chumArea(self.config.chums(), main["chums"], self)
self.currentHandle = "superGhost"
self.currentMood = Mood(0)
self.convos = {}
def updateMood(self, nick, mood):
self.chumList.updateMood(nick, mood)
def newConversation(self, nick):
convoWindow = PesterConvo(nick, self.theme)
self.convos[nick] = convoWindow
2011-01-21 05:18:22 -05:00
def main():
app = QtGui.QApplication(sys.argv)
widget = PesterWindow()
widget.show()
trayicon = QtGui.QSystemTrayIcon(QtGui.QIcon("themes/pesterchum/trayicon.gif"), app)
traymenu = QtGui.QMenu()
traymenu.addAction("Hi!! HI!!")
trayicon.setContextMenu(traymenu)
trayicon.show()
2011-01-22 04:36:24 -05:00
irc = PesterIRC(widget)
irc.IRCConnect()
irctimer = QtCore.QTimer(widget)
widget.connect(irctimer, QtCore.SIGNAL('timeout()'),
irc, QtCore.SLOT('updateIRC()'))
irctimer.start()
2011-01-21 05:18:22 -05:00
sys.exit(app.exec_())
main()