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)
def test_message_offset_no_nick(): msg = Message( txt="coucou", nickname="", ) example = "10:10:10 " assert msg.compute_offset(True, 10) == len(example)
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]
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
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
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
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
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)
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
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()
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
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, )
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()
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
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()
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]
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)
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)
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)
def msgs_doublejoin(): join = MucOwnJoinMessage('join') msg1 = Message('1', 'd') msg2 = Message('2', 'f') join2 = MucOwnJoinMessage('join') return [join, msg1, msg2, join2]
def msgs_noleave(): join = MucOwnJoinMessage('join') msg3 = Message('3', 'd') msg4 = Message('4', 'f') return [join, msg3, msg4]
def msgs_nojoin(): msg1 = Message('1', 'q') msg2 = Message('2', 's') leave = MucOwnLeaveMessage('leave') return [msg1, msg2, leave]
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)
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)
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)
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)
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)
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)