mirror of
https://github.com/ergochat/ergo.git
synced 2024-11-11 06:29:29 +01:00
Merge pull request #1199 from slingamn/issue1198_awaynotify.1
fix #1198
This commit is contained in:
commit
b5855e6194
@ -767,6 +767,7 @@ func (channel *Channel) Join(client *Client, key string, isSajoin bool, rb *Resp
|
|||||||
modestr = fmt.Sprintf("+%v", givenMode)
|
modestr = fmt.Sprintf("+%v", givenMode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isAway, awayMessage := client.Away()
|
||||||
for _, member := range channel.Members() {
|
for _, member := range channel.Members() {
|
||||||
for _, session := range member.Sessions() {
|
for _, session := range member.Sessions() {
|
||||||
if session == rb.session {
|
if session == rb.session {
|
||||||
@ -783,6 +784,9 @@ func (channel *Channel) Join(client *Client, key string, isSajoin bool, rb *Resp
|
|||||||
if givenMode != 0 {
|
if givenMode != 0 {
|
||||||
session.Send(nil, client.server.name, "MODE", chname, modestr, details.nick)
|
session.Send(nil, client.server.name, "MODE", chname, modestr, details.nick)
|
||||||
}
|
}
|
||||||
|
if isAway && session.capabilities.Has(caps.AwayNotify) {
|
||||||
|
session.sendFromClientInternal(false, time.Time{}, "", details.nickMask, details.account, nil, "AWAY", awayMessage)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1458,8 +1462,8 @@ func (channel *Channel) Invite(invitee *Client, inviter *Client, rb *ResponseBuf
|
|||||||
tnick := invitee.Nick()
|
tnick := invitee.Nick()
|
||||||
rb.Add(nil, inviter.server.name, RPL_INVITING, cnick, tnick, chname)
|
rb.Add(nil, inviter.server.name, RPL_INVITING, cnick, tnick, chname)
|
||||||
invitee.Send(nil, inviter.NickMaskString(), "INVITE", tnick, chname)
|
invitee.Send(nil, inviter.NickMaskString(), "INVITE", tnick, chname)
|
||||||
if invitee.Away() {
|
if away, awayMessage := invitee.Away(); away {
|
||||||
rb.Add(nil, inviter.server.name, RPL_AWAY, cnick, tnick, invitee.AwayMessage())
|
rb.Add(nil, inviter.server.name, RPL_AWAY, cnick, tnick, awayMessage)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1054,29 +1054,32 @@ func (client *Client) ModeString() (str string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Friends refers to clients that share a channel with this client.
|
// Friends refers to clients that share a channel with this client.
|
||||||
func (client *Client) Friends(capabs ...caps.Capability) (result map[*Session]bool) {
|
func (client *Client) Friends(capabs ...caps.Capability) (result map[*Session]empty) {
|
||||||
result = make(map[*Session]bool)
|
result = make(map[*Session]empty)
|
||||||
|
|
||||||
// look at the client's own sessions
|
// look at the client's own sessions
|
||||||
for _, session := range client.Sessions() {
|
addFriendsToSet(result, client, capabs...)
|
||||||
if session.capabilities.HasAll(capabs...) {
|
|
||||||
result[session] = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, channel := range client.Channels() {
|
for _, channel := range client.Channels() {
|
||||||
for _, member := range channel.Members() {
|
for _, member := range channel.Members() {
|
||||||
for _, session := range member.Sessions() {
|
addFriendsToSet(result, member, capabs...)
|
||||||
if session.capabilities.HasAll(capabs...) {
|
|
||||||
result[session] = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// helper for Friends
|
||||||
|
func addFriendsToSet(set map[*Session]empty, client *Client, capabs ...caps.Capability) {
|
||||||
|
client.stateMutex.RLock()
|
||||||
|
defer client.stateMutex.RUnlock()
|
||||||
|
for _, session := range client.sessions {
|
||||||
|
if session.capabilities.HasAll(capabs...) {
|
||||||
|
set[session] = empty{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (client *Client) SetOper(oper *Oper) {
|
func (client *Client) SetOper(oper *Oper) {
|
||||||
client.stateMutex.Lock()
|
client.stateMutex.Lock()
|
||||||
defer client.stateMutex.Unlock()
|
defer client.stateMutex.Unlock()
|
||||||
|
@ -185,9 +185,9 @@ func (client *Client) Hostname() string {
|
|||||||
return client.hostname
|
return client.hostname
|
||||||
}
|
}
|
||||||
|
|
||||||
func (client *Client) Away() (result bool) {
|
func (client *Client) Away() (result bool, message string) {
|
||||||
client.stateMutex.Lock()
|
client.stateMutex.Lock()
|
||||||
result = client.away
|
result, message = client.away, client.awayMessage
|
||||||
client.stateMutex.Unlock()
|
client.stateMutex.Unlock()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -2122,9 +2122,11 @@ func dispatchMessageToTarget(client *Client, tags map[string]string, histType hi
|
|||||||
rb.AddSplitMessageFromClient(nickMaskString, accountName, tagsToSend, command, tnick, message)
|
rb.AddSplitMessageFromClient(nickMaskString, accountName, tagsToSend, command, tnick, message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if histType != history.Notice && user.Away() {
|
if histType != history.Notice {
|
||||||
//TODO(dan): possibly implement cooldown of away notifications to users
|
//TODO(dan): possibly implement cooldown of away notifications to users
|
||||||
rb.Add(nil, server.name, RPL_AWAY, client.Nick(), tnick, user.AwayMessage())
|
if away, awayMessage := user.Away(); away {
|
||||||
|
rb.Add(nil, server.name, RPL_AWAY, client.Nick(), tnick, awayMessage)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
config := server.Config()
|
config := server.Config()
|
||||||
@ -2742,7 +2744,7 @@ func userhostHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *
|
|||||||
if target.HasMode(modes.Operator) {
|
if target.HasMode(modes.Operator) {
|
||||||
isOper = "*"
|
isOper = "*"
|
||||||
}
|
}
|
||||||
if target.Away() {
|
if away, _ := target.Away(); away {
|
||||||
isAway = "-"
|
isAway = "-"
|
||||||
} else {
|
} else {
|
||||||
isAway = "+"
|
isAway = "+"
|
||||||
@ -2893,7 +2895,7 @@ func (client *Client) rplWhoReply(channel *Channel, target *Client, rb *Response
|
|||||||
}
|
}
|
||||||
if fields.Has('f') { // "flags" (away + oper state + channel status prefix + bot)
|
if fields.Has('f') { // "flags" (away + oper state + channel status prefix + bot)
|
||||||
var flags strings.Builder
|
var flags strings.Builder
|
||||||
if target.Away() {
|
if away, _ := target.Away(); away {
|
||||||
flags.WriteRune('G') // Gone
|
flags.WriteRune('G') // Gone
|
||||||
} else {
|
} else {
|
||||||
flags.WriteRune('H') // Here
|
flags.WriteRune('H') // Here
|
||||||
|
@ -110,9 +110,9 @@ func sendRoleplayMessage(server *Server, client *Client, source string, targetSt
|
|||||||
for _, session := range user.Sessions() {
|
for _, session := range user.Sessions() {
|
||||||
session.sendSplitMsgFromClientInternal(false, source, "", nil, "PRIVMSG", tnick, splitMessage)
|
session.sendSplitMsgFromClientInternal(false, source, "", nil, "PRIVMSG", tnick, splitMessage)
|
||||||
}
|
}
|
||||||
if user.Away() {
|
if away, awayMessage := user.Away(); away {
|
||||||
//TODO(dan): possibly implement cooldown of away notifications to users
|
//TODO(dan): possibly implement cooldown of away notifications to users
|
||||||
rb.Add(nil, server.name, RPL_AWAY, cnick, tnick, user.AwayMessage())
|
rb.Add(nil, server.name, RPL_AWAY, cnick, tnick, awayMessage)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -436,8 +436,8 @@ func (client *Client) getWhoisOf(target *Client, rb *ResponseBuffer) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
rb.Add(nil, client.server.name, RPL_WHOISIDLE, cnick, tnick, strconv.FormatUint(target.IdleSeconds(), 10), strconv.FormatInt(target.SignonTime(), 10), client.t("seconds idle, signon time"))
|
rb.Add(nil, client.server.name, RPL_WHOISIDLE, cnick, tnick, strconv.FormatUint(target.IdleSeconds(), 10), strconv.FormatInt(target.SignonTime(), 10), client.t("seconds idle, signon time"))
|
||||||
if target.Away() {
|
if away, awayMessage := target.Away(); away {
|
||||||
rb.Add(nil, client.server.name, RPL_AWAY, cnick, tnick, target.AwayMessage())
|
rb.Add(nil, client.server.name, RPL_AWAY, cnick, tnick, awayMessage)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user