示例#1
0
def test_message_offset_me():
    msg = Message(
        txt="/me coucou",
        nickname="toto",
    )
    example = "10:10:10 * toto "
    assert msg.compute_offset(True, 10) == len(example)
示例#2
0
def test_message_offset_no_nick():
    msg = Message(
        txt="coucou",
        nickname="",
    )
    example = "10:10:10 "
    assert msg.compute_offset(True, 10) == len(example)
示例#3
0
def test_add_history_empty(buf2048):
    msg1 = Message('1', 'q')
    msg2 = Message('2', 's')
    msg3 = Message('3', 'd')
    msg4 = Message('4', 'f')
    buf2048.add_message(msg1)
    buf2048.add_history_messages([msg2, msg3, msg4])
    assert buf2048.messages == [msg2, msg3, msg4, msg1]
示例#4
0
def test_message_repr_works():
    msg1 = Message(
        txt="coucou",
        nickname="toto",
        revisions=250,
    )
    msg2 = Message(txt="coucou", nickname="toto", old_message=msg1)

    assert repr(msg2) is not None
示例#5
0
def test_get_gap_index(buf2048):
    msg1 = Message('1', 'q')
    msg2 = Message('2', 's')
    leave = MucOwnLeaveMessage('leave')
    join = MucOwnJoinMessage('join')
    msg3 = Message('3', 'd')
    msg4 = Message('4', 'f')
    msgs = [msg1, msg2, leave, join, msg3, msg4]
    for msg in msgs:
        buf2048.add_message(msg)
    gap = buf2048.find_last_gap_muc()
    assert buf2048.get_gap_index(gap) == 3
示例#6
0
def test_create_message():
    now = datetime.now()
    msg = Message(
        txt="coucou",
        nickname="toto",
    )
    assert now < msg.time < datetime.now()

    msg = Message(
        txt="coucou",
        nickname="toto",
        time=now,
    )
    assert msg.time == now
示例#7
0
def test_find_gap(buf2048, msgs_noleave):
    msg1 = Message('1', 'q')
    msg2 = Message('2', 's')
    leave = MucOwnLeaveMessage('leave')
    join = MucOwnJoinMessage('join')
    msg3 = Message('3', 'd')
    msg4 = Message('4', 'f')
    msgs = [msg1, msg2, leave, join, msg3, msg4]
    for msg in msgs:
        buf2048.add_message(msg)
    gap = buf2048.find_last_gap_muc()
    assert gap.leave_message == leave
    assert gap.join_message == join
    assert gap.last_timestamp_before_leave == msg2.time
    assert gap.first_timestamp_after_join == msg3.time
示例#8
0
def test_write_pre_message_nack(buffer, time):
    nack = get_theme().CHAR_NACK
    expected = '10:11:12 %s toto> ' % nack
    msg = Message(txt='coucou', nickname='toto', time=time, ack=-1)
    size = write_pre(msg, buffer, True, 10)
    assert buffer.text == expected
    assert size == len(buffer.text)
示例#9
0
    def modify_message(self,
                       txt: str,
                       orig_id: str,
                       new_id: str,
                       highlight: bool = False,
                       time: Optional[datetime] = None,
                       user: Optional['User'] = None,
                       jid: Optional[str] = None) -> Message:
        """
        Correct a message in a text buffer.

        Version 1.1.0 of Last Message Correction (0308) added clarifications
        that break the way poezio handles corrections. Instead of linking
        corrections to the previous correction/message as we were doing, we
        are now required to link all corrections to the original messages.
        """

        orig_id, i = self._find_message(orig_id)

        if i == -1:
            log.debug(
                'Message %s not found in text_buffer, abort replacement.',
                orig_id)
            raise CorrectionError("nothing to replace")

        msg = self.messages[i]
        if not isinstance(msg, Message):
            raise CorrectionError('Wrong message type')
        if msg.user and msg.user is not user:
            raise CorrectionError("Different users")
        elif msg.delayed:
            raise CorrectionError("Delayed message")
        elif not msg.user and (msg.jid is None or jid is None):
            raise CorrectionError('Could not check the '
                                  'identity of the sender')
        elif not msg.user and msg.jid != jid:
            raise CorrectionError('Messages %s and %s have not been '
                                  'sent by the same fullJID' %
                                  (orig_id, new_id))

        if not time:
            time = msg.time

        self.correction_ids[new_id] = orig_id
        message = Message(txt=txt,
                          time=time,
                          nickname=msg.nickname,
                          nick_color=msg.nick_color,
                          user=msg.user,
                          identifier=orig_id,
                          highlight=highlight,
                          old_message=msg,
                          revisions=msg.revisions + 1,
                          jid=jid)
        self.messages[i] = message
        log.debug('Replacing message %s with %s.', orig_id, new_id)
        return message
示例#10
0
 def add_error(self, error_message):
     theme = get_theme()
     error = '\x19%s}%s\x19o' % (dump_tuple(
         theme.COLOR_CHAR_NACK), error_message)
     self.add_message(
         Message(
             error,
             highlight=True,
             nickname='Error',
             nick_color=theme.COLOR_ERROR_MSG,
         ),
         typ=2,
     )
     self.core.refresh_window()
示例#11
0
def build_message(msg: Message,
                  width: int,
                  timestamp: bool,
                  nick_size: int = 10) -> List[Line]:
    """
    Build a list of lines from this message.
    """
    txt = msg.txt
    if not txt:
        return []
    offset = msg.compute_offset(timestamp, nick_size)
    lines = poopt.cut_text(txt, width - offset - 1)
    generated_lines = generate_lines(lines, msg, default_color='')
    return generated_lines
示例#12
0
def make_line(
        tab: tabs.ChatTab,
        text: str,
        time: datetime,
        jid: JID,
        identifier: str = '',
        deterministic: bool = True,
    ) -> Message:
    """Adds a textual entry in the TextBuffer"""

    # Convert to local timezone
    time = time.replace(tzinfo=timezone.utc).astimezone(tz=None)
    time = time.replace(tzinfo=None)

    if isinstance(tab, tabs.MucTab):
        nick = jid.resource
        user = tab.get_user_by_name(nick)
        if deterministic:
            if user:
                color = user.color
            else:
                theme = get_theme()
                if theme.ccg_palette:
                    fg_color = colors.ccg_text_to_color(theme.ccg_palette, nick)
                    color = fg_color, -1
                else:
                    mod = len(theme.LIST_COLOR_NICKNAMES)
                    nick_pos = int(md5(nick.encode('utf-8')).hexdigest(), 16) % mod
                    color = theme.LIST_COLOR_NICKNAMES[nick_pos]
        else:
            color = random.choice(list(xhtml.colors))
            color = xhtml.colors.get(color)
            color = (color, -1)
    else:
        if jid.bare == tab.core.xmpp.boundjid.bare:
            nick = tab.core.own_nick
            color = get_theme().COLOR_OWN_NICK
        else:
            color = get_theme().COLOR_REMOTE_USER
            nick = tab.get_nick()
    return Message(
        txt=text,
        identifier=identifier,
        time=time,
        nickname=nick,
        nick_color=color,
        history=True,
        user=None,
    )
示例#13
0
 def command_xhtml(self, xhtml_data):
     message = self.generate_xhtml_message(xhtml_data)
     if message:
         message['type'] = 'chat'
         message._add_receipt = True
         message['chat_sate'] = 'active'
         message.send()
         body = xhtml.xhtml_to_poezio_colors(xhtml_data, force=True)
         self._text_buffer.add_message(
             Message(
                 body,
                 nickname=self.core.own_nick,
                 nick_color=get_theme().COLOR_OWN_NICK,
                 identifier=message['id'],
                 jid=self.core.xmpp.boundjid,
             )
         )
         self.refresh()
示例#14
0
def test_find_gap_already_filled(buf2048):
    msg1 = Message('1', 'q')
    msg2 = Message('2', 's')
    leave = MucOwnLeaveMessage('leave')
    msg5 = Message('5', 'g')
    msg6 = Message('6', 'h')
    join = MucOwnJoinMessage('join')
    msg3 = Message('3', 'd')
    msg4 = Message('4', 'f')
    msgs = [msg1, msg2, leave, msg5, msg6, join, msg3, msg4]
    for msg in msgs:
        buf2048.add_message(msg)
    assert buf2048.find_last_gap_muc() is None
示例#15
0
 def embed_image_url(self, url):
     tab = self.api.current_tab()
     message = self.core.xmpp.make_message(tab.jid)
     message['body'] = url
     message['oob']['url'] = url
     message['type'] = 'groupchat'
     if not isinstance(tab, tabs.MucTab):
         message['type'] = 'chat'
         tab.add_message(
             Message(
                 message['body'],
                 nickname=tab.core.own_nick,
                 nick_color=get_theme().COLOR_OWN_NICK,
                 identifier=message['id'],
                 jid=tab.core.xmpp.boundjid,
             ),
             typ=1,
         )
     message.send()
     self.core.refresh_window()
示例#16
0
def test_add_history_messages(buf2048):
    msg1 = Message('1', 'q')
    msg2 = Message('2', 's')
    leave = MucOwnLeaveMessage('leave')
    join = MucOwnJoinMessage('join')
    msg3 = Message('3', 'd')
    msg4 = Message('4', 'f')
    msgs = [msg1, msg2, leave, join, msg3, msg4]
    for msg in msgs:
        buf2048.add_message(msg)
    msg5 = Message('5', 'g')
    msg6 = Message('6', 'h')
    gap = buf2048.find_last_gap_muc()
    buf2048.add_history_messages([msg5, msg6], gap=gap)
    assert buf2048.messages == [msg1, msg2, leave, msg5, msg6, join, msg3, msg4]
示例#17
0
def test_message_offset_simple():
    msg = Message(
        txt="coucou",
        nickname="toto",
    )
    example = "10:10:10 toto> "
    assert msg.compute_offset(True, 10) == len(example)

    msg = Message(
        txt="coucou",
        nickname="toto",
        history=True,
    )
    example = "2019:09:01 10:10:10 toto> "
    assert msg.compute_offset(True, 10) == len(example)
示例#18
0
def test_message_offset_ack():
    msg = Message(
        txt="coucou",
        nickname="toto",
        ack=1,
    )
    example = "10:10:10 V toto> "
    assert msg.compute_offset(True, 10) == len(example)

    msg = Message(
        txt="coucou",
        nickname="toto",
        ack=-1,
    )
    example = "10:10:10 X toto> "
    assert msg.compute_offset(True, 10) == len(example)
示例#19
0
def test_message_offset_revisions():
    msg = Message(
        txt="coucou",
        nickname="toto",
        revisions=3,
    )
    example = "10:10:10 toto3> "
    assert msg.compute_offset(True, 10) == len(example)

    msg = Message(
        txt="coucou",
        nickname="toto",
        revisions=250,
    )
    example = "10:10:10 toto250> "
    assert msg.compute_offset(True, 10) == len(example)
示例#20
0
def msgs_doublejoin():
    join = MucOwnJoinMessage('join')
    msg1 = Message('1', 'd')
    msg2 = Message('2', 'f')
    join2 = MucOwnJoinMessage('join')
    return [join, msg1, msg2, join2]
示例#21
0
def msgs_noleave():
    join = MucOwnJoinMessage('join')
    msg3 = Message('3', 'd')
    msg4 = Message('4', 'f')
    return [join, msg3, msg4]
示例#22
0
def msgs_nojoin():
    msg1 = Message('1', 'q')
    msg2 = Message('2', 's')
    leave = MucOwnLeaveMessage('leave')
    return [msg1, msg2, leave]
示例#23
0
def test_write_pre_message_revisions(buffer, time):
    msg = Message(txt='coucou', nickname='toto', time=time, revisions=5)
    size = write_pre(msg, buffer, True, 10)
    assert buffer.text == '10:11:12 toto5> '
    assert size == len(buffer.text)
示例#24
0
def test_simple_render_message():
    msg = Message(txt='coucou', nickname='toto')
    line = build_lines(msg, 100, True, 10)[0]
    assert (line.start_pos, line.end_pos) == (0, 6)
示例#25
0
def test_write_pre_message_simple_history(buffer, time):
    msg = Message(txt='coucou', nickname='toto', time=time, history=True)
    size = write_pre(msg, buffer, True, 10)
    assert buffer.text == '2019-09-27 10:11:12 toto> '
    assert size == len(buffer.text)
示例#26
0
def test_write_pre_message_highlight(buffer, time):
    msg = Message(txt='coucou', nickname='toto', time=time, highlight=True)
    size = write_pre(msg, buffer, True, 10)
    assert buffer.text == '10:11:12 toto> '
    assert size == len(buffer.text)
示例#27
0
def test_write_pre_message_no_timestamp(buffer):
    msg = Message(txt='coucou', nickname='toto')
    size = write_pre(msg, buffer, False, 10)
    assert buffer.text == 'toto> '
    assert size == len(buffer.text)
示例#28
0
def test_write_pre_message_me(buffer, time):
    msg = Message(txt='/me coucou', nickname='toto', time=time)
    size = write_pre(msg, buffer, True, 10)
    assert buffer.text == '10:11:12 * toto '
    assert size == len(buffer.text)