source: code/trunk/db.go@ 598

Last change on this file since 598 was 568, checked in by contact, 4 years ago

Add per-user realname setting

This allows users to set a default realname used if the per-network
realname isn't set.

A new "user update" command is introduced and can be extended to edit
other user properties and other users in the future.

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