source: code/trunk/db.go@ 618

Last change on this file since 618 was 607, checked in by contact, 4 years ago

Add DB stats

File size: 2.9 KB
Line 
1package soju
2
3import (
4 "fmt"
5 "net/url"
6 "strings"
7 "time"
8)
9
10type Database interface {
11 Close() error
12 Stats() (*DatabaseStats, error)
13
14 ListUsers() ([]User, error)
15 GetUser(username string) (*User, error)
16 StoreUser(user *User) error
17 DeleteUser(id int64) error
18
19 ListNetworks(userID int64) ([]Network, error)
20 StoreNetwork(userID int64, network *Network) error
21 DeleteNetwork(id int64) error
22 ListChannels(networkID int64) ([]Channel, error)
23 StoreChannel(networKID int64, ch *Channel) error
24 DeleteChannel(id int64) error
25
26 ListDeliveryReceipts(networkID int64) ([]DeliveryReceipt, error)
27 StoreClientDeliveryReceipts(networkID int64, client string, receipts []DeliveryReceipt) error
28}
29
30type DatabaseStats struct {
31 Users int64
32 Networks int64
33 Channels int64
34}
35
36type User struct {
37 ID int64
38 Username string
39 Password string // hashed
40 Realname string
41 Admin bool
42}
43
44type SASL struct {
45 Mechanism string
46
47 Plain struct {
48 Username string
49 Password string
50 }
51
52 // TLS client certificate authentication.
53 External struct {
54 // X.509 certificate in DER form.
55 CertBlob []byte
56 // PKCS#8 private key in DER form.
57 PrivKeyBlob []byte
58 }
59}
60
61type Network struct {
62 ID int64
63 Name string
64 Addr string
65 Nick string
66 Username string
67 Realname string
68 Pass string
69 ConnectCommands []string
70 SASL SASL
71 Enabled bool
72}
73
74func (net *Network) GetName() string {
75 if net.Name != "" {
76 return net.Name
77 }
78 return net.Addr
79}
80
81func (net *Network) URL() (*url.URL, error) {
82 s := net.Addr
83 if !strings.Contains(s, "://") {
84 // This is a raw domain name, make it an URL with the default scheme
85 s = "ircs://" + s
86 }
87
88 u, err := url.Parse(s)
89 if err != nil {
90 return nil, fmt.Errorf("failed to parse upstream server URL: %v", err)
91 }
92
93 return u, nil
94}
95
96func (net *Network) GetUsername() string {
97 if net.Username != "" {
98 return net.Username
99 }
100 return net.Nick
101}
102
103func GetRealname(user *User, net *Network) string {
104 if net.Realname != "" {
105 return net.Realname
106 }
107 if user.Realname != "" {
108 return user.Realname
109 }
110 return net.Nick
111}
112
113type MessageFilter int
114
115const (
116 // TODO: use customizable user defaults for FilterDefault
117 FilterDefault MessageFilter = iota
118 FilterNone
119 FilterHighlight
120 FilterMessage
121)
122
123func parseFilter(filter string) (MessageFilter, error) {
124 switch filter {
125 case "default":
126 return FilterDefault, nil
127 case "none":
128 return FilterNone, nil
129 case "highlight":
130 return FilterHighlight, nil
131 case "message":
132 return FilterMessage, nil
133 }
134 return 0, fmt.Errorf("unknown filter: %q", filter)
135}
136
137type Channel struct {
138 ID int64
139 Name string
140 Key string
141
142 Detached bool
143 DetachedInternalMsgID string
144
145 RelayDetached MessageFilter
146 ReattachOn MessageFilter
147 DetachAfter time.Duration
148 DetachOn MessageFilter
149}
150
151type DeliveryReceipt struct {
152 ID int64
153 Target string // channel or nick
154 Client string
155 InternalMsgID string
156}
Note: See TracBrowser for help on using the repository browser.