room.py 4.6 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 26
import common

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

45 46 47 48
    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
49
        self.pos += dist
50

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

    def disconnect(self):
        self.joined = False

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

    def do_highlight(self, txt, time, nickname):
        """
        Set the tab color and returns the txt color
        """
71
        color = None
72
        if not time and nickname != self.own_nick and self.joined and nickname is not None: # do the highlight
73 74 75
            try:
                if self.own_nick.encode('utf-8') in txt:
                    self.set_color_state(13)
76
                    color = 2
77 78 79 80
            except UnicodeDecodeError:
                try:
                    if self.own_nick in txt:
                        self.set_color_state(13)
81
                        color = 2
82 83
                except:
                    pass
84 85 86 87
            else:
                highlight_words = config.get('highlight_on', '').split(':')
                for word in highlight_words:
                    if word.lower() in txt.lower() and word != '':
88
                        self.set_color_state(common.ROOM_STATE_HL)
89
                        color = 2
90
                        break
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
        return color

    def add_message(self, txt, time=None, nickname=None):
        """
        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())
        color = None
        if not time and nickname is not None and\
                nickname != self.own_nick and\
                self.color_state != common.ROOM_STATE_CURRENT:
            if not self.jid:
                self.set_color_state(common.ROOM_STATE_MESSAGE)
            else:
                self.set_color_state(common.ROOM_STATE_PRIVATE)
111 112 113 114
        if not nickname:
            color = 8
        else:
            color = self.do_highlight(txt, time, nickname)
115 116
        if time:                # History messages are colored to be distinguished
            color = 8
117
        time = time if time is not None else datetime.now()
118
        self.messages.append(Message(txt, time, nickname, user, color))
119

120 121 122 123 124 125 126
    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):
127 128 129 130
        """
        Set the color that will be used to display the room's
        number in the RoomInfo window
        """
131
        self.color_state = color