summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/configreader.cpp3
-rw-r--r--src/mode.cpp25
-rw-r--r--src/modes/cmode_h.cpp2
-rw-r--r--src/modes/cmode_o.cpp2
-rw-r--r--src/modes/cmode_v.cpp3
-rw-r--r--src/users.cpp16
6 files changed, 46 insertions, 5 deletions
diff --git a/src/configreader.cpp b/src/configreader.cpp
index a9e34a716..d8651766d 100644
--- a/src/configreader.cpp
+++ b/src/configreader.cpp
@@ -37,7 +37,7 @@ ServerConfig::ServerConfig(InspIRCd* Instance) : ServerInstance(Instance)
*OperOnlyStats = *ModPath = *MyExecutable = *DisabledCommands = *PID = '\0';
log_file = NULL;
NoUserDns = forcedebug = OperSpyWhois = nofork = HideBans = HideSplits = false;
- writelog = AllowHalfop = true;
+ CycleHosts = writelog = AllowHalfop = true;
dns_timeout = DieDelay = 5;
MaxTargets = 20;
NetBufferSize = 10240;
@@ -560,6 +560,7 @@ void ServerConfig::Read(bool bail, userrec* user)
{"options", "tempdir", &this->TempDir, DT_CHARPTR, ValidateTempDir},
{"options", "nouserdns", &this->NoUserDns, DT_BOOLEAN, NoValidation},
{"options", "syntaxhints", &this->SyntaxHints, DT_BOOLEAN, NoValidation},
+ {"options", "cyclehosts", &this->CycleHosts, DT_BOOLEAN, NoValidation},
{"pid", "file", &this->PID, DT_CHARPTR, NoValidation},
{NULL}
};
diff --git a/src/mode.cpp b/src/mode.cpp
index 8351ab2e0..5ae457b68 100644
--- a/src/mode.cpp
+++ b/src/mode.cpp
@@ -666,6 +666,31 @@ ModeHandler* ModeParser::FindPrefix(unsigned const char pfxletter)
return NULL;
}
+std::string ModeParser::ModeString(userrec* user, chanrec* channel)
+{
+ std::string types;
+ std::string pars;
+
+ for (unsigned char mode = 'A'; mode <= 'z'; mode++)
+ {
+ unsigned char pos = (mode-65) | MASK_CHANNEL;
+ ModeHandler* mh = modehandlers[pos];
+ if ((mh) && (mh->GetNumParams(true)) && (mh->GetNumParams(false)))
+ {
+ ModePair ret;
+ ret = mh->ModeSet(NULL, user, channel, user->nick);
+ if (ret.first)
+ {
+ pars.append(" ");
+ pars.append(user->nick);
+ types.push_back(mh->GetModeChar());
+ }
+ }
+ }
+
+ return types+pars;
+}
+
std::string ModeParser::ChanModes()
{
std::string type1; /* Listmodes EXCEPT those with a prefix */
diff --git a/src/modes/cmode_h.cpp b/src/modes/cmode_h.cpp
index 1b0370439..d58fb94c9 100644
--- a/src/modes/cmode_h.cpp
+++ b/src/modes/cmode_h.cpp
@@ -28,7 +28,7 @@ ModePair ModeChannelHalfOp::ModeSet(userrec* source, userrec* dest, chanrec* cha
userrec* x = ServerInstance->FindNick(parameter);
if (x)
{
- if (channel->GetStatus(x) == STATUS_HOP)
+ if (channel->GetStatusFlags(x) & UCMODE_HOP)
{
return std::make_pair(true, x->nick);
}
diff --git a/src/modes/cmode_o.cpp b/src/modes/cmode_o.cpp
index c631ec779..bed7da615 100644
--- a/src/modes/cmode_o.cpp
+++ b/src/modes/cmode_o.cpp
@@ -28,7 +28,7 @@ ModePair ModeChannelOp::ModeSet(userrec* source, userrec* dest, chanrec* channel
userrec* x = ServerInstance->FindNick(parameter);
if (x)
{
- if (channel->GetStatus(x) == STATUS_OP)
+ if (channel->GetStatusFlags(x) & UCMODE_OP)
{
return std::make_pair(true, x->nick);
}
diff --git a/src/modes/cmode_v.cpp b/src/modes/cmode_v.cpp
index 7b14d84d4..f12d9f9cf 100644
--- a/src/modes/cmode_v.cpp
+++ b/src/modes/cmode_v.cpp
@@ -7,7 +7,6 @@
#include "mode.h"
#include "channels.h"
#include "users.h"
-
#include "commands.h"
#include "modules.h"
#include "inspstring.h"
@@ -28,7 +27,7 @@ ModePair ModeChannelVoice::ModeSet(userrec* source, userrec* dest, chanrec* chan
userrec* x = ServerInstance->FindNick(parameter);
if (x)
{
- if (channel->GetStatus(x) == STATUS_VOICE)
+ if (channel->GetStatusFlags(x) & UCMODE_VOICE)
{
return std::make_pair(true, x->nick);
}
diff --git a/src/users.cpp b/src/users.cpp
index 085440367..031333dfc 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -1632,8 +1632,24 @@ bool userrec::ChangeDisplayedHost(const char* host)
return false;
FOREACH_MOD(I_OnChangeHost,OnChangeHost(this,host));
}
+ if (this->ServerInstance->Config->CycleHosts)
+ this->WriteCommonExcept("QUIT :Changing hosts");
+
strlcpy(this->dhost,host,63);
+ if (this->ServerInstance->Config->CycleHosts)
+ {
+ for (std::vector<ucrec*>::const_iterator i = this->chans.begin(); i != this->chans.end(); i++)
+ {
+ if ((*i)->channel)
+ {
+ (*i)->channel->WriteAllExceptSender(this, 0, "JOIN %s", (*i)->channel->name);
+ (*i)->channel->WriteChannelWithServ(this->ServerInstance->Config->ServerName, "MODE %s +%s",
+ (*i)->channel->name, this->ServerInstance->Modes->ModeString(this, (*i)->channel).c_str());
+ }
+ }
+ }
+
if (IS_LOCAL(this))
this->WriteServ("396 %s %s :is now your hidden host",this->nick,this->dhost);