This commit is contained in:
Stephen Dranger 2011-02-06 18:50:21 -06:00
parent f4d2b2f049
commit a58dbe2943
65 changed files with 743 additions and 181 deletions

12
TODO
View file

@ -1,18 +1,13 @@
Features: Features:
* memo kicking * X closes to tray
* user import
* Transparent background?
* tab right-click menu on tabbed convos, chat window
* link to memos
* color text is not being translated to server? * color text is not being translated to server?
* convo backgrounds -- make them more like http://www.mspaintadventures.com/storyfiles/hs2/02546_2.gif * convo backgrounds -- make them more like http://www.mspaintadventures.com/storyfiles/hs2/02546_2.gif
* PESTERLOG: in convo window * PESTERLOG: in convo window
* help button on quirks menu? * help button on quirks menu?
* tab recombining gives wrong window icon * tab recombining gives wrong window icon
* help menu -- about and forum * help menu -- about and forum
* profile switch should say current profile
* X closes to tray
-- release alpha -- release alpha
* scroll bar style
* User commands/stop user from sending commands accidentally * User commands/stop user from sending commands accidentally
* shared buddy lists - changes to the buddy list should refresh it? * shared buddy lists - changes to the buddy list should refresh it?
multiple clients share buddy list??? multiple clients share buddy list???
@ -21,13 +16,14 @@ Features:
* comment history (up button) * comment history (up button)
* page up/down scrolling * page up/down scrolling
* get rid of border on chat window? * get rid of border on chat window?
* Idling
* ctrl-tab should prefer new convos * ctrl-tab should prefer new convos
* More complex quirks: random, spelling, by-sound * More complex quirks: random, spelling, by-sound
* Implement TC options * Implement TC options
* chumList not scaling -- QListView + delegate? * chumList not scaling -- QListView + delegate?
* spell check? * spell check?
* Help menu * Help menu
* more robust IRC error handling * change profile only once we have confirmation from server
-- release beta -- release beta
* log viewer * log viewer
* pick your own icon * pick your own icon

View file

@ -3,7 +3,7 @@ import re
from PyQt4 import QtGui, QtCore from PyQt4 import QtGui, QtCore
from dataobjs import PesterProfile, Mood from dataobjs import PesterProfile, Mood
from generic import PesterIcon from generic import PesterIcon, RightClickList
from parsetools import escapeBrackets, convertTags from parsetools import escapeBrackets, convertTags
class PesterTabWindow(QtGui.QFrame): class PesterTabWindow(QtGui.QFrame):
@ -255,7 +255,10 @@ class PesterText(QtGui.QTextEdit):
def mousePressEvent(self, event): def mousePressEvent(self, event):
url = self.anchorAt(event.pos()) url = self.anchorAt(event.pos())
if url != "": if url != "":
QtGui.QDesktopServices.openUrl(QtCore.QUrl(url, QtCore.QUrl.TolerantMode)) if url[0] == "#" and url != "#pesterchum":
self.parent().mainwindow.showMemos(url[1:])
else:
QtGui.QDesktopServices.openUrl(QtCore.QUrl(url, QtCore.QUrl.TolerantMode))
QtGui.QTextEdit.mousePressEvent(self, event) QtGui.QTextEdit.mousePressEvent(self, event)
def mouseMoveEvent(self, event): def mouseMoveEvent(self, event):
QtGui.QTextEdit.mouseMoveEvent(self, event) QtGui.QTextEdit.mouseMoveEvent(self, event)
@ -283,7 +286,7 @@ class PesterConvo(QtGui.QFrame):
self.mainwindow = mainwindow self.mainwindow = mainwindow
convo = self.mainwindow.theme["convo"] convo = self.mainwindow.theme["convo"]
self.resize(*convo["size"]) self.resize(*convo["size"])
self.setStyleSheet(convo["style"]) self.setStyleSheet("QFrame { %s } QScrollBar:vertical { %s } QScrollBar::handle:vertical { %s }" % (convo["style"], convo["scrollbar"]["style"], convo["scrollbar"]["handle"]))
self.setWindowIcon(self.icon()) self.setWindowIcon(self.icon())
self.setWindowTitle(self.title()) self.setWindowTitle(self.title())
@ -313,7 +316,24 @@ class PesterConvo(QtGui.QFrame):
self.setLayout(self.layout) self.setLayout(self.layout)
self.optionsMenu = QtGui.QMenu(self)
self.optionsMenu.setStyleSheet(self.mainwindow.theme["main/defaultwindow/style"])
self.addChumAction = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/addchum"], self)
self.connect(self.addChumAction, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('addThisChum()'))
self.blockAction = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/blockchum"], self)
self.connect(self.blockAction, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('blockThisChum()'))
self.quirksOff = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/quirksoff"], self)
self.quirksOff.setCheckable(True)
self.connect(self.quirksOff, QtCore.SIGNAL('toggled(bool)'),
self, QtCore.SLOT('toggleQuirks(bool)'))
self.optionsMenu.addAction(self.quirksOff)
self.optionsMenu.addAction(self.addChumAction)
self.optionsMenu.addAction(self.blockAction)
self.chumopen = False self.chumopen = False
self.applyquirks = True
if parent: if parent:
parent.addChat(self) parent.addChat(self)
@ -394,15 +414,18 @@ class PesterConvo(QtGui.QFrame):
if self.parent(): if self.parent():
self.parent().showChat(self.title()) self.parent().showChat(self.title())
self.raiseChat() self.raiseChat()
def contextMenuEvent(self, event):
if event.reason() == QtGui.QContextMenuEvent.Mouse:
self.optionsMenu.popup(event.globalPos())
def closeEvent(self, event): def closeEvent(self, event):
self.mainwindow.waitingMessages.messageAnswered(self.title()) self.mainwindow.waitingMessages.messageAnswered(self.title())
self.windowClosed.emit(self.title()) self.windowClosed.emit(self.title())
def setChumOpen(self, o): def setChumOpen(self, o):
self.chumopen = o self.chumopen = o
def changeTheme(self, theme): def changeTheme(self, theme):
self.resize(*theme["convo/size"]) self.resize(*theme["convo/size"])
self.setStyleSheet(theme["convo/style"]) self.setStyleSheet("QFrame { %s } QScrollBar:vertical { %s } QScrollBar::handle:vertical { %s }" % (convo["style"], convo["scrollbar"]["style"], convo["scrollbar"]["handle"]))
margins = theme["convo/margins"] margins = theme["convo/margins"]
self.layout.setContentsMargins(margins["left"], margins["top"], self.layout.setContentsMargins(margins["left"], margins["top"],
margins["right"], margins["bottom"]) margins["right"], margins["bottom"])
@ -415,17 +438,23 @@ class PesterConvo(QtGui.QFrame):
self.chumLabel.setMaximumHeight(self.mainwindow.theme["convo/chumlabel/maxheight"]) self.chumLabel.setMaximumHeight(self.mainwindow.theme["convo/chumlabel/maxheight"])
self.chumLabel.setMinimumHeight(self.mainwindow.theme["convo/chumlabel/minheight"]) self.chumLabel.setMinimumHeight(self.mainwindow.theme["convo/chumlabel/minheight"])
self.chumLabel.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Expanding)) self.chumLabel.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Expanding))
self.quirksOff.setText(self.mainwindow.theme["main/menus/rclickchumlist/quirksoff"])
self.addChumAction.setText(self.mainwindow.theme["main/menus/rclickchumlist/addchum"])
self.blockAction.setText(self.mainwindow.theme["main/menus/rclickchumlist/blockchum"])
self.textArea.changeTheme(theme) self.textArea.changeTheme(theme)
self.textInput.changeTheme(theme) self.textInput.changeTheme(theme)
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def sentMessage(self): def sentMessage(self):
text = self.textInput.text() text = self.textInput.text()
if text == "": if text == "":
return return
# deal with quirks here # deal with quirks here
qtext = self.mainwindow.userprofile.quirks.apply(unicode(text)) if self.applyquirks:
text = QtCore.QString(qtext) qtext = self.mainwindow.userprofile.quirks.apply(unicode(text))
text = QtCore.QString(qtext)
self.textInput.setText("") self.textInput.setText("")
self.addMessage(text, True) self.addMessage(text, True)
# if ceased, rebegin # if ceased, rebegin
@ -435,6 +464,17 @@ class PesterConvo(QtGui.QFrame):
text = convertTags(unicode(text), "ctag") text = convertTags(unicode(text), "ctag")
self.messageSent.emit(text, self.title()) self.messageSent.emit(text, self.title())
@QtCore.pyqtSlot()
def addThisChum(self):
self.mainwindow.addChum(self.chum)
@QtCore.pyqtSlot()
def blockThisChum(self):
self.mainwindow.blockChum(self.chum.handle)
@QtCore.pyqtSlot(bool)
def toggleQuirks(self, toggled):
self.applyquirks = not toggled
messageSent = QtCore.pyqtSignal(QtCore.QString, QtCore.QString) messageSent = QtCore.pyqtSignal(QtCore.QString, QtCore.QString)
windowClosed = QtCore.pyqtSignal(QtCore.QString) windowClosed = QtCore.pyqtSignal(QtCore.QString)

BIN
convo.pyc

Binary file not shown.

Binary file not shown.

11
irc.py
View file

@ -8,7 +8,7 @@ import random
from dataobjs import Mood, PesterProfile from dataobjs import Mood, PesterProfile
from generic import PesterList from generic import PesterList
logging.basicConfig(level=logging.DEBUG) logging.basicConfig(level=logging.INFO)
class PesterIRC(QtCore.QObject): class PesterIRC(QtCore.QObject):
def __init__(self, window): def __init__(self, window):
@ -85,6 +85,15 @@ class PesterIRC(QtCore.QObject):
c = unicode(channel) c = unicode(channel)
h = unicode(handle) h = unicode(handle)
helpers.kick(self.cli, h, c) helpers.kick(self.cli, h, c)
@QtCore.pyqtSlot(QtCore.QString, QtCore.QString, QtCore.QString)
def setChannelMode(self, channel, mode, command):
c = unicode(channel)
m = unicode(mode)
cmd = unicode(command)
if cmd == "":
cmd = None
helpers.mode(self.cli, c, m, cmd)
def updateIRC(self): def updateIRC(self):
self.conn.next() self.conn.next()

BIN
irc.pyc

Binary file not shown.

109
mash Normal file
View file

@ -0,0 +1,109 @@
diff --git a/memos.py b/memos.py
index 239947e..af7ab32 100644
--- a/memos.py
+++ b/memos.py
@@ -236,7 +236,9 @@ class MemoText(PesterText):
time = TimeTracker(newtime)
parent.times[chum.handle] = time
timeGrammar = time.getGrammar()
- self.append(convertTags(chum.memojoinmsg(systemColor, time.getTime(), timeGrammar, window.theme["convo/text/joinmemo"])))
+ msg = chum.memojoinmsg(systemColor, time.getTime(), timeGrammar, window.theme["convo/text/joinmemo"])
+ self.append(convertTags(msg))
+ window.chatlog.log(parent.channel, convertTags(msg, "bbcode"))
else:
time = parent.time
@@ -356,7 +358,9 @@ class PesterMemo(PesterConvo):
p = self.mainwindow.profile()
timeGrammar = self.time.getGrammar()
systemColor = QtGui.QColor(self.mainwindow.theme["memos/systemMsgColor"])
- self.textArea.append(convertTags(p.memoopenmsg(systemColor, self.time.getTime(), timeGrammar, self.mainwindow.theme["convo/text/openmemo"], self.channel)))
+ msg = p.memoopenmsg(systemColor, self.time.getTime(), timeGrammar, self.mainwindow.theme["convo/text/openmemo"], self.channel)
+ self.textArea.append(convertTags(msg))
+ window.chatlog.log(parent.channel, convertTags(msg, "bbcode"))
self.op = False
self.newmessage = False
@@ -482,18 +486,24 @@ class PesterMemo(PesterConvo):
self.times[handle].setCurrent(close)
grammar = self.times[handle].getGrammar()
self.times[handle].removeTime(close)
- self.textArea.append(convertTags(chum.memoclosemsg(systemColor, grammar, window.theme["convo/text/closememo"])))
+ msg = chum.memoclosemsg(systemColor, grammar, window.theme["convo/text/closememo"])
+ self.textArea.append(convertTags(msg))
+ window.chatlog.log(parent.channel, convertTags(msg, "bbcode"))
elif timed not in self.times[handle]:
self.times[handle].addTime(timed)
grammar = self.times[handle].getGrammar()
- self.textArea.append(convertTags(chum.memojoinmsg(systemColor, timed, grammar, window.theme["convo/text/joinmemo"])))
+ msg = chum.memojoinmsg(systemColor, timed, grammar, window.theme["convo/text/joinmemo"])
+ self.textArea.append(convertTags(msg))
+ window.chatlog.log(parent.channel, convertTags(msg, "bbcode"))
else:
self.times[handle].setCurrent(timed)
else:
if timed is not None:
ttracker = TimeTracker(timed)
grammar = ttracker.getGrammar()
- self.textArea.append(convertTags(chum.memojoinmsg(systemColor, timed, grammar, window.theme["convo/text/joinmemo"])))
+ msg = chum.memojoinmsg(systemColor, timed, grammar, window.theme["convo/text/joinmemo"])
+ self.textArea.append(convertTags(msg))
+ window.chatlog.log(parent.channel, convertTags(msg, "bbcode"))
self.times[handle] = ttracker
@QtCore.pyqtSlot()
@@ -556,7 +566,9 @@ class PesterMemo(PesterConvo):
while self.times[h].getTime() is not None:
t = self.times[h]
grammar = t.getGrammar()
- self.textArea.append(convertTags(chum.memoclosemsg(systemColor, grammar, self.mainwindow.theme["convo/text/closememo"])))
+ msg = chum.memoclosemsg(systemColor, grammar, self.mainwindow.theme["convo/text/closememo"])
+ self.textArea.append(convertTags(msg))
+ window.chatlog.log(parent.channel, convertTags(msg, "bbcode"))
self.times[h].removeTime(t.getTime())
if update == "nick":
self.addUser(newnick)
@@ -583,7 +595,9 @@ class PesterMemo(PesterConvo):
opgrammar = self.time.getGrammar()
else:
opgrammar = TimeGrammar("CURRENT", "C", "RIGHT NOW")
- self.textArea.append(convertTags(chum.memobanmsg(opchum, opgrammar, systemColor, grammar)))
+ msg = chum.memobanmsg(opchum, opgrammar, systemColor, grammar)
+ self.textArea.append(convertTags(msg))
+ window.chatlog.log(parent.channel, convertTags(msg, "bbcode"))
ttracker.removeTime(ttracker.getTime())
if chum is self.mainwindow.profile():
@@ -599,7 +613,9 @@ class PesterMemo(PesterConvo):
self.resetSlider(curtime)
self.mainwindow.joinChannel.emit(self.channel)
me = self.mainwindow.profile()
- self.textArea.append(convertTags(me.memoopenmsg(systemColor, self.time.getTime(), self.time.getGrammar(), self.mainwindow.theme["convo/text/openmemo"], self.channel)))
+ msg = me.memoopenmsg(systemColor, self.time.getTime(), self.time.getGrammar(), self.mainwindow.theme["convo/text/openmemo"], self.channel)
+ self.textArea.append(convertTags(msg))
+ window.chatlog.log(parent.channel, convertTags(msg, "bbcode"))
elif ret == QtGui.QMessageBox.Cancel:
if self.parent():
i = self.parent().tabIndices[self.channel]
@@ -639,7 +655,9 @@ class PesterMemo(PesterConvo):
time = txt2delta(self.timeinput.text())
present = self.time.addTime(time)
if not present:
- self.textArea.append(convertTags(me.memojoinmsg(systemColor, time, self.time.getGrammar(), self.mainwindow.theme["convo/text/joinmemo"])))
+ msg = me.memojoinmsg(systemColor, time, self.time.getGrammar(), self.mainwindow.theme["convo/text/joinmemo"])
+ self.textArea.append(convertTags(msg))
+ window.chatlog.log(parent.channel, convertTags(msg, "bbcode"))
serverText = "PESTERCHUM:TIME>"+delta2txt(time, "server")
self.messageSent.emit(serverText, self.title())
@@ -651,7 +669,9 @@ class PesterMemo(PesterConvo):
if removed:
grammar = self.time.getGrammarTime(time)
systemColor = QtGui.QColor(self.mainwindow.theme["memos/systemMsgColor"])
- self.textArea.append(convertTags(me.memoclosemsg(systemColor, grammar, self.mainwindow.theme["convo/text/closememo"])))
+
+ self.textArea.append(convertTags(
+ window.chatlog.log(parent.channel, convertTags(msg, "bbcode"))
newtime = self.time.getTime()
if newtime is None:

View file

@ -236,7 +236,9 @@ class MemoText(PesterText):
time = TimeTracker(newtime) time = TimeTracker(newtime)
parent.times[chum.handle] = time parent.times[chum.handle] = time
timeGrammar = time.getGrammar() timeGrammar = time.getGrammar()
self.append(convertTags(chum.memojoinmsg(systemColor, time.getTime(), timeGrammar, window.theme["convo/text/joinmemo"]))) msg = chum.memojoinmsg(systemColor, time.getTime(), timeGrammar, window.theme["convo/text/joinmemo"])
self.append(convertTags(msg))
window.chatlog.log(parent.channel, convertTags(msg, "bbcode"))
else: else:
time = parent.time time = parent.time
@ -356,7 +358,9 @@ class PesterMemo(PesterConvo):
p = self.mainwindow.profile() p = self.mainwindow.profile()
timeGrammar = self.time.getGrammar() timeGrammar = self.time.getGrammar()
systemColor = QtGui.QColor(self.mainwindow.theme["memos/systemMsgColor"]) systemColor = QtGui.QColor(self.mainwindow.theme["memos/systemMsgColor"])
self.textArea.append(convertTags(p.memoopenmsg(systemColor, self.time.getTime(), timeGrammar, self.mainwindow.theme["convo/text/openmemo"], self.channel))) msg = p.memoopenmsg(systemColor, self.time.getTime(), timeGrammar, self.mainwindow.theme["convo/text/openmemo"], self.channel)
self.textArea.append(convertTags(msg))
self.mainwindow.chatlog.log(self.channel, convertTags(msg, "bbcode"))
self.op = False self.op = False
self.newmessage = False self.newmessage = False
@ -482,18 +486,24 @@ class PesterMemo(PesterConvo):
self.times[handle].setCurrent(close) self.times[handle].setCurrent(close)
grammar = self.times[handle].getGrammar() grammar = self.times[handle].getGrammar()
self.times[handle].removeTime(close) self.times[handle].removeTime(close)
self.textArea.append(convertTags(chum.memoclosemsg(systemColor, grammar, window.theme["convo/text/closememo"]))) msg = chum.memoclosemsg(systemColor, grammar, window.theme["convo/text/closememo"])
self.textArea.append(convertTags(msg))
self.mainwindow.chatlog.log(self.channel, convertTags(msg, "bbcode"))
elif timed not in self.times[handle]: elif timed not in self.times[handle]:
self.times[handle].addTime(timed) self.times[handle].addTime(timed)
grammar = self.times[handle].getGrammar() grammar = self.times[handle].getGrammar()
self.textArea.append(convertTags(chum.memojoinmsg(systemColor, timed, grammar, window.theme["convo/text/joinmemo"]))) msg = chum.memojoinmsg(systemColor, timed, grammar, window.theme["convo/text/joinmemo"])
self.textArea.append(convertTags(msg))
self.mainwindow.chatlog.log(self.channel, convertTags(msg, "bbcode"))
else: else:
self.times[handle].setCurrent(timed) self.times[handle].setCurrent(timed)
else: else:
if timed is not None: if timed is not None:
ttracker = TimeTracker(timed) ttracker = TimeTracker(timed)
grammar = ttracker.getGrammar() grammar = ttracker.getGrammar()
self.textArea.append(convertTags(chum.memojoinmsg(systemColor, timed, grammar, window.theme["convo/text/joinmemo"]))) msg = chum.memojoinmsg(systemColor, timed, grammar, window.theme["convo/text/joinmemo"])
self.textArea.append(convertTags(msg))
self.mainwindow.chatlog.log(self.channel, convertTags(msg, "bbcode"))
self.times[handle] = ttracker self.times[handle] = ttracker
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
@ -556,7 +566,9 @@ class PesterMemo(PesterConvo):
while self.times[h].getTime() is not None: while self.times[h].getTime() is not None:
t = self.times[h] t = self.times[h]
grammar = t.getGrammar() grammar = t.getGrammar()
self.textArea.append(convertTags(chum.memoclosemsg(systemColor, grammar, self.mainwindow.theme["convo/text/closememo"]))) msg = chum.memoclosemsg(systemColor, grammar, self.mainwindow.theme["convo/text/closememo"])
self.textArea.append(convertTags(msg))
self.mainwindow.chatlog.log(self.channel, convertTags(msg, "bbcode"))
self.times[h].removeTime(t.getTime()) self.times[h].removeTime(t.getTime())
if update == "nick": if update == "nick":
self.addUser(newnick) self.addUser(newnick)
@ -583,7 +595,9 @@ class PesterMemo(PesterConvo):
opgrammar = self.time.getGrammar() opgrammar = self.time.getGrammar()
else: else:
opgrammar = TimeGrammar("CURRENT", "C", "RIGHT NOW") opgrammar = TimeGrammar("CURRENT", "C", "RIGHT NOW")
self.textArea.append(convertTags(chum.memobanmsg(opchum, opgrammar, systemColor, grammar))) msg = chum.memobanmsg(opchum, opgrammar, systemColor, grammar)
self.textArea.append(convertTags(msg))
self.mainwindow.chatlog.log(self.channel, convertTags(msg, "bbcode"))
ttracker.removeTime(ttracker.getTime()) ttracker.removeTime(ttracker.getTime())
if chum is self.mainwindow.profile(): if chum is self.mainwindow.profile():
@ -599,7 +613,9 @@ class PesterMemo(PesterConvo):
self.resetSlider(curtime) self.resetSlider(curtime)
self.mainwindow.joinChannel.emit(self.channel) self.mainwindow.joinChannel.emit(self.channel)
me = self.mainwindow.profile() me = self.mainwindow.profile()
self.textArea.append(convertTags(me.memoopenmsg(systemColor, self.time.getTime(), self.time.getGrammar(), self.mainwindow.theme["convo/text/openmemo"], self.channel))) msg = me.memoopenmsg(systemColor, self.time.getTime(), self.time.getGrammar(), self.mainwindow.theme["convo/text/openmemo"], self.channel)
self.textArea.append(convertTags(msg))
self.mainwindow.chatlog.log(self.channel, convertTags(msg, "bbcode"))
elif ret == QtGui.QMessageBox.Cancel: elif ret == QtGui.QMessageBox.Cancel:
if self.parent(): if self.parent():
i = self.parent().tabIndices[self.channel] i = self.parent().tabIndices[self.channel]
@ -639,7 +655,9 @@ class PesterMemo(PesterConvo):
time = txt2delta(self.timeinput.text()) time = txt2delta(self.timeinput.text())
present = self.time.addTime(time) present = self.time.addTime(time)
if not present: if not present:
self.textArea.append(convertTags(me.memojoinmsg(systemColor, time, self.time.getGrammar(), self.mainwindow.theme["convo/text/joinmemo"]))) msg = me.memojoinmsg(systemColor, time, self.time.getGrammar(), self.mainwindow.theme["convo/text/joinmemo"])
self.textArea.append(convertTags(msg))
self.mainwindow.chatlog.log(self.channel, convertTags(msg, "bbcode"))
serverText = "PESTERCHUM:TIME>"+delta2txt(time, "server") serverText = "PESTERCHUM:TIME>"+delta2txt(time, "server")
self.messageSent.emit(serverText, self.title()) self.messageSent.emit(serverText, self.title())
@ -651,7 +669,9 @@ class PesterMemo(PesterConvo):
if removed: if removed:
grammar = self.time.getGrammarTime(time) grammar = self.time.getGrammarTime(time)
systemColor = QtGui.QColor(self.mainwindow.theme["memos/systemMsgColor"]) systemColor = QtGui.QColor(self.mainwindow.theme["memos/systemMsgColor"])
self.textArea.append(convertTags(me.memoclosemsg(systemColor, grammar, self.mainwindow.theme["convo/text/closememo"]))) msg = me.memoclosemsg(systemColor, grammar, self.mainwindow.theme["convo/text/closememo"])
self.textArea.append(convertTags(msg))
self.mainwindow.chatlog.log(self.channel, convertTags(msg, "bbcode"))
newtime = self.time.getTime() newtime = self.time.getTime()
if newtime is None: if newtime is None:

BIN
memos.pyc

Binary file not shown.

View file

@ -187,6 +187,7 @@ class PesterChooseProfile(QtGui.QDialog):
self.parent = parent self.parent = parent
self.setStyleSheet(self.theme["main/defaultwindow/style"]) self.setStyleSheet(self.theme["main/defaultwindow/style"])
self.currentHandle = QtGui.QLabel("CHANGING FROM %s" % userprofile.chat.handle)
self.chumHandle = QtGui.QLineEdit(self) self.chumHandle = QtGui.QLineEdit(self)
self.chumHandle.setMinimumWidth(200) self.chumHandle.setMinimumWidth(200)
self.chumHandleLabel = QtGui.QLabel(self.theme["main/mychumhandle/label/text"], self) self.chumHandleLabel = QtGui.QLabel(self.theme["main/mychumhandle/label/text"], self)
@ -232,6 +233,8 @@ class PesterChooseProfile(QtGui.QDialog):
if collision: if collision:
collision_warning = QtGui.QLabel("%s is taken already! Pick a new profile." % (collision)) collision_warning = QtGui.QLabel("%s is taken already! Pick a new profile." % (collision))
layout_0.addWidget(collision_warning) layout_0.addWidget(collision_warning)
else:
layout_0.addWidget(self.currentHandle, alignment=QtCore.Qt.AlignHCenter)
layout_0.addLayout(layout_1) layout_0.addLayout(layout_1)
if avail_profiles: if avail_profiles:
profileLabel = QtGui.QLabel("Or choose an existing profile:", self) profileLabel = QtGui.QLabel("Or choose an existing profile:", self)
@ -389,7 +392,7 @@ class PesterUserlist(QtGui.QDialog):
addChum = QtCore.pyqtSignal(QtCore.QString) addChum = QtCore.pyqtSignal(QtCore.QString)
class PesterMemoList(QtGui.QDialog): class PesterMemoList(QtGui.QDialog):
def __init__(self, parent): def __init__(self, parent, channel=""):
QtGui.QDialog.__init__(self, parent) QtGui.QDialog.__init__(self, parent)
self.setModal(False) self.setModal(False)
self.theme = parent.theme self.theme = parent.theme
@ -406,7 +409,8 @@ class PesterMemoList(QtGui.QDialog):
self, QtCore.SLOT('joinActivatedMemo(QListWidgetItem *)')) self, QtCore.SLOT('joinActivatedMemo(QListWidgetItem *)'))
self.orjoinlabel = QtGui.QLabel("OR MAKE A NEW MEMO:") self.orjoinlabel = QtGui.QLabel("OR MAKE A NEW MEMO:")
self.newmemo = QtGui.QLineEdit(self) self.newmemo = QtGui.QLineEdit(channel, self)
self.secretChannel = QtGui.QCheckBox("HIDDEN?", self)
self.timelabel = QtGui.QLabel("TIMEFRAME:") self.timelabel = QtGui.QLabel("TIMEFRAME:")
self.timeslider = TimeSlider(QtCore.Qt.Horizontal, self) self.timeslider = TimeSlider(QtCore.Qt.Horizontal, self)
@ -428,6 +432,7 @@ class PesterMemoList(QtGui.QDialog):
layout_0.addWidget(self.channelarea) layout_0.addWidget(self.channelarea)
layout_0.addWidget(self.orjoinlabel) layout_0.addWidget(self.orjoinlabel)
layout_0.addWidget(self.newmemo) layout_0.addWidget(self.newmemo)
layout_0.addWidget(self.secretChannel)
layout_0.addWidget(self.timelabel) layout_0.addWidget(self.timelabel)
layout_0.addWidget(self.timeslider) layout_0.addWidget(self.timeslider)
layout_0.addWidget(self.timeinput) layout_0.addWidget(self.timeinput)

BIN
menus.pyc

Binary file not shown.

View file

@ -41,6 +41,12 @@ def channel_list(cli):
def kick(cli, handle, channel): def kick(cli, handle, channel):
cli.send("KICK %s %s" % (channel, handle)) cli.send("KICK %s %s" % (channel, handle))
def mode(cli, channel, mode, options=None):
cmd = "MODE %s %s" % (channel, mode)
if options:
cmd += " %s" % (options)
cli.send(cmd)
def msgrandom(cli, choices, dest, user=None): def msgrandom(cli, choices, dest, user=None):
o = "%s: " % user if user else "" o = "%s: " % user if user else ""
o += random.choice(choices) o += random.choice(choices)

Binary file not shown.

View file

@ -5,6 +5,7 @@ from PyQt4 import QtGui
_ctag_begin = re.compile(r'<c=(.*?)>') _ctag_begin = re.compile(r'<c=(.*?)>')
_ctag_rgb = re.compile(r'\d+,\d+,\d+') _ctag_rgb = re.compile(r'\d+,\d+,\d+')
_urlre = re.compile(r"(?i)(http://[^\s<]+)") _urlre = re.compile(r"(?i)(http://[^\s<]+)")
_memore = re.compile(r" (#[A-Za-z0-9_]+)")
def convertTags(string, format="html"): def convertTags(string, format="html"):
if format not in ["html", "bbcode", "ctag"]: if format not in ["html", "bbcode", "ctag"]:
@ -40,6 +41,10 @@ def convertTags(string, format="html"):
elif format=="ctag": elif format=="ctag":
return matchobj.group(1) return matchobj.group(1)
string = _urlre.sub(urlrep, string) string = _urlre.sub(urlrep, string)
if format == "html":
print string
string = _memore.sub(r" <a href='\1'>\1</a>", string)
print string
return string return string
def escapeBrackets(string): def escapeBrackets(string):

Binary file not shown.

View file

@ -1 +1 @@
{"tabs": false, "chums": ["aquaMarinist", "marineAquist", "unknownTraveler", "tentacleTherapist", "macruralAlchemist", "vaginalEngineer", "mechanicalSpectacle", "carcinoGeneticist", "schlagzeugGator", "gamblingGenocider", "gardenGnostic", "superGhost", "centaursTesticle", "arachnidsGrip", "grimAuxiliatrix", "remoteBloodbath", "nitroZealist", "greenZephyr", "arsenicCatnip", "adiosToreador", "cuttlefishCuller", "rageInducer", "gallowsCalibrator", "caligulasAquarium", "terminallyCapricious", "illuminatedWax", "illuminatedWax"], "defaultprofile": "testProfile", "block": []} {"tabs": false, "chums": ["marineAquist", "unknownTraveler", "tentacleTherapist", "macruralAlchemist", "vaginalEngineer", "mechanicalSpectacle", "carcinoGeneticist", "schlagzeugGator", "gamblingGenocider", "gardenGnostic", "superGhost", "centaursTesticle", "arachnidsGrip", "grimAuxiliatrix", "remoteBloodbath", "nitroZealist", "greenZephyr", "arsenicCatnip", "adiosToreador", "cuttlefishCuller", "rageInducer", "gallowsCalibrator", "caligulasAquarium", "terminallyCapricious", "illuminatedWax", "testOut", "aquaMarinist"], "defaultprofile": "testProfile", "block": []}

View file

@ -7,6 +7,7 @@ from string import Template
import random import random
import json import json
import re import re
import socket
from PyQt4 import QtGui, QtCore from PyQt4 import QtGui, QtCore
import pygame import pygame
@ -52,11 +53,11 @@ class NoneSound(object):
class PesterLog(object): class PesterLog(object):
def __init__(self, handle): def __init__(self, handle):
self.handle = handle self.handle = handle
if not os.path.exists("logs/%s" % (handle)):
os.mkdir("logs/%s" % (handle))
self.convos = {} self.convos = {}
def log(self, handle, msg): def log(self, handle, msg):
if not self.convos.has_key(handle): if not self.convos.has_key(handle):
if not os.path.exists("logs/%s" % (self.handle)):
os.mkdir("logs/%s" % (self.handle))
time = datetime.now().strftime("%Y-%m-%d.%H.%M.txt") time = datetime.now().strftime("%Y-%m-%d.%H.%M.txt")
if not os.path.exists("logs/%s/%s" % (self.handle, handle)): if not os.path.exists("logs/%s/%s" % (self.handle, handle)):
os.mkdir("logs/%s/%s" % (self.handle, handle)) os.mkdir("logs/%s/%s" % (self.handle, handle))
@ -126,7 +127,20 @@ class pesterTheme(dict):
s = Template(v) s = Template(v)
d[k] = s.safe_substitute(path=self.path) d[k] = s.safe_substitute(path=self.path)
return d return d
def get(self, key, default):
try:
ret = self[key]
except KeyError:
return default
else:
return ret
def has_key(self, key):
try:
self[key]
except KeyError:
return False
else:
return True
class userConfig(object): class userConfig(object):
def __init__(self): def __init__(self):
@ -147,8 +161,9 @@ class userConfig(object):
def tabs(self): def tabs(self):
return self.config["tabs"] return self.config["tabs"]
def addChum(self, chum): def addChum(self, chum):
newchums = self.config['chums'] + [chum.handle] if chum.handle not in self.config['chums']:
self.set("chums", newchums) newchums = self.config['chums'] + [chum.handle]
self.set("chums", newchums)
def removeChum(self, chum): def removeChum(self, chum):
if type(chum) is PesterProfile: if type(chum) is PesterProfile:
handle = chum.handle handle = chum.handle
@ -518,6 +533,9 @@ class PesterMoodHandler(QtCore.QObject):
newbutton.setSelected(True) newbutton.setSelected(True)
newmood = Mood(m) newmood = Mood(m)
self.mainwindow.userprofile.chat.mood = newmood self.mainwindow.userprofile.chat.mood = newmood
if self.mainwindow.currentMoodIcon:
moodicon = newmood.icon(self.mainwindow.theme)
self.mainwindow.currentMoodIcon.setPixmap(moodicon.pixmap(moodicon.realsize()))
self.mainwindow.moodUpdated.emit() self.mainwindow.moodUpdated.emit()
class PesterMoodButton(QtGui.QPushButton): class PesterMoodButton(QtGui.QPushButton):
@ -577,6 +595,7 @@ class PesterWindow(MovingWindow):
self.tabconvo = None self.tabconvo = None
self.tabmemo = None self.tabmemo = None
self.setAutoFillBackground(True)
self.setObjectName("main") self.setObjectName("main")
self.config = userConfig() self.config = userConfig()
if self.config.defaultprofile(): if self.config.defaultprofile():
@ -606,6 +625,9 @@ class PesterWindow(MovingWindow):
self.memoaction = memoaction self.memoaction = memoaction
self.connect(memoaction, QtCore.SIGNAL('triggered()'), self.connect(memoaction, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('showMemos()')) self, QtCore.SLOT('showMemos()'))
self.importaction = QtGui.QAction(self.theme["main/menus/client/import"], self)
self.connect(self.importaction, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('importExternalConfig()'))
self.menu = QtGui.QMenuBar(self) self.menu = QtGui.QMenuBar(self)
filemenu = self.menu.addMenu(self.theme["main/menus/client/_name"]) filemenu = self.menu.addMenu(self.theme["main/menus/client/_name"])
@ -613,6 +635,7 @@ class PesterWindow(MovingWindow):
filemenu.addAction(opts) filemenu.addAction(opts)
filemenu.addAction(memoaction) filemenu.addAction(memoaction)
filemenu.addAction(userlistaction) filemenu.addAction(userlistaction)
filemenu.addAction(self.importaction)
filemenu.addAction(exitaction) filemenu.addAction(exitaction)
changetheme = QtGui.QAction(self.theme["main/menus/profile/theme"], self) changetheme = QtGui.QAction(self.theme["main/menus/profile/theme"], self)
@ -718,6 +741,10 @@ class PesterWindow(MovingWindow):
else: else:
for m in self.memos.values(): for m in self.memos.values():
m.close() m.close()
def paintEvent(self, event):
palette = QtGui.QPalette()
palette.setBrush(QtGui.QPalette.Window, QtGui.QBrush(self.backgroundImage))
self.setPalette(palette)
def closeEvent(self, event): def closeEvent(self, event):
self.closeConversations() self.closeConversations()
@ -793,7 +820,7 @@ class PesterWindow(MovingWindow):
self.connect(self.tabmemo, QtCore.SIGNAL('windowClosed()'), self.connect(self.tabmemo, QtCore.SIGNAL('windowClosed()'),
self, QtCore.SLOT('memoTabsClosed()')) self, QtCore.SLOT('memoTabsClosed()'))
def newMemo(self, channel, timestr): def newMemo(self, channel, timestr, secret=False):
if channel == "#pesterchum": if channel == "#pesterchum":
return return
if self.memos.has_key(channel): if self.memos.has_key(channel):
@ -820,6 +847,10 @@ class PesterWindow(MovingWindow):
# chat client send memo open # chat client send memo open
self.memos[channel] = memoWindow self.memos[channel] = memoWindow
self.joinChannel.emit(channel) # race condition? self.joinChannel.emit(channel) # race condition?
self.secret = secret
if self.secret:
self.secret = True
self.setChannelMode.emit(channel, "+s", "")
memoWindow.sendTimeInfo() memoWindow.sendTimeInfo()
memoWindow.show() memoWindow.show()
@ -845,7 +876,10 @@ class PesterWindow(MovingWindow):
self.resize(*theme["main/size"]) self.resize(*theme["main/size"])
self.setWindowIcon(PesterIcon(theme["main/icon"])) self.setWindowIcon(PesterIcon(theme["main/icon"]))
self.setWindowTitle(theme["main/windowtitle"]) self.setWindowTitle(theme["main/windowtitle"])
self.setStyleSheet("QFrame#main { "+theme["main/style"]+" }") self.setStyleSheet("QFrame#main { %s }" % (theme["main/style"]))
self.backgroundImage = QtGui.QPixmap(theme["main/background-image"])
self.backgroundMask = self.backgroundImage.mask()
self.setMask(self.backgroundMask)
self.menu.setStyleSheet("QMenuBar { background: transparent; %s } QMenuBar::item { background: transparent; %s } " % (theme["main/menubar/style"], theme["main/menu/menuitem"]) + "QMenu { background: transparent; %s } QMenu::item::selected { %s }" % (theme["main/menu/style"], theme["main/menu/selected"])) self.menu.setStyleSheet("QMenuBar { background: transparent; %s } QMenuBar::item { background: transparent; %s } " % (theme["main/menubar/style"], theme["main/menu/menuitem"]) + "QMenu { background: transparent; %s } QMenu::item::selected { %s }" % (theme["main/menu/style"], theme["main/menu/selected"]))
newcloseicon = PesterIcon(theme["main/close/image"]) newcloseicon = PesterIcon(theme["main/close/image"])
self.closeButton.setIcon(newcloseicon) self.closeButton.setIcon(newcloseicon)
@ -861,6 +895,7 @@ class PesterWindow(MovingWindow):
self.exitaction.setText(theme["main/menus/client/exit"]) self.exitaction.setText(theme["main/menus/client/exit"])
self.userlistaction.setText(theme["main/menus/client/userlist"]) self.userlistaction.setText(theme["main/menus/client/userlist"])
self.memoaction.setText(theme["main/menus/client/memos"]) self.memoaction.setText(theme["main/menus/client/memos"])
self.importaction.setText(theme["main/menus/client/import"])
self.filemenu.setTitle(theme["main/menus/client/_name"]) self.filemenu.setTitle(theme["main/menus/client/_name"])
self.changetheme.setText(theme["main/menus/profile/theme"]) self.changetheme.setText(theme["main/menus/profile/theme"])
self.changequirks.setText(theme["main/menus/profile/quirks"]) self.changequirks.setText(theme["main/menus/profile/quirks"])
@ -879,18 +914,27 @@ class PesterWindow(MovingWindow):
self.moods = PesterMoodHandler(self, *[PesterMoodButton(self, **d) for d in theme["main/moods"]]) self.moods = PesterMoodHandler(self, *[PesterMoodButton(self, **d) for d in theme["main/moods"]])
self.moods.showButtons() self.moods.showButtons()
# chum # chum
addChumStyle = "QPushButton { %s }" % (theme["main/addchum/style"])
if theme.has_key("main/addchum/pressed"):
addChumStyle += "QPushButton:pressed { %s }" % (theme["main/addchum/pressed"])
pesterButtonStyle = "QPushButton { %s }" % (theme["main/pester/style"])
if theme.has_key("main/pester/pressed"):
pesterButtonStyle += "QPushButton:pressed { %s }" % (theme["main/pester/pressed"])
blockButtonStyle = "QPushButton { %s }" % (theme["main/block/style"])
if theme.has_key("main/block/pressed"):
pesterButtonStyle += "QPushButton:pressed { %s }" % (theme["main/block/pressed"])
self.addChumButton.setText(theme["main/addchum/text"]) self.addChumButton.setText(theme["main/addchum/text"])
self.addChumButton.resize(*theme["main/addchum/size"]) self.addChumButton.resize(*theme["main/addchum/size"])
self.addChumButton.move(*theme["main/addchum/loc"]) self.addChumButton.move(*theme["main/addchum/loc"])
self.addChumButton.setStyleSheet(theme["main/addchum/style"]) self.addChumButton.setStyleSheet(addChumStyle)
self.pesterButton.setText(theme["main/pester/text"]) self.pesterButton.setText(theme["main/pester/text"])
self.pesterButton.resize(*theme["main/pester/size"]) self.pesterButton.resize(*theme["main/pester/size"])
self.pesterButton.move(*theme["main/pester/loc"]) self.pesterButton.move(*theme["main/pester/loc"])
self.pesterButton.setStyleSheet(theme["main/pester/style"]) self.pesterButton.setStyleSheet(pesterButtonStyle)
self.blockButton.setText(theme["main/block/text"]) self.blockButton.setText(theme["main/block/text"])
self.blockButton.resize(*theme["main/block/size"]) self.blockButton.resize(*theme["main/block/size"])
self.blockButton.move(*theme["main/block/loc"]) self.blockButton.move(*theme["main/block/loc"])
self.blockButton.setStyleSheet(theme["main/block/style"]) self.blockButton.setStyleSheet(blockButtonStyle)
# buttons # buttons
self.mychumhandleLabel.setText(theme["main/mychumhandle/label/text"]) self.mychumhandleLabel.setText(theme["main/mychumhandle/label/text"])
self.mychumhandleLabel.move(*theme["main/mychumhandle/label/loc"]) self.mychumhandleLabel.move(*theme["main/mychumhandle/label/loc"])
@ -902,6 +946,18 @@ class PesterWindow(MovingWindow):
self.mychumcolor.resize(*theme["main/mychumhandle/colorswatch/size"]) self.mychumcolor.resize(*theme["main/mychumhandle/colorswatch/size"])
self.mychumcolor.move(*theme["main/mychumhandle/colorswatch/loc"]) self.mychumcolor.move(*theme["main/mychumhandle/colorswatch/loc"])
self.mychumcolor.setStyleSheet("background: %s" % (self.profile().colorhtml())) self.mychumcolor.setStyleSheet("background: %s" % (self.profile().colorhtml()))
if self.theme.has_key("main/mychumhandle/currentMood"):
moodicon = self.profile().mood.icon(theme)
self.currentMoodIcon = QtGui.QLabel(self)
self.currentMoodIcon.setPixmap(moodicon.pixmap(moodicon.realsize()))
self.currentMoodIcon.move(*theme["main/mychumhandle/currentMood"])
self.currentMoodIcon.show()
else:
if hasattr(self, 'currentMoodIcon') and self.currentMoodIcon:
self.currentMoodIcon.hide()
self.currentMoodIcon = None
if theme["main/mychumhandle/colorswatch/text"]: if theme["main/mychumhandle/colorswatch/text"]:
self.mychumcolor.setText(theme["main/mychumhandle/colorswatch/text"]) self.mychumcolor.setText(theme["main/mychumhandle/colorswatch/text"])
@ -915,6 +971,8 @@ class PesterWindow(MovingWindow):
self.theme = theme self.theme = theme
# do self # do self
self.initTheme(theme) self.initTheme(theme)
# set mood
self.moods.updateMood(theme['main/defaultmood'])
# chum area # chum area
self.chumList.changeTheme(theme) self.chumList.changeTheme(theme)
# do open windows # do open windows
@ -1136,12 +1194,22 @@ class PesterWindow(MovingWindow):
self.unblockedChum.emit(handle) self.unblockedChum.emit(handle)
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def showMemos(self): def importExternalConfig(self):
f = QtGui.QFileDialog.getOpenFileName(self)
fp = open(f, 'r')
for l in fp.xreadlines():
# import chumlist
chum_mo = re.match("handle: ([A-Za-z0-9]+)", l)
if chum_mo is not None:
chum = PesterProfile(chum_mo.group(1))
self.addChum(chum)
@QtCore.pyqtSlot()
def showMemos(self, channel=""):
if not hasattr(self, 'memochooser'): if not hasattr(self, 'memochooser'):
self.memochooser = None self.memochooser = None
if self.memochooser: if self.memochooser:
return return
self.memochooser = PesterMemoList(self) self.memochooser = PesterMemoList(self, channel)
self.connect(self.memochooser, QtCore.SIGNAL('accepted()'), self.connect(self.memochooser, QtCore.SIGNAL('accepted()'),
self, QtCore.SLOT('joinSelectedMemo()')) self, QtCore.SLOT('joinSelectedMemo()'))
self.connect(self.memochooser, QtCore.SIGNAL('rejected()'), self.connect(self.memochooser, QtCore.SIGNAL('rejected()'),
@ -1153,9 +1221,11 @@ class PesterWindow(MovingWindow):
newmemo = self.memochooser.newmemoname() newmemo = self.memochooser.newmemoname()
selectedmemo = self.memochooser.selectedmemo() selectedmemo = self.memochooser.selectedmemo()
time = unicode(self.memochooser.timeinput.text()) time = unicode(self.memochooser.timeinput.text())
secret = self.memochooser.secretChannel.isChecked()
if newmemo: if newmemo:
channel = "#"+unicode(newmemo).replace(" ", "_") channel = "#"+unicode(newmemo).replace(" ", "_")
self.newMemo(channel, time) channel = re.sub(r"[^A-Za-z0-9#_]", "", channel)
self.newMemo(channel, time, secret=secret)
elif selectedmemo: elif selectedmemo:
channel = "#"+unicode(selectedmemo.text()) channel = "#"+unicode(selectedmemo.text())
self.newMemo(channel, time) self.newMemo(channel, time)
@ -1415,6 +1485,7 @@ class PesterWindow(MovingWindow):
kickUser = QtCore.pyqtSignal(QtCore.QString, QtCore.QString) kickUser = QtCore.pyqtSignal(QtCore.QString, QtCore.QString)
joinChannel = QtCore.pyqtSignal(QtCore.QString) joinChannel = QtCore.pyqtSignal(QtCore.QString)
leftChannel = QtCore.pyqtSignal(QtCore.QString) leftChannel = QtCore.pyqtSignal(QtCore.QString)
setChannelMode = QtCore.pyqtSignal(QtCore.QString, QtCore.QString, QtCore.QString)
class IRCThread(QtCore.QThread): class IRCThread(QtCore.QThread):
def __init__(self, ircobj): def __init__(self, ircobj):
@ -1422,8 +1493,12 @@ class IRCThread(QtCore.QThread):
self.irc = ircobj self.irc = ircobj
def run(self): def run(self):
irc = self.irc irc = self.irc
irc.IRCConnect()
while 1: while 1:
irc.updateIRC() try:
irc.updateIRC()
except socket.error:
self.exit(1)
class PesterTray(QtGui.QSystemTrayIcon): class PesterTray(QtGui.QSystemTrayIcon):
def __init__(self, icon, mainwindow, parent): def __init__(self, icon, mainwindow, parent):
@ -1440,134 +1515,161 @@ class PesterTray(QtGui.QSystemTrayIcon):
else: else:
self.setIcon(PesterIcon(self.mainwindow.theme["main/newmsgicon"])) self.setIcon(PesterIcon(self.mainwindow.theme["main/newmsgicon"]))
def main(): class MainProgram(QtCore.QObject):
def __init__(self):
QtCore.QObject.__init__(self)
self.app = QtGui.QApplication(sys.argv)
if pygame.mixer:
# we could set the frequency higher but i love how cheesy it sounds
try:
pygame.mixer.init()
except pygame.error, e:
print "Warning: No sound! %s" % (e)
else:
print "Warning: No sound!"
self.widget = PesterWindow()
self.widget.show()
app = QtGui.QApplication(sys.argv) self.trayicon = PesterTray(PesterIcon(self.widget.theme["main/icon"]), self.widget, self.app)
if pygame.mixer: self.trayicon.show()
# we could set the frequency higher but i love how cheesy it sounds self.trayicon.connect(self.trayicon,
pygame.mixer.init() QtCore.SIGNAL('activated(QSystemTrayIcon::ActivationReason)'),
else: self.widget,
print "Warning: No sound!" QtCore.SLOT('systemTrayActivated(QSystemTrayIcon::ActivationReason)'))
widget = PesterWindow() self.trayicon.connect(self.widget,
widget.show() QtCore.SIGNAL('trayIconSignal(int)'),
self.trayicon,
QtCore.SLOT('changeTrayIcon(int)'))
trayicon = PesterTray(PesterIcon(widget.theme["main/icon"]), widget, app) self.irc = PesterIRC(self.widget)
trayicon.show() self.connectWidgets(self.irc, self.widget)
self.ircapp = IRCThread(self.irc)
self.connect(self.ircapp, QtCore.SIGNAL('finished()'),
self, QtCore.SLOT('restartIRC()'))
trayicon.connect(trayicon, def connectWidgets(self, irc, widget):
QtCore.SIGNAL('activated(QSystemTrayIcon::ActivationReason)'), irc.connect(widget, QtCore.SIGNAL('sendMessage(QString, QString)'),
widget, irc, QtCore.SLOT('sendMessage(QString, QString)'))
QtCore.SLOT('systemTrayActivated(QSystemTrayIcon::ActivationReason)')) irc.connect(widget,
trayicon.connect(widget, QtCore.SIGNAL('newConvoStarted(QString, bool)'),
QtCore.SIGNAL('trayIconSignal(int)'), irc, QtCore.SLOT('startConvo(QString, bool)'))
trayicon, irc.connect(widget,
QtCore.SLOT('changeTrayIcon(int)')) QtCore.SIGNAL('convoClosed(QString)'),
irc, QtCore.SLOT('endConvo(QString)'))
irc.connect(widget,
QtCore.SIGNAL('profileChanged()'),
irc,
QtCore.SLOT('updateProfile()'))
irc.connect(widget,
QtCore.SIGNAL('moodRequest(PyQt_PyObject)'),
irc,
QtCore.SLOT('getMood(PyQt_PyObject)'))
irc.connect(widget,
QtCore.SIGNAL('moodsRequest(PyQt_PyObject)'),
irc,
QtCore.SLOT('getMoods(PyQt_PyObject)'))
irc.connect(widget,
QtCore.SIGNAL('moodUpdated()'),
irc,
QtCore.SLOT('updateMood()'))
irc.connect(widget,
QtCore.SIGNAL('mycolorUpdated()'),
irc,
QtCore.SLOT('updateColor()'))
irc.connect(widget,
QtCore.SIGNAL('blockedChum(QString)'),
irc,
QtCore.SLOT('blockedChum(QString)'))
irc.connect(widget,
QtCore.SIGNAL('unblockedChum(QString)'),
irc,
QtCore.SLOT('unblockedChum(QString)'))
irc.connect(widget,
QtCore.SIGNAL('requestNames(QString)'),
irc,
QtCore.SLOT('requestNames(QString)'))
irc.connect(widget,
QtCore.SIGNAL('requestChannelList()'),
irc,
QtCore.SLOT('requestChannelList()'))
irc.connect(widget,
QtCore.SIGNAL('joinChannel(QString)'),
irc,
QtCore.SLOT('joinChannel(QString)'))
irc.connect(widget,
QtCore.SIGNAL('leftChannel(QString)'),
irc,
QtCore.SLOT('leftChannel(QString)'))
irc.connect(widget,
QtCore.SIGNAL('kickUser(QString, QString)'),
irc,
QtCore.SLOT('kickUser(QString, QString)'))
irc.connect(widget,
QtCore.SIGNAL('setChannelMode(QString, QString, QString)'),
irc,
QtCore.SLOT('setChannelMode(QString, QString, QString)'))
irc = PesterIRC(widget) # IRC --> Main window
irc.IRCConnect() irc.connect(irc, QtCore.SIGNAL('connected()'),
irc.connect(widget, QtCore.SIGNAL('sendMessage(QString, QString)'), widget, QtCore.SLOT('connected()'))
irc, QtCore.SLOT('sendMessage(QString, QString)')) irc.connect(irc,
irc.connect(widget, QtCore.SIGNAL('moodUpdated(QString, PyQt_PyObject)'),
QtCore.SIGNAL('newConvoStarted(QString, bool)'), widget,
irc, QtCore.SLOT('startConvo(QString, bool)')) QtCore.SLOT('updateMoodSlot(QString, PyQt_PyObject)'))
irc.connect(widget, irc.connect(irc,
QtCore.SIGNAL('convoClosed(QString)'), QtCore.SIGNAL('colorUpdated(QString, QColor)'),
irc, QtCore.SLOT('endConvo(QString)')) widget,
irc.connect(widget, QtCore.SLOT('updateColorSlot(QString, QColor)'))
QtCore.SIGNAL('profileChanged()'), irc.connect(irc,
irc, QtCore.SIGNAL('messageReceived(QString, QString)'),
QtCore.SLOT('updateProfile()')) widget,
irc.connect(widget, QtCore.SLOT('deliverMessage(QString, QString)'))
QtCore.SIGNAL('moodRequest(PyQt_PyObject)'), irc.connect(irc,
irc, QtCore.SIGNAL('memoReceived(QString, QString, QString)'),
QtCore.SLOT('getMood(PyQt_PyObject)')) widget,
irc.connect(widget, QtCore.SLOT('deliverMemo(QString, QString, QString)'))
QtCore.SIGNAL('moodsRequest(PyQt_PyObject)'), irc.connect(irc,
irc, QtCore.SIGNAL('nickCollision(QString, QString)'),
QtCore.SLOT('getMoods(PyQt_PyObject)')) widget,
irc.connect(widget, QtCore.SLOT('nickCollision(QString, QString)'))
QtCore.SIGNAL('moodUpdated()'), irc.connect(irc,
irc, QtCore.SIGNAL('namesReceived(QString, PyQt_PyObject)'),
QtCore.SLOT('updateMood()')) widget,
irc.connect(widget, QtCore.SLOT('updateNames(QString, PyQt_PyObject)'))
QtCore.SIGNAL('mycolorUpdated()'), irc.connect(irc,
irc, QtCore.SIGNAL('userPresentUpdate(QString, QString, QString)'),
QtCore.SLOT('updateColor()')) widget,
irc.connect(widget, QtCore.SLOT('userPresentUpdate(QString, QString, QString)'))
QtCore.SIGNAL('blockedChum(QString)'), irc.connect(irc,
irc, QtCore.SIGNAL('channelListReceived(PyQt_PyObject)'),
QtCore.SLOT('blockedChum(QString)')) widget,
irc.connect(widget, QtCore.SLOT('updateChannelList(PyQt_PyObject)'))
QtCore.SIGNAL('unblockedChum(QString)'), irc.connect(irc,
irc, QtCore.SIGNAL('timeCommand(QString, QString, QString)'),
QtCore.SLOT('unblockedChum(QString)')) widget,
irc.connect(widget, QtCore.SLOT('timeCommand(QString, QString, QString)'))
QtCore.SIGNAL('requestNames(QString)'),
irc,
QtCore.SLOT('requestNames(QString)'))
irc.connect(widget,
QtCore.SIGNAL('requestChannelList()'),
irc,
QtCore.SLOT('requestChannelList()'))
irc.connect(widget,
QtCore.SIGNAL('joinChannel(QString)'),
irc,
QtCore.SLOT('joinChannel(QString)'))
irc.connect(widget,
QtCore.SIGNAL('leftChannel(QString)'),
irc,
QtCore.SLOT('leftChannel(QString)'))
irc.connect(widget,
QtCore.SIGNAL('kickUser(QString, QString)'),
irc,
QtCore.SLOT('kickUser(QString, QString)'))
# IRC --> Main window @QtCore.pyqtSlot()
irc.connect(irc, QtCore.SIGNAL('connected()'), def restartIRC(self):
widget, QtCore.SLOT('connected()')) self.widget.show()
irc.connect(irc, self.widget.activateWindow()
QtCore.SIGNAL('moodUpdated(QString, PyQt_PyObject)'), self.irc = PesterIRC(self.widget)
widget, self.connectWidgets(self.irc, self.widget)
QtCore.SLOT('updateMoodSlot(QString, PyQt_PyObject)')) self.ircapp = IRCThread(self.irc)
irc.connect(irc, self.connect(self.ircapp, QtCore.SIGNAL('finished()'),
QtCore.SIGNAL('colorUpdated(QString, QColor)'), self, QtCore.SLOT('restartIRC()'))
widget, self.ircapp.start()
QtCore.SLOT('updateColorSlot(QString, QColor)')) status = self.widget.loadingscreen.exec_()
irc.connect(irc, if status == QtGui.QDialog.Rejected:
QtCore.SIGNAL('messageReceived(QString, QString)'), sys.exit(0)
widget,
QtCore.SLOT('deliverMessage(QString, QString)'))
irc.connect(irc,
QtCore.SIGNAL('memoReceived(QString, QString, QString)'),
widget,
QtCore.SLOT('deliverMemo(QString, QString, QString)'))
irc.connect(irc,
QtCore.SIGNAL('nickCollision(QString, QString)'),
widget,
QtCore.SLOT('nickCollision(QString, QString)'))
irc.connect(irc,
QtCore.SIGNAL('namesReceived(QString, PyQt_PyObject)'),
widget,
QtCore.SLOT('updateNames(QString, PyQt_PyObject)'))
irc.connect(irc,
QtCore.SIGNAL('userPresentUpdate(QString, QString, QString)'),
widget,
QtCore.SLOT('userPresentUpdate(QString, QString, QString)'))
irc.connect(irc,
QtCore.SIGNAL('channelListReceived(PyQt_PyObject)'),
widget,
QtCore.SLOT('updateChannelList(PyQt_PyObject)'))
irc.connect(irc,
QtCore.SIGNAL('timeCommand(QString, QString, QString)'),
widget,
QtCore.SLOT('timeCommand(QString, QString, QString)'))
ircapp = IRCThread(irc) def run(self):
ircapp.start() self.ircapp.start()
status = widget.loadingscreen.exec_() status = self.widget.loadingscreen.exec_()
if status == QtGui.QDialog.Rejected: if status == QtGui.QDialog.Rejected:
sys.exit(0) sys.exit(0)
sys.exit(app.exec_()) sys.exit(self.app.exec_())
main() pesterchum = MainProgram()
pesterchum.run()

View file

@ -1 +1 @@
{"color": "#ff00ff", "theme": "trollian", "quirks": [], "handle": "ghostDunk"} {"color": "#ff00ff", "theme": "pesterchum7", "quirks": [], "handle": "ghostDunk"}

View file

@ -0,0 +1 @@
{"color": "#aa00ff", "theme": "pesterchum", "quirks": [], "handle": "microMachines"}

View file

@ -1 +1 @@
{"color": "#aa00ff", "theme": "trollian", "quirks": [], "handle": "testProfile"} {"color": "#aa00ff", "theme": "pesterchum", "quirks": [], "handle": "testProfile"}

View file

@ -1,5 +1,6 @@
{"main": {"main":
{"style": "background-image:url($path/pcbg.png); background-repeat: no-repeat;", {"style": "background-repeat: no-repeat;",
"background-image": "$path/pcbg.png",
"size": [232, 380], "size": [232, 380],
"icon": "$path/trayicon.png", "icon": "$path/trayicon.png",
"newmsgicon": "$path/trayicon2.png", "newmsgicon": "$path/trayicon2.png",
@ -19,6 +20,7 @@
"options": "OPTIONS", "options": "OPTIONS",
"memos": "MEMOS", "memos": "MEMOS",
"userlist": "USERLIST", "userlist": "USERLIST",
"import": "IMPORT",
"exit": "EXIT"}, "exit": "EXIT"},
"profile": {"_name": "PROFILE", "profile": {"_name": "PROFILE",
"switch": "SWITCH", "switch": "SWITCH",
@ -31,7 +33,8 @@
"blockchum": "BLOCK", "blockchum": "BLOCK",
"addchum": "ADD CHUM", "addchum": "ADD CHUM",
"unblockchum": "UNBLOCK", "unblockchum": "UNBLOCK",
"banuser": "BAN USER" "banuser": "BAN USER",
"quirksoff": "QUIRKS OFF"
} }
}, },
"chums": { "style": "border:2px solid yellow; background-color: black;color: white;font: bold;font-family: 'Courier';selection-background-color:#646464; ", "chums": { "style": "border:2px solid yellow; background-color: black;color: white;font: bold;font-family: 'Courier';selection-background-color:#646464; ",
@ -94,13 +97,14 @@
}, },
"mychumhandle": { "label": { "text": "CHUMHANDLE:", "mychumhandle": { "label": { "text": "CHUMHANDLE:",
"loc": [19,232], "loc": [19,232],
"style": "color: rgba(255, 255, 0, 0%) ;font:bold; font-family: 'Courier';" }, "style": "color: rgba(255, 255, 0, 0%) ;font:bold; font-family: 'Courier';" },
"handle": { "style": "background: black; padding: 3px; color:white; font-family:'Courier'; font:bold; text-align:left;", "handle": { "style": "background: black; padding: 3px; color:white; font-family:'Courier'; font:bold; text-align:left;",
"loc": [14,246], "loc": [36,246],
"size": [190, 21] }, "size": [190, 21] },
"colorswatch": { "loc": [196,246], "colorswatch": { "loc": [196,246],
"size": [23,21], "size": [23,21],
"text": "" } "text": "" },
"currentMood": [18, 249]
}, },
"defaultwindow": { "style": "background: #fdb302; font-family:'Courier';font:bold;selection-background-color:#919191; " "defaultwindow": { "style": "background: #fdb302; font-family:'Courier';font:bold;selection-background-color:#919191; "
}, },
@ -110,6 +114,7 @@
"text": "" "text": ""
}, },
"pester": { "style": "background: rgba(255, 255, 0, 0%); border:2px solid #c48a00; font: bold; color: rgba(255, 255, 0, 0%); font-family:'Courier';", "pester": { "style": "background: rgba(255, 255, 0, 0%); border:2px solid #c48a00; font: bold; color: rgba(255, 255, 0, 0%); font-family:'Courier';",
"pressed" : "background: rgb(255, 255, 255, 30%);",
"loc": [150,202], "loc": [150,202],
"size": [71, 22], "size": [71, 22],
"text": "" "text": ""
@ -185,16 +190,17 @@
}, },
"convo": "convo":
{"style": "background-color: #fdb302; background-image:url($path/convobg.png); background-repeat: no-repeat; border:2px solid yellow; font-family: 'Courier'", {"style": "background-color: #fdb302; background-image:url($path/convobg.png); background-repeat: no-repeat; border:2px solid yellow; font-family: 'Courier'",
"scrollbar": { "style" : "", "handle": "" },
"margins": {"top": 0, "bottom": 6, "left": 0, "right": 0 }, "margins": {"top": 0, "bottom": 6, "left": 0, "right": 0 },
"size": [400, 250], "size": [520, 325],
"chumlabel": { "style": "background: rgb(196, 138, 0); color: white; border:0px; font-size: 12px;", "chumlabel": { "style": "background: rgb(196, 138, 0); color: white; border:0px; font-size: 14px;",
"align": { "h": "center", "v": "center" }, "align": { "h": "center", "v": "center" },
"minheight": 26, "minheight": 26,
"maxheight": 26, "maxheight": 26,
"text" : ":: $handle ::" "text" : ":: $handle ::"
}, },
"textarea": { "textarea": {
"style": "background: white; font:bold; border:2px solid #c48a00;text-align:center; margin-top:21px; margin-right:10px; margin-left:10px; font-size: 12px;" "style": "background: white; font:bold; border:2px solid #c48a00;text-align:center; margin-top:21px; margin-right:10px; margin-left:10px; font-size: 14px;"
}, },
"input": { "input": {
"style": "background: white; border:2px solid #c48a00;margin-top:3px; margin-right:10px; margin-left:10px; font-size: 12px;" "style": "background: white; border:2px solid #c48a00;margin-top:3px; margin-right:10px; margin-left:10px; font-size: 12px;"

Binary file not shown.

After

(image error) Size: 3.7 KiB

Binary file not shown.

After

(image error) Size: 126 B

Binary file not shown.

Binary file not shown.

After

(image error) Size: 97 B

Binary file not shown.

After

(image error) Size: 93 B

Binary file not shown.

After

(image error) Size: 97 B

Binary file not shown.

After

(image error) Size: 106 B

Binary file not shown.

After

(image error) Size: 472 B

Binary file not shown.

After

(image error) Size: 165 B

Binary file not shown.

After

(image error) Size: 127 B

Binary file not shown.

After

(image error) Size: 127 B

Binary file not shown.

After

(image error) Size: 93 B

Binary file not shown.

After

(image error) Size: 137 B

Binary file not shown.

After

(image error) Size: 46 KiB

BIN
themes/pesterchum7/h.gif Normal file

Binary file not shown.

After

(image error) Size: 101 B

Binary file not shown.

After

(image error) Size: 97 B

Binary file not shown.

After

(image error) Size: 2.8 KiB

BIN
themes/pesterchum7/m.gif Normal file

Binary file not shown.

After

(image error) Size: 44 B

Binary file not shown.

After

(image error) Size: 168 B

BIN
themes/pesterchum7/memo.png Normal file

Binary file not shown.

After

(image error) Size: 2.8 KiB

Binary file not shown.

After

(image error) Size: 125 B

Binary file not shown.

After

(image error) Size: 109 B

Binary file not shown.

After

(image error) Size: 110 B

Binary file not shown.

After

(image error) Size: 110 B

Binary file not shown.

After

(image error) Size: 110 B

Binary file not shown.

After

(image error) Size: 133 B

Binary file not shown.

After

(image error) Size: 95 B

Binary file not shown.

After

(image error) Size: 71 B

BIN
themes/pesterchum7/pcbg.png Normal file

Binary file not shown.

After

(image error) Size: 9 KiB

Binary file not shown.

After

(image error) Size: 127 B

Binary file not shown.

After

(image error) Size: 94 B

Binary file not shown.

After

(image error) Size: 92 B

Binary file not shown.

After

(image error) Size: 138 B

Binary file not shown.

After

(image error) Size: 125 B

Binary file not shown.

After

(image error) Size: 2.8 KiB

Binary file not shown.

After

(image error) Size: 134 B

Binary file not shown.

After

(image error) Size: 86 B

259
themes/pesterchum7/style.js Normal file
View file

@ -0,0 +1,259 @@
{"main":
{"style": "background-repeat: no-repeat;background-color:transparent;",
"background-image": "$path/gbgbig.png",
"size": [400, 348],
"icon": "$path/trayicon.png",
"newmsgicon": "$path/trayicon2.png",
"windowtitle": "PESTERCHUM",
"close": { "image": "$path/x.gif",
"loc": [378, 30]},
"minimize": { "image": "$path/m.gif",
"loc": [358, 25]},
"menubar": { "style": "font-family: 'Courier'; font:bold; font-size: 12px;" },
"menu" : { "style": "font-family: 'Courier'; font: bold; font-size: 12px; background-color: #fdb302;border:2px solid #ffff00",
"menuitem": "margin-right:10px;",
"selected": "background-color: #ffff00",
"loc": [120,25]
},
"sounds": { "alertsound": "$path/alarm.wav" },
"menus": {"client": {"_name": "CLIENT",
"options": "OPTIONS",
"memos": "MEMOS",
"userlist": "USERLIST",
"import": "IMPORT",
"exit": "EXIT"},
"profile": {"_name": "PROFILE",
"switch": "SWITCH",
"color": "COLOR",
"theme": "THEME",
"block": "TROLLSLUM",
"quirks": "QUIRKS"},
"rclickchumlist": {"pester": "PESTER",
"removechum": "REMOVE CHUM",
"blockchum": "BLOCK",
"addchum": "ADD CHUM",
"unblockchum": "UNBLOCK",
"banuser": "BAN USER"
}
},
"chums": { "style": "border:2px solid yellow; background-color: black;color: white;font: bold;font-family: 'Courier';selection-background-color:#646464; ",
"loc": [12, 117],
"size": [209, 82],
"userlistcolor": "white",
"moods": {
"chummy": { "icon": "$path/chummy.gif", "color": "white" },
"rancorous": { "icon": "$path/rancorous.gif", "color": "red" },
"offline": { "icon": "$path/offline.gif", "color": "#646464"},
"pleasant": { "icon": "$path/pleasant.gif", "color": "white" },
"distraught": { "icon": "$path/distraught.gif", "color": "white" },
"unruly": { "icon": "$path/unruly.gif", "color": "white" },
"smooth": { "icon": "$path/smooth.gif", "color": "white" },
"ecstatic": { "icon": "$path/ecstatic.gif", "color": "red" },
"relaxed": { "icon": "$path/relaxed.gif", "color": "red" },
"discontent": { "icon": "$path/discontent.gif", "color": "red" },
"devious": { "icon": "$path/devious.gif", "color": "red" },
"sleek": { "icon": "$path/sleek.gif", "color": "red" },
"detestful": { "icon": "$path/detestful.gif", "color": "red" },
"mirthful": { "icon": "$path/mirthful.gif", "color": "red" },
"manipulative": { "icon": "$path/manipulative.gif", "color": "red" },
"vigorous": { "icon": "$path/vigorous.gif", "color": "red" },
"perky": { "icon": "$path/perky.gif", "color": "red" },
"acceptant": { "icon": "$path/acceptant.gif", "color": "red" },
"protective": { "icon": "$path/protective.gif", "color": "#00ff00" },
"blocked": { "icon": "$path/blocked.gif", "color": "black" }
}
},
"trollslum": {
"style": "background: #fdb302; border:2px solid yellow; font-family: 'Courier'",
"size": [195, 200],
"label": { "text": "TROLLSLUM",
"style": "color: rgba(0, 0, 0, 100%) ;font:bold; font-family: 'Courier';border:0px;" },
"chumroll": {"style": "border:2px solid yellow; background-color: black;color: white;font: bold;font-family: 'Courier';selection-background-color:#646464; " }
},
"mychumhandle": { "label": { "text": "CHUMHANDLE:",
"loc": [19,232],
"style": "color: rgba(255, 255, 0, 0%) ;font:bold; font-family: 'Courier';" },
"handle": { "style": "background: black; padding: 3px; color:white; font-family:'Courier'; font:bold; text-align:left;",
"loc": [14,246],
"size": [190, 21] },
"colorswatch": { "loc": [196,246],
"size": [23,21],
"text": "" }
},
"defaultwindow": { "style": "background: #fdb302; font-family:'Courier';font:bold;selection-background-color:#919191; "
},
"addchum": { "style": "background: rgba(255, 255, 0, 0%); border:2px solid #c48a00; font: bold; color: rgba(0, 0, 0, 0%); font-family:'Courier';",
"loc": [12,202],
"size": [71, 22],
"text": ""
},
"pester": { "style": "background: rgba(255, 255, 0, 0%); border:2px solid #c48a00; font: bold; color: rgba(255, 255, 0, 0%); font-family:'Courier';",
"loc": [150,202],
"size": [71, 22],
"text": ""
},
"block": { "style": "background: rgba(255, 255, 0, 0%); border:2px solid #c48a00; font: bold; color: rgba(255, 255, 0, 0%); font-family:'Courier';",
"loc": [1500,202],
"size": [0, 0],
"text": ""
},
"defaultmood": 0,
"moodlabel": { "style": "",
"loc": [20, 430],
"text": "MOODS"
},
"moods": [
{ "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'",
"selected": "text-align:left; background-image:url($path/moodcheck1.gif); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
"loc": [12, 288],
"size": [104, 22],
"text": "CHUMMY",
"icon": "$path/chummy.gif",
"mood": 0
},
{ "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'",
"selected": "text-align:left; background-image:url($path/moodcheck2.gif); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
"loc": [12, 308],
"size": [104, 22],
"text": "PALSY",
"icon": "$path/chummy.gif",
"mood": 3
},
{ "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'",
"selected": "text-align:left; background-image:url($path/moodcheck3.gif); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
"loc": [12, 328],
"size": [104, 22],
"text": "CHIPPER",
"icon": "$path/chummy.gif",
"mood": 4
},
{ "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'",
"selected": "text-align:left; background-image:url($path/moodcheck2.gif); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
"loc": [117, 288],
"size": [104, 22],
"text": "BULLY",
"icon": "$path/chummy.gif",
"mood": 5
},
{ "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'",
"selected": "text-align:left; background-image:url($path/moodcheck2.gif); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
"loc": [117, 308],
"size": [104, 22],
"text": "PEPPY",
"icon": "$path/chummy.gif",
"mood": 6
},
{ "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'",
"selected": "text-align:left; background-image:url($path/moodcheck4.gif); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
"loc": [117, 328],
"size": [104, 22],
"text": "RANCOROUS",
"icon": "$path/rancorous.gif",
"mood": 1
},
{ "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'",
"selected": "text-align:left; background-image:url($path/moodcheck5.gif); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
"loc": [12, 348],
"size": [209, 22],
"text": "ABSCOND",
"icon": "",
"mood": 2
}
]
},
"convo":
{"style": "background-color: #fdb302; background-image:url($path/convobg.png); background-repeat: no-repeat; border:2px solid yellow; font-family: 'Courier'",
"margins": {"top": 0, "bottom": 6, "left": 0, "right": 0 },
"size": [400, 250],
"chumlabel": { "style": "background: rgb(196, 138, 0); color: white; border:0px; font-size: 12px;",
"align": { "h": "center", "v": "center" },
"minheight": 26,
"maxheight": 26,
"text" : ":: $handle ::"
},
"textarea": {
"style": "background: white; font:bold; border:2px solid #c48a00;text-align:center; margin-top:21px; margin-right:10px; margin-left:10px; font-size: 12px;"
},
"input": {
"style": "background: white; border:2px solid #c48a00;margin-top:3px; margin-right:10px; margin-left:10px; font-size: 12px;"
},
"tabs": {
"style": "",
"selectedstyle": "",
"newmsgcolor": "#fdb302",
"tabstyle": 0
},
"text": {
"beganpester": "began pestering",
"ceasepester": "ceased pestering",
"blocked": "blocked",
"unblocked": "unblocked",
"openmemo": "opened memo on board",
"joinmemo": "responded to memo",
"closememo": "ceased responding to memo",
"kickedmemo": "You have been banned from this memo!"
},
"systemMsgColor": "#646464"
},
"memos":
{"memoicon": "$path/memo.png",
"style": "background-color: #fdb302; background-image:url($path/convobg.png); background-repeat: no-repeat; border:2px solid yellow; font-family: 'Courier'; font: bold; selection-background-color:#919191; ",
"size": [450,300],
"tabs": {
"style": "",
"selectedstyle": "",
"newmsgcolor": "#fdb302",
"tabstyle": 0
},
"label": { "text": "Bulletin Board: $channel",
"style": "background: rgb(196, 138, 0); color: white; border:0px; font-size: 12px;",
"align": { "h": "center", "v": "center" },
"minheight": 26,
"maxheight": 26
},
"input": { "style": "background: white; border:2px solid #c48a00;margin-top:5px; font-size: 12px; margin-left:10px;" },
"textarea": { "style": "background: white; font:bold; border:2px solid #c48a00;text-align:center; font-size: 12px; margin-top: 21px; margin-left:10px;" },
"margins": {"top": 0, "bottom": 6, "left": 0, "right": 0 },
"userlist": { "width": 150,
"style": "border:2px solid #c48a00; background: white;font: bold;font-family: 'Courier';selection-background-color:#646464; font-size: 12px; margin-left:10px; margin-right:10px; margin-top: 21px;"
},
"time": { "text": { "width": 75,
"style": " border: 2px solid yellow; background: white; font-size: 12px; margin-top: 5px; margin-right: 5px; margin-left: 5px;"
},
"slider": { "style": "border: 0px;",
"groove": "",
"handle": ""
},
"buttons": { "style": "color: black; font: bold; border: 2px solid #c48a00; font: bold; font-size: 12px; background: yellow; margin-top: 5px; margin-right: 5px; margin-left: 5px; padding: 2px; width: 50px;" },
"arrows": { "left": "$path/leftarrow.png",
"right": "$path/rightarrow.png",
"style": " border:0px; margin-top: 5px; margin-right:10px;"
}
},
"systemMsgColor": "#646464"
}
}

Binary file not shown.

After

(image error) Size: 116 B

Binary file not shown.

After

(image error) Size: 3.6 KiB

Binary file not shown.

After

(image error) Size: 3.6 KiB

Binary file not shown.

After

(image error) Size: 172 B

BIN
themes/pesterchum7/x.gif Normal file

Binary file not shown.

After

(image error) Size: 55 B

View file

@ -1,5 +1,6 @@
{"main": {"main":
{"style": "background-image:url($path/tnbg2.png);background-color:rgba(0,0,0,0); background-repeat: no-repeat;", {"style": "background-color:rgba(0,0,0,0); background-repeat: no-repeat;",
"background-image": "$path/tnbg2.png",
"size": [650, 450], "size": [650, 450],
"icon": "$path/trayicon.png", "icon": "$path/trayicon.png",
"newmsgicon": "$path/trayicon2.png", "newmsgicon": "$path/trayicon2.png",
@ -19,6 +20,7 @@
"options": "Options", "options": "Options",
"memos": "Memos", "memos": "Memos",
"userlist": "Fresh Targets", "userlist": "Fresh Targets",
"import": "import U2;",
"exit": "Abscond"}, "exit": "Abscond"},
"profile": {"_name": "View", "profile": {"_name": "View",
"switch": "Trolltag", "switch": "Trolltag",
@ -31,7 +33,8 @@
"blockchum": "Block", "blockchum": "Block",
"addchum": "Add Chump", "addchum": "Add Chump",
"unblockchum": "Mercy", "unblockchum": "Mercy",
"banuser": "BAN USER" } "banuser": "Ban",
"quirksoff": "Quirks Off"
}, },
"chums": { "style": "font-size: 12px; background: white; border:2px solid #c2c2c2; padding: 5px; font-family: 'Arial';selection-background-color:rgb(200,200,200); ", "chums": { "style": "font-size: 12px; background: white; border:2px solid #c2c2c2; padding: 5px; font-family: 'Arial';selection-background-color:rgb(200,200,200); ",
"loc": [475, 89], "loc": [475, 89],
@ -233,6 +236,7 @@
}, },
"convo": "convo":
{"style": "background: rgb(190, 19, 4); font-family: 'Arial';", {"style": "background: rgb(190, 19, 4); font-family: 'Arial';",
"scrollbar": { "style" : "", "handle": "" },
"margins": {"top": 22, "bottom": 9, "left": 10, "right": 4 }, "margins": {"top": 22, "bottom": 9, "left": 10, "right": 4 },
"size": [400, 250], "size": [400, 250],
"chumlabel": { "style": "background: rgb(255, 38, 18); color: white; padding: 2px; border:1px solid #c2c2c2;", "chumlabel": { "style": "background: rgb(255, 38, 18); color: white; padding: 2px; border:1px solid #c2c2c2;",