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 | |
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')
-rw-r--r-- | src/channels.cpp | 18 | ||||
-rw-r--r-- | src/modules.cpp | 1 | ||||
-rw-r--r-- | src/modules/m_permchannels.cpp | 86 |
3 files changed, 102 insertions, 3 deletions
diff --git a/src/channels.cpp b/src/channels.cpp index 115afea52..c28ca23de 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -482,7 +482,11 @@ long Channel::PartUser(User *user, const char* reason) /* kill the record */ if (iter != ServerInstance->chanlist->end()) { - FOREACH_MOD(I_OnChannelDelete,OnChannelDelete(this)); + int MOD_RESULT = 0; + FOREACH_RESULT_I(ServerInstance,I_OnChannelPreDelete, OnChannelPreDelete(this)); + if (MOD_RESULT == 1) + return 1; // delete halted by module + FOREACH_MOD(I_OnChannelDelete, OnChannelDelete(this)); ServerInstance->chanlist->erase(iter); } return 0; @@ -528,7 +532,11 @@ long Channel::ServerKickUser(User* user, const char* reason, bool triggerevents) /* kill the record */ if (iter != ServerInstance->chanlist->end()) { - FOREACH_MOD(I_OnChannelDelete,OnChannelDelete(this)); + int MOD_RESULT = 0; + FOREACH_RESULT_I(ServerInstance,I_OnChannelPreDelete, OnChannelPreDelete(this)); + if (MOD_RESULT == 1) + return 1; // delete halted by module + FOREACH_MOD(I_OnChannelDelete, OnChannelDelete(this)); ServerInstance->chanlist->erase(iter); } return 0; @@ -606,7 +614,11 @@ long Channel::KickUser(User *src, User *user, const char* reason) /* kill the record */ if (iter != ServerInstance->chanlist->end()) { - FOREACH_MOD(I_OnChannelDelete,OnChannelDelete(this)); + int MOD_RESULT = 0; + FOREACH_RESULT_I(ServerInstance,I_OnChannelPreDelete, OnChannelPreDelete(this)); + if (MOD_RESULT == 1) + return 1; // delete halted by module + FOREACH_MOD(I_OnChannelDelete, OnChannelDelete(this)); ServerInstance->chanlist->erase(iter); } return 0; diff --git a/src/modules.cpp b/src/modules.cpp index 0ee715b27..87fd393f8 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -180,6 +180,7 @@ void Module::OnChangeName(User*, const std::string&) { } void Module::OnAddLine(User*, XLine*) { } void Module::OnDelLine(User*, XLine*) { } void Module::OnCleanup(int, void*) { } +int Module::OnChannelPreDelete(Channel*) { return 0; } void Module::OnChannelDelete(Channel*) { } void Module::OnSetAway(User*) { } void Module::OnCancelAway(User*) { } 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) |