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 int mo_okick(struct MsgBuf
*msgbuf_p
, struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[]);
44 struct Message okick_msgtab
= {
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_AV2(okick
, NULL
, NULL
, okick_clist
, NULL
, NULL
, NULL
, NULL
, NULL
);
56 ** parv[2] = client to kick
57 ** parv[3] = kick comment
60 mo_okick(struct MsgBuf
*msgbuf_p
, 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
), user
);
114 if((msptr
= find_channel_membership(chptr
, target_p
)) == NULL
)
116 sendto_one(source_p
, form_str(ERR_USERNOTINCHANNEL
), parv
[1], parv
[2]);
120 sendto_wallops_flags(UMODE_WALLOP
, &me
,
121 "OKICK called for %s %s by %s!%s@%s",
122 chptr
->chname
, target_p
->name
,
123 source_p
->name
, source_p
->username
, source_p
->host
);
124 ilog(L_MAIN
, "OKICK called for %s %s by %s",
125 chptr
->chname
, target_p
->name
,
126 get_oper_name(source_p
));
127 /* only sends stuff for #channels remotely */
128 sendto_server(NULL
, chptr
, NOCAPS
, NOCAPS
,
129 ":%s WALLOPS :OKICK called for %s %s by %s!%s@%s",
130 me
.name
, chptr
->chname
, target_p
->name
,
131 source_p
->name
, source_p
->username
, source_p
->host
);
133 sendto_channel_local(ALL_MEMBERS
, chptr
, ":%s KICK %s %s :%s",
134 me
.name
, chptr
->chname
, who
->name
, comment
);
135 sendto_server(&me
, chptr
, CAP_TS6
, NOCAPS
,
136 ":%s KICK %s %s :%s", me
.id
, chptr
->chname
, who
->id
, comment
);
137 remove_user_from_channel(msptr
);