diff --git a/doc/conf/modules.default.conf b/doc/conf/modules.default.conf index 921a121f9..24393bea0 100644 --- a/doc/conf/modules.default.conf +++ b/doc/conf/modules.default.conf @@ -200,12 +200,13 @@ loadmodule "extbans/partmsg"; /* +b ~p (hide part/quit message) */ loadmodule "message-tags"; /* add tags to messages, required for various IRCv3 features */ loadmodule "batch"; /* also required for several IRCv3 features */ loadmodule "account-tag"; /* adds services account information to messages */ -loadmodule "labeled-response"; /* help clients with correlating requests to responses */ loadmodule "link-security"; /* link-security announce */ loadmodule "message-ids"; /* adds unique msgid to various messages */ loadmodule "plaintext-policy"; /* plaintext-policy announce */ loadmodule "server-time"; /* adds server timestamp to various messages */ loadmodule "sts"; /* strict transport policy (set::tls::sts-policy) */ +loadmodule "echo-message"; /* shows clients if their messages are altered/filtered */ +loadmodule "labeled-response"; /* help clients with correlating requests to responses (EXPERIMENTAL) */ /*** Other ***/ diff --git a/include/modules.h b/include/modules.h index b5a6ee35c..0f6edd76a 100644 --- a/include/modules.h +++ b/include/modules.h @@ -957,7 +957,7 @@ int hooktype_stats(aClient *sptr, char *str); int hooktype_local_join(aClient *cptr, aClient *sptr, aChannel *chptr, char *parv[]); int hooktype_configtest(ConfigFile *cfptr, ConfigEntry *ce, int section, int *errors); int hooktype_configrun(ConfigFile *cfptr, ConfigEntry *ce, int section); -int hooktype_usermsg(aClient *sptr, aClient *to, char *text, int notice); +int hooktype_usermsg(aClient *sptr, aClient *to, MessageTag *mtags, char *text, int notice); int hooktype_chanmsg(aClient *sptr, aChannel *chptr, MessageTag *mtags, char *text, int notice); int hooktype_local_part(aClient *cptr, aClient *sptr, aChannel *chptr, char *comment); int hooktype_local_kick(aClient *cptr, aClient *sptr, aClient *victim, aChannel *chptr, char *comment); diff --git a/src/modules/Makefile.in b/src/modules/Makefile.in index 8849ce177..99902505b 100644 --- a/src/modules/Makefile.in +++ b/src/modules/Makefile.in @@ -68,7 +68,8 @@ R_MODULES= \ rmtkl.so \ message-tags.so batch.so \ account-tag.so labeled-response.so link-security.so \ - message-ids.so plaintext-policy.so server-time.so sts.so + message-ids.so plaintext-policy.so server-time.so sts.so \ + echo-message.so MODULES=cloak.so $(R_MODULES) MODULEFLAGS=@MODULEFLAGS@ @@ -599,6 +600,10 @@ sts.so: sts.c $(INCLUDES) $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ -o sts.so sts.c +echo-message.so: echo-message.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ + -o echo-message.so echo-message.c + ############################################################################# # capabilities ############################################################################# diff --git a/src/modules/echo-message.c b/src/modules/echo-message.c new file mode 100644 index 000000000..477653455 --- /dev/null +++ b/src/modules/echo-message.c @@ -0,0 +1,93 @@ +/* + * IRC - Internet Relay Chat, src/modules/echo-message.c + * (C) 2019 Syzop & The UnrealIRCd Team + * + * See file AUTHORS in IRC package for additional names of + * the programmers. + * + * 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 1, or (at your option) + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + +ModuleHeader MOD_HEADER(echo_message) + = { + "echo-message", + "5.0", + "Batch CAP", + "3.2-b8-1", + NULL + }; + +/* Variables */ +long CAP_ECHO_MESSAGE = 0L; + +/* Forward declarations */ +int em_chanmsg(aClient *sptr, aChannel *chptr, MessageTag *mtags, char *text, int notice); +int em_usermsg(aClient *sptr, aClient *to, MessageTag *mtags, char *text, int notice); + +MOD_INIT(echo_message) +{ + ClientCapabilityInfo cap; + ClientCapability *c; + MessageTagHandlerInfo mtag; + + MARK_AS_OFFICIAL_MODULE(modinfo); + + memset(&cap, 0, sizeof(cap)); + cap.name = "echo-message"; + c = ClientCapabilityAdd(modinfo->handle, &cap, &CAP_ECHO_MESSAGE); + + HookAdd(modinfo->handle, HOOKTYPE_CHANMSG, 0, em_chanmsg); + HookAdd(modinfo->handle, HOOKTYPE_USERMSG, 0, em_usermsg); + + return MOD_SUCCESS; +} + +MOD_LOAD(echo_message) +{ + return MOD_SUCCESS; +} + +MOD_UNLOAD(echo_message) +{ + return MOD_SUCCESS; +} + +int em_chanmsg(aClient *sptr, aChannel *chptr, MessageTag *mtags, char *text, int notice) +{ + if (MyClient(sptr)) + { + sendto_prefix_one(sptr, sptr, mtags, ":%s %s %s :%s", + sptr->name, + notice ? "NOTICE" : "PRIVMSG", + chptr->chname, /* FIXME: should use target buffer that may include @ and such */ + text); + } + return 0; +} + +int em_usermsg(aClient *sptr, aClient *to, MessageTag *mtags, char *text, int notice) +{ + if (MyClient(sptr)) + { + sendto_prefix_one(sptr, sptr, mtags, ":%s %s %s :%s", + sptr->name, + notice ? "NOTICE" : "PRIVMSG", + to->name, + text); + } + return 0; +} diff --git a/src/modules/message.c b/src/modules/message.c index 02723fed3..5726a8f68 100644 --- a/src/modules/message.c +++ b/src/modules/message.c @@ -1,5 +1,5 @@ /* - * Unreal Internet Relay Chat Daemon, src/modules/m_message.c + * Unreal Internet Relay Chat Daemon, src/modules/message.c * (C) 2000-2001 Carsten V. Munk and the UnrealIRCd Team * Moved to modules by Fish (Justin Hammond) * @@ -142,8 +142,6 @@ int ret; if (!*text) return CANPRIVMSG_CONTINUE; - RunHook4(HOOKTYPE_USERMSG, sptr, acptr, *text, notice); - return CANPRIVMSG_SEND; } else { /* Silenced */ @@ -430,6 +428,7 @@ int m_message(aClient *cptr, aClient *sptr, MessageTag *recv_mtags, int parc, ch newcmd, (MyClient(acptr) ? acptr->name : nick), text); + RunHook5(HOOKTYPE_USERMSG, sptr, acptr, mtags, text, notice); free_mtags(mtags); continue; } else