-
Notifications
You must be signed in to change notification settings - Fork 0
/
rooms.go
120 lines (91 loc) · 2.12 KB
/
rooms.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package cmd
import (
"os"
"sort"
"github.com/jedib0t/go-pretty/table"
"github.com/matrix-org/gomatrix"
"github.com/nadams/go-matrixcli/auth"
)
type Rooms struct {
List ListRooms `cmd:"" help:"List joined rooms."`
Members ListMembers `cmd:"" help:"List members in a given room."`
}
type ListRooms struct {
Account string `optional:"" short:"a" help:"Account to use."`
}
func (l *ListRooms) Run(ts *auth.TokenStore) error {
var aa auth.AccountAuth
var err error
if l.Account == "" {
aa, err = ts.Current()
} else {
aa, err = ts.Find(l.Account)
}
if err != nil {
return err
}
cl, err := gomatrix.NewClient(aa.Homeserver, aa.UserID, aa.Token)
if err != nil {
return err
}
rooms, err := cl.JoinedRooms()
if err != nil {
return err
}
t := table.NewWriter()
t.SetOutputMirror(os.Stdout)
t.AppendHeader(table.Row{"#", "Room"})
sort.Strings(rooms.JoinedRooms)
for i, r := range rooms.JoinedRooms {
t.AppendRow(table.Row{i + 1, r})
}
t.Render()
return nil
}
type ListMembers struct {
Room string `arg:"" help:"The room to list the members of."`
Account string `optional:"" short:"a" help:"Account to use."`
}
func (l *ListMembers) Run(ts *auth.TokenStore) error {
var aa auth.AccountAuth
var err error
if l.Account == "" {
aa, err = ts.Current()
} else {
aa, err = ts.Find(l.Account)
}
if err != nil {
return err
}
cl, err := gomatrix.NewClient(aa.Homeserver, aa.UserID, aa.Token)
if err != nil {
return err
}
resp, err := cl.JoinedMembers(l.Room)
if err != nil {
return err
}
t := table.NewWriter()
t.SetOutputMirror(os.Stdout)
t.AppendHeader(table.Row{"Name", "User ID"})
type membership struct {
id string
name string
}
members := make([]membership, 0, len(resp.Joined))
for id, user := range resp.Joined {
var name string
if n := user.DisplayName; n != nil {
name = *n
}
members = append(members, membership{id: id, name: name})
}
sort.Slice(members, func(i, j int) bool {
return members[i].name < members[j].name && members[i].id < members[j].id
})
for _, m := range members {
t.AppendRow(table.Row{m.name, m.id})
}
t.Render()
return nil
}