summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorraven <citrons@mondecitronne.com>2026-02-10 17:32:28 -0600
committerraven <citrons@mondecitronne.com>2026-02-10 17:32:28 -0600
commit64900975d5cd90910830dae3f1e5596f1ce2d1a3 (patch)
tree2e828fe8ea3f74df1abb2df0df57a3eddf77ca02 /server
parentd24a596f8421dc6cd0f42948ec43876e607dcf73 (diff)
direct channel list
Diffstat (limited to 'server')
-rw-r--r--server/channel/channel.go14
-rw-r--r--server/channel/command.go2
-rw-r--r--server/server/command.go54
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", ""))