'Play' sound on new messages
authorEd Page <eopage@byu.net>
Fri, 25 Feb 2011 04:06:38 +0000 (22:06 -0600)
committerEd Page <eopage@byu.net>
Wed, 13 Apr 2011 03:08:47 +0000 (22:08 -0500)
src/dialcentral_qt.py
src/session.py

index 4626fe7..f68280e 100755 (executable)
@@ -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):
index 2144ebd..e1962f5 100644 (file)
@@ -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