room.py 5.25 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
# -*- coding:utf-8 -*-
#
# Copyright 2010 Le Coz Florent <louizatakk@fedoraproject.org>
#
# This file is part of Poezio.
#
# Poezio is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 3 of the License.
#
# Poezio is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Poezio.  If not, see <http://www.gnu.org/licenses/>.

from datetime import datetime
from random import randrange
from config import config
from logging import logger
23
from message import Message
24

25
import common
26
import theme
27

28 29 30
class Room(object):
    """
    """
31
    number = 0
32 33
    def __init__(self, name, nick, window, jid=None):
        self.jid = jid          # used for a private chat. None if it's a MUC
34 35
        self.name = name
        self.own_nick = nick
36
        self.color_state = theme.COLOR_TAB_NORMAL   # color used in RoomInfo
37 38
        self.nb = Room.number        # number used in RoomInfo
        Room.number += 1
39
        self.joined = False     # false until self presence is received
40 41
        self.users = []         # User objects
        self.messages = []         # Message objects
42
        self.topic = ''
43 44 45
        self.window = window
        self.pos = 0            # offset

46 47 48 49
    def scroll_up(self, dist=14):
        # The pos can grow a lot over the top of the number of
        # available lines, it will be fixed on the next refresh of the
        # screen anyway
50
        self.pos += dist
51

52 53
    def scroll_down(self, dist=14):
        self.pos -= dist
54 55
        if self.pos <= 0:
            self.pos = 0
56 57 58 59

    def disconnect(self):
        self.joined = False

60
    def log_message(self, txt, time, nickname):
61
        """
62 63
        Log the messages in the archives, if it needs
        to be
64
        """
65 66
        if time == None and self.joined:        # don't log the history messages
            logger.message(self.name, nickname, txt)
67 68 69 70 71

    def do_highlight(self, txt, time, nickname):
        """
        Set the tab color and returns the txt color
        """
72
        color = theme.COLOR_NORMAL_TEXT
73
        if not time and nickname and nickname.encode('utf-8') != self.own_nick and self.joined: # do the highlight
74
            try:
75
                if self.own_nick in txt.encode('utf-8'):
76 77
                    self.set_color_state(theme.COLOR_TAB_HIGHLIGHT)
                    color = theme.COLOR_HIGHLIGHT_TEXT
78 79 80
            except UnicodeDecodeError:
                try:
                    if self.own_nick in txt:
81 82
                        self.set_color_state(theme.COLOR_TAB_HIGHLIGHT)
                        color = theme.COLOR_HIGHLIGHT_TEXT
83 84
                except:
                    pass
85 86 87 88
            else:
                highlight_words = config.get('highlight_on', '').split(':')
                for word in highlight_words:
                    if word.lower() in txt.lower() and word != '':
89 90
                        self.set_color_state(theme.COLOR_TAB_HIGHLIGHT)
                        color = theme.COLOR_HIGHLIGHT_TEXT
91
                        break
92 93
        return color

94
    def add_message(self, txt, time=None, nickname=None, colorized=False):
95 96 97 98 99 100 101 102 103
        """
        Note that user can be None even if nickname is not None. It happens
        when we receive an history message said by someone who is not
        in the room anymore
        """
        self.log_message(txt, time, nickname)
        user = self.get_user_by_name(nickname) if nickname is not None else None
        if user:
            user.set_last_talked(datetime.now())
104
        color = theme.COLOR_NORMAL_TEXT
105
        if not time and nickname and\
106
                nickname != self.own_nick and\
107 108 109
                self.color_state != theme.COLOR_TAB_CURRENT:
            if not self.jid and self.color_state != theme.COLOR_TAB_HIGHLIGHT:
                self.set_color_state(theme.COLOR_TAB_NEW_MESSAGE)
110
            elif self.jid:
111
                self.set_color_state(theme.COLOR_TAB_PRIVATE)
112
        if not nickname:
113
            color = theme.COLOR_INFORMATION_TEXT
114 115
        else:
            color = self.do_highlight(txt, time, nickname)
116
        if time:                # History messages are colored to be distinguished
117
            color = theme.COLOR_INFORMATION_TEXT
118
        time = time if time is not None else datetime.now()
119
        self.messages.append(Message(txt, time, nickname, user, color, colorized))
120

121 122 123 124 125 126 127 128 129 130 131 132 133 134
    def remove_line_separator(self):
        """
        Remove the line separator
        """
        if None in self.messages:
            self.messages.remove(None)

    def add_line_separator(self):
        """
        add a line separator at the end of messages list
        """
        if None not in self.messages:
            self.messages.append(None)

135 136 137 138 139 140 141
    def get_user_by_name(self, nick):
        for user in self.users:
            if user.nick == nick.encode('utf-8'):
                return user
        return None

    def set_color_state(self, color):
142 143 144 145
        """
        Set the color that will be used to display the room's
        number in the RoomInfo window
        """
146
        self.color_state = color