⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m_svsmode.c

📁 Unreal irc 服务器源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *   IRC - Internet Relay Chat, src/modules/m_svsmode.c *   (C) 2001 The UnrealIRCd Team * *   SVSMODE and SVS2MODE commands * *   See file AUTHORS in IRC package for additional names of *   the programmers. * *   This program is free software; you can redistribute it and/or modify *   it under the terms of the GNU General Public License as published by *   the Free Software Foundation; either version 1, or (at your option) *   any later version. * *   This program is distributed in the hope that it will be useful, *   but WITHOUT ANY WARRANTY; without even the implied warranty of *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *   GNU General Public License for more details. * *   You should have received a copy of the GNU General Public License *   along with this program; if not, write to the Free Software *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include "config.h"#include "struct.h"#include "common.h"#include "sys.h"#include "numeric.h"#include "msg.h"#include "channel.h"#include <time.h>#include <sys/stat.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#ifdef _WIN32#include <io.h>#endif#include <fcntl.h>#include "h.h"#include "proto.h"#ifdef STRIPBADWORDS#include "badwords.h"#endif#ifdef _WIN32#include "version.h"#endifvoid add_send_mode_param(aChannel *chptr, aClient *from, char what, char mode, char *param);DLLFUNC int m_svsmode(aClient *cptr, aClient *sptr, int parc, char *parv[]);DLLFUNC int m_svs2mode(aClient *cptr, aClient *sptr, int parc, char *parv[]);#define MSG_SVSMODE 	"SVSMODE"	#define TOK_SVSMODE 	"n"	#define MSG_SVS2MODE    "SVS2MODE"#define TOK_SVS2MODE	"v"ModuleHeader MOD_HEADER(m_svsmode)  = {	"m_svsmode",	"$Id: m_svsmode.c,v 1.1.6.10 2006/12/22 21:10:33 syzop Exp $",	"command /svsmode and svs2mode", 	"3.2-b8-1",	NULL     };DLLFUNC int MOD_INIT(m_svsmode)(ModuleInfo *modinfo){	add_Command(MSG_SVSMODE, TOK_SVSMODE, m_svsmode, MAXPARA);	add_Command(MSG_SVS2MODE, TOK_SVS2MODE, m_svs2mode, MAXPARA);	MARK_AS_OFFICIAL_MODULE(modinfo);	return MOD_SUCCESS;}DLLFUNC int MOD_LOAD(m_svsmode)(int module_load){	return MOD_SUCCESS;}DLLFUNC int MOD_UNLOAD(m_svsmode)(int module_unload){	if (del_Command(MSG_SVSMODE, TOK_SVSMODE, m_svsmode) < 0 || del_Command(MSG_SVS2MODE, TOK_SVS2MODE, m_svs2mode) < 0)	{		sendto_realops("Failed to delete commands when unloading %s",				MOD_HEADER(m_svsmode).name);	}	return MOD_SUCCESS;}void unban_user(aClient *sptr, aChannel *chptr, aClient *acptr, char chmode){	Extban *extban;	Ban *ban, *bnext;	Ban **banlist;	char uhost[NICKLEN+USERLEN+HOSTLEN+6], vhost[NICKLEN+USERLEN+HOSTLEN+6];	char ihost[NICKLEN+USERLEN+HOSTLEN+6], chost[NICKLEN+USERLEN+HOSTLEN+6];	/* BUILD HOSTS */	*uhost = *vhost = *ihost = *chost = '\0';	strlcpy(uhost, make_nick_user_host(acptr->name, 		acptr->user->username, acptr->user->realhost),		sizeof uhost);	if (GetIP(acptr)) /* only if we actually have an IP */		strlcpy(ihost, make_nick_user_host(acptr->name,			acptr->user->username, GetIP(acptr)),			sizeof ihost);	/* The next could have been an IsSetHost(), but I'm playing it safe with regards to backward compat. */	if (IsHidden(acptr) &&	    !(*acptr->user->cloakedhost && !strcasecmp(acptr->user->virthost, acptr->user->cloakedhost))) 	{		strlcpy(vhost, make_nick_user_host(acptr->name,			acptr->user->username, acptr->user->virthost),			sizeof vhost);	}	if (*acptr->user->cloakedhost) /* only if we know the cloaked host */		strlcpy(chost, make_nick_user_host(acptr->name, 			acptr->user->username, acptr->user->cloakedhost),			sizeof chost);	/* SELECT BANLIST */	switch (chmode)	{		case 'b':			banlist = &chptr->banlist;			break;		case 'e':			banlist = &chptr->exlist;			break;		case 'I':			banlist = &chptr->invexlist;			break;		default:			abort();	}	/* DO THE ACTUAL WORK */	for (ban = *banlist; ban; ban = bnext)	{		bnext = ban->next;		if (!match(ban->banstr, uhost) ||		    (*vhost && !match(ban->banstr, vhost)) ||		    (*ihost && !match(ban->banstr, ihost)) ||		    (*chost && !match(ban->banstr, chost)))		{			add_send_mode_param(chptr, sptr, '-',  chmode, 				ban->banstr);			del_listmode(banlist, chptr, ban->banstr);		}		else if (chmode != 'I' && *ban->banstr == '~' && (extban = findmod_by_bantype(ban->banstr[1])))		{			if (extban->options & EXTBOPT_CHSVSMODE) 			{				if (extban->is_banned(acptr, chptr, ban->banstr, BANCHK_JOIN))				{					add_send_mode_param(chptr, acptr, '-', chmode, ban->banstr);					del_listmode(banlist, chptr, ban->banstr);				}			}		}	}}void clear_bans(aClient *sptr, aChannel *chptr, char chmode){	Extban *extban;	Ban *ban, *bnext;	Ban **banlist;	switch (chmode)	{		case 'b':			banlist = &chptr->banlist;			break;		case 'e':			banlist = &chptr->exlist;			break;		case 'I':			banlist = &chptr->invexlist;			break;		default:			abort();	}		for (ban = *banlist; ban; ban = bnext)	{		bnext = ban->next;		if (chmode != 'I' && (*ban->banstr == '~') && (extban = findmod_by_bantype(ban->banstr[1])))		{			if (!(extban->options & EXTBOPT_CHSVSMODE))											continue;		}		add_send_mode_param(chptr, sptr, '-',  chmode, ban->banstr);		del_listmode(banlist, chptr, ban->banstr);	}}int channel_svsmode(aClient *cptr, aClient *sptr, int parc, char *parv[]) {	aChannel *chptr;	time_t ts;	aClient *acptr;	char *m;	int what;		int i = 4;	*parabuf = '\0';	modebuf[0] = 0;	if(!(chptr = find_channel(parv[1], NULL)))		return 0;/*	if (parc >= 4) {			return 0;		if (parc > 4) {			ts = TS2ts(parv[4]);			if (acptr->since != ts)				return 0;		}	}*/	ts = TS2ts(parv[parc-1]);	for(m = parv[2]; *m; m++) {		switch (*m) {			case '+':				what = MODE_ADD;				break;			case '-':				what = MODE_DEL;				break;			case 'q': {				Member *cm;				for (cm = chptr->members; cm; cm = cm->next) {					if (cm->flags & CHFL_CHANOWNER) {						Membership *mb;						mb = find_membership_link(cm->cptr->user->channel,							chptr);						add_send_mode_param(chptr, sptr, '-', 'q', cm->cptr->name);						cm->flags &= ~CHFL_CHANOWNER;						if (mb)							mb->flags = cm->flags;					}				}			}			break;			case 'a': {				Member *cm;				for (cm = chptr->members; cm; cm = cm->next) {					if (cm->flags & CHFL_CHANPROT) {						Membership *mb;						mb = find_membership_link(cm->cptr->user->channel,							chptr);						add_send_mode_param(chptr, sptr, '-', 'a', cm->cptr->name);						cm->flags &= ~CHFL_CHANPROT;						if (mb)							mb->flags = cm->flags;					}				}			}			break;			case 'o': {				Member *cm;				for (cm = chptr->members; cm; cm = cm->next) {					if (cm->flags & CHFL_CHANOP) {						Membership *mb;						mb = find_membership_link(cm->cptr->user->channel,							chptr);						add_send_mode_param(chptr, sptr, '-', 'o', cm->cptr->name);						cm->flags &= ~CHFL_CHANOP;						if (mb)							mb->flags = cm->flags;					}				}			}			break;			case 'h': {				Member *cm;				for (cm = chptr->members; cm; cm = cm->next) {					if (cm->flags & CHFL_HALFOP) {						Membership *mb;						mb = find_membership_link(cm->cptr->user->channel,							chptr);						add_send_mode_param(chptr, sptr, '-', 'h', cm->cptr->name);						cm->flags &= ~CHFL_HALFOP;						if (mb)							mb->flags = cm->flags;					}				}			}			break;			case 'v': {				Member *cm;				for (cm = chptr->members; cm; cm = cm->next) {					if (cm->flags & CHFL_VOICE) {						Membership *mb;						mb = find_membership_link(cm->cptr->user->channel,							chptr);						add_send_mode_param(chptr, sptr, '-', 'v', cm->cptr->name);						cm->flags &= ~CHFL_VOICE;						if (mb)							mb->flags = cm->flags;					}				}			}			break;			case 'b': {				Extban *extban;				Ban *ban, *bnext;				if (parc >= i) {					if (!(acptr = find_person(parv[i-1], NULL))) {						i++;						break;					}					if (ts && ts != acptr->since) {						i++;						break;					}					i++;					unban_user(sptr, chptr, acptr, 'b');				}				else {					clear_bans(sptr, chptr, 'b');				}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -