summaryrefslogtreecommitdiff
path: root/src/playerrelations.h
diff options
context:
space:
mode:
authorBjørn Lindeijer <bjorn@lindeijer.nl>2009-04-27 23:43:24 +0200
committerBjørn Lindeijer <bjorn@lindeijer.nl>2009-04-29 19:45:53 +0200
commit3cca6548aefcfe0751ab7b4d70ac71ace486e12e (patch)
treed4cc812676bc6f31ed5f1da6fd99fe0410abf9cd /src/playerrelations.h
parent9c99cee38effd341889267c8cda6c964af561aa1 (diff)
downloadmana-client-3cca6548aefcfe0751ab7b4d70ac71ace486e12e.tar.gz
mana-client-3cca6548aefcfe0751ab7b4d70ac71ace486e12e.tar.bz2
mana-client-3cca6548aefcfe0751ab7b4d70ac71ace486e12e.tar.xz
mana-client-3cca6548aefcfe0751ab7b4d70ac71ace486e12e.zip
Removed underscores from some non-conforming filenames
We don't use underscores in the filenames generally, and let's be consistent on that matter.
Diffstat (limited to 'src/playerrelations.h')
-rw-r--r--src/playerrelations.h240
1 files changed, 240 insertions, 0 deletions
diff --git a/src/playerrelations.h b/src/playerrelations.h
new file mode 100644
index 00000000..adc6a95f
--- /dev/null
+++ b/src/playerrelations.h
@@ -0,0 +1,240 @@
+/*
+ * The Mana World
+ * Copyright (C) 2008 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * 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
+ * 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
+ */
+
+#ifndef PLAYER_RELATIONS_H
+#define PLAYER_RELATIONS_H
+
+#include <list>
+#include <map>
+#include <string>
+#include <vector>
+
+class Being;
+class Player;
+
+struct PlayerRelation
+{
+ static const unsigned int EMOTE = (1 << 0);
+ static const unsigned int SPEECH_FLOAT = (1 << 1);
+ static const unsigned int SPEECH_LOG = (1 << 2);
+ static const unsigned int WHISPER = (1 << 3);
+ static const unsigned int TRADE = (1 << 4);
+
+ static const unsigned int RELATIONS_NR = 4;
+ static const unsigned int RELATION_PERMISSIONS[RELATIONS_NR];
+
+ static const unsigned int DEFAULT = EMOTE
+ | SPEECH_FLOAT
+ | SPEECH_LOG
+ | WHISPER
+ | TRADE;
+ enum Relation {
+ NEUTRAL = 0,
+ FRIEND = 1,
+ DISREGARDED = 2,
+ IGNORED = 3
+ };
+
+ PlayerRelation(Relation relation);
+
+ Relation mRelation; // bitmask for all of the above
+};
+
+
+/**
+ * Ignore strategy: describes how we should handle ignores.
+ */
+class PlayerIgnoreStrategy
+{
+public:
+ std::string mDescription;
+ std::string mShortName;
+
+ virtual ~PlayerIgnoreStrategy() {}
+
+ /**
+ * Handle the ignoring of the indicated action by the indicated player.
+ */
+ virtual void ignore(Player *player, unsigned int flags) = 0;
+};
+
+class PlayerRelationsListener
+{
+public:
+ PlayerRelationsListener() { }
+ virtual ~PlayerRelationsListener() { }
+
+ virtual void updatedPlayer(const std::string &name) = 0;
+};
+
+/**
+ * Player relations class, represents any particular relations and/or
+ * preferences the user of the local client has wrt other players (identified
+ * by std::string).
+ */
+class PlayerRelationsManager
+{
+public:
+ PlayerRelationsManager();
+ ~PlayerRelationsManager();
+
+ /**
+ * Initialise player relations manager (load config file etc.)
+ */
+ void init();
+
+ /**
+ * Load configuration from our config file, or substitute defaults.
+ */
+ void load();
+
+ /**
+ * Save configuration to our config file.
+ */
+ void store();
+
+ /**
+ * Determines whether the player in question is being ignored, filtered by
+ * the specified flags.
+ */
+ unsigned int checkPermissionSilently(const std::string &player_name,
+ unsigned int flags);
+
+ /**
+ * Tests whether the player in question is being ignored for any of the
+ * actions in the specified flags. If so, trigger appropriate side effects
+ * if requested by the player.
+ */
+ bool hasPermission(Being *being, unsigned int flags);
+
+ bool hasPermission(const std::string &being, unsigned int flags);
+
+ /**
+ * Updates the relationship with this player.
+ */
+ void setRelation(const std::string &name,
+ PlayerRelation::Relation relation);
+
+ /**
+ * Updates the relationship with this player.
+ */
+ PlayerRelation::Relation getRelation(const std::string &name);
+
+ /**
+ * Deletes the information recorded for a player.
+ */
+ void removePlayer(const std::string &name);
+
+ /**
+ * Retrieves the default permissions.
+ */
+ unsigned int getDefault() const;
+
+ /**
+ * Sets the default permissions.
+ */
+ void setDefault(unsigned int permissions);
+
+ /**
+ * Retrieves all known player ignore strategies.
+ *
+ * The player ignore strategies are allocated statically and must not be
+ * deleted.
+ */
+ std::vector<PlayerIgnoreStrategy *> *getPlayerIgnoreStrategies();
+
+ /**
+ * Return the current player ignore strategy.
+ *
+ * \return A player ignore strategy, or NULL
+ */
+ PlayerIgnoreStrategy *getPlayerIgnoreStrategy() const
+ {
+ return mIgnoreStrategy;
+ }
+
+ /**
+ * Sets the strategy to call when ignoring players.
+ */
+ void setPlayerIgnoreStrategy(PlayerIgnoreStrategy *strategy)
+ {
+ mIgnoreStrategy = strategy;
+ }
+
+ /**
+ * For a given ignore strategy short name, find the appropriate index in
+ * the ignore strategies vector.
+ *
+ * \param The short name of the ignore strategy to look up
+ * \return The appropriate index, or -1
+ */
+ int getPlayerIgnoreStrategyIndex(const std::string &shortname);
+
+ /**
+ * Retrieves a sorted vector of all players for which we have any relations
+ * recorded.
+ */
+ std::vector<std::string> *getPlayers();
+
+ /**
+ * Removes all recorded player info.
+ */
+ void clear();
+
+ /**
+ * Do we persist our `ignore' setup?
+ */
+ bool getPersistIgnores() const { return mPersistIgnores; }
+
+ /**
+ * Change the `ignore persist' flag.
+ *
+ * @param value Whether to persist ignores
+ */
+ void setPersistIgnores(bool value) { mPersistIgnores = value; }
+
+ void addListener(PlayerRelationsListener *listener)
+ {
+ mListeners.push_back(listener);
+ }
+
+ void removeListener(PlayerRelationsListener *listener)
+ {
+ mListeners.remove(listener);
+ }
+
+private:
+ void signalUpdate(const std::string &name);
+
+ bool mPersistIgnores; // If NOT set, we delete the ignored data upon reloading
+ unsigned int mDefaultPermissions;
+
+ PlayerIgnoreStrategy *mIgnoreStrategy;
+ std::map<std::string, PlayerRelation *> mRelations;
+ std::list<PlayerRelationsListener *> mListeners;
+ std::vector<PlayerIgnoreStrategy *> mIgnoreStrategies;
+};
+
+
+extern PlayerRelationsManager player_relations; // singleton representation of player relations
+
+
+#endif /* !defined(PLAYER_RELATIONS_H) */