summaryrefslogtreecommitdiff
path: root/src/channels.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/channels.cpp')
-rw-r--r--src/channels.cpp164
1 files changed, 62 insertions, 102 deletions
diff --git a/src/channels.cpp b/src/channels.cpp
index 26623c24d..65298ad51 100644
--- a/src/channels.cpp
+++ b/src/channels.cpp
@@ -826,26 +826,26 @@ void Channel::SetModes(BotInfo *bi, bool EnforceMLock, const char *cmodes, ...)
}
}
-/*************************************************************************/
-
-/** Set modes internally on the channel
- * @param c The channel
- * @param ac Number of args
- * @param av args
+/** Set a string of modes internally on a channel
+ * @param setter The setter, if it is a user
+ * @param mode the modes
+ * @param EnforceMLock true to enforce mlock
*/
-void ChanSetInternalModes(Channel *c, int ac, const char **av, User *setter)
+void Channel::SetModesInternal(User *setter, const Anope::string &modes, bool EnforceMLock)
{
- if (!ac)
- return;
+ spacesepstream sep_modes(modes);
+ Anope::string m;
+
+ sep_modes.GetToken(m);
Anope::string modestring;
Anope::string paramstring;
- int k = 0, j = 0, add = -1;
- for (unsigned int i = 0, end = strlen(av[0]); i < end; ++i)
+ int add = -1;
+ for (unsigned int i = 0, end = m.length(); i < end; ++i)
{
ChannelMode *cm;
- switch (av[0][i])
+ switch (m[i])
{
case '+':
modestring += '+';
@@ -858,7 +858,7 @@ void ChanSetInternalModes(Channel *c, int ac, const char **av, User *setter)
default:
if (add == -1)
continue;
- cm = ModeManager::FindChannelModeByChar(av[0][i]);
+ cm = ModeManager::FindChannelModeByChar(m[i]);
if (!cm)
continue;
modestring += cm->ModeChar;
@@ -867,9 +867,9 @@ void ChanSetInternalModes(Channel *c, int ac, const char **av, User *setter)
if (cm->Type == MODE_REGULAR)
{
if (add)
- c->SetModeInternal(cm);
+ this->SetModeInternal(cm, "", EnforceMLock);
else
- c->RemoveModeInternal(cm);
+ this->RemoveModeInternal(cm, "", EnforceMLock);
continue;
}
else if (cm->Type == MODE_PARAM)
@@ -878,32 +878,32 @@ void ChanSetInternalModes(Channel *c, int ac, const char **av, User *setter)
if (!add && cmp->MinusNoArg)
{
- c->RemoveModeInternal(cm);
- ++k;
+ this->RemoveModeInternal(cm, "", EnforceMLock);
continue;
}
}
- if (++j < ac)
+ Anope::string token;
+ if (sep_modes.GetToken(token))
{
User *u = NULL;
- if (cm->Type == MODE_STATUS && (u = finduser(av[j])))
+ if (cm->Type == MODE_STATUS && (u = finduser(token)))
paramstring += " " + u->nick;
else
- paramstring += " " + Anope::string(av[j]);
+ paramstring += " " + token;
+
if (add)
- c->SetModeInternal(cm, av[j]);
+ this->SetModeInternal(cm, token, EnforceMLock);
else
- c->RemoveModeInternal(cm, av[j]);
+ this->RemoveModeInternal(cm, token, EnforceMLock);
}
else
- Log() << "warning: ChanSetInternalModes() recieved more modes requiring params than params, modes: " << merge_args(ac, av) << ", ac: " << ac << ", j: " << j;
+ Log() << "warning: Channel::SetModesInternal() recieved more modes requiring params than params, modes: " << modes;
}
if (setter)
- Log(setter, c, "mode") << modestring << paramstring;
-
- if (j + k + 1 < ac)
- Log() << "warning: ChanSetInternalModes() recieved more params than modes requiring them, modes: " << merge_args(ac, av) << ", ac: " << ac << ", j: " << j << " k: " << k;
+ Log(setter, this, "mode") << modestring << paramstring;
+ else
+ Log(LOG_DEBUG) << "Setting " << this->name << " to " << modestring << paramstring;
}
/** Kick a user from a channel internally
@@ -1127,22 +1127,21 @@ User *nc_on_chan(Channel *c, const NickCore *nc)
/*************************** Message Handling ****************************/
/*************************************************************************/
-/* Handle a JOIN command.
- * av[0] = channels to join
+/** Handle a JOIN command
+ * @param source user joining
+ * @param channels being joined
+ * @param ts TS for the join
*/
-
-void do_join(const Anope::string &source, int ac, const char **av)
+void do_join(const Anope::string &source, const Anope::string &channels, const Anope::string &ts)
{
- User *user;
-
- user = finduser(source);
+ User *user = finduser(source);
if (!user)
{
- Log() << "JOIN from nonexistent user " << source << ": " << merge_args(ac, av);
+ Log() << "JOIN from nonexistent user " << source << ": " << channels;
return;
}
- commasepstream sep(av[0]);
+ commasepstream sep(channels);
Anope::string buf;
while (sep.GetToken(buf))
{
@@ -1165,18 +1164,18 @@ void do_join(const Anope::string &source, int ac, const char **av)
/* Channel doesn't exist, create it */
if (!chan)
- chan = new Channel(av[0], Anope::CurTime);
+ chan = new Channel(buf, Anope::CurTime);
/* Join came with a TS */
- if (ac == 2)
+ if (!ts.empty())
{
- time_t ts = Anope::string(av[1]).is_pos_number_only() ? convertTo<time_t>(av[1]) : 0;
+ time_t t = Anope::string(ts).is_pos_number_only() ? convertTo<time_t>(ts) : 0;
/* Their time is older, we lose */
- if (chan->creation_time > ts)
+ if (t && chan->creation_time > t)
{
Log(LOG_DEBUG) << "Recieved an older TS " << chan->name << " in JOIN, changing from " << chan->creation_time << " to " << ts;
- chan->creation_time = ts;
+ chan->creation_time = t;
chan->Reset();
}
@@ -1205,41 +1204,36 @@ void do_join(const Anope::string &source, int ac, const char **av)
/** Handle a KICK command.
* @param source The source of the kick
- * @param ac number of args
- * @param av The channel, nick(s) being kicked, and reason
+ * @param users the user(s) being kicked
+ * @param reason The reason for the kick
*/
-void do_kick(const Anope::string &source, int ac, const char **av)
+void do_kick(const Anope::string &source, const Anope::string &channel, const Anope::string &users, const Anope::string &reason)
{
- Channel *c = findchan(av[0]);
+ Channel *c = findchan(channel);
if (!c)
{
- Log() << "Recieved kick for nonexistant channel " << av[0];
+ Log() << "Recieved kick for nonexistant channel " << channel;
return;
}
Anope::string buf;
- commasepstream sep(av[1]);
+ commasepstream sep(users);
while (sep.GetToken(buf))
- c->KickInternal(source, buf, av[2]);
+ c->KickInternal(source, buf, reason);
}
/*************************************************************************/
-/* Handle a PART command.
- * av[0] = channels to leave
- * av[1] = reason (optional)
- */
-
-void do_part(const Anope::string &source, int ac, const char **av)
+void do_part(const Anope::string &source, const Anope::string &channels, const Anope::string &reason)
{
User *user = finduser(source);
if (!user)
{
- Log() << "PART from nonexistent user " << source << ": " << merge_args(ac, av);
+ Log() << "PART from nonexistent user " << source << ": " << reason;
return;
}
- commasepstream sep(av[0]);
+ commasepstream sep(channels);
Anope::string buf;
while (sep.GetToken(buf))
{
@@ -1249,11 +1243,11 @@ void do_part(const Anope::string &source, int ac, const char **av)
Log() << "Recieved PART from " << user->nick << " for nonexistant channel " << buf;
else if (user->FindChannel(c))
{
- Log(user, c, "part") << "Reason: " << (av[1] ? av[1] : "No reason");
+ Log(user, c, "part") << "Reason: " << (!reason.empty() ? reason : "No reason");
FOREACH_MOD(I_OnPrePartChannel, OnPrePartChannel(user, c));
Anope::string ChannelName = c->name;
c->DeleteUser(user);
- FOREACH_MOD(I_OnPartChannel, OnPartChannel(user, findchan(ChannelName), ChannelName, av[1] ? av[1] : ""));
+ FOREACH_MOD(I_OnPartChannel, OnPartChannel(user, findchan(ChannelName), ChannelName, !reason.empty() ? reason : ""));
}
else
Log() << "Recieved PART from " << user->nick << " for " << c->name << ", but " << user->nick << " isn't in " << c->name << "?";
@@ -1265,53 +1259,22 @@ void do_part(const Anope::string &source, int ac, const char **av)
/** Process a MODE command from the server, and set the modes on the user/channel
* it was sent for
* @param source The source of the command
- * @param ac Number of args in array..
- * @param av Array of args
+ * @param channel the channel to change modes on
+ * @param modes the mode changes
+ * @param ts the timestamp for the modes
*/
-void do_cmode(const Anope::string &source, int ac, const char **av)
+void do_cmode(const Anope::string &source, const Anope::string &channel, const Anope::string &modes, const Anope::string &ts)
{
- Channel *c;
- ChannelInfo *ci;
- unsigned i, end;
- const char *t;
-
- if (Capab.HasFlag(CAPAB_TSMODE))
- {
- for (i = 0, end = strlen(av[1]); i < end; ++i)
- if (!isdigit(av[1][i]))
- break;
- if (!av[1][i])
- {
- t = av[0];
- av[0] = av[1];
- av[1] = t;
- --ac;
- ++av;
- }
- else
- Log() << "TSMODE enabled but MODE has no valid TS";
- }
-
- /* :42XAAAAAO TMODE 1106409026 #ircops +b *!*@*.aol.com */
- if (ircd->ts6 && isdigit(av[0][0]))
- {
- --ac;
- ++av;
- }
-
- c = findchan(av[0]);
+ Channel *c = findchan(channel);
if (!c)
{
- if (debug)
- {
- ci = cs_findchan(av[0]);
- if (!ci || ci->HasFlag(CI_FORBIDDEN))
- Log(LOG_DEBUG) << "MODE " << merge_args(ac - 1, av + 1) << " for nonexistant channel " << av[0];
- }
+ Log(LOG_DEBUG) << "MODE " << modes << " for nonexistant channel " << channel;
return;
}
- if (source.find('.') != Anope::string::npos && Anope::string(av[1]).find_first_of("bovahq") == Anope::string::npos) // XXX
+ Log(LOG_DEBUG) << "MODE " << channel << " " << modes << " ts: " << ts;
+
+ if (source.find('.') != Anope::string::npos)
{
if (Anope::CurTime != c->server_modetime)
{
@@ -1321,10 +1284,7 @@ void do_cmode(const Anope::string &source, int ac, const char **av)
++c->server_modecount;
}
- --ac;
- ++av;
-
- ChanSetInternalModes(c, ac, av);
+ c->SetModesInternal(finduser(source), modes);
}
/*************************************************************************/