Exemplo n.º 1
0
    def get_messages(self, *,
                     num_after: int, num_before: int,
                     anchor: Optional[int]) -> str:
        # anchor value may be specific message (int) or next unread (None)
        first_anchor = anchor is None
        anchor_value = anchor if anchor is not None else 0

        request = {
            'anchor': anchor_value,
            'num_before': num_before,
            'num_after': num_after,
            'apply_markdown': True,
            'use_first_unread_anchor': first_anchor,
            'client_gravatar': True,
            'narrow': json.dumps(self.narrow),
        }
        response = self.client.get_messages(message_filters=request)
        if response['result'] == 'success':
            self.index = index_messages(response['messages'], self, self.index)
            narrow_str = repr(self.narrow)
            if first_anchor and response['anchor'] != 10000000000000000:
                self.index['pointer'][narrow_str] = response['anchor']
            if 'found_newest' in response:
                self._have_last_message[narrow_str] = response['found_newest']
            else:
                # Older versions of the server does not contain the
                # 'found_newest' flag. Instead, we use this logic:
                query_range = num_after + num_before + 1
                self._have_last_message[narrow_str] = (
                    len(response['messages']) < query_range)
            return ""
        display_error_if_present(response, self.controller)
        return response['msg']
Exemplo n.º 2
0
 def toggle_message_star_status(self, message: Message) -> None:
     base_request = dict(flag='starred', messages=[message['id']])
     if 'starred' in message['flags']:
         request = dict(base_request, op='remove')
     else:
         request = dict(base_request, op='add')
     response = self.client.update_message_flags(request)
     display_error_if_present(response, self.controller)
Exemplo n.º 3
0
 def fetch_custom_emojis(self) -> NamedEmojiData:
     response = self.client.get_realm_emoji()
     custom_emojis = {emoji['name']: {'code': emoji_code,
                                      'type': 'realm_emoji'}
                      for emoji_code, emoji in response['emoji'].items()
                      if not emoji['deactivated']}  # type: NamedEmojiData
     display_error_if_present(response, self.controller)
     return custom_emojis
Exemplo n.º 4
0
 def update_private_message(self, msg_id: int, content: str) -> bool:
     request = {
         "message_id": msg_id,
         "content": content,
     }
     response = self.client.update_message(request)
     display_error_if_present(response, self.controller)
     return response['result'] == 'success'
Exemplo n.º 5
0
 def toggle_stream_muted_status(self, stream_id: int) -> None:
     request = [{
         'stream_id': stream_id,
         'property': 'is_muted',
         'value': not self.is_muted_stream(stream_id)
         # True for muting and False for unmuting.
     }]
     response = self.client.update_subscription_settings(request)
     display_error_if_present(response, self.controller)
Exemplo n.º 6
0
 def mark_message_ids_as_read(self, id_list: List[int]) -> None:
     if not id_list:
         return
     response = self.client.update_message_flags({
         'messages': id_list,
         'flag': 'read',
         'op': 'add',
     })
     display_error_if_present(response, self.controller)
Exemplo n.º 7
0
 def send_private_message(self, recipients: str, content: str) -> bool:
     request = {
         'type': 'private',
         'to': recipients,
         'content': content,
     }
     response = self.client.send_message(request)
     display_error_if_present(response, self.controller)
     return response['result'] == 'success'
Exemplo n.º 8
0
def test_display_error_if_present(mocker, response, footer_updated):
    controller = mocker.Mock()
    set_footer_text = controller.view.set_footer_text

    display_error_if_present(response, controller)

    if footer_updated:
        set_footer_text.assert_called_once_with(response['msg'], 3)
    else:
        set_footer_text.assert_not_called()
Exemplo n.º 9
0
 def fetch_message_history(self, message_id: int,
                           ) -> List[Dict[str, Union[int, str]]]:
     """
     Fetches message edit history for a message using its ID.
     """
     response = self.client.get_message_history(message_id)
     if response['result'] == 'success':
         return response['message_history']
     display_error_if_present(response, self.controller)
     return list()
Exemplo n.º 10
0
 def send_stream_message(self, stream: str, topic: str,
                         content: str) -> bool:
     request = {
         'type': 'stream',
         'to': stream,
         'subject': topic,
         'content': content,
     }
     response = self.client.send_message(request)
     display_error_if_present(response, self.controller)
     return response['result'] == 'success'
Exemplo n.º 11
0
def test_display_error_if_present(
    mocker: MockerFixture, response: Dict[str, str], footer_updated: bool
) -> None:
    controller = mocker.Mock()
    report_error = controller.report_error

    display_error_if_present(response, controller)

    if footer_updated:
        report_error.assert_called_once_with(response["msg"])
    else:
        report_error.assert_not_called()
Exemplo n.º 12
0
 def update_stream_message(self, topic: str, msg_id: int,
                           content: str) -> bool:
     request = {
         "message_id": msg_id,
         "content": content,
         # TODO: Add support for "change_later" & "change_all"
         "propagate_mode": "change_one",
         "subject": topic,
     }
     response = self.client.update_message(request)
     display_error_if_present(response, self.controller)
     return response['result'] == 'success'
Exemplo n.º 13
0
    def update_stream_message(self, topic: str, message_id: int,
                              propagate_mode: EditPropagateMode,
                              content: Optional[str]=None) -> bool:
        request = {
            "message_id": message_id,
            "propagate_mode": propagate_mode,
            "topic": topic,
        }
        if content is not None:
            request['content'] = content

        response = self.client.update_message(request)
        display_error_if_present(response, self.controller)
        return response['result'] == 'success'
Exemplo n.º 14
0
 def _fetch_topics_in_streams(self, stream_list: Iterable[int]) -> str:
     """
     Fetch all topics with specified stream_id's and
     index their names (Version 1)
     """
     # FIXME: Version 2: Fetch last 'n' recent topics for each stream.
     for stream_id in stream_list:
         response = self.client.get_stream_topics(stream_id)
         if response['result'] == 'success':
             self.index['topics'][stream_id] = [topic['name'] for
                                                topic in response['topics']]
         else:
             display_error_if_present(response, self.controller)
             return response['msg']
     return ""
Exemplo n.º 15
0
    def react_to_message(self, message: Message,
                         reaction_to_toggle: str) -> None:
        # FIXME Only support thumbs_up for now
        assert reaction_to_toggle == 'thumbs_up'

        reaction_to_toggle_spec = dict(emoji_name='thumbs_up',
                                       emoji_code='1f44d',
                                       reaction_type='unicode_emoji',
                                       message_id=str(message['id']))
        existing_reactions = [
            reaction['emoji_code'] for reaction in message['reactions']
            if (reaction['user'].get('user_id', None) == self.user_id
                or reaction['user'].get('id', None) == self.user_id)
        ]
        if reaction_to_toggle_spec['emoji_code'] in existing_reactions:
            response = self.client.remove_reaction(reaction_to_toggle_spec)
        else:
            response = self.client.add_reaction(reaction_to_toggle_spec)
        display_error_if_present(response, self.controller)