Add max line length value to modestacker, so that it can clamp the max length of a composed line to a given size. Defaults to 350 which should be safe with fmode and mode with a server name

git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@6609 e03df62e-2008-0410-955e-edbf42e46eb7
This commit is contained in:
brain 2007-02-25 00:11:46 +00:00
parent 3797671382
commit ad8705d3f0
3 changed files with 37 additions and 5 deletions

View File

@ -185,12 +185,20 @@ namespace irc
/** Return zero or more elements which form the
* mode line. This will be clamped to a max of
* MAXMODES+1 items (MAXMODES mode parameters and
* one mode sequence string).
* one mode sequence string), and max_line_size
* characters. As specified below, this function
* should be called in a loop until it returns zero,
* indicating there are no more modes to return.
* @param result The deque to populate. This will
* be cleared before it is used.
* @return The number of elements in the deque
* @param max_line_size The maximum size of the line
* to build, in characters, seperate to MAXMODES.
* @return The number of elements in the deque.
* The function should be called repeatedly until it
* returns 0, in case there are multiple lines of
* mode changes to be obtained.
*/
int GetStackedLine(std::deque<std::string> &result);
int GetStackedLine(std::deque<std::string> &result, int max_line_size = 360);
};
/** irc::tokenstream reads a string formatted as per RFC1459 and RFC2812.

View File

@ -335,19 +335,37 @@ void irc::modestacker::PushMinus()
this->Push('-',"");
}
int irc::modestacker::GetStackedLine(std::deque<std::string> &result)
int irc::modestacker::GetStackedLine(std::deque<std::string> &result, int max_line_size)
{
if (sequence.empty())
{
result.clear();
return 0;
}
int n = 0;
int size = 1; /* Account for initial +/- char */
int nextsize = 0;
result.clear();
result.push_back(adding ? "+" : "-");
while (!sequence[0].empty() && (sequence.size() > 1) && (result.size() < MAXMODES+1))
if (sequence.size() > 1)
nextsize = sequence[1].length();
while (!sequence[0].empty() && (sequence.size() > 1) && (result.size() < MAXMODES+1) && ((size+nextsize) < max_line_size))
{
result[0] += *(sequence[0].begin());
if (!sequence[1].empty())
{
result.push_back(sequence[1]);
size += sequence[1].length() + 2; /* Account for mode character and whitespace */
}
sequence[0].erase(sequence[0].begin());
sequence.erase(sequence.begin() + 1);
if (sequence.size() > 1)
nextsize = sequence[1].length();
n++;
}

View File

@ -81,19 +81,23 @@ class ModuleWaitPong : public Module
{
if(command == "PONG")
{
ServerInstance->Log(DEBUG,"PONG command");
char* pingrpl;
user->GetExt(extenstr, pingrpl);
if(pingrpl)
{
ServerInstance->Log(DEBUG,"PONG command - has extend");
if(strcmp(pingrpl, parameters[0]) == 0)
{
ServerInstance->Log(DEBUG,"PONG command - pong matches ping ");
DELETE(pingrpl);
user->Shrink(extenstr);
return 1;
}
else
{
ServerInstance->Log(DEBUG,"PONG command - pong doesnt match ping");
if(killonbadreply)
userrec::QuitUser(ServerInstance, user, "Incorrect ping reply for registration");
return 1;
@ -101,11 +105,13 @@ class ModuleWaitPong : public Module
}
}
ServerInstance->Log(DEBUG,"PONG command - fall through");
return 0;
}
virtual bool OnCheckReady(userrec* user)
{
ServerInstance->Log(DEBUG,"PONG command - oncheckready");
char* pingrpl;
return (!user->GetExt(extenstr, pingrpl));
}