cyphesis/server/Account.h
Alistair Riddoch 4a9c7078f7 Refactor to use LocatedEntity as base class
All IG code should use the interface of LocatedEntity when dealing
with any entity, rather than sometimes requiring Entity. Add virtual
functions to the interface where required, and modify all other interfaces
to stop them using Entity. This makes the code way cleaner, and much better
de-coupled.
2013-01-17 10:17:07 +00:00

126 lines
4.4 KiB
C++

// Cyphesis Online RPG Server and AI Engine
// Copyright (C) 2000,2001 Alistair Riddoch
//
// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
// $Id$
#ifndef SERVER_ACCOUNT_H
#define SERVER_ACCOUNT_H
#include "ConnectableRouter.h"
#include <vector>
namespace Atlas {
namespace Message {
class Element;
typedef std::vector<Element> ListType;
}
}
class Connection;
class LocatedEntity;
typedef std::map<long, LocatedEntity *> EntityDict;
/// \brief This is the base class for storing information about uses who
/// can use this server.
///
/// The majority of functionality relating to user accounts is encapsulated
/// here. Sub-classes control privilege levels by implementing
/// characterError().
class Account : public ConnectableRouter {
protected:
/// \brief A store of Character entities belonging to this account
EntityDict m_charactersDict;
/// \brief The username of this account
std::string m_username;
/// \brief The password used to authenticate this account
std::string m_password;
LocatedEntity * addNewCharacter(const std::string &,
const Atlas::Objects::Entity::RootEntity &,
const Atlas::Objects::Root &);
void characterDestroyed(long);
/// \brief Check a character creation op is within the privelege levels
/// of this account.
///
/// @param op The full operation used for error reporting
/// @param ent A RootEntity representing the character to be created
/// @param res Any resulting error is returned here
virtual int characterError(const Operation & op,
const Atlas::Objects::Root & ent,
OpVector & res) const = 0;
virtual void createObject(const std::string &,
const Atlas::Objects::Root &,
const Operation &,
OpVector &);
int filterTasks(const Atlas::Message::ListType & tasks,
const Atlas::Objects::Entity::RootEntity &) const;
public:
/// \brief Connect and add a character to this account
int connectCharacter(LocatedEntity *chr);
Account(Connection * conn, const std::string & username,
const std::string & passwd,
const std::string & id, long intId);
virtual ~Account();
const std::string & username() const {
return m_username;
}
const std::string & password() const {
return m_password;
}
/// \brief Get a string representation of the type of account
virtual const char * getType() const;
/// \brief Store this account in the database
virtual void store() const;
virtual void addToMessage(Atlas::Message::MapType &) const;
virtual void addToEntity(const Atlas::Objects::Entity::RootEntity &) const;
virtual void externalOperation(const Operation & op, Link &);
virtual void operation(const Operation &, OpVector &);
virtual void LogoutOperation(const Operation &, OpVector &);
virtual void CreateOperation(const Operation &, OpVector &);
virtual void SetOperation(const Operation &, OpVector &);
virtual void ImaginaryOperation(const Operation &, OpVector &);
virtual void TalkOperation(const Operation &, OpVector &);
virtual void LookOperation(const Operation &, OpVector &);
virtual void GetOperation(const Operation &, OpVector &);
virtual void OtherOperation(const Operation &, OpVector &);
void addCharacter(LocatedEntity *);
/// \brief Read only accessor for the Character dictionary
const EntityDict & getCharacters() const {
return m_charactersDict;
}
friend class Accounttest;
friend class Accountintegration;
};
#endif // SERVER_ACCOUNT_H