summaryrefslogtreecommitdiff
path: root/src/chat-server/chathandler.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/chat-server/chathandler.h')
-rw-r--r--src/chat-server/chathandler.h343
1 files changed, 343 insertions, 0 deletions
diff --git a/src/chat-server/chathandler.h b/src/chat-server/chathandler.h
new file mode 100644
index 00000000..c6b680e4
--- /dev/null
+++ b/src/chat-server/chathandler.h
@@ -0,0 +1,343 @@
+/*
+ * The Mana Server
+ * Copyright (C) 2004-2010 The Mana World Development Team
+ *
+ * This file is part of The Mana Server.
+ *
+ * The Mana Server 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.
+ *
+ * The Mana Server 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 The Mana Server. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef CHATHANDLER_H
+#define CHATHANDLER_H
+
+#include <map>
+#include <string>
+#include <vector>
+
+#include "net/connectionhandler.h"
+#include "utils/tokencollector.h"
+
+class ChatChannel;
+class ChatClient;
+
+/**
+ * Manages chat related things like private messaging, chat channel handling
+ * as well as guild chat. The only form of chat not handled by this server is
+ * local chat, which is handled by the game server.
+ *
+ * @todo <b>b_lindeijer:</b> Extend this class with handling of team chat once
+ * teams are implemented.
+ */
+class ChatHandler : public ConnectionHandler
+{
+ private:
+ /**
+ * Data needed for initializing a ChatClient.
+ */
+ struct Pending
+ {
+ std::string character;
+ unsigned char level;
+ };
+
+ struct PartyInvite
+ {
+ std::string mInviter;
+ std::string mInvited;
+ int mPartyId;
+ };
+
+ std::map<std::string, ChatClient*> mPlayerMap;
+ std::vector<PartyInvite> mPartyInvitedUsers;
+
+ public:
+ ChatHandler();
+
+ /**
+ * Start the handler.
+ */
+ bool startListen(enet_uint16 port, const std::string &host);
+
+ /**
+ * Tell a list of users about an event in a chatchannel.
+ *
+ * @param channel the channel to send the message in, must not be NULL
+ * @param info information pertaining to the event
+ */
+ void warnUsersAboutPlayerEventInChat(ChatChannel *channel,
+ const std::string &info,
+ char eventId);
+
+ /**
+ * Called by TokenCollector when a client wrongly connected.
+ */
+ void deletePendingClient(ChatClient *);
+
+ /**
+ * Called by TokenCollector when a client failed to connect.
+ */
+ void deletePendingConnect(Pending *);
+
+ /**
+ * Called by TokenCollector when a client succesfully connected.
+ */
+ void tokenMatched(ChatClient *, Pending *);
+
+ /**
+ * Send information about a change in the guild list to guild members.
+ */
+ void sendGuildListUpdate(const std::string &guildName,
+ const std::string &characterName,
+ char eventId);
+
+ protected:
+ /**
+ * Process chat related messages.
+ */
+ void processMessage(NetComputer *computer, MessageIn &message);
+
+ /**
+ * Returns a ChatClient instance.
+ */
+ NetComputer *computerConnected(ENetPeer *);
+
+ /**
+ * Cleans up after the disconnected client.
+ */
+ void computerDisconnected(NetComputer *);
+
+ /**
+ * Send messages for each guild the character belongs to.
+ */
+ void sendGuildRejoin(ChatClient &computer);
+
+ /**
+ * Send chat and guild info to chat client, so that they can join the
+ * correct channels.
+ */
+ void sendGuildEnterChannel(const MessageOut &msg,
+ const std::string &name);
+
+ /**
+ * Send guild invite.
+ */
+ void sendGuildInvite(const std::string &invitedName,
+ const std::string &inviterName,
+ const std::string &guildName);
+
+ private:
+ /**
+ * Deal with command messages.
+ */
+ void handleCommand(ChatClient &client, const std::string &command);
+
+ /**
+ * Deal with Chat messages.
+ */
+ void handleChatMessage(ChatClient &client, MessageIn &msg);
+
+ /**
+ * Deal with Announcement messages.
+ */
+ void handleAnnounceMessage(ChatClient &client, MessageIn &msg);
+
+ /**
+ * Deal with Private messages.
+ */
+ void handlePrivMsgMessage(ChatClient &client, MessageIn &msg);
+
+ /**
+ * Deal with Who messages.
+ */
+ void handleWhoMessage(ChatClient &client);
+
+ /**
+ * Deal with player entering channel.
+ */
+ void handleEnterChannelMessage(ChatClient &client, MessageIn &msg);
+
+ /**
+ * Deal with player changing mode.
+ */
+ void handleModeChangeMessage(ChatClient &client, MessageIn &msg);
+
+ /**
+ * Deal with player kicking other player from channel.
+ */
+ void handleKickUserMessage(ChatClient &client, MessageIn &msg);
+
+ /**
+ * Deal with player leaving channel.
+ */
+ void handleQuitChannelMessage(ChatClient &client, MessageIn &msg);
+
+ /**
+ * Deal with listing all accessible channels.
+ */
+ void handleListChannelsMessage(ChatClient &client, MessageIn &msg);
+
+ /**
+ * Deal with listing all channel users in a channel.
+ */
+ void handleListChannelUsersMessage(ChatClient &client, MessageIn &msg);
+
+ /**
+ * Deal with changing a channel's topic
+ */
+ void handleTopicChange(ChatClient &client, MessageIn &msg);
+
+ /**
+ * Deal with disconnection.
+ */
+ void handleDisconnectMessage(ChatClient &client, MessageIn &msg);
+
+ /**
+ * Deal with creating a guild.
+ */
+ void handleGuildCreation(ChatClient &client, MessageIn &msg);
+
+ /**
+ * Deal with inviting a player to a guild.
+ */
+ void handleGuildInvitation(ChatClient &client, MessageIn &msg);
+
+ /**
+ * Deal with accepting an invite to join a guild.
+ */
+ void handleGuildAcceptInvite(ChatClient &client, MessageIn &msg);
+
+ /**
+ * Deal with returning all the guild members of a guild.
+ */
+ void handleGuildRetrieveMembers(ChatClient &client, MessageIn &msg);
+
+ /**
+ * Deal with level change of member
+ */
+ void handleGuildMemberLevelChange(ChatClient &client, MessageIn &msg);
+
+ /**
+ * Deal with kicking a member
+ */
+ void handleGuildMemberKick(ChatClient &client, MessageIn &msg);
+
+ /**
+ * Deal with leaving a guild.
+ */
+ void handleGuildQuit(ChatClient &client, MessageIn &msg);
+
+ /**
+ * Deal with a player joining a party.
+ * @return Returns whether player successfully joined the party
+ */
+ bool handlePartyJoin(const std::string &invited,
+ const std::string &inviter);
+
+ /**
+ * Deal with inviting player to a party
+ */
+ void handlePartyInvite(ChatClient &client, MessageIn &msg);
+
+ /**
+ * Deal with accepting an invite to join a party
+ */
+ void handlePartyAcceptInvite(ChatClient &client, MessageIn &msg);
+
+ /**
+ * Deal with leaving a party.
+ */
+ void handlePartyQuit(ChatClient &client);
+
+ /**
+ * Tell user the invite was rejected
+ */
+ void handlePartyRejection(ChatClient &client, MessageIn &msg);
+
+ /**
+ * Remove user from party
+ */
+ void removeUserFromParty(ChatClient &client);
+
+ /**
+ * Send new member info to party members.
+ */
+ void sendPartyMemberInfo(ChatClient &client, MessageIn &msg);
+
+ /**
+ * Tell all the party members a member has left
+ */
+ void informPartyMemberQuit(ChatClient &client);
+
+ /**
+ * Tell all the party members a member has joined
+ */
+ void informPartyMemberJoined(ChatClient &client);
+
+ /**
+ * Tell the player to be more polite.
+ */
+ void warnPlayerAboutBadWords(ChatClient &computer);
+
+ /**
+ * Say something private to a player.
+ */
+ void sayToPlayer(ChatClient &computer, const std::string &playerName,
+ const std::string &text);
+
+ /**
+ * Sends a message to every client in a registered channel.
+ *
+ * @param channel the channel to send the message in, must not be NULL
+ * @param msg the message to be sent
+ */
+ void sendInChannel(ChatChannel *channel, MessageOut &msg);
+
+ /**
+ * Retrieves the guild channel or creates one automatically
+ * Automatically makes client join it
+ * @param The name of the guild (and therefore the channel)
+ * @param The client to join the channel
+ * @return Returns the channel joined
+ */
+ ChatChannel *joinGuildChannel(const std::string &name,
+ ChatClient &client);
+
+ /**
+ * Returns ChatClient from the Player Map
+ * @param The name of the character
+ * @return The Chat Client
+ */
+ ChatClient *getClient(const std::string &name) const;
+
+ /**
+ * Set the topic of a guild channel
+ */
+ void guildChannelTopicChange(ChatChannel *channel, int playerId,
+ const std::string &topic);
+
+ /**
+ * Container for pending clients and pending connections.
+ */
+ TokenCollector<ChatHandler, ChatClient *, Pending *> mTokenCollector;
+ friend void registerChatClient(const std::string &, const std::string &, int);
+};
+
+/**
+ * Register future client attempt. Temporary until physical server split.
+ */
+void registerChatClient(const std::string &, const std::string &, int);
+
+extern ChatHandler *chatHandler;
+
+#endif