Received: from mail-ed1-f54.google.com (mail-ed1-f54.google.com [209.85.208.54]) by mail-b.sr.ht (Postfix) with ESMTPS id A5722FF14A for <~taiite/public-inbox@lists.sr.ht>; Mon, 9 Nov 2020 17:16:48 +0000 (UTC) Authentication-Results: mail-b.sr.ht; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=mJbRnWqz Received: by mail-ed1-f54.google.com with SMTP id l5so3110922edq.11 for <~taiite/public-inbox@lists.sr.ht>; Mon, 09 Nov 2020 09:16:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=JcpNQFfNpEcwnD07iswa+I9etckJ/NxQ49OLgSdau4k=; b=mJbRnWqzK9aGrhnV0YPcrzABd+LU9/bd8djxfg4iVjEyqTw0EW0R+oBKUwcpj8JQbi AaK0gR3YMGAQ3K1yFZlTmUdE9FNK9HEalux0dRd2UR7a+EB0gXcmm+NDxrIrddRPip3F KZFsxukf+1mhTB7P/NxuwmG/yuB+5ks5H8H0/0LdQ4FNkFxWf8z3I7cougL9donu+4hn Ca+E2kSr3xC7zKxRw5hTR9phHOUogs7T29vXVs2OQeObRop2yOAvjD41Vvi5G98LdZxA VnqA17g8iL5Kq3rjYAZ1WED1hEvm5A+p92RCBGSilKErv0Ph7EM8ab9XimkkDCDWU7Zy moCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=JcpNQFfNpEcwnD07iswa+I9etckJ/NxQ49OLgSdau4k=; b=sKrMzBu6pFtKtuhnvWEMYXRz6gKEUU7AIMzB2nn/wDwcyT2wjqVy8BETXa6ySEylY2 iAtQDXNA4fOH97ifgjjXDxDv/2TbeZ1hHVJhh4//qGXxNScypJDUmhWNApruj4crUhmk L5QJN3LqqFDrPPwdu32206U01GrZ6XLT+uZ8ooUAacLl2eKWcb43cPk21lWi+2qfKQJY BP3Uyd/5EjLfEUYo/GODMFzMFVMLsz/mfPF+1iQbAhvEU1Wh3ofxNjrDYTS1gWEgWJhW iX+tmreAH2JuEriK4SvdCJsp2xABILvhmSlEkmdo1i85tlR5u6hbyq54Qq1MmTEG6Jb4 0XEQ== X-Gm-Message-State: AOAM531Uewn3RsTNh1mouI7QEVbm5wKDh8BUY6oOZ0Qbltj2d0t+GUC1 tZVVc9j7GXeICegG7iJ6BlFoOyXUOheQaA== X-Google-Smtp-Source: ABdhPJzKeRWEeiIpA9+PdiI6q2kR+mnPT5Usr6l++CWQoTSyNYkjHbZkunuPlwkJOVSFrFLr0zQ5og== X-Received: by 2002:a05:6402:b3b:: with SMTP id bo27mr15872959edb.376.1604942207515; Mon, 09 Nov 2020 09:16:47 -0800 (PST) Received: from localhost.localdomain (77.49.138.184.dsl.dyn.forthnet.gr. [77.49.138.184]) by smtp.gmail.com with ESMTPSA id f18sm9149381edt.32.2020.11.09.09.16.46 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 09 Nov 2020 09:16:47 -0800 (PST) From: Kostis Karantias To: ~taiite/public-inbox@lists.sr.ht Cc: Kostis Karantias Subject: [PATCH senpai 2/4] Complete support for nick list Date: Mon, 9 Nov 2020 19:16:32 +0200 Message-Id: <20201109171634.12110-2-kkarantias@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201109171634.12110-1-kkarantias@gmail.com> References: <20201109171634.12110-1-kkarantias@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable --- app.go | 15 +++++++++++++++ irc/states.go | 17 ++++++++++++++--- ui/buffers.go | 42 ++++++++++++++++++++++++++++++++++++++++++ ui/ui.go | 7 ++++++- 4 files changed, 77 insertions(+), 4 deletions(-) diff --git a/app.go b/app.go index 05a5811..856043d 100644 --- a/app.go +++ b/app.go @@ -129,6 +129,12 @@ func (app *App) handleIRCEvents(evs []irc.Event) { } } =20 +func (app *App) updateMembers(buffer string) { + if app.s.IsChannel(buffer) { + app.win.SetMembers(buffer, app.s.Names(buffer)) + } +} + func (app *App) handleIRCEvent(ev irc.Event) { switch ev :=3D ev.(type) { case irc.RawMessageEvent: @@ -160,6 +166,10 @@ func (app *App) handleIRCEvent(ev irc.Event) { Body: fmt.Sprintf("\x0314%s\x03\u2192\x0314%s\x03", ev.FormerNic= k, app.s.Nick()), Highlight: true, }) + for _, c :=3D range app.s.Channels() { + app.updateMembers(c) + + } case irc.UserNickEvent: for _, c :=3D range app.s.ChannelsSharedWith(ev.User.Name) { app.win.AddLine(c, false, ui.Line{ @@ -168,10 +178,12 @@ func (app *App) handleIRCEvent(ev irc.Event) { Body: fmt.Sprintf("\x0314%s\x03\u2192\x0314%s\x03", ev.FormerNi= ck, ev.User.Name), Mergeable: true, }) + app.updateMembers(c) } case irc.SelfJoinEvent: app.win.AddBuffer(ev.Channel) app.s.RequestHistory(ev.Channel, time.Now()) + app.updateMembers(ev.Channel) case irc.UserJoinEvent: app.win.AddLine(ev.Channel, false, ui.Line{ At: time.Now(), @@ -179,6 +191,7 @@ func (app *App) handleIRCEvent(ev irc.Event) { Body: fmt.Sprintf("\x033+\x0314%s\x03", ev.User.Name), Mergeable: true, }) + app.updateMembers(ev.Channel) case irc.SelfPartEvent: app.win.RemoveBuffer(ev.Channel) case irc.UserPartEvent: @@ -188,6 +201,7 @@ func (app *App) handleIRCEvent(ev irc.Event) { Body: fmt.Sprintf("\x034-\x0314%s\x03", ev.User.Name), Mergeable: true, }) + app.updateMembers(ev.Channel) case irc.UserQuitEvent: for _, c :=3D range ev.Channels { app.win.AddLine(c, false, ui.Line{ @@ -196,6 +210,7 @@ func (app *App) handleIRCEvent(ev irc.Event) { Body: fmt.Sprintf("\x034-\x0314%s\x03", ev.User.Name), Mergeable: true, }) + app.updateMembers(c) } case irc.TopicChangeEvent: app.win.AddLine(ev.Channel, false, ui.Line{ diff --git a/irc/states.go b/irc/states.go index c702c43..3867f7e 100644 --- a/irc/states.go +++ b/irc/states.go @@ -290,6 +290,16 @@ func (s *Session) Typings(target string) []string { return res } =20 +func (s *Session) Channels() []string { + var channels []string + for _, c :=3D range s.channels { + if s.IsChannel(c.Name) { + channels =3D append(channels, c.Name) + } + } + return channels +} + func (s *Session) ChannelsSharedWith(name string) []string { var user *User if u, ok :=3D s.users[s.Casemap(name)]; ok { @@ -887,12 +897,13 @@ func (s *Session) handle(msg Message) (err error) { } =20 if nickCf =3D=3D s.nickCf { + formerNick :=3D s.nick + s.nick =3D newNick + s.nickCf =3D newNickCf s.evts <- SelfNickEvent{ - FormerNick: s.nick, + FormerNick: formerNick, Time: t, } - s.nick =3D newNick - s.nickCf =3D newNickCf } else { s.evts <- UserNickEvent{ User: u, diff --git a/ui/buffers.go b/ui/buffers.go index 32289e1..a04b75a 100644 --- a/ui/buffers.go +++ b/ui/buffers.go @@ -1,10 +1,13 @@ package ui =20 import ( + "fmt" + "sort" "strings" "time" =20 "github.com/gdamore/tcell/v2" + "git.sr.ht/~taiite/senpai/irc" ) =20 func IsSplitRune(r rune) bool { @@ -165,6 +168,8 @@ type buffer struct { =20 scrollAmt int isAtTop bool + + members []irc.Member } =20 type BufferList struct { @@ -187,6 +192,16 @@ func NewBufferList(tlWidth, tlHeight, nickColWidth i= nt) BufferList { } } =20 +func (bs *BufferList) SetMembers(title string, members []irc.Member) { + idx :=3D bs.idx(title) + if idx < 0 { + return + } + + b :=3D &bs.list[idx] + b.members =3D members +} + func (bs *BufferList) ResizeTimeline(tlWidth, tlHeight, nickColWidth int= ) { bs.tlWidth =3D tlWidth bs.tlHeight =3D tlHeight @@ -352,6 +367,21 @@ func (bs *BufferList) idx(title string) int { return -1 } =20 +func prettifyMembers(members []irc.Member) []string { + privileged, unprivileged :=3D []string{}, []string{} + for _, m :=3D range members { + prettyName :=3D fmt.Sprintf("%s%s", m.PowerLevel, m.Name.Name) + if len(m.PowerLevel) > 0 { + privileged =3D append(privileged, prettyName) + } else { + unprivileged =3D append(unprivileged, prettyName) + } + } + sort.Strings(privileged) + sort.Strings(unprivileged) + return append(privileged, unprivileged...) +} + func (bs *BufferList) DrawVerticalNickList(screen tcell.Screen, x0, y0, = width, height int) { x0++ st :=3D tcell.StyleDefault @@ -362,6 +392,18 @@ func (bs *BufferList) DrawVerticalNickList(screen tc= ell.Screen, x0, y0, width, h } screen.SetContent(x0-1, y, 0x2502, nil, st.Dim(true)) } + + currentBuffer :=3D bs.list[bs.current] + prettyMembers :=3D prettifyMembers(currentBuffer.members) + for i, m :=3D range prettyMembers { + if i+1 > height { + break + } + x :=3D x0 + y :=3D y0+i + title :=3D truncate(m, width-1, "\u2026") + printString(screen, &x, y, st, title) + } } =20 func (bs *BufferList) DrawVerticalBufferList(screen tcell.Screen, x0, y0= , width, height int) { diff --git a/ui/ui.go b/ui/ui.go index 9a4dfff..7a2a1f8 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -5,9 +5,10 @@ import ( "time" =20 "github.com/gdamore/tcell/v2" + "git.sr.ht/~taiite/senpai/irc" ) =20 -const nickListColWidth =3D 9 +const nickListColWidth =3D 15 =20 type Config struct { NickColWidth int @@ -134,6 +135,10 @@ func (ui *UI) RemoveBuffer(title string) { _ =3D ui.bs.Remove(title) } =20 +func (ui *UI) SetMembers(buffer string, members []irc.Member) { + ui.bs.SetMembers(buffer, members) +} + func (ui *UI) AddLine(buffer string, highlight bool, line Line) { ui.bs.AddLine(buffer, highlight, line) } --=20 2.29.2