source: code/trunk/db.go@ 537

Last change on this file since 537 was 531, checked in by sir, 4 years ago

db: refactor into interface

This refactors the SQLite-specific bits into db_sqlite.go. A future
patch will add PostgreSQL support.

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