mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-10 02:59:01 -04:00
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:
parent
3797671382
commit
ad8705d3f0
@ -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.
|
||||||
|
@ -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++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user