diff --git a/database/migrations/04-custom-puppet.sql b/database/migrations/04-custom-puppet.sql new file mode 100644 index 0000000..a5c6af9 --- /dev/null +++ b/database/migrations/04-custom-puppet.sql @@ -0,0 +1,2 @@ +ALTER TABLE puppet ADD COLUMN custom_mxid TEXT; +ALTER TABLE puppet ADD COLUMN access_token TEXT; diff --git a/database/migrations/migrations.go b/database/migrations/migrations.go index a0d14dd..3335a83 100644 --- a/database/migrations/migrations.go +++ b/database/migrations/migrations.go @@ -42,6 +42,7 @@ func Run(db *sql.DB, baseLog log.Logger) error { migrationFromFile("01-initial.sql"), migrationFromFile("02-attachments.sql"), migrationFromFile("03-emoji.sql"), + migrationFromFile("04-custom-puppet.sql"), ), ) if err != nil { diff --git a/database/puppet.go b/database/puppet.go index 33af833..6c362cf 100644 --- a/database/puppet.go +++ b/database/puppet.go @@ -7,6 +7,12 @@ import ( "maunium.net/go/mautrix/id" ) +const ( + puppetSelect = "SELECT id, display_name, avatar, avatar_url, " + + " enable_presence, custom_mxid, access_token" + + " FROM puppet " +) + type Puppet struct { db *Database log log.Logger @@ -18,13 +24,17 @@ type Puppet struct { AvatarURL id.ContentURI EnablePresence bool + + CustomMXID string + AccessToken string } func (p *Puppet) Scan(row Scannable) *Puppet { var did, displayName, avatar, avatarURL sql.NullString var enablePresence sql.NullBool + var customMXID, accessToken sql.NullString - err := row.Scan(&did, &displayName, &avatar, &avatarURL, &enablePresence) + err := row.Scan(&did, &displayName, &avatar, &avatarURL, &enablePresence, &customMXID, &accessToken) if err != nil { if err != sql.ErrNoRows { p.log.Errorln("Database scan failed:", err) @@ -38,17 +48,20 @@ func (p *Puppet) Scan(row Scannable) *Puppet { p.Avatar = avatar.String p.AvatarURL, _ = id.ParseContentURI(avatarURL.String) p.EnablePresence = enablePresence.Bool + p.CustomMXID = customMXID.String + p.AccessToken = accessToken.String return p } func (p *Puppet) Insert() { query := "INSERT INTO puppet" + - " (id, display_name, avatar, avatar_url, enable_presence)" + - " VALUES ($1, $2, $3, $4, $5)" + " (id, display_name, avatar, avatar_url, enable_presence," + + " custom_mxid, access_token)" + + " VALUES ($1, $2, $3, $4, $5, $6, $7)" _, err := p.db.Exec(query, p.ID, p.DisplayName, p.Avatar, - p.AvatarURL.String(), p.EnablePresence) + p.AvatarURL.String(), p.EnablePresence, p.CustomMXID, p.AccessToken) if err != nil { p.log.Warnfln("Failed to insert %s: %v", p.ID, err) @@ -58,10 +71,11 @@ func (p *Puppet) Insert() { func (p *Puppet) Update() { query := "UPDATE puppet" + " SET display_name=$1, avatar=$2, avatar_url=$3, enable_presence=$4" + - " WHERE id=$5" + " custom_mxid=$5, access_token=$6" + + " WHERE id=$7" _, err := p.db.Exec(query, p.DisplayName, p.Avatar, p.AvatarURL.String(), - p.EnablePresence, p.ID) + p.EnablePresence, p.CustomMXID, p.AccessToken, p.ID) if err != nil { p.log.Warnfln("Failed to update %s: %v", p.ID, err) diff --git a/database/puppetquery.go b/database/puppetquery.go index ae61178..5ae32f1 100644 --- a/database/puppetquery.go +++ b/database/puppetquery.go @@ -2,6 +2,7 @@ package database import ( log "maunium.net/go/maulogger/v2" + "maunium.net/go/mautrix/id" ) type PuppetQuery struct { @@ -19,10 +20,41 @@ func (pq *PuppetQuery) New() *Puppet { } func (pq *PuppetQuery) Get(id string) *Puppet { - row := pq.db.QueryRow("SELECT id, display_name, avatar, avatar_url, enable_presence FROM puppet WHERE id=$1", id) + return pq.get(puppetSelect+" WHERE id=$1", id) +} + +func (pq *PuppetQuery) GetByCustomMXID(mxid id.UserID) *Puppet { + return pq.get(puppetSelect+" WHERE custom_mxid=$1", mxid) +} + +func (pq *PuppetQuery) get(query string, args ...interface{}) *Puppet { + row := pq.db.QueryRow(query, args...) if row == nil { return nil } return pq.New().Scan(row) } + +func (pq *PuppetQuery) GetAll() []*Puppet { + return pq.getAll(puppetSelect) +} + +func (pq *PuppetQuery) GetAllWithCustomMXID() []*Puppet { + return pq.getAll(puppetSelect + " WHERE custom_mxid<>''") +} + +func (pq *PuppetQuery) getAll(query string, args ...interface{}) []*Puppet { + rows, err := pq.db.Query(query, args...) + if err != nil || rows == nil { + return nil + } + defer rows.Close() + + puppets := []*Puppet{} + for rows.Next() { + puppets = append(puppets, pq.New().Scan(rows)) + } + + return puppets +}