From 4d592fff17a3fd161f18923cf832e49f2ec8631c Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Mon, 22 Oct 2018 09:36:30 +0000 Subject: [PATCH] Support for multiple devices in AutoRemote plugin --- platypush/plugins/autoremote.py | 192 ++++++++++++++++++++------------ 1 file changed, 121 insertions(+), 71 deletions(-) diff --git a/platypush/plugins/autoremote.py b/platypush/plugins/autoremote.py index e2bd3138d..0d8742d18 100644 --- a/platypush/plugins/autoremote.py +++ b/platypush/plugins/autoremote.py @@ -18,33 +18,53 @@ class AutoremotePlugin(Plugin): _AUTOREMOTE_MESSAGE_URL = _AUTOREMOTE_BASE_URL + '/sendmessage' _AUTOREMOTE_NOTIFICATION_URL = _AUTOREMOTE_BASE_URL + '/sendnotification' - def __init__(self, key, password=None, *args, **kwargs): + def __init__(self, devices=None, key=None, password=None, *args, **kwargs): """ - :param key: The key associated to your device. Open the link in your AutoRemote app and copy the key in the target URL + :param devices: Set this attribute if you want to control multiple AutoRemote devices. This will be a map in the format: + + { + 'device_name': { + 'key': 'AUTOREMOTE_KEY', + 'password': 'DEVICE_PASSWORD' + }, + ... + } + + :type devices: dict + + :param key: The key associated to your device. Open the link in your AutoRemote app and copy the key in the target URL. Set this value if you want to communicate with only one AutoRemote device. :type key: str - :param password: AutoRemote password configured on the device (default: None) + :param password: AutoRemote password configured on the device (default: None). Set this value if you want to communicate with only one AutoRemote device. :type password: str """ super().__init__(*args, **kwargs) - self.key = key - self.password = password + + if key: + self.devices = { key: { 'key': key, 'password': password } } + elif devices: + self.devices = devices + else: + raise RuntimeError('Either or devices attributes should be set') @action - def send_message(self, msg, key=None, password=None, target=None, + def send_message(self, msg, key=None, password=None, devices=None, target=None, sender=None, ttl=None, group=None, *args, **kwargs): """ Sends a message to AutoRemote. :param msg: Message to send - :param key: Set it if you want to override the default key (default: None) + :param key: Set it if you want to override the default devices (default: None, message sent to all the configured devices) :type key: str :param password: Set it if you want to override the default password (default: None) :type password: str + :param devices: Set it if you want to send the message to a specific list of configured devices (default: None, message sent to all the configured devices) + :type devices: list + :param target: Message target (default: None) :type target: str @@ -58,27 +78,42 @@ class AutoremotePlugin(Plugin): :type group: str """ - args = { - 'message': msg, - 'key': key or self.key, - 'sender': sender or Config.get('device_id'), - } + target_devices = [] - if password or self.password: - args['password'] = password or self.password + if devices: + target_devices = [self.devices[name] for name in self.devices.keys() + if name in devices] + elif key: + device = { 'key': key } + if password: + device['password'] = password - if target: args['target'] = target - if ttl: args['ttl'] = ttl - if group: args['collapseKey'] = group + target_devices = [device] + else: + target_devices = self.devices.values() - response = requests.post(self._AUTOREMOTE_MESSAGE_URL, data=args) - self.logger.info('Received response from AutoRemote: {}'.format(response.text)) + for device in target_devices: + args = { + 'message': msg, + 'key': device['key'], + 'sender': sender or Config.get('device_id'), + } + + if device.get('password'): + args['password'] = device['password'] + + if target: args['target'] = target + if ttl: args['ttl'] = ttl + if group: args['collapseKey'] = group + + response = requests.post(self._AUTOREMOTE_MESSAGE_URL, data=args) + self.logger.info('Received response from AutoRemote: {}'.format(response.text)) @action - def send_notification(self, text=None, key=None, password=None, title=None, - target=None, sender=None, ttl=None, group=None, - sound=None, vibration=None, url=None, id=None, - action=None, icon=None, led=None, ledon=None, + def send_notification(self, text=None, key=None, password=None, devices=None, + title=None, target=None, sender=None, ttl=None, + group=None, sound=None, vibration=None, url=None, + id=None, action=None, icon=None, led=None, ledon=None, ledoff=None, picture=None, share=False, msg=None, action1=None, action1_name=None, action1_icon=None, action2=None, action2_name=None, action2_icon=None, @@ -93,57 +128,72 @@ class AutoremotePlugin(Plugin): Send Notification for a detailed explanation of the attributes. """ - args = { - 'text': text, - 'key': key or self.key, - 'sender': sender or Config.get('device_id'), - } + target_devices = [] - if password or self.password: - args['password'] = password or self.password + if devices: + target_devices = [self.devices[name] for name in self.devices.keys() + if name in devices] + elif key: + device = { 'key': key } + if password: + device['password'] = password - if target: args['target'] = target - if ttl: args['ttl'] = ttl - if group: args['collapseKey'] = group - if title: args['title'] = title - if text: args['text'] = text - if sound: args['sound'] = sound - if vibration: args['vibration'] = vibration - if url: args['url'] = url - if id: args['id'] = id - if action: args['action'] = action - if icon: args['icon'] = icon - if led: args['led'] = led - if ledon: args['ledon'] = ledon - if ledoff: args['ledoff'] = ledoff - if picture: args['picture'] = picture - if msg: args['message'] = msg - if share: args['share'] = share - if action1: args['action1'] = action1 - if action1_name: args['action1name'] = action1_name - if action1_icon: args['action1icon'] = action1_icon - if action2: args['action2'] = action2 - if action2_name: args['action2name'] = action2_name - if action2_icon: args['action2icon'] = action2_icon - if action3: args['action3'] = action3 - if action3_name: args['action3name'] = action3_name - if action3_icon: args['action3icon'] = action3_icon - if persistent: args['persistent'] = persistent - if statusbar_icon: args['statusbaricon'] = statusbar_icon - if ticker: args['ticker'] = ticker - if dismiss_on_touch: args['dismissontouch'] = dismiss_on_touch - if priority: args['priority'] = priority - if number: args['number'] = number - if content_info: args['contentinfo'] = content_info - if subtext: args['subtext'] = subtext - if max_progress: args['maxprogress'] = max_progress - if progress: args['progress'] = progress - if indeterminate_progress: args['indeterminateprogress'] = indeterminate_progress - if action_on_dismiss: args['actionondismiss'] = action_on_dismiss - if cancel: args['cancel'] = cancel + target_devices = [device] + else: + target_devices = self.devices.values() - response = requests.post(self._AUTOREMOTE_NOTIFICATION_URL, data=args) - self.logger.info('Received response from AutoRemote: {}'.format(response.text)) + for device in target_devices: + args = { + 'text': text, + 'key': device.get('key'), + 'sender': sender or Config.get('device_id'), + } + + if device.get('password'): + args['password'] = device['password'] + + if target: args['target'] = target + if ttl: args['ttl'] = ttl + if group: args['collapseKey'] = group + if title: args['title'] = title + if text: args['text'] = text + if sound: args['sound'] = sound + if vibration: args['vibration'] = vibration + if url: args['url'] = url + if id: args['id'] = id + if action: args['action'] = action + if icon: args['icon'] = icon + if led: args['led'] = led + if ledon: args['ledon'] = ledon + if ledoff: args['ledoff'] = ledoff + if picture: args['picture'] = picture + if msg: args['message'] = msg + if share: args['share'] = share + if action1: args['action1'] = action1 + if action1_name: args['action1name'] = action1_name + if action1_icon: args['action1icon'] = action1_icon + if action2: args['action2'] = action2 + if action2_name: args['action2name'] = action2_name + if action2_icon: args['action2icon'] = action2_icon + if action3: args['action3'] = action3 + if action3_name: args['action3name'] = action3_name + if action3_icon: args['action3icon'] = action3_icon + if persistent: args['persistent'] = persistent + if statusbar_icon: args['statusbaricon'] = statusbar_icon + if ticker: args['ticker'] = ticker + if dismiss_on_touch: args['dismissontouch'] = dismiss_on_touch + if priority: args['priority'] = priority + if number: args['number'] = number + if content_info: args['contentinfo'] = content_info + if subtext: args['subtext'] = subtext + if max_progress: args['maxprogress'] = max_progress + if progress: args['progress'] = progress + if indeterminate_progress: args['indeterminateprogress'] = indeterminate_progress + if action_on_dismiss: args['actionondismiss'] = action_on_dismiss + if cancel: args['cancel'] = cancel + + response = requests.post(self._AUTOREMOTE_NOTIFICATION_URL, data=args) + self.logger.info('Received response from AutoRemote: {}'.format(response.text)) # vim:sw=4:ts=4:et: