1
0
mirror of https://github.com/anope/anope.git synced 2026-06-30 12:06:38 +02:00

Merge branch '1.9' of ssh://anope.git.sourceforge.net/gitroot/anope/anope into 1.9

This commit is contained in:
DukePyrolator
2010-12-24 06:42:55 +01:00
18 changed files with 295 additions and 361 deletions
-8
View File
@@ -293,14 +293,6 @@ E bool is_on_access(const User *u, const NickCore *nc);
/**** process.c ****/
E int allow_ignore;
E std::list<IgnoreData *> ignore;
E void add_ignore(const Anope::string &nick, time_t delta);
E IgnoreData *get_ignore(const Anope::string &nick);
E int delete_ignore(const Anope::string &nick);
E int clear_ignores();
E void process(const Anope::string &buf);
/**** send.c ****/
-4
View File
@@ -998,9 +998,6 @@ enum LanguageString
OPER_SZLINE_VIEW_HEADER,
OPER_SZLINE_CLEAR,
OPER_SET_SYNTAX,
OPER_SET_IGNORE_ON,
OPER_SET_IGNORE_OFF,
OPER_SET_IGNORE_ERROR,
OPER_SET_READONLY_ON,
OPER_SET_READONLY_OFF,
OPER_SET_READONLY_ERROR,
@@ -1458,7 +1455,6 @@ enum LanguageString
OPER_HELP_SET_DEBUG,
OPER_HELP_SET_NOEXPIRE,
OPER_HELP_SET_SUPERADMIN,
OPER_HELP_SET_IGNORE,
OPER_HELP_SET_LIST,
OPER_HELP_NOOP,
OPER_HELP_JUPE,
+9 -1
View File
@@ -1026,6 +1026,14 @@ class CoreExport Module : public Extensible
* @param s Our uplink
*/
virtual void OnUplinkSync(Server *s) { }
/** Called when we receive a PRIVMSG for one of our clients
* @param u The user sending the PRIVMSG
* @param bi The target of the PRIVMSG
* @param message The message
* @return EVENT_STOP to halt processing
*/
virtual EventReturn OnBotPrivmsg(User *u, BotInfo *bi, const Anope::string &message) { return EVENT_CONTINUE; }
};
/** Implementation-specific flags which may be set in ModuleManager::Attach()
@@ -1078,7 +1086,7 @@ enum Implementation
I_OnServerQuit, I_OnTopicUpdated,
I_OnEncrypt, I_OnEncryptCheckLen, I_OnDecrypt, I_OnCheckPassword,
I_OnChannelModeSet, I_OnChannelModeUnset, I_OnUserModeSet, I_OnUserModeUnset, I_OnChannelModeAdd, I_OnUserModeAdd,
I_OnMLock, I_OnUnMLock, I_OnServerSync, I_OnUplinkSync,
I_OnMLock, I_OnUnMLock, I_OnServerSync, I_OnUplinkSync, I_OnBotPrivmsg,
I_END
};
-10
View File
@@ -793,16 +793,6 @@ class Entry : public Flags<EntryType>
/*************************************************************************/
/* Ignorance list data. */
struct IgnoreData
{
Anope::string mask;
time_t time; /* When do we stop ignoring them? */
};
/*************************************************************************/
/* News stuff */
enum NewsType
+214 -45
View File
@@ -12,14 +12,147 @@
/*************************************************************************/
#include "module.h"
#include "os_ignore.h"
class OSIgnoreService : public IgnoreService
{
public:
OSIgnoreService(Module *o, const Anope::string &n) : IgnoreService(o, n) { }
void AddIgnore(const Anope::string &mask, const Anope::string &creator, const Anope::string &reason, time_t delta = Anope::CurTime)
{
/* If it s an existing user, we ignore the hostmask. */
Anope::string realmask = mask;
size_t user, host;
User *u = finduser(mask);
if (u)
realmask = "*!*@" + u->host;
/* Determine whether we get a nick or a mask. */
else if ((host = mask.find('@')) != Anope::string::npos)
{
/* Check whether we have a nick too.. */
if ((user = mask.find('!')) != Anope::string::npos)
{
/* this should never happen */
if (user > host)
return;
}
else
/* We have user@host. Add nick wildcard. */
realmask = "*!" + mask;
}
/* We only got a nick.. */
else
realmask = mask + "!*@*";
/* Check if we already got an identical entry. */
IgnoreData *ign = this->Find(realmask);
if (ign != NULL)
{
if (!delta)
ign->time = 0;
else
ign->time = Anope::CurTime + delta;
}
/* Create new entry.. */
else
{
IgnoreData newign;
newign.mask = realmask;
newign.creator = creator;
newign.reason = reason;
newign.time = delta ? Anope::CurTime + delta : 0;
this->ignores.push_back(newign);
}
}
bool DelIgnore(const Anope::string &mask)
{
for (std::list<IgnoreData>::iterator it = this->ignores.begin(), it_end = this->ignores.end(); it != it_end; ++it)
{
IgnoreData &idn = *it;
if (idn.mask.equals_ci(mask))
{
this->ignores.erase(it);
return true;
}
}
return false;
}
IgnoreData *Find(const Anope::string &mask)
{
User *u = finduser(mask);
std::list<IgnoreData>::iterator ign = this->ignores.begin(), ign_end = this->ignores.end();
if (u)
{
for (; ign != ign_end; ++ign)
{
Entry ignore_mask(ign->mask);
if (ignore_mask.Matches(u))
break;
}
}
else
{
size_t user, host;
Anope::string tmp;
/* We didn't get a user.. generate a valid mask. */
if ((host = mask.find('@')) != Anope::string::npos)
{
if ((user = mask.find('!')) != Anope::string::npos)
{
/* this should never happen */
if (user > host)
return NULL;
tmp = mask;
}
else
/* We have user@host. Add nick wildcard. */
tmp = "*!" + mask;
}
/* We only got a nick.. */
else
tmp = mask + "!*@*";
for (; ign != ign_end; ++ign)
if (Anope::Match(tmp, ign->mask))
break;
}
/* Check whether the entry has timed out */
if (ign != ign_end)// && (*ign)->time && (*ign)->time <= Anope::CurTime)
{
IgnoreData &id = *ign;
if (id.time && id.time <= Anope::CurTime)
{
Log(LOG_DEBUG) << "Expiring ignore entry " << id.mask;
this->ignores.erase(ign);
}
else
return &id;
}
return NULL;
}
};
class CommandOSIgnore : public Command
{
private:
CommandReturn DoAdd(CommandSource &source, const std::vector<Anope::string> &params)
{
service_reference<IgnoreService> ignore_service("operserv/ignore");
if (!ignore_service)
return MOD_CONT;
const Anope::string &time = params.size() > 1 ? params[1] : "";
const Anope::string &nick = params.size() > 2 ? params[2] : "";
const Anope::string &reason = params.size() > 3 ? params[3] : "";
if (time.empty() || nick.empty())
{
@@ -35,16 +168,12 @@ class CommandOSIgnore : public Command
source.Reply(OPER_IGNORE_VALID_TIME);
return MOD_CONT;
}
else if (!t)
{
add_ignore(nick, t);
ignore_service->AddIgnore(nick, source.u->nick, reason, t);
if (!t)
source.Reply(OPER_IGNORE_PERM_DONE, nick.c_str());
}
else
{
add_ignore(nick, t);
source.Reply(OPER_IGNORE_TIME_DONE, nick.c_str(), time.c_str());
}
}
return MOD_CONT;
@@ -52,46 +181,58 @@ class CommandOSIgnore : public Command
CommandReturn DoList(CommandSource &source)
{
if (ignore.empty())
{
source.Reply(OPER_IGNORE_LIST_EMPTY);
service_reference<IgnoreService> ignore_service("operserv/ignore");
if (!ignore_service)
return MOD_CONT;
}
source.Reply(OPER_IGNORE_LIST);
for (std::list<IgnoreData *>::iterator ign = ignore.begin(), ign_end = ignore.end(); ign != ign_end; ++ign)
source.Reply("%s", (*ign)->mask.c_str());
const std::list<IgnoreData> &ignores = ignore_service->GetIgnores();
if (ignores.empty())
source.Reply(OPER_IGNORE_LIST_EMPTY);
else
{
source.Reply(OPER_IGNORE_LIST);
for (std::list<IgnoreData>::const_iterator ign = ignores.begin(), ign_end = ignores.end(); ign != ign_end; ++ign)
{
const IgnoreData &ignore = *ign;
source.Reply(" %-11s %-11s %-11s %s", ignore.mask.c_str(), ignore.creator.c_str(), ignore.reason.c_str(), do_strftime(ignore.time).c_str());
}
}
return MOD_CONT;
}
CommandReturn DoDel(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string nick = params.size() > 1 ? params[1] : "";
service_reference<IgnoreService> ignore_service("operserv/ignore");
if (!ignore_service)
return MOD_CONT;
const Anope::string nick = params.size() > 1 ? params[1] : "";
if (nick.empty())
this->OnSyntaxError(source, "DEL");
else if (ignore_service->DelIgnore(nick))
source.Reply(OPER_IGNORE_DEL_DONE, nick.c_str());
else
{
if (delete_ignore(nick))
{
source.Reply(OPER_IGNORE_DEL_DONE, nick.c_str());
return MOD_CONT;
}
source.Reply(OPER_IGNORE_LIST_NOMATCH, nick.c_str());
}
return MOD_CONT;
}
CommandReturn DoClear(CommandSource &source)
{
clear_ignores();
service_reference<IgnoreService> ignore_service("operserv/ignore");
if (!ignore_service)
return MOD_CONT;
ignore_service->ClearIgnores();
source.Reply(OPER_IGNORE_LIST_CLEARED);
return MOD_CONT;
}
public:
CommandOSIgnore() : Command("IGNORE", 1, 3, "operserv/ignore")
CommandOSIgnore() : Command("IGNORE", 1, 4, "operserv/ignore")
{
}
@@ -132,30 +273,38 @@ class CommandOSIgnore : public Command
class OSIgnore : public Module
{
OSIgnoreService osignoreservice;
CommandOSIgnore commandosignore;
public:
OSIgnore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator)
OSIgnore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator), osignoreservice(this, "operserv/ignore")
{
this->SetAuthor("Anope");
this->SetType(CORE);
this->AddCommand(OperServ, &commandosignore);
Implementation i[] = { I_OnDatabaseRead, I_OnDatabaseWrite };
ModuleManager::Attach(i, this, 2);
Implementation i[] = { I_OnDatabaseRead, I_OnDatabaseWrite, I_OnPreCommandRun, I_OnBotPrivmsg };
ModuleManager::Attach(i, this, 4);
ModuleManager::RegisterService(&this->osignoreservice);
}
EventReturn OnDatabaseRead(const std::vector<Anope::string> &params)
{
if (params[0].equals_ci("OS") && params.size() >= 4 && params[1].equals_ci("IGNORE"))
if (params.size() >= 4 && params[0].equals_ci("OS") && params[1].equals_ci("IGNORE"))
{
IgnoreData *ign = new IgnoreData();
ign->mask = params[2];
ign->time = params[3].is_pos_number_only() ? convertTo<time_t>(params[3]) : 0;
ignore.push_front(ign);
service_reference<IgnoreService> ignore_service("operserv/ignore");
if (ignore_service)
{
const Anope::string &mask = params[2];
time_t time = params[3].is_pos_number_only() ? convertTo<time_t>(params[3]) : 0;
const Anope::string &creator = params.size() > 4 ? params[4] : "";
const Anope::string &reason = params.size() > 5 ? params[5] : "";
ignore_service->AddIgnore(mask, creator, reason, time - Anope::CurTime);
return EVENT_STOP;
return EVENT_STOP;
}
}
return EVENT_CONTINUE;
@@ -163,23 +312,43 @@ class OSIgnore : public Module
void OnDatabaseWrite(void (*Write)(const Anope::string &))
{
for (std::list<IgnoreData *>::iterator ign = ignore.begin(), ign_end = ignore.end(); ign != ign_end; )
service_reference<IgnoreService> ignore_service("operserv/ignore");
if (ignore_service)
{
if ((*ign)->time && (*ign)->time <= Anope::CurTime)
for (std::list<IgnoreData>::iterator ign = ignore_service->GetIgnores().begin(), ign_end = ignore_service->GetIgnores().end(); ign != ign_end; )
{
Log(LOG_DEBUG) << "[os_ignore] Expiring ignore entry " << (*ign)->mask;
delete *ign;
ign = ignore.erase(ign);
}
else
{
std::stringstream buf;
buf << "OS IGNORE " << (*ign)->mask << " " << (*ign)->time;
Write(buf.str());
++ign;
if (ign->time && ign->time <= Anope::CurTime)
{
Log(LOG_DEBUG) << "[os_ignore] Expiring ignore entry " << ign->mask;
ign = ignore_service->GetIgnores().erase(ign);
}
else
{
std::stringstream buf;
buf << "OS IGNORE " << ign->mask << " " << ign->time << " " << ign->creator << " :" << ign->reason;
Write(buf.str());
++ign;
}
}
}
}
EventReturn OnPreCommandRun(User *&u, BotInfo *&bi, Anope::string &command, Anope::string &message, ChannelInfo *&ci)
{
return this->OnBotPrivmsg(u, bi, message);
}
EventReturn OnBotPrivmsg(User *u, BotInfo *bi, const Anope::string &message)
{
service_reference<IgnoreService> ignore_service("operserv/ignore");
if (ignore_service)
{
if (ignore_service->Find(u->nick))
return EVENT_STOP;
}
return EVENT_CONTINUE;
}
};
MODULE_INIT(OSIgnore)
+39
View File
@@ -0,0 +1,39 @@
/* OperServ ignore interface
*
* (C) 2003-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
*
* Based on the original code of Epona by Lara.
* Based on the original code of Services by Andy Church.
*/
struct IgnoreData
{
Anope::string mask;
Anope::string creator;
Anope::string reason;
time_t time; /* When do we stop ignoring them? */
};
class IgnoreService : public Service
{
protected:
std::list<IgnoreData> ignores;
IgnoreService(Module *c, const Anope::string &n) : Service(c, n) { }
public:
virtual void AddIgnore(const Anope::string &mask, const Anope::string &creator, const Anope::string &reason, time_t delta = Anope::CurTime) = 0;
virtual bool DelIgnore(const Anope::string &mask) = 0;
inline void ClearIgnores() { this->ignores.clear(); }
virtual IgnoreData *Find(const Anope::string &mask) = 0;
inline std::list<IgnoreData> &GetIgnores() { return this->ignores; }
};
-35
View File
@@ -22,8 +22,6 @@ class CommandOSSet : public Command
LanguageString index;
index = allow_ignore ? OPER_SET_LIST_OPTION_ON : OPER_SET_LIST_OPTION_OFF;
source.Reply(index, "IGNORE");
index = readonly ? OPER_SET_LIST_OPTION_ON : OPER_SET_LIST_OPTION_OFF;
source.Reply(index, "READONLY");
index = debug ? OPER_SET_LIST_OPTION_ON : OPER_SET_LIST_OPTION_OFF;
@@ -34,35 +32,6 @@ class CommandOSSet : public Command
return MOD_CONT;
}
CommandReturn DoSetIgnore(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
const Anope::string &setting = params.size() > 1 ? params[1] : "";
if (setting.empty())
{
this->OnSyntaxError(source, "IGNORE");
return MOD_CONT;
}
if (setting.equals_ci("ON"))
{
Log(LOG_ADMIN, u, this) << "ON";
allow_ignore = 1;
source.Reply(OPER_SET_IGNORE_ON);
}
else if (setting.equals_ci("OFF"))
{
Log(LOG_ADMIN, u, this) << "OFF";
allow_ignore = 0;
source.Reply(OPER_SET_IGNORE_OFF);
}
else
source.Reply(OPER_SET_IGNORE_ERROR);
return MOD_CONT;
}
CommandReturn DoSetReadOnly(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
@@ -204,8 +173,6 @@ class CommandOSSet : public Command
if (option.equals_ci("LIST"))
return this->DoList(source);
else if (option.equals_ci("IGNORE"))
return this->DoSetIgnore(source, params);
else if (option.equals_ci("READONLY"))
return this->DoSetReadOnly(source, params);
else if (option.equals_ci("SUPERADMIN"))
@@ -230,8 +197,6 @@ class CommandOSSet : public Command
source.Reply(OPER_HELP_SET_READONLY);
else if (subcommand.equals_ci("NOEXPIRE"))
source.Reply(OPER_HELP_SET_NOEXPIRE);
else if (subcommand.equals_ci("IGNORE"))
source.Reply(OPER_HELP_SET_IGNORE);
else if (subcommand.equals_ci("SUPERADMIN"))
source.Reply(OPER_HELP_SET_SUPERADMIN);
else
+3 -3
View File
@@ -44,7 +44,7 @@ class ModuleAlias : public Module
Anope::string target_client = config.ReadValue("alias", "target_client", "", i);
Anope::string target_command = config.ReadValue("alias", "target_command", "", i);
if ((!fantasy &&source_client.empty()) || source_command.empty() || target_client.empty() || target_command.empty())
if ((!fantasy && source_client.empty()) || source_command.empty() || target_client.empty() || target_command.empty())
continue;
CommandAlias alias;
@@ -62,12 +62,12 @@ class ModuleAlias : public Module
EventReturn OnPreCommandRun(User *&u, BotInfo *&bi, Anope::string &command, Anope::string &message, ChannelInfo *&ci)
{
bool fantasy = ci != NULL;
std::map<Anope::string, CommandAlias, std::less<ci::string> >::const_iterator it = aliases.find(command),
std::map<Anope::string, CommandAlias, std::less<ci::string> >::const_iterator it = aliases.find(command), it_end = it;
if (it_end != aliases.end())
it_end = aliases.upper_bound(command);
for (; it != it_end; ++it)
{
const CommandAlias &alias = it->second;
if (!fantasy && !bi->nick.equals_ci(alias.source_client))
continue;
+4
View File
@@ -587,6 +587,8 @@ class InspircdIRCdMessage : public IRCdMessage
}
IRCdMessage::OnCapab(source, params);
return true;
}
bool OnSJoin(const Anope::string &source, const std::vector<Anope::string> &params)
@@ -676,6 +678,8 @@ class InspircdIRCdMessage : public IRCdMessage
c->UnsetFlag(CH_SYNCING);
c->Sync();
}
return true;
}
};
-4
View File
@@ -312,10 +312,6 @@ void botchanmsgs(User *u, ChannelInfo *ci, const Anope::string &buf)
}
}
/* return if the user is on the ignore list */
if (get_ignore(u->nick))
return;
/* Fantaisist commands */
if (ci->botflags.HasFlag(BS_FANTASY) && buf[0] == Config->BSFantasyCharacter[0] && !was_action)
{
+6 -9
View File
@@ -125,15 +125,12 @@ void Channel::JoinUser(User *user)
update_ts = true;
}
if (!get_ignore(user->nick))
if (this->ci && check_access(user, this->ci, CA_MEMO) && this->ci->memos.memos.size() > 0)
{
if (this->ci && check_access(user, this->ci, CA_MEMO) && this->ci->memos.memos.size() > 0)
{
if (this->ci->memos.memos.size() == 1)
user->SendMessage(MemoServ, MEMO_X_ONE_NOTICE, this->ci->memos.memos.size(), this->ci->name.c_str());
else
user->SendMessage(MemoServ, MEMO_X_MANY_NOTICE, this->ci->memos.memos.size(), this->ci->name.c_str());
}
if (this->ci->memos.memos.size() == 1)
user->SendMessage(MemoServ, MEMO_X_ONE_NOTICE, this->ci->memos.memos.size(), this->ci->name.c_str());
else
user->SendMessage(MemoServ, MEMO_X_MANY_NOTICE, this->ci->memos.memos.size(), this->ci->name.c_str());
}
if (!Config->s_BotServ.empty() && this->ci && this->ci->bi)
@@ -1168,7 +1165,7 @@ void chan_set_correct_modes(User *user, Channel *c, int give_modes)
Log(LOG_DEBUG) << "Setting correct user modes for " << user->nick << " on " << c->name << " (" << (give_modes ? "" : "not ") << "giving modes)";
if (give_modes && !get_ignore(user->nick) && (!user->Account() || user->Account()->HasFlag(NI_AUTOOP)))
if (give_modes && (!user->Account() || user->Account()->HasFlag(NI_AUTOOP)))
{
if (owner && check_access(user, ci, CA_AUTOOWNER))
c->SetMode(NULL, CMODE_OWNER, user->nick);
+1 -1
View File
@@ -376,7 +376,7 @@ void expire_chans()
expire = true;
if (ci->HasFlag(CI_NO_EXPIRE))
expire = true;
expire = false;
if (expire)
{
+4 -14
View File
@@ -2220,12 +2220,6 @@ const char *const language_strings[LANG_STRING_COUNT] = {
_("The SZLINE list has been cleared."),
/* OPER_SET_SYNTAX */
_("SET option setting"),
/* OPER_SET_IGNORE_ON */
_("Ignore code will be used."),
/* OPER_SET_IGNORE_OFF */
_("Ignore code will not be used."),
/* OPER_SET_IGNORE_ERROR */
_("Setting for IGNORE must be ON or OFF."),
/* OPER_SET_READONLY_ON */
_("Services are now in read-only mode."),
/* OPER_SET_READONLY_OFF */
@@ -2269,7 +2263,7 @@ const char *const language_strings[LANG_STRING_COUNT] = {
/* OPER_RELOAD */
_("Services' configuration file has been reloaded."),
/* OPER_IGNORE_SYNTAX */
_("IGNORE {ADD|DEL|LIST|CLEAR} [time] [nick | mask]"),
_("IGNORE {ADD|DEL|LIST|CLEAR} [time] [nick] [reason]"),
/* OPER_IGNORE_VALID_TIME */
_("You have to enter a valid number as time."),
/* OPER_IGNORE_TIME_DONE */
@@ -2279,7 +2273,8 @@ const char *const language_strings[LANG_STRING_COUNT] = {
/* OPER_IGNORE_DEL_DONE */
_("%s will no longer be ignored."),
/* OPER_IGNORE_LIST */
_("Services ignore list:"),
_("Services ignore list:\n"
" Mask Creator Reason Expires"),
/* OPER_IGNORE_LIST_NOMATCH */
_("Nick %s not found on ignore list."),
/* OPER_IGNORE_LIST_EMPTY */
@@ -4462,7 +4457,7 @@ const char *const language_strings[LANG_STRING_COUNT] = {
"The ALL displays the user and uptime statistics, and\n"
"everything you'd see with MEMORY and UPLINK options."),
/* OPER_HELP_IGNORE */
_("Syntax: IGNORE {ADD|DEL|LIST|CLEAR} [time] [nick | mask]\n"
_("Syntax: IGNORE {ADD|DEL|LIST|CLEAR} [time] [nick] [reason]\n"
" \n"
"Allows Services Operators to make Services ignore a nick or mask\n"
"for a certain time or until the next restart. The default\n"
@@ -4689,7 +4684,6 @@ const char *const language_strings[LANG_STRING_COUNT] = {
" DEBUG Activate or deactivate debug mode\n"
" NOEXPIRE Activate or deactivate no expire mode\n"
" SUPERADMIN Activate or deactivate super-admin mode\n"
" IGNORE Activate or deactivate ignore mode\n"
" LIST List the options"),
/* OPER_HELP_SET_READONLY */
_("Syntax: SET READONLY {ON | OFF}\n"
@@ -4728,10 +4722,6 @@ const char *const language_strings[LANG_STRING_COUNT] = {
"ability to be \"founder\" on all channel's etc...\n"
"This option is not persistent, and should only be used when\n"
"needed, and set back to OFF when no longer needed."),
/* OPER_HELP_SET_IGNORE */
_("Syntax: SET IGNORE {ON | OFF}\n"
"Setting this will toggle Anope's usage of the IGNORE system \n"
"on or off."),
/* OPER_HELP_SET_LIST */
_("Syntax: SET LIST\n"
"Display the various %S settings"),
+2 -2
View File
@@ -239,7 +239,7 @@ void memo_send(CommandSource &source, const Anope::string &name, const Anope::st
if (Config->MSNotifyAll)
{
if (nc->HasFlag(NI_MEMO_RECEIVE) && !get_ignore(name))
if (nc->HasFlag(NI_MEMO_RECEIVE))
{
for (std::list<NickAlias *>::iterator it = nc->aliases.begin(), it_end = nc->aliases.end(); it != it_end; ++it)
{
@@ -274,7 +274,7 @@ void memo_send(CommandSource &source, const Anope::string &name, const Anope::st
if (check_access(cu->user, c->ci, CA_MEMO))
{
if (cu->user->Account() && cu->user->Account()->HasFlag(NI_MEMO_RECEIVE) && !get_ignore(cu->user->nick))
if (cu->user->Account() && cu->user->Account()->HasFlag(NI_MEMO_RECEIVE))
cu->user->SendMessage(MemoServ, MEMO_NEW_X_MEMO_ARRIVED, c->ci->name.c_str(), Config->s_MemoServ.c_str(), c->ci->name.c_str(), mi->memos.size());
}
}
+2 -2
View File
@@ -201,7 +201,7 @@ time_t dotime(const Anope::string &s)
if (s.empty())
return -1;
int amount = 0;
int amount;
Anope::string end;
try
@@ -230,7 +230,7 @@ time_t dotime(const Anope::string &s)
}
catch (const CoreException &) { }
return amount;
return 0;
}
/*************************************************************************/
-205
View File
@@ -12,211 +12,6 @@
#include "services.h"
#include "modules.h"
/*************************************************************************/
/* Use ignore code? */
int allow_ignore = 1;
/* Masks to ignore. */
std::list<IgnoreData *> ignore;
/*************************************************************************/
/**
* Add a mask/nick to the ignorelist for delta seconds.
* @param nick Nick or (nick!)user@host to add to the ignorelist.
* @param delta Seconds untill new entry is set to expire. 0 for permanent.
*/
void add_ignore(const Anope::string &nick, time_t delta)
{
if (nick.empty())
return;
/* If it s an existing user, we ignore the hostmask. */
Anope::string mask;
User *u = finduser(nick);
size_t user, host;
if (u)
mask = "*!*@" + u->host;
/* Determine whether we get a nick or a mask. */
else if ((host = nick.find('@')) != Anope::string::npos)
{
/* Check whether we have a nick too.. */
if ((user = nick.find('!')) != Anope::string::npos)
{
/* this should never happen */
if (user > host)
return;
mask = nick;
}
else
/* We have user@host. Add nick wildcard. */
mask = "*!" + nick;
}
/* We only got a nick.. */
else
mask = nick + "!*@*";
/* Check if we already got an identical entry. */
std::list<IgnoreData *>::iterator ign = ignore.begin(), ign_end = ignore.end();
for (; ign != ign_end; ++ign)
if (mask.equals_ci((*ign)->mask))
break;
/* Found one.. */
if (ign != ign_end)
{
if (!delta)
(*ign)->time = 0;
else if ((*ign)->time < Anope::CurTime + delta)
(*ign)->time = Anope::CurTime + delta;
}
/* Create new entry.. */
else
{
IgnoreData *newign = new IgnoreData();
newign->mask = mask;
newign->time = delta ? Anope::CurTime + delta : 0;
ignore.push_front(newign);
Log(LOG_DEBUG) << "Added new ignore entry for " << mask;
}
}
/*************************************************************************/
/**
* Retrieve an ignorance record for a nick or mask.
* If the nick isn't being ignored, we return NULL and if necesary
* flush the record from the ignore list (i.e. ignore timed out).
* @param nick Nick or (nick!)user@host to look for on the ignorelist.
* @return Pointer to the ignore record, NULL if none was found.
*/
IgnoreData *get_ignore(const Anope::string &nick)
{
if (nick.empty())
return NULL;
/* User has disabled the IGNORE system */
if (!allow_ignore)
return NULL;
User *u = finduser(nick);
std::list<IgnoreData *>::iterator ign = ignore.begin(), ign_end = ignore.end();
/* If we find a real user, match his mask against the ignorelist. */
if (u)
{
/* Opers are not ignored, even if a matching entry may be present. */
if (u->HasMode(UMODE_OPER))
return NULL;
for (; ign != ign_end; ++ign)
{
Entry ignore_mask((*ign)->mask);
if (ignore_mask.Matches(u))
break;
}
}
else
{
Anope::string tmp;
size_t user, host;
/* We didn't get a user.. generate a valid mask. */
if ((host = nick.find('@')) != Anope::string::npos)
{
if ((user = nick.find('!')) != Anope::string::npos)
{
/* this should never happen */
if (user > host)
return NULL;
tmp = nick;
}
else
/* We have user@host. Add nick wildcard. */
tmp = "*!" + nick;
}
/* We only got a nick.. */
else
tmp = nick + "!*@*";
for (; ign != ign_end; ++ign)
if (Anope::Match(tmp, (*ign)->mask))
break;
}
/* Check whether the entry has timed out */
if (ign != ign_end && (*ign)->time && (*ign)->time <= Anope::CurTime)
{
Log(LOG_DEBUG) << "Expiring ignore entry " << (*ign)->mask;
delete *ign;
ignore.erase(ign);
ign = ign_end = ignore.end();
}
if (ign != ign_end)
Log(LOG_DEBUG) << "Found ignore entry (" << (*ign)->mask << ") for " << nick;
return ign == ign_end ? NULL : *ign;
}
/*************************************************************************/
/**
* Deletes a given nick/mask from the ignorelist.
* @param nick Nick or (nick!)user@host to delete from the ignorelist.
* @return Returns 1 on success, 0 if no entry is found.
*/
int delete_ignore(const Anope::string &nick)
{
if (nick.empty())
return 0;
/* If it s an existing user, we ignore the hostmask. */
Anope::string tmp;
size_t user, host;
User *u = finduser(nick);
if (u)
tmp = "*!*@" + u->host;
/* Determine whether we get a nick or a mask. */
else if ((host = nick.find('@')) != Anope::string::npos)
{
/* Check whether we have a nick too.. */
if ((user = nick.find('!')) != Anope::string::npos)
{
/* this should never happen */
if (user > host)
return 0;
tmp = nick;
}
else
/* We have user@host. Add nick wildcard. */
tmp = "*!" + nick;
}
/* We only got a nick.. */
else
tmp = nick + "!*@*";
std::list<IgnoreData *>::iterator ign = ignore.begin(), ign_end = ignore.end();
for (; ign != ign_end; ++ign)
if (tmp.equals_ci((*ign)->mask))
break;
/* No matching ignore found. */
if (ign == ign_end)
return 0;
Log(LOG_DEBUG) << "Deleting ignore entry " << (*ign)->mask;
/* Delete the entry and all references to it. */
delete *ign;
ignore.erase(ign);
return 1;
}
/*************************************************************************/
/**
* Clear the ignorelist.
* @return The number of entries deleted.
*/
int clear_ignores()
{
if (ignore.empty())
return 0;
for (std::list<IgnoreData *>::iterator ign = ignore.begin(), ign_end = ignore.end(); ign != ign_end; ++ign)
{
Log(LOG_DEBUG) << "Deleting ignore entry " << (*ign)->mask;
delete *ign;
}
int deleted = ignore.size();
ignore.clear();
return deleted;
}
/** Main process routine
* @param buffer A raw line from the uplink to do things with
*/
+9 -17
View File
@@ -382,7 +382,7 @@ bool IRCdMessage::OnPrivmsg(const Anope::string &source, const std::vector<Anope
if (bi)
ircdproto->SendMessage(bi, source, "%s", GetString(USER_RECORD_NOT_FOUND).c_str());
return MOD_CONT;
return true;
}
if (receiver[0] == '#' && !Config->s_BotServ.empty())
@@ -394,19 +394,6 @@ bool IRCdMessage::OnPrivmsg(const Anope::string &source, const std::vector<Anope
}
else
{
/* Check if we should ignore. Operators always get through. */
if (allow_ignore && !u->HasMode(UMODE_OPER))
{
if (get_ignore(source))
{
Anope::string target = myStrGetToken(message, ' ', 0);
BotInfo *bi = findbot(target);
if (bi)
Log(bi) << "Ignored message from " << source << " using command " << target;
return MOD_CONT;
}
}
/* If a server is specified (nick@server format), make sure it matches
* us, and strip it off. */
Anope::string botname = receiver;
@@ -416,22 +403,27 @@ bool IRCdMessage::OnPrivmsg(const Anope::string &source, const std::vector<Anope
Anope::string servername(receiver.begin() + s + 1, receiver.end());
botname = botname.substr(0, s);
if (!servername.equals_ci(Config->ServerName))
return MOD_CONT;
return true;
}
else if (Config->UseStrictPrivMsg)
{
BotInfo *bi = findbot(receiver);
if (!bi)
return MOD_CONT;
return true;
Log(LOG_DEBUG) << "Ignored PRIVMSG without @ from " << source;
u->SendMessage(bi, INVALID_TARGET, receiver.c_str(), receiver.c_str(), Config->ServerName.c_str(), receiver.c_str());
return MOD_CONT;
return true;
}
BotInfo *bi = findbot(botname);
if (bi)
{
EventReturn MOD_RESULT;
FOREACH_RESULT(I_OnBotPrivmsg, OnBotPrivmsg(u, bi, message));
if (MOD_RESULT == EVENT_STOP)
return true;
if (message[0] == '\1' && message[message.length() - 1] == '\1')
{
if (message.substr(0, 6).equals_ci("\1PING "))
+2 -1
View File
@@ -515,7 +515,8 @@ bool BufferedSocket::ProcessWrite()
if (count == -1)
return false;
this->WriteBuffer = this->WriteBuffer.substr(count);
SocketEngine->ClearWritable(this);
if (this->WriteBuffer.empty())
SocketEngine->ClearWritable(this);
return true;
}