feat(ui): BOTS section in member list

Members API appends server bots (is_bot). Sidebar groups ONLINE / OFFLINE / BOTS.
Bots get green BOT badge, no kick menu or profile. Mentions and DMs skip bots.
This commit is contained in:
2026-07-15 20:37:05 -04:00
parent 038ac1fe8e
commit a277c78e2c
5 changed files with 63 additions and 16 deletions
+24
View File
@@ -35,6 +35,8 @@ type memberResponse struct {
Avatar string `json:"avatar"`
Status string `json:"status"`
StatusText string `json:"status_text"`
IsBot bool `json:"is_bot,omitempty"`
BotType string `json:"bot_type,omitempty"`
}
func (h *MemberHandler) ListMembers(w http.ResponseWriter, r *http.Request) {
@@ -82,6 +84,28 @@ func (h *MemberHandler) ListMembers(w http.ResponseWriter, r *http.Request) {
members = append(members, m)
}
// Bots added to this server (separate BOTS section in the member list).
botRows, err := h.db.QueryContext(r.Context(), `
SELECT b.id, b.name, COALESCE(b.avatar, ''), COALESCE(b.bot_type, '')
FROM bot_servers bs
JOIN bots b ON b.id = bs.bot_id
WHERE bs.server_id = $1
ORDER BY b.name
`, serverID)
if err == nil {
defer botRows.Close()
for botRows.Next() {
var m memberResponse
if err := botRows.Scan(&m.ID, &m.Username, &m.Avatar, &m.BotType); err != nil {
continue
}
m.DisplayName = m.Username
m.Status = "online" // ponytail: no bot presence yet; always show online
m.IsBot = true
members = append(members, m)
}
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(members)
}