From 6ebf1fee345427df11d88ee0e4838f0efb940f56 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Thu, 24 Feb 2011 22:06:38 -0600 Subject: [PATCH] 'Play' sound on new messages --- src/dialcentral_qt.py | 26 +++++++++++++++++++++++++- src/session.py | 27 ++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/dialcentral_qt.py b/src/dialcentral_qt.py index 4626fe7..f68280e 100755 --- a/src/dialcentral_qt.py +++ b/src/dialcentral_qt.py @@ -196,6 +196,17 @@ class Dialcentral(qwrappers.ApplicationWrapper): else: return None + def get_resource(self, name): + if self._dataPath is None: + for path in self._DATA_PATHS: + if os.path.exists(os.path.join(path, name)): + self._dataPath = path + break + if self._dataPath is not None: + return os.path.join(self._dataPath, name) + else: + return None + def _close_windows(self): qwrappers.ApplicationWrapper._close_windows(self) if self._aboutDialog is not None: @@ -345,7 +356,6 @@ class MainWindow(qwrappers.WindowWrapper): def __init__(self, parent, app): qwrappers.WindowWrapper.__init__(self, parent, app) self._window.setWindowTitle("%s" % constants.__pretty_app_name__) - #self._freezer = qwrappers.AutoFreezeWindowFeature(self._app, self._window) self._errorLog = self._app.errorLog self._session = session.Session(self._errorLog, constants._data_path_) @@ -359,6 +369,11 @@ class MainWindow(qwrappers.WindowWrapper): self._voicemailRefreshDelay.setSingleShot(True) self._callHandler = call_handler.MissedCallWatcher() self._callHandler.callMissed.connect(self._voicemailRefreshDelay.start) + self._alertSoundPath = self._app.get_resource("bell.wav") + if QtGui.QSound.isAvailable(): + self._session.newMessages.connect(self._on_new_message_alert) + else: + _moduleLogger.info("No sound support available") self._defaultCredentials = "", "" self._curentCredentials = "", "" self._currentTab = 0 @@ -592,6 +607,15 @@ class MainWindow(qwrappers.WindowWrapper): with qui_utils.notify_error(self._errorLog): self._session.update_messages(True) + @QtCore.pyqtSlot() + @misc_utils.log_exception(_moduleLogger) + def _on_new_message_alert(self): + with qui_utils.notify_error(self._errorLog): + if self._alertSoundPath is not None: + QtGui.QSound.play(self._alertSoundPath) + else: + _moduleLogger.info("Alert but alas I am missing my voice") + @QtCore.pyqtSlot(str) @misc_utils.log_exception(_moduleLogger) def _on_session_error(self, message): diff --git a/src/session.py b/src/session.py index 2144ebd..e1962f5 100644 --- a/src/session.py +++ b/src/session.py @@ -201,6 +201,7 @@ class Session(QtCore.QObject): contactsUpdated = QtCore.pyqtSignal() messagesUpdated = QtCore.pyqtSignal() + newMessages = QtCore.pyqtSignal() historyUpdated = QtCore.pyqtSignal() dndStateChange = QtCore.pyqtSignal(bool) @@ -229,6 +230,7 @@ class Session(QtCore.QObject): self._contacts = {} self._contactUpdateTime = datetime.datetime(1971, 1, 1) self._messages = [] + self._cleanMessages = [] self._messageUpdateTime = datetime.datetime(1971, 1, 1) self._history = [] self._historyUpdateTime = datetime.datetime(1971, 1, 1) @@ -445,6 +447,7 @@ class Session(QtCore.QObject): self._loggedInTime = self._LOGGEDOUT_TIME self.error.emit("Error logging in") except Exception, e: + _moduleLogger.exception("Booh") self._loggedInTime = self._LOGGEDOUT_TIME _moduleLogger.exception("Reporting error to user") self.error.emit(str(e)) @@ -463,6 +466,7 @@ class Session(QtCore.QObject): self._contacts = {} self._messages = [] + self._cleanMessages = [] self._history = [] self._dnd = False self._callback = "" @@ -494,7 +498,7 @@ class Session(QtCore.QObject): try: with open(cachePath, "rb") as f: dumpedData = pickle.load(f) - except (pickle.PickleError, IOError, EOFError, ValueError): + except (pickle.PickleError, IOError, EOFError, ValueError, ImportError): _moduleLogger.exception("Pickle fun loading") return False except: @@ -523,6 +527,7 @@ class Session(QtCore.QObject): self._contacts = contacts self._contactUpdateTime = contactUpdateTime self._messages = messages + self._alert_on_messages(self._messages) self._messageUpdateTime = messageUpdateTime self._history = history self._historyUpdateTime = historyUpdateTime @@ -617,6 +622,7 @@ class Session(QtCore.QObject): return self._messageUpdateTime = datetime.datetime.now() self.messagesUpdated.emit() + self._alert_on_messages(self._messages) def _update_history(self): try: @@ -662,3 +668,22 @@ class Session(QtCore.QObject): _moduleLogger.info("Skipping queueing duplicate op: %r" % asyncOp) return self._loginOps.append(asyncOp) + + def _alert_on_messages(self, messages): + cleanNewMessages = list(self._clean_messages(messages)) + if self._cleanMessages: + if self._cleanMessages != cleanNewMessages: + self.newMessages.emit() + self._cleanMessages = cleanNewMessages + + def _clean_messages(self, messages): + for message in messages: + cleaned = dict(message) + del cleaned["relTime"] + del cleaned["time"] + del cleaned["isArchived"] + del cleaned["isRead"] + del cleaned["isSpam"] + del cleaned["isTrash"] + cleaned["messageParts"] = [tuple(part[0:-1]) for part in cleaned["messageParts"] if part[0] != "Me:"] + yield cleaned -- 1.7.9.5