# friend.py -- Group, Friend, FriendList classes
#
# Copyright (C) 2003 Manish Jethani (manish_jethani AT yahoo.com)
#
# 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

from protocol import States, Lists, PrivacyModes
from time import time

class Group:
    """A group in the friend list"""
    def __init__(self, id, name, friends = None):
        self.id = id
        self.name = name
        if friends == None:
            friends = {}
        self.friends = friends

    def size(self):
        """Return number of friends in this group"""
        return len(self.friends)

    def get_id(self):
        """Return ID of this group"""
        return self.id

    def get_name(self):
        """Return name of this group"""
        return self.name

    def get_friend(self, passport_id):
        """Return friend in this group

        Keyword arguments:
            passport_id -- string representing friend's passport ID
        """
        if self.friends.has_key(passport_id):
            return self.friends[passport_id]
        else:
            return None

    def get_friends(self):
        """Return all friends in this group"""
        return self.friends.values()

    def get_online_friends(self):
        """Return all online friends in this group"""
        return filter(lambda f: f.state != States.OFFLINE, self.friends)

class Friend:
    """A friend in the friend list"""
    def __init__(self, passport_id, display_name,
        state = States.OFFLINE, groups = None):

        self.passport_id = passport_id
        self.display_name = display_name
        self.state = state
        self.groups = {}

        if groups == None:
            groups = ()
        for g in groups:
            self.add_to_group(g)

    def get_passport_id(self):
        """Return friend's passport ID"""
        return self.passport_id

    def get_display_name(self):
        """Return friend's display name"""
        return self.display_name

    def get_state(self):
        """Return friend's presence state"""
        return self.state

    def get_groups(self):
        """Return msnp.Group instances representing friend's groups"""
        return self.groups.values()

    def add_to_group(self, group):
        """Add friend to given group"""
        group.friends[self.passport_id] = self
        self.groups[group.id] = group

    def remove_from_group(self, group):
        """Remove friend from given group"""
        del group.friends[self.passport_id]
        del self.groups[group.id]

class FriendList:
    """Friend list
    
    Includes groups, all types of lists (forward, reverse, allow, block), and
    some other book-keeping information.  msnp.Session.friend_list is an
    instance of this class.
    """
    def __init__(self):
        self.ver = 0
        self.groups = {}
        self.lists = {
            Lists.FORWARD: {},
            Lists.REVERSE: {},
            Lists.ALLOW: {},
            Lists.BLOCK: {},
        }
        self.privacy_mode = PrivacyModes.BLOCK
        self.notify_on_add_ = True
        self.dirty = True
        self.updated = time()
        self.temp_iln = {}

    def is_dirty(self):
        """If this list is dirty (needs update from server)"""
        return self.dirty

    def get_group(self, id):
        """Return msnp.Group instance corresponding to the given group ID"""
        if self.groups.has_key(id):
            return self.groups[id]
        else:
            return None

    def get_groups(self):
        """Return all groups in this list"""
        return self.groups.values()

    def get_friend(self, passport_id, list_ = Lists.FORWARD):
        """Return msnp.Friend instance for given passport ID and list type"""
        if self.lists[list_].has_key(passport_id):
            return self.lists[list_][passport_id]
        else:
            return None

    def get_friends(self, list_ = Lists.FORWARD):
        """Return all friends from given list type"""
        return self.lists[list_].values()

    def size(list_):
        """Return size (no. of members) of given list"""
        return len(self.lists[list_])

    def get_online_friends(self):
        """Return all online friends from forward list"""
        return filter(lambda f: f.state != States.OFFLINE,
            self.lists[Lists.FORWARD])

    def get_privacy_mode(self):
        """Return privacy mode (see msnp.PrivacyModes)"""
        return self.privacy_mode

    def notify_on_add(self):
        """Whether or not to be notified on being added to someone's list"""
        return self.notify_on_add_

    def last_updated(self):
        """Last updated timestamp, in seconds since the epoch"""
        return self.updated

# vim: set ts=4 sw=4 et tw=79 :

