|
@@ -326,11 +326,15 @@ func (client *Client) applyUserModeChanges(force bool, changes ModeChanges) Mode
|
326
|
326
|
|
327
|
327
|
// MODE <target> [<modestring> [<mode arguments>...]]
|
328
|
328
|
func umodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
|
329
|
+ rb := NewResponseBuffer(client)
|
|
330
|
+ rb.Label = GetLabel(msg)
|
|
331
|
+ defer rb.Send()
|
|
332
|
+
|
329
|
333
|
nickname, err := CasefoldName(msg.Params[0])
|
330
|
334
|
target := server.clients.Get(nickname)
|
331
|
335
|
if err != nil || target == nil {
|
332
|
336
|
if len(msg.Params[0]) > 0 {
|
333
|
|
- client.Send(nil, server.name, ERR_NOSUCHNICK, client.nick, msg.Params[0], client.t("No such nick"))
|
|
337
|
+ rb.Add(nil, server.name, ERR_NOSUCHNICK, client.nick, msg.Params[0], client.t("No such nick"))
|
334
|
338
|
}
|
335
|
339
|
return false
|
336
|
340
|
}
|
|
@@ -340,9 +344,9 @@ func umodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
340
|
344
|
|
341
|
345
|
if !hasPrivs {
|
342
|
346
|
if len(msg.Params) > 1 {
|
343
|
|
- client.Send(nil, server.name, ERR_USERSDONTMATCH, client.nick, client.t("Can't change modes for other users"))
|
|
347
|
+ rb.Add(nil, server.name, ERR_USERSDONTMATCH, client.nick, client.t("Can't change modes for other users"))
|
344
|
348
|
} else {
|
345
|
|
- client.Send(nil, server.name, ERR_USERSDONTMATCH, client.nick, client.t("Can't view modes for other users"))
|
|
349
|
+ rb.Add(nil, server.name, ERR_USERSDONTMATCH, client.nick, client.t("Can't view modes for other users"))
|
346
|
350
|
}
|
347
|
351
|
return false
|
348
|
352
|
}
|
|
@@ -357,7 +361,7 @@ func umodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
357
|
361
|
|
358
|
362
|
// alert for unknown mode changes
|
359
|
363
|
for char := range unknown {
|
360
|
|
- client.Send(nil, server.name, ERR_UNKNOWNMODE, client.nick, string(char), client.t("is an unknown mode character to me"))
|
|
364
|
+ rb.Add(nil, server.name, ERR_UNKNOWNMODE, client.nick, string(char), client.t("is an unknown mode character to me"))
|
361
|
365
|
}
|
362
|
366
|
if len(unknown) == 1 && len(changes) == 0 {
|
363
|
367
|
return false
|
|
@@ -368,13 +372,13 @@ func umodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
368
|
372
|
}
|
369
|
373
|
|
370
|
374
|
if len(applied) > 0 {
|
371
|
|
- client.Send(nil, client.nickMaskString, "MODE", targetNick, applied.String())
|
|
375
|
+ rb.Add(nil, client.nickMaskString, "MODE", targetNick, applied.String())
|
372
|
376
|
} else if hasPrivs {
|
373
|
|
- client.Send(nil, target.nickMaskString, RPL_UMODEIS, targetNick, target.ModeString())
|
|
377
|
+ rb.Add(nil, target.nickMaskString, RPL_UMODEIS, targetNick, target.ModeString())
|
374
|
378
|
if client.flags[LocalOperator] || client.flags[Operator] {
|
375
|
379
|
masks := server.snomasks.String(client)
|
376
|
380
|
if 0 < len(masks) {
|
377
|
|
- client.Send(nil, target.nickMaskString, RPL_SNOMASKIS, targetNick, masks, client.t("Server notice masks"))
|
|
381
|
+ rb.Add(nil, target.nickMaskString, RPL_SNOMASKIS, targetNick, masks, client.t("Server notice masks"))
|
378
|
382
|
}
|
379
|
383
|
}
|
380
|
384
|
}
|
|
@@ -476,7 +480,7 @@ func ParseChannelModeChanges(params ...string) (ModeChanges, map[rune]bool) {
|
476
|
480
|
}
|
477
|
481
|
|
478
|
482
|
// ApplyChannelModeChanges applies a given set of mode changes.
|
479
|
|
-func (channel *Channel) ApplyChannelModeChanges(client *Client, isSamode bool, changes ModeChanges) ModeChanges {
|
|
483
|
+func (channel *Channel) ApplyChannelModeChanges(client *Client, isSamode bool, changes ModeChanges, rb *ResponseBuffer) ModeChanges {
|
480
|
484
|
// so we only output one warning for each list type when full
|
481
|
485
|
listFullWarned := make(map[Mode]bool)
|
482
|
486
|
|
|
@@ -521,7 +525,7 @@ func (channel *Channel) ApplyChannelModeChanges(client *Client, isSamode bool, c
|
521
|
525
|
if !hasPrivs(change) {
|
522
|
526
|
if !alreadySentPrivError {
|
523
|
527
|
alreadySentPrivError = true
|
524
|
|
- client.Send(nil, client.server.name, ERR_CHANOPRIVSNEEDED, channel.name, client.t("You're not a channel operator"))
|
|
528
|
+ rb.Add(nil, client.server.name, ERR_CHANOPRIVSNEEDED, channel.name, client.t("You're not a channel operator"))
|
525
|
529
|
}
|
526
|
530
|
continue
|
527
|
531
|
}
|
|
@@ -543,7 +547,7 @@ func (channel *Channel) ApplyChannelModeChanges(client *Client, isSamode bool, c
|
543
|
547
|
case Add:
|
544
|
548
|
if channel.lists[change.mode].Length() >= client.server.Limits().ChanListModes {
|
545
|
549
|
if !listFullWarned[change.mode] {
|
546
|
|
- client.Send(nil, client.server.name, ERR_BANLISTFULL, client.Nick(), channel.Name(), change.mode.String(), client.t("Channel list is full"))
|
|
550
|
+ rb.Add(nil, client.server.name, ERR_BANLISTFULL, client.Nick(), channel.Name(), change.mode.String(), client.t("Channel list is full"))
|
547
|
551
|
listFullWarned[change.mode] = true
|
548
|
552
|
}
|
549
|
553
|
continue
|
|
@@ -608,11 +612,15 @@ func (channel *Channel) ApplyChannelModeChanges(client *Client, isSamode bool, c
|
608
|
612
|
|
609
|
613
|
// MODE <target> [<modestring> [<mode arguments>...]]
|
610
|
614
|
func cmodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
|
615
|
+ rb := NewResponseBuffer(client)
|
|
616
|
+ rb.Label = GetLabel(msg)
|
|
617
|
+ defer rb.Send()
|
|
618
|
+
|
611
|
619
|
channelName, err := CasefoldChannel(msg.Params[0])
|
612
|
620
|
channel := server.channels.Get(channelName)
|
613
|
621
|
|
614
|
622
|
if err != nil || channel == nil {
|
615
|
|
- client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, msg.Params[0], client.t("No such channel"))
|
|
623
|
+ rb.Add(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, msg.Params[0], client.t("No such channel"))
|
616
|
624
|
return false
|
617
|
625
|
}
|
618
|
626
|
|
|
@@ -626,14 +634,14 @@ func cmodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
626
|
634
|
|
627
|
635
|
// alert for unknown mode changes
|
628
|
636
|
for char := range unknown {
|
629
|
|
- client.Send(nil, server.name, ERR_UNKNOWNMODE, client.nick, string(char), client.t("is an unknown mode character to me"))
|
|
637
|
+ rb.Add(nil, server.name, ERR_UNKNOWNMODE, client.nick, string(char), client.t("is an unknown mode character to me"))
|
630
|
638
|
}
|
631
|
639
|
if len(unknown) == 1 && len(changes) == 0 {
|
632
|
640
|
return false
|
633
|
641
|
}
|
634
|
642
|
|
635
|
643
|
// apply mode changes
|
636
|
|
- applied = channel.ApplyChannelModeChanges(client, msg.Command == "SAMODE", changes)
|
|
644
|
+ applied = channel.ApplyChannelModeChanges(client, msg.Command == "SAMODE", changes, rb)
|
637
|
645
|
}
|
638
|
646
|
|
639
|
647
|
// save changes to banlist/exceptlist/invexlist
|
|
@@ -661,8 +669,8 @@ func cmodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
661
|
669
|
}
|
662
|
670
|
} else {
|
663
|
671
|
args := append([]string{client.nick, channel.name}, channel.modeStrings(client)...)
|
664
|
|
- client.Send(nil, client.nickMaskString, RPL_CHANNELMODEIS, args...)
|
665
|
|
- client.Send(nil, client.nickMaskString, RPL_CHANNELCREATED, client.nick, channel.name, strconv.FormatInt(channel.createdTime.Unix(), 10))
|
|
672
|
+ rb.Add(nil, client.nickMaskString, RPL_CHANNELMODEIS, args...)
|
|
673
|
+ rb.Add(nil, client.nickMaskString, RPL_CHANNELCREATED, client.nick, channel.name, strconv.FormatInt(channel.createdTime.Unix(), 10))
|
666
|
674
|
}
|
667
|
675
|
return false
|
668
|
676
|
}
|