268
268
/* Check that specified channel exists */
269
269
chan = Channel_Search(Name);
271
IRC_WriteStrClient(Client, ERR_NOSUCHCHANNEL_MSG,
271
IRC_WriteErrClient(Client, ERR_NOSUCHCHANNEL_MSG,
272
272
Client_ID(Client), Name);
276
276
/* Check that the client is in the channel */
277
277
if (!Get_Cl2Chan(chan, Client)) {
278
IRC_WriteStrClient(Client, ERR_NOTONCHANNEL_MSG,
278
IRC_WriteErrClient(Client, ERR_NOTONCHANNEL_MSG,
279
279
Client_ID(Client), Name);
320
319
Client_Type(Origin) != CLIENT_SERVICE) {
321
320
/* Check that user is on the specified channel */
322
321
if (!Channel_IsMemberOf(chan, Origin)) {
323
IRC_WriteStrClient( Origin, ERR_NOTONCHANNEL_MSG,
324
Client_ID(Origin), Name);
322
IRC_WriteErrClient(Origin, ERR_NOTONCHANNEL_MSG,
323
Client_ID(Origin), Name);
329
328
/* Check that the client to be kicked is on the specified channel */
330
329
if (!Channel_IsMemberOf(chan, Target)) {
331
IRC_WriteStrClient(Origin, ERR_USERNOTINCHANNEL_MSG,
330
IRC_WriteErrClient(Origin, ERR_USERNOTINCHANNEL_MSG,
332
331
Client_ID(Origin), Client_ID(Target), Name );
336
335
if(Client_Type(Peer) == CLIENT_USER) {
337
336
/* Channel mode 'Q' and user mode 'q' on target: nobody but
338
337
* IRC Operators and servers can kick the target user */
339
if ((strchr(Channel_Modes(chan), 'Q')
338
if ((Channel_HasMode(chan, 'Q')
340
339
|| Client_HasMode(Target, 'q')
341
340
|| Client_Type(Target) == CLIENT_SERVICE)
342
341
&& !Client_HasMode(Origin, 'o')) {
343
IRC_WriteStrClient(Origin, ERR_KICKDENY_MSG,
342
IRC_WriteErrClient(Origin, ERR_KICKDENY_MSG,
344
343
Client_ID(Origin), Name,
345
344
Client_ID(Target));
349
348
/* Check if client has the rights to kick target */
350
ptr = Channel_UserModes(chan, Peer);
351
target_modes = Channel_UserModes(chan, Target);
353
/* Owner can kick everyone */
358
/* Admin can't kick owner */
360
if (!strchr(target_modes, 'q')) {
365
/* Op can't kick owner | admin */
367
if (!strchr(target_modes, 'q') &&
368
!strchr(target_modes, 'a')) {
373
/* Half Op can't kick owner | admin | op */
375
if (!strchr(target_modes, 'q') &&
376
!strchr(target_modes, 'a') &&
377
!strchr(target_modes, 'o')) {
350
/* Owner can kick everyone */
351
if (Channel_UserHasMode(chan, Peer, 'q'))
354
/* Admin can't kick owner */
355
else if (Channel_UserHasMode(chan, Peer, 'a') &&
356
!Channel_UserHasMode(chan, Target, 'q'))
359
/* Op can't kick owner | admin */
360
else if (Channel_UserHasMode(chan, Peer, 'o') &&
361
!Channel_UserHasMode(chan, Target, 'q') &&
362
!Channel_UserHasMode(chan, Target, 'a'))
365
/* Half Op can't kick owner | admin | op */
366
else if (Channel_UserHasMode(chan, Peer, 'h') &&
367
!Channel_UserHasMode(chan, Target, 'q') &&
368
!Channel_UserHasMode(chan, Target, 'a') &&
369
!Channel_UserHasMode(chan, Target, 'o'))
386
IRC_WriteStrClient(Origin, ERR_CHANOPPRIVTOOLOW_MSG,
387
Client_ID(Origin), Name);
373
IRC_WriteErrClient(Origin, ERR_CHANOPPRIVTOOLOW_MSG,
374
Client_ID(Origin), Name);
874
876
if (Channel_IsMemberOf(Chan, From)) {
875
877
is_member = true;
876
if (strchr(Channel_UserModes(Chan, From), 'v'))
878
if (Channel_UserHasMode(Chan, From, 'v'))
877
879
has_voice = true;
878
if (strchr(Channel_UserModes(Chan, From), 'h'))
880
if (Channel_UserHasMode(Chan, From, 'h'))
879
881
is_halfop = true;
880
if (strchr(Channel_UserModes(Chan, From), 'o'))
882
if (Channel_UserHasMode(Chan, From, 'o'))
882
if (strchr(Channel_UserModes(Chan, From), 'a'))
884
if (Channel_UserHasMode(Chan, From, 'a'))
883
885
is_chanadmin = true;
884
if (strchr(Channel_UserModes(Chan, From), 'q'))
886
if (Channel_UserHasMode(Chan, From, 'q'))
891
893
* If channel mode n set: non-members cannot send to channel.
892
894
* If channel mode m set: need voice.
894
if (strchr(Channel_Modes(Chan), 'n') && !is_member)
896
if (Channel_HasMode(Chan, 'n') && !is_member)
897
if (strchr(Channel_Modes(Chan), 'M') && !Client_HasMode(From, 'R')
899
if (Channel_HasMode(Chan, 'M') && !Client_HasMode(From, 'R')
898
900
&& !Client_HasMode(From, 'o'))
901
903
if (has_voice || is_halfop || is_op || is_chanadmin || is_owner)
904
if (strchr(Channel_Modes(Chan), 'm'))
906
if (Channel_HasMode(Chan, 'm'))
907
909
if (Lists_Check(&Chan->list_excepts, From))
918
920
if (!Can_Send_To_Channel(Chan, From)) {
919
921
if (! SendErrors)
920
922
return CONNECTED; /* no error, see RFC 2812 */
921
if (strchr(Channel_Modes(Chan), 'M'))
922
return IRC_WriteStrClient(From, ERR_NEEDREGGEDNICK_MSG,
923
if (Channel_HasMode(Chan, 'M'))
924
return IRC_WriteErrClient(From, ERR_NEEDREGGEDNICK_MSG,
923
925
Client_ID(From), Channel_Name(Chan));
925
return IRC_WriteStrClient(From, ERR_CANNOTSENDTOCHAN_MSG,
927
return IRC_WriteErrClient(From, ERR_CANNOTSENDTOCHAN_MSG,
926
928
Client_ID(From), Channel_Name(Chan));
929
931
if (Client_Conn(From) > NONE)
930
932
Conn_UpdateIdle(Client_Conn(From));
932
return IRC_WriteStrChannelPrefix(Client, Chan, From, true,
933
"%s %s :%s", Command, Channel_Name(Chan), Text);
934
IRC_WriteStrChannelPrefix(Client, Chan, From, true, "%s %s :%s",
935
Command, Channel_Name(Chan), Text);