From a5fdf7c546ccb0f70a70543ea8afb54d155a13cc Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 5 Nov 2016 10:36:28 -0400 Subject: irc2sql: fix changing status modes to update ison modes --- modules/extra/stats/irc2sql/irc2sql.cpp | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/modules/extra/stats/irc2sql/irc2sql.cpp b/modules/extra/stats/irc2sql/irc2sql.cpp index 7baa191f5..fc8c12971 100644 --- a/modules/extra/stats/irc2sql/irc2sql.cpp +++ b/modules/extra/stats/irc2sql/irc2sql.cpp @@ -227,10 +227,32 @@ void IRC2SQL::OnJoinChannel(User *u, Channel *c) EventReturn IRC2SQL::OnChannelModeSet(Channel *c, MessageSource &setter, ChannelMode *mode, const Anope::string ¶m) { - query = "UPDATE `" + prefix + "chan` SET modes=@modes@ WHERE channel=@channel@"; - query.SetValue("channel", c->name); - query.SetValue("modes", c->GetModes(true,true)); - this->RunQuery(query); + if (mode->type == MODE_STATUS) + { + User *u = User::Find(param); + if (u == NULL) + return EVENT_CONTINUE; + + ChanUserContainer *cc = u->FindChannel(c); + if (cc == NULL) + return EVENT_CONTINUE; + + query = "UPDATE `" + prefix + "user` AS u, `" + prefix + "ison` AS i, `" + prefix + "chan` AS c" + " SET i.modes=@modes@" + " WHERE u.nick=@nick@ AND c.channel=@channel@" + " AND u.nickid = i.nickid AND c.chanid = i.chanid"; + query.SetValue("nick", u->nick); + query.SetValue("modes", cc->status.Modes()); + query.SetValue("channel", c->name); + this->RunQuery(query); + } + else + { + query = "UPDATE `" + prefix + "chan` SET modes=@modes@ WHERE channel=@channel@"; + query.SetValue("channel", c->name); + query.SetValue("modes", c->GetModes(true,true)); + this->RunQuery(query); + } return EVENT_CONTINUE; } -- cgit From 8be331618c4a49a8cb77624056c88a03fa847571 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 5 Nov 2016 11:07:02 -0400 Subject: ns_group: allow userless execution --- modules/commands/ns_group.cpp | 47 ++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/modules/commands/ns_group.cpp b/modules/commands/ns_group.cpp index 63d0dff10..8583fbdc9 100644 --- a/modules/commands/ns_group.cpp +++ b/modules/commands/ns_group.cpp @@ -77,17 +77,16 @@ class CommandNSGroup : public Command this->SetDesc(_("Join a group")); this->SetSyntax(_("\037[target]\037 \037[password]\037")); this->AllowUnregistered(true); - this->RequireUser(true); } void Execute(CommandSource &source, const std::vector ¶ms) anope_override { - User *u = source.GetUser(); + User *user = source.GetUser(); Anope::string nick; if (params.empty()) { - NickCore* core = u->Account(); + NickCore* core = source.GetAccount(); if (core) nick = core->display; } @@ -108,9 +107,9 @@ class CommandNSGroup : public Command return; } - if (!IRCD->IsNickValid(u->nick)) + if (!IRCD->IsNickValid(source.GetNick())) { - source.Reply(NICK_CANNOT_BE_REGISTERED, u->nick.c_str()); + source.Reply(NICK_CANNOT_BE_REGISTERED, source.GetNick().c_str()); return; } @@ -119,21 +118,21 @@ class CommandNSGroup : public Command { Oper *o = Oper::opers[i]; - if (!u->HasMode("OPER") && u->nick.find_ci(o->name) != Anope::string::npos) + if (user != NULL && !user->HasMode("OPER") && user->nick.find_ci(o->name) != Anope::string::npos) { - source.Reply(NICK_CANNOT_BE_REGISTERED, u->nick.c_str()); + source.Reply(NICK_CANNOT_BE_REGISTERED, user->nick.c_str()); return; } } - NickAlias *target, *na = NickAlias::Find(u->nick); + NickAlias *target, *na = NickAlias::Find(source.GetNick()); const Anope::string &guestnick = Config->GetModule("nickserv")->Get("guestnickprefix", "Guest"); time_t reg_delay = Config->GetModule("nickserv")->Get("regdelay"); unsigned maxaliases = Config->GetModule(this->owner)->Get("maxaliases"); if (!(target = NickAlias::Find(nick))) source.Reply(NICK_X_NOT_REGISTERED, nick.c_str()); - else if (Anope::CurTime < u->lastnickreg + reg_delay) - source.Reply(_("Please wait %d seconds before using the GROUP command again."), (reg_delay + u->lastnickreg) - Anope::CurTime); + else if (user && Anope::CurTime < user->lastnickreg + reg_delay) + source.Reply(_("Please wait %d seconds before using the GROUP command again."), (reg_delay + user->lastnickreg) - Anope::CurTime); else if (target->nc->HasExt("NS_SUSPENDED")) { Log(LOG_COMMAND, source, this) << "and tried to group to SUSPENDED nick " << target->nick; @@ -143,35 +142,35 @@ class CommandNSGroup : public Command source.Reply(_("Your nick is already registered.")); else if (na && *target->nc == *na->nc) source.Reply(_("You are already a member of the group of \002%s\002."), target->nick.c_str()); - else if (na && na->nc != u->Account()) + else if (na && na->nc != source.GetAccount()) source.Reply(NICK_IDENTIFY_REQUIRED); else if (maxaliases && target->nc->aliases->size() >= maxaliases && !target->nc->IsServicesOper()) source.Reply(_("There are too many nicks in your group.")); - else if (u->nick.length() <= guestnick.length() + 7 && - u->nick.length() >= guestnick.length() + 1 && - !u->nick.find_ci(guestnick) && !u->nick.substr(guestnick.length()).find_first_not_of("1234567890")) + else if (source.GetNick().length() <= guestnick.length() + 7 && + source.GetNick().length() >= guestnick.length() + 1 && + !source.GetNick().find_ci(guestnick) && !source.GetNick().substr(guestnick.length()).find_first_not_of("1234567890")) { - source.Reply(NICK_CANNOT_BE_REGISTERED, u->nick.c_str()); + source.Reply(NICK_CANNOT_BE_REGISTERED, source.GetNick().c_str()); } else { bool ok = false; - if (!na && u->Account() == target->nc) + if (!na && source.GetAccount() == target->nc) ok = true; NSCertList *cl = target->nc->GetExt("certificates"); - if (!u->fingerprint.empty() && cl && cl->FindCert(u->fingerprint)) + if (user != NULL && !user->fingerprint.empty() && cl && cl->FindCert(user->fingerprint)) ok = true; if (ok == false && !pass.empty()) { - NSGroupRequest *req = new NSGroupRequest(owner, source, this, u->nick, target, pass); + NSGroupRequest *req = new NSGroupRequest(owner, source, this, source.GetNick(), target, pass); FOREACH_MOD(OnCheckAuthentication, (source.GetUser(), req)); req->Dispatch(); } else { - NSGroupRequest req(owner, source, this, u->nick, target, pass); + NSGroupRequest req(owner, source, this, source.GetNick(), target, pass); if (ok) req.OnSuccess(); @@ -222,20 +221,18 @@ class CommandNSUngroup : public Command { this->SetDesc(_("Remove a nick from a group")); this->SetSyntax(_("[\037nick\037]")); - this->RequireUser(true); } void Execute(CommandSource &source, const std::vector ¶ms) anope_override { - User *u = source.GetUser(); Anope::string nick = !params.empty() ? params[0] : ""; - NickAlias *na = NickAlias::Find(!nick.empty() ? nick : u->nick); + NickAlias *na = NickAlias::Find(!nick.empty() ? nick : source.GetNick()); - if (u->Account()->aliases->size() == 1) + if (source.GetAccount()->aliases->size() == 1) source.Reply(_("Your nick is not grouped to anything, you can't ungroup it.")); else if (!na) - source.Reply(NICK_X_NOT_REGISTERED, !nick.empty() ? nick.c_str() : u->nick.c_str()); - else if (na->nc != u->Account()) + source.Reply(NICK_X_NOT_REGISTERED, !nick.empty() ? nick.c_str() : source.GetNick().c_str()); + else if (na->nc != source.GetAccount()) source.Reply(_("Nick %s is not in your group."), na->nick.c_str()); else { -- cgit