diff options
author | delthas <delthas@dille.cc> | 2022-10-18 17:27:20 +0200 |
---|---|---|
committer | delthas <delthas@dille.cc> | 2022-10-18 17:30:43 +0200 |
commit | e4a2fe26415eba5cf7920c08acd0313b1c75d1f4 (patch) | |
tree | 0fc1f5d28a1dcb177ae9681eb9222280ae0a534e /app.go | |
parent | Bump tcell version (diff) |
Clear highlights from MARKREAD when only NotifyNone lines are left
Previously, we did not clear buffers highlight statuses on MARKREAD if
there was any unread line after it.
This meant that if we received a plain message, than a join message, and
some other device sent us a read marker for the plain message, we would
still highlight the buffer. But we should not: a join message should not
highlight the buffer.
This is a recurrent use case because some clients do not display join
mesasges and therefore do not send read markers for it.
This updates the logic to actually store the notify level (in the line)
and uses it to reset the highlight status when only NotifyNone messages
(or no messages) are left.
Diffstat (limited to 'app.go')
-rw-r--r-- | app.go | 43 |
1 files changed, 24 insertions, 19 deletions
@@ -626,10 +626,11 @@ func (app *App) handleKeyEvent(ev *tcell.EventKey) { input := app.win.InputEnter() err := app.handleInput(buffer, input) if err != nil { - app.win.AddLine(netID, buffer, ui.NotifyUnread, ui.Line{ + app.win.AddLine(netID, buffer, ui.Line{ At: time.Now(), Head: "!!", HeadColor: tcell.ColorRed, + Notify: ui.NotifyUnread, Body: ui.PlainSprintf("%q: %s", input, err), }) } @@ -715,9 +716,10 @@ func (app *App) handleIRCEvent(netID string, ev interface{}) { // Mutate IRC state ev, err := s.HandleMessage(msg) if err != nil { - app.win.AddLine(netID, "", ui.NotifyUnread, ui.Line{ + app.win.AddLine(netID, "", ui.Line{ Head: "!!", HeadColor: tcell.ColorRed, + Notify: ui.NotifyUnread, Body: ui.PlainSprintf("Received corrupt message %q: %s", msg.String(), err), }) return @@ -742,7 +744,7 @@ func (app *App) handleIRCEvent(netID string, ev interface{}) { if s.Nick() != app.cfg.Nick { body = fmt.Sprintf("Connected to the server as %s", s.Nick()) } - app.win.AddLine(netID, "", ui.NotifyNone, ui.Line{ + app.win.AddLine(netID, "", ui.Line{ At: msg.TimeOrNow(), Head: "--", Body: ui.PlainString(body), @@ -770,7 +772,7 @@ func (app *App) handleIRCEvent(netID string, ev interface{}) { case irc.UserNickEvent: line := app.formatEvent(ev) for _, c := range s.ChannelsSharedWith(ev.User) { - app.win.AddLine(netID, c, ui.NotifyNone, line) + app.win.AddLine(netID, c, line) } case irc.SelfJoinEvent: i, added := app.win.AddBuffer(netID, "", ev.Channel) @@ -801,26 +803,26 @@ func (app *App) handleIRCEvent(netID string, ev interface{}) { } case irc.UserJoinEvent: line := app.formatEvent(ev) - app.win.AddLine(netID, ev.Channel, ui.NotifyNone, line) + app.win.AddLine(netID, ev.Channel, line) case irc.SelfPartEvent: app.win.RemoveBuffer(netID, ev.Channel) delete(app.messageBounds, boundKey{netID, ev.Channel}) case irc.UserPartEvent: line := app.formatEvent(ev) - app.win.AddLine(netID, ev.Channel, ui.NotifyNone, line) + app.win.AddLine(netID, ev.Channel, line) case irc.UserQuitEvent: line := app.formatEvent(ev) for _, c := range ev.Channels { - app.win.AddLine(netID, c, ui.NotifyNone, line) + app.win.AddLine(netID, c, line) } case irc.TopicChangeEvent: line := app.formatEvent(ev) - app.win.AddLine(netID, ev.Channel, ui.NotifyUnread, line) + app.win.AddLine(netID, ev.Channel, line) topic := ui.IRCString(ev.Topic).String() app.win.SetTopic(netID, ev.Channel, topic) case irc.ModeChangeEvent: line := app.formatEvent(ev) - app.win.AddLine(netID, ev.Channel, ui.NotifyNone, line) + app.win.AddLine(netID, ev.Channel, line) case irc.InviteEvent: var buffer string var notify ui.NotifyType @@ -838,16 +840,17 @@ func (app *App) handleIRCEvent(netID string, ev interface{}) { notify = ui.NotifyUnread body = fmt.Sprintf("%s invited %s to join this channel", ev.Inviter, ev.Invitee) } - app.win.AddLine(netID, buffer, notify, ui.Line{ + app.win.AddLine(netID, buffer, ui.Line{ At: msg.TimeOrNow(), Head: "--", HeadColor: tcell.ColorGray, + Notify: notify, Body: ui.Styled(body, tcell.StyleDefault.Foreground(tcell.ColorGray)), Highlight: notify == ui.NotifyHighlight, Readable: true, }) case irc.MessageEvent: - buffer, line, notification := app.formatMessage(s, ev) + buffer, line := app.formatMessage(s, ev) if line.IsZero() { break } @@ -861,8 +864,8 @@ func (app *App) handleIRCEvent(netID string, ev interface{}) { Before(msg.TimeOrNow()) } } - app.win.AddLine(netID, buffer, notification, line) - if notification == ui.NotifyHighlight { + app.win.AddLine(netID, buffer, line) + if line.Notify == ui.NotifyHighlight { app.notifyHighlight(buffer, ev.User, line.Body.String()) } if !s.IsChannel(msg.Params[0]) && !s.IsMe(ev.User) { @@ -910,7 +913,7 @@ func (app *App) handleIRCEvent(netID string, ev interface{}) { var line ui.Line switch ev := m.(type) { case irc.MessageEvent: - _, line, _ = app.formatMessage(s, ev) + _, line = app.formatMessage(s, ev) default: line = app.formatEvent(ev) } @@ -944,7 +947,7 @@ func (app *App) handleIRCEvent(netID string, ev interface{}) { app.win.OpenOverlay() lines := make([]ui.Line, 0, len(ev.Messages)) for _, m := range ev.Messages { - _, line, _ := app.formatMessage(s, m) + _, line := app.formatMessage(s, m) if line.IsZero() { continue } @@ -1229,6 +1232,7 @@ func (app *App) formatEvent(ev irc.Event) ui.Line { At: ev.Time, Head: "--", HeadColor: tcell.ColorGray, + Notify: ui.NotifyUnread, Body: ui.Styled(body, tcell.StyleDefault.Foreground(tcell.ColorGray)), Readable: true, } @@ -1254,9 +1258,8 @@ func (app *App) formatEvent(ev irc.Event) ui.Line { // // It computes three things: // - which buffer the message must be added to, -// - the UI line, -// - what kind of notification senpai should send. -func (app *App) formatMessage(s *irc.Session, ev irc.MessageEvent) (buffer string, line ui.Line, notification ui.NotifyType) { +// - the UI line. +func (app *App) formatMessage(s *irc.Session, ev irc.MessageEvent) (buffer string, line ui.Line) { isFromSelf := s.IsMe(ev.User) isToSelf := s.IsMe(ev.Target) isHighlight := ev.TargetIsChannel && app.isHighlight(s, ev.Content) @@ -1292,6 +1295,7 @@ func (app *App) formatMessage(s *irc.Session, ev irc.MessageEvent) (buffer strin buffer = ev.Target } + var notification ui.NotifyType hlLine := ev.TargetIsChannel && isHighlight && !isFromSelf if isFromSelf { notification = ui.NotifyNone @@ -1332,6 +1336,7 @@ func (app *App) formatMessage(s *irc.Session, ev irc.MessageEvent) (buffer strin At: ev.Time, Head: head, HeadColor: headColor, + Notify: notification, Body: body.StyledString(), Highlight: hlLine, Readable: true, @@ -1477,7 +1482,7 @@ func (app *App) printTopic(netID, buffer string) (ok bool) { } else { body = fmt.Sprintf("Topic (by %s, %s): %s", who, at.Local().Format("Mon Jan 2 15:04:05"), topic) } - app.win.AddLine(netID, buffer, ui.NotifyNone, ui.Line{ + app.win.AddLine(netID, buffer, ui.Line{ At: time.Now(), Head: "--", HeadColor: tcell.ColorGray, |