* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * InspIRCd: (C) 2002-2008 InspIRCd Development Team
- * See: http://www.inspircd.org/wiki/index.php/Credits
+ * InspIRCd: (C) 2002-2009 InspIRCd Development Team
+ * See: http://wiki.inspircd.org/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
* ---------------------------------------------------
*/
-/*
- by Chernov-Phoenix Alexey (Phoenix@RusNet) mailto:phoenix /email address separator/ pravmail.ru */
+/*
+ * Originally by Chernov-Phoenix Alexey (Phoenix@RusNet) mailto:phoenix /email address separator/ pravmail.ru
+ */
+
+/* $ModDesc: Gives opers cmode +y which provides a staff prefix. */
#include "inspircd.h"
-static char prefixchar;
+#define OPERPREFIX_VALUE 1000000
std::set<std::string>* SetupExt(User* user)
{
class OperPrefixMode : public ModeHandler
{
public:
- OperPrefixMode(InspIRCd* Instance) : ModeHandler(Instance, 'y', 1, 1, true, MODETYPE_CHANNEL, false, prefixchar) { }
+ OperPrefixMode(InspIRCd* Instance, char pfx) : ModeHandler(Instance, 'y', 1, 1, true, MODETYPE_CHANNEL, false, pfx, pfx, TR_NICK) { }
+
+ unsigned int GetPrefixRank()
+ {
+ return OPERPREFIX_VALUE;
+ }
ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding, bool servermode)
{
ModuleOperPrefixMode(InspIRCd* Me) : Module(Me)
{
ConfigReader Conf(ServerInstance);
- std::string tmp;
- tmp = Conf.ReadValue("operprefix", "prefix", "!", 0, false);
- strlcpy(&prefixchar,tmp.c_str(),2);
+ std::string pfx = Conf.ReadValue("operprefix", "prefix", "!", 0, false);
- opm = new OperPrefixMode(ServerInstance);
+ opm = new OperPrefixMode(ServerInstance, pfx[0]);
if ((!ServerInstance->Modes->AddMode(opm)))
throw ModuleException("Could not add a new mode!");
-
- Implementation eventlist[] = { I_OnPostJoin, I_OnCleanup, I_OnUserQuit, I_OnUserKick, I_OnUserPart };
- ServerInstance->Modules->Attach(eventlist, this, 5);
+
+ Implementation eventlist[] = { I_OnPostJoin, I_OnCleanup, I_OnUserQuit, I_OnUserKick, I_OnUserPart, I_OnOper };
+ ServerInstance->Modules->Attach(eventlist, this, 6);
}
- virtual void PushChanMode(Channel* channel, User* user, bool negate = false)
+ void PushChanMode(Channel* channel, User* user, bool negate = false)
{
if (negate)
DelPrefixChan(user, channel);
else
AddPrefixChan(user, channel);
- char modeline[]="+y";
+ char modeline[] = "+y";
if (negate)
- modeline [0]='-';
+ modeline[0] = '-';
std::vector<std::string> modechange;
modechange.push_back(channel->name);
modechange.push_back(modeline);
virtual void OnPostJoin(User *user, Channel *channel)
{
- // This may look wrong, but I don't think it is.. PushChanMode will send FMODE which should sort it all out.
- if (!IS_LOCAL(user))
- return;
-
if (user && IS_OPER(user))
{
if (user->IsModeSet('H'))
return 0;
}
+ virtual void OnOper(User *user, const std::string&)
+ {
+ if (user && !user->IsModeSet('H'))
+ {
+ for (UCListIter v = user->chans.begin(); v != user->chans.end(); v++)
+ {
+ PushChanMode(v->first, user);
+ }
+ }
+ }
+
virtual ~ModuleOperPrefixMode()
{
ServerInstance->Modes->DelMode(opm);
delete opm;
}
- virtual void CleanUser(User* user, bool quitting=false)
+ void CleanUser(User* user, bool quitting)
{
- if (!IS_LOCAL(user))
- return;
std::set<std::string>* ext;
if (user->GetExt("m_operprefix",ext))
{
for (UCListIter v = user->chans.begin(); v != user->chans.end(); v++)
{
- ModePair ms=opm->ModeSet(NULL, NULL , v->first, user->nick);
+ ModePair ms = opm->ModeSet(NULL, NULL , v->first, user->nick);
if (ms.first)
{
PushChanMode(v->first, user, true);
if (target_type == TYPE_USER)
{
User* user = (User*)item;
- CleanUser(user);
+ CleanUser(user, false);
}
}
virtual Version GetVersion()
{
- return Version("$Id$", VF_COMMON, API_VERSION);
+ return Version("$Id$", VF_COMMON | VF_VENDOR, API_VERSION);
}
};
MODULE_INIT(ModuleOperPrefixMode)
-