87 lines
1.8 KiB
Go
87 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"github.com/ricochet-im/ricochet-go/rpc"
|
|
)
|
|
|
|
type ContactList struct {
|
|
Client *Client
|
|
Contacts map[string]*Contact
|
|
Requests map[string]*ricochet.ContactRequest
|
|
}
|
|
|
|
func NewContactList(client *Client) *ContactList {
|
|
return &ContactList{
|
|
Client: client,
|
|
Contacts: make(map[string]*Contact),
|
|
Requests: make(map[string]*ricochet.ContactRequest),
|
|
}
|
|
}
|
|
|
|
func (cl *ContactList) Populate(data *ricochet.Contact) error {
|
|
if cl.Contacts[data.Address] != nil {
|
|
return fmt.Errorf("Duplicate contact %s in populate", data.Address)
|
|
}
|
|
|
|
cl.Contacts[data.Address] = initContact(cl.Client, data)
|
|
return nil
|
|
}
|
|
|
|
func (cl *ContactList) Added(data *ricochet.Contact) (*Contact, error) {
|
|
if cl.Contacts[data.Address] != nil {
|
|
return nil, fmt.Errorf("Duplicate contact %s in add", data.Address)
|
|
}
|
|
|
|
contact := initContact(cl.Client, data)
|
|
cl.Contacts[data.Address] = contact
|
|
return contact, nil
|
|
}
|
|
|
|
func (cl *ContactList) Deleted(data *ricochet.Contact) (*Contact, error) {
|
|
contact := cl.Contacts[data.Address]
|
|
if contact == nil {
|
|
return nil, fmt.Errorf("Contact %s does not exist in delete", data.Address)
|
|
}
|
|
|
|
contact.Deleted()
|
|
delete(cl.Contacts, data.Address)
|
|
return contact, nil
|
|
}
|
|
|
|
func (cl *ContactList) ByAddress(address string) *Contact {
|
|
return cl.Contacts[address]
|
|
}
|
|
|
|
type Contact struct {
|
|
Data *ricochet.Contact
|
|
Conversation *Conversation
|
|
}
|
|
|
|
func initContact(client *Client, data *ricochet.Contact) *Contact {
|
|
c := &Contact{
|
|
Data: data,
|
|
}
|
|
c.Conversation = &Conversation{
|
|
Client: client,
|
|
Contact: c,
|
|
}
|
|
return c
|
|
}
|
|
|
|
func (c *Contact) Updated(newData *ricochet.Contact) error {
|
|
if newData.Address != c.Data.Address {
|
|
return errors.New("Contact address is immutable")
|
|
}
|
|
|
|
c.Data = newData
|
|
return nil
|
|
}
|
|
|
|
func (c *Contact) Deleted() {
|
|
c.Data = &ricochet.Contact{
|
|
Address: c.Data.Address,
|
|
}
|
|
}
|