From efa08239271572e1c8024f808d61e02c7377ab54 Mon Sep 17 00:00:00 2001 From: brain Date: Fri, 26 Oct 2007 20:48:58 +0000 Subject: Add new event for this with gauranteed delivery of message BEFORE the text is sent out git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@8376 e03df62e-2008-0410-955e-edbf42e46eb7 --- include/modules.h | 17 ++++++++++++++++- src/commands/cmd_notice.cpp | 5 +++++ src/commands/cmd_privmsg.cpp | 5 +++++ src/modules.cpp | 1 + src/modules/m_delayjoin.cpp | 15 ++++----------- 5 files changed, 31 insertions(+), 12 deletions(-) diff --git a/include/modules.h b/include/modules.h index 5327311fb..50142e253 100644 --- a/include/modules.h +++ b/include/modules.h @@ -380,7 +380,8 @@ enum Implementation { I_OnUserConnect, I_OnUserQuit, I_OnUserDisconnect, I_OnUse I_OnPostLocalTopicChange, I_OnEvent, I_OnRequest, I_OnOperCompre, I_OnGlobalOper, I_OnPostConnect, I_OnAddBan, I_OnDelBan, I_OnRawSocketAccept, I_OnRawSocketClose, I_OnRawSocketWrite, I_OnRawSocketRead, I_OnChangeLocalUserGECOS, I_OnUserRegister, I_OnOperCompare, I_OnChannelDelete, I_OnPostOper, I_OnSyncOtherMetaData, I_OnSetAway, I_OnCancelAway, I_OnUserList, - I_OnPostCommand, I_OnPostJoin, I_OnWhoisLine, I_OnBuildExemptList, I_OnRawSocketConnect, I_OnGarbageCollect, I_OnBufferFlushed }; + I_OnPostCommand, I_OnPostJoin, I_OnWhoisLine, I_OnBuildExemptList, I_OnRawSocketConnect, I_OnGarbageCollect, I_OnBufferFlushed, + I_OnText }; /** Base class for all InspIRCd modules * This class is the base class for InspIRCd modules. All modules must inherit from this class, @@ -716,6 +717,20 @@ class CoreExport Module : public Extensible */ virtual void OnUserNotice(User* user, void* dest, int target_type, const std::string &text, char status, const CUList &exempt_list); + /** Called immediately before any NOTICE or PRIVMSG sent from a user, local or remote. + * The dest variable contains a User* if target_type is TYPE_USER and a Channel* + * if target_type is TYPE_CHANNEL. + * The difference between this event and OnUserPreNotice/OnUserPreMessage is that delivery is gauranteed, + * the message has already been vetted. In the case of the other two methods, a later module may stop your + * message. This also differs from OnUserMessage which occurs AFTER the message has been sent. + * @param user The user sending the message + * @param dest The target of the message + * @param target_type The type of target (TYPE_USER or TYPE_CHANNEL) + * @param text the text being sent by the user + * @param status The status being used, e.g. NOTICE @#chan has status== '@', 0 to send to everyone. + */ + virtual void OnText(User* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list); + /** Called after every MODE command sent from a user * The dest variable contains a User* if target_type is TYPE_USER and a Channel* * if target_type is TYPE_CHANNEL. The text variable contains the remainder of the diff --git a/src/commands/cmd_notice.cpp b/src/commands/cmd_notice.cpp index 9cc846dd8..1f5b854e6 100644 --- a/src/commands/cmd_notice.cpp +++ b/src/commands/cmd_notice.cpp @@ -41,6 +41,7 @@ CmdResult CommandNotice::Handle (const char** parameters, int pcnt, User *user) parameters[1] = temp.c_str(); // notice to server mask const char* servermask = parameters[0] + 1; + FOREACH_MOD(I_OnText,OnText(user,(void*)parameters[0],TYPE_SERVER,parameters[1],0,exempt_list)); if (match(ServerInstance->Config->ServerName,servermask)) { user->SendAll("NOTICE", "%s", parameters[1]); @@ -90,6 +91,8 @@ CmdResult CommandNotice::Handle (const char** parameters, int pcnt, User *user) return CMD_FAILURE; } + FOREACH_MOD(I_OnText,OnText(user,chan,TYPE_CHANNEL,parameters[1],status,except_list)); + if (status) { if (ServerInstance->Config->UndernetMsgPrefix) @@ -138,6 +141,8 @@ CmdResult CommandNotice::Handle (const char** parameters, int pcnt, User *user) } parameters[1] = (char*)temp.c_str(); + FOREACH_MOD(I_OnText,OnText(user,dest,TYPE_USER,parameters[1],0,exempt_list)); + if (IS_LOCAL(dest)) { // direct write, same server diff --git a/src/commands/cmd_privmsg.cpp b/src/commands/cmd_privmsg.cpp index 96aff8392..474eb4b3d 100644 --- a/src/commands/cmd_privmsg.cpp +++ b/src/commands/cmd_privmsg.cpp @@ -41,6 +41,7 @@ CmdResult CommandPrivmsg::Handle (const char** parameters, int pcnt, User *user) parameters[1] = temp.c_str(); // notice to server mask const char* servermask = parameters[0] + 1; + FOREACH_MOD(I_OnText,OnText(user,(void*)parameters[0],TYPE_SERVER,parameters[1],0,except_list)); if (match(ServerInstance->Config->ServerName,servermask)) { user->SendAll("PRIVMSG", "%s", parameters[1]); @@ -91,6 +92,8 @@ CmdResult CommandPrivmsg::Handle (const char** parameters, int pcnt, User *user) return CMD_FAILURE; } + FOREACH_MOD(I_OnText,OnText(user,chan,TYPE_CHANNEL,parameters[1],status,except_list)); + if (status) { if (ServerInstance->Config->UndernetMsgPrefix) @@ -146,6 +149,8 @@ CmdResult CommandPrivmsg::Handle (const char** parameters, int pcnt, User *user) } parameters[1] = (char*)temp.c_str(); + FOREACH_MOD(I_OnText,OnText(user,dest,TYPE_USER,parameters[1],0,except_list)); + if (IS_LOCAL(dest)) { // direct write, same server diff --git a/src/modules.cpp b/src/modules.cpp index e801543fb..6ef0975d6 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -196,6 +196,7 @@ int Module::OnWhoisLine(User*, User*, int&, std::string&) { return 0; } void Module::OnBuildExemptList(MessageType, Channel*, User*, char, CUList&, const std::string&) { } void Module::OnGarbageCollect() { } void Module::OnBufferFlushed(User*) { } +void Module::OnText(User*, void*, int, std::string&, char, CUList&) { } ModuleManager::ModuleManager(InspIRCd* Ins) diff --git a/src/modules/m_delayjoin.cpp b/src/modules/m_delayjoin.cpp index d968f34a2..9626d9780 100644 --- a/src/modules/m_delayjoin.cpp +++ b/src/modules/m_delayjoin.cpp @@ -170,15 +170,15 @@ class ModuleDelayJoin : public Module } } - int OnUserPreMessage(User* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list) + void OnText(User* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list) { if (target_type != TYPE_CHANNEL) - return 0; + return; Channel* channel = (Channel*) dest; if (!user->GetExt(std::string("delayjoin_")+channel->name)) - return 0; + return; /* Display the join to everyone else (the user who joined got it earlier) */ channel->WriteAllExcept(user, false, 0, exempt_list, "JOIN %s", channel->name); @@ -191,16 +191,9 @@ class ModuleDelayJoin : public Module */ for (UCListIter f = user->chans.begin(); f != user->chans.end(); f++) if (f->first->IsModeSet('D')) - return 0; + return; user->Shrink("delayjoin"); - - return 0; - } - - int OnUserPreNotice(User* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list) - { - return OnUserPreMessage(user, dest, target_type, text, status, exempt_list); } }; -- cgit v1.2.3