def Start(self, mq): self.pubSub = mq self.notifier = PushBullet(self.cfgData["PushBullet"]["token"]) self.user = self.notifier.getUser() deviceList = self.notifier.getDevices() for nickname in self.devices: identifier = self.IdentifyDevice(nickname, deviceList) if identifier is not None: self.devices[nickname] = identifier else: newDeviceData = self.notifier.addDevice(nickname) self.devices[nickname] = newDeviceData["iden"] self.lastModified = self.GetLastModified() self.notifier.realtime(self.CallbackInbound, self.stopEvent)
class Notifier(object): def __init__(self, cfgData): self.cfgData = cfgData self.lastModified = None self.notifier = None self.pubSub = None self.devices = dict() self.devices[self.cfgData["PushBullet"]["appDevice"]] = None self.devices[self.cfgData["PushBullet"]["alertDevice"]] = None self.user = None self.stopEvent = Event() self.stopEventCallbackCount = 0 self.notifyHandlers = self.cfgData["PushBullet"]["accept"] self.notifyHandlers["note"] = self.PushNote self.notifyHandlers["alert"] = self.PushAlert def Start(self, mq): self.pubSub = mq self.notifier = PushBullet(self.cfgData["PushBullet"]["token"]) self.user = self.notifier.getUser() deviceList = self.notifier.getDevices() for nickname in self.devices: identifier = self.IdentifyDevice(nickname, deviceList) if identifier is not None: self.devices[nickname] = identifier else: newDeviceData = self.notifier.addDevice(nickname) self.devices[nickname] = newDeviceData["iden"] self.lastModified = self.GetLastModified() self.notifier.realtime(self.CallbackInbound, self.stopEvent) def IdentifyDevice(self, nickname, deviceList): for device in deviceList: if "nickname" in device and device["nickname"] == nickname: return device["iden"] return None def GetLastModified(self): pushes = self.notifier.getPushHistory() return float(pushes[0]["modified"]) - 1.0 def Stop(self): self.stopEvent.set() def CallbackInbound(self, data): if isinstance(data, dict) and "type" in data and "subtype" in data: pushes = self.notifier.getPushHistory(modified_after=self.lastModified) for push in pushes: if "type" in push and "active" in push and "dismissed" in push and "modified" in push: if push["type"] == "note" and push["active"] == True and push["dismissed"] == False and push["modified"] > self.lastModified: self.lastModified = push["modified"] self.ForwardMessage(push["title"], push["body"]) def _GetSignature(self): return "[{0}]".format(self.cfgData["PushBullet"]["appDevice"]) def ForwardMessage(self, title, body): if find(title, self._GetSignature()) != -1: return try: forward = False d = UrlDecode(lower(body)) if "node" in d and "cmd" in d and "r" in d and "s" in d: forward = True elif "node" in d and "cmd" in d and "v" in d and "s" in d: forward = True elif "get" in d and d["get"][0] == "report": forward = True if forward: self.pubSub.Publish(self.cfgData["control"]["command"]["subPrefix"], body) logger.info("Title: {0}, Body: {1}".format(title, body)) else: logger.warn("Invalid message: {0}".format(body)) except ValueError as e: logger.warn("Malformed message: {0}".format(body)) def CallbackNotify(self, client, userdata, msg): try: d = UrlDecode(msg.payload) except ValueError as e: logger.warn("Invalid message: {0}".format(msg.payload)) return try: handlerType = d["type"][0] func = self.notifyHandlers[handlerType] func(d) except KeyError as e: logger.error("Invalid notification type: {0}".format(msg.payload)) return def PushAlert(self, data): body = data["body"][0] try: self.notifier.pushSMS( self.user["iden"], self.devices[self.cfgData["PushBullet"]["alertDevice"]], self.cfgData["PushBullet"]["alertNumber"], body) except Exception as e: logger.warn("PushAlert failed: {0}".format(str(e))) def PushNote(self, data): try: self.notifier.pushNote( self.devices[self.cfgData["PushBullet"]["appDevice"]], "{0} {1}".format(self._GetSignature(), data["title"][0]), data["body"][0]) except Exception as e: logger.warn("PushNote failed: {0}".format(str(e))) def CallbackStopEvent(self, client, userdata, msg): self.stopEventCallbackCount += 1 if self.stopEventCallbackCount > 1: self.Stop()