diff options
author | w00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7> | 2008-08-25 13:22:57 +0000 |
---|---|---|
committer | w00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7> | 2008-08-25 13:22:57 +0000 |
commit | 8eae84e3ba8ec6d025592b9406193f73929bbf77 (patch) | |
tree | 7719d8e9f4d6b770dce85d3308ba1c0556ec284b | |
parent | 8d7e3fab28008e6353c7520c711aefc4a10e282d (diff) |
Add and document <permchannels> block for m_permchannels, which creates a channel on startup. Fixes bug #511.
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@10271 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r-- | conf/modules.conf.example | 3 | ||||
-rw-r--r-- | src/modules/m_permchannels.cpp | 56 |
2 files changed, 59 insertions, 0 deletions
diff --git a/conf/modules.conf.example b/conf/modules.conf.example index 08bd87f93..09434ee7c 100644 --- a/conf/modules.conf.example +++ b/conf/modules.conf.example @@ -1008,6 +1008,9 @@ # channels -may- need support from your Services package to function # properly with them. This adds channel mode +P. #<module name="m_permchannels.so"> +# +# You may also create channels on startup by using the <permchannels> block. +#<permchannels channel="#opers" modes="is" topic="Opers only."> #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# # PostgreSQL module: Allows other SQL modules to access PgSQL databases diff --git a/src/modules/m_permchannels.cpp b/src/modules/m_permchannels.cpp index 86e810bc2..0133c3814 100644 --- a/src/modules/m_permchannels.cpp +++ b/src/modules/m_permchannels.cpp @@ -64,6 +64,8 @@ public: } Implementation eventlist[] = { I_OnChannelPreDelete }; ServerInstance->Modules->Attach(eventlist, this, 1); + + OnRehash(NULL, ""); } virtual ~ModulePermanentChannels() @@ -72,6 +74,60 @@ public: delete p; } + virtual void OnRehash(User *user, const std::string ¶meter) + { + /* + * Process config-defined list of permanent channels. + * -- w00t + */ + ConfigReader MyConf(ServerInstance); + for (int i = 0; i < MyConf.Enumerate("permchannels"); i++) + { + std::string channel = MyConf.ReadValue("permchannels", "channel", i); + std::string topic = MyConf.ReadValue("permchannels", "topic", i); + std::string modes = MyConf.ReadValue("permchannels", "modes", i); + + if (channel.empty() || topic.empty()) + { + ServerInstance->Logs->Log("blah", DEBUG, "Malformed permchannels tag with empty topic or channel name."); + continue; + } + + Channel *c = ServerInstance->FindChan(channel); + + if (!c) + { + c = new Channel(ServerInstance, channel, ServerInstance->Time()); + c->SetTopic(NULL, topic, true); + ServerInstance->Logs->Log("blah", DEBUG, "Added %s with topic %s", channel.c_str(), topic.c_str()); + + if (modes.empty()) + continue; + + irc::spacesepstream list(modes); + std::string modeseq; + std::string par; + + list.GetToken(modeseq); + + // XXX bleh, should we pass this to the mode parser instead? ugly. --w00t + for (std::string::iterator n = modeseq.begin(); n != modeseq.end(); ++n) + { + ModeHandler* mode = ServerInstance->Modes->FindMode(*n, MODETYPE_CHANNEL); + if (mode) + { + if (mode->GetNumParams(true)) + list.GetToken(par); + else + par.clear(); + + mode->OnModeChange(ServerInstance->FakeClient, ServerInstance->FakeClient, c, par, true); + } + } + } + } + } + virtual Version GetVersion() { return Version(1,2,0,0,VF_COMMON|VF_VENDOR,API_VERSION); |