Added a way to display notifications for networks

This commit is contained in:
2025-02-01 16:51:10 +02:00
parent ac01dff4e7
commit 0659bdaf81
5 changed files with 89 additions and 49 deletions

View File

@@ -551,6 +551,8 @@ func (m *Model) updateConnected(msg tea.Msg) tea.Cmd {
return cmd
}
calculateNotifications()
var cmds []tea.Cmd
var cmd tea.Cmd
@@ -687,3 +689,53 @@ func (m *Model) HasPopup() bool {
m.banViewPopup != nil ||
m.peerAddPopup != nil
}
func calculateNotifications() {
for networkId := range state.State.Networks {
for _, frequency := range state.State.Frequencies[networkId] {
pings, hasNotif := getFrequencyNotification(networkId, frequency.ID)
if hasNotif {
state.State.Notifications[frequency.ID] = pings
} else {
delete(state.State.Notifications, frequency.ID)
}
}
}
}
func getFrequencyNotification(networkId, frequencyId snowflake.ID) (_ int, _ bool) {
lastReadMsg := state.Data.LastReadMessage[frequencyId]
if lastReadMsg == nil {
return 0, false
}
btree := state.State.Messages[frequencyId]
if btree == nil {
return 0, false
}
pings := 0
hasNotif := false
isAdmin := state.State.Members[networkId][*state.UserID].IsAdmin
btree.AscendGreaterOrEqual(data.Message{ID: *lastReadMsg + 1}, func(item data.Message) bool {
hasNotif = true
if item.Ping == nil {
return true
}
if *item.Ping == packet.PingEveryone {
pings++
} else if *item.Ping == packet.PingAdmins && isAdmin {
pings++
} else if *item.Ping == *state.UserID {
pings++
}
return pings <= 10
})
return pings, hasNotif
}

View File

@@ -14,7 +14,6 @@ import (
"github.com/kyren223/eko/internal/data"
"github.com/kyren223/eko/internal/packet"
"github.com/kyren223/eko/pkg/assert"
"github.com/kyren223/eko/pkg/snowflake"
)
var (
@@ -93,11 +92,12 @@ func (m Model) View() string {
var builder strings.Builder
builder.WriteString(m.renderNetworkName())
builder.WriteString("\n")
frequencies := m.Frequencies()
upper := min(m.base+m.height, len(frequencies))
frequencies = frequencies[m.base:upper]
for i, frequency := range frequencies {
maxFrequencyWidth := maxFrequencyWidth
@@ -121,7 +121,7 @@ func (m Model) View() string {
notif := ""
notifStyle := notifStyle
pings, hasNotif := m.getNotifCount(frequency.ID)
pings, hasNotif := state.State.Notifications[frequency.ID]
if pings == 0 && hasNotif {
notif = notifSymbol[0]
// notifStyle = notifStyleDot
@@ -360,41 +360,3 @@ func (m Model) renderNetworkName() string {
func (m *Model) SetWidth(width int) {
m.width = width
}
func (m *Model) getNotifCount(frequencyId snowflake.ID) (_ int, _ bool) {
lastReadMsg := state.Data.LastReadMessage[frequencyId]
if lastReadMsg == nil {
return 0, false
}
btree := state.State.Messages[frequencyId]
if btree == nil {
return 0, false
}
pings := 0
hasNotif := false
networkId := state.NetworkId(m.networkIndex)
isAdmin := state.State.Members[*networkId][*state.UserID].IsAdmin
btree.AscendGreaterOrEqual(data.Message{ID: *lastReadMsg + 1}, func(item data.Message) bool {
hasNotif = true
if item.Ping == nil {
return true
}
if *item.Ping == packet.PingEveryone {
pings++
} else if *item.Ping == packet.PingAdmins && isAdmin {
pings++
} else if *item.Ping == *state.UserID {
pings++
}
return pings <= 10
})
return pings, hasNotif
}

View File

@@ -17,6 +17,7 @@ var (
Border(lipgloss.ThickBorder(), false, true, false, false)
selectedIndicator = "🭀\n▌\n🭛"
notification = " \n◗\n " //   🭬
peersIcon = ui.IconStyle(" ", colors.Turquoise, colors.DarkerCyan, colors.BackgroundDimmer)
peersButton = peersIcon.Background(colors.BackgroundDimmer).Padding(0, 1, 1).String()
peersButtonSelected = lipgloss.JoinHorizontal(
@@ -66,17 +67,41 @@ func (m Model) View() string {
for i, networkId := range networks {
network := state.State.Networks[networkId]
icon := ui.IconStyleNotif(network.Icon,
lipgloss.Color(network.FgHexColor),
lipgloss.Color(network.BgHexColor),
colors.BackgroundDimmer, 1,
)
pings, ok := 0, false
frequencies := state.State.Frequencies[networkId]
for _, frequency := range frequencies {
fpings, fok := state.State.Notifications[frequency.ID]
pings += fpings
ok = ok || fok
}
var icon lipgloss.Style
if ok && pings != 0 {
icon = ui.IconStyleNotif(network.Icon,
lipgloss.Color(network.FgHexColor),
lipgloss.Color(network.BgHexColor),
colors.BackgroundDimmer, pings,
)
} else {
icon = ui.IconStyle(network.Icon,
lipgloss.Color(network.FgHexColor),
lipgloss.Color(network.BgHexColor),
colors.BackgroundDimmer,
)
}
if m.index == m.base+i {
builder.WriteString(lipgloss.JoinHorizontal(
ui.Center,
selectedIndicator,
icon.Background(colors.BackgroundDimmer).Padding(0, 1, 1, 0).String(),
))
} else if ok {
builder.WriteString(lipgloss.JoinHorizontal(
ui.Center,
notification,
icon.Background(colors.BackgroundDimmer).Padding(0, 1, 1, 0).String(),
))
} else {
builder.WriteString(icon.Background(colors.BackgroundDimmer).Padding(0, 1, 1).String())
}

View File

@@ -29,6 +29,8 @@ type state struct {
Members map[snowflake.ID]map[snowflake.ID]data.Member // key is network id then user id
Users map[snowflake.ID]data.User // key is user id
Trusteds map[snowflake.ID]ed25519.PublicKey // key is user id
Notifications map[snowflake.ID]int // key is frequency id or receiver id
}
var State state = state{
@@ -40,6 +42,7 @@ var State state = state{
Members: map[snowflake.ID]map[snowflake.ID]data.Member{},
Users: map[snowflake.ID]data.User{},
Trusteds: map[snowflake.ID]ed25519.PublicKey{},
Notifications: map[snowflake.ID]int{},
}
type UserData struct {

View File

@@ -219,7 +219,6 @@ func clamp(v, lower, upper int) int {
🭏🬽 🭈🭄
*/
func IconStyle(icon string, iconFg, iconBg, bg lipgloss.Color) lipgloss.Style {
bgStyle := lipgloss.NewStyle().Background(iconBg).Foreground(bg)
top := bgStyle.Render("🭠🭘 🭣🭕")
@@ -237,7 +236,7 @@ var notifications = []string{
func IconStyleNotif(icon string, iconFg, iconBg, bg lipgloss.Color, count int) lipgloss.Style {
notifStyle := lipgloss.NewStyle().Background(iconBg).Foreground(colors.Red)
notif := notifications[min(0, max(10, count)-1)]
notif := notifications[max(0, min(10, count)-1)]
notif = notifStyle.Render(notif)
bgStyle := lipgloss.NewStyle().Background(iconBg).Foreground(bg)
@@ -249,4 +248,3 @@ func IconStyleNotif(icon string, iconFg, iconBg, bg lipgloss.Color, count int) l
combined := lipgloss.JoinVertical(lipgloss.Left, top, middle, bottom)
return lipgloss.NewStyle().SetString(combined)
}