📄 m_svsmode.c
字号:
/* * 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 + -