summaryrefslogtreecommitdiff
path: root/src/room.py
blob: 4fd7a79976b7ee1f776c6f30d81d36baf460d64e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# -*- 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 logger import logger
from message import Message

import common
import theme

class Room(object):
    """
    """
    number = 0
    def __init__(self, name, nick, window, jid=None):
        self.jid = jid          # used for a private chat. None if it's a MUC
        self.name = name
        self.own_nick = nick
        self.color_state = theme.COLOR_TAB_NORMAL   # color used in RoomInfo
        self.nb = Room.number        # number used in RoomInfo
        Room.number += 1
        self.joined = False     # false until self presence is received
        self.users = []         # User objects
        self.messages = []         # Message objects
        self.topic = ''
        self.window = window
        self.pos = 0            # offset

    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
        self.pos += dist

    def scroll_down(self, dist=14):
        self.pos -= dist
        if self.pos <= 0:
            self.pos = 0

    def disconnect(self):
        self.joined = False

    def log_message(self, txt, time, nickname):
        """
        Log the messages in the archives, if it needs
        to be
        """
        if time == None and self.joined:        # don't log the history messages
            logger.message(self.name, nickname, txt)

    def do_highlight(self, txt, time, nickname):
        """
        Set the tab color and returns the txt color
        """
        color = theme.COLOR_NORMAL_TEXT
        if not time and nickname and nickname.encode('utf-8') != self.own_nick and self.joined: # do the highlight
            try:
                if self.own_nick in txt.encode('utf-8'):
                    self.set_color_state(theme.COLOR_TAB_HIGHLIGHT)
                    color = theme.COLOR_HIGHLIGHT_TEXT
            except UnicodeDecodeError:
                try:
                    if self.own_nick in txt:
                        self.set_color_state(theme.COLOR_TAB_HIGHLIGHT)
                        color = theme.COLOR_HIGHLIGHT_TEXT
                except:
                    pass
            else:
                highlight_words = config.get('highlight_on', '').split(':')
                for word in highlight_words:
                    if word.lower() in txt.lower() and word != '':
                        self.set_color_state(theme.COLOR_TAB_HIGHLIGHT)
                        color = theme.COLOR_HIGHLIGHT_TEXT
                        break
        return color

    def add_message(self, txt, time=None, nickname=None, colorized=False):
        """
        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 = theme.COLOR_NORMAL_TEXT
        if not time and nickname and\
                nickname != self.own_nick and\
                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)
            elif self.jid:
                self.set_color_state(theme.COLOR_TAB_PRIVATE)
        if not nickname:
            color = theme.COLOR_INFORMATION_TEXT
        else:
            color = self.do_highlight(txt, time, nickname)
        if time:                # History messages are colored to be distinguished
            color = theme.COLOR_INFORMATION_TEXT
        time = time if time is not None else datetime.now()
        self.messages.append(Message(txt, time, nickname, user, color, colorized))

    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)

    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):
        """
        Set the color that will be used to display the room's
        number in the RoomInfo window
        """
        self.color_state = color