From 64900975d5cd90910830dae3f1e5596f1ce2d1a3 Mon Sep 17 00:00:00 2001 From: raven Date: Tue, 10 Feb 2026 17:32:28 -0600 Subject: direct channel list --- server/channel/channel.go | 14 +++++++++--- server/channel/command.go | 2 +- server/server/command.go | 54 +++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 57 insertions(+), 13 deletions(-) diff --git a/server/channel/channel.go b/server/channel/channel.go index d907bc0..ef066e5 100644 --- a/server/channel/channel.go +++ b/server/channel/channel.go @@ -75,10 +75,10 @@ func (cs *ChannelKind) GetDirect(among map[string]bool) *Channel { return &c } -func (cs *ChannelKind) UserChannels(uid string) map[string]bool { +func (cs *ChannelKind) getChannelList(uid string, list string) map[string]bool { result := make(map[string]bool) err := cs.db.View(func(tx *bolt.Tx) error { - channels := tx.Bucket([]byte("user channels")) + channels := tx.Bucket([]byte(list)) if channels == nil { return nil } @@ -92,11 +92,19 @@ func (cs *ChannelKind) UserChannels(uid string) map[string]bool { }) }) if err != nil { - log.Fatal("error updating database: ", err) + log.Fatal("error reading database: ", err) } return result } +func (cs *ChannelKind) UserChannels(uid string) map[string]bool { + return cs.getChannelList(uid, "user channels") +} + +func (cs *ChannelKind) DirectChannels(uid string) map[string]bool { + return cs.getChannelList(uid, "direct channels") +} + func (cs *ChannelKind) ByName(name string) *Channel { switch ch := cs.world.Lookup("channel", name).(type) { case *Channel: diff --git a/server/channel/command.go b/server/channel/command.go index 23acccb..e60bb17 100644 --- a/server/channel/command.go +++ b/server/channel/command.go @@ -128,7 +128,7 @@ func (c *Channel) SendRequest(r session.Request) { } cmd := proto.NewCmd("list", c.Id()) for m, _ := range c.Members() { - u := c.kind.world.GetObject(m).(*user.User) + u := c.kind.world.GetObject(m) cmd.Args = append(cmd.Args, u.InfoFor(r.From.UserId)) } r.Reply(cmd) diff --git a/server/server/command.go b/server/server/command.go index f9386b1..2dda9e3 100644 --- a/server/server/command.go +++ b/server/server/command.go @@ -189,21 +189,57 @@ func (s *server) SendRequest(r session.Request) { c := s.channelKind.GetDirect(among) r.Reply(proto.NewCmd("direct", "", c.InfoFor(r.From.UserId))) - case "channels": + case "channels", "direct-channels": + var filter proto.Object + if len(r.Cmd.Args) == 1 { + filter = r.Cmd.Args[0] + switch filter.Kind { + case "unread": + if len(filter.Fields) != 0 { + r.ReplyInvalid() + return + } + default: + r.ReplyInvalid() + return + } + } else if len(r.Cmd.Args) > 0 { + r.ReplyInvalid() + return + } + if r.From.UserId == "" { r.Reply(proto.NewCmd("channels", "", )) return } - if len(r.Cmd.Args) != 0 { - r.ReplyInvalid() - return + + var channels map[string]bool + switch r.Cmd.Kind { + case "channels": + channels = s.channelKind.UserChannels(r.From.UserId) + case "direct-channels": + channels = s.channelKind.DirectChannels(r.From.UserId) } - var channels []proto.Object - for c := range s.channelKind.UserChannels(r.From.UserId) { - info := s.world.GetObject(c).InfoFor(r.From.UserId) - channels = append(channels, info) + + var list []proto.Object + for c := range channels { + switch c := s.world.GetObject(c).(type) { + case *channel.Channel: + var include bool + switch filter.Kind { + case "": + include = true + case "unread": + include = c.Unread(r.From.UserId) + } + info := c.InfoFor(r.From.UserId) + if include { + list = append(list, info) + } + } } - r.Reply(proto.NewCmd("channels", "", channels...)) + + r.Reply(proto.NewCmd(r.Cmd.Kind, "", list...)) case "meow": r.Reply(proto.NewCmd("meow", "")) -- cgit v1.2.3