1
0
mirror of https://github.com/anope/anope.git synced 2026-07-01 07:56:39 +02:00
Files
anope/src/actions.c
T
trystan trystan@31f1291d-b8d6-0310-a050-a5561fc1590b 20d3109377 BUILD : 1.7.5 (383) BUGS : N/A NOTES : glist fix - DrStein, improved on DrStein typo fix to init.c - TSL, tons of NULL crash checks - TSL
git-svn-id: svn://svn.anope.org/anope/trunk@383 31f1291d-b8d6-0310-a050-a5561fc1590b


git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@252 5417fbe8-f217-4b02-8779-1006273d7864
2004-10-10 05:51:21 +00:00

213 lines
5.0 KiB
C

/* Various routines to perform simple actions.
*
* (C) 2003 Anope Team
* Contact us at info@anope.org
*
* Please read COPYING and README for furhter details.
*
* Based on the original code of Epona by Lara.
* Based on the original code of Services by Andy Church.
*
* $Id$
*
*/
#include "services.h"
/*************************************************************************/
/* Note a bad password attempt for the given user. If they've used up
* their limit, toss them off.
*/
void bad_password(User * u)
{
time_t now = time(NULL);
if (!u) {
return;
}
if (!BadPassLimit)
return;
if (BadPassTimeout > 0 && u->invalid_pw_time > 0
&& u->invalid_pw_time < now - BadPassTimeout)
u->invalid_pw_count = 0;
u->invalid_pw_count++;
u->invalid_pw_time = now;
if (u->invalid_pw_count >= BadPassLimit)
kill_user(NULL, u->nick, "Too many invalid passwords");
}
/*************************************************************************/
/* Remove a user from the IRC network. `source' is the nick which should
* generate the kill, or NULL for a server-generated kill.
*/
void kill_user(char *source, char *user, char *reason)
{
char buf[BUFSIZE];
if (!user || !*user)
return;
if (!source || !*source)
source = ServerName;
if (!reason)
reason = "";
snprintf(buf, sizeof(buf), "%s (%s)", source, reason);
anope_cmd_svskill(source, user, buf);
if (!ircd->quitonkill) {
do_kill(user, buf);
}
}
/*************************************************************************/
void sqline(char *mask, char *reason)
{
if (ircd->chansqline) {
if (*mask == '#') {
int i;
Channel *c, *next;
char *av[3];
struct c_userlist *cu, *cunext;
anope_cmd_sqline(mask, reason);
for (i = 0; i < 1024; i++) {
for (c = chanlist[i]; c; c = next) {
next = c->next;
if (!match_wild_nocase(mask, c->name))
continue;
for (cu = c->users; cu; cu = cunext) {
cunext = cu->next;
if (is_oper(cu->user))
continue;
av[0] = c->name;
av[1] = cu->user->nick;
av[2] = reason;
anope_cmd_kick(s_OperServ, av[0], av[1],
"Q-Lined: %s", av[2]);
do_kick(s_ChanServ, 3, av);
}
}
}
} else {
anope_cmd_sqline(mask, reason);
}
} else {
anope_cmd_sqline(mask, reason);
}
}
/*************************************************************************/
void common_unban(ChannelInfo * ci, char *nick)
{
int count, i;
char *av[3], **bans;
User *u;
char *host;
if (!ci || !ci->c || !nick)
return;
if (!(u = finduser(nick)))
return;
host = host_resolve(u->host);
if (ircd->svsmode_unban) {
anope_cmd_unban(ci->name, nick);
} else {
av[0] = ci->name;
av[1] = sstrdup("-b");
count = ci->c->bancount;
bans = scalloc(sizeof(char *) * count, 1);
memcpy(bans, ci->c->bans, sizeof(char *) * count);
for (i = 0; i < count; i++) {
if (match_usermask(bans[i], u)) {
anope_cmd_mode(whosends(ci), ci->name, "-b %s", bans[i]);
av[2] = bans[i];
do_cmode(whosends(ci), 3, av);
}
if (host) {
if (match_userip(bans[i], u, host)) {
anope_cmd_mode(whosends(ci), ci->name, "-b %s",
bans[i]);
av[2] = bans[i];
do_cmode(whosends(ci), 3, av);
}
}
}
free(bans);
free(av[1]);
}
}
/*************************************************************************/
void common_svsmode(User * u, char *modes, char *arg)
{
int ac = 1;
char *av[2];
av[0] = modes;
if (arg) {
av[1] = arg;
ac++;
}
anope_cmd_svsmode(u, ac, av);
anope_set_umode(u, ac, av);
}
/*************************************************************************/
char *common_get_vhost(User * u)
{
if (!u) {
return NULL;
}
if (ircd->vhostmode) {
if (u->mode & ircd->vhostmode) {
return u->vhost;
} else {
return u->host;
}
} else {
return u->host;
}
}
/*************************************************************************/
char *common_get_vident(User * u)
{
if (!u) {
return NULL;
}
if (ircd->vhostmode) {
if (u->mode & ircd->vhostmode) {
if (u->vident) {
return u->vident;
} else {
return u->username;
}
} else {
return u->username;
}
} else {
return u->username;
}
}