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
23 * $Id: m_okick.c 3554 2007-08-10 22:31:14Z jilles $
41 static int mo_okick(struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[]);
44 struct Message okick_msgtab
= {
45 "OKICK", 0, 0, 0, MFLG_SLOW
,
46 {mg_unreg
, mg_not_oper
, mg_ignore
, mg_ignore
, mg_ignore
, {mo_okick
, 4}}
49 mapi_clist_av1 okick_clist
[] = { &okick_msgtab
, NULL
};
51 DECLARE_MODULE_AV1(okick
, NULL
, NULL
, okick_clist
, NULL
, NULL
, "$Revision: 3554 $");
56 ** parv[2] = client to kick
57 ** parv[3] = kick comment
60 mo_okick(struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[])
63 struct Client
*target_p
;
64 struct Channel
*chptr
;
65 struct membership
*msptr
;
71 static char buf
[BUFSIZE
];
75 sendto_one(source_p
, form_str(ERR_NEEDMOREPARAMS
), me
.name
, source_p
->name
, "KICK");
79 if(MyClient(source_p
) && !IsFloodDone(source_p
))
80 flood_endgrace(source_p
);
82 comment
= (EmptyString(LOCAL_COPY(parv
[3]))) ? LOCAL_COPY(parv
[2]) : LOCAL_COPY(parv
[3]);
83 if(strlen(comment
) > (size_t) TOPICLEN
)
84 comment
[TOPICLEN
] = '\0';
87 if((p
= strchr(parv
[1], ',')))
90 name
= LOCAL_COPY(parv
[1]);
92 chptr
= find_channel(name
);
95 sendto_one_numeric(source_p
, ERR_NOSUCHCHANNEL
, form_str(ERR_NOSUCHCHANNEL
), name
);
100 if((p
= strchr(parv
[2], ',')))
102 user
= LOCAL_COPY(parv
[2]); // strtoken(&p2, parv[2], ",");
103 if(!(who
= find_chasing(source_p
, user
, &chasing
)))
108 if((target_p
= find_client(user
)) == NULL
)
110 sendto_one(source_p
, form_str(ERR_NOSUCHNICK
), me
.name
, source_p
->name
, user
);
114 if((msptr
= find_channel_membership(chptr
, target_p
)) == NULL
)
116 sendto_one(source_p
, form_str(ERR_USERNOTINCHANNEL
),
117 me
.name
, source_p
->name
, 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
);