source: code/trunk/db.go@ 623

Last change on this file since 623 was 620, checked in by hubert, 4 years ago

PostgreSQL support

File size: 3.2 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
30func OpenDB(driver, source string) (Database, error) {
31 switch driver {
32 case "sqlite3":
33 return OpenSqliteDB(source)
34 case "postgres":
35 return OpenPostgresDB(source)
36 default:
37 return nil, fmt.Errorf("unsupported database driver: %q", driver)
38 }
39}
40
41type DatabaseStats struct {
42 Users int64
43 Networks int64
44 Channels int64
45}
46
47type User struct {
48 ID int64
49 Username string
50 Password string // hashed
51 Realname string
52 Admin bool
53}
54
55type SASL struct {
56 Mechanism string
57
58 Plain struct {
59 Username string
60 Password string
61 }
62
63 // TLS client certificate authentication.
64 External struct {
65 // X.509 certificate in DER form.
66 CertBlob []byte
67 // PKCS#8 private key in DER form.
68 PrivKeyBlob []byte
69 }
70}
71
72type Network struct {
73 ID int64
74 Name string
75 Addr string
76 Nick string
77 Username string
78 Realname string
79 Pass string
80 ConnectCommands []string
81 SASL SASL
82 Enabled bool
83}
84
85func (net *Network) GetName() string {
86 if net.Name != "" {
87 return net.Name
88 }
89 return net.Addr
90}
91
92func (net *Network) URL() (*url.URL, error) {
93 s := net.Addr
94 if !strings.Contains(s, "://") {
95 // This is a raw domain name, make it an URL with the default scheme
96 s = "ircs://" + s
97 }
98
99 u, err := url.Parse(s)
100 if err != nil {
101 return nil, fmt.Errorf("failed to parse upstream server URL: %v", err)
102 }
103
104 return u, nil
105}
106
107func (net *Network) GetUsername() string {
108 if net.Username != "" {
109 return net.Username
110 }
111 return net.Nick
112}
113
114func GetRealname(user *User, net *Network) string {
115 if net.Realname != "" {
116 return net.Realname
117 }
118 if user.Realname != "" {
119 return user.Realname
120 }
121 return net.Nick
122}
123
124type MessageFilter int
125
126const (
127 // TODO: use customizable user defaults for FilterDefault
128 FilterDefault MessageFilter = iota
129 FilterNone
130 FilterHighlight
131 FilterMessage
132)
133
134func parseFilter(filter string) (MessageFilter, error) {
135 switch filter {
136 case "default":
137 return FilterDefault, nil
138 case "none":
139 return FilterNone, nil
140 case "highlight":
141 return FilterHighlight, nil
142 case "message":
143 return FilterMessage, nil
144 }
145 return 0, fmt.Errorf("unknown filter: %q", filter)
146}
147
148type Channel struct {
149 ID int64
150 Name string
151 Key string
152
153 Detached bool
154 DetachedInternalMsgID string
155
156 RelayDetached MessageFilter
157 ReattachOn MessageFilter
158 DetachAfter time.Duration
159 DetachOn MessageFilter
160}
161
162type DeliveryReceipt struct {
163 ID int64
164 Target string // channel or nick
165 Client string
166 InternalMsgID string
167}
Note: See TracBrowser for help on using the repository browser.