diff --git a/apprise/plugins/NotifyMatrix.py b/apprise/plugins/NotifyMatrix.py index 96301c53..b2103d99 100644 --- a/apprise/plugins/NotifyMatrix.py +++ b/apprise/plugins/NotifyMatrix.py @@ -67,6 +67,21 @@ IS_ROOM_ID = re.compile( r'(?P[a-z0-9.-]+))?\s*$', re.I) +class MatrixMessageType(object): + """ + The Matrix Message types + """ + TEXT = "text" + NOTICE = "notice" + + +# matrix message types are placed into this list for validation purposes +MATRIX_MESSAGE_TYPES = ( + MatrixMessageType.TEXT, + MatrixMessageType.NOTICE, +) + + class MatrixWebhookMode(object): # Webhook Mode is disabled DISABLED = "off" @@ -81,7 +96,7 @@ class MatrixWebhookMode(object): T2BOT = "t2bot" -# webhook modes are placed ito this list for validation purposes +# webhook modes are placed into this list for validation purposes MATRIX_WEBHOOK_MODES = ( MatrixWebhookMode.DISABLED, MatrixWebhookMode.MATRIX, @@ -206,6 +221,12 @@ class NotifyMatrix(NotifyBase): 'values': MATRIX_WEBHOOK_MODES, 'default': MatrixWebhookMode.DISABLED, }, + 'msgtype': { + 'name': _('Message Type'), + 'type': 'choice:string', + 'values': MATRIX_MESSAGE_TYPES, + 'default': MatrixMessageType.TEXT, + }, 'to': { 'alias_of': 'targets', }, @@ -214,7 +235,8 @@ class NotifyMatrix(NotifyBase): }, }) - def __init__(self, targets=None, mode=None, include_image=False, **kwargs): + def __init__(self, targets=None, mode=None, msgtype=None, + include_image=False, **kwargs): """ Initialize Matrix Object """ @@ -240,13 +262,21 @@ class NotifyMatrix(NotifyBase): self._room_cache = {} # Setup our mode - self.mode = MatrixWebhookMode.DISABLED \ + self.mode = self.template_args['mode']['default'] \ if not isinstance(mode, six.string_types) else mode.lower() if self.mode and self.mode not in MATRIX_WEBHOOK_MODES: msg = 'The mode specified ({}) is invalid.'.format(mode) self.logger.warning(msg) raise TypeError(msg) + # Setup our message type + self.msgtype = self.template_args['msgtype']['default'] \ + if not isinstance(msgtype, six.string_types) else msgtype.lower() + if self.msgtype and self.msgtype not in MATRIX_MESSAGE_TYPES: + msg = 'The msgtype specified ({}) is invalid.'.format(msgtype) + self.logger.warning(msg) + raise TypeError(msg) + if self.mode == MatrixWebhookMode.T2BOT: # t2bot configuration requires that a webhook id is specified self.access_token = validate_regex( @@ -534,7 +564,7 @@ class NotifyMatrix(NotifyBase): # Define our payload payload = { - 'msgtype': 'm.text', + 'msgtype': 'm.{}'.format(self.msgtype), 'body': '{title}{body}'.format( title='' if not title else '{}\r\n'.format(title), body=body), @@ -1109,6 +1139,7 @@ class NotifyMatrix(NotifyBase): params = { 'image': 'yes' if self.include_image else 'no', 'mode': self.mode, + 'msgtype': self.msgtype, } # Extend our parameters @@ -1189,6 +1220,11 @@ class NotifyMatrix(NotifyBase): # unquote our hostname and pass it in as the password/token results['password'] = NotifyMatrix.unquote(results['host']) + # Support the message type keyword + if 'msgtype' in results['qsd'] and len(results['qsd']['msgtype']): + results['msgtype'] = \ + NotifyMatrix.unquote(results['qsd']['msgtype']) + # Support the use of the token= keyword if 'token' in results['qsd'] and len(results['qsd']['token']): results['password'] = NotifyMatrix.unquote(results['qsd']['token']) diff --git a/test/test_matrix_plugin.py b/test/test_matrix_plugin.py index eadef1d7..88e444cd 100644 --- a/test/test_matrix_plugin.py +++ b/test/test_matrix_plugin.py @@ -26,6 +26,7 @@ import six import mock import requests +import pytest from apprise import plugins from apprise import AppriseAsset from json import dumps @@ -110,6 +111,21 @@ def test_notify_matrix_plugin_general(mock_post, mock_get): obj.send(body="test") is True obj.send(title="title", body="test") is True + # Test notice type notifications + kwargs = plugins.NotifyMatrix.parse_url( + 'matrix://user:passwd@hostname/#abcd?msgtype=notice') + obj = plugins.NotifyMatrix(**kwargs) + assert isinstance(obj.url(), six.string_types) is True + assert isinstance(obj, plugins.NotifyMatrix) is True + obj.send(body="test") is True + obj.send(title="title", body="test") is True + + with pytest.raises(TypeError): + # invalid message type specified + kwargs = plugins.NotifyMatrix.parse_url( + 'matrix://user:passwd@hostname/#abcd?msgtype=invalid') + obj = plugins.NotifyMatrix(**kwargs) + # Force a failed login ro = response_obj.copy() del ro['access_token']