+void CommandFJoin::RemoveStatus(Channel* c)
+{
+ irc::modestacker stack(false);
+
+ for (char modeletter = 'A'; modeletter <= 'z'; ++modeletter)
+ {
+ ModeHandler* mh = ServerInstance->Modes->FindMode(modeletter, MODETYPE_CHANNEL);
+
+ /* Passing a pointer to a modestacker here causes the mode to be put onto the mode stack,
+ * rather than applied immediately. Module unloads require this to be done immediately,
+ * for this function we require tidyness instead. Fixes bug #493
+ */
+ if (mh)
+ mh->RemoveMode(c, stack);
+ }
+
+ ApplyModeStack(ServerInstance->FakeClient, c, stack);
+}
+
+void CommandFJoin::ApplyModeStack(User* srcuser, Channel* c, irc::modestacker& stack)
+{
+ parameterlist stackresult;
+ stackresult.push_back(c->name);
+
+ while (stack.GetStackedLine(stackresult))
+ {
+ ServerInstance->Modes->Process(stackresult, srcuser, ModeParser::MODE_LOCALONLY);
+ stackresult.erase(stackresult.begin() + 1, stackresult.end());
+ }
+}