aboutsummaryrefslogtreecommitdiffstats
path: root/src/mode.cpp
diff options
context:
space:
mode:
authorGravatar Daniel De Graaf2010-02-12 22:18:53 -0600
committerGravatar Daniel De Graaf2010-08-03 17:32:35 -0400
commit47e17d900e006357bfe92c4b42ed68ef23702761 (patch)
treeb25a9895fd1c2ffad9a040b8a36c079afa09775f /src/mode.cpp
parentConvert ban list elements to be Extensible (diff)
Extend ChanModes to use a modestacker for output
Diffstat (limited to 'src/mode.cpp')
-rw-r--r--src/mode.cpp16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/mode.cpp b/src/mode.cpp
index 47e0c5e78..8e3bac191 100644
--- a/src/mode.cpp
+++ b/src/mode.cpp
@@ -236,15 +236,17 @@ irc::modechange::modechange(char modechar, ModeType type, const std::string& par
mode = mh->id;
}
-std::string irc::modestacker::popModeLine(bool use_uid)
+std::string irc::modestacker::popModeLine(bool use_uid, int maxlen, int maxmodes)
{
char pm_now = '\0';
std::string modeline;
std::stringstream params;
- unsigned int nmodes = 0, linelen = 0;
+ int nmodes = 0, linelen = 0;
+ if (maxmodes == 0)
+ maxmodes = ServerInstance->Config->Limits.MaxModes;
std::vector<modechange>::iterator iter = sequence.begin();
- for(; iter != sequence.end() && nmodes < ServerInstance->Config->Limits.MaxModes; ++iter)
+ for(; iter != sequence.end() && nmodes < maxmodes; ++iter)
{
char pm = iter->adding ? '+' : '-';
ModeHandler* mh = ServerInstance->Modes->FindMode(iter->mode);
@@ -279,7 +281,7 @@ std::string irc::modestacker::popModeLine(bool use_uid)
if (!value.empty())
mylen += 1 + value.length();
- if (mylen + linelen + 100 > MAXBUF)
+ if (mylen + linelen > maxlen)
goto line_full;
linelen += mylen;
@@ -296,6 +298,8 @@ std::string irc::modestacker::popModeLine(bool use_uid)
line_full:
sequence.erase(sequence.begin(), iter);
+ if (modeline.empty())
+ return "+";
return modeline + params.str();
}
@@ -303,8 +307,10 @@ void ModeParser::DisplayCurrentModes(User *user, User* targetuser, Channel* targ
{
if (targetchannel)
{
+ irc::modestacker ms;
+ targetchannel->ChanModes(ms, targetchannel->HasUser(user) ? MODELIST_SHORT : MODELIST_PUBLIC);
/* Display channel's current mode string */
- user->WriteNumeric(RPL_CHANNELMODEIS, "%s %s +%s",user->nick.c_str(), targetchannel->name.c_str(), targetchannel->ChanModes(targetchannel->HasUser(user)));
+ user->WriteNumeric(RPL_CHANNELMODEIS, "%s %s %s",user->nick.c_str(), targetchannel->name.c_str(), ms.popModeLine().c_str());
user->WriteNumeric(RPL_CHANNELCREATED, "%s %s %lu", user->nick.c_str(), targetchannel->name.c_str(), (unsigned long)targetchannel->age);
return;
}