// Ryzom - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
#ifndef EC_CHANNEL_H
#define EC_CHANNEL_H
//-----------------------------------------------------------------------------
// includes
//-----------------------------------------------------------------------------
#include "gus_chat.h"
#include "ec_types.h"
//-----------------------------------------------------------------------------
// EC namespace
//-----------------------------------------------------------------------------
namespace EC
{
//-----------------------------------------------------------------------------
// Public typedefs
//-----------------------------------------------------------------------------
// a user id - this is a character name or account number stored as a string
typedef NLMISC::CSString TCharacterId;
// standard ranks for users in a chat channel
// - NO_RANK is used when a user is not present in any of the chat channel user groups
enum TChannelRank { NO_RANK, MEMBER, OFFICER, ARCH };
//-----------------------------------------------------------------------------
// class CUserGroup
//-----------------------------------------------------------------------------
class CUserGroup
{
public:
//-----------------------------------------------------------------------------
// public interface
// constructor requires a channel ptr as an argument as group belongs to a channel
CUserGroup(IChannel* parent);
// process a command to add, remove or display users
NLMISC::CSString processCommand(const NLMISC::CSString& command);
// test whether a given client id is listed in this user group
bool contains(const TCharacterId& id) const;
private:
//-----------------------------------------------------------------------------
// private data
IChannel* _Parent;
typedef std::vector TCharacterIds;
TCharacterIds _CharacterIds;
};
//-----------------------------------------------------------------------------
// class IChannel
//-----------------------------------------------------------------------------
class IChannel: private GUS::IChatCallback, public NLMISC::CRefCount
{
public:
//-----------------------------------------------------------------------------
// virtual interface exposed to derived classes
// virtual dtor
virtual ~IChannel();
// Callback called whenever a user who belongs to one of the channel's user groups logs in
// - also called if the user is already online when they are added to the user group
// - this callback is NOT called if the user rank is NO_RANK
virtual void cbAddUser(TChannelRank rank,const TCharacterId& id,GUS::TClientId clientId) =0;
// Callback called whenever a user is removed from the channel's user groups
virtual void cbRemoveUser(TChannelRank rank,const TCharacterId& idclientId,GUS::TClientId clientId) =0;
// Callback called whenever a text is received from a user
virtual void cbChatText(TChannelRank rank,const TCharacterId& id,GUS::TClientId clientId,const NLMISC::CSString& txt) =0;
public:
//-----------------------------------------------------------------------------
// Accessors for channel basics
const NLMISC::CSString& getChannelName() const;
const NLMISC::CSString& getChannelTitle() const;
void setChannelTitle(const NLMISC::CSString& title);
//-----------------------------------------------------------------------------
// Accessors for user lists
// add a user to a selected user group
// - removes the user from any other group that they may be in
void addMember(const TCharacterId& id);
void addOfficer(const TCharacterId& id);
void addArch(const TCharacterId& id);
// get the sets of members, officers or arch users
CUserGroup& getMembers();
CUserGroup& getOfficers();
CUserGroup& getArchs();
// remove a user from all groups
void removeUser(const TCharacterId& id);
// lookup a user in each of the user groups and determine their rank
// - returns NO_RANK if user not found
const TChannelRank getRank(const TCharacterId& id);
// set a user rank by adding them to one of the user groups
// - if the user is already in a user group they are removed before the operation begins
// - if the rank is 'NO-RANK' then this operation is equivalent to 'removeUser()'
void setRank(const TCharacterId& id,const TChannelRank& rank);
// display the lists of members & officers
void displayMembers();
void displayOfficers();
void displayArchs();
void displayAllUsers();
//-----------------------------------------------------------------------------
// Methods for message sending / broadcasting
void sendMessage(GUS::TClientId clientId,const NLMISC::CSString& speaker,const NLMISC::CSString& txt);
void broadcastMessage(const NLMISC::CSString& speaker,const NLMISC::CSString& txt);
protected:
//-----------------------------------------------------------------------------
// protected methods
// ctor
IChannel(const NLMISC::CSString& name);
// accessor for the chat channel
GUS::CChatChannel& getChannel();
private:
//-----------------------------------------------------------------------------
// IChatCallback Specialisation
virtual void receiveMessage(GUS::TClientId clientId,const ucstring& txt);
virtual void clientReadyInChannel(GUS::CChatChannel* chatChannel, GUS::TClientId clientId);
virtual bool isClientAllowedInChatChannel(GUS::TClientId clientId, GUS::CChatChannel *chatChannel);
private:
//-----------------------------------------------------------------------------
// private data
// smart pointer to the CChatChannel object
GUS::TChatChannelPtr _Chat;
// the vectors of users
CUserGroup _Members;
CUserGroup _Officers;
CUserGroup _Archs;
// the sets of names that have been added to or removes from _Members, _Officers or _Archs but
// have not yet been added to / removed from the _Chat
typedef std::set TUntreatedUserSet;
TUntreatedUserSet _ChatAdds;
TUntreatedUserSet _ChatRemoves;
//-----------------------------------------------------------------------------
// private methods used by CUserGroup objects
friend class CUserGroup;
// either add to the container's adds list or remove from its removes list
void _chatAdd(const TCharacterId& name);
// either add to the container's removes list or remove from its adds list
void _chatRemove(const TCharacterId& name);
// Update the chat channel, removing players in the _ChatRemoves set and adding players in the _ChatAdds set
void _chatUpdate();
};
}
//-----------------------------------------------------------------------------
#endif