view frontends/src/quick_frontend/quick_chat.py @ 297:c5554e2939dd

plugin XEP 0277: author for in request + author, updated management for out request - a workaround is now used to parse "nick" tag (Jappix behaviour) - author and updated can now be used in data when sendind microblog. Is no author is given, user jid is used, if no updated is given, current timestamp is used
author Goffi <goffi@goffi.org>
date Fri, 18 Feb 2011 22:32:02 +0100
parents b1794cbb88e5
children ede26abf6ca1
line wrap: on
line source

#!/usr/bin/python
# -*- coding: utf-8 -*-

"""
helper class for making a SAT frontend
Copyright (C) 2009, 2010, 2011  Jérôme Poisson (goffi@goffi.org)

This program 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, either version 3 of the License, or
(at your option) any later version.

This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
"""

from logging import debug, info, warning, error
from sat.tools.jid  import JID



class QuickChat():
    
    def __init__(self, target, host, type='one2one'):
        self.target = target
        self.host = host
        self.type = type
        self.id = ""
        self.nick = None
        self.occupants = set()

    def setType(self, type):
        """Set the type of the chat
        @param type: can be 'one2one' for single conversation or 'group' for chat à la IRC
        """
        self.type = type

    def setPresents(self, nicks):
        """Set the users presents in the contact list for a group chat
        @param nicks: list of nicknames
        """
        debug (_("Adding users %s to room") % nicks)
        if self.type != "group":
            error (_("[INTERNAL] trying to set presents nicks for a non group chat window"))
            raise Exception("INTERNAL ERROR") #TODO: raise proper Exception here
        self.occupants.update(nicks)
    
    def replaceUser(self, nick):
        """Add user if it is not in the group list"""
        debug (_("Replacing user %s") % nick)
        if self.type != "group":
            error (_("[INTERNAL] trying to replace user for a non group chat window"))
            raise Exception("INTERNAL ERROR") #TODO: raise proper Exception here
        len_before = len(self.occupants)
        self.occupants.add(nick)
        if len_before != len(self.occupants):
            self.printInfo("=> %s has joined the room" % nick)
    
    def setUserNick(self, nick):
        """Set the nick of the user, usefull for e.g. change the color of the user"""
        self.nick = nick

    def removeUser(self, nick):
        """Remove a user from the group list"""
        debug(_("Removing user %s") % nick)
        if self.type != "group":
            error (_("[INTERNAL] trying to remove user for a non group chat window"))
            raise Exception("INTERNAL ERROR") #TODO: raise proper Exception here
        self.occupants.remove(nick)
        self.printInfo("<= %s has left the room" % nick)

    def setSubject(self, subject):
        """Set title for a group chat"""
        debug(_("Setting subject to %s") % subject)
        if self.type != "group":
            error (_("[INTERNAL] trying to set subject for a non group chat window"))
            raise Exception("INTERNAL ERROR") #TODO: raise proper Exception here

    def historyPrint(self, size=20, keep_last=False, profile='@NONE@'):
        """Print the initial history"""
        debug (_("now we print history"))
        history=self.host.bridge.getHistory(self.host.profiles[profile]['whoami'].short, self.target, 20)
        stamps=history.keys()
        stamps.sort()
        for stamp in stamps: 
            self.printMessage(JID(history[stamp][0]), history[stamp][1], profile, stamp)
        if keep_last:  ##FIXME hack for sortilege
            self.last_history = stamps[-1] if stamps else None

    def _get_nick(self, jid):
        """Return nick of this jid when possible"""
        return jid.resource if self.type == "group" else (self.host.CM.getAttr(jid,'nick') or self.host.CM.getAttr(jid,'name') or jid.node)
    
    def printMessage(self, from_jid, msg, profile, timestamp):
        """Print message in chat window. Must be implemented by child class"""
        jid=JID(from_jid)
        nick = self._get_nick(jid) 
        mymess = (jid.resource == self.nick) if self.type == "group" else (jid.short == self.host.profiles[profile]['whoami'].short) #mymess = True if message comes from local user
        if msg.startswith('/me '):
            self.printInfo('* %s %s' % (nick, msg[4:]),type='me')
            return
        return jid, nick, mymess

    def printInfo(self, msg, type='normal'):
        """Print general info
        @param msg: message to print
        @type: one of:
            normal: general info like "toto has joined the room"
            me: "/me" information like "/me clenches his fist" ==> "toto clenches his fist"
        """
        raise NotImplementedError

    
    def startGame(self, game_type, referee, players):
        """Configure the chat window to start a game"""
        #No need to raise an error as game are not mandatory
        warning(_('startGame is not implemented in this frontend'))
    
    def getGame(self, game_type):
        """Return class managing the game type"""
        #No need to raise an error as game are not mandatory
        warning(_('getGame is not implemented in this frontend'))