-#ifndef __MESSAGE_H
-#define __MESSAGE_H
-
-// include the common header files
-
-#include <typeinfo>
-#include <iostream>
-#include <string>
-#include <deque>
-#include <sstream>
-#include <vector>
-#include "users.h"
-#include "channels.h"
-
-int c_count(userrec* u);
-void ChangeName(userrec* user, const char* gecos);
-void ChangeDisplayedHost(userrec* user, const char* host);
-int isident(const char* n);
-int isnick(const char* n);
-const char* cmode(userrec *user, chanrec *chan);
-int cstatus(userrec *user, chanrec *chan);
-std::string chlist(userrec *user, userrec* source);
-int cflags(userrec *user, chanrec *chan);
-
-#endif
+
+#pragma once
+
+/** Whether message was a PRIVMSG or a NOTICE. */
+enum MessageType
+{
+ /** The message is a PRIVMSG. */
+ MSG_PRIVMSG,
+
+ /** The message is a NOTICE. */
+ MSG_NOTICE
+};
+
+class CoreExport MessageDetails
+{
+ public:
+ /** Whether to echo the message at all. */
+ bool echo;
+
+ /* Whether to send the original message back to clients with echo-message support. */
+ bool echo_original;
+
+ /** The users who are exempted from receiving this message. */
+ CUList exemptions;
+
+ /* The original message as sent by the user. */
+ const std::string original_text;
+
+ /** IRCv3 message tags sent to the server by the user. */
+ const ClientProtocol::TagMap tags_in;
+
+ /** IRCv3 message tags sent out to users who get this message. */
+ ClientProtocol::TagMap tags_out;
+
+ /** The message which will be sent to clients. */
+ std::string text;
+
+ /** The type of message. */
+ const MessageType type;
+
+ /** Determines whether the specified message is a CTCP. If the specified message
+ * is a CTCP then the CTCP name and CTCP body are extracted and stored in the
+ * name and body references.
+ * @param name The location to store the parsed CTCP name.
+ * @param body The location to store the parsed CTCP body.
+ */
+ virtual bool IsCTCP(std::string& name, std::string& body) const = 0;
+
+ /** Determines whether the specified message is a CTCP. If the specified message
+ * is a CTCP then the CTCP name is extracted and stored in the name reference.
+ * @param name The location to store the parsed CTCP name.
+ */
+ virtual bool IsCTCP(std::string& name) const = 0;
+
+ /** Determines whether the specified message is a CTCP. */
+ virtual bool IsCTCP() const = 0;
+
+ protected:
+ MessageDetails(MessageType mt, const std::string& msg, const ClientProtocol::TagMap& tags)
+ : echo(true)
+ , echo_original(false)
+ , original_text(msg)
+ , tags_in(tags)
+ , text(msg)
+ , type(mt)
+ {
+ }
+};
+
+/** Represents the target of a message (NOTICE, PRIVMSG, etc). */
+class CoreExport MessageTarget
+{
+ public:
+ /** An enumeration of possible message target types. */
+ enum TargetType
+ {
+ /** The target of the message is a user. */
+ TYPE_USER,
+
+ /** The target of the message is a channel. */
+ TYPE_CHANNEL,
+
+ /** The target of the message is a server. */
+ TYPE_SERVER
+ };
+
+ private:
+ /** The target of the message. */
+ void* dest;
+
+ public:
+ /** If type is TYPE_CHANNEL and the user specified a status rank. */
+ char status;
+
+ /** The type of the target of the message. If this is TYPE_CHANNEL then dest
+ * is a Channel*, TYPE_USER then dest is a User*, and TYPE_SERVER then dest is
+ * a std::string* containing a server glob.
+ */
+ MessageTarget::TargetType type;
+
+ /** Initialises a new channel message target.
+ * @param channel The channel which is the target of the message.
+ * @param statuschar The lowest status rank that the message is being sent to.
+ */
+ MessageTarget(Channel* channel, char statuschar)
+ : dest(channel)
+ , status(statuschar)
+ , type(TYPE_CHANNEL)
+ {
+ }
+
+ /** Initialises a new user message target.
+ * @param user The user which is the target of the message.
+ */
+ MessageTarget(User* user)
+ : dest(user)
+ , status(0)
+ , type(TYPE_USER)
+ {
+ }
+
+ /** Initialises a new server message target.
+ * @param server The server glob which is the target of the message.
+ */
+ MessageTarget(std::string* server)
+ : dest(server)
+ , status(0)
+ , type(TYPE_SERVER)
+ {
+ }
+
+ /** Retrieves the target of this message. */
+ template<typename T>
+ T* Get() const
+ {
+ return static_cast<T*>(dest);
+ }
+};