public:
KickRejoin() : ModeHandler('J', 1, 0, false, MODETYPE_CHANNEL, false) { }
+ ModePair ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter)
+ {
+ if (channel->IsModeSet('J'))
+ return std::make_pair(true, channel->GetModeParameter('J'));
+ else
+ return std::make_pair(false, parameter);
+ }
+
+ bool CheckTimeStamp(time_t theirs, time_t ours, const std::string &their_param, const std::string &our_param, chanrec* channel)
+ {
+ /* When TS is equal, the alphabetically later one wins */
+ return (their_param < our_param);
+ }
+
ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
{
if (!adding)
{
// Taking the mode off, we need to clean up.
- delaylist* dl = (delaylist*)channel->GetExt("norejoinusers");
+ delaylist* dl;
- if (dl)
+ if (channel->GetExt("norejoinusers", dl))
{
DELETE(dl);
channel->Shrink("norejoinusers");
}
if ((!adding) || (atoi(parameter.c_str()) > 0))
{
+ parameter = ConvToStr(atoi(parameter.c_str()));
+ channel->SetModeParam('J', parameter.c_str(), adding);
+ channel->SetMode('J', adding);
return MODEACTION_ALLOW;
}
else
{
if (chan)
{
- delaylist* dl = (delaylist*)chan->GetExt("norejoinusers");
- log(DEBUG, "m_kicknorejoin.so: tried to grab delay list");
-
- if (dl)
+ delaylist* dl;
+ if (chan->GetExt("norejoinusers", dl))
{
log(DEBUG, "m_kicknorejoin.so: got delay list, iterating over it");
std::vector<userrec*> itemstoremove;
// Now it's empty..
DELETE(dl);
chan->Shrink("norejoinusers");
- }
}
}
- return 0;
}
+ return 0;
+ }
- virtual void OnUserKick(userrec* source, userrec* user, chanrec* chan, const std::string &reason)
+ virtual void OnUserKick(userrec* source, userrec* user, chanrec* chan, const std::string &reason)
+ {
+ if (chan->IsModeSet('J') && (source != user))
{
- if (chan->IsModeSet('J') && (source != user))
+ delaylist* dl;
+ if (!chan->GetExt("norejoinusers", dl))
{
- delaylist* dl = (delaylist*)chan->GetExt("norejoinusers");
-
- if (!dl)
- {
- dl = new delaylist;
- chan->Extend("norejoinusers", (char*)dl);
- }
-
- log(DEBUG, "m_kicknorejoin.so: setting record for %s, %d second delay", user->nick, strtoint(chan->GetModeParameter('J')));
- (*dl)[user] = time(NULL) + strtoint(chan->GetModeParameter('J'));
+ dl = new delaylist;
+ chan->Extend("norejoinusers", dl);
}
+
+ log(DEBUG, "m_kicknorejoin.so: setting record for %s, %d second delay", user->nick, strtoint(chan->GetModeParameter('J')));
+ (*dl)[user] = time(NULL) + strtoint(chan->GetModeParameter('J'));
}
-
- virtual void OnChannelDelete(chanrec* chan)
- {
- delaylist* dl = (delaylist*)chan->GetExt("norejoinusers");
+ }
+
+ virtual void OnChannelDelete(chanrec* chan)
+ {
+ delaylist* dl;
- if (dl)
- {
- DELETE(dl);
+ if (chan->GetExt("norejoinusers", dl))
+ {
+ DELETE(dl);
chan->Shrink("norejoinusers");
}
}