X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_chanhistory.cpp;h=e8a516b947aa8c1f2b7c3c95a2d0917893aa47f1;hb=57e4bf97250a20f0b54957f2d5aabf02f158c171;hp=f1f9ed614907e79f401f5ec67f67853a402f9ad4;hpb=1031f333332cf1b09db4fd632f141143ee637c34;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_chanhistory.cpp b/src/modules/m_chanhistory.cpp index f1f9ed614..e8a516b94 100644 --- a/src/modules/m_chanhistory.cpp +++ b/src/modules/m_chanhistory.cpp @@ -30,10 +30,13 @@ struct HistoryList { std::deque lines; unsigned int maxlen, maxtime; - HistoryList(unsigned int len, unsigned int time) : maxlen(len), maxtime(time) {} + std::string param; + + HistoryList(unsigned int len, unsigned int time, const std::string& oparam) + : maxlen(len), maxtime(time), param(oparam) { } }; -class HistoryMode : public ModeHandler +class HistoryMode : public ParamMode > { bool IsValidDuration(const std::string& duration) { @@ -50,57 +53,53 @@ class HistoryMode : public ModeHandler } public: - SimpleExtItem ext; unsigned int maxlines; - HistoryMode(Module* Creator) : ModeHandler(Creator, "history", 'H', PARAM_SETONLY, MODETYPE_CHANNEL), - ext("history", Creator) { } + HistoryMode(Module* Creator) + : ParamMode >(Creator, "history", 'H') + { + } - ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding) + ModeAction OnSet(User* source, Channel* channel, std::string& parameter) CXX11_OVERRIDE { - if (adding) + std::string::size_type colon = parameter.find(':'); + if (colon == std::string::npos) + return MODEACTION_DENY; + + std::string duration(parameter, colon+1); + if ((IS_LOCAL(source)) && ((duration.length() > 10) || (!IsValidDuration(duration)))) + return MODEACTION_DENY; + + unsigned int len = ConvToInt(parameter.substr(0, colon)); + unsigned int time = InspIRCd::Duration(duration); + if (len == 0) + return MODEACTION_DENY; + if (len > maxlines && IS_LOCAL(source)) + return MODEACTION_DENY; + if (len > maxlines) + len = maxlines; + + HistoryList* history = ext.get(channel); + if (history) { - std::string::size_type colon = parameter.find(':'); - if (colon == std::string::npos) - return MODEACTION_DENY; - - std::string duration = parameter.substr(colon+1); - if ((IS_LOCAL(source)) && ((duration.length() > 10) || (!IsValidDuration(duration)))) - return MODEACTION_DENY; - - unsigned int len = ConvToInt(parameter.substr(0, colon)); - int time = InspIRCd::Duration(duration); - if (len == 0 || time < 0) - return MODEACTION_DENY; - if (len > maxlines && IS_LOCAL(source)) - return MODEACTION_DENY; - if (len > maxlines) - len = maxlines; - if (parameter == channel->GetModeParameter(this)) - return MODEACTION_DENY; - - HistoryList* history = ext.get(channel); - if (history) - { - // Shrink the list if the new line number limit is lower than the old one - if (len < history->lines.size()) - history->lines.erase(history->lines.begin(), history->lines.begin() + (history->lines.size() - len)); + // Shrink the list if the new line number limit is lower than the old one + if (len < history->lines.size()) + history->lines.erase(history->lines.begin(), history->lines.begin() + (history->lines.size() - len)); - history->maxlen = len; - history->maxtime = time; - } - else - { - ext.set(channel, new HistoryList(len, time)); - } + history->maxlen = len; + history->maxtime = time; + history->param = parameter; } else { - if (!channel->IsModeSet(this)) - return MODEACTION_DENY; - ext.unset(channel); + ext.set(channel, new HistoryList(len, time, parameter)); } return MODEACTION_ALLOW; } + + void SerializeParam(Channel* chan, const HistoryList* history, std::string& out) + { + out.append(history->param); + } }; class ModuleChanHistory : public Module @@ -114,18 +113,10 @@ class ModuleChanHistory : public Module { } - void init() CXX11_OVERRIDE - { - ServerInstance->Modules->AddService(m); - ServerInstance->Modules->AddService(m.ext); - - OnRehash(NULL); - } - - void OnRehash(User*) CXX11_OVERRIDE + void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE { ConfigTag* tag = ServerInstance->Config->ConfValue("chanhistory"); - m.maxlines = tag->getInt("maxlines", 50); + m.maxlines = tag->getInt("maxlines", 50, 1); sendnotice = tag->getBool("notice", true); dobots = tag->getBool("bots", true); } @@ -163,7 +154,10 @@ class ModuleChanHistory : public Module if (sendnotice) { - memb->user->WriteNotice("Replaying up to " + ConvToStr(list->maxlen) + " lines of pre-join history spanning up to " + ConvToStr(list->maxtime) + " seconds"); + std::string message("Replaying up to " + ConvToStr(list->maxlen) + " lines of pre-join history"); + if (list->maxtime > 0) + message.append(" spanning up to " + ConvToStr(list->maxtime) + " seconds"); + memb->WriteNotice(message); } for(std::deque::iterator i = list->lines.begin(); i != list->lines.end(); ++i)