diff options
author | w00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7> | 2008-01-06 14:43:42 +0000 |
---|---|---|
committer | w00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7> | 2008-01-06 14:43:42 +0000 |
commit | e7f33ba1896482367d01379e84d5496631229741 (patch) | |
tree | a291b202a7ca4438b93857c1d502e59342803d12 /src/modules | |
parent | 860a3579257124d1d9cbc3081a2096726103e5d0 (diff) |
Permanent channels, currently conflicts with blockcaps (+P) and is untested
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@8650 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/modules')
-rw-r--r-- | src/modules/m_permchannels.cpp | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/src/modules/m_permchannels.cpp b/src/modules/m_permchannels.cpp new file mode 100644 index 000000000..857593d02 --- /dev/null +++ b/src/modules/m_permchannels.cpp @@ -0,0 +1,86 @@ +/* +------------------------------------+ + * | 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 "inspircd.h" + +/* $ModDesc: Provides support for channel mode +P to provide permanent channels */ + + +/** Handles the +P channel mode + */ +class PermChannel : public ModeHandler +{ + public: + PermChannel(InspIRCd* Instance) : ModeHandler(Instance, 'P', 0, 0, false, MODETYPE_CHANNEL, false) { } + + ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding) + { + if (adding) + { + if (!channel->IsModeSet('P')) + { + channel->SetMode('P',true); + return MODEACTION_ALLOW; + } + } + else + { + if (channel->IsModeSet('P')) + { + channel->SetMode('P',false); + return MODEACTION_ALLOW; + } + } + + return MODEACTION_DENY; + } +}; + +class ModulePermanentChannels : public Module +{ + PermChannel *p; +public: + + ModulePermanentChannels(InspIRCd* Me) : Module(Me) + { + p = new PermChannel(ServerInstance); + if (!ServerInstance->AddMode(p)) + { + delete p; + throw ModuleException("Could not add new modes!"); + } + Implementation eventlist[] = { I_OnChannelPreDelete }; + ServerInstance->Modules->Attach(eventlist, this, 1); + } + + virtual ~ModulePermanentChannels() + { + ServerInstance->Modes->DelMode(p); + delete p; + } + + virtual Version GetVersion() + { + return Version(1,1,0,0,VF_COMMON|VF_VENDOR,API_VERSION); + } + + virtual int OnChannelPreDelete(Channel *c) + { + if (c->IsModeSet('P')) + return 1; + + return 0; + } +}; + +MODULE_INIT(ModulePermanentChannels) |