|
@@ -729,6 +729,7 @@ func (channel *Channel) AddHistoryItem(item history.Item, account string) (err e
|
729
|
729
|
// Join joins the given client to this channel (if they can be joined).
|
730
|
730
|
func (channel *Channel) Join(client *Client, key string, isSajoin bool, rb *ResponseBuffer) (joinErr error, forward string) {
|
731
|
731
|
details := client.Details()
|
|
732
|
+ isBot := client.HasMode(modes.Bot)
|
732
|
733
|
|
733
|
734
|
channel.stateMutex.RLock()
|
734
|
735
|
chname := channel.name
|
|
@@ -824,6 +825,7 @@ func (channel *Channel) Join(client *Client, key string, isSajoin bool, rb *Resp
|
824
|
825
|
Nick: details.nickMask,
|
825
|
826
|
AccountName: details.accountName,
|
826
|
827
|
Message: message,
|
|
828
|
+ IsBot: isBot,
|
827
|
829
|
}
|
828
|
830
|
histItem.Params[0] = details.realname
|
829
|
831
|
channel.AddHistoryItem(histItem, details.account)
|
|
@@ -840,7 +842,7 @@ func (channel *Channel) Join(client *Client, key string, isSajoin bool, rb *Resp
|
840
|
842
|
|
841
|
843
|
// cache the most common case (JOIN without extended-join)
|
842
|
844
|
var cache MessageCache
|
843
|
|
- cache.Initialize(channel.server, message.Time, message.Msgid, details.nickMask, details.accountName, nil, "JOIN", chname)
|
|
845
|
+ cache.Initialize(channel.server, message.Time, message.Msgid, details.nickMask, details.accountName, isBot, nil, "JOIN", chname)
|
844
|
846
|
isAway, awayMessage := client.Away()
|
845
|
847
|
for _, member := range channel.Members() {
|
846
|
848
|
if respectAuditorium {
|
|
@@ -859,7 +861,7 @@ func (channel *Channel) Join(client *Client, key string, isSajoin bool, rb *Resp
|
859
|
861
|
continue
|
860
|
862
|
}
|
861
|
863
|
if session.capabilities.Has(caps.ExtendedJoin) {
|
862
|
|
- session.sendFromClientInternal(false, message.Time, message.Msgid, details.nickMask, details.accountName, nil, "JOIN", chname, details.accountName, details.realname)
|
|
864
|
+ session.sendFromClientInternal(false, message.Time, message.Msgid, details.nickMask, details.accountName, isBot, nil, "JOIN", chname, details.accountName, details.realname)
|
863
|
865
|
} else {
|
864
|
866
|
cache.Send(session)
|
865
|
867
|
}
|
|
@@ -867,15 +869,15 @@ func (channel *Channel) Join(client *Client, key string, isSajoin bool, rb *Resp
|
867
|
869
|
session.Send(nil, client.server.name, "MODE", chname, modestr, details.nick)
|
868
|
870
|
}
|
869
|
871
|
if isAway && session.capabilities.Has(caps.AwayNotify) {
|
870
|
|
- session.sendFromClientInternal(false, time.Time{}, "", details.nickMask, details.accountName, nil, "AWAY", awayMessage)
|
|
872
|
+ session.sendFromClientInternal(false, time.Time{}, "", details.nickMask, details.accountName, isBot, nil, "AWAY", awayMessage)
|
871
|
873
|
}
|
872
|
874
|
}
|
873
|
875
|
}
|
874
|
876
|
|
875
|
877
|
if rb.session.capabilities.Has(caps.ExtendedJoin) {
|
876
|
|
- rb.AddFromClient(message.Time, message.Msgid, details.nickMask, details.accountName, nil, "JOIN", chname, details.accountName, details.realname)
|
|
878
|
+ rb.AddFromClient(message.Time, message.Msgid, details.nickMask, details.accountName, isBot, nil, "JOIN", chname, details.accountName, details.realname)
|
877
|
879
|
} else {
|
878
|
|
- rb.AddFromClient(message.Time, message.Msgid, details.nickMask, details.accountName, nil, "JOIN", chname)
|
|
880
|
+ rb.AddFromClient(message.Time, message.Msgid, details.nickMask, details.accountName, isBot, nil, "JOIN", chname)
|
879
|
881
|
}
|
880
|
882
|
|
881
|
883
|
if rb.session.client == client {
|
|
@@ -988,6 +990,7 @@ func (channel *Channel) Part(client *Client, message string, rb *ResponseBuffer)
|
988
|
990
|
splitMessage := utils.MakeMessage(message)
|
989
|
991
|
|
990
|
992
|
details := client.Details()
|
|
993
|
+ isBot := client.HasMode(modes.Bot)
|
991
|
994
|
params := make([]string, 1, 2)
|
992
|
995
|
params[0] = chname
|
993
|
996
|
if message != "" {
|
|
@@ -996,7 +999,7 @@ func (channel *Channel) Part(client *Client, message string, rb *ResponseBuffer)
|
996
|
999
|
respectAuditorium := channel.flags.HasMode(modes.Auditorium) &&
|
997
|
1000
|
clientData.modes.HighestChannelUserMode() == modes.Mode(0)
|
998
|
1001
|
var cache MessageCache
|
999
|
|
- cache.Initialize(channel.server, splitMessage.Time, splitMessage.Msgid, details.nickMask, details.accountName, nil, "PART", params...)
|
|
1002
|
+ cache.Initialize(channel.server, splitMessage.Time, splitMessage.Msgid, details.nickMask, details.accountName, isBot, nil, "PART", params...)
|
1000
|
1003
|
for _, member := range channel.Members() {
|
1001
|
1004
|
if respectAuditorium {
|
1002
|
1005
|
channel.stateMutex.RLock()
|
|
@@ -1010,10 +1013,10 @@ func (channel *Channel) Part(client *Client, message string, rb *ResponseBuffer)
|
1010
|
1013
|
cache.Send(session)
|
1011
|
1014
|
}
|
1012
|
1015
|
}
|
1013
|
|
- rb.AddFromClient(splitMessage.Time, splitMessage.Msgid, details.nickMask, details.accountName, nil, "PART", params...)
|
|
1016
|
+ rb.AddFromClient(splitMessage.Time, splitMessage.Msgid, details.nickMask, details.accountName, isBot, nil, "PART", params...)
|
1014
|
1017
|
for _, session := range client.Sessions() {
|
1015
|
1018
|
if session != rb.session {
|
1016
|
|
- session.sendFromClientInternal(false, splitMessage.Time, splitMessage.Msgid, details.nickMask, details.accountName, nil, "PART", params...)
|
|
1019
|
+ session.sendFromClientInternal(false, splitMessage.Time, splitMessage.Msgid, details.nickMask, details.accountName, isBot, nil, "PART", params...)
|
1017
|
1020
|
}
|
1018
|
1021
|
}
|
1019
|
1022
|
|
|
@@ -1023,6 +1026,7 @@ func (channel *Channel) Part(client *Client, message string, rb *ResponseBuffer)
|
1023
|
1026
|
Nick: details.nickMask,
|
1024
|
1027
|
AccountName: details.accountName,
|
1025
|
1028
|
Message: splitMessage,
|
|
1029
|
+ IsBot: isBot,
|
1026
|
1030
|
}, details.account)
|
1027
|
1031
|
}
|
1028
|
1032
|
|
|
@@ -1133,19 +1137,19 @@ func (channel *Channel) replayHistoryItems(rb *ResponseBuffer, items []history.I
|
1133
|
1137
|
nick := NUHToNick(item.Nick)
|
1134
|
1138
|
switch item.Type {
|
1135
|
1139
|
case history.Privmsg:
|
1136
|
|
- rb.AddSplitMessageFromClient(item.Nick, item.AccountName, item.Tags, "PRIVMSG", chname, item.Message)
|
|
1140
|
+ rb.AddSplitMessageFromClient(item.Nick, item.AccountName, item.IsBot, item.Tags, "PRIVMSG", chname, item.Message)
|
1137
|
1141
|
case history.Notice:
|
1138
|
|
- rb.AddSplitMessageFromClient(item.Nick, item.AccountName, item.Tags, "NOTICE", chname, item.Message)
|
|
1142
|
+ rb.AddSplitMessageFromClient(item.Nick, item.AccountName, item.IsBot, item.Tags, "NOTICE", chname, item.Message)
|
1139
|
1143
|
case history.Tagmsg:
|
1140
|
1144
|
if eventPlayback {
|
1141
|
|
- rb.AddSplitMessageFromClient(item.Nick, item.AccountName, item.Tags, "TAGMSG", chname, item.Message)
|
|
1145
|
+ rb.AddSplitMessageFromClient(item.Nick, item.AccountName, item.IsBot, item.Tags, "TAGMSG", chname, item.Message)
|
1142
|
1146
|
}
|
1143
|
1147
|
case history.Join:
|
1144
|
1148
|
if eventPlayback {
|
1145
|
1149
|
if extendedJoin {
|
1146
|
|
- rb.AddFromClient(item.Message.Time, item.Message.Msgid, item.Nick, item.AccountName, nil, "JOIN", chname, item.AccountName, item.Params[0])
|
|
1150
|
+ rb.AddFromClient(item.Message.Time, item.Message.Msgid, item.Nick, item.AccountName, item.IsBot, nil, "JOIN", chname, item.AccountName, item.Params[0])
|
1147
|
1151
|
} else {
|
1148
|
|
- rb.AddFromClient(item.Message.Time, item.Message.Msgid, item.Nick, item.AccountName, nil, "JOIN", chname)
|
|
1152
|
+ rb.AddFromClient(item.Message.Time, item.Message.Msgid, item.Nick, item.AccountName, item.IsBot, nil, "JOIN", chname)
|
1149
|
1153
|
}
|
1150
|
1154
|
} else {
|
1151
|
1155
|
if !playJoinsAsPrivmsg {
|
|
@@ -1157,48 +1161,48 @@ func (channel *Channel) replayHistoryItems(rb *ResponseBuffer, items []history.I
|
1157
|
1161
|
} else {
|
1158
|
1162
|
message = fmt.Sprintf(client.t("%[1]s [account: %[2]s] joined the channel"), nick, item.AccountName)
|
1159
|
1163
|
}
|
1160
|
|
- rb.AddFromClient(item.Message.Time, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", nil, "PRIVMSG", chname, message)
|
|
1164
|
+ rb.AddFromClient(item.Message.Time, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
|
1161
|
1165
|
}
|
1162
|
1166
|
case history.Part:
|
1163
|
1167
|
if eventPlayback {
|
1164
|
|
- rb.AddFromClient(item.Message.Time, item.Message.Msgid, item.Nick, item.AccountName, nil, "PART", chname, item.Message.Message)
|
|
1168
|
+ rb.AddFromClient(item.Message.Time, item.Message.Msgid, item.Nick, item.AccountName, item.IsBot, nil, "PART", chname, item.Message.Message)
|
1165
|
1169
|
} else {
|
1166
|
1170
|
if !playJoinsAsPrivmsg {
|
1167
|
1171
|
continue // #474
|
1168
|
1172
|
}
|
1169
|
1173
|
message := fmt.Sprintf(client.t("%[1]s left the channel (%[2]s)"), nick, item.Message.Message)
|
1170
|
|
- rb.AddFromClient(item.Message.Time, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", nil, "PRIVMSG", chname, message)
|
|
1174
|
+ rb.AddFromClient(item.Message.Time, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
|
1171
|
1175
|
}
|
1172
|
1176
|
case history.Kick:
|
1173
|
1177
|
if eventPlayback {
|
1174
|
|
- rb.AddFromClient(item.Message.Time, item.Message.Msgid, item.Nick, item.AccountName, nil, "KICK", chname, item.Params[0], item.Message.Message)
|
|
1178
|
+ rb.AddFromClient(item.Message.Time, item.Message.Msgid, item.Nick, item.AccountName, item.IsBot, nil, "KICK", chname, item.Params[0], item.Message.Message)
|
1175
|
1179
|
} else {
|
1176
|
1180
|
message := fmt.Sprintf(client.t("%[1]s kicked %[2]s (%[3]s)"), nick, item.Params[0], item.Message.Message)
|
1177
|
|
- rb.AddFromClient(item.Message.Time, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", nil, "PRIVMSG", chname, message)
|
|
1181
|
+ rb.AddFromClient(item.Message.Time, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
|
1178
|
1182
|
}
|
1179
|
1183
|
case history.Quit:
|
1180
|
1184
|
if eventPlayback {
|
1181
|
|
- rb.AddFromClient(item.Message.Time, item.Message.Msgid, item.Nick, item.AccountName, nil, "QUIT", item.Message.Message)
|
|
1185
|
+ rb.AddFromClient(item.Message.Time, item.Message.Msgid, item.Nick, item.AccountName, item.IsBot, nil, "QUIT", item.Message.Message)
|
1182
|
1186
|
} else {
|
1183
|
1187
|
if !playJoinsAsPrivmsg {
|
1184
|
1188
|
continue // #474
|
1185
|
1189
|
}
|
1186
|
1190
|
message := fmt.Sprintf(client.t("%[1]s quit (%[2]s)"), nick, item.Message.Message)
|
1187
|
|
- rb.AddFromClient(item.Message.Time, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", nil, "PRIVMSG", chname, message)
|
|
1191
|
+ rb.AddFromClient(item.Message.Time, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
|
1188
|
1192
|
}
|
1189
|
1193
|
case history.Nick:
|
1190
|
1194
|
if eventPlayback {
|
1191
|
|
- rb.AddFromClient(item.Message.Time, item.Message.Msgid, item.Nick, item.AccountName, nil, "NICK", item.Params[0])
|
|
1195
|
+ rb.AddFromClient(item.Message.Time, item.Message.Msgid, item.Nick, item.AccountName, item.IsBot, nil, "NICK", item.Params[0])
|
1192
|
1196
|
} else {
|
1193
|
1197
|
message := fmt.Sprintf(client.t("%[1]s changed nick to %[2]s"), nick, item.Params[0])
|
1194
|
|
- rb.AddFromClient(item.Message.Time, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", nil, "PRIVMSG", chname, message)
|
|
1198
|
+ rb.AddFromClient(item.Message.Time, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
|
1195
|
1199
|
}
|
1196
|
1200
|
case history.Topic:
|
1197
|
1201
|
if eventPlayback {
|
1198
|
|
- rb.AddFromClient(item.Message.Time, item.Message.Msgid, item.Nick, item.AccountName, nil, "TOPIC", chname, item.Message.Message)
|
|
1202
|
+ rb.AddFromClient(item.Message.Time, item.Message.Msgid, item.Nick, item.AccountName, item.IsBot, nil, "TOPIC", chname, item.Message.Message)
|
1199
|
1203
|
} else {
|
1200
|
1204
|
message := fmt.Sprintf(client.t("%[1]s set the channel topic to: %[2]s"), nick, item.Message.Message)
|
1201
|
|
- rb.AddFromClient(item.Message.Time, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", nil, "PRIVMSG", chname, message)
|
|
1205
|
+ rb.AddFromClient(item.Message.Time, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
|
1202
|
1206
|
}
|
1203
|
1207
|
case history.Mode:
|
1204
|
1208
|
params := make([]string, len(item.Message.Split)+1)
|
|
@@ -1207,10 +1211,10 @@ func (channel *Channel) replayHistoryItems(rb *ResponseBuffer, items []history.I
|
1207
|
1211
|
params[i+1] = pair.Message
|
1208
|
1212
|
}
|
1209
|
1213
|
if eventPlayback {
|
1210
|
|
- rb.AddFromClient(item.Message.Time, item.Message.Msgid, item.Nick, item.AccountName, nil, "MODE", params...)
|
|
1214
|
+ rb.AddFromClient(item.Message.Time, item.Message.Msgid, item.Nick, item.AccountName, item.IsBot, nil, "MODE", params...)
|
1211
|
1215
|
} else {
|
1212
|
1216
|
message := fmt.Sprintf(client.t("%[1]s set channel modes: %[2]s"), nick, strings.Join(params[1:], " "))
|
1213
|
|
- rb.AddFromClient(item.Message.Time, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", nil, "PRIVMSG", chname, message)
|
|
1217
|
+ rb.AddFromClient(item.Message.Time, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
|
1214
|
1218
|
}
|
1215
|
1219
|
}
|
1216
|
1220
|
}
|
|
@@ -1268,12 +1272,13 @@ func (channel *Channel) SetTopic(client *Client, topic string, rb *ResponseBuffe
|
1268
|
1272
|
channel.stateMutex.Unlock()
|
1269
|
1273
|
|
1270
|
1274
|
details := client.Details()
|
|
1275
|
+ isBot := client.HasMode(modes.Bot)
|
1271
|
1276
|
message := utils.MakeMessage(topic)
|
1272
|
|
- rb.AddFromClient(message.Time, message.Msgid, details.nickMask, details.accountName, nil, "TOPIC", chname, topic)
|
|
1277
|
+ rb.AddFromClient(message.Time, message.Msgid, details.nickMask, details.accountName, isBot, nil, "TOPIC", chname, topic)
|
1273
|
1278
|
for _, member := range channel.Members() {
|
1274
|
1279
|
for _, session := range member.Sessions() {
|
1275
|
1280
|
if session != rb.session {
|
1276
|
|
- session.sendFromClientInternal(false, message.Time, message.Msgid, details.nickMask, details.accountName, nil, "TOPIC", chname, topic)
|
|
1281
|
+ session.sendFromClientInternal(false, message.Time, message.Msgid, details.nickMask, details.accountName, isBot, nil, "TOPIC", chname, topic)
|
1277
|
1282
|
}
|
1278
|
1283
|
}
|
1279
|
1284
|
}
|
|
@@ -1397,7 +1402,7 @@ func (channel *Channel) SendSplitMessage(command string, minPrefixMode modes.Mod
|
1397
|
1402
|
rb.addEchoMessage(clientOnlyTags, details.nickMask, details.accountName, command, chname, message)
|
1398
|
1403
|
|
1399
|
1404
|
var cache MessageCache
|
1400
|
|
- cache.InitializeSplitMessage(channel.server, details.nickMask, details.accountName, clientOnlyTags, command, chname, message)
|
|
1405
|
+ cache.InitializeSplitMessage(channel.server, details.nickMask, details.accountName, client.HasMode(modes.Bot), clientOnlyTags, command, chname, message)
|
1401
|
1406
|
for _, member := range channel.Members() {
|
1402
|
1407
|
if minPrefixMode != modes.Mode(0) && !channel.ClientIsAtLeast(member, minPrefixMode) {
|
1403
|
1408
|
// STATUSMSG or OpModerated
|
|
@@ -1519,23 +1524,25 @@ func (channel *Channel) Kick(client *Client, target *Client, comment string, rb
|
1519
|
1524
|
|
1520
|
1525
|
message := utils.MakeMessage(comment)
|
1521
|
1526
|
details := client.Details()
|
|
1527
|
+ isBot := client.HasMode(modes.Bot)
|
1522
|
1528
|
|
1523
|
1529
|
targetNick := target.Nick()
|
1524
|
1530
|
chname := channel.Name()
|
1525
|
1531
|
for _, member := range channel.Members() {
|
1526
|
1532
|
for _, session := range member.Sessions() {
|
1527
|
1533
|
if session != rb.session {
|
1528
|
|
- session.sendFromClientInternal(false, message.Time, message.Msgid, details.nickMask, details.accountName, nil, "KICK", chname, targetNick, comment)
|
|
1534
|
+ session.sendFromClientInternal(false, message.Time, message.Msgid, details.nickMask, details.accountName, isBot, nil, "KICK", chname, targetNick, comment)
|
1529
|
1535
|
}
|
1530
|
1536
|
}
|
1531
|
1537
|
}
|
1532
|
|
- rb.AddFromClient(message.Time, message.Msgid, details.nickMask, details.accountName, nil, "KICK", chname, targetNick, comment)
|
|
1538
|
+ rb.AddFromClient(message.Time, message.Msgid, details.nickMask, details.accountName, isBot, nil, "KICK", chname, targetNick, comment)
|
1533
|
1539
|
|
1534
|
1540
|
histItem := history.Item{
|
1535
|
1541
|
Type: history.Kick,
|
1536
|
1542
|
Nick: details.nickMask,
|
1537
|
1543
|
AccountName: details.accountName,
|
1538
|
1544
|
Message: message,
|
|
1545
|
+ IsBot: isBot,
|
1539
|
1546
|
}
|
1540
|
1547
|
histItem.Params[0] = targetNick
|
1541
|
1548
|
channel.AddHistoryItem(histItem, details.account)
|
|
@@ -1563,7 +1570,7 @@ func (channel *Channel) Purge(source string) {
|
1563
|
1570
|
tnick := member.Nick()
|
1564
|
1571
|
msgid := utils.GenerateSecretToken()
|
1565
|
1572
|
for _, session := range member.Sessions() {
|
1566
|
|
- session.sendFromClientInternal(false, now, msgid, source, "*", nil, "KICK", chname, tnick, member.t("This channel has been purged by the server administrators and cannot be used"))
|
|
1573
|
+ session.sendFromClientInternal(false, now, msgid, source, "*", false, nil, "KICK", chname, tnick, member.t("This channel has been purged by the server administrators and cannot be used"))
|
1567
|
1574
|
}
|
1568
|
1575
|
member.removeChannel(channel)
|
1569
|
1576
|
}
|
|
@@ -1600,6 +1607,7 @@ func (channel *Channel) Invite(invitee *Client, inviter *Client, rb *ResponseBuf
|
1600
|
1607
|
}
|
1601
|
1608
|
|
1602
|
1609
|
details := inviter.Details()
|
|
1610
|
+ isBot := inviter.HasMode(modes.Bot)
|
1603
|
1611
|
tDetails := invitee.Details()
|
1604
|
1612
|
tnick := invitee.Nick()
|
1605
|
1613
|
message := utils.MakeMessage(chname)
|
|
@@ -1614,13 +1622,15 @@ func (channel *Channel) Invite(invitee *Client, inviter *Client, rb *ResponseBuf
|
1614
|
1622
|
}
|
1615
|
1623
|
for _, session := range member.Sessions() {
|
1616
|
1624
|
if session.capabilities.Has(caps.InviteNotify) {
|
1617
|
|
- session.sendFromClientInternal(false, message.Time, message.Msgid, details.nickMask, details.accountName, nil, "INVITE", tnick, chname)
|
|
1625
|
+ session.sendFromClientInternal(false, message.Time, message.Msgid, details.nickMask, details.accountName, isBot, nil, "INVITE", tnick, chname)
|
1618
|
1626
|
}
|
1619
|
1627
|
}
|
1620
|
1628
|
}
|
1621
|
1629
|
|
1622
|
1630
|
rb.Add(nil, inviter.server.name, RPL_INVITING, details.nick, tnick, chname)
|
1623
|
|
- invitee.sendFromClientInternal(false, message.Time, message.Msgid, details.nickMask, details.accountName, nil, "INVITE", tnick, chname)
|
|
1631
|
+ for _, iSession := range invitee.Sessions() {
|
|
1632
|
+ iSession.sendFromClientInternal(false, message.Time, message.Msgid, details.nickMask, details.accountName, isBot, nil, "INVITE", tnick, chname)
|
|
1633
|
+ }
|
1624
|
1634
|
if away, awayMessage := invitee.Away(); away {
|
1625
|
1635
|
rb.Add(nil, inviter.server.name, RPL_AWAY, details.nick, tnick, awayMessage)
|
1626
|
1636
|
}
|