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 /** Return zero or more elements which form the
* mode line. This will be clamped to a max of * mode line. This will be clamped to a max of
* MAXMODES+1 items (MAXMODES mode parameters and * 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 * @param result The deque to populate. This will
* be cleared before it is used. * 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. /** irc::tokenstream reads a string formatted as per RFC1459 and RFC2812.

View File

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

View File

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