|
@@ -12,6 +12,7 @@ import (
|
12
|
12
|
"errors"
|
13
|
13
|
"fmt"
|
14
|
14
|
"log"
|
|
15
|
+ "math/rand"
|
15
|
16
|
"net"
|
16
|
17
|
"net/http"
|
17
|
18
|
"os"
|
|
@@ -606,6 +607,11 @@ func (server *Server) wslisten(addr string, tlsMap map[string]*TLSListenConfig)
|
606
|
607
|
}()
|
607
|
608
|
}
|
608
|
609
|
|
|
610
|
+// generateMessageID returns a network-unique message ID.
|
|
611
|
+func (server *Server) generateMessageID() string {
|
|
612
|
+ return fmt.Sprintf("%s-%s", strconv.FormatInt(time.Now().UTC().UnixNano(), 10), strconv.FormatInt(rand.Int63(), 10))
|
|
613
|
+}
|
|
614
|
+
|
609
|
615
|
//
|
610
|
616
|
// server functionality
|
611
|
617
|
//
|
|
@@ -937,7 +943,8 @@ func privmsgHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool
|
937
|
943
|
client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, targetString, "No such channel")
|
938
|
944
|
continue
|
939
|
945
|
}
|
940
|
|
- channel.SplitPrivMsg(lowestPrefix, clientOnlyTags, client, splitMsg)
|
|
946
|
+ msgid := server.generateMessageID()
|
|
947
|
+ channel.SplitPrivMsg(msgid, lowestPrefix, clientOnlyTags, client, splitMsg)
|
941
|
948
|
} else {
|
942
|
949
|
target, err = CasefoldName(targetString)
|
943
|
950
|
user := server.clients.Get(target)
|
|
@@ -950,9 +957,10 @@ func privmsgHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool
|
950
|
957
|
if !user.capabilities[MessageTags] {
|
951
|
958
|
clientOnlyTags = nil
|
952
|
959
|
}
|
953
|
|
- user.SendSplitMsgFromClient(client, clientOnlyTags, "PRIVMSG", user.nick, splitMsg)
|
|
960
|
+ msgid := server.generateMessageID()
|
|
961
|
+ user.SendSplitMsgFromClient(msgid, client, clientOnlyTags, "PRIVMSG", user.nick, splitMsg)
|
954
|
962
|
if client.capabilities[EchoMessage] {
|
955
|
|
- client.SendFromClient(client, clientOnlyTags, client.nickMaskString, "PRIVMSG", user.nick, message)
|
|
963
|
+ client.SendSplitMsgFromClient(msgid, client, clientOnlyTags, "PRIVMSG", user.nick, splitMsg)
|
956
|
964
|
}
|
957
|
965
|
if user.flags[Away] {
|
958
|
966
|
//TODO(dan): possibly implement cooldown of away notifications to users
|
|
@@ -993,7 +1001,9 @@ func tagmsgHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
993
|
1001
|
client.Send(nil, server.name, ERR_NOSUCHCHANNEL, client.nick, targetString, "No such channel")
|
994
|
1002
|
continue
|
995
|
1003
|
}
|
996
|
|
- channel.TagMsg(lowestPrefix, clientOnlyTags, client)
|
|
1004
|
+ msgid := server.generateMessageID()
|
|
1005
|
+
|
|
1006
|
+ channel.TagMsg(msgid, lowestPrefix, clientOnlyTags, client)
|
997
|
1007
|
} else {
|
998
|
1008
|
target, err = CasefoldName(targetString)
|
999
|
1009
|
user := server.clients.Get(target)
|
|
@@ -1003,13 +1013,15 @@ func tagmsgHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
1003
|
1013
|
}
|
1004
|
1014
|
continue
|
1005
|
1015
|
}
|
|
1016
|
+ msgid := server.generateMessageID()
|
|
1017
|
+
|
1006
|
1018
|
// end user can't receive tagmsgs
|
1007
|
1019
|
if !user.capabilities[MessageTags] {
|
1008
|
1020
|
continue
|
1009
|
1021
|
}
|
1010
|
|
- user.SendFromClient(client, clientOnlyTags, "TAGMSG", user.nick)
|
|
1022
|
+ user.SendFromClient(msgid, client, clientOnlyTags, "TAGMSG", user.nick)
|
1011
|
1023
|
if client.capabilities[EchoMessage] {
|
1012
|
|
- client.SendFromClient(client, clientOnlyTags, "TAGMSG", user.nick)
|
|
1024
|
+ client.SendFromClient(msgid, client, clientOnlyTags, "TAGMSG", user.nick)
|
1013
|
1025
|
}
|
1014
|
1026
|
if user.flags[Away] {
|
1015
|
1027
|
//TODO(dan): possibly implement cooldown of away notifications to users
|
|
@@ -1210,7 +1222,7 @@ func operHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
1210
|
1222
|
originalHost := client.nickMaskString
|
1211
|
1223
|
client.vhost = server.operators[name].Vhost
|
1212
|
1224
|
for fClient := range client.Friends(ChgHost) {
|
1213
|
|
- fClient.SendFromClient(client, nil, originalHost, "CHGHOST", client.username, client.vhost)
|
|
1225
|
+ fClient.SendFromClient("", client, nil, originalHost, "CHGHOST", client.username, client.vhost)
|
1214
|
1226
|
}
|
1215
|
1227
|
client.updateNickMask()
|
1216
|
1228
|
}
|
|
@@ -1449,9 +1461,9 @@ func awayHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
1449
|
1461
|
// dispatch away-notify
|
1450
|
1462
|
for friend := range client.Friends(AwayNotify) {
|
1451
|
1463
|
if client.flags[Away] {
|
1452
|
|
- friend.SendFromClient(client, nil, client.nickMaskString, "AWAY", client.awayMessage)
|
|
1464
|
+ friend.SendFromClient("", client, nil, client.nickMaskString, "AWAY", client.awayMessage)
|
1453
|
1465
|
} else {
|
1454
|
|
- friend.SendFromClient(client, nil, client.nickMaskString, "AWAY")
|
|
1466
|
+ friend.SendFromClient("", client, nil, client.nickMaskString, "AWAY")
|
1455
|
1467
|
}
|
1456
|
1468
|
}
|
1457
|
1469
|
|
|
@@ -1515,7 +1527,8 @@ func noticeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
1515
|
1527
|
// errors silently ignored with NOTICE as per RFC
|
1516
|
1528
|
continue
|
1517
|
1529
|
}
|
1518
|
|
- channel.SplitNotice(lowestPrefix, clientOnlyTags, client, splitMsg)
|
|
1530
|
+ msgid := server.generateMessageID()
|
|
1531
|
+ channel.SplitNotice(msgid, lowestPrefix, clientOnlyTags, client, splitMsg)
|
1519
|
1532
|
} else {
|
1520
|
1533
|
target, err := CasefoldName(targetString)
|
1521
|
1534
|
if err != nil {
|
|
@@ -1530,9 +1543,10 @@ func noticeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
1530
|
1543
|
if !user.capabilities[MessageTags] {
|
1531
|
1544
|
clientOnlyTags = nil
|
1532
|
1545
|
}
|
1533
|
|
- user.SendSplitMsgFromClient(client, clientOnlyTags, "NOTICE", user.nick, splitMsg)
|
|
1546
|
+ msgid := server.generateMessageID()
|
|
1547
|
+ user.SendSplitMsgFromClient(msgid, client, clientOnlyTags, "NOTICE", user.nick, splitMsg)
|
1534
|
1548
|
if client.capabilities[EchoMessage] {
|
1535
|
|
- client.SendFromClient(client, clientOnlyTags, client.nickMaskString, "NOTICE", user.nick, message)
|
|
1549
|
+ client.SendSplitMsgFromClient(msgid, client, clientOnlyTags, "NOTICE", user.nick, splitMsg)
|
1536
|
1550
|
}
|
1537
|
1551
|
}
|
1538
|
1552
|
}
|