Merge remote branch 'upstream/master'

Conflicts:
	TODO
	menus.py
	pesterchum.py
This commit is contained in:
Kiooeht 2011-04-13 23:28:17 -07:00
commit 1b6a4ba58c
21 changed files with 698 additions and 912 deletions

View file

@ -7,12 +7,25 @@ Visit https://github.com/illuminatedwax/pesterchum for git access and source cod
CHANGELOG CHANGELOG
--------- ---------
### 3.14b (idk on version number scheme) ### 3.14.1
* Pesterchum 3.14 - illuminatedwax [ghostDunk] * Pesterchum 3.14 - illuminatedwax [ghostDunk]
* Art - Grimlive [aquaMarinist] * Art - Grimlive [aquaMarinist]
* Quirks lower() function - Kiooeht [evacipatedBox] * Quirks lower() function - Kiooeht [evacipatedBox]
* Quirks scrabble() function - Kiooeht [evacipatedBox] * Quirks scrabble() function - Kiooeht [evacipatedBox]
* Quirks reverse() function - illuminatedwax [ghostDunk]
* Timestamps - Kiooeht [evacipatedBox] * Timestamps - Kiooeht [evacipatedBox]
* Logviewer - Kiooeht [evacipatedBox] * Logviewer - Kiooeht [evacipatedBox]
* Chum list groups - Kiooeht [evacipatedBox] * Quirk ordering - alGore
* Chum list bug fixes - Kiooeht [evacipatedBox] * # of users in a memo - alGore
* @links to users - illuminatedwax [ghostDunk]
* Support for REPORT and ALT to calSprite built in
BUG FIXES:
* mixer bug fixed
* "flags" bug fixed
* incorrect characters in memos no longer break log file names
* memos now do not break on case-sensitivity
* fixed QDB address
* now lines too long to send in a single message are split up correctly
* quirk replace bug fixed
* pesterClientXXX profiles no longer saved

30
TODO
View file

@ -1,14 +1,21 @@
o Bugs: Bugs:
* some nicks can override others. ex: ectoBiologist and ectoBio. ectoBio's mood will be seen, not ectoBiologist's * weird memo time bug
* REGEXP: \b(\S)(\S*)(\S)\b REPLACE WITH: upper(\1)\2upper(\3) <--
this regexp, when used as a quirk and then typed in breaks
* import modified.tar
* channels aren't case sensitive! get the real name of a channel
* Windows doesn't show style sheet sometimes?? Maybe related to themes. * Windows doesn't show style sheet sometimes?? Maybe related to themes.
* Issues with connecting? Client not closing connection right? People keep getting "nick taken" messages * Issues with connecting? Client not closing connection right? People keep getting "nick taken" messages
* Windows XP SP2: sometimes mouse clicks dont register? must be some kinda crash * Windows XP SP2: sometimes mouse clicks dont register? must be some kinda crash
* don't save pesterClientXXX names * enamel doesnt have time arrows
* need to make it so "/" in a memo doesn't mess up the logs
Features:
* different sound for memos/pesters
* OOC
* log viewer needs to have BBCode/HTML/Text copy modes
* random pesters
* copy quirks between profiles?
* chum list groups
* More complex quirks: by-sound
* Theme checking
* Spy mode
* Animated
Mac Bugs: Mac Bugs:
* Mac doesn't show tabs right, display gifs, highlighting thing? * Mac doesn't show tabs right, display gifs, highlighting thing?
@ -17,10 +24,3 @@ SS: in the one-on-one pester it resizes with the window
SS: but the memo one doesn't resize SS: but the memo one doesn't resize
SS: and the arrows next to the time thing overlap the CLOSE button SS: and the arrows next to the time thing overlap the CLOSE button
Features:
* copy quirks between profiles?
* help button on quirks menu?
* More complex quirks: by-sound
* Theme checking
* Spy mode
* Animated

View file

@ -8,8 +8,8 @@ from datetime import datetime, timedelta
from PyQt4 import QtGui, QtCore from PyQt4 import QtGui, QtCore
from dataobjs import PesterProfile, Mood, PesterHistory from dataobjs import PesterProfile, Mood, PesterHistory
from generic import PesterIcon, RightClickList from generic import PesterIcon
from parsetools import convertTags, lexMessage, mecmd, colorBegin, colorEnd, img2smiley from parsetools import convertTags, lexMessage, splitMessage, mecmd, colorBegin, colorEnd, img2smiley
class PesterTabWindow(QtGui.QFrame): class PesterTabWindow(QtGui.QFrame):
def __init__(self, mainwindow, parent=None, convo="convo"): def __init__(self, mainwindow, parent=None, convo="convo"):
@ -304,6 +304,9 @@ class PesterText(QtGui.QTextEdit):
if url != "": if url != "":
if url[0] == "#" and url != "#pesterchum": if url[0] == "#" and url != "#pesterchum":
self.parent().mainwindow.showMemos(url[1:]) self.parent().mainwindow.showMemos(url[1:])
elif url[0] == "@":
handle = unicode(url[1:])
self.parent().mainwindow.newConversation(handle)
else: else:
QtGui.QDesktopServices.openUrl(QtCore.QUrl(url, QtCore.QUrl.TolerantMode)) QtGui.QDesktopServices.openUrl(QtCore.QUrl(url, QtCore.QUrl.TolerantMode))
QtGui.QTextEdit.mousePressEvent(self, event) QtGui.QTextEdit.mousePressEvent(self, event)
@ -350,7 +353,7 @@ class PesterText(QtGui.QTextEdit):
"Accept": "text/plain"} "Accept": "text/plain"}
try: try:
pass pass
hconn = httplib.HTTPConnection('luke.violentlemon.com', 80, hconn = httplib.HTTPConnection('qdb.pesterchum.net', 80,
timeout=15) timeout=15)
hconn.request("POST", "/index.php", params, headers) hconn.request("POST", "/index.php", params, headers)
response = hconn.getresponse() response = hconn.getresponse()
@ -443,10 +446,14 @@ class PesterConvo(QtGui.QFrame):
self.unblockchum = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/unblockchum"], self) self.unblockchum = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/unblockchum"], self)
self.connect(self.unblockchum, QtCore.SIGNAL('triggered()'), self.connect(self.unblockchum, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('unblockChumSlot()')) self, QtCore.SLOT('unblockChumSlot()'))
self.reportchum = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/report"], self)
self.connect(self.reportchum, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('reportThisChum()'))
self.optionsMenu.addAction(self.quirksOff) self.optionsMenu.addAction(self.quirksOff)
self.optionsMenu.addAction(self.addChumAction) self.optionsMenu.addAction(self.addChumAction)
self.optionsMenu.addAction(self.blockAction) self.optionsMenu.addAction(self.blockAction)
self.optionsMenu.addAction(self.reportchum)
self.chumopen = False self.chumopen = False
self.applyquirks = True self.applyquirks = True
@ -599,13 +606,17 @@ class PesterConvo(QtGui.QFrame):
lexmsg = lexMessage(text) lexmsg = lexMessage(text)
if type(lexmsg[0]) is not mecmd and self.applyquirks: if type(lexmsg[0]) is not mecmd and self.applyquirks:
lexmsg = quirks.apply(lexmsg) lexmsg = quirks.apply(lexmsg)
serverMsg = copy(lexmsg) lexmsgs = splitMessage(lexmsg)
self.addMessage(lexmsg, True)
# if ceased, rebegin for lm in lexmsgs:
if hasattr(self, 'chumopen') and not self.chumopen: serverMsg = copy(lm)
self.mainwindow.newConvoStarted.emit(QtCore.QString(self.title()), True) self.addMessage(lm, True)
text = convertTags(serverMsg, "ctag") # if ceased, rebegin
self.messageSent.emit(text, self.title()) if hasattr(self, 'chumopen') and not self.chumopen:
self.mainwindow.newConvoStarted.emit(QtCore.QString(self.title()), True)
self.setChumOpen(True)
text = convertTags(serverMsg, "ctag")
self.messageSent.emit(text, self.title())
self.textInput.setText("") self.textInput.setText("")
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
@ -615,6 +626,9 @@ class PesterConvo(QtGui.QFrame):
def blockThisChum(self): def blockThisChum(self):
self.mainwindow.blockChum(self.chum.handle) self.mainwindow.blockChum(self.chum.handle)
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def reportThisChum(self):
self.mainwindow.reportChum(self.chum.handle)
@QtCore.pyqtSlot()
def unblockChumSlot(self): def unblockChumSlot(self):
self.mainwindow.unblockChum(self.chum.handle) self.mainwindow.unblockChum(self.chum.handle)
@QtCore.pyqtSlot(bool) @QtCore.pyqtSlot(bool)

View file

@ -7,9 +7,11 @@ from generic import PesterIcon
from parsetools import timeDifference, convertTags, lexMessage from parsetools import timeDifference, convertTags, lexMessage
from mispeller import mispeller from mispeller import mispeller
_upperre = re.compile(r"upper\(([\w\\]+)\)") _groupre = re.compile(r"\\([0-9]+)")
_lowerre = re.compile(r"lower\(([\w\\]+)\)") _upperre = re.compile(r"upper\(([\w<>\\]+)\)")
_scramblere = re.compile(r"scramble\(([\w\\]+)\)") _lowerre = re.compile(r"lower\(([\w<>\\]+)\)")
_scramblere = re.compile(r"scramble\(([\w<>\\]+)\)")
_reversere = re.compile(r"reverse\(([\w<>\\]+)\)")
class Mood(object): class Mood(object):
moods = ["chummy", "rancorous", "offline", "pleasant", "distraught", moods = ["chummy", "rancorous", "offline", "pleasant", "distraught",
@ -62,15 +64,19 @@ class pesterQuirk(object):
return string return string
def regexprep(mo): def regexprep(mo):
to = self.quirk["to"] to = self.quirk["to"]
to = _groupre.sub(r"\\g<\1>", to)
def upperrep(m): def upperrep(m):
return mo.expand(m.group(1)).upper() return mo.expand(m.group(1)).upper()
def lowerrep(m): def lowerrep(m):
return mo.expand(m.group(1)).lower() return mo.expand(m.group(1)).lower()
def scramblerep(m): def scramblerep(m):
return "".join(random.sample(mo.expand(m.group(1)), len(mo.expand(m.group(1))))) return "".join(random.sample(mo.expand(m.group(1)), len(mo.expand(m.group(1)))))
def reverserep(m):
return mo.expand(m.group(1))[::-1]
to = _upperre.sub(upperrep, to) to = _upperre.sub(upperrep, to)
to = _lowerre.sub(lowerrep, to) to = _lowerre.sub(lowerrep, to)
to = _scramblere.sub(scramblerep, to) to = _scramblere.sub(scramblerep, to)
to = _reversere.sub(reverserep, to)
return mo.expand(to) return mo.expand(to)
return re.sub(fr, regexprep, string) return re.sub(fr, regexprep, string)
elif self.type == "random": elif self.type == "random":
@ -181,7 +187,7 @@ class pesterQuirks(object):
yield q yield q
class PesterProfile(object): class PesterProfile(object):
def __init__(self, handle, color=None, mood=Mood("offline"), group=None, chumdb=None): def __init__(self, handle, color=None, mood=Mood("offline"), chumdb=None):
self.handle = handle self.handle = handle
if color is None: if color is None:
if chumdb: if chumdb:
@ -190,12 +196,6 @@ class PesterProfile(object):
color = QtGui.QColor("black") color = QtGui.QColor("black")
self.color = color self.color = color
self.mood = mood self.mood = mood
if group is None:
if chumdb:
group = chumdb.getGroup(handle, "Chums")
else:
group = "Chums"
self.group = group
def initials(self, time=None): def initials(self, time=None):
handle = self.handle handle = self.handle
caps = [l for l in handle if l.isupper()] caps = [l for l in handle if l.isupper()]
@ -225,8 +225,7 @@ class PesterProfile(object):
def plaindict(self): def plaindict(self):
return (self.handle, {"handle": self.handle, return (self.handle, {"handle": self.handle,
"mood": self.mood.name(), "mood": self.mood.name(),
"color": unicode(self.color.name()), "color": unicode(self.color.name())})
"group": unicode(self.group)})
def blocked(self, config): def blocked(self, config):
return self.handle in config.getBlocklist() return self.handle in config.getBlocklist()

View file

@ -35,14 +35,9 @@ class RightClickList(QtGui.QListWidget):
if event.reason() == QtGui.QContextMenuEvent.Mouse: if event.reason() == QtGui.QContextMenuEvent.Mouse:
listing = self.itemAt(event.pos()) listing = self.itemAt(event.pos())
self.setCurrentItem(listing) self.setCurrentItem(listing)
self.optionsMenu.popup(event.globalPos()) self.getOptionsMenu().popup(event.globalPos())
def getOptionsMenu(self):
class RightClickTree(QtGui.QTreeWidget): return self.optionsMenu
def contextMenuEvent(self, event):
if event.reason() == QtGui.QContextMenuEvent.Mouse:
listing = self.itemAt(event.pos())
self.setCurrentItem(listing)
self.optionsMenu.popup(event.globalPos())
class MultiTextDialog(QtGui.QDialog): class MultiTextDialog(QtGui.QDialog):
def __init__(self, title, parent, *queries): def __init__(self, title, parent, *queries):

4
irc.py
View file

@ -97,8 +97,8 @@ class PesterIRC(QtCore.QThread):
space = l[0].rfind(" ", 0,400) space = l[0].rfind(" ", 0,400)
if space == -1: if space == -1:
space = 400 space = 400
a = l[0][0:space] a = l[0][0:space+1]
b = l[0][space:] b = l[0][space+1:]
if len(b) > 0: if len(b) > 0:
return [a] + splittext([b]) return [a] + splittext([b])
else: else:

View file

@ -3,7 +3,7 @@ import codecs
import re import re
from time import strftime, strptime from time import strftime, strptime
from PyQt4 import QtGui, QtCore from PyQt4 import QtGui, QtCore
from generic import RightClickList, RightClickTree from generic import RightClickList
from parsetools import convertTags from parsetools import convertTags
from convo import PesterText from convo import PesterText
@ -138,8 +138,7 @@ class PesterLogViewer(QtGui.QDialog):
self.logList.sort() self.logList.sort()
self.logList.reverse() self.logList.reverse()
self.tree = RightClickTree() self.tree = QtGui.QTreeWidget()
self.tree.optionsMenu = QtGui.QMenu(self)
self.tree.setFixedSize(260, 300) self.tree.setFixedSize(260, 300)
self.tree.header().hide() self.tree.header().hide()
if theme.has_key("convo/scrollbar"): if theme.has_key("convo/scrollbar"):
@ -149,7 +148,6 @@ class PesterLogViewer(QtGui.QDialog):
self.connect(self.tree, QtCore.SIGNAL('itemSelectionChanged()'), self.connect(self.tree, QtCore.SIGNAL('itemSelectionChanged()'),
self, QtCore.SLOT('loadSelectedLog()')) self, QtCore.SLOT('loadSelectedLog()'))
self.tree.setSortingEnabled(False) self.tree.setSortingEnabled(False)
child_1 = None child_1 = None
last = ["",""] last = ["",""]
for (i,l) in enumerate(self.logList): for (i,l) in enumerate(self.logList):

View file

@ -218,10 +218,10 @@ class MemoTabWindow(PesterTabWindow):
def __init__(self, mainwindow, parent=None): def __init__(self, mainwindow, parent=None):
PesterTabWindow.__init__(self, mainwindow, parent, "memos") PesterTabWindow.__init__(self, mainwindow, parent, "memos")
def addChat(self, convo): def addChat(self, convo):
self.convos[convo.channel] = convo self.convos[convo.channel.upper()] = convo
# either addTab or setCurrentIndex will trigger changed() # either addTab or setCurrentIndex will trigger changed()
newindex = self.tabs.addTab(convo.channel) newindex = self.tabs.addTab(convo.channel.upper())
self.tabIndices[convo.channel] = newindex self.tabIndices[convo.channel.upper()] = newindex
self.tabs.setCurrentIndex(newindex) self.tabs.setCurrentIndex(newindex)
self.tabs.setTabIcon(newindex, PesterIcon(self.mainwindow.theme["memos/memoicon"])) self.tabs.setTabIcon(newindex, PesterIcon(self.mainwindow.theme["memos/memoicon"]))
def updateBlocked(self): def updateBlocked(self):
@ -291,16 +291,16 @@ class MemoText(PesterText):
grammar = time.getGrammar() grammar = time.getGrammar()
joinmsg = chum.memojoinmsg(systemColor, time.getTime(), grammar, window.theme["convo/text/joinmemo"]) joinmsg = chum.memojoinmsg(systemColor, time.getTime(), grammar, window.theme["convo/text/joinmemo"])
self.append(convertTags(joinmsg)) self.append(convertTags(joinmsg))
parent.mainwindow.chatlog.log(parent.channel, joinmsg) parent.mainwindow.chatlog.log(parent.channel.upper(), joinmsg)
time.openCurrentTime() time.openCurrentTime()
if type(lexmsg[0]) is mecmd: if type(lexmsg[0]) is mecmd:
memsg = chum.memsg(systemColor, lexmsg, time=time.getGrammar()) memsg = chum.memsg(systemColor, lexmsg, time=time.getGrammar())
window.chatlog.log(parent.channel, memsg) window.chatlog.log(parent.channel.upper(), memsg)
self.append(convertTags(memsg)) self.append(convertTags(memsg))
else: else:
self.append(convertTags(lexmsg)) self.append(convertTags(lexmsg))
window.chatlog.log(parent.channel, lexmsg) window.chatlog.log(parent.channel.upper(), lexmsg)
def changeTheme(self, theme): def changeTheme(self, theme):
self.initTheme(theme) self.initTheme(theme)
@ -417,7 +417,7 @@ class PesterMemo(PesterConvo):
msg = 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.time.openCurrentTime() self.time.openCurrentTime()
self.textArea.append(convertTags(msg)) self.textArea.append(convertTags(msg))
self.mainwindow.chatlog.log(self.channel, msg) self.mainwindow.chatlog.log(self.channel.upper(), msg)
self.op = False self.op = False
self.newmessage = False self.newmessage = False
@ -425,7 +425,7 @@ class PesterMemo(PesterConvo):
self.applyquirks = True self.applyquirks = True
def title(self): def title(self):
return self.channel return self.channel.upper()
def icon(self): def icon(self):
return PesterIcon(self.mainwindow.theme["memos/memoicon"]) return PesterIcon(self.mainwindow.theme["memos/memoicon"])
@ -555,7 +555,7 @@ class PesterMemo(PesterConvo):
self.times[handle].removeTime(close) self.times[handle].removeTime(close)
msg = 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.textArea.append(convertTags(msg))
self.mainwindow.chatlog.log(self.channel, msg) self.mainwindow.chatlog.log(self.channel.upper(), msg)
elif timed not in self.times[handle]: elif timed not in self.times[handle]:
self.times[handle].addTime(timed) self.times[handle].addTime(timed)
else: else:
@ -601,7 +601,7 @@ class PesterMemo(PesterConvo):
namesdb = self.mainwindow.namesdb namesdb = self.mainwindow.namesdb
# reload names # reload names
self.userlist.clear() self.userlist.clear()
for n in self.mainwindow.namesdb[self.channel]: for n in self.mainwindow.namesdb[self.channel.upper()]:
self.addUser(n) self.addUser(n)
@QtCore.pyqtSlot(QtCore.QString, QtCore.QString, QtCore.QString) @QtCore.pyqtSlot(QtCore.QString, QtCore.QString, QtCore.QString)
@ -635,7 +635,7 @@ class PesterMemo(PesterConvo):
grammar = t.getGrammar() grammar = t.getGrammar()
msg = 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.textArea.append(convertTags(msg))
self.mainwindow.chatlog.log(self.channel, msg) self.mainwindow.chatlog.log(self.channel.upper(), msg)
self.times[h].removeTime(t.getTime()) self.times[h].removeTime(t.getTime())
if update == "nick": if update == "nick":
self.addUser(newnick) self.addUser(newnick)
@ -663,7 +663,7 @@ class PesterMemo(PesterConvo):
opgrammar = TimeGrammar("CURRENT", "C", "RIGHT NOW") opgrammar = TimeGrammar("CURRENT", "C", "RIGHT NOW")
msg = chum.memobanmsg(opchum, opgrammar, systemColor, grammar) msg = chum.memobanmsg(opchum, opgrammar, systemColor, grammar)
self.textArea.append(convertTags(msg)) self.textArea.append(convertTags(msg))
self.mainwindow.chatlog.log(self.channel, msg) self.mainwindow.chatlog.log(self.channel.upper(), msg)
ttracker.removeTime(ttracker.getTime()) ttracker.removeTime(ttracker.getTime())
if chum is self.mainwindow.profile(): if chum is self.mainwindow.profile():
@ -682,10 +682,10 @@ class PesterMemo(PesterConvo):
self.time.openCurrentTime() self.time.openCurrentTime()
msg = 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.textArea.append(convertTags(msg))
self.mainwindow.chatlog.log(self.channel, msg) self.mainwindow.chatlog.log(self.channel.upper(), msg)
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.upper()]
self.parent().tabClose(i) self.parent().tabClose(i)
else: else:
self.close() self.close()
@ -749,7 +749,7 @@ class PesterMemo(PesterConvo):
systemColor = QtGui.QColor(self.mainwindow.theme["memos/systemMsgColor"]) systemColor = QtGui.QColor(self.mainwindow.theme["memos/systemMsgColor"])
msg = 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.textArea.append(convertTags(msg))
self.mainwindow.chatlog.log(self.channel, msg) self.mainwindow.chatlog.log(self.channel.upper(), msg)
newtime = self.time.getTime() newtime = self.time.getTime()
if newtime is None: if newtime is None:

View file

@ -546,10 +546,6 @@ class PesterOptions(QtGui.QDialog):
self.theme = theme self.theme = theme
self.setStyleSheet(self.theme["main/defaultwindow/style"]) self.setStyleSheet(self.theme["main/defaultwindow/style"])
hr = QtGui.QFrame()
hr.setFrameShape(QtGui.QFrame.HLine)
hr.setFrameShadow(QtGui.QFrame.Sunken)
self.tabcheck = QtGui.QCheckBox("Tabbed Conversations", self) self.tabcheck = QtGui.QCheckBox("Tabbed Conversations", self)
if self.config.tabs(): if self.config.tabs():
self.tabcheck.setChecked(True) self.tabcheck.setChecked(True)
@ -576,14 +572,6 @@ class PesterOptions(QtGui.QDialog):
if self.config.showSeconds(): if self.config.showSeconds():
self.secondscheck.setChecked(True) self.secondscheck.setChecked(True)
# Will add ability to turn off groups later
#self.groupscheck = QtGui.QCheckBox("Use Groups", self)
#self.groupscheck.setChecked(self.config.useGroups())
self.showemptycheck = QtGui.QCheckBox("Show Empty Groups", self)
self.showemptycheck.setChecked(self.config.showEmptyGroups())
self.showonlinenumbers = QtGui.QCheckBox("Show Number of Online Chums", self)
self.showonlinenumbers.setChecked(self.config.showOnlineNumbers())
self.ok = QtGui.QPushButton("OK", self) self.ok = QtGui.QPushButton("OK", self)
self.ok.setDefault(True) self.ok.setDefault(True)
self.connect(self.ok, QtCore.SIGNAL('clicked()'), self.connect(self.ok, QtCore.SIGNAL('clicked()'),
@ -599,10 +587,6 @@ class PesterOptions(QtGui.QDialog):
layout_0.addWidget(self.tabcheck) layout_0.addWidget(self.tabcheck)
layout_0.addWidget(self.soundcheck) layout_0.addWidget(self.soundcheck)
layout_0.addWidget(self.hideOffline) layout_0.addWidget(self.hideOffline)
#layout_0.addWidget(self.groupscheck)
layout_0.addWidget(self.showemptycheck)
layout_0.addWidget(self.showonlinenumbers)
layout_0.addWidget(hr)
layout_0.addWidget(self.timestampcheck) layout_0.addWidget(self.timestampcheck)
layout_0.addWidget(self.timestampBox) layout_0.addWidget(self.timestampBox)
layout_0.addWidget(self.secondscheck) layout_0.addWidget(self.secondscheck)
@ -628,7 +612,11 @@ class PesterUserlist(QtGui.QDialog):
self.addChumAction = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/addchum"], self) self.addChumAction = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/addchum"], self)
self.connect(self.addChumAction, QtCore.SIGNAL('triggered()'), self.connect(self.addChumAction, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('addChumSlot()')) self, QtCore.SLOT('addChumSlot()'))
self.pesterChumAction = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/pester"], self)
self.connect(self.pesterChumAction, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('pesterChumSlot()'))
self.userarea.optionsMenu.addAction(self.addChumAction) self.userarea.optionsMenu.addAction(self.addChumAction)
self.userarea.optionsMenu.addAction(self.pesterChumAction)
self.ok = QtGui.QPushButton("OK", self) self.ok = QtGui.QPushButton("OK", self)
self.ok.setDefault(True) self.ok.setDefault(True)
@ -652,7 +640,7 @@ class PesterUserlist(QtGui.QDialog):
self.updateUsers() self.updateUsers()
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def updateUsers(self): def updateUsers(self):
names = self.mainwindow.namesdb["#pesterchum"] names = self.mainwindow.namesdb["#PESTERCHUM"]
self.userarea.clear() self.userarea.clear()
for n in names: for n in names:
item = QtGui.QListWidgetItem(n) item = QtGui.QListWidgetItem(n)
@ -693,8 +681,15 @@ class PesterUserlist(QtGui.QDialog):
if not cur: if not cur:
return return
self.addChum.emit(cur.text()) self.addChum.emit(cur.text())
@QtCore.pyqtSlot()
def pesterChumSlot(self):
cur = self.userarea.currentItem()
if not cur:
return
self.pesterChum.emit(cur.text())
addChum = QtCore.pyqtSignal(QtCore.QString) addChum = QtCore.pyqtSignal(QtCore.QString)
pesterChum = QtCore.pyqtSignal(QtCore.QString)
class MemoListItem(QtGui.QListWidgetItem): class MemoListItem(QtGui.QListWidgetItem):
@ -816,6 +811,6 @@ class LoadingScreen(QtGui.QDialog):
class AboutPesterchum(QtGui.QMessageBox): class AboutPesterchum(QtGui.QMessageBox):
def __init__(self, parent=None): def __init__(self, parent=None):
QtGui.QMessageBox.__init__(self, parent) QtGui.QMessageBox.__init__(self, parent)
self.setText("P3ST3RCHUM V. 3.14") self.setText("P3ST3RCHUM V. 3.14.1")
self.setInformativeText("Programming by illuminatedwax (ghostDunk), art by Grimlive (aquaMarinist). Special thanks to ABT and gamblingGenocider.") self.setInformativeText("Programming by illuminatedwax (ghostDunk), Kiooeht (evacipatedBox), alGore, art by Grimlive (aquaMarinist). Special thanks to ABT and gamblingGenocider.")
self.mainwindow = parent self.mainwindow = parent

View file

@ -11,6 +11,7 @@ _ctag_end = re.compile(r'(?i)</c>')
_ctag_rgb = re.compile(r'\d+,\d+,\d+') _ctag_rgb = re.compile(r'\d+,\d+,\d+')
_urlre = re.compile(r"(?i)https?://[^\s]+") _urlre = re.compile(r"(?i)https?://[^\s]+")
_memore = re.compile(r"(\s|^)(#[A-Za-z0-9_]+)") _memore = re.compile(r"(\s|^)(#[A-Za-z0-9_]+)")
_handlere = re.compile(r"(\s|^)(@[A-Za-z0-9_]+)")
_imgre = re.compile(r"""(?i)<img src=['"](\S+)['"]\s*/>""") _imgre = re.compile(r"""(?i)<img src=['"](\S+)['"]\s*/>""")
_mecmdre = re.compile(r"^(/me|PESTERCHUM:ME)(\S*)") _mecmdre = re.compile(r"^(/me|PESTERCHUM:ME)(\S*)")
@ -109,6 +110,16 @@ class memolex(object):
return "%s<a href='%s'>%s</a>" % (self.space, self.channel, self.channel) return "%s<a href='%s'>%s</a>" % (self.space, self.channel, self.channel)
else: else:
return self.string return self.string
class chumhandlelex(object):
def __init__(self, string, space, handle):
self.string = string
self.space = space
self.handle = handle
def convert(self, format):
if format == "html":
return "%s<a href='%s'>%s</a>" % (self.space, self.handle, self.handle)
else:
return self.string
class smiley(object): class smiley(object):
def __init__(self, string): def __init__(self, string):
self.string = string self.string = string
@ -129,8 +140,11 @@ def lexMessage(string):
(colorBegin, _ctag_begin), (colorBegin, _gtag_begin), (colorBegin, _ctag_begin), (colorBegin, _gtag_begin),
(colorEnd, _ctag_end), (imagelink, _imgre), (colorEnd, _ctag_end), (imagelink, _imgre),
(hyperlink, _urlre), (memolex, _memore), (hyperlink, _urlre), (memolex, _memore),
(chumhandlelex, _handlere),
(smiley, _smilere)] (smiley, _smilere)]
string = unicode(string)
string = string.replace("\n", " ").replace("\r", " ")
lexed = lexer(unicode(string), lexlist) lexed = lexer(unicode(string), lexlist)
balanced = [] balanced = []
@ -176,6 +190,50 @@ def convertTags(lexed, format="html"):
return escaped return escaped
def splitMessage(msg, format="ctag"):
"""Splits message if it is too long."""
# split long text lines
buf = []
for o in msg:
if type(o) in [str, unicode] and len(o) > 200:
for i in range(0, len(o), 200):
buf.append(o[i:i+200])
else:
buf.append(o)
msg = buf
okmsg = []
cbegintags = []
output = []
for o in msg:
okmsg.append(o)
if type(o) is colorBegin:
cbegintags.append(o)
elif type(o) is colorEnd:
cbegintags.pop()
# yeah normally i'd do binary search but im lazy
msglen = len(convertTags(okmsg, format)) + 4*(len(cbegintags))
if msglen > 400:
okmsg.pop()
if len(okmsg) == 0:
output.append([o])
else:
tmp = []
for color in cbegintags:
okmsg.append(colorEnd("</c>"))
tmp.append(color)
output.append(okmsg)
if type(o) is colorBegin:
cbegintags.append(o)
elif type(o) is colorEnd:
cbegintags.pop()
tmp.append(o)
okmsg = tmp
if len(okmsg) > 0:
output.append(okmsg)
return output
def addTimeInitial(string, grammar): def addTimeInitial(string, grammar):
endofi = string.find(":") endofi = string.find(":")
@ -216,7 +274,7 @@ def timeDifference(td):
elif atd < timedelta(0,3600): elif atd < timedelta(0,3600):
if minutes == 1: if minutes == 1:
timetext = "%d MINUTE %s" % (minutes, when) timetext = "%d MINUTE %s" % (minutes, when)
else: else:
timetext = "%d MINUTES %s" % (minutes, when) timetext = "%d MINUTES %s" % (minutes, when)
elif atd < timedelta(0,3600*100): elif atd < timedelta(0,3600*100):
if hours == 1 and leftoverminutes == 0: if hours == 1 and leftoverminutes == 0:
@ -235,7 +293,7 @@ def img2smiley(string):
return string return string
smiledict = { smiledict = {
":rancorous:": "pc_rancorous.gif", ":rancorous:": "pc_rancorous.gif",
":apple:": "apple.gif", ":apple:": "apple.gif",
":bathearst:": "bathearst.gif", ":bathearst:": "bathearst.gif",
":cathearst:": "cathearst.png", ":cathearst:": "cathearst.png",
@ -245,7 +303,7 @@ smiledict = {
":blueghost:": "blueslimer.gif", ":blueghost:": "blueslimer.gif",
":slimer:": "slimer.gif", ":slimer:": "slimer.gif",
":candycorn:": "candycorn.gif", ":candycorn:": "candycorn.gif",
":cheer:": "cheer.gif", ":cheer:": "cheer.gif",
":duhjohn:": "confusedjohn.gif", ":duhjohn:": "confusedjohn.gif",
":datrump:": "datrump.gif", ":datrump:": "datrump.gif",
":facepalm:": "facepalm.gif", ":facepalm:": "facepalm.gif",

View file

@ -1 +1 @@
{"hideOfflineChums": true, "tabs": true, "soundon": true, "server": "irc.mindfang.org", "chums": ["unknownTraveler", "tentacleTherapist", "vaginalEngineer", "mechanicalSpectacle", "carcinoGeneticist", "schlagzeugGator", "gamblingGenocider", "gardenGnostic", "centaursTesticle", "arachnidsGrip", "grimAuxiliatrix", "remoteBloodbath", "nitroZealist", "greenZephyr", "arsenicCatnip", "cuttlefishCuller", "rageInducer", "gallowsCalibrator", "caligulasAquarium", "terminallyCapricious", "illuminatedWax", "aquaMarinist", "elegantDiversion", "moirailBunp", "uroborosUnbound", "androidTechnician", "midnightSparrow", "apocalypseArisen", "anguillaNuntia", "oilslickOrchid", "pretentiousFantasia", "aquaticMarinist", "lyricalKeraunoscopic", "counterRealist", "ectoBiologist", "percipientPedestrian", "asceticClinician", "doctectiveMiracles", "noSense", "ircMonster", "twinArmageddons", "cannabisHero", "jetRocket", "adiosToreador", "turntechGodhead", "magmaExploiter", "hannaSongstress", "endlessVoid", "grayscaleVisionary", "corruptedInsanity", "stupidlyBrilliant", "artsyGyarados", "obliviousCrafter", "sporadicAgent", "subtleChaotician", "nareSolee", "apostateCourier", "nocturnalTherapist", "herpaDerp", "clockworkUtopia", "digitalSamurai", "astronomicalMaster", "slipshodBrisant", "genialDustbuster", "hyperdriveTyphoon", "magnificentMiser", "gentleRuffian", "riskRepeats", "globalsoftPrika", "globalsoftPirka", "devonianCritter", "lethargicSerpent", "bluntInstrument", "sunilaSeed", "ghostBinoculars", "cosmicSailor", "alGore", "nickServ", "nakNak"], "defaultprofile": "ghostDunk", "block": []} {"hideOfflineChums": true, "time12Format": true, "tabs": true, "soundon": true, "server": "irc.mindfang.org", "showSeconds": false, "showTimeStamps": false, "chums": ["unknownTraveler", "tentacleTherapist", "vaginalEngineer", "mechanicalSpectacle", "carcinoGeneticist", "schlagzeugGator", "gamblingGenocider", "gardenGnostic", "centaursTesticle", "arachnidsGrip", "grimAuxiliatrix", "remoteBloodbath", "nitroZealist", "greenZephyr", "arsenicCatnip", "cuttlefishCuller", "rageInducer", "gallowsCalibrator", "caligulasAquarium", "terminallyCapricious", "illuminatedWax", "aquaMarinist", "elegantDiversion", "moirailBunp", "uroborosUnbound", "androidTechnician", "midnightSparrow", "apocalypseArisen", "anguillaNuntia", "oilslickOrchid", "pretentiousFantasia", "aquaticMarinist", "lyricalKeraunoscopic", "counterRealist", "ectoBiologist", "percipientPedestrian", "asceticClinician", "doctectiveMiracles", "noSense", "ircMonster", "twinArmageddons", "cannabisHero", "jetRocket", "adiosToreador", "turntechGodhead", "magmaExploiter", "hannaSongstress", "endlessVoid", "grayscaleVisionary", "corruptedInsanity", "stupidlyBrilliant", "artsyGyarados", "obliviousCrafter", "sporadicAgent", "subtleChaotician", "nareSolee", "apostateCourier", "nocturnalTherapist", "herpaDerp", "clockworkUtopia", "digitalSamurai", "astronomicalMaster", "slipshodBrisant", "genialDustbuster", "hyperdriveTyphoon", "magnificentMiser", "gentleRuffian", "riskRepeats", "globalsoftPrika", "globalsoftPirka", "devonianCritter", "lethargicSerpent", "laughingShisa", "bluntInstrument", "sunilaSeed", "bluntInstrument", "nickServ", "ghostBinoculars", "alGore", "evacipatedBox", "acrylicEmulator", "prettyGemmaiden", "calSprite", "fairytalePorn", "brooklynRage"], "defaultprofile": "testProfile", "block": []}

View file

@ -18,7 +18,7 @@ from menus import PesterChooseQuirks, PesterChooseTheme, \
PesterChooseProfile, PesterOptions, PesterUserlist, PesterMemoList, \ PesterChooseProfile, PesterOptions, PesterUserlist, PesterMemoList, \
LoadingScreen, AboutPesterchum LoadingScreen, AboutPesterchum
from dataobjs import PesterProfile, Mood, pesterQuirk, pesterQuirks from dataobjs import PesterProfile, Mood, pesterQuirk, pesterQuirks
from generic import PesterIcon, RightClickList, RightClickTree, MultiTextDialog, PesterList from generic import PesterIcon, RightClickList, MultiTextDialog, PesterList
from convo import PesterTabWindow, PesterText, PesterInput, PesterConvo from convo import PesterTabWindow, PesterText, PesterInput, PesterConvo
from parsetools import convertTags, addTimeInitial from parsetools import convertTags, addTimeInitial
from memos import PesterMemo, MemoTabWindow, TimeTracker from memos import PesterMemo, MemoTabWindow, TimeTracker
@ -26,6 +26,7 @@ from irc import PesterIRC
from logviewer import PesterLogUserSelect, PesterLogViewer from logviewer import PesterLogUserSelect, PesterLogViewer
_datadir = QtGui.QDesktopServices.storageLocation(QtGui.QDesktopServices.DataLocation)+"Pesterchum/" _datadir = QtGui.QDesktopServices.storageLocation(QtGui.QDesktopServices.DataLocation)+"Pesterchum/"
canon_handles = ["apocalypseArisen", "arsenicCatnip", "arachnidsGrip", "adiosToreador", "caligulasAquarium", "cuttlefishCuller", "carcinoGeneticist", "centaursTesticle", "grimAuxiliatrix", "gallowsCalibrator", "gardenGnostic", "ectoBiologist", "twinArmageddons", "terminallyCapricious", "turntechGodhead", "tentacleTherapist"]
if sys.platform == "darwin": if sys.platform == "darwin":
if not os.path.exists(_datadir): if not os.path.exists(_datadir):
@ -78,10 +79,13 @@ class PesterLog(object):
self.logpath = _datadir+"logs" self.logpath = _datadir+"logs"
def log(self, handle, msg): def log(self, handle, msg):
time = strftime("[%H:%M:%S] ") #watch out for illegal characters
bbcodemsg = time + convertTags(msg, "bbcode") handle = re.sub(r'[<>:"/\\|?*]', "_", handle)
html = time + convertTags(msg, "html")+"<br />" #time = strftime("[%H:%M:%S] ")
msg = time + convertTags(msg, "text") # no time codes in logs
bbcodemsg = convertTags(msg, "bbcode")
html = convertTags(msg, "html")+"<br />"
msg = convertTags(msg, "text")
modes = {"bbcode": bbcodemsg, "html": html, "text": msg} modes = {"bbcode": bbcodemsg, "html": html, "text": msg}
if not self.convos.has_key(handle): if not self.convos.has_key(handle):
time = datetime.now().strftime("%Y-%m-%d.%H.%M") time = datetime.now().strftime("%Y-%m-%d.%H.%M")
@ -131,14 +135,7 @@ class PesterProfileDB(dict):
json.dump(chumdict, fp) json.dump(chumdict, fp)
fp.close() fp.close()
u = [] converted = dict([(handle, PesterProfile(handle, color=QtGui.QColor(c['color']), mood=Mood(c['mood']))) for (handle, c) in chumdict.iteritems()])
for (handle, c) in chumdict.iteritems():
try:
g = c['group']
u.append((handle, PesterProfile(handle, color=QtGui.QColor(c['color']), mood=Mood(c['mood']), group=g)))
except KeyError:
u.append((handle, PesterProfile(handle, color=QtGui.QColor(c['color']), mood=Mood(c['mood']))))
converted = dict(u)
self.update(converted) self.update(converted)
def save(self): def save(self):
@ -159,17 +156,6 @@ class PesterProfileDB(dict):
self[handle].color = color self[handle].color = color
else: else:
self[handle] = PesterProfile(handle, color) self[handle] = PesterProfile(handle, color)
def getGroup(self, handle, default="Chums"):
if not self.has_key(handle):
return default
else:
return self[handle].group
def setGroup(self, handle, theGroup):
if self.has_key(handle):
self[handle].group = theGroup
else:
self[handle] = PesterProfile(handle, group=theGroup)
self.save()
def __setitem__(self, key, val): def __setitem__(self, key, val):
dict.__setitem__(self, key, val) dict.__setitem__(self, key, val)
self.save() self.save()
@ -282,22 +268,6 @@ class userConfig(object):
if not self.config.has_key('showSeconds'): if not self.config.has_key('showSeconds'):
self.set("showSeconds", False) self.set("showSeconds", False)
return self.config.get('showSeconds', False) return self.config.get('showSeconds', False)
def useGroups(self):
if not self.config.has_key('useGroups'):
self.set("useGroups", False)
return self.config.get('useGroups', False)
def openDefaultGroup(self):
if not self.config.has_key('openDefaultGroup'):
self.set("openDefaultGroup", True)
return self.config.get('openDefaultGroup', True)
def showEmptyGroups(self):
if not self.config.has_key('emptyGroups'):
self.set("emptyGroups", False)
return self.config.get('emptyGroups', False)
def showOnlineNumbers(self):
if not self.config.has_key('onlineNumbers'):
self.set("onlineNumbers", False)
return self.config.get('onlineNumbers', False)
def addChum(self, chum): def addChum(self, chum):
if chum.handle not in self.chums(): if chum.handle not in self.chums():
fp = open(self.filename) # what if we have two clients open?? fp = open(self.filename) # what if we have two clients open??
@ -325,25 +295,6 @@ class userConfig(object):
l = self.getBlocklist() l = self.getBlocklist()
l.pop(l.index(handle)) l.pop(l.index(handle))
self.set('block', l) self.set('block', l)
def getGroups(self):
if not self.config.has_key('groups'):
self.set('groups', [])
return self.config.get('groups', [])
def addGroup(self, group, open=False):
l = self.getGroups()
if group not in l:
l.append([group,open])
l.sort()
self.set('groups', l)
def delGroup(self, group):
l = self.getGroups()
i = 0
for g in l:
if g[0] == group: break
i = i+1
l.pop(i)
l.sort()
self.set('groups', l)
def server(self): def server(self):
return self.config.get('server', 'irc.mindfang.org') return self.config.get('server', 'irc.mindfang.org')
def port(self): def port(self):
@ -432,6 +383,9 @@ class userProfile(object):
return self.theme return self.theme
def save(self): def save(self):
handle = self.chat.handle handle = self.chat.handle
if handle[0:12] == "pesterClient":
# dont save temp profiles
return
try: try:
jsonoutput = json.dumps(self.userprofile) jsonoutput = json.dumps(self.userprofile)
except ValueError, e: except ValueError, e:
@ -457,9 +411,9 @@ class WMButton(QtGui.QPushButton):
self.setStyleSheet("QPushButton { padding: 0px; }") self.setStyleSheet("QPushButton { padding: 0px; }")
self.setAutoDefault(False) self.setAutoDefault(False)
class chumListing(QtGui.QTreeWidgetItem): class chumListing(QtGui.QListWidgetItem):
def __init__(self, chum, window): def __init__(self, chum, window):
QtGui.QTreeWidgetItem.__init__(self, [chum.handle]) QtGui.QListWidgetItem.__init__(self, chum.handle)
self.mainwindow = window self.mainwindow = window
self.chum = chum self.chum = chum
self.handle = chum.handle self.handle = chum.handle
@ -473,46 +427,33 @@ class chumListing(QtGui.QTreeWidgetItem):
mood = self.chum.mood mood = self.chum.mood
self.mood = mood self.mood = mood
icon = self.mood.icon(self.mainwindow.theme) icon = self.mood.icon(self.mainwindow.theme)
self.setIcon(0, icon) self.setIcon(icon)
try: try:
self.setTextColor(0, QtGui.QColor(self.mainwindow.theme["main/chums/moods"][self.mood.name()]["color"])) self.setTextColor(QtGui.QColor(self.mainwindow.theme["main/chums/moods"][self.mood.name()]["color"]))
except KeyError: except KeyError:
self.setTextColor(0, QtGui.QColor(self.mainwindow.theme["main/chums/moods/chummy/color"])) self.setTextColor(QtGui.QColor(self.mainwindow.theme["main/chums/moods/chummy/color"]))
def changeTheme(self, theme): def changeTheme(self, theme):
icon = self.mood.icon(theme) icon = self.mood.icon(theme)
self.setIcon(0, icon) self.setIcon(icon)
try: try:
self.setTextColor(0, QtGui.QColor(self.mainwindow.theme["main/chums/moods"][self.mood.name()]["color"])) self.setTextColor(QtGui.QColor(self.mainwindow.theme["main/chums/moods"][self.mood.name()]["color"]))
except KeyError: except KeyError:
self.setTextColor(0, QtGui.QColor(self.mainwindow.theme["main/chums/moods/chummy/color"])) self.setTextColor(QtGui.QColor(self.mainwindow.theme["main/chums/moods/chummy/color"]))
def __lt__(self, cl): def __lt__(self, cl):
h1 = self.handle.lower() h1 = self.handle.lower()
h2 = cl.handle.lower() h2 = cl.handle.lower()
return (h1 < h2) return (h1 < h2)
class chumArea(RightClickTree): class chumArea(RightClickList):
def __init__(self, chums, parent=None): def __init__(self, chums, parent=None):
QtGui.QTreeWidget.__init__(self, parent) QtGui.QListWidget.__init__(self, parent)
self.mainwindow = parent self.mainwindow = parent
theme = self.mainwindow.theme theme = self.mainwindow.theme
self.chums = chums self.chums = chums
gTemp = self.mainwindow.config.getGroups()
self.groups = [g[0] for g in gTemp]
self.openGroups = [g[1] for g in gTemp]
# quick hack to sort saved groups
self.mainwindow.config.addGroup("f3rskv9dssag[%3ffvsla09iv34G#$v")
self.mainwindow.config.delGroup("f3rskv9dssag[%3ffvsla09iv34G#$v")
# end quick hack
self.showAllGroups()
if not self.mainwindow.config.hideOfflineChums(): if not self.mainwindow.config.hideOfflineChums():
self.showAllChums() self.showAllChums()
if not self.mainwindow.config.showEmptyGroups(): self.optionsMenu = QtGui.QMenu(self)
self.hideEmptyGroups() self.canonMenu = QtGui.QMenu(self)
if self.mainwindow.config.showOnlineNumbers():
self.showOnlineNumbers()
self.chumoptions = QtGui.QMenu(self)
self.groupoptions = QtGui.QMenu(self)
self.optionsMenu = self.chumoptions
self.pester = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/pester"], self) self.pester = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/pester"], self)
self.connect(self.pester, QtCore.SIGNAL('triggered()'), self.connect(self.pester, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('activateChum()')) self, QtCore.SLOT('activateChum()'))
@ -525,98 +466,35 @@ class chumArea(RightClickTree):
self.logchum = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/viewlog"], self) self.logchum = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/viewlog"], self)
self.connect(self.logchum, QtCore.SIGNAL('triggered()'), self.connect(self.logchum, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('openChumLogs()')) self, QtCore.SLOT('openChumLogs()'))
self.reportchum = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/report"], self)
self.connect(self.reportchum, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('reportChum()'))
self.findalts = QtGui.QAction("Find Alts", self)
self.connect(self.findalts, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('findAlts()'))
self.removegroup = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/removegroup"], self) self.optionsMenu.addAction(self.pester)
self.connect(self.removegroup, QtCore.SIGNAL('triggered()'), self.optionsMenu.addAction(self.logchum)
self, QtCore.SLOT('removeGroup()')) self.optionsMenu.addAction(self.blockchum)
self.renamegroup = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/renamegroup"], self) self.optionsMenu.addAction(self.removechum)
self.connect(self.renamegroup, QtCore.SIGNAL('triggered()'), self.optionsMenu.addAction(self.reportchum)
self, QtCore.SLOT('renameGroup()'))
self.chumoptions.addAction(self.pester)
self.chumoptions.addAction(self.logchum)
self.chumoptions.addAction(self.blockchum)
self.chumoptions.addAction(self.removechum)
self.moveMenu = QtGui.QMenu(self.mainwindow.theme["main/menus/rclickchumlist/movechum"], self)
self.chumoptions.addMenu(self.moveMenu)
self.moveGroupMenu()
self.groupoptions.addAction(self.renamegroup)
self.groupoptions.addAction(self.removegroup) self.canonMenu.addAction(self.pester)
self.canonMenu.addAction(self.logchum)
self.canonMenu.addAction(self.blockchum)
self.canonMenu.addAction(self.removechum)
self.canonMenu.addAction(self.reportchum)
self.canonMenu.addAction(self.findalts)
self.initTheme(theme) self.initTheme(theme)
#self.sortItems() self.sortItems()
#self.sortItems(1, QtCore.Qt.AscendingOrder) def getOptionsMenu(self):
self.setSortingEnabled(False) currenthandle = self.currentItem().chum.handle
self.header().hide() if currenthandle in canon_handles:
self.setDropIndicatorShown(False) return self.canonMenu
self.setIndentation(0) else:
self.setDragEnabled(True) return self.optionsMenu
self.setDragDropMode(QtGui.QAbstractItemView.InternalMove)
self.connect(self, QtCore.SIGNAL('itemDoubleClicked(QTreeWidgetItem *, int)'),
self, QtCore.SLOT('expandGroup()'))
def dropEvent(self, event):
item = self.itemAt(event.pos())
if item:
text = str(item.text(0))
if text.rfind(" ") != -1:
text = text[0:text.rfind(" ")]
if text == "Chums" or text in self.groups:
group = text
else:
ptext = str(item.parent().text(0))
if ptext.rfind(" ") != -1:
ptext = ptext[0:ptext.rfind(" ")]
group = ptext
chumLabel = event.source().currentItem()
chumLabel.chum.group = group
self.mainwindow.chumdb.setGroup(chumLabel.chum.handle, group)
self.takeItem(chumLabel)
self.addItem(chumLabel)
if self.mainwindow.config.showOnlineNumbers():
self.showOnlineNumbers()
def chumoptionsmenu(self):
self.optionsMenu = self.chumoptions
def groupoptionsmenu(self):
self.optionsMenu = self.groupoptions
def moveGroupMenu(self):
currentGroup = self.currentItem()
if currentGroup:
text = str(currentGroup.parent().text(0))
if text.rfind(" ") != -1:
text = text[0:text.rfind(" ")]
currentGroup = text
self.moveMenu.clear()
actGroup = QtGui.QActionGroup(self)
groups = self.groups[:]
groups.insert(0, "Chums")
for gtext in groups:
if gtext == currentGroup:
continue
movegroup = self.moveMenu.addAction(gtext)
actGroup.addAction(movegroup)
self.connect(actGroup, QtCore.SIGNAL('triggered(QAction *)'),
self, QtCore.SLOT('moveToGroup(QAction *)'))
def contextMenuEvent(self, event):
#fuckin Qt
if event.reason() == QtGui.QContextMenuEvent.Mouse:
listing = self.itemAt(event.pos())
self.setCurrentItem(listing)
text = str(self.currentItem().text(0))
if text.rfind(" ") != -1:
text = text[0:text.rfind(" ")]
if text == "Chums":
return
elif text in self.groups:
self.groupoptionsmenu()
else:
self.chumoptionsmenu()
self.moveGroupMenu()
self.optionsMenu.popup(event.globalPos())
def addChum(self, chum): def addChum(self, chum):
if len([c for c in self.chums if c.handle == chum.handle]) != 0: if len([c for c in self.chums if c.handle == chum.handle]) != 0:
return return
@ -625,152 +503,29 @@ class chumArea(RightClickTree):
chum.mood.name() == "offline"): chum.mood.name() == "offline"):
chumLabel = chumListing(chum, self.mainwindow) chumLabel = chumListing(chum, self.mainwindow)
self.addItem(chumLabel) self.addItem(chumLabel)
#self.topLevelItem(0).addChild(chumLabel) self.sortItems()
#self.topLevelItem(0).sortChildren(0, QtCore.Qt.AscendingOrder)
def getChums(self, handle): def getChums(self, handle):
chums = self.findItems(handle, QtCore.Qt.MatchContains | QtCore.Qt.MatchRecursive) chums = self.findItems(handle, QtCore.Qt.MatchFlags(0))
return chums return chums
def showAllChums(self): def showAllChums(self):
for c in self.chums: for c in self.chums:
chandle = c.handle chandle = c.handle
if not len(self.findItems(chandle, QtCore.Qt.MatchContains | QtCore.Qt.MatchRecursive)): if not self.findItems(chandle, QtCore.Qt.MatchFlags(0)):
chumLabel = chumListing(c, self.mainwindow) chumLabel = chumListing(c, self.mainwindow)
self.addItem(chumLabel) self.addItem(chumLabel)
#self.sortItems() self.sortItems()
def hideOfflineChums(self): def hideOfflineChums(self):
for j in range(self.topLevelItemCount()):
i = 0
listing = self.topLevelItem(j).child(i)
while listing is not None:
if listing.chum.mood.name() == "offline":
self.topLevelItem(j).takeChild(i)
else:
i += 1
listing = self.topLevelItem(j).child(i)
self.topLevelItem(j).sortChildren(0, QtCore.Qt.AscendingOrder)
def showAllGroups(self):
curgroups = []
for i in range(self.topLevelItemCount()):
text = str(self.topLevelItem(i).text(0))
if text.rfind(" ") != -1:
text = text[0:text.rfind(" ")]
curgroups.append(text)
if "Chums" not in curgroups:
child_1 = QtGui.QTreeWidgetItem(["Chums"])
self.addTopLevelItem(child_1)
if self.mainwindow.config.openDefaultGroup():
child_1.setExpanded(True)
for i,g in enumerate(self.groups):
if g not in curgroups:
child_1 = QtGui.QTreeWidgetItem(["%s" % (g)])
self.addTopLevelItem(child_1)
if self.openGroups[i]:
child_1.setExpanded(True)
def showOnlineNumbers(self):
if hasattr(self, 'groups'):
self.hideOnlineNumbers()
totals = {'Chums': 0}
online = {'Chums': 0}
for g in self.groups:
totals[str(g)] = 0
online[str(g)] = 0
for c in self.chums:
yes = c.mood.name() != "offline"
if c.group == "Chums":
totals[str(c.group)] = totals[str(c.group)]+1
if yes:
online[str(c.group)] = online[str(c.group)]+1
elif c.group in totals:
totals[str(c.group)] = totals[str(c.group)]+1
if yes:
online[str(c.group)] = online[str(c.group)]+1
else:
totals["Chums"] = totals["Chums"]+1
if yes:
online["Chums"] = online["Chums"]+1
for i in range(self.topLevelItemCount()):
text = str(self.topLevelItem(i).text(0))
if text.rfind(" ") != -1:
text = text[0:text.rfind(" ")]
self.topLevelItem(i).setText(0, "%s (%i/%i)" % (text, online[text], totals[text]))
def hideOnlineNumbers(self):
for i in range(self.topLevelItemCount()):
text = str(self.topLevelItem(i).text(0))
if text.rfind(" ") != -1:
text = text[0:text.rfind(" ")]
self.topLevelItem(i).setText(0, "%s" % (text))
def hideEmptyGroups(self):
i = 0 i = 0
listing = self.topLevelItem(i) listing = self.item(i)
while listing is not None: while listing is not None:
if listing.childCount() == 0: if listing.chum.mood.name() == "offline":
self.takeTopLevelItem(i) self.takeItem(i)
else: else:
i += 1 i += 1
listing = self.topLevelItem(i) listing = self.item(i)
@QtCore.pyqtSlot() self.sortItems()
def expandGroup(self):
item = self.currentItem()
text = str(item.text(0))
if text.find(" ") != -1:
text = text[0:text.rfind(" ")]
if text in self.groups:
self.mainwindow.config.delGroup(text)
expand = item.isExpanded()
self.mainwindow.config.addGroup(text, not expand)
elif text == "Chums":
self.mainwindow.config.set("openDefaultGroup", not item.isExpanded())
def addItem(self, chumLabel):
if hasattr(self, 'groups'):
if chumLabel.chum.group not in self.groups:
if self.topLevelItemCount() == 0:
child_1 = QtGui.QTreeWidgetItem(["Chums"])
self.addTopLevelItem(child_1)
if self.mainwindow.config.openDefaultGroup():
child_1.setExpanded(True)
else:
text = str(self.topLevelItem(0).text(0))
if text.find(" ") != -1:
text = text[0:text.rfind(" ")]
if text != "Chums":
child_1 = QtGui.QTreeWidgetItem(["Chums"])
self.insertTopLevelItems(0, [child_1])
if self.mainwindow.config.openDefaultGroup():
child_1.setExpanded(True)
self.topLevelItem(0).addChild(chumLabel)
self.topLevelItem(0).sortChildren(0, QtCore.Qt.AscendingOrder)
else:
if not self.findItems(chumLabel.handle, QtCore.Qt.MatchContains | QtCore.Qt.MatchRecursive):
if not self.findItems(chumLabel.chum.group, QtCore.Qt.MatchContains):
child_1 = QtGui.QTreeWidgetItem(["%s" % (chumLabel.chum.group)])
self.addTopLevelItem(child_1)
if self.openGroups[self.groups.index("%s" % (chumLabel.chum.group))]:
child_1.setExpanded(True)
for i in range(self.topLevelItemCount()):
text = str(self.topLevelItem(i).text(0))
if text.rfind(" ") != -1:
text = text[0:text.rfind(" ")]
if text == chumLabel.chum.group:
break
self.topLevelItem(i).addChild(chumLabel)
self.topLevelItem(i).sortChildren(0, QtCore.Qt.AscendingOrder)
else: # usually means this is now the trollslum
if not self.findItems(chumLabel.handle, QtCore.Qt.MatchContains | QtCore.Qt.MatchRecursive):
self.topLevelItem(0).addChild(chumLabel)
self.topLevelItem(0).sortChildren(0, QtCore.Qt.AscendingOrder)
def takeItem(self, chumLabel):
r = None
for i in range(self.topLevelItemCount()):
for j in range(self.topLevelItem(i).childCount()):
if self.topLevelItem(i).child(j).text(0) == chumLabel.chum.handle:
r = self.topLevelItem(i).takeChild(j)
break
if not self.mainwindow.config.showEmptyGroups():
self.hideEmptyGroups()
return r
def updateMood(self, handle, mood): def updateMood(self, handle, mood):
hideoff = self.mainwindow.config.hideOfflineChums() hideoff = self.mainwindow.config.hideOfflineChums()
chums = self.getChums(handle) chums = self.getChums(handle)
@ -781,7 +536,7 @@ class chumArea(RightClickTree):
handle in [p.handle for p in self.chums]: handle in [p.handle for p in self.chums]:
newLabel = chumListing([p for p in self.chums if p.handle == handle][0], self.mainwindow) newLabel = chumListing([p for p in self.chums if p.handle == handle][0], self.mainwindow)
self.addItem(newLabel) self.addItem(newLabel)
#self.sortItems() self.sortItems()
chums = [newLabel] chums = [newLabel]
elif mood.name() == "offline" and \ elif mood.name() == "offline" and \
len(chums) > 0: len(chums) > 0:
@ -791,8 +546,6 @@ class chumArea(RightClickTree):
for c in chums: for c in chums:
oldmood = c.mood oldmood = c.mood
c.setMood(mood) c.setMood(mood)
if self.mainwindow.config.showOnlineNumbers():
self.showOnlineNumbers()
return oldmood return oldmood
def updateColor(self, handle, color): def updateColor(self, handle, color):
chums = self.findItems(handle, QtCore.Qt.MatchFlags(0)) chums = self.findItems(handle, QtCore.Qt.MatchFlags(0))
@ -809,27 +562,14 @@ class chumArea(RightClickTree):
self.removechum.setText(theme["main/menus/rclickchumlist/removechum"]) self.removechum.setText(theme["main/menus/rclickchumlist/removechum"])
self.blockchum.setText(theme["main/menus/rclickchumlist/blockchum"]) self.blockchum.setText(theme["main/menus/rclickchumlist/blockchum"])
self.logchum.setText(theme["main/menus/rclickchumlist/viewlog"]) self.logchum.setText(theme["main/menus/rclickchumlist/viewlog"])
self.removegroup.setText(theme["main/menus/rclickchumlist/removegroup"])
self.renamegroup.setText(theme["main/menus/rclickchumlist/renamegroup"])
self.moveMenu.setTitle(theme["main/menus/rclickchumlist/movechum"])
def changeTheme(self, theme): def changeTheme(self, theme):
self.initTheme(theme) self.initTheme(theme)
chumlistings = [] chumlistings = [self.item(i) for i in range(0, self.count())]
for i in range(self.topLevelItemCount()):
for j in range(self.topLevelItem(i).childCount()):
chumlistings.append(self.topLevelItem(i).child(j))
#chumlistings = [self.item(i) for i in range(0, self.count())]
for c in chumlistings: for c in chumlistings:
c.changeTheme(theme) c.changeTheme(theme)
def count(self):
c = 0
for i in range(self.topLevelItemCount()):
c = c + self.topLevelItem(i).childCount()
return c
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def activateChum(self): def activateChum(self):
self.itemActivated.emit(self.currentItem(), 0) self.itemActivated.emit(self.currentItem())
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def removeChum(self, handle = None): def removeChum(self, handle = None):
if handle: if handle:
@ -841,7 +581,7 @@ class chumArea(RightClickTree):
currentChum = self.currentItem().chum currentChum = self.currentItem().chum
self.chums = [c for c in self.chums if c.handle != currentChum.handle] self.chums = [c for c in self.chums if c.handle != currentChum.handle]
self.removeChumSignal.emit(self.currentItem().chum.handle) self.removeChumSignal.emit(self.currentItem().chum.handle)
oldlist = self.takeItem(self.currentItem()) oldlist = self.takeItem(self.currentRow())
del oldlist del oldlist
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def blockChum(self): def blockChum(self):
@ -850,8 +590,20 @@ class chumArea(RightClickTree):
return return
self.blockChumSignal.emit(self.currentItem().chum.handle) self.blockChumSignal.emit(self.currentItem().chum.handle)
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def reportChum(self):
currentChum = self.currentItem()
if not currentChum:
return
self.mainwindow.reportChum(self.currentItem().chum.handle)
@QtCore.pyqtSlot()
def findAlts(self):
currentChum = self.currentItem()
if not currentChum:
return
self.mainwindow.sendMessage.emit("ALT %s" % (currentChum.chum.handle) , "calSprite")
@QtCore.pyqtSlot()
def openChumLogs(self): def openChumLogs(self):
currentChum = self.currentItem().text(0) currentChum = self.currentItem().text()
if not currentChum: if not currentChum:
return return
self.pesterlogviewer = PesterLogViewer(currentChum, self.mainwindow.config, self.mainwindow.theme, self.mainwindow) self.pesterlogviewer = PesterLogViewer(currentChum, self.mainwindow.config, self.mainwindow.theme, self.mainwindow)
@ -866,67 +618,20 @@ class chumArea(RightClickTree):
self.pesterlogviewer = None self.pesterlogviewer = None
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def renameGroup(self): def renameGroup(self):
if not hasattr(self, 'renamegroupdialog'): (gname, ok) = QtGui.QInputDialog.getText(self, "Rename Group", "Enter a new name for the group:")
self.renamegroupdialog = None if ok:
if not self.renamegroupdialog: pass
(gname, ok) = QtGui.QInputDialog.getText(self, "Rename Group", "Enter a new name for the group:") #rename group
if ok:
gname = unicode(gname)
currentGroup = self.currentItem()
if not currentGroup:
return
index = self.indexOfTopLevelItem(currentGroup)
if index != -1:
expanded = currentGroup.isExpanded()
text = str(currentGroup.text(0))
if text.rfind(" ") != -1:
text = text[0:text.rfind(" ")]
self.mainwindow.config.delGroup(text)
self.mainwindow.config.addGroup(gname, expanded)
gTemp = self.mainwindow.config.getGroups()
self.groups = [g[0] for g in gTemp]
self.openGroups = [g[1] for g in gTemp]
for i in range(currentGroup.childCount()):
currentGroup.child(i).chum.group = gname
self.mainwindow.chumdb.setGroup(currentGroup.child(i).chum.handle, gname)
currentGroup.setText(0, gname)
if self.mainwindow.config.showOnlineNumbers():
self.showOnlineNumbers()
self.renamegroupdialog = None
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def removeGroup(self): def removeGroup(self):
currentGroup = self.currentItem() pass
if not currentGroup: #remove group
return
text = str(currentGroup.text(0))
if text.rfind(" ") != -1:
text = text[0:text.rfind(" ")]
self.mainwindow.config.delGroup(text)
gTemp = self.mainwindow.config.getGroups()
self.groups = [g[0] for g in gTemp]
self.openGroups = [g[1] for g in gTemp]
for i in range(self.topLevelItemCount()):
if self.topLevelItem(i).text(0) == currentGroup.text(0):
break
while self.topLevelItem(i) and self.topLevelItem(i).child(0):
chumLabel = self.topLevelItem(i).child(0)
chumLabel.chum.group = "Chums"
self.mainwindow.chumdb.setGroup(chumLabel.chum.handle, "Chums")
self.takeItem(chumLabel)
self.addItem(chumLabel)
self.takeTopLevelItem(i)
@QtCore.pyqtSlot(QtGui.QAction) @QtCore.pyqtSlot(QtGui.QAction)
def moveToGroup(self, item): def moveToGroup(self, item):
if not item: pass
return #move to group
group = str(item.text())
chumLabel = self.currentItem()
if not chumLabel:
return
chumLabel.chum.group = group
self.mainwindow.chumdb.setGroup(chumLabel.chum.handle, group)
self.takeItem(chumLabel)
self.addItem(chumLabel)
removeChumSignal = QtCore.pyqtSignal(QtCore.QString) removeChumSignal = QtCore.pyqtSignal(QtCore.QString)
blockChumSignal = QtCore.pyqtSignal(QtCore.QString) blockChumSignal = QtCore.pyqtSignal(QtCore.QString)
@ -938,34 +643,19 @@ class trollSlum(chumArea):
theme = self.mainwindow.theme theme = self.mainwindow.theme
self.setStyleSheet(theme["main/trollslum/chumroll/style"]) self.setStyleSheet(theme["main/trollslum/chumroll/style"])
self.chums = trolls self.chums = trolls
child_1 = QtGui.QTreeWidgetItem([""])
self.addTopLevelItem(child_1)
child_1.setExpanded(True)
for c in self.chums: for c in self.chums:
chandle = c.handle chandle = c.handle
if not self.findItems(chandle, QtCore.Qt.MatchFlags(0)): if not self.findItems(chandle, QtCore.Qt.MatchFlags(0)):
chumLabel = chumListing(c, self.mainwindow) chumLabel = chumListing(c, self.mainwindow)
self.addItem(chumLabel) self.addItem(chumLabel)
self.setSortingEnabled(False)
self.header().hide()
self.setDropIndicatorShown(False)
self.setIndentation(0)
self.optionsMenu = QtGui.QMenu(self) self.optionsMenu = QtGui.QMenu(self)
self.unblockchum = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/unblockchum"], self) self.unblockchum = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/unblockchum"], self)
self.connect(self.unblockchum, QtCore.SIGNAL('triggered()'), self.connect(self.unblockchum, QtCore.SIGNAL('triggered()'),
self, QtCore.SIGNAL('unblockChumSignal()')) self, QtCore.SIGNAL('unblockChumSignal()'))
self.optionsMenu.addAction(self.unblockchum) self.optionsMenu.addAction(self.unblockchum)
#self.sortItems() self.sortItems()
def contextMenuEvent(self, event):
#fuckin Qt
if event.reason() == QtGui.QContextMenuEvent.Mouse:
listing = self.itemAt(event.pos())
self.setCurrentItem(listing)
if self.currentItem().text(0) != "":
self.optionsMenu.popup(event.globalPos())
def changeTheme(self, theme): def changeTheme(self, theme):
self.setStyleSheet(theme["main/trollslum/chumroll/style"]) self.setStyleSheet(theme["main/trollslum/chumroll/style"])
self.removechum.setText(theme["main/menus/rclickchumlist/removechum"]) self.removechum.setText(theme["main/menus/rclickchumlist/removechum"])
@ -1182,10 +872,6 @@ class PesterWindow(MovingWindow):
self.logv = logv self.logv = logv
self.connect(logv, QtCore.SIGNAL('triggered()'), self.connect(logv, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('openLogv()')) self, QtCore.SLOT('openLogv()'))
grps = QtGui.QAction(self.theme["main/menus/client/addgroup"], self)
self.grps = grps
self.connect(grps, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('addGroupWindow()'))
opts = QtGui.QAction(self.theme["main/menus/client/options"], self) opts = QtGui.QAction(self.theme["main/menus/client/options"], self)
self.opts = opts self.opts = opts
self.connect(opts, QtCore.SIGNAL('triggered()'), self.connect(opts, QtCore.SIGNAL('triggered()'),
@ -1222,7 +908,6 @@ class PesterWindow(MovingWindow):
filemenu.addAction(logv) filemenu.addAction(logv)
filemenu.addAction(userlistaction) filemenu.addAction(userlistaction)
filemenu.addAction(self.idleaction) filemenu.addAction(self.idleaction)
filemenu.addAction(grps)
filemenu.addAction(self.importaction) filemenu.addAction(self.importaction)
filemenu.addAction(self.reconnectAction) filemenu.addAction(self.reconnectAction)
filemenu.addAction(exitaction) filemenu.addAction(exitaction)
@ -1261,15 +946,18 @@ class PesterWindow(MovingWindow):
self.aboutAction = QtGui.QAction(self.theme["main/menus/help/about"], self) self.aboutAction = QtGui.QAction(self.theme["main/menus/help/about"], self)
self.connect(self.aboutAction, QtCore.SIGNAL('triggered()'), self.connect(self.aboutAction, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('aboutPesterchum()')) self, QtCore.SLOT('aboutPesterchum()'))
self.botAction = QtGui.QAction("CALSPRITE", self)
self.connect(self.botAction, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('loadCalsprite()'))
self.helpAction = QtGui.QAction("HELP", self) self.helpAction = QtGui.QAction("HELP", self)
self.connect(self.helpAction, QtCore.SIGNAL('triggered()'), self.connect(self.helpAction, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('launchHelp()')) self, QtCore.SLOT('launchHelp()'))
helpmenu = self.menu.addMenu(self.theme["main/menus/help/_name"]) helpmenu = self.menu.addMenu(self.theme["main/menus/help/_name"])
self.helpmenu = helpmenu self.helpmenu = helpmenu
self.helpmenu.addAction(self.helpAction) self.helpmenu.addAction(self.helpAction)
self.helpmenu.addAction(self.botAction)
self.helpmenu.addAction(self.aboutAction) self.helpmenu.addAction(self.aboutAction)
self.closeButton = WMButton(PesterIcon(self.theme["main/close/image"]), self) self.closeButton = WMButton(PesterIcon(self.theme["main/close/image"]), self)
self.connect(self.closeButton, QtCore.SIGNAL('clicked()'), self.connect(self.closeButton, QtCore.SIGNAL('clicked()'),
self, QtCore.SLOT('closeToTray()')) self, QtCore.SLOT('closeToTray()'))
@ -1283,7 +971,7 @@ class PesterWindow(MovingWindow):
chums = [PesterProfile(c, chumdb=self.chumdb) for c in set(self.config.chums())] chums = [PesterProfile(c, chumdb=self.chumdb) for c in set(self.config.chums())]
self.chumList = chumArea(chums, self) self.chumList = chumArea(chums, self)
self.connect(self.chumList, self.connect(self.chumList,
QtCore.SIGNAL('itemActivated(QTreeWidgetItem *, int)'), QtCore.SIGNAL('itemActivated(QListWidgetItem *)'),
self, self,
QtCore.SLOT('pesterSelectedChum()')) QtCore.SLOT('pesterSelectedChum()'))
self.connect(self.chumList, self.connect(self.chumList,
@ -1389,10 +1077,10 @@ class PesterWindow(MovingWindow):
else: else:
self.alarm.play() self.alarm.play()
def newMemoMsg(self, chan, handle, msg): def newMemoMsg(self, chan, handle, msg):
if not self.memos.has_key(chan): if not self.memos.has_key(chan.upper()):
# silently ignore in case we forgot to /part # silently ignore in case we forgot to /part
return return
memo = self.memos[chan] memo = self.memos[chan.upper()]
msg = unicode(msg) msg = unicode(msg)
if not memo.times.has_key(handle): if not memo.times.has_key(handle):
# new chum! time current # new chum! time current
@ -1420,6 +1108,16 @@ class PesterWindow(MovingWindow):
if hasattr(self, 'trollslum') and self.trollslum: if hasattr(self, 'trollslum') and self.trollslum:
self.trollslum.updateMood(handle, mood) self.trollslum.updateMood(handle, mood)
def newConversation(self, chum, initiated=True): def newConversation(self, chum, initiated=True):
if type(chum) in [str, unicode]:
matchingChums = [c for c in self.chumList.chums if c.handle == chum]
if len(matchingChums) > 0:
mood = matchingChums[0].mood
else:
mood = Mood(2)
chum = PesterProfile(chum, mood=mood, chumdb=self.chumdb)
if len(matchingChums) == 0:
self.moodRequest.emit(chum)
if self.convos.has_key(chum.handle): if self.convos.has_key(chum.handle):
self.convos[chum.handle].showChat() self.convos[chum.handle].showChat()
return return
@ -1450,8 +1148,8 @@ class PesterWindow(MovingWindow):
def newMemo(self, channel, timestr, secret=False): 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.upper()):
self.memos[channel].showChat() self.memos[channel.upper()].showChat()
return return
# do slider dialog then set # do slider dialog then set
if self.config.tabs(): if self.config.tabs():
@ -1472,7 +1170,7 @@ class PesterWindow(MovingWindow):
QtCore.SIGNAL('userPresentSignal(QString, QString, QString)'), QtCore.SIGNAL('userPresentSignal(QString, QString, QString)'),
memoWindow, QtCore.SLOT('userPresentChange(QString, QString, QString)')) memoWindow, QtCore.SLOT('userPresentChange(QString, QString, QString)'))
# chat client send memo open # chat client send memo open
self.memos[channel] = memoWindow self.memos[channel.upper()] = memoWindow
self.joinChannel.emit(channel) # race condition? self.joinChannel.emit(channel) # race condition?
self.secret = secret self.secret = secret
if self.secret: if self.secret:
@ -1519,7 +1217,6 @@ class PesterWindow(MovingWindow):
# menus # menus
self.menu.move(*theme["main/menu/loc"]) self.menu.move(*theme["main/menu/loc"])
self.logv.setText(theme["main/menus/client/logviewer"]) self.logv.setText(theme["main/menus/client/logviewer"])
self.grps.setText(theme["main/menus/client/addgroup"])
self.opts.setText(theme["main/menus/client/options"]) self.opts.setText(theme["main/menus/client/options"])
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"])
@ -1674,12 +1371,7 @@ class PesterWindow(MovingWindow):
def pesterSelectedChum(self): def pesterSelectedChum(self):
curChum = self.chumList.currentItem() curChum = self.chumList.currentItem()
if curChum: if curChum:
text = str(curChum.text(0)) self.newConversationWindow(curChum)
if text.find(" ") != -1:
text = text[0:text.rfind(" ")]
if text not in self.chumList.groups and \
text != "Chums":
self.newConversationWindow(curChum)
@QtCore.pyqtSlot(QtGui.QListWidgetItem) @QtCore.pyqtSlot(QtGui.QListWidgetItem)
def newConversationWindow(self, chumlisting): def newConversationWindow(self, chumlisting):
# check chumdb # check chumdb
@ -1703,7 +1395,7 @@ class PesterWindow(MovingWindow):
c = unicode(channel) c = unicode(channel)
self.chatlog.finish(c) self.chatlog.finish(c)
self.leftChannel.emit(channel) self.leftChannel.emit(channel)
del self.memos[c] del self.memos[c.upper()]
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def tabsClosed(self): def tabsClosed(self):
del self.tabconvo del self.tabconvo
@ -1735,19 +1427,19 @@ class PesterWindow(MovingWindow):
@QtCore.pyqtSlot(QtCore.QString, QtCore.QString, QtCore.QString) @QtCore.pyqtSlot(QtCore.QString, QtCore.QString, QtCore.QString)
def timeCommand(self, chan, handle, command): def timeCommand(self, chan, handle, command):
(c, h, cmd) = (unicode(chan), unicode(handle), unicode(command)) (c, h, cmd) = (unicode(chan), unicode(handle), unicode(command))
if self.memos[c]: if self.memos[c.upper()]:
self.memos[c].timeUpdate(h, cmd) self.memos[c.upper()].timeUpdate(h, cmd)
@QtCore.pyqtSlot(QtCore.QString, PesterList) @QtCore.pyqtSlot(QtCore.QString, PesterList)
def updateNames(self, channel, names): def updateNames(self, channel, names):
c = unicode(channel) c = unicode(channel).upper()
# update name DB # update name DB
self.namesdb[c] = names self.namesdb[c] = names
# warn interested party of names # warn interested party of names
self.namesUpdated.emit() self.namesUpdated.emit()
@QtCore.pyqtSlot(QtCore.QString, QtCore.QString, QtCore.QString) @QtCore.pyqtSlot(QtCore.QString, QtCore.QString, QtCore.QString)
def userPresentUpdate(self, handle, channel, update): def userPresentUpdate(self, handle, channel, update):
c = unicode(channel) c = unicode(channel).upper()
n = unicode(handle) n = unicode(handle)
if update == "nick": if update == "nick":
l = n.split(":") l = n.split(":")
@ -1811,6 +1503,11 @@ class PesterWindow(MovingWindow):
@QtCore.pyqtSlot(QtCore.QString) @QtCore.pyqtSlot(QtCore.QString)
def removeChum(self, chumlisting): def removeChum(self, chumlisting):
self.config.removeChum(chumlisting) self.config.removeChum(chumlisting)
def reportChum(self, handle):
(reason, ok) = QtGui.QInputDialog.getText(self, "Report User", "Enter the reason you are reporting this user (optional):")
if ok:
self.sendMessage.emit("REPORT %s %s" % (handle, reason) , "calSprite")
@QtCore.pyqtSlot(QtCore.QString) @QtCore.pyqtSlot(QtCore.QString)
def blockChum(self, handle): def blockChum(self, handle):
h = unicode(handle) h = unicode(handle)
@ -1970,6 +1667,8 @@ class PesterWindow(MovingWindow):
self, QtCore.SLOT('userListClose()')) self, QtCore.SLOT('userListClose()'))
self.connect(self.allusers, QtCore.SIGNAL('addChum(QString)'), self.connect(self.allusers, QtCore.SIGNAL('addChum(QString)'),
self, QtCore.SLOT('userListAdd(QString)')) self, QtCore.SLOT('userListAdd(QString)'))
self.connect(self.allusers, QtCore.SIGNAL('pesterChum(QString)'),
self, QtCore.SLOT('userListPester(QString)'))
self.requestNames.emit("#pesterchum") self.requestNames.emit("#pesterchum")
self.allusers.show() self.allusers.show()
@ -1978,6 +1677,10 @@ class PesterWindow(MovingWindow):
h = unicode(handle) h = unicode(handle)
chum = PesterProfile(h, chumdb=self.chumdb) chum = PesterProfile(h, chumdb=self.chumdb)
self.addChum(chum) self.addChum(chum)
@QtCore.pyqtSlot(QtCore.QString)
def userListPester(self, handle):
h = unicode(handle)
self.newConversation(h)
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def userListClose(self): def userListClose(self):
self.allusers = None self.allusers = None
@ -2020,25 +1723,6 @@ class PesterWindow(MovingWindow):
def closeLogUsers(self): def closeLogUsers(self):
self.logusermenu.close() self.logusermenu.close()
self.logusermenu = None self.logusermenu = None
@QtCore.pyqtSlot()
def addGroupWindow(self):
if not hasattr(self, 'addgroupdialog'):
self.addgroupdialog = None
if not self.addgroupdialog:
(gname, ok) = QtGui.QInputDialog.getText(self, "Add Group", "Enter a name for the new group:")
if ok:
gname = unicode(gname)
self.config.addGroup(gname)
gTemp = self.config.getGroups()
self.chumList.groups = [g[0] for g in gTemp]
self.chumList.openGroups = [g[1] for g in gTemp]
self.chumList.showAllGroups()
if not self.config.showEmptyGroups():
self.chumList.hideEmptyGroups()
self.addgroupdialog = None
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def openOpts(self): def openOpts(self):
if not hasattr(self, 'optionmenu'): if not hasattr(self, 'optionmenu'):
@ -2120,24 +1804,6 @@ class PesterWindow(MovingWindow):
self.config.set("time12Format", False) self.config.set("time12Format", False)
secondssetting = self.optionmenu.secondscheck.isChecked() secondssetting = self.optionmenu.secondscheck.isChecked()
self.config.set("showSeconds", secondssetting) self.config.set("showSeconds", secondssetting)
# groups
#groupssetting = self.optionmenu.groupscheck.isChecked()
#self.config.set("useGroups", groupssetting)
emptygroupssetting = self.optionmenu.showemptycheck.isChecked()
curemptygroup = self.config.showEmptyGroups()
if curemptygroup and not emptygroupssetting:
self.chumList.hideEmptyGroups()
elif emptygroupssetting and not curemptygroup:
self.chumList.showAllGroups()
self.config.set("emptyGroups", emptygroupssetting)
# online numbers
onlinenumsetting = self.optionmenu.showonlinenumbers.isChecked()
curonlinenum = self.config.showOnlineNumbers()
if onlinenumsetting and not curonlinenum:
self.chumList.showOnlineNumbers()
elif curonlinenum and not onlinenumsetting:
self.chumList.hideOnlineNumbers()
self.config.set("onlineNumbers", onlinenumsetting)
self.optionmenu = None self.optionmenu = None
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
@ -2245,6 +1911,9 @@ class PesterWindow(MovingWindow):
self.aboutwindow.exec_() self.aboutwindow.exec_()
self.aboutwindow = None self.aboutwindow = None
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def loadCalsprite(self):
self.newConversation("calSprite")
@QtCore.pyqtSlot()
def launchHelp(self): def launchHelp(self):
QtGui.QDesktopServices.openUrl(QtCore.QUrl("http://nova.xzibition.com/~illuminatedwax/help.html", QtCore.QUrl.TolerantMode)) QtGui.QDesktopServices.openUrl(QtCore.QUrl("http://nova.xzibition.com/~illuminatedwax/help.html", QtCore.QUrl.TolerantMode))

View file

@ -1,4 +1,21 @@
Welcome to Pesterchum 3.14! Welcome to Pesterchum 3.14.1!
WHAT'S NEW?
-----------
* Quirks now have a lower(), scramble(), and reverse() function!
* Timestamps - check your Config!
* Logviewer - View logs right in Pesterchum!
* Quirk ordering - order your quirks so they work right!
* # of users in a memo - You can now see how many users are in a memo.
* @links to users - typing @ before user's name creates a link
that will pester them!
* Support for REPORT and ALT to calSprite built in -
If someone is bothering you, or a canon handle is idle, or
for whatever reason, right click their name and go to "Report"
to report them to a moderator.
If you want to talk to an alt canon handle, just right click
the username!
if you have an alt handle, register it with calSprite!
Here's some tips to help you get started: Here's some tips to help you get started:
@ -59,6 +76,44 @@ list later on in this readme.
FA% FA%
--- ---
Q: Norton says it has a virus and then deletes it!
A: Read this helpful Norton FAQ:
Alright, here's a guide to by-passing Norton:
First, to download Pesterchum:
1: Make sure you're on a Moderator account. Moreso for the Norton steps than these ones.
2: Download the .zip file, not the .exe file.
3: Unzip the .zip file onto memory. Pesterchum should now be installed.
Now, to by-pass Norton:
1: Make sure you're still on a moderator account.
2: Open up Norton.
3: Click on 'Settings' up in the upperright hand corner.
4: Click on 'Anitivirus', off to the upper left. It has a small image of a needle or something similar off to it's side.
5: There's a word that reads 'SONAR protection' halfway to the bottomleft. Off to it's right, there's a bar that's half green. Click on the bar.
6: It will warn you about turning off SONAR. Have it set to turn back on when the system restarts.
7: If done properly, the background for the main page of Norton(what you saw on steps 2-3) has turned an apocaliptic red. Feel free to close Norton now. Keep in mind to stay off suspicious online sites now.
8: Open up Pesterchum, and let the chummy convos begin.
When finished:
First, Log off of Pesterchum. LOG OFF, NOT CLOSE IT.
Then, you can either shut off your comp, and Norton will re-enable SONAR, or you can repeat steps 1-5, except turning the red bar green. If done right, Norton will be it's happy color again.
Keep in mind that you must repeat all of this(other than the download) every time you want to get on Pesterchum.
Hope this is helpful!
(This guide brought to you by the slightly combined efforts of empireomega and Xanaomin)
Q: I can't connect because my school/university/network/stolen wifi is blocking my connection! OR I can't seem to connect to the server at all and I'm not running any firewalls!
A: Edit your pesterchum.js file. Open it up in notepad or something, and then edit the beginning so it looks like this:
{"port": "1413", ....
where the .... is the rest of the gobbledygook there.
Q: The mood buttons on Pesterchum 6.0 don't match up to what it sets your mood to! What gives?
A: The mood names are just there to look canon. It is intentional.
Q: I'm appearing as offline to 2.5 users/other users appear the wrong Q: I'm appearing as offline to 2.5 users/other users appear the wrong
mood? What's happeninggggg mood? What's happeninggggg
A: The 2.5 people decided to change the mood protocol. When I made A: The 2.5 people decided to change the mood protocol. When I made
@ -274,6 +329,12 @@ PC will save your color, quirks, and theme for that profile. Chumrolls
and block lists are the same for all profiles. Feel free to have and block lists are the same for all profiles. Feel free to have
multiple instances of PC running on two or more handles! multiple instances of PC running on two or more handles!
CALSPRITE
---------
calSprite is the bot that helps moderate canon handle usage! Simply pester
calSprite with the world "HELP" (turn your quirks off!) and you
will get instructions on how to use calSprite!
QUIRKS QUIRKS
------ ------
There are six kinds of quirks! I'll teach you how to use them all! There are six kinds of quirks! I'll teach you how to use them all!

BIN
smilies/discontent.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 360 B

After

Width:  |  Height:  |  Size: 360 B

View file

@ -20,10 +20,9 @@
"memos": "Memos", "memos": "Memos",
"logviewer": "Pesterlogs", "logviewer": "Pesterlogs",
"userlist": "Userlist", "userlist": "Userlist",
"addgroup": "Add Group",
"import": "Import", "import": "Import",
"reconnect": "Reconnect", "reconnect": "Reconnect",
"idle": "Idle", "idle": "Idle",
"exit": "Exit"}, "exit": "Exit"},
"profile": {"_name": "Profile", "profile": {"_name": "Profile",
"switch": "Switch", "switch": "Switch",
@ -36,12 +35,10 @@
"rclickchumlist": {"pester": "Pester", "rclickchumlist": {"pester": "Pester",
"removechum": "Remove Chum", "removechum": "Remove Chum",
"blockchum": "Block", "blockchum": "Block",
"report": "Report",
"addchum": "Add Chum", "addchum": "Add Chum",
"viewlog": "View Pesterlog", "viewlog": "View Pesterlog",
"unblockchum": "Unblock", "unblockchum": "Unblock",
"removegroup": "Remove Group",
"renamegroup": "Rename Group",
"movechum": "Move To",
"banuser": "Ban User", "banuser": "Ban User",
"opuser": "Make OP", "opuser": "Make OP",
"quirksoff": "Quirks Off" "quirksoff": "Quirks Off"
@ -58,7 +55,7 @@
"loc": [440, 211], "loc": [440, 211],
"size": [289, 275], "size": [289, 275],
"userlistcolor": "black", "userlistcolor": "black",
"moods": { "moods": {
"chummy": { "icon": "$path/chummy.gif", "color": "black" }, "chummy": { "icon": "$path/chummy.gif", "color": "black" },
@ -66,7 +63,7 @@
"offline": { "icon": "$path/offline.gif", "color": "#9d9d9d"}, "offline": { "icon": "$path/offline.gif", "color": "#9d9d9d"},
"pleasant": { "icon": "$path/pleasant.gif", "color": "black" }, "pleasant": { "icon": "$path/pleasant.gif", "color": "black" },
"distraught": { "icon": "$path/distraught.gif", "color": "black" }, "distraught": { "icon": "$path/distraught.gif", "color": "black" },
@ -94,7 +91,7 @@
"devious": { "icon": "$path/devious.gif", "color": "red" }, "devious": { "icon": "$path/devious.gif", "color": "red" },
"sleek": { "icon": "$path/sleek.gif", "color": "red" }, "sleek": { "icon": "$path/sleek.gif", "color": "red" },
"detestful": { "icon": "$path/detestful.gif", "color": "red" }, "detestful": { "icon": "$path/detestful.gif", "color": "red" },
"mirthful": { "icon": "$path/mirthful.gif", "color": "red" }, "mirthful": { "icon": "$path/mirthful.gif", "color": "red" },
@ -113,7 +110,7 @@
} }
}, },
"trollslum": { "trollslum": {
"style": "background: #fdb302; border:2px solid yellow; font-family: 'Century Gothic'", "style": "background: #fdb302; border:2px solid yellow; font-family: 'Century Gothic'",
"size": [195, 200], "size": [195, 200],
"label": { "text": "TROLLSLUM", "label": { "text": "TROLLSLUM",
@ -131,7 +128,7 @@
"text": "" }, "text": "" },
"currentMood": [1500, 1500] "currentMood": [1500, 1500]
}, },
"defaultwindow": { "style": "background: #fdb302; font-family:'Century Gothic';font:bold;selection-background-color:#919191; " "defaultwindow": { "style": "background: #fdb302; font-family:'Century Gothic';font:bold;selection-background-color:#919191; "
}, },
"addchum": { "style": "background: rgba(255, 255, 0, 0%); border:0px; color: rgba(0, 0, 0, 0%);", "addchum": { "style": "background: rgba(255, 255, 0, 0%); border:0px; color: rgba(0, 0, 0, 0%);",
"loc": [443,144], "loc": [443,144],
@ -151,82 +148,82 @@
}, },
"defaultmood": 0, "defaultmood": 0,
"moodlabel": { "style": "", "moodlabel": { "style": "",
"loc": [20, 430], "loc": [20, 430],
"text": "" "text": ""
}, },
"moods": [ "moods": [
{ "style": "background-image:url($path/mood1.png); border:0px;", { "style": "background-image:url($path/mood1.png); border:0px;",
"selected": "background-image:url($path/mood1c.png); border:0px;", "selected": "background-image:url($path/mood1c.png); border:0px;",
"loc": [0, 258], "loc": [0, 258],
"size": [100,110], "size": [100,110],
"text": "", "text": "",
"icon": "", "icon": "",
"mood": 0 "mood": 0
}, },
{ "style": "background-image:url($path/mood2.png); border:0px;", { "style": "background-image:url($path/mood2.png); border:0px;",
"selected": "background-image:url($path/mood2c.png); border:0px;", "selected": "background-image:url($path/mood2c.png); border:0px;",
"loc": [106, 258], "loc": [106, 258],
"size": [100, 110], "size": [100, 110],
"text": "", "text": "",
"icon": "", "icon": "",
"mood": 19 "mood": 19
}, },
{ "style": "background-image:url($path/mood3.png); border:0px;", { "style": "background-image:url($path/mood3.png); border:0px;",
"selected": "background-image:url($path/mood3c.png); border:0px;", "selected": "background-image:url($path/mood3c.png); border:0px;",
"loc": [212, 258], "loc": [212, 258],
"size": [100, 110], "size": [100, 110],
"text": "", "text": "",
"icon": "", "icon": "",
"mood": 22 "mood": 22
}, },
{ "style": "background-image:url($path/mood4.png); border:0px;", { "style": "background-image:url($path/mood4.png); border:0px;",
"selected": "background-image:url($path/mood4c.png); border:0px;", "selected": "background-image:url($path/mood4c.png); border:0px;",
"loc": [318, 258], "loc": [318, 258],
"size": [100, 110], "size": [100, 110],
"text": "", "text": "",
"icon": "", "icon": "",
"mood": 4 "mood": 4
}, },
{ "style": "background-image:url($path/mood5.png); border:0px;", { "style": "background-image:url($path/mood5.png); border:0px;",
"selected": "background-image:url($path/mood5c.png); border:0px;", "selected": "background-image:url($path/mood5c.png); border:0px;",
"loc": [0, 382], "loc": [0, 382],
"size": [100, 110], "size": [100, 110],
"text": "", "text": "",
"icon": "", "icon": "",
"mood": 3 "mood": 3
}, },
{ "style": "background-image:url($path/mood6.png); border:0px;", { "style": "background-image:url($path/mood6.png); border:0px;",
"selected": "background-image:url($path/mood6c.png); border:0px;", "selected": "background-image:url($path/mood6c.png); border:0px;",
"loc": [106, 382], "loc": [106, 382],
"size": [100, 110], "size": [100, 110],
"text": "", "text": "",
"icon": "", "icon": "",
"mood": 20 "mood": 20
}, },
{ "style": "background-image:url($path/mood7.png); border:0px;", { "style": "background-image:url($path/mood7.png); border:0px;",
"selected": "background-image:url($path/mood7c.png); border:0px;", "selected": "background-image:url($path/mood7c.png); border:0px;",
"loc": [212, 382], "loc": [212, 382],
"size": [100, 110], "size": [100, 110],
"text": "", "text": "",
"icon": "", "icon": "",
"mood": 5 "mood": 5
}, },
{ "style": "background-image:url($path/mood8.png); border:0px;", { "style": "background-image:url($path/mood8.png); border:0px;",
"selected": "background-image:url($path/mood8c.png); border:0px;", "selected": "background-image:url($path/mood8c.png); border:0px;",
"loc": [318, 382], "loc": [318, 382],
"size": [100, 110], "size": [100, 110],
"text": "", "text": "",
"icon": "", "icon": "",
"mood": 1 "mood": 1
}, },
{ "style": "border:0px;", { "style": "border:0px;",
"selected": "border:0px;", "selected": "border:0px;",
"loc": [0, 0], "loc": [0, 0],
"size": [100, 100], "size": [100, 100],
"text": "", "text": "",
"icon": "", "icon": "",
"mood": 2 "mood": 2
} }
] ]
}, },
"convo": "convo":
@ -234,7 +231,7 @@
"tabstyle": "background-color: #fdb302; font-family: 'Century Gothic'", "tabstyle": "background-color: #fdb302; font-family: 'Century Gothic'",
"scrollbar": { "style" : "padding-top:17px; padding-bottom:17px;width: 18px; background: rgba(255, 255, 0, 0%); border:0px;", "scrollbar": { "style" : "padding-top:17px; padding-bottom:17px;width: 18px; background: rgba(255, 255, 0, 0%); border:0px;",
"handle": "border-width: 5px; border-image:url($path/scrollbg.png) 5px; min-height:60px;", "handle": "border-width: 5px; border-image:url($path/scrollbg.png) 5px; min-height:60px;",
"downarrow": "height:17px;border:0px solid #c48a00;", "downarrow": "height:17px;border:0px solid #c48a00;",
"darrowstyle": "image:url($path/downarrow.png);", "darrowstyle": "image:url($path/downarrow.png);",
"uparrow": "height:17px;border:0px solid #c48a00;", "uparrow": "height:17px;border:0px solid #c48a00;",
"uarrowstyle": "image:url($path/uparrow.png);" "uarrowstyle": "image:url($path/uparrow.png);"
@ -262,12 +259,12 @@
"ceasepester": "ceased pestering", "ceasepester": "ceased pestering",
"blocked": "blocked", "blocked": "blocked",
"unblocked": "unblocked", "unblocked": "unblocked",
"blockedmsg": "did not receive message from", "blockedmsg": "did not receive message from",
"openmemo": "opened memo on board", "openmemo": "opened memo on board",
"joinmemo": "responded to memo", "joinmemo": "responded to memo",
"closememo": "ceased responding to memo", "closememo": "ceased responding to memo",
"kickedmemo": "You have been banned from this memo!", "kickedmemo": "You have been banned from this memo!",
"idle": "is now an idle chum!" "idle": "is now an idle chum!"
}, },
"systemMsgColor": "#646464" "systemMsgColor": "#646464"
}, },
@ -282,7 +279,7 @@
}, },
"scrollbar": { "style" : "padding-top:17px; padding-bottom:17px;width: 18px; background: rgba(255, 255, 0, 0%); border:0px;", "scrollbar": { "style" : "padding-top:17px; padding-bottom:17px;width: 18px; background: rgba(255, 255, 0, 0%); border:0px;",
"handle": "border-width: 5px; border-image:url($path/scrollbg.png) 5px; min-height:60px;", "handle": "border-width: 5px; border-image:url($path/scrollbg.png) 5px; min-height:60px;",
"downarrow": "height:17px;border:0px;", "downarrow": "height:17px;border:0px;",
"darrowstyle": "image:url();", "darrowstyle": "image:url();",
"uparrow": "height:17px;border:0px;", "uparrow": "height:17px;border:0px;",
"uarrowstyle": "image:url();" "uarrowstyle": "image:url();"
@ -299,20 +296,20 @@
"userlist": { "width": 150, "userlist": { "width": 150,
"style": "border:2px solid #c48a00; background: white; font-family: 'Century Gothic';selection-background-color:#646464; font-size: 14px; margin-left:0px; margin-right:10px;" "style": "border:2px solid #c48a00; background: white; font-family: 'Century Gothic';selection-background-color:#646464; font-size: 14px; margin-left:0px; margin-right:10px;"
}, },
"time": { "text": { "width": 75, "time": { "text": { "width": 75,
"style": " border: 2px solid yellow; background: white; font-size: 12px; margin-top: 5px; margin-right: 5px; margin-left: 5px; font-family:'Century Gothic';font:bold;" "style": " border: 2px solid yellow; background: white; font-size: 12px; margin-top: 5px; margin-right: 5px; margin-left: 5px; font-family:'Century Gothic';font:bold;"
}, },
"slider": { "style": "border: 0px;", "slider": { "style": "border: 0px;",
"groove": "", "groove": "",
"handle": "" "handle": ""
}, },
"buttons": { "style": "color: black; font: bold; border: 2px solid #c48a00; font-size: 12px; background: yellow; margin-top: 5px; margin-right: 5px; margin-left: 5px; padding: 2px; width: 50px;" }, "buttons": { "style": "color: black; font: bold; border: 2px solid #c48a00; font-size: 12px; background: yellow; margin-top: 5px; margin-right: 5px; margin-left: 5px; padding: 2px; width: 50px;" },
"arrows": { "left": "$path/leftarrow.png", "arrows": { "left": "$path/leftarrow.png",
"right": "$path/rightarrow.png", "right": "$path/rightarrow.png",
"style": " border:0px; margin-top: 5px; margin-right:10px;" "style": " border:0px; margin-top: 5px; margin-right:10px;"
} }
}, },
"systemMsgColor": "#646464", "systemMsgColor": "#646464",
"op": { "icon": "$path/smooth.png" } "op": { "icon": "$path/smooth.png" }
} }
} }

View file

@ -16,16 +16,15 @@
"loc": [150,22] "loc": [150,22]
}, },
"sounds": { "alertsound": "$path/alarm.wav", "sounds": { "alertsound": "$path/alarm.wav",
"ceasesound": "$path/cease.wav" }, "ceasesound": "$path/cease.wav" },
"menus": {"client": {"_name": "Client", "menus": {"client": {"_name": "Client",
"options": "Options", "options": "Options",
"memos": "Memos", "memos": "Memos",
"logviewer": "Pesterlogs", "logviewer": "Pesterlogs",
"userlist": "Userlist", "userlist": "Userlist",
"addgroup": "Add Group",
"import": "Import", "import": "Import",
"reconnect": "Reconnect", "reconnect": "Reconnect",
"idle": "Idle", "idle": "Idle",
"exit": "Exit"}, "exit": "Exit"},
"profile": {"_name": "Profile", "profile": {"_name": "Profile",
"switch": "Switch", "switch": "Switch",
@ -37,13 +36,11 @@
"about": "About" }, "about": "About" },
"rclickchumlist": {"pester": "Pester", "rclickchumlist": {"pester": "Pester",
"removechum": "Remove Chum", "removechum": "Remove Chum",
"report": "Report",
"blockchum": "Block", "blockchum": "Block",
"addchum": "Add Chum", "addchum": "Add Chum",
"viewlog": "View Pesterlog", "viewlog": "View Pesterlog",
"unblockchum": "Unblock", "unblockchum": "Unblock",
"removegroup": "Remove Group",
"renamegroup": "Rename Group",
"movechum": "Move To",
"banuser": "Ban User", "banuser": "Ban User",
"opuser": "Make OP", "opuser": "Make OP",
"quirksoff": "Quirks Off" "quirksoff": "Quirks Off"
@ -53,7 +50,7 @@
"loc": [123, 88], "loc": [123, 88],
"size": [190, 65], "size": [190, 65],
"userlistcolor": "white", "userlistcolor": "white",
"moods": { "moods": {
"chummy": { "icon": "$path/chummy.png", "color": "white" }, "chummy": { "icon": "$path/chummy.png", "color": "white" },
@ -61,7 +58,7 @@
"offline": { "icon": "$path/offline.png", "color": "#bebebe"}, "offline": { "icon": "$path/offline.png", "color": "#bebebe"},
"pleasant": { "icon": "$path/pleasant.png", "color": "white" }, "pleasant": { "icon": "$path/pleasant.png", "color": "white" },
"distraught": { "icon": "$path/distraught.png", "color": "white" }, "distraught": { "icon": "$path/distraught.png", "color": "white" },
@ -89,7 +86,7 @@
"devious": { "icon": "$path/devious.png", "color": "red" }, "devious": { "icon": "$path/devious.png", "color": "red" },
"sleek": { "icon": "$path/sleek.png", "color": "red" }, "sleek": { "icon": "$path/sleek.png", "color": "red" },
"detestful": { "icon": "$path/detestful.png", "color": "red" }, "detestful": { "icon": "$path/detestful.png", "color": "red" },
"mirthful": { "icon": "$path/mirthful.png", "color": "red" }, "mirthful": { "icon": "$path/mirthful.png", "color": "red" },
@ -108,7 +105,7 @@
} }
}, },
"trollslum": { "trollslum": {
"style": "background: #fdb302; border:2px solid yellow; font-family: 'Arial'", "style": "background: #fdb302; border:2px solid yellow; font-family: 'Arial'",
"size": [195, 200], "size": [195, 200],
"label": { "text": "TROLLSLUM", "label": { "text": "TROLLSLUM",
@ -126,7 +123,7 @@
"text": "" }, "text": "" },
"currentMood": [129, 176] "currentMood": [129, 176]
}, },
"defaultwindow": { "style": "background: #fdb302; font-family:'Arial';font:bold;selection-background-color:#919191; " "defaultwindow": { "style": "background: #fdb302; font-family:'Arial';font:bold;selection-background-color:#919191; "
}, },
"addchum": { "style": "background: rgba(255, 255, 0, 0%); border:0px; color: rgba(0, 0, 0, 0%);", "addchum": { "style": "background: rgba(255, 255, 0, 0%); border:0px; color: rgba(0, 0, 0, 0%);",
"loc": [25,0], "loc": [25,0],
@ -146,90 +143,90 @@
}, },
"defaultmood": 0, "defaultmood": 0,
"moodlabel": { "style": "", "moodlabel": { "style": "",
"loc": [20, 430], "loc": [20, 430],
"text": "MOODS" "text": "MOODS"
}, },
"moods": [ "moods": [
{ "style": "border:0px;", { "style": "border:0px;",
"selected": "background-image:url($path/moodcheck1.png); border:0px;", "selected": "background-image:url($path/moodcheck1.png); border:0px;",
"loc": [13, 204], "loc": [13, 204],
"size": [101, 27], "size": [101, 27],
"text": "", "text": "",
"icon": "", "icon": "",
"mood": 0 "mood": 0
}, },
{ "style": "border:0px;", { "style": "border:0px;",
"selected": "background-image:url($path/moodcheck2.png); border:0px;", "selected": "background-image:url($path/moodcheck2.png); border:0px;",
"loc": [13, 231], "loc": [13, 231],
"size": [101, 27], "size": [101, 27],
"text": "", "text": "",
"icon": "", "icon": "",
"mood": 19 "mood": 19
}, },
{ "style": "border:0px;", { "style": "border:0px;",
"selected": "background-image:url($path/moodcheck3.png); border:0px;", "selected": "background-image:url($path/moodcheck3.png); border:0px;",
"loc": [13, 258], "loc": [13, 258],
"size": [101, 27], "size": [101, 27],
"text": "", "text": "",
"icon": "", "icon": "",
"mood": 20 "mood": 20
}, },
{ "style": "border:0px;", { "style": "border:0px;",
"selected": "background-image:url($path/moodcheck4.png); border:0px;", "selected": "background-image:url($path/moodcheck4.png); border:0px;",
"loc": [116, 204], "loc": [116, 204],
"size": [101, 27], "size": [101, 27],
"text": "", "text": "",
"icon": "", "icon": "",
"mood": 21 "mood": 21
}, },
{ "style": "border:0px;", { "style": "border:0px;",
"selected": "background-image:url($path/moodcheck5.png); border:0px;", "selected": "background-image:url($path/moodcheck5.png); border:0px;",
"loc": [116, 231], "loc": [116, 231],
"size": [101, 27], "size": [101, 27],
"text": "", "text": "",
"icon": "", "icon": "",
"mood": 22 "mood": 22
}, },
{ "style": "border:0px;", { "style": "border:0px;",
"selected": "background-image:url($path/moodcheck6.png); border:0px;", "selected": "background-image:url($path/moodcheck6.png); border:0px;",
"loc": [116, 258], "loc": [116, 258],
"size": [101, 27], "size": [101, 27],
"text": "", "text": "",
"icon": "", "icon": "",
"mood": 5 "mood": 5
}, },
{ "style": "border:0px;", { "style": "border:0px;",
"selected": "background-image:url($path/moodcheck7.png); border:0px;", "selected": "background-image:url($path/moodcheck7.png); border:0px;",
"loc": [219, 204], "loc": [219, 204],
"size": [101, 27], "size": [101, 27],
"text": "", "text": "",
"icon": "", "icon": "",
"mood": 6 "mood": 6
}, },
{ "style": "border:0px;", { "style": "border:0px;",
"selected": "background-image:url($path/moodcheck8.png); border:0px;", "selected": "background-image:url($path/moodcheck8.png); border:0px;",
"loc": [219, 231], "loc": [219, 231],
"size": [101, 27], "size": [101, 27],
"text": "", "text": "",
"icon": "", "icon": "",
"mood": 3 "mood": 3
}, },
{ "style": "border:0px;", { "style": "border:0px;",
"selected": "background-image:url($path/moodcheck9.png); border:0px;", "selected": "background-image:url($path/moodcheck9.png); border:0px;",
"loc": [219, 258], "loc": [219, 258],
"size": [101, 27], "size": [101, 27],
"text": "", "text": "",
"icon": "", "icon": "",
"mood": 1 "mood": 1
}, },
{ "style": "border:0px;", { "style": "border:0px;",
"selected": "border:0px;", "selected": "border:0px;",
"loc": [13, 175], "loc": [13, 175],
"size": [101, 27], "size": [101, 27],
"text": "", "text": "",
"icon": "", "icon": "",
"mood": 2 "mood": 2
} }
] ]
}, },
"convo": "convo":
@ -237,7 +234,7 @@
"tabstyle": "background-color: #fdb302; font-family: 'Arial'", "tabstyle": "background-color: #fdb302; font-family: 'Arial'",
"scrollbar": { "style" : "padding-top:17px; padding-bottom:17px;width: 18px; background: rgba(255, 255, 0, 0%); border:0px;", "scrollbar": { "style" : "padding-top:17px; padding-bottom:17px;width: 18px; background: rgba(255, 255, 0, 0%); border:0px;",
"handle": "background-color:#c48a00;min-height:20px;", "handle": "background-color:#c48a00;min-height:20px;",
"downarrow": "height:17px;border:0px solid #c48a00;", "downarrow": "height:17px;border:0px solid #c48a00;",
"darrowstyle": "image:url($path/downarrow.png);", "darrowstyle": "image:url($path/downarrow.png);",
"uparrow": "height:17px;border:0px solid #c48a00;", "uparrow": "height:17px;border:0px solid #c48a00;",
"uarrowstyle": "image:url($path/uparrow.png);" "uarrowstyle": "image:url($path/uparrow.png);"
@ -267,12 +264,12 @@
"ceasepester": "ceased pestering", "ceasepester": "ceased pestering",
"blocked": "blocked", "blocked": "blocked",
"unblocked": "unblocked", "unblocked": "unblocked",
"blockedmsg": "did not receive message from", "blockedmsg": "did not receive message from",
"openmemo": "opened memo on board", "openmemo": "opened memo on board",
"joinmemo": "responded to memo", "joinmemo": "responded to memo",
"closememo": "ceased responding to memo", "closememo": "ceased responding to memo",
"kickedmemo": "You have been banned from this memo!", "kickedmemo": "You have been banned from this memo!",
"idle": "is now an idle chum!" "idle": "is now an idle chum!"
}, },
"systemMsgColor": "#646464" "systemMsgColor": "#646464"
}, },
@ -288,7 +285,7 @@
}, },
"scrollbar": { "style" : "padding-top:17px; padding-bottom:17px;width: 18px; background: rgba(255, 255, 0, 0%); border:0px;", "scrollbar": { "style" : "padding-top:17px; padding-bottom:17px;width: 18px; background: rgba(255, 255, 0, 0%); border:0px;",
"handle": "background-color:#c48a00;min-height:20px;", "handle": "background-color:#c48a00;min-height:20px;",
"downarrow": "height:17px;border:0px solid #c48a00;", "downarrow": "height:17px;border:0px solid #c48a00;",
"darrowstyle": "image:url($path/downarrow.png);", "darrowstyle": "image:url($path/downarrow.png);",
"uparrow": "height:17px;border:0px solid #c48a00;", "uparrow": "height:17px;border:0px solid #c48a00;",
"uarrowstyle": "image:url($path/uparrow.png);" "uarrowstyle": "image:url($path/uparrow.png);"
@ -305,20 +302,20 @@
"userlist": { "width": 150, "userlist": { "width": 150,
"style": "border:2px solid #c48a00; background: white; font-family: 'Arial';selection-background-color:#646464; font-size: 14px; margin-left:0px; margin-right:10px;" "style": "border:2px solid #c48a00; background: white; font-family: 'Arial';selection-background-color:#646464; font-size: 14px; margin-left:0px; margin-right:10px;"
}, },
"time": { "text": { "width": 75, "time": { "text": { "width": 75,
"style": " border: 2px solid yellow; background: white; font-size: 12px; margin-top: 5px; margin-right: 5px; margin-left: 5px; font-family:'Arial';font:bold;" "style": " border: 2px solid yellow; background: white; font-size: 12px; margin-top: 5px; margin-right: 5px; margin-left: 5px; font-family:'Arial';font:bold;"
}, },
"slider": { "style": "border: 0px;", "slider": { "style": "border: 0px;",
"groove": "", "groove": "",
"handle": "" "handle": ""
}, },
"buttons": { "style": "color: black; font: bold; border: 2px solid #c48a00; font-size: 12px; background: yellow; margin-top: 5px; margin-right: 5px; margin-left: 5px; padding: 2px; width: 50px;" }, "buttons": { "style": "color: black; font: bold; border: 2px solid #c48a00; font-size: 12px; background: yellow; margin-top: 5px; margin-right: 5px; margin-left: 5px; padding: 2px; width: 50px;" },
"arrows": { "left": "$path/leftarrow.png", "arrows": { "left": "$path/leftarrow.png",
"right": "$path/rightarrow.png", "right": "$path/rightarrow.png",
"style": " border:0px; margin-top: 5px; margin-right:10px;" "style": " border:0px; margin-top: 5px; margin-right:10px;"
} }
}, },
"systemMsgColor": "#646464", "systemMsgColor": "#646464",
"op": { "icon": "$path/smooth.png" } "op": { "icon": "$path/smooth.png" }
} }
} }

View file

@ -16,16 +16,15 @@
"loc": [10,0] "loc": [10,0]
}, },
"sounds": { "alertsound": "$path/alarm.wav", "sounds": { "alertsound": "$path/alarm.wav",
"ceasesound": "$path/cease.wav" }, "ceasesound": "$path/cease.wav" },
"menus": {"client": {"_name": "CLIENT", "menus": {"client": {"_name": "CLIENT",
"options": "OPTIONS", "options": "OPTIONS",
"memos": "MEMOS", "memos": "MEMOS",
"logviewer": "PESTERLOGS", "logviewer": "PESTERLOGS",
"userlist": "USERLIST", "userlist": "USERLIST",
"addgroup": "ADD GROUP",
"import": "IMPORT", "import": "IMPORT",
"reconnect": "RECONNECT", "reconnect": "RECONNECT",
"idle": "IDLE", "idle": "IDLE",
"exit": "EXIT"}, "exit": "EXIT"},
"profile": {"_name": "PROFILE", "profile": {"_name": "PROFILE",
"switch": "SWITCH", "switch": "SWITCH",
@ -37,13 +36,11 @@
"about": "ABOUT" }, "about": "ABOUT" },
"rclickchumlist": {"pester": "PESTER", "rclickchumlist": {"pester": "PESTER",
"removechum": "REMOVE CHUM", "removechum": "REMOVE CHUM",
"report": "REPORT",
"blockchum": "BLOCK", "blockchum": "BLOCK",
"addchum": "ADD CHUM", "addchum": "ADD CHUM",
"viewlog": "VIEW PESTERLOG", "viewlog": "VIEW PESTERLOG",
"unblockchum": "UNBLOCK", "unblockchum": "UNBLOCK",
"removegroup": "REMOVE GROUP",
"renamegroup": "RENAME GROUP",
"movechum": "MOVE TO",
"banuser": "BAN USER", "banuser": "BAN USER",
"opuser": "MAKE OP", "opuser": "MAKE OP",
"quirksoff": "QUIRKS OFF" "quirksoff": "QUIRKS OFF"
@ -53,7 +50,7 @@
"loc": [12, 117], "loc": [12, 117],
"size": [209, 82], "size": [209, 82],
"userlistcolor": "white", "userlistcolor": "white",
"moods": { "moods": {
"chummy": { "icon": "$path/chummy.png", "color": "white" }, "chummy": { "icon": "$path/chummy.png", "color": "white" },
@ -61,7 +58,7 @@
"offline": { "icon": "$path/offline.png", "color": "#646464"}, "offline": { "icon": "$path/offline.png", "color": "#646464"},
"pleasant": { "icon": "$path/pleasant.png", "color": "white" }, "pleasant": { "icon": "$path/pleasant.png", "color": "white" },
"distraught": { "icon": "$path/distraught.png", "color": "white" }, "distraught": { "icon": "$path/distraught.png", "color": "white" },
@ -89,7 +86,7 @@
"devious": { "icon": "$path/devious.png", "color": "red" }, "devious": { "icon": "$path/devious.png", "color": "red" },
"sleek": { "icon": "$path/sleek.png", "color": "red" }, "sleek": { "icon": "$path/sleek.png", "color": "red" },
"detestful": { "icon": "$path/detestful.png", "color": "red" }, "detestful": { "icon": "$path/detestful.png", "color": "red" },
"mirthful": { "icon": "$path/mirthful.png", "color": "red" }, "mirthful": { "icon": "$path/mirthful.png", "color": "red" },
@ -108,7 +105,7 @@
} }
}, },
"trollslum": { "trollslum": {
"style": "background: #fdb302; border:2px solid yellow; font-family: 'Courier'", "style": "background: #fdb302; border:2px solid yellow; font-family: 'Courier'",
"size": [195, 200], "size": [195, 200],
"label": { "text": "TROLLSLUM", "label": { "text": "TROLLSLUM",
@ -126,7 +123,7 @@
"text": "" }, "text": "" },
"currentMood": [18, 249] "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; "
}, },
"addchum": { "style": "background: rgba(255, 255, 0, 0%); border:2px solid #c48a00; font: bold; color: rgba(0, 0, 0, 0%); font-family:'Courier';", "addchum": { "style": "background: rgba(255, 255, 0, 0%); border:2px solid #c48a00; font: bold; color: rgba(0, 0, 0, 0%); font-family:'Courier';",
"pressed" : "background: rgb(255, 255, 255, 30%);", "pressed" : "background: rgb(255, 255, 255, 30%);",
@ -140,7 +137,7 @@
"size": [71, 22], "size": [71, 22],
"text": "" "text": ""
}, },
"block": { "style": "background: rgba(255, 255, 0, 0%); border:2px solid #c48a00; font: bold; color: rgba(255, 255, 0, 0%); font-family:'Courier';", "block": { "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%);", "pressed" : "background: rgb(255, 255, 255, 30%);",
"loc": [81,202], "loc": [81,202],
"size": [71, 22], "size": [71, 22],
@ -148,73 +145,73 @@
}, },
"defaultmood": 0, "defaultmood": 0,
"moodlabel": { "style": "", "moodlabel": { "style": "",
"loc": [20, 430], "loc": [20, 430],
"text": "MOODS" "text": "MOODS"
}, },
"moods": [ "moods": [
{ "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'", { "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.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';", "selected": "text-align:left; background-image:url($path/moodcheck1.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
"loc": [12, 288], "loc": [12, 288],
"size": [104, 22], "size": [104, 22],
"text": "CHUMMY", "text": "CHUMMY",
"icon": "$path/chummy.png", "icon": "$path/chummy.png",
"mood": 0 "mood": 0
}, },
{ "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'", { "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.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';", "selected": "text-align:left; background-image:url($path/moodcheck2.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
"loc": [12, 308], "loc": [12, 308],
"size": [104, 22], "size": [104, 22],
"text": "PALSY", "text": "PALSY",
"icon": "$path/chummy.png", "icon": "$path/chummy.png",
"mood": 3 "mood": 3
}, },
{ "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'", { "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.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';", "selected": "text-align:left; background-image:url($path/moodcheck3.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
"loc": [12, 328], "loc": [12, 328],
"size": [104, 22], "size": [104, 22],
"text": "CHIPPER", "text": "CHIPPER",
"icon": "$path/chummy.png", "icon": "$path/chummy.png",
"mood": 4 "mood": 4
}, },
{ "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'", { "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.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';", "selected": "text-align:left; background-image:url($path/moodcheck2.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
"loc": [117, 288], "loc": [117, 288],
"size": [104, 22], "size": [104, 22],
"text": "BULLY", "text": "BULLY",
"icon": "$path/chummy.png", "icon": "$path/chummy.png",
"mood": 5 "mood": 5
}, },
{ "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'", { "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.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';", "selected": "text-align:left; background-image:url($path/moodcheck2.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
"loc": [117, 308], "loc": [117, 308],
"size": [104, 22], "size": [104, 22],
"text": "PEPPY", "text": "PEPPY",
"icon": "$path/chummy.png", "icon": "$path/chummy.png",
"mood": 6 "mood": 6
}, },
{ "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'", { "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.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';", "selected": "text-align:left; background-image:url($path/moodcheck4.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
"loc": [117, 328], "loc": [117, 328],
"size": [104, 22], "size": [104, 22],
"text": "RANCOROUS", "text": "RANCOROUS",
"icon": "$path/rancorous.png", "icon": "$path/rancorous.png",
"mood": 1 "mood": 1
}, },
{ "style": "text-align:left; border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier'", { "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.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';", "selected": "text-align:left; background-image:url($path/moodcheck5.png); border:2px solid #c48a00; padding: 5px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
"loc": [12, 348], "loc": [12, 348],
"size": [209, 22], "size": [209, 22],
"text": "ABSCOND", "text": "ABSCOND",
"icon": "", "icon": "",
"mood": 2 "mood": 2
} }
] ]
}, },
"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" : "padding-top:17px; padding-bottom:17px;width: 18px; background: white; border:2px solid #c48a00;", "scrollbar": { "style" : "padding-top:17px; padding-bottom:17px;width: 18px; background: white; border:2px solid #c48a00;",
"handle": "background-color:#c48a00;min-height:20px;", "handle": "background-color:#c48a00;min-height:20px;",
"downarrow": "height:17px;border:0px solid #c48a00;", "downarrow": "height:17px;border:0px solid #c48a00;",
"darrowstyle": "image:url($path/downarrow.png);", "darrowstyle": "image:url($path/downarrow.png);",
"uparrow": "height:17px;border:0px solid #c48a00;", "uparrow": "height:17px;border:0px solid #c48a00;",
"uarrowstyle": "image:url($path/uparrow.png);" "uarrowstyle": "image:url($path/uparrow.png);"
@ -234,7 +231,7 @@
"style": "background: white; border:2px solid #c48a00;margin-top:5px; margin-right:10px; margin-left:10px; font-size: 12px;font-family: 'Courier'" "style": "background: white; border:2px solid #c48a00;margin-top:5px; margin-right:10px; margin-left:10px; font-size: 12px;font-family: 'Courier'"
}, },
"tabwindow" : { "tabwindow" : {
"style": "background-color:#fdb302;border:0px" "style": "background-color:#fdb302;border:0px"
}, },
"tabs": { "tabs": {
"style": "background-color: #7f7f7f; font-family: 'Courier';font:bold;font-size:12px;min-height:25px;", "style": "background-color: #7f7f7f; font-family: 'Courier';font:bold;font-size:12px;min-height:25px;",
@ -247,12 +244,12 @@
"ceasepester": "ceased pestering", "ceasepester": "ceased pestering",
"blocked": "blocked", "blocked": "blocked",
"unblocked": "unblocked", "unblocked": "unblocked",
"blockedmsg": "did not receive message from", "blockedmsg": "did not receive message from",
"openmemo": "opened memo on board", "openmemo": "opened memo on board",
"joinmemo": "responded to memo", "joinmemo": "responded to memo",
"closememo": "ceased responding to memo", "closememo": "ceased responding to memo",
"kickedmemo": "You have been banned from this memo!", "kickedmemo": "You have been banned from this memo!",
"idle": "is now an idle chum!" "idle": "is now an idle chum!"
}, },
"systemMsgColor": "#646464" "systemMsgColor": "#646464"
}, },
@ -268,7 +265,7 @@
}, },
"scrollbar": { "style" : "padding-top:17px; padding-bottom:17px;width: 18px; background: rgba(255, 255, 0, 0%); border:0px;", "scrollbar": { "style" : "padding-top:17px; padding-bottom:17px;width: 18px; background: rgba(255, 255, 0, 0%); border:0px;",
"handle": "background-color:#c48a00;min-height:20px;", "handle": "background-color:#c48a00;min-height:20px;",
"downarrow": "height:17px;border:0px solid #c48a00;", "downarrow": "height:17px;border:0px solid #c48a00;",
"darrowstyle": "image:url($path/downarrow.png);", "darrowstyle": "image:url($path/downarrow.png);",
"uparrow": "height:17px;border:0px solid #c48a00;", "uparrow": "height:17px;border:0px solid #c48a00;",
"uarrowstyle": "image:url($path/uparrow.png);" "uarrowstyle": "image:url($path/uparrow.png);"
@ -285,20 +282,20 @@
"userlist": { "width": 150, "userlist": { "width": 150,
"style": "border:2px solid #c48a00; background: white;font: bold;font-family: 'Courier';selection-background-color:#646464; font-size: 12px; margin-left:0px; margin-right:10px;" "style": "border:2px solid #c48a00; background: white;font: bold;font-family: 'Courier';selection-background-color:#646464; font-size: 12px; margin-left:0px; margin-right:10px;"
}, },
"time": { "text": { "width": 75, "time": { "text": { "width": 75,
"style": " border: 2px solid yellow; background: white; font-size: 12px; margin-top: 5px; margin-right: 5px; margin-left: 5px; font-family:'Courier';font:bold;" "style": " border: 2px solid yellow; background: white; font-size: 12px; margin-top: 5px; margin-right: 5px; margin-left: 5px; font-family:'Courier';font:bold;"
}, },
"slider": { "style": "border: 0px;", "slider": { "style": "border: 0px;",
"groove": "", "groove": "",
"handle": "" "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;" }, "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", "arrows": { "left": "$path/leftarrow.png",
"right": "$path/rightarrow.png", "right": "$path/rightarrow.png",
"style": " border:0px; margin-top: 5px; margin-right:10px;" "style": " border:0px; margin-top: 5px; margin-right:10px;"
} }
}, },
"systemMsgColor": "#646464", "systemMsgColor": "#646464",
"op": { "icon": "$path/op.png" } "op": { "icon": "$path/op.png" }
} }
} }

View file

@ -21,10 +21,8 @@
"memos": "Memos", "memos": "Memos",
"logviewer": "Pesterlogs", "logviewer": "Pesterlogs",
"userlist": "Fresh Targets", "userlist": "Fresh Targets",
"addgroup": "Add Group",
"import": "import U2;", "import": "import U2;",
"reconnect": "Reconnect", "idle": "Idle",
"idle": "Idle",
"exit": "Abscond"}, "exit": "Abscond"},
"profile": {"_name": "View", "profile": {"_name": "View",
"switch": "Trolltag", "switch": "Trolltag",
@ -36,13 +34,11 @@
"about": "About" }, "about": "About" },
"rclickchumlist": {"pester": "Troll", "rclickchumlist": {"pester": "Troll",
"removechum": "Trash", "removechum": "Trash",
"report": "Remove",
"blockchum": "Block", "blockchum": "Block",
"addchum": "Add Chump", "addchum": "Add Chump",
"viewlog": "View Pesterlog", "viewlog": "View Pesterlog",
"unblockchum": "Mercy", "unblockchum": "Mercy",
"removegroup": "Remove Group",
"renamegroup": "Rename Group",
"movechum": "Move To",
"banuser": "Ban", "banuser": "Ban",
"opuser": "Promote", "opuser": "Promote",
"quirksoff": "Quirks Off" } "quirksoff": "Quirks Off" }
@ -59,50 +55,50 @@
"size": [171, 357], "size": [171, 357],
"userlistcolor": "black", "userlistcolor": "black",
"moods": { "moods": {
"chummy": { "icon": "$path/chummy.png", "color": "#63ea00" }, "chummy": { "icon": "$path/chummy.png", "color": "#63ea00" },
"rancorous": { "icon": "$path/rancorous.png", "color": "#7f7f7f" }, "rancorous": { "icon": "$path/rancorous.png", "color": "#7f7f7f" },
"offline": { "icon": "$path/offline.png", "color": "black"}, "offline": { "icon": "$path/offline.png", "color": "black"},
"pleasant": { "icon": "$path/pleasant.png", "color": "#d69df8" }, "pleasant": { "icon": "$path/pleasant.png", "color": "#d69df8" },
"distraught": { "icon": "$path/distraught.png", "color": "#706eba" }, "distraught": { "icon": "$path/distraught.png", "color": "#706eba" },
"pranky": { "icon": "$path/pranky.png", "color": "blue" }, "pranky": { "icon": "$path/pranky.png", "color": "blue" },
"smooth": { "icon": "$path/smooth.png", "color": "red" }, "smooth": { "icon": "$path/smooth.png", "color": "red" },
"ecstatic": { "icon": "$path/ecstatic.png", "color": "#99004d" }, "ecstatic": { "icon": "$path/ecstatic.png", "color": "#99004d" },
"relaxed": { "icon": "$path/relaxed.png", "color": "#078446" }, "relaxed": { "icon": "$path/relaxed.png", "color": "#078446" },
"discontent": { "icon": "$path/discontent.png", "color": "#a75403" }, "discontent": { "icon": "$path/discontent.png", "color": "#a75403" },
"devious": { "icon": "$path/devious.png", "color": "#008282" }, "devious": { "icon": "$path/devious.png", "color": "#008282" },
"sleek": { "icon": "$path/sleek.png", "color": "#a1a100" }, "sleek": { "icon": "$path/sleek.png", "color": "#a1a100" },
"detestful": { "icon": "$path/detestful.png", "color": "#6a006a" }, "detestful": { "icon": "$path/detestful.png", "color": "#6a006a" },
"mirthful": { "icon": "$path/mirthful.png", "color": "#450077" }, "mirthful": { "icon": "$path/mirthful.png", "color": "#450077" },
"manipulative": { "icon": "$path/manipulative.png", "color": "#004182" }, "manipulative": { "icon": "$path/manipulative.png", "color": "#004182" },
"vigorous": { "icon": "$path/vigorous.png", "color": "#0021cb" }, "vigorous": { "icon": "$path/vigorous.png", "color": "#0021cb" },
"perky": { "icon": "$path/perky.png", "color": "#406600" }, "perky": { "icon": "$path/perky.png", "color": "#406600" },
"acceptant": { "icon": "$path/acceptant.png", "color": "#a10000" }, "acceptant": { "icon": "$path/acceptant.png", "color": "#a10000" },
"protective": { "icon": "$path/protective.png", "color": "white" }, "protective": { "icon": "$path/protective.png", "color": "white" },
"blocked": { "icon": "$path/blocked.png", "color": "black" } "blocked": { "icon": "$path/blocked.png", "color": "black" }
} }
}, },
"trollslum": { "trollslum": {
@ -241,7 +237,7 @@
"icon": "", "icon": "",
"mood": 7 "mood": 7
}, },
{ "style": "border:0px;color: rgba(0, 0, 0, 0%);", { "style": "border:0px;color: rgba(0, 0, 0, 0%);",
"selected": "border:0px; color: rgba(0, 0, 0, 0%);", "selected": "border:0px; color: rgba(0, 0, 0, 0%);",
"loc": [12, 117], "loc": [12, 117],
@ -271,7 +267,7 @@
"style": "background: white;margin-top:5px; border:1px solid #c2c2c2; margin-right: 54px; font-size: 12px; height: 19px;" "style": "background: white;margin-top:5px; border:1px solid #c2c2c2; margin-right: 54px; font-size: 12px; height: 19px;"
}, },
"tabwindow" : { "tabwindow" : {
"style": "background: rgb(190, 19, 4); font-family: 'Arial'" "style": "background: rgb(190, 19, 4); font-family: 'Arial'"
}, },
"tabs": { "tabs": {
"style": "", "style": "",
@ -317,15 +313,15 @@
"userlist": { "width": 125, "userlist": { "width": 125,
"style": "font-size: 12px; background: white; margin-left: 5px; margin-bottom: 5px; border:2px solid #c2c2c2; padding: 5px; font-family: 'Arial';selection-background-color:rgb(200,200,200);" "style": "font-size: 12px; background: white; margin-left: 5px; margin-bottom: 5px; border:2px solid #c2c2c2; padding: 5px; font-family: 'Arial';selection-background-color:rgb(200,200,200);"
}, },
"time": { "text": { "width": 75, "time": { "text": { "width": 75,
"style": "color: black; font:bold; border:1px solid #c2c2c2; background: white; height: 19px;" "style": "color: black; font:bold; border:1px solid #c2c2c2; background: white; height: 19px;"
}, },
"slider": { "style": " border:1px solid #c2c2c2;", "slider": { "style": " border:1px solid #c2c2c2;",
"groove": "border-image:url($path/timeslider.png);", "groove": "border-image:url($path/timeslider.png);",
"handle": "image:url($path/acceptant.png);" "handle": "image:url($path/acceptant.png);"
}, },
"buttons": { "style": "border:1px solid #a68168; height: 17px; width: 50px; color: #cd8f9d; font-family: 'Arial'; background: rgb(190, 19, 4); margin-left: 2px;" }, "buttons": { "style": "border:1px solid #a68168; height: 17px; width: 50px; color: #cd8f9d; font-family: 'Arial'; background: rgb(190, 19, 4); margin-left: 2px;" },
"arrows": { "left": "$path/leftarrow.png", "arrows": { "left": "$path/leftarrow.png",
"right": "$path/rightarrow.png", "right": "$path/rightarrow.png",
"style": "width: 19px; height: 19px; border:0px; margin-left: 2px;" "style": "width: 19px; height: 19px; border:0px; margin-left: 2px;"
} }
@ -333,4 +329,4 @@
"systemMsgColor": "#646464", "systemMsgColor": "#646464",
"op": { "icon": "$path/op.png" } "op": { "icon": "$path/op.png" }
} }
} }

View file

@ -180,7 +180,7 @@
}, },
"buttons": { "style": "color: black; font: bold; border: 2px solid #780000; font: bold; font-size: 12px; background: #e5000f; margin-top: 5px; margin-right: 5px; margin-left: 5px; padding: 2px; width: 50px;" } "buttons": { "style": "color: black; font: bold; border: 2px solid #780000; font: bold; font-size: 12px; background: #e5000f; margin-top: 5px; margin-right: 5px; margin-left: 5px; padding: 2px; width: 50px;" }
}, },
"tabwindow": { "style": "" },
"tabs": { "tabs": {
"style": "", "style": "",
"selectedstyle": "", "selectedstyle": "",

View file

@ -16,16 +16,15 @@
"loc": [43,220] "loc": [43,220]
}, },
"sounds": { "alertsound": "$path/alarm.wav", "sounds": { "alertsound": "$path/alarm.wav",
"ceasesound": "$path/cease.wav" }, "ceasesound": "$path/cease.wav" },
"menus": {"client": {"_name": "Typewriter", "menus": {"client": {"_name": "Typewriter",
"options": "Preferences", "options": "Preferences",
"memos": "Bulletin Boards", "memos": "Bulletin Boards",
"logviewer": "Pesterlogs", "logviewer": "Pesterlogs",
"userlist": "Userlist", "userlist": "Userlist",
"addgroup": "Add Group",
"import": "Import", "import": "Import",
"idle": "Idle", "idle": "Idle",
"reconnect": "Reconnect", "reconnect": "Reconnect",
"exit": "Cease"}, "exit": "Cease"},
"profile": {"_name": "Ink", "profile": {"_name": "Ink",
"switch": "Alias", "switch": "Alias",
@ -37,13 +36,11 @@
"about": "About" }, "about": "About" },
"rclickchumlist": {"pester": "Converse", "rclickchumlist": {"pester": "Converse",
"removechum": "Erase User", "removechum": "Erase User",
"report": "Report User",
"blockchum": "Condemn", "blockchum": "Condemn",
"addchum": "Add User", "addchum": "Add User",
"viewlog": "View Pesterlog", "viewlog": "View Pesterlog",
"unblockchum": "Forgive", "unblockchum": "Forgive",
"removegroup": "Remove Group",
"renamegroup": "Rename Group",
"movechum": "Move To",
"banuser": "Expel User", "banuser": "Expel User",
"opuser": "Promote", "opuser": "Promote",
"quirksoff": "Quirks Off" "quirksoff": "Quirks Off"
@ -53,7 +50,7 @@
"loc": [70, 20], "loc": [70, 20],
"size": [175,100], "size": [175,100],
"userlistcolor": "black", "userlistcolor": "black",
"moods": { "moods": {
"chummy": { "icon": "$path/chummy.png", "color": "black" }, "chummy": { "icon": "$path/chummy.png", "color": "black" },
@ -61,7 +58,7 @@
"offline": { "icon": "$path/offline.png", "color": "#646464"}, "offline": { "icon": "$path/offline.png", "color": "#646464"},
"pleasant": { "icon": "$path/pleasant.png", "color": "black" }, "pleasant": { "icon": "$path/pleasant.png", "color": "black" },
"distraught": { "icon": "$path/distraught.png", "color": "black" }, "distraught": { "icon": "$path/distraught.png", "color": "black" },
@ -89,7 +86,7 @@
"devious": { "icon": "$path/devious.png", "color": "red" }, "devious": { "icon": "$path/devious.png", "color": "red" },
"sleek": { "icon": "$path/sleek.png", "color": "red" }, "sleek": { "icon": "$path/sleek.png", "color": "red" },
"detestful": { "icon": "$path/detestful.png", "color": "red" }, "detestful": { "icon": "$path/detestful.png", "color": "red" },
"mirthful": { "icon": "$path/mirthful.png", "color": "red" }, "mirthful": { "icon": "$path/mirthful.png", "color": "red" },
@ -108,7 +105,7 @@
} }
}, },
"trollslum": { "trollslum": {
"style": "background: #bebebe; border:2px solid black; font-family: 'Courier'", "style": "background: #bebebe; border:2px solid black; font-family: 'Courier'",
"size": [195, 200], "size": [195, 200],
"label": { "text": "Ruffians", "label": { "text": "Ruffians",
@ -126,7 +123,7 @@
"text": "" }, "text": "" },
"currentMood": [0, 0] "currentMood": [0, 0]
}, },
"defaultwindow": { "style": "background: #bebebe; font-family:'Courier';font:bold;selection-background-color: black; " "defaultwindow": { "style": "background: #bebebe; font-family:'Courier';font:bold;selection-background-color: black; "
}, },
"addchum": { "style": "background: rgba(255, 255, 0, 0%); border:0px solid #c48a00; font: bold; color: rgba(0, 0, 0, 0%); font-family:'Courier';", "addchum": { "style": "background: rgba(255, 255, 0, 0%); border:0px solid #c48a00; font: bold; color: rgba(0, 0, 0, 0%); font-family:'Courier';",
"pressed" : "background: rgb(255, 255, 255, 30%);", "pressed" : "background: rgb(255, 255, 255, 30%);",
@ -140,7 +137,7 @@
"size": [70, 15], "size": [70, 15],
"text": "" "text": ""
}, },
"block": { "style": "background: rgba(255, 255, 0, 0%); border:2px solid #c48a00; font: bold; color: rgba(255, 255, 0, 0%); font-family:'Courier';", "block": { "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%);", "pressed" : "background: rgb(255, 255, 255, 30%);",
"loc": [0,0], "loc": [0,0],
"size": [0, 0], "size": [0, 0],
@ -148,26 +145,26 @@
}, },
"defaultmood": 18, "defaultmood": 18,
"moodlabel": { "style": "", "moodlabel": { "style": "",
"loc": [20, 430], "loc": [20, 430],
"text": "MOODS" "text": "MOODS"
}, },
"moods": [ "moods": [
{ "style": "text-align:left; border:0px solid #c48a00; padding: 0px;color: rgba(0, 0, 0, 0%); font-family:'Courier'", { "style": "text-align:left; border:0px solid #c48a00; padding: 0px;color: rgba(0, 0, 0, 0%); font-family:'Courier'",
"selected": "text-align:left; background-image:url($path/moodcheck1.png); border:0px solid #c48a00; padding: 0px;color: rgba(0, 0, 0, 0%); font-family:'Courier';", "selected": "text-align:left; background-image:url($path/moodcheck1.png); border:0px solid #c48a00; padding: 0px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
"loc": [95, 323], "loc": [95, 323],
"size": [62, 9], "size": [62, 9],
"text": "", "text": "",
"icon": "", "icon": "",
"mood": 18 "mood": 18
}, },
{ "style": "text-align:left; border:0px solid #c48a00; padding: 0px;color: rgba(0, 0, 0, 0%); font-family:'Courier'", { "style": "text-align:left; border:0px solid #c48a00; padding: 0px;color: rgba(0, 0, 0, 0%); font-family:'Courier'",
"selected": "text-align:left; background-image:url($path/moodcheck2.png); border:0px solid #c48a00; padding: 0px;color: rgba(0, 0, 0, 0%); font-family:'Courier';", "selected": "text-align:left; background-image:url($path/moodcheck2.png); border:0px solid #c48a00; padding: 0px;color: rgba(0, 0, 0, 0%); font-family:'Courier';",
"loc": [165, 323], "loc": [165, 323],
"size": [70, 9], "size": [70, 9],
"text": "", "text": "",
"icon": "", "icon": "",
"mood": 2 "mood": 2
} }
] ]
}, },
"convo": "convo":
@ -198,12 +195,12 @@
"ceasepester": "ceased pestering", "ceasepester": "ceased pestering",
"blocked": "blocked", "blocked": "blocked",
"unblocked": "unblocked", "unblocked": "unblocked",
"blockedmsg": "did not receive message from", "blockedmsg": "did not receive message from",
"openmemo": "opened memo on board", "openmemo": "opened memo on board",
"joinmemo": "responded to memo", "joinmemo": "responded to memo",
"closememo": "ceased responding to memo", "closememo": "ceased responding to memo",
"kickedmemo": "You have been banned from this memo!", "kickedmemo": "You have been banned from this memo!",
"idle": "is now an idle chum!" "idle": "is now an idle chum!"
}, },
"systemMsgColor": "#646464" "systemMsgColor": "#646464"
}, },
@ -219,7 +216,7 @@
}, },
"scrollbar": { "style" : "padding-top:17px; padding-bottom:17px;width: 18px; background: rgba(255, 255, 0, 0%); border:0px;", "scrollbar": { "style" : "padding-top:17px; padding-bottom:17px;width: 18px; background: rgba(255, 255, 0, 0%); border:0px;",
"handle": "background-color:black;min-height:20px;", "handle": "background-color:black;min-height:20px;",
"downarrow": "height:17px;border:0px;", "downarrow": "height:17px;border:0px;",
"darrowstyle": "image:url($path/downarrow.png);", "darrowstyle": "image:url($path/downarrow.png);",
"uparrow": "height:17px;border:0px;", "uparrow": "height:17px;border:0px;",
"uarrowstyle": "image:url($path/uparrow.png);" "uarrowstyle": "image:url($path/uparrow.png);"
@ -236,20 +233,20 @@
"userlist": { "width": 150, "userlist": { "width": 150,
"style": "border:2px solid black; background: white;font: bold;font-family: 'Courier';selection-background-color:black; font-size: 12px; margin-left:0px; margin-right:10px;" "style": "border:2px solid black; background: white;font: bold;font-family: 'Courier';selection-background-color:black; font-size: 12px; margin-left:0px; margin-right:10px;"
}, },
"time": { "text": { "width": 75, "time": { "text": { "width": 75,
"style": " border: 2px solid black; background: white; font-size: 12px; margin-top: 5px; margin-right: 5px; margin-left: 5px; font-family:'Courier';font:bold;" "style": " border: 2px solid black; background: white; font-size: 12px; margin-top: 5px; margin-right: 5px; margin-left: 5px; font-family:'Courier';font:bold;"
}, },
"slider": { "style": "border: 0px;", "slider": { "style": "border: 0px;",
"groove": "", "groove": "",
"handle": "" "handle": ""
}, },
"buttons": { "style": "color: black; font: bold; border: 2px solid black; font: bold; font-size: 12px; background: white; margin-top: 5px; margin-right: 5px; margin-left: 5px; padding: 2px; width: 50px;" }, "buttons": { "style": "color: black; font: bold; border: 2px solid black; font: bold; font-size: 12px; background: white; margin-top: 5px; margin-right: 5px; margin-left: 5px; padding: 2px; width: 50px;" },
"arrows": { "left": "$path/leftarrow.png", "arrows": { "left": "$path/leftarrow.png",
"right": "$path/rightarrow.png", "right": "$path/rightarrow.png",
"style": " border:0px; margin-top: 5px; margin-right:10px;" "style": " border:0px; margin-top: 5px; margin-right:10px;"
} }
}, },
"systemMsgColor": "#646464", "systemMsgColor": "#646464",
"op": { "icon": "$path/protective.png" } "op": { "icon": "$path/protective.png" }
} }
} }