diff options
-rw-r--r-- | docs/inspircd.conf.example | 12 | ||||
-rw-r--r-- | src/modules/m_conn_join.cpp | 110 | ||||
-rw-r--r-- | src/modules/m_operjoin.cpp | 5 |
3 files changed, 123 insertions, 4 deletions
diff --git a/docs/inspircd.conf.example b/docs/inspircd.conf.example index 202e4a8d1..9dacf10a8 100644 --- a/docs/inspircd.conf.example +++ b/docs/inspircd.conf.example @@ -1098,6 +1098,18 @@ # with each key eight hex digits long. # #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# +# Conn-Join: Allows you to force users to join one or more channels +# automatically upon connecting to the server. +#<module name="m_conn_join.so"> +# +#-#-#-#-#-#-#-#-#-#-#-#- CONNJOIN CONFIGURATION -#-#-#-#-#-#-#-#-#-#-# +# +# If you have m_conn_join.so loaded, you can configure it using the +# follow values: +# +#<autojoin channel="#one,#two,#three"> + +#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# # Conn-Lusers: Shows the LUSERS output on connect #<module name="m_conn_lusers.so"> diff --git a/src/modules/m_conn_join.cpp b/src/modules/m_conn_join.cpp new file mode 100644 index 000000000..ca7f0c068 --- /dev/null +++ b/src/modules/m_conn_join.cpp @@ -0,0 +1,110 @@ +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "users.h" +#include "channels.h" +#include "modules.h" +#include "inspircd.h" + +/* $ModDesc: Forces users to join the specified channel(s) on connect */ + +class ModuleConnJoin : public Module +{ + private: + std::string JoinChan; + ConfigReader* conf; + + + int tokenize(const string &str, std::vector<std::string> &tokens) + { + // skip delimiters at beginning. + string::size_type lastPos = str.find_first_not_of(",", 0); + // find first "non-delimiter". + string::size_type pos = str.find_first_of(",", lastPos); + + while (string::npos != pos || string::npos != lastPos) + { + // found a token, add it to the vector. + tokens.push_back(str.substr(lastPos, pos - lastPos)); + // skip delimiters. Note the "not_of" + lastPos = str.find_first_not_of(",", pos); + // find next "non-delimiter" + pos = str.find_first_of(",", lastPos); + } + return tokens.size(); + } + + public: + ModuleConnJoin(InspIRCd* Me) + : Module::Module(Me) + { + conf = new ConfigReader(ServerInstance); + JoinChan = conf->ReadValue("autojoin", "channel", 0); + } + + void Implements(char* List) + { + List[I_OnPostConnect] = List[I_OnRehash] = 1; + } + + virtual void OnRehash(userrec* user, const std::string ¶meter) + { + DELETE(conf); + conf = new ConfigReader(ServerInstance); + } + + virtual ~ModuleConnJoin() + { + DELETE(conf); + } + + virtual Version GetVersion() + { + return Version(1,1,0,1,VF_VENDOR,API_VERSION); + } + + virtual void OnPostConnect(userrec* user) + { + if (!JoinChan.empty()) + { + std::vector<std::string> Joinchans; + tokenize(JoinChan,Joinchans); + for(std::vector<std::string>::iterator it = Joinchans.begin(); it != Joinchans.end(); it++) + chanrec::JoinUser(ServerInstance, user, it->c_str(), false); + } + + } + +}; + +class ModuleConnJoinFactory : public ModuleFactory +{ + public: + ModuleConnJoinFactory() + { + } + + ~ModuleConnJoinFactory() + { + } + + virtual Module * CreateModule(InspIRCd* Me) + { + return new ModuleConnJoin(Me); + } +}; + +extern "C" void * init_module( void ) +{ + return new ModuleConnJoinFactory; +} diff --git a/src/modules/m_operjoin.cpp b/src/modules/m_operjoin.cpp index 75f809f4a..ae6abce0b 100644 --- a/src/modules/m_operjoin.cpp +++ b/src/modules/m_operjoin.cpp @@ -14,13 +14,10 @@ #include "users.h" #include "channels.h" #include "modules.h" - #include "inspircd.h" /* $ModDesc: Forces opers to join the specified channel(s) on oper-up */ - - class ModuleOperjoin : public Module { private: @@ -79,7 +76,7 @@ class ModuleOperjoin : public Module virtual void OnPostOper(userrec* user, const std::string &opertype) { - if(operChan != "") + if (!operChan.empty()) { std::vector<std::string> operChans; tokenize(operChan,operChans); |