summaryrefslogtreecommitdiff
path: root/app.go
diff options
context:
space:
mode:
authorHubert Hirtz <hubert@hirtz.pm>2021-12-06 11:30:48 +0100
committerHubert Hirtz <hubert@hirtz.pm>2021-12-06 12:56:20 +0100
commit85482b9e6b4f82dbcd41d4c35846f13ea1b42383 (patch)
treea18ad7defa0d74a5578cb9221fec7aebb2008390 /app.go
parentDon't double-enable caps (diff)
Merge redundant events
Diffstat (limited to 'app.go')
-rw-r--r--app.go88
1 files changed, 87 insertions, 1 deletions
diff --git a/app.go b/app.go
index 2b0ba82..636efba 100644
--- a/app.go
+++ b/app.go
@@ -124,6 +124,9 @@ func NewApp(cfg Config) (app *App, err error) {
return app.completions(cursorIdx, text)
},
Mouse: mouse,
+ MergeLine: func(former *ui.Line, addition ui.Line) {
+ app.mergeLine(former, addition)
+ },
})
if err != nil {
return
@@ -955,13 +958,13 @@ func (app *App) formatEvent(ev irc.Event) ui.Line {
body.AddStyle(0, textStyle)
body.AddStyle(len(ev.FormerNick), arrowStyle)
body.AddStyle(body.Len()-len(ev.User), textStyle)
-
return ui.Line{
At: ev.Time,
Head: "--",
HeadColor: tcell.ColorGray,
Body: body.StyledString(),
Mergeable: true,
+ Data: []interface{}{ev},
}
case irc.UserJoinEvent:
var body ui.StyledStringBuilder
@@ -976,6 +979,7 @@ func (app *App) formatEvent(ev irc.Event) ui.Line {
HeadColor: tcell.ColorGray,
Body: body.StyledString(),
Mergeable: true,
+ Data: []interface{}{ev},
}
case irc.UserPartEvent:
var body ui.StyledStringBuilder
@@ -990,6 +994,7 @@ func (app *App) formatEvent(ev irc.Event) ui.Line {
HeadColor: tcell.ColorGray,
Body: body.StyledString(),
Mergeable: true,
+ Data: []interface{}{ev},
}
case irc.UserQuitEvent:
var body ui.StyledStringBuilder
@@ -1004,6 +1009,7 @@ func (app *App) formatEvent(ev irc.Event) ui.Line {
HeadColor: tcell.ColorGray,
Body: body.StyledString(),
Mergeable: true,
+ Data: []interface{}{ev},
}
case irc.TopicChangeEvent:
topic := ui.IRCString(ev.Topic).String()
@@ -1022,6 +1028,7 @@ func (app *App) formatEvent(ev irc.Event) ui.Line {
HeadColor: tcell.ColorGray,
Body: ui.Styled(body, tcell.StyleDefault.Foreground(tcell.ColorGray)),
Mergeable: true,
+ Data: []interface{}{ev},
}
default:
return ui.Line{}
@@ -1105,6 +1112,85 @@ func (app *App) formatMessage(s *irc.Session, ev irc.MessageEvent) (buffer strin
return
}
+func (app *App) mergeLine(former *ui.Line, addition ui.Line) {
+ partQuitUser := func(ev interface{}) string {
+ if ev, ok := ev.(irc.UserQuitEvent); ok {
+ return ev.User
+ }
+ if ev, ok := ev.(irc.UserPartEvent); ok {
+ return ev.User
+ }
+ panic("unreachable")
+ }
+
+ changed := false
+Outer:
+ for _, addedEvent := range addition.Data {
+ switch addedEvent := addedEvent.(type) {
+ case irc.UserNickEvent:
+ for i := len(former.Data) - 1; i >= 0; i-- {
+ switch ev := former.Data[i].(type) {
+ case irc.UserNickEvent:
+ if ev.User == addedEvent.FormerNick && ev.FormerNick == addedEvent.User {
+ former.Data = append(former.Data[:i], former.Data[i+1:]...)
+ changed = true
+ continue Outer
+ }
+ }
+ }
+ former.Data = append(former.Data, addedEvent)
+ case irc.UserJoinEvent:
+ for i := len(former.Data) - 1; i >= 0; i-- {
+ switch ev := former.Data[i].(type) {
+ case irc.UserPartEvent, irc.UserQuitEvent:
+ if partQuitUser(ev) == addedEvent.User {
+ former.Data = append(former.Data[:i], former.Data[i+1:]...)
+ changed = true
+ continue Outer
+ }
+ }
+ }
+ former.Data = append(former.Data, addedEvent)
+ case irc.UserQuitEvent, irc.UserPartEvent:
+ for i := len(former.Data) - 1; i >= 0; i-- {
+ switch ev := former.Data[i].(type) {
+ case irc.UserJoinEvent:
+ if ev.User == partQuitUser(addedEvent) {
+ former.Data = append(former.Data[:i], former.Data[i+1:]...)
+ changed = true
+ continue Outer
+ }
+ }
+ }
+ former.Data = append(former.Data, addedEvent)
+ //case irc.ModeChangeEvent: //TODO
+ default:
+ former.Data = append(former.Data, addedEvent)
+ }
+ }
+ if changed {
+ if len(former.Data) == 0 {
+ former.Body = ui.PlainString("")
+ return
+ }
+ var body ui.StyledStringBuilder
+ body.Grow(len(former.Body.String()))
+ body.WriteStyledString(app.formatEvent(former.Data[0]).Body)
+ for _, ev := range former.Data[1:] {
+ body.WriteString(" ")
+ body.WriteStyledString(app.formatEvent(ev).Body)
+ }
+ former.Body = body.StyledString()
+ } else {
+ var newBody ui.StyledStringBuilder
+ newBody.Grow(len(former.Body.String()) + 2 + len(addition.Body.String()))
+ newBody.WriteStyledString(former.Body)
+ newBody.WriteString(" ")
+ newBody.WriteStyledString(addition.Body)
+ former.Body = newBody.StyledString()
+ }
+}
+
// updatePrompt changes the prompt text according to the application context.
func (app *App) updatePrompt() {
netID, buffer := app.win.CurrentBuffer()