2 * ircd-ratbox: A slightly useful ircd.
3 * m_okick.c: Kicks a user from a channel with much prejudice.
5 * Copyright (C) 2002 by the past and present ircd coders, and others.
6 * Copyright (C) 2004 ircd-ratbox Development Team
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
41 static const char okick_desc
[] = "Allow admins to forcibly kick users from channels with the OKICK command";
43 static void mo_okick(struct MsgBuf
*msgbuf_p
, struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[]);
45 struct Message okick_msgtab
= {
47 {mg_unreg
, mg_not_oper
, mg_ignore
, mg_ignore
, mg_ignore
, {mo_okick
, 4}}
50 mapi_clist_av1 okick_clist
[] = { &okick_msgtab
, NULL
};
52 DECLARE_MODULE_AV2(okick
, NULL
, NULL
, okick_clist
, NULL
, NULL
, NULL
, NULL
, okick_desc
);
57 ** parv[2] = client to kick
58 ** parv[3] = kick comment
61 mo_okick(struct MsgBuf
*msgbuf_p
, struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[])
64 struct Client
*target_p
;
65 struct Channel
*chptr
;
66 struct membership
*msptr
;
72 static char buf
[BUFSIZE
];
76 sendto_one(source_p
, form_str(ERR_NEEDMOREPARAMS
), me
.name
, source_p
->name
, "KICK");
80 if(MyClient(source_p
) && !IsFloodDone(source_p
))
81 flood_endgrace(source_p
);
83 comment
= (EmptyString(LOCAL_COPY(parv
[3]))) ? LOCAL_COPY(parv
[2]) : LOCAL_COPY(parv
[3]);
84 if(strlen(comment
) > (size_t) TOPICLEN
)
85 comment
[TOPICLEN
] = '\0';
88 if((p
= strchr(parv
[1], ',')))
91 name
= LOCAL_COPY(parv
[1]);
93 chptr
= find_channel(name
);
96 sendto_one_numeric(source_p
, ERR_NOSUCHCHANNEL
, form_str(ERR_NOSUCHCHANNEL
), name
);
101 if((p
= strchr(parv
[2], ',')))
103 user
= LOCAL_COPY(parv
[2]); // strtoken(&p2, parv[2], ",");
104 if(!(who
= find_chasing(source_p
, user
, &chasing
)))
109 if((target_p
= find_client(user
)) == NULL
)
111 sendto_one(source_p
, form_str(ERR_NOSUCHNICK
), user
);
115 if((msptr
= find_channel_membership(chptr
, target_p
)) == NULL
)
117 sendto_one(source_p
, form_str(ERR_USERNOTINCHANNEL
), parv
[1], parv
[2]);
121 sendto_wallops_flags(UMODE_WALLOP
, &me
,
122 "OKICK called for %s %s by %s!%s@%s",
123 chptr
->chname
, target_p
->name
,
124 source_p
->name
, source_p
->username
, source_p
->host
);
125 ilog(L_MAIN
, "OKICK called for %s %s by %s",
126 chptr
->chname
, target_p
->name
,
127 get_oper_name(source_p
));
128 /* only sends stuff for #channels remotely */
129 sendto_server(NULL
, chptr
, NOCAPS
, NOCAPS
,
130 ":%s WALLOPS :OKICK called for %s %s by %s!%s@%s",
131 me
.name
, chptr
->chname
, target_p
->name
,
132 source_p
->name
, source_p
->username
, source_p
->host
);
134 sendto_channel_local(ALL_MEMBERS
, chptr
, ":%s KICK %s %s :%s",
135 me
.name
, chptr
->chname
, who
->name
, comment
);
136 sendto_server(&me
, chptr
, CAP_TS6
, NOCAPS
,
137 ":%s KICK %s %s :%s", me
.id
, chptr
->chname
, who
->id
, comment
);
138 remove_user_from_channel(msptr
);