X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fmessage.h;h=068f3124659182b02e08609df9f90bedb78db94b;hb=c05f81cac83e80c7727594e3929e0709eccca689;hp=b990b15ecf12230ee14b0d6dca2b6ba9c6fbac95;hpb=106d2fc72534d5f3ed3a4cfd776371482565e7a5;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/message.h b/include/message.h index b990b15ec..068f31246 100644 --- a/include/message.h +++ b/include/message.h @@ -1,50 +1,180 @@ -/* +------------------------------------+ - * | Inspire Internet Relay Chat Daemon | - * +------------------------------------+ +/* + * InspIRCd -- Internet Relay Chat Daemon * - * Inspire is copyright (C) 2002-2004 ChatSpike-Dev. - * E-mail: - * - * - * - * Written by Craig Edwards, Craig McLure, and others. - * This program is free but copyrighted software; see - * the file COPYING for details. + * Copyright (C) 2018 Attila Molnar + * Copyright (C) 2017-2018, 2020 Sadie Powell * - * --------------------------------------------------- + * This file is part of InspIRCd. InspIRCd 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, version 2. + * + * 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, see . */ -#ifndef __MESSAGE_H -#define __MESSAGE_H - -// include the common header files - -#include -#include -#include -#include -#include -#include -#include "users.h" -#include "channels.h" - -int common_channels(userrec *u, userrec *u2); -void chop(char* str); -void tidystring(char* str); -void Blocking(int s); -void NonBlocking(int s); -int CleanAndResolve (char *resolvedHost, const char *unresolvedHost); -int c_count(userrec* u); -bool hasumode(userrec* user, char mode); -void ChangeName(userrec* user, const char* gecos); -void ChangeDisplayedHost(userrec* user, const char* host); -int isident(const char* n); -int isnick(const char* n); -char* cmode(userrec *user, chanrec *chan); -int cstatus(userrec *user, chanrec *chan); -int has_channel(userrec *u, chanrec *c); -void TidyBan(char *ban); -std::string chlist(userrec *user, userrec* source); -void send_network_quit(const char* nick, const char* reason); - -#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; + + /** Whether to update the source user's idle time. */ + bool update_idle; + + /** 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. */ + 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) + , update_idle(true) + , 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 + T* Get() const + { + return static_cast(dest); + } + + /** Retrieves the name of the target of this message. */ + const std::string& GetName() const + { + switch (type) + { + case TYPE_CHANNEL: + return Get()->name; + case TYPE_USER: + return Get()->nick; + case TYPE_SERVER: + return *Get(); + } + + // We should never reach this point during a normal execution but + // handle it just in case. + static const std::string target = "*"; + return target; + } +};