bool notice;
bool op;
ModeHandler* npmh;
- CommandOjoin(Module* parent) :
- SplitCommand(parent, "OJOIN", 1)
+ CommandOjoin(Module* parent, ModeHandler& mode)
+ : SplitCommand(parent, "OJOIN", 1)
+ , npmh(&mode)
{
flags_needed = 'o'; Penalty = 0; syntax = "<channel>";
active = false;
}
else
{
+ channel = ServerInstance->FindChan(parameters[0]);
+ if (!channel)
+ return CMD_FAILURE;
+
ServerInstance->SNO->WriteGlobalSno('a', user->nick+" used OJOIN in "+parameters[0]);
// they're already in the channel
- std::vector<std::string> modes;
- modes.push_back(parameters[0]);
- modes.push_back(std::string("+") + npmh->GetModeChar());
+ Modes::ChangeList changelist;
+ changelist.push_add(npmh, user->nick);
if (op)
- {
- modes[1].push_back('o');
- modes.push_back(user->nick);
- }
- modes.push_back(user->nick);
- ServerInstance->Modes->Process(modes, ServerInstance->FakeClient);
+ changelist.push_add(ServerInstance->Modes->FindMode('o', MODETYPE_CHANNEL), user->nick);
+ ServerInstance->Modes->Process(ServerInstance->FakeClient, channel, NULL, changelist);
}
return CMD_SUCCESS;
}
class ModuleOjoin : public Module
{
- NetworkPrefix* np;
+ NetworkPrefix np;
CommandOjoin mycommand;
public:
ModuleOjoin()
- : np(NULL), mycommand(this)
+ : np(this, ServerInstance->Config->ConfValue("ojoin")->getString("prefix").c_str()[0])
+ , mycommand(this, np)
{
}
- void init() CXX11_OVERRIDE
- {
- std::string npre = ServerInstance->Config->ConfValue("ojoin")->getString("prefix");
- char NPrefix = npre.empty() ? 0 : npre[0];
-
- /* Initialise module variables */
- np = new NetworkPrefix(this, NPrefix);
- mycommand.npmh = np;
-
- ServerInstance->Modules->AddService(*np);
- }
-
ModResult OnUserPreJoin(LocalUser* user, Channel* chan, const std::string& cname, std::string& privs, const std::string& keygiven) CXX11_OVERRIDE
{
if (mycommand.active)
{
- privs += np->GetModeChar();
+ privs += np.GetModeChar();
if (mycommand.op)
privs += 'o';
return MOD_RES_ALLOW;
ModResult OnUserPreKick(User* source, Membership* memb, const std::string &reason) CXX11_OVERRIDE
{
// Don't do anything if they're not +Y
- if (!memb->hasMode(np->GetModeChar()))
+ if (!memb->hasMode(np.GetModeChar()))
return MOD_RES_PASSTHRU;
// Let them do whatever they want to themselves.
return MOD_RES_DENY;
}
- ~ModuleOjoin()
- {
- delete np;
- }
-
void Prioritize()
{
ServerInstance->Modules->SetPriority(this, I_OnUserPreJoin, PRIORITY_FIRST);