|
@@ -171,7 +171,7 @@ func (channel *Channel) regenerateMembersCache(noLocksNeeded bool) {
|
171
|
171
|
}
|
172
|
172
|
|
173
|
173
|
// Names sends the list of users joined to the channel to the given client.
|
174
|
|
-func (channel *Channel) Names(client *Client) {
|
|
174
|
+func (channel *Channel) Names(client *Client, rb *ResponseBuffer) {
|
175
|
175
|
currentNicks := channel.nicks(client)
|
176
|
176
|
// assemble and send replies
|
177
|
177
|
maxNamLen := 480 - len(client.server.name) - len(client.nick)
|
|
@@ -183,7 +183,7 @@ func (channel *Channel) Names(client *Client) {
|
183
|
183
|
}
|
184
|
184
|
|
185
|
185
|
if len(buffer)+1+len(nick) > maxNamLen {
|
186
|
|
- client.Send(nil, client.server.name, RPL_NAMREPLY, client.nick, "=", channel.name, buffer)
|
|
186
|
+ rb.Add(nil, client.server.name, RPL_NAMREPLY, client.nick, "=", channel.name, buffer)
|
187
|
187
|
buffer = nick
|
188
|
188
|
continue
|
189
|
189
|
}
|
|
@@ -192,8 +192,8 @@ func (channel *Channel) Names(client *Client) {
|
192
|
192
|
buffer += nick
|
193
|
193
|
}
|
194
|
194
|
|
195
|
|
- client.Send(nil, client.server.name, RPL_NAMREPLY, client.nick, "=", channel.name, buffer)
|
196
|
|
- client.Send(nil, client.server.name, RPL_ENDOFNAMES, client.nick, channel.name, client.t("End of NAMES list"))
|
|
195
|
+ rb.Add(nil, client.server.name, RPL_NAMREPLY, client.nick, "=", channel.name, buffer)
|
|
196
|
+ rb.Add(nil, client.server.name, RPL_ENDOFNAMES, client.nick, channel.name, client.t("End of NAMES list"))
|
197
|
197
|
}
|
198
|
198
|
|
199
|
199
|
// ClientIsAtLeast returns whether the client has at least the given channel privilege.
|
|
@@ -349,42 +349,50 @@ func (channel *Channel) IsEmpty() bool {
|
349
|
349
|
|
350
|
350
|
// Join joins the given client to this channel (if they can be joined).
|
351
|
351
|
//TODO(dan): /SAJOIN and maybe a ForceJoin function?
|
352
|
|
-func (channel *Channel) Join(client *Client, key string) {
|
|
352
|
+func (channel *Channel) Join(client *Client, key string, rb *ResponseBuffer) {
|
353
|
353
|
if channel.hasClient(client) {
|
354
|
354
|
// already joined, no message needs to be sent
|
355
|
355
|
return
|
356
|
356
|
}
|
357
|
357
|
|
358
|
358
|
if channel.IsFull() {
|
359
|
|
- client.Send(nil, client.server.name, ERR_CHANNELISFULL, channel.name, fmt.Sprintf(client.t("Cannot join channel (+%s)"), "l"))
|
|
359
|
+ rb.Add(nil, client.server.name, ERR_CHANNELISFULL, channel.name, fmt.Sprintf(client.t("Cannot join channel (+%s)"), "l"))
|
360
|
360
|
return
|
361
|
361
|
}
|
362
|
362
|
|
363
|
363
|
if !channel.CheckKey(key) {
|
364
|
|
- client.Send(nil, client.server.name, ERR_BADCHANNELKEY, channel.name, fmt.Sprintf(client.t("Cannot join channel (+%s)"), "k"))
|
|
364
|
+ rb.Add(nil, client.server.name, ERR_BADCHANNELKEY, channel.name, fmt.Sprintf(client.t("Cannot join channel (+%s)"), "k"))
|
365
|
365
|
return
|
366
|
366
|
}
|
367
|
367
|
|
368
|
368
|
isInvited := channel.lists[modes.InviteMask].Match(client.nickMaskCasefolded)
|
369
|
369
|
if channel.flags[modes.InviteOnly] && !isInvited {
|
370
|
|
- client.Send(nil, client.server.name, ERR_INVITEONLYCHAN, channel.name, fmt.Sprintf(client.t("Cannot join channel (+%s)"), "i"))
|
|
370
|
+ rb.Add(nil, client.server.name, ERR_INVITEONLYCHAN, channel.name, fmt.Sprintf(client.t("Cannot join channel (+%s)"), "i"))
|
371
|
371
|
return
|
372
|
372
|
}
|
373
|
373
|
|
374
|
374
|
if channel.lists[modes.BanMask].Match(client.nickMaskCasefolded) &&
|
375
|
375
|
!isInvited &&
|
376
|
376
|
!channel.lists[modes.ExceptMask].Match(client.nickMaskCasefolded) {
|
377
|
|
- client.Send(nil, client.server.name, ERR_BANNEDFROMCHAN, channel.name, fmt.Sprintf(client.t("Cannot join channel (+%s)"), "b"))
|
|
377
|
+ rb.Add(nil, client.server.name, ERR_BANNEDFROMCHAN, channel.name, fmt.Sprintf(client.t("Cannot join channel (+%s)"), "b"))
|
378
|
378
|
return
|
379
|
379
|
}
|
380
|
380
|
|
381
|
381
|
client.server.logger.Debug("join", fmt.Sprintf("%s joined channel %s", client.nick, channel.name))
|
382
|
382
|
|
383
|
383
|
for _, member := range channel.Members() {
|
384
|
|
- if member.capabilities.Has(caps.ExtendedJoin) {
|
385
|
|
- member.Send(nil, client.nickMaskString, "JOIN", channel.name, client.account.Name, client.realname)
|
|
384
|
+ if member == client {
|
|
385
|
+ if member.capabilities.Has(caps.ExtendedJoin) {
|
|
386
|
+ rb.Add(nil, client.nickMaskString, "JOIN", channel.name, client.account.Name, client.realname)
|
|
387
|
+ } else {
|
|
388
|
+ rb.Add(nil, client.nickMaskString, "JOIN", channel.name)
|
|
389
|
+ }
|
386
|
390
|
} else {
|
387
|
|
- member.Send(nil, client.nickMaskString, "JOIN", channel.name)
|
|
391
|
+ if member.capabilities.Has(caps.ExtendedJoin) {
|
|
392
|
+ member.Send(nil, client.nickMaskString, "JOIN", channel.name, client.account.Name, client.realname)
|
|
393
|
+ } else {
|
|
394
|
+ member.Send(nil, client.nickMaskString, "JOIN", channel.name)
|
|
395
|
+ }
|
388
|
396
|
}
|
389
|
397
|
}
|
390
|
398
|
|
|
@@ -411,31 +419,39 @@ func (channel *Channel) Join(client *Client, key string) {
|
411
|
419
|
}
|
412
|
420
|
|
413
|
421
|
if client.capabilities.Has(caps.ExtendedJoin) {
|
414
|
|
- client.Send(nil, client.nickMaskString, "JOIN", channel.name, client.account.Name, client.realname)
|
|
422
|
+ rb.Add(nil, client.nickMaskString, "JOIN", channel.name, client.account.Name, client.realname)
|
415
|
423
|
} else {
|
416
|
|
- client.Send(nil, client.nickMaskString, "JOIN", channel.name)
|
|
424
|
+ rb.Add(nil, client.nickMaskString, "JOIN", channel.name)
|
417
|
425
|
}
|
418
|
426
|
// don't send topic when it's an entirely new channel
|
419
|
427
|
if !newChannel {
|
420
|
|
- channel.SendTopic(client)
|
|
428
|
+ channel.SendTopic(client, rb)
|
421
|
429
|
}
|
422
|
|
- channel.Names(client)
|
|
430
|
+ channel.Names(client, rb)
|
423
|
431
|
if givenMode != nil {
|
424
|
432
|
for _, member := range channel.Members() {
|
425
|
|
- member.Send(nil, client.server.name, "MODE", channel.name, fmt.Sprintf("+%v", *givenMode), client.nick)
|
|
433
|
+ if member == client {
|
|
434
|
+ rb.Add(nil, client.server.name, "MODE", channel.name, fmt.Sprintf("+%v", *givenMode), client.nick)
|
|
435
|
+ } else {
|
|
436
|
+ member.Send(nil, client.server.name, "MODE", channel.name, fmt.Sprintf("+%v", *givenMode), client.nick)
|
|
437
|
+ }
|
426
|
438
|
}
|
427
|
439
|
}
|
428
|
440
|
}
|
429
|
441
|
|
430
|
442
|
// Part parts the given client from this channel, with the given message.
|
431
|
|
-func (channel *Channel) Part(client *Client, message string) {
|
|
443
|
+func (channel *Channel) Part(client *Client, message string, rb *ResponseBuffer) {
|
432
|
444
|
if !channel.hasClient(client) {
|
433
|
|
- client.Send(nil, client.server.name, ERR_NOTONCHANNEL, channel.name, client.t("You're not on that channel"))
|
|
445
|
+ rb.Add(nil, client.server.name, ERR_NOTONCHANNEL, channel.name, client.t("You're not on that channel"))
|
434
|
446
|
return
|
435
|
447
|
}
|
436
|
448
|
|
437
|
449
|
for _, member := range channel.Members() {
|
438
|
|
- member.Send(nil, client.nickMaskString, "PART", channel.name, message)
|
|
450
|
+ if member == client {
|
|
451
|
+ rb.Add(nil, client.nickMaskString, "PART", channel.name, message)
|
|
452
|
+ } else {
|
|
453
|
+ member.Send(nil, client.nickMaskString, "PART", channel.name, message)
|
|
454
|
+ }
|
439
|
455
|
}
|
440
|
456
|
channel.Quit(client)
|
441
|
457
|
|
|
@@ -443,9 +459,9 @@ func (channel *Channel) Part(client *Client, message string) {
|
443
|
459
|
}
|
444
|
460
|
|
445
|
461
|
// SendTopic sends the channel topic to the given client.
|
446
|
|
-func (channel *Channel) SendTopic(client *Client) {
|
|
462
|
+func (channel *Channel) SendTopic(client *Client, rb *ResponseBuffer) {
|
447
|
463
|
if !channel.hasClient(client) {
|
448
|
|
- client.Send(nil, client.server.name, ERR_NOTONCHANNEL, client.nick, channel.name, client.t("You're not on that channel"))
|
|
464
|
+ rb.Add(nil, client.server.name, ERR_NOTONCHANNEL, client.nick, channel.name, client.t("You're not on that channel"))
|
449
|
465
|
return
|
450
|
466
|
}
|
451
|
467
|
|
|
@@ -457,23 +473,23 @@ func (channel *Channel) SendTopic(client *Client) {
|
457
|
473
|
channel.stateMutex.RUnlock()
|
458
|
474
|
|
459
|
475
|
if topic == "" {
|
460
|
|
- client.Send(nil, client.server.name, RPL_NOTOPIC, client.nick, name, client.t("No topic is set"))
|
|
476
|
+ rb.Add(nil, client.server.name, RPL_NOTOPIC, client.nick, name, client.t("No topic is set"))
|
461
|
477
|
return
|
462
|
478
|
}
|
463
|
479
|
|
464
|
|
- client.Send(nil, client.server.name, RPL_TOPIC, client.nick, name, topic)
|
465
|
|
- client.Send(nil, client.server.name, RPL_TOPICTIME, client.nick, name, topicSetBy, strconv.FormatInt(topicSetTime.Unix(), 10))
|
|
480
|
+ rb.Add(nil, client.server.name, RPL_TOPIC, client.nick, name, topic)
|
|
481
|
+ rb.Add(nil, client.server.name, RPL_TOPICTIME, client.nick, name, topicSetBy, strconv.FormatInt(topicSetTime.Unix(), 10))
|
466
|
482
|
}
|
467
|
483
|
|
468
|
484
|
// SetTopic sets the topic of this channel, if the client is allowed to do so.
|
469
|
|
-func (channel *Channel) SetTopic(client *Client, topic string) {
|
|
485
|
+func (channel *Channel) SetTopic(client *Client, topic string, rb *ResponseBuffer) {
|
470
|
486
|
if !(client.flags[modes.Operator] || channel.hasClient(client)) {
|
471
|
|
- client.Send(nil, client.server.name, ERR_NOTONCHANNEL, channel.name, client.t("You're not on that channel"))
|
|
487
|
+ rb.Add(nil, client.server.name, ERR_NOTONCHANNEL, channel.name, client.t("You're not on that channel"))
|
472
|
488
|
return
|
473
|
489
|
}
|
474
|
490
|
|
475
|
491
|
if channel.HasMode(modes.OpOnlyTopic) && !channel.ClientIsAtLeast(client, modes.ChannelOperator) {
|
476
|
|
- client.Send(nil, client.server.name, ERR_CHANOPRIVSNEEDED, channel.name, client.t("You're not a channel operator"))
|
|
492
|
+ rb.Add(nil, client.server.name, ERR_CHANOPRIVSNEEDED, channel.name, client.t("You're not a channel operator"))
|
477
|
493
|
return
|
478
|
494
|
}
|
479
|
495
|
|
|
@@ -488,7 +504,11 @@ func (channel *Channel) SetTopic(client *Client, topic string) {
|
488
|
504
|
channel.stateMutex.Unlock()
|
489
|
505
|
|
490
|
506
|
for _, member := range channel.Members() {
|
491
|
|
- member.Send(nil, client.nickMaskString, "TOPIC", channel.name, topic)
|
|
507
|
+ if member == client {
|
|
508
|
+ rb.Add(nil, client.nickMaskString, "TOPIC", channel.name, topic)
|
|
509
|
+ } else {
|
|
510
|
+ member.Send(nil, client.nickMaskString, "TOPIC", channel.name, topic)
|
|
511
|
+ }
|
492
|
512
|
}
|
493
|
513
|
|
494
|
514
|
go channel.server.channelRegistry.StoreChannel(channel, false)
|
|
@@ -513,14 +533,14 @@ func (channel *Channel) CanSpeak(client *Client) bool {
|
513
|
533
|
}
|
514
|
534
|
|
515
|
535
|
// TagMsg sends a tag message to everyone in this channel who can accept them.
|
516
|
|
-func (channel *Channel) TagMsg(msgid string, minPrefix *modes.Mode, clientOnlyTags *map[string]ircmsg.TagValue, client *Client) {
|
517
|
|
- channel.sendMessage(msgid, "TAGMSG", []caps.Capability{caps.MessageTags}, minPrefix, clientOnlyTags, client, nil)
|
|
536
|
+func (channel *Channel) TagMsg(msgid string, minPrefix *modes.Mode, clientOnlyTags *map[string]ircmsg.TagValue, client *Client, rb *ResponseBuffer) {
|
|
537
|
+ channel.sendMessage(msgid, "TAGMSG", []caps.Capability{caps.MessageTags}, minPrefix, clientOnlyTags, client, nil, rb)
|
518
|
538
|
}
|
519
|
539
|
|
520
|
540
|
// sendMessage sends a given message to everyone on this channel.
|
521
|
|
-func (channel *Channel) sendMessage(msgid, cmd string, requiredCaps []caps.Capability, minPrefix *modes.Mode, clientOnlyTags *map[string]ircmsg.TagValue, client *Client, message *string) {
|
|
541
|
+func (channel *Channel) sendMessage(msgid, cmd string, requiredCaps []caps.Capability, minPrefix *modes.Mode, clientOnlyTags *map[string]ircmsg.TagValue, client *Client, message *string, rb *ResponseBuffer) {
|
522
|
542
|
if !channel.CanSpeak(client) {
|
523
|
|
- client.Send(nil, client.server.name, ERR_CANNOTSENDTOCHAN, channel.name, client.t("Cannot send to channel"))
|
|
543
|
+ rb.Add(nil, client.server.name, ERR_CANNOTSENDTOCHAN, channel.name, client.t("Cannot send to channel"))
|
524
|
544
|
return
|
525
|
545
|
}
|
526
|
546
|
|
|
@@ -554,26 +574,26 @@ func (channel *Channel) sendMessage(msgid, cmd string, requiredCaps []caps.Capab
|
554
|
574
|
}
|
555
|
575
|
|
556
|
576
|
if message == nil {
|
557
|
|
- member.SendFromClient(msgid, client, messageTagsToUse, cmd, channel.name)
|
|
577
|
+ rb.AddFromClient(msgid, client, messageTagsToUse, cmd, channel.name)
|
558
|
578
|
} else {
|
559
|
|
- member.SendFromClient(msgid, client, messageTagsToUse, cmd, channel.name, *message)
|
|
579
|
+ rb.AddFromClient(msgid, client, messageTagsToUse, cmd, channel.name, *message)
|
560
|
580
|
}
|
561
|
581
|
}
|
562
|
582
|
}
|
563
|
583
|
|
564
|
584
|
// SplitPrivMsg sends a private message to everyone in this channel.
|
565
|
|
-func (channel *Channel) SplitPrivMsg(msgid string, minPrefix *modes.Mode, clientOnlyTags *map[string]ircmsg.TagValue, client *Client, message SplitMessage) {
|
566
|
|
- channel.sendSplitMessage(msgid, "PRIVMSG", minPrefix, clientOnlyTags, client, &message)
|
|
585
|
+func (channel *Channel) SplitPrivMsg(msgid string, minPrefix *modes.Mode, clientOnlyTags *map[string]ircmsg.TagValue, client *Client, message SplitMessage, rb *ResponseBuffer) {
|
|
586
|
+ channel.sendSplitMessage(msgid, "PRIVMSG", minPrefix, clientOnlyTags, client, &message, rb)
|
567
|
587
|
}
|
568
|
588
|
|
569
|
589
|
// SplitNotice sends a private message to everyone in this channel.
|
570
|
|
-func (channel *Channel) SplitNotice(msgid string, minPrefix *modes.Mode, clientOnlyTags *map[string]ircmsg.TagValue, client *Client, message SplitMessage) {
|
571
|
|
- channel.sendSplitMessage(msgid, "NOTICE", minPrefix, clientOnlyTags, client, &message)
|
|
590
|
+func (channel *Channel) SplitNotice(msgid string, minPrefix *modes.Mode, clientOnlyTags *map[string]ircmsg.TagValue, client *Client, message SplitMessage, rb *ResponseBuffer) {
|
|
591
|
+ channel.sendSplitMessage(msgid, "NOTICE", minPrefix, clientOnlyTags, client, &message, rb)
|
572
|
592
|
}
|
573
|
593
|
|
574
|
|
-func (channel *Channel) sendSplitMessage(msgid, cmd string, minPrefix *modes.Mode, clientOnlyTags *map[string]ircmsg.TagValue, client *Client, message *SplitMessage) {
|
|
594
|
+func (channel *Channel) sendSplitMessage(msgid, cmd string, minPrefix *modes.Mode, clientOnlyTags *map[string]ircmsg.TagValue, client *Client, message *SplitMessage, rb *ResponseBuffer) {
|
575
|
595
|
if !channel.CanSpeak(client) {
|
576
|
|
- client.Send(nil, client.server.name, ERR_CANNOTSENDTOCHAN, channel.name, client.t("Cannot send to channel"))
|
|
596
|
+ rb.Add(nil, client.server.name, ERR_CANNOTSENDTOCHAN, channel.name, client.t("Cannot send to channel"))
|
577
|
597
|
return
|
578
|
598
|
}
|
579
|
599
|
|
|
@@ -595,25 +615,33 @@ func (channel *Channel) sendSplitMessage(msgid, cmd string, minPrefix *modes.Mod
|
595
|
615
|
tagsToUse = clientOnlyTags
|
596
|
616
|
}
|
597
|
617
|
|
598
|
|
- if message == nil {
|
599
|
|
- member.SendFromClient(msgid, client, tagsToUse, cmd, channel.name)
|
|
618
|
+ if member == client {
|
|
619
|
+ if message == nil {
|
|
620
|
+ rb.AddFromClient(msgid, client, tagsToUse, cmd, channel.name)
|
|
621
|
+ } else {
|
|
622
|
+ rb.AddSplitMessageFromClient(msgid, client, tagsToUse, cmd, channel.name, *message)
|
|
623
|
+ }
|
600
|
624
|
} else {
|
601
|
|
- member.SendSplitMsgFromClient(msgid, client, tagsToUse, cmd, channel.name, *message)
|
|
625
|
+ if message == nil {
|
|
626
|
+ member.SendFromClient(msgid, client, tagsToUse, cmd, channel.name)
|
|
627
|
+ } else {
|
|
628
|
+ member.SendSplitMsgFromClient(msgid, client, tagsToUse, cmd, channel.name, *message)
|
|
629
|
+ }
|
602
|
630
|
}
|
603
|
631
|
}
|
604
|
632
|
}
|
605
|
633
|
|
606
|
|
-func (channel *Channel) applyModeMemberNoMutex(client *Client, mode modes.Mode, op modes.ModeOp, nick string) *modes.ModeChange {
|
|
634
|
+func (channel *Channel) applyModeMemberNoMutex(client *Client, mode modes.Mode, op modes.ModeOp, nick string, rb *ResponseBuffer) *modes.ModeChange {
|
607
|
635
|
if nick == "" {
|
608
|
636
|
//TODO(dan): shouldn't this be handled before it reaches this function?
|
609
|
|
- client.Send(nil, client.server.name, ERR_NEEDMOREPARAMS, "MODE", client.t("Not enough parameters"))
|
|
637
|
+ rb.Add(nil, client.server.name, ERR_NEEDMOREPARAMS, "MODE", client.t("Not enough parameters"))
|
610
|
638
|
return nil
|
611
|
639
|
}
|
612
|
640
|
|
613
|
641
|
casefoldedName, err := CasefoldName(nick)
|
614
|
642
|
target := channel.server.clients.Get(casefoldedName)
|
615
|
643
|
if err != nil || target == nil {
|
616
|
|
- client.Send(nil, client.server.name, ERR_NOSUCHNICK, client.nick, nick, client.t("No such nick"))
|
|
644
|
+ rb.Add(nil, client.server.name, ERR_NOSUCHNICK, client.nick, nick, client.t("No such nick"))
|
617
|
645
|
return nil
|
618
|
646
|
}
|
619
|
647
|
|
|
@@ -628,7 +656,7 @@ func (channel *Channel) applyModeMemberNoMutex(client *Client, mode modes.Mode,
|
628
|
656
|
channel.stateMutex.Unlock()
|
629
|
657
|
|
630
|
658
|
if !exists {
|
631
|
|
- client.Send(nil, client.server.name, ERR_USERNOTINCHANNEL, client.nick, channel.name, client.t("They aren't on that channel"))
|
|
659
|
+ rb.Add(nil, client.server.name, ERR_USERNOTINCHANNEL, client.nick, channel.name, client.t("They aren't on that channel"))
|
632
|
660
|
return nil
|
633
|
661
|
} else if already {
|
634
|
662
|
return nil
|
|
@@ -642,7 +670,7 @@ func (channel *Channel) applyModeMemberNoMutex(client *Client, mode modes.Mode,
|
642
|
670
|
}
|
643
|
671
|
|
644
|
672
|
// ShowMaskList shows the given list to the client.
|
645
|
|
-func (channel *Channel) ShowMaskList(client *Client, mode modes.Mode) {
|
|
673
|
+func (channel *Channel) ShowMaskList(client *Client, mode modes.Mode, rb *ResponseBuffer) {
|
646
|
674
|
// choose appropriate modes
|
647
|
675
|
var rpllist, rplendoflist string
|
648
|
676
|
if mode == modes.BanMask {
|
|
@@ -660,14 +688,14 @@ func (channel *Channel) ShowMaskList(client *Client, mode modes.Mode) {
|
660
|
688
|
channel.stateMutex.RLock()
|
661
|
689
|
// XXX don't acquire any new locks in this section, besides Socket.Write
|
662
|
690
|
for mask := range channel.lists[mode].masks {
|
663
|
|
- client.Send(nil, client.server.name, rpllist, nick, channel.name, mask)
|
|
691
|
+ rb.Add(nil, client.server.name, rpllist, nick, channel.name, mask)
|
664
|
692
|
}
|
665
|
693
|
channel.stateMutex.RUnlock()
|
666
|
694
|
|
667
|
|
- client.Send(nil, client.server.name, rplendoflist, nick, channel.name, client.t("End of list"))
|
|
695
|
+ rb.Add(nil, client.server.name, rplendoflist, nick, channel.name, client.t("End of list"))
|
668
|
696
|
}
|
669
|
697
|
|
670
|
|
-func (channel *Channel) applyModeMask(client *Client, mode modes.Mode, op modes.ModeOp, mask string) bool {
|
|
698
|
+func (channel *Channel) applyModeMask(client *Client, mode modes.Mode, op modes.ModeOp, mask string, rb *ResponseBuffer) bool {
|
671
|
699
|
list := channel.lists[mode]
|
672
|
700
|
if list == nil {
|
673
|
701
|
// This should never happen, but better safe than panicky.
|
|
@@ -675,12 +703,12 @@ func (channel *Channel) applyModeMask(client *Client, mode modes.Mode, op modes.
|
675
|
703
|
}
|
676
|
704
|
|
677
|
705
|
if (op == modes.List) || (mask == "") {
|
678
|
|
- channel.ShowMaskList(client, mode)
|
|
706
|
+ channel.ShowMaskList(client, mode, rb)
|
679
|
707
|
return false
|
680
|
708
|
}
|
681
|
709
|
|
682
|
710
|
if !channel.ClientIsAtLeast(client, modes.ChannelOperator) {
|
683
|
|
- client.Send(nil, client.server.name, ERR_CHANOPRIVSNEEDED, channel.name, client.t("You're not a channel operator"))
|
|
711
|
+ rb.Add(nil, client.server.name, ERR_CHANOPRIVSNEEDED, channel.name, client.t("You're not a channel operator"))
|
684
|
712
|
return false
|
685
|
713
|
}
|
686
|
714
|
|
|
@@ -705,21 +733,21 @@ func (channel *Channel) Quit(client *Client) {
|
705
|
733
|
client.removeChannel(channel)
|
706
|
734
|
}
|
707
|
735
|
|
708
|
|
-func (channel *Channel) Kick(client *Client, target *Client, comment string) {
|
|
736
|
+func (channel *Channel) Kick(client *Client, target *Client, comment string, rb *ResponseBuffer) {
|
709
|
737
|
if !(client.flags[modes.Operator] || channel.hasClient(client)) {
|
710
|
|
- client.Send(nil, client.server.name, ERR_NOTONCHANNEL, channel.name, client.t("You're not on that channel"))
|
|
738
|
+ rb.Add(nil, client.server.name, ERR_NOTONCHANNEL, channel.name, client.t("You're not on that channel"))
|
711
|
739
|
return
|
712
|
740
|
}
|
713
|
741
|
if !channel.ClientIsAtLeast(client, modes.ChannelOperator) {
|
714
|
|
- client.Send(nil, client.server.name, ERR_CANNOTSENDTOCHAN, channel.name, client.t("Cannot send to channel"))
|
|
742
|
+ rb.Add(nil, client.server.name, ERR_CANNOTSENDTOCHAN, channel.name, client.t("Cannot send to channel"))
|
715
|
743
|
return
|
716
|
744
|
}
|
717
|
745
|
if !channel.hasClient(target) {
|
718
|
|
- client.Send(nil, client.server.name, ERR_USERNOTINCHANNEL, client.nick, channel.name, client.t("They aren't on that channel"))
|
|
746
|
+ rb.Add(nil, client.server.name, ERR_USERNOTINCHANNEL, client.nick, channel.name, client.t("They aren't on that channel"))
|
719
|
747
|
return
|
720
|
748
|
}
|
721
|
749
|
if !channel.ClientHasPrivsOver(client, target) {
|
722
|
|
- client.Send(nil, client.server.name, ERR_CHANOPRIVSNEEDED, channel.name, client.t("You're not a channel operator"))
|
|
750
|
+ rb.Add(nil, client.server.name, ERR_CHANOPRIVSNEEDED, channel.name, client.t("You're not a channel operator"))
|
723
|
751
|
return
|
724
|
752
|
}
|
725
|
753
|
|
|
@@ -738,14 +766,14 @@ func (channel *Channel) Kick(client *Client, target *Client, comment string) {
|
738
|
766
|
}
|
739
|
767
|
|
740
|
768
|
// Invite invites the given client to the channel, if the inviter can do so.
|
741
|
|
-func (channel *Channel) Invite(invitee *Client, inviter *Client) {
|
|
769
|
+func (channel *Channel) Invite(invitee *Client, inviter *Client, rb *ResponseBuffer) {
|
742
|
770
|
if channel.flags[modes.InviteOnly] && !channel.ClientIsAtLeast(inviter, modes.ChannelOperator) {
|
743
|
|
- inviter.Send(nil, inviter.server.name, ERR_CHANOPRIVSNEEDED, channel.name, inviter.t("You're not a channel operator"))
|
|
771
|
+ rb.Add(nil, inviter.server.name, ERR_CHANOPRIVSNEEDED, channel.name, inviter.t("You're not a channel operator"))
|
744
|
772
|
return
|
745
|
773
|
}
|
746
|
774
|
|
747
|
775
|
if !channel.hasClient(inviter) {
|
748
|
|
- inviter.Send(nil, inviter.server.name, ERR_NOTONCHANNEL, channel.name, inviter.t("You're not on that channel"))
|
|
776
|
+ rb.Add(nil, inviter.server.name, ERR_NOTONCHANNEL, channel.name, inviter.t("You're not on that channel"))
|
749
|
777
|
return
|
750
|
778
|
}
|
751
|
779
|
|
|
@@ -764,9 +792,9 @@ func (channel *Channel) Invite(invitee *Client, inviter *Client) {
|
764
|
792
|
}
|
765
|
793
|
|
766
|
794
|
//TODO(dan): should inviter.server.name here be inviter.nickMaskString ?
|
767
|
|
- inviter.Send(nil, inviter.server.name, RPL_INVITING, invitee.nick, channel.name)
|
|
795
|
+ rb.Add(nil, inviter.server.name, RPL_INVITING, invitee.nick, channel.name)
|
768
|
796
|
invitee.Send(nil, inviter.nickMaskString, "INVITE", invitee.nick, channel.name)
|
769
|
797
|
if invitee.flags[modes.Away] {
|
770
|
|
- inviter.Send(nil, inviter.server.name, RPL_AWAY, invitee.nick, invitee.awayMessage)
|
|
798
|
+ rb.Add(nil, inviter.server.name, RPL_AWAY, invitee.nick, invitee.awayMessage)
|
771
|
799
|
}
|
772
|
800
|
}
|