Customizable name alerts

This commit is contained in:
Kiooeht 2011-08-23 00:51:50 -07:00
parent 99b701061b
commit 8f1f73bc7a
4 changed files with 142 additions and 7 deletions

View file

@ -25,6 +25,7 @@ CHANGELOG
* Minimizable memo userlist - Kiooeht [evacipatedBox] (Idea: [alGore], [lostGash]) * Minimizable memo userlist - Kiooeht [evacipatedBox] (Idea: [alGore], [lostGash])
* Chumroll notifications on chum sign-in/out - Kiooeht [evacipatedBox] * Chumroll notifications on chum sign-in/out - Kiooeht [evacipatedBox]
* Chum notes - Kiooeht [evacipatedBox] * Chum notes - Kiooeht [evacipatedBox]
* Customizable name alerts - Kiooeht [evacipatedBox]
* Bug fixes * Bug fixes
* Don't delete random chum when blocking someone not on chumroll - Kiooeht [evacipatedBox] * Don't delete random chum when blocking someone not on chumroll - Kiooeht [evacipatedBox]
* Openning global userlist doesn't reset OP status of memo users - Kiooeht [evacipatedBox] * Openning global userlist doesn't reset OP status of memo users - Kiooeht [evacipatedBox]

View file

@ -14,7 +14,6 @@ Features
* Colour saving boxes things? * Colour saving boxes things?
* Whowas for last seen online? * Whowas for last seen online?
* Tab completion of two letter names * Tab completion of two letter names
* Customizable name alerts
* When 'banned' make impossible to connect using timestamp banned under * When 'banned' make impossible to connect using timestamp banned under
* Explain why a chumhandle is invalid * Explain why a chumhandle is invalid
* Fully working Toasts * Fully working Toasts
@ -29,6 +28,7 @@ Bugs
* When left for a really long time, animations slow down pesterchum * When left for a really long time, animations slow down pesterchum
* Closing a timeclone doesn't actually cease for everyone else * Closing a timeclone doesn't actually cease for everyone else
* Kill Zalgo * Kill Zalgo
* Random invisible, tiny links to last link at end of every message
Windows Bugs Windows Bugs
------------ ------------

110
menus.py
View file

@ -896,6 +896,85 @@ class PesterChooseProfile(QtGui.QDialog):
problem.setStandardButtons(QtGui.QMessageBox.Ok) problem.setStandardButtons(QtGui.QMessageBox.Ok)
problem.exec_() problem.exec_()
class PesterMentions(QtGui.QDialog):
def __init__(self, window, theme, parent):
QtGui.QDialog.__init__(self, parent)
self.setWindowTitle("Mentions")
self.setModal(True)
self.mainwindow = window
self.theme = theme
self.setStyleSheet(self.theme["main/defaultwindow/style"])
self.mentionlist = QtGui.QListWidget(self)
self.mentionlist.addItems(self.mainwindow.userprofile.getMentions())
self.addBtn = QtGui.QPushButton("ADD MENTION", self)
self.connect(self.addBtn, QtCore.SIGNAL('clicked()'),
self, QtCore.SLOT('addMention()'))
self.editBtn = QtGui.QPushButton("EDIT", self)
self.connect(self.editBtn, QtCore.SIGNAL('clicked()'),
self, QtCore.SLOT('editSelected()'))
self.rmBtn = QtGui.QPushButton("REMOVE", self)
self.connect(self.rmBtn, QtCore.SIGNAL('clicked()'),
self, QtCore.SLOT('removeCurrent()'))
layout_1 = QtGui.QHBoxLayout()
layout_1.addWidget(self.editBtn)
layout_1.addWidget(self.rmBtn)
self.ok = QtGui.QPushButton("OK", self)
self.ok.setDefault(True)
self.connect(self.ok, QtCore.SIGNAL('clicked()'),
self, QtCore.SLOT('accept()'))
self.cancel = QtGui.QPushButton("CANCEL", self)
self.connect(self.cancel, QtCore.SIGNAL('clicked()'),
self, QtCore.SLOT('reject()'))
layout_2 = QtGui.QHBoxLayout()
layout_2.addWidget(self.cancel)
layout_2.addWidget(self.ok)
layout_0 = QtGui.QVBoxLayout()
layout_0.addWidget(self.mentionlist)
layout_0.addWidget(self.addBtn)
layout_0.addLayout(layout_1)
layout_0.addLayout(layout_2)
self.setLayout(layout_0)
@QtCore.pyqtSlot()
def editSelected(self):
m = self.mentionlist.currentItem()
if not m:
return
self.addMention(m)
@QtCore.pyqtSlot()
def addMention(self, mitem=None):
d = {"label": "Mention:", "inputname": "value" }
if mitem is not None:
d["value"] = str(mitem.text())
pdict = MultiTextDialog("ENTER MENTION", self, d).getText()
if pdict is None:
return
try:
re.compile(pdict["value"])
except re.error, e:
quirkWarning = QtGui.QMessageBox(self)
quirkWarning.setText("Not a valid regular expression!")
quirkWarning.setInformativeText("H3R3S WHY DUMP4SS: %s" % (e))
quirkWarning.exec_()
else:
if mitem is None:
self.mentionlist.addItem(pdict["value"])
else:
mitem.setText(pdict["value"])
@QtCore.pyqtSlot()
def removeCurrent(self):
i = self.mentionlist.currentRow()
if i >= 0:
self.mentionlist.takeItem(i)
class PesterOptions(QtGui.QDialog): class PesterOptions(QtGui.QDialog):
def __init__(self, config, theme, parent): def __init__(self, config, theme, parent):
QtGui.QDialog.__init__(self, parent) QtGui.QDialog.__init__(self, parent)
@ -955,6 +1034,11 @@ class PesterOptions(QtGui.QDialog):
self.chatsoundcheck.setEnabled(False) self.chatsoundcheck.setEnabled(False)
self.memosoundcheck.setEnabled(False) self.memosoundcheck.setEnabled(False)
self.memoSoundChange(0) self.memoSoundChange(0)
self.editMentions = QtGui.QPushButton("Edit Mentions", self)
self.connect(self.editMentions, QtCore.SIGNAL('clicked()'),
self, QtCore.SLOT('openMentions()'))
self.volume = QtGui.QSlider(QtCore.Qt.Horizontal, self) self.volume = QtGui.QSlider(QtCore.Qt.Horizontal, self)
self.volume.setMinimum(0) self.volume.setMinimum(0)
self.volume.setMaximum(100) self.volume.setMaximum(100)
@ -1155,6 +1239,7 @@ class PesterOptions(QtGui.QDialog):
layout_doubleindent = QtGui.QVBoxLayout() layout_doubleindent = QtGui.QVBoxLayout()
layout_doubleindent.addWidget(self.memopingcheck) layout_doubleindent.addWidget(self.memopingcheck)
layout_doubleindent.addWidget(self.namesoundcheck) layout_doubleindent.addWidget(self.namesoundcheck)
layout_doubleindent.addWidget(self.editMentions)
layout_doubleindent.setContentsMargins(22,0,0,0) layout_doubleindent.setContentsMargins(22,0,0,0)
layout_indent.addLayout(layout_doubleindent) layout_indent.addLayout(layout_doubleindent)
layout_indent.setContentsMargins(22,0,0,0) layout_indent.setContentsMargins(22,0,0,0)
@ -1241,6 +1326,31 @@ class PesterOptions(QtGui.QDialog):
def printValue(self, v): def printValue(self, v):
self.currentVol.setText(str(v)+"%") self.currentVol.setText(str(v)+"%")
@QtCore.pyqtSlot()
def openMentions(self):
if not hasattr(self, 'mentionmenu'):
self.mentionmenu = None
if not self.mentionmenu:
self.mentionmenu = PesterMentions(self.parent(), self.theme, self)
self.connect(self.mentionmenu, QtCore.SIGNAL('accepted()'),
self, QtCore.SLOT('updateMentions()'))
self.connect(self.mentionmenu, QtCore.SIGNAL('rejected()'),
self, QtCore.SLOT('closeMentions()'))
self.mentionmenu.show()
self.mentionmenu.raise_()
self.mentionmenu.activateWindow()
@QtCore.pyqtSlot()
def closeMentions(self):
self.mentionmenu.close()
self.mentionmenu = None
@QtCore.pyqtSlot()
def updateMentions(self):
m = []
for i in range(self.mentionmenu.mentionlist.count()):
m.append(str(self.mentionmenu.mentionlist.item(i).text()))
self.parent().userprofile.setMentions(m)
self.mentionmenu = None
class PesterUserlist(QtGui.QDialog): class PesterUserlist(QtGui.QDialog):
def __init__(self, config, theme, parent): def __init__(self, config, theme, parent):
QtGui.QDialog.__init__(self, parent) QtGui.QDialog.__init__(self, parent)

View file

@ -570,6 +570,12 @@ class userProfile(object):
self.lastmood = self.chat.mood.value() self.lastmood = self.chat.mood.value()
self.quirks = pesterQuirks([]) self.quirks = pesterQuirks([])
self.randoms = False self.randoms = False
initials = self.chat.initials()
if len(initials) >= 2:
initials = (initials, "%s%s" % (initials[0].lower(), initials[1]), "%s%s" % (initials[0], initials[1].lower()))
self.mentions = [r"\b(%s)\b" % ("|".join(initials))]
else:
self.mentions = []
else: else:
fp = open("%s/%s.js" % (self.profiledir, user)) fp = open("%s/%s.js" % (self.profiledir, user))
self.userprofile = json.load(fp) self.userprofile = json.load(fp)
@ -586,6 +592,14 @@ class userProfile(object):
if "randoms" not in self.userprofile: if "randoms" not in self.userprofile:
self.userprofile["randoms"] = False self.userprofile["randoms"] = False
self.randoms = self.userprofile["randoms"] self.randoms = self.userprofile["randoms"]
if "mentions" not in self.userprofile:
initials = self.chat.initials()
if len(initials) >= 2:
initials = (initials, "%s%s" % (initials[0].lower(), initials[1]), "%s%s" % (initials[0], initials[1].lower()))
self.userprofile["mentions"] = [r"\b(%s)\b" % ("|".join(initials))]
else:
self.userprofile["mentions"] = []
self.mentions = self.userprofile["mentions"]
def setMood(self, mood): def setMood(self, mood):
self.chat.mood = mood self.chat.mood = mood
@ -607,6 +621,18 @@ class userProfile(object):
self.randoms = random self.randoms = random
self.userprofile["randoms"] = random self.userprofile["randoms"] = random
self.save() self.save()
def getMentions(self):
return self.mentions
def setMentions(self, mentions):
try:
for (i,m) in enumerate(mentions):
re.compile(m)
except re.error, e:
logging.error("#%s Not a valid regular expression: %s" % (i, e))
else:
self.mentions = mentions
self.userprofile["mentions"] = mentions
self.save()
def getLastMood(self): def getLastMood(self):
return self.lastmood return self.lastmood
def setLastMood(self, mood): def setLastMood(self, mood):
@ -1865,15 +1891,13 @@ class PesterWindow(MovingWindow):
if self.config.soundOn(): if self.config.soundOn():
if self.config.memoSound(): if self.config.memoSound():
if self.config.nameSound(): if self.config.nameSound():
initials = self.userprofile.chat.initials()
initials = (initials, "%s%s" % (initials[0].lower(), initials[1]), "%s%s" % (initials[0], initials[1].lower()))
search = r"\b(%s)\b" % ("|".join(initials))
m = convertTags(msg, "text") m = convertTags(msg, "text")
if m.find(":") <= 3: if m.find(":") <= 3:
m = m[m.find(":"):] m = m[m.find(":"):]
if re.search(search, m): for search in self.userprofile.getMentions():
self.namesound.play() if re.search(search, m):
return self.namesound.play()
return
if self.honk and re.search(r"\bhonk\b", convertTags(msg, "text"), re.I): if self.honk and re.search(r"\bhonk\b", convertTags(msg, "text"), re.I):
self.honksound.play() self.honksound.play()
elif self.config.memoPing(): elif self.config.memoPing():