sounds, idle, etc
This commit is contained in:
parent
87cbeca5dd
commit
2dbd124c2d
22 changed files with 92 additions and 13 deletions
11
TODO
11
TODO
|
@ -1,22 +1,19 @@
|
|||
Features:
|
||||
* Tray doesn't disappear on windows after close
|
||||
* Idling
|
||||
* PESTERCHUM:BLOCKED
|
||||
* new sound on CEASE and BEGIN?
|
||||
* scroll bar style?
|
||||
* flashing??
|
||||
* More complex quirks: random, spelling, by-sound
|
||||
* change profile only once we have confirmation from server
|
||||
* convert hex tags (<GFFFFFF> or <GFF0000>)
|
||||
* convo backgrounds -- make them more like http://www.mspaintadventures.com/storyfiles/hs2/02546_2.gif
|
||||
* help button on quirks menu?
|
||||
* help menu -- about and forum
|
||||
* dropped messages when chatting ?
|
||||
-- release alpha
|
||||
* shared buddy lists - changes to the buddy list should refresh it?
|
||||
multiple clients share buddy list???
|
||||
* chumList not scaling -- QListView + delegate?
|
||||
* spell check?
|
||||
* convo backgrounds -- make them more like http://www.mspaintadventures.com/storyfiles/hs2/02546_2.gif
|
||||
* help button on quirks menu?
|
||||
-- release beta
|
||||
* change profile only once we have confirmation from server
|
||||
* log viewer
|
||||
* pick your own icon
|
||||
* time codes
|
||||
|
|
33
convo.py
33
convo.py
|
@ -1,5 +1,6 @@
|
|||
from string import Template
|
||||
import re
|
||||
from datetime import datetime, timedelta
|
||||
from PyQt4 import QtGui, QtCore
|
||||
|
||||
from dataobjs import PesterProfile, Mood, PesterHistory
|
||||
|
@ -223,6 +224,14 @@ class PesterText(QtGui.QTextEdit):
|
|||
msg = chum.pestermsg(me, systemColor, window.theme['convo/text/unblocked'])
|
||||
window.chatlog.log(chum.handle, convertTags(msg, "bbcode"))
|
||||
self.append(convertTags(msg))
|
||||
elif msg == "PESTERCHUM:BLOCKED":
|
||||
msg = chum.pestermsg(me, systemColor, window.theme['convo/text/blockedmsg'])
|
||||
window.chatlog.log(chum.handle, convertTags(msg, "bbcode"))
|
||||
self.append(convertTags(msg))
|
||||
elif msg == "PESTERCHUM:IDLE":
|
||||
msg = chum.idlemsg(systemColor, window.theme['convo/text/idle'])
|
||||
window.chatlog.log(chum.handle, convertTags(msg, "bbcode"))
|
||||
self.append(convertTags(msg))
|
||||
elif msg[0:3] == "/me" or msg[0:13] == "PESTERCHUM:ME":
|
||||
if msg[0:3] == "/me":
|
||||
start = 3
|
||||
|
@ -248,6 +257,12 @@ class PesterText(QtGui.QTextEdit):
|
|||
if chum is me:
|
||||
window.chatlog.log(parent.chum.handle, convertTags(msg, "bbcode"))
|
||||
else:
|
||||
if window.idle:
|
||||
idlethreshhold = 60
|
||||
if (not hasattr(self, 'lastmsg')) or \
|
||||
datetime.now() - self.lastmsg > timedelta(0,60):
|
||||
parent.messageSent.emit("PESTERCHUM:IDLE", parent.title())
|
||||
self.lastmsg = datetime.now()
|
||||
window.chatlog.log(chum.handle, convertTags(msg, "bbcode"))
|
||||
def changeTheme(self, theme):
|
||||
self.setStyleSheet(theme["convo/textarea/style"])
|
||||
|
@ -295,6 +310,7 @@ class PesterInput(QtGui.QLineEdit):
|
|||
self.setText(prev)
|
||||
elif event.key() in [QtCore.Qt.Key_PageUp, QtCore.Qt.Key_PageDown]:
|
||||
self.parent().textArea.keyPressEvent(event)
|
||||
self.parent().mainwindow.idletime = 0
|
||||
QtGui.QLineEdit.keyPressEvent(self, event)
|
||||
|
||||
|
||||
|
@ -348,6 +364,10 @@ class PesterConvo(QtGui.QFrame):
|
|||
self.quirksOff.setCheckable(True)
|
||||
self.connect(self.quirksOff, QtCore.SIGNAL('toggled(bool)'),
|
||||
self, QtCore.SLOT('toggleQuirks(bool)'))
|
||||
self.unblockchum = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/unblockchum"], self)
|
||||
self.connect(self.unblockchum, QtCore.SIGNAL('triggered()'),
|
||||
self, QtCore.SLOT('unblockChumSlot()'))
|
||||
|
||||
self.optionsMenu.addAction(self.quirksOff)
|
||||
self.optionsMenu.addAction(self.addChumAction)
|
||||
self.optionsMenu.addAction(self.blockAction)
|
||||
|
@ -373,6 +393,7 @@ class PesterConvo(QtGui.QFrame):
|
|||
def updateMood(self, mood, unblocked=False, old=None):
|
||||
syscolor = QtGui.QColor(self.mainwindow.theme["convo/systemMsgColor"])
|
||||
if mood.name() == "offline" and self.chumopen == True and not unblocked:
|
||||
self.mainwindow.ceasesound.play()
|
||||
msg = self.chum.pestermsg(self.mainwindow.profile(), syscolor, self.mainwindow.theme["convo/text/ceasepester"])
|
||||
self.textArea.append(convertTags(msg))
|
||||
self.mainwindow.chatlog.log(self.title(), convertTags(msg, "bbcode"))
|
||||
|
@ -386,14 +407,21 @@ class PesterConvo(QtGui.QFrame):
|
|||
else:
|
||||
if self.chum.blocked(self.mainwindow.config) and not unblocked:
|
||||
self.setWindowIcon(QtGui.QIcon(self.mainwindow.theme["main/chums/moods/blocked/icon"]))
|
||||
self.optionsMenu.addAction(self.unblockchum)
|
||||
self.optionsMenu.removeAction(self.blockAction)
|
||||
else:
|
||||
self.setWindowIcon(mood.icon(self.mainwindow.theme))
|
||||
self.optionsMenu.removeAction(self.unblockchum)
|
||||
self.optionsMenu.addAction(self.blockAction)
|
||||
# print mood update?
|
||||
def updateBlocked(self):
|
||||
if self.parent():
|
||||
self.parent().updateBlocked(self.title())
|
||||
else:
|
||||
self.setWindowIcon(QtGui.QIcon(self.mainwindow.theme["main/chums/moods/blocked/icon"]))
|
||||
self.optionsMenu.addAction(self.unblockchum)
|
||||
self.optionsMenu.removeAction(self.blockAction)
|
||||
|
||||
def updateColor(self, color):
|
||||
self.chum.color = color
|
||||
def addMessage(self, text, me=True):
|
||||
|
@ -468,6 +496,7 @@ class PesterConvo(QtGui.QFrame):
|
|||
self.quirksOff.setText(self.mainwindow.theme["main/menus/rclickchumlist/quirksoff"])
|
||||
self.addChumAction.setText(self.mainwindow.theme["main/menus/rclickchumlist/addchum"])
|
||||
self.blockAction.setText(self.mainwindow.theme["main/menus/rclickchumlist/blockchum"])
|
||||
self.unblockchum.setText(self.mainwindow.theme["main/menus/rclickchumlist/unblockchum"], self)
|
||||
|
||||
self.textArea.changeTheme(theme)
|
||||
self.textInput.changeTheme(theme)
|
||||
|
@ -498,11 +527,13 @@ class PesterConvo(QtGui.QFrame):
|
|||
@QtCore.pyqtSlot()
|
||||
def blockThisChum(self):
|
||||
self.mainwindow.blockChum(self.chum.handle)
|
||||
@QtCore.pyqtSlot()
|
||||
def unblockChumSlot(self):
|
||||
self.mainwindow.unblockChum(self.chum.handle)
|
||||
@QtCore.pyqtSlot(bool)
|
||||
def toggleQuirks(self, toggled):
|
||||
self.applyquirks = not toggled
|
||||
|
||||
|
||||
messageSent = QtCore.pyqtSignal(QtCore.QString, QtCore.QString)
|
||||
windowClosed = QtCore.pyqtSignal(QtCore.QString)
|
||||
|
||||
|
|
BIN
convo.pyc
BIN
convo.pyc
Binary file not shown.
|
@ -140,6 +140,8 @@ class PesterProfile(object):
|
|||
return "<c=%s>-- %s <c=%s>[%s]</c> %s %s <c=%s>[%s]</c> at %s --</c>" % (syscolor.name(), self.handle, self.colorhtml(), self.initials(), verb, otherchum.handle, otherchum.colorhtml(), otherchum.initials(), datetime.now().strftime("%H:%M"))
|
||||
def moodmsg(self, mood, syscolor, theme):
|
||||
return "<c=%s>-- %s <c=%s>[%s]</c> changed their mood to %s <img src='%s' /> --</c>" % (syscolor.name(), self.handle, self.colorhtml(), self.initials(), mood.name().upper(), theme["main/chums/moods"][mood.name()]["icon"])
|
||||
def idlemsg(self, syscolor, verb):
|
||||
return "<c=%s>-- %s <c=%s>[%s]</c> %s --" % (syscolor.name(), self.handle, self.colorhtml(), self.initials(), verb)
|
||||
def memoclosemsg(self, syscolor, timeGrammar, verb):
|
||||
return "<c=%s><c=%s>%s%s%s</c> %s.</c>" % (syscolor.name(), self.colorhtml(), timeGrammar.pcf, self.initials(), timeGrammar.number, verb)
|
||||
def memoopenmsg(self, syscolor, td, timeGrammar, verb, channel):
|
||||
|
|
BIN
dataobjs.pyc
BIN
dataobjs.pyc
Binary file not shown.
BIN
generic.pyc
BIN
generic.pyc
Binary file not shown.
BIN
irc.pyc
BIN
irc.pyc
Binary file not shown.
BIN
memos.pyc
BIN
memos.pyc
Binary file not shown.
BIN
menus.pyc
BIN
menus.pyc
Binary file not shown.
Binary file not shown.
BIN
oyoyo/client.pyc
BIN
oyoyo/client.pyc
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
oyoyo/parse.pyc
BIN
oyoyo/parse.pyc
Binary file not shown.
BIN
parsetools.pyc
BIN
parsetools.pyc
Binary file not shown.
|
@ -1 +1 @@
|
|||
{"tabs": true, "soundon": true, "chums": ["marineAquist", "unknownTraveler", "tentacleTherapist", "macruralAlchemist", "vaginalEngineer", "mechanicalSpectacle", "carcinoGeneticist", "schlagzeugGator", "gamblingGenocider", "gardenGnostic", "superGhost", "centaursTesticle", "arachnidsGrip", "grimAuxiliatrix", "remoteBloodbath", "nitroZealist", "greenZephyr", "arsenicCatnip", "adiosToreador", "cuttlefishCuller", "rageInducer", "gallowsCalibrator", "caligulasAquarium", "terminallyCapricious", "illuminatedWax", "aquaMarinist", "maxiumumFatness", "elegantDiversion", "moirailBunp", "uroborosUnbound", "androidTechnician", "midnightSparrow", "apocalypseArisen", "acapellaWaterfall", "anguillaNuntia", "oilslickOrchid", "confusedTransient", "pretentiousFantasia", "aquaticMarinist", "ardentAbettor"], "defaultprofile": "ghostDunk", "block": []}
|
||||
{"tabs": true, "soundon": true, "chums": ["unknownTraveler", "tentacleTherapist", "vaginalEngineer", "mechanicalSpectacle", "carcinoGeneticist", "schlagzeugGator", "gamblingGenocider", "gardenGnostic", "superGhost", "centaursTesticle", "arachnidsGrip", "grimAuxiliatrix", "remoteBloodbath", "nitroZealist", "greenZephyr", "arsenicCatnip", "adiosToreador", "cuttlefishCuller", "rageInducer", "gallowsCalibrator", "caligulasAquarium", "terminallyCapricious", "illuminatedWax", "aquaMarinist", "maxiumumFatness", "elegantDiversion", "moirailBunp", "uroborosUnbound", "androidTechnician", "midnightSparrow", "apocalypseArisen", "anguillaNuntia", "oilslickOrchid", "confusedTransient", "pretentiousFantasia", "aquaticMarinist"], "defaultprofile": "ghostDunk", "block": []}
|
|
@ -662,6 +662,7 @@ class PesterWindow(MovingWindow):
|
|||
self.importaction = QtGui.QAction(self.theme["main/menus/client/import"], self)
|
||||
self.connect(self.importaction, QtCore.SIGNAL('triggered()'),
|
||||
self, QtCore.SLOT('importExternalConfig()'))
|
||||
|
||||
self.menu = QtGui.QMenuBar(self)
|
||||
|
||||
filemenu = self.menu.addMenu(self.theme["main/menus/client/_name"])
|
||||
|
@ -762,6 +763,15 @@ class PesterWindow(MovingWindow):
|
|||
|
||||
self.waitingMessages = waitingMessageHolder(self)
|
||||
|
||||
self.idle = False
|
||||
self.idlethreshold = 600
|
||||
self.idletimer = QtCore.QTimer(self)
|
||||
self.idleposition = QtGui.QCursor.pos()
|
||||
self.idletime = 0
|
||||
self.connect(self.idletimer, QtCore.SIGNAL('timeout()'),
|
||||
self, QtCore.SLOT('checkIdle()'))
|
||||
self.idletimer.start(1000)
|
||||
|
||||
if not self.config.defaultprofile():
|
||||
self.changeProfile()
|
||||
self.loadingscreen = LoadingScreen(self)
|
||||
|
@ -800,6 +810,7 @@ class PesterWindow(MovingWindow):
|
|||
def newMessage(self, handle, msg):
|
||||
if handle in self.config.getBlocklist():
|
||||
#yeah suck on this
|
||||
self.sendMessage.emit("PESTERCHUM:BLOCKED", handle)
|
||||
return
|
||||
if not self.convos.has_key(handle):
|
||||
if msg == "PESTERCHUM:CEASE": # ignore cease after we hang up
|
||||
|
@ -817,7 +828,10 @@ class PesterWindow(MovingWindow):
|
|||
convo.addMessage(msg, False)
|
||||
# play sound here
|
||||
if self.config.soundOn():
|
||||
self.alarm.play()
|
||||
if msg in ["PESTERCHUM:CEASE", "PESTERCHUM:BLOCK"]:
|
||||
self.ceasesound.play()
|
||||
else:
|
||||
self.alarm.play()
|
||||
def newMemoMsg(self, chan, handle, msg):
|
||||
if not self.memos.has_key(chan):
|
||||
# silently ignore in case we forgot to /part
|
||||
|
@ -1016,8 +1030,10 @@ class PesterWindow(MovingWindow):
|
|||
# sounds
|
||||
if not pygame.mixer:
|
||||
self.alarm = NoneSound()
|
||||
self.ceasesound = NoneSound()
|
||||
else:
|
||||
self.alarm = pygame.mixer.Sound(theme["main/sounds/alertsound"])
|
||||
self.ceasesound = pygame.mixer.Sound(theme["main/sounds/ceasesound"])
|
||||
|
||||
def changeTheme(self, theme):
|
||||
self.theme = theme
|
||||
|
@ -1247,6 +1263,32 @@ class PesterWindow(MovingWindow):
|
|||
self.moodRequest.emit(chum)
|
||||
self.unblockedChum.emit(handle)
|
||||
|
||||
@QtCore.pyqtSlot(bool)
|
||||
def toggleIdle(self, idle):
|
||||
if self.idle and not idle:
|
||||
self.idle = False
|
||||
elif idle and not self.idle:
|
||||
self.idle = True
|
||||
sysColor = QtGui.QColor(self.theme["convo/systemMsgColor"])
|
||||
verb = self.theme["convo/text/idle"]
|
||||
for (h, convo) in self.convos.iteritems():
|
||||
msg = self.profile().idlemsg(sysColor, verb)
|
||||
convo.textArea.append(convertTags(msg))
|
||||
self.chatlog.log(h, convertTags(msg, "bbcode"))
|
||||
self.sendMessage.emit("PESTERCHUM:IDLE", h)
|
||||
|
||||
@QtCore.pyqtSlot()
|
||||
def checkIdle(self):
|
||||
newpos = QtGui.QCursor.pos()
|
||||
if newpos == self.idleposition:
|
||||
self.idletime += 1
|
||||
else:
|
||||
self.idletime = 0
|
||||
if self.idletime >= self.idlethreshold:
|
||||
self.toggleIdle(True)
|
||||
else:
|
||||
self.toggleIdle(False)
|
||||
self.idleposition = newpos
|
||||
@QtCore.pyqtSlot()
|
||||
def importExternalConfig(self):
|
||||
f = QtGui.QFileDialog.getOpenFileName(self)
|
||||
|
@ -1695,7 +1737,6 @@ class MainProgram(QtCore.QObject):
|
|||
irc,
|
||||
QtCore.SLOT('setChannelMode(QString, QString, QString)'))
|
||||
|
||||
|
||||
# IRC --> Main window
|
||||
irc.connect(irc, QtCore.SIGNAL('connected()'),
|
||||
widget, QtCore.SLOT('connected()'))
|
||||
|
@ -1752,6 +1793,9 @@ class MainProgram(QtCore.QObject):
|
|||
|
||||
def run(self):
|
||||
self.ircapp.start()
|
||||
self.widget.loadingscreen = LoadingScreen(self.widget)
|
||||
self.connect(self.widget.loadingscreen, QtCore.SIGNAL('rejected()'),
|
||||
self.widget, QtCore.SLOT('close()'))
|
||||
status = self.widget.loadingscreen.exec_()
|
||||
if status == QtGui.QDialog.Rejected:
|
||||
sys.exit(0)
|
||||
|
|
BIN
themes/pesterchum/cease.wav
Normal file
BIN
themes/pesterchum/cease.wav
Normal file
Binary file not shown.
|
@ -15,12 +15,14 @@
|
|||
"selected": "background-color: #ffff00",
|
||||
"loc": [10,0]
|
||||
},
|
||||
"sounds": { "alertsound": "$path/alarm.wav" },
|
||||
"sounds": { "alertsound": "$path/alarm.wav",
|
||||
"ceasesound": "$path/cease.wav" },
|
||||
"menus": {"client": {"_name": "CLIENT",
|
||||
"options": "OPTIONS",
|
||||
"memos": "MEMOS",
|
||||
"userlist": "USERLIST",
|
||||
"import": "IMPORT",
|
||||
"idle": "IDLE",
|
||||
"exit": "EXIT"},
|
||||
"profile": {"_name": "PROFILE",
|
||||
"switch": "SWITCH",
|
||||
|
@ -220,10 +222,12 @@
|
|||
"ceasepester": "ceased pestering",
|
||||
"blocked": "blocked",
|
||||
"unblocked": "unblocked",
|
||||
"blockedmsg": "did not receive message from",
|
||||
"openmemo": "opened memo on board",
|
||||
"joinmemo": "responded 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!"
|
||||
},
|
||||
"systemMsgColor": "#646464"
|
||||
},
|
||||
|
|
BIN
themes/trollian/cease.wav
Normal file
BIN
themes/trollian/cease.wav
Normal file
Binary file not shown.
|
@ -21,6 +21,7 @@
|
|||
"memos": "Memos",
|
||||
"userlist": "Fresh Targets",
|
||||
"import": "import U2;",
|
||||
"idle":, "Idle",
|
||||
"exit": "Abscond"},
|
||||
"profile": {"_name": "View",
|
||||
"switch": "Trolltag",
|
||||
|
|
Loading…
Reference in a new issue