Store username/discriminator/bot status in puppet table

This commit is contained in:
Tulir Asokan
2023-04-26 21:18:45 +03:00
parent f6f6ed29ec
commit 0e5faa5510
5 changed files with 61 additions and 30 deletions

View File

@@ -68,9 +68,10 @@ func New(baseDB *dbutil.Database, log maulogger.Logger) *Database {
return db return db
} }
func strPtr(val string) *string { func strPtr[T ~string](val T) *string {
if val == "" { if val == "" {
return nil return nil
} }
return &val valStr := string(val)
return &valStr
} }

View File

@@ -11,7 +11,7 @@ import (
const ( const (
puppetSelect = "SELECT id, name, name_set, avatar, avatar_url, avatar_set," + puppetSelect = "SELECT id, name, name_set, avatar, avatar_url, avatar_set," +
" contact_info_set, custom_mxid, access_token, next_batch" + " contact_info_set, username, discriminator, is_bot, custom_mxid, access_token, next_batch" +
" FROM puppet " " FROM puppet "
) )
@@ -66,14 +66,19 @@ type Puppet struct {
db *Database db *Database
log log.Logger log log.Logger
ID string ID string
Name string Name string
NameSet bool NameSet bool
Avatar string Avatar string
AvatarURL id.ContentURI AvatarURL id.ContentURI
AvatarSet bool AvatarSet bool
ContactInfoSet bool ContactInfoSet bool
Username string
Discriminator string
IsBot bool
CustomMXID id.UserID CustomMXID id.UserID
AccessToken string AccessToken string
NextBatch string NextBatch string
@@ -84,7 +89,7 @@ func (p *Puppet) Scan(row dbutil.Scannable) *Puppet {
var customMXID, accessToken, nextBatch sql.NullString var customMXID, accessToken, nextBatch sql.NullString
err := row.Scan(&p.ID, &p.Name, &p.NameSet, &p.Avatar, &avatarURL, &p.AvatarSet, &p.ContactInfoSet, err := row.Scan(&p.ID, &p.Name, &p.NameSet, &p.Avatar, &avatarURL, &p.AvatarSet, &p.ContactInfoSet,
&customMXID, &accessToken, &nextBatch) &p.Username, &p.Discriminator, &p.IsBot, &customMXID, &accessToken, &nextBatch)
if err != nil { if err != nil {
if err != sql.ErrNoRows { if err != sql.ErrNoRows {
@@ -105,11 +110,11 @@ func (p *Puppet) Scan(row dbutil.Scannable) *Puppet {
func (p *Puppet) Insert() { func (p *Puppet) Insert() {
query := ` query := `
INSERT INTO puppet (id, name, name_set, avatar, avatar_url, avatar_set, contact_info_set, custom_mxid, access_token, next_batch) INSERT INTO puppet (id, name, name_set, avatar, avatar_url, avatar_set, contact_info_set, username, discriminator, is_bot, custom_mxid, access_token, next_batch)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)
` `
_, err := p.db.Exec(query, p.ID, p.Name, p.NameSet, p.Avatar, p.AvatarURL.String(), p.AvatarSet, p.ContactInfoSet, _, err := p.db.Exec(query, p.ID, p.Name, p.NameSet, p.Avatar, p.AvatarURL.String(), p.AvatarSet, p.ContactInfoSet,
strPtr(string(p.CustomMXID)), strPtr(p.AccessToken), strPtr(p.NextBatch)) p.Username, p.Discriminator, p.IsBot, strPtr(p.CustomMXID), strPtr(p.AccessToken), strPtr(p.NextBatch))
if err != nil { if err != nil {
p.log.Warnfln("Failed to insert %s: %v", p.ID, err) p.log.Warnfln("Failed to insert %s: %v", p.ID, err)
@@ -119,12 +124,12 @@ func (p *Puppet) Insert() {
func (p *Puppet) Update() { func (p *Puppet) Update() {
query := ` query := `
UPDATE puppet SET name=$1, name_set=$2, avatar=$3, avatar_url=$4, avatar_set=$5, UPDATE puppet SET name=$1, name_set=$2, avatar=$3, avatar_url=$4, avatar_set=$5, contact_info_set=$6,
contact_info_set=$6, custom_mxid=$7, access_token=$8, next_batch=$9 username=$7, discriminator=$8, is_bot=$9, custom_mxid=$10, access_token=$11, next_batch=$12
WHERE id=$10 WHERE id=$13
` `
_, err := p.db.Exec(query, p.Name, p.NameSet, p.Avatar, p.AvatarURL.String(), p.AvatarSet, _, err := p.db.Exec(query, p.Name, p.NameSet, p.Avatar, p.AvatarURL.String(), p.AvatarSet, p.ContactInfoSet,
p.ContactInfoSet, strPtr(string(p.CustomMXID)), strPtr(p.AccessToken), strPtr(p.NextBatch), p.Username, p.Discriminator, p.IsBot, strPtr(p.CustomMXID), strPtr(p.AccessToken), strPtr(p.NextBatch),
p.ID) p.ID)
if err != nil { if err != nil {

View File

@@ -1,4 +1,4 @@
-- v0 -> v17: Latest revision -- v0 -> v18: Latest revision
CREATE TABLE guild ( CREATE TABLE guild (
dcid TEXT PRIMARY KEY, dcid TEXT PRIMARY KEY,
@@ -68,8 +68,13 @@ CREATE TABLE puppet (
avatar TEXT NOT NULL, avatar TEXT NOT NULL,
avatar_url TEXT NOT NULL, avatar_url TEXT NOT NULL,
avatar_set BOOLEAN NOT NULL DEFAULT false, avatar_set BOOLEAN NOT NULL DEFAULT false,
contact_info_set BOOLEAN NOT NULL DEFAULT false, contact_info_set BOOLEAN NOT NULL DEFAULT false,
username TEXT NOT NULL DEFAULT '',
discriminator TEXT NOT NULL DEFAULT '',
is_bot BOOLEAN NOT NULL DEFAULT false,
custom_mxid TEXT, custom_mxid TEXT,
access_token TEXT, access_token TEXT,
next_batch TEXT next_batch TEXT

View File

@@ -0,0 +1,4 @@
-- v18: Store additional metadata for ghosts
ALTER TABLE puppet ADD COLUMN username TEXT NOT NULL DEFAULT '';
ALTER TABLE puppet ADD COLUMN discriminator TEXT NOT NULL DEFAULT '';
ALTER TABLE puppet ADD COLUMN is_bot BOOLEAN NOT NULL DEFAULT false;

View File

@@ -281,7 +281,8 @@ func (puppet *Puppet) UpdateInfo(source *User, info *discordgo.User) {
puppet.log.Error().Err(err).Msg("Failed to ensure registered") puppet.log.Error().Err(err).Msg("Failed to ensure registered")
} }
changed := puppet.UpdateContactInfo(source, info) changed := false
changed = puppet.UpdateContactInfo(info) || changed
changed = puppet.UpdateName(info) || changed changed = puppet.UpdateName(info) || changed
changed = puppet.UpdateAvatar(info) || changed changed = puppet.UpdateAvatar(info) || changed
if changed { if changed {
@@ -289,30 +290,45 @@ func (puppet *Puppet) UpdateInfo(source *User, info *discordgo.User) {
} }
} }
func (puppet *Puppet) UpdateContactInfo(source *User, info *discordgo.User) bool { func (puppet *Puppet) UpdateContactInfo(info *discordgo.User) bool {
if puppet.bridge.Config.Homeserver.Software != bridgeconfig.SoftwareHungry { changed := false
return false if puppet.Username != info.Username {
puppet.Username = info.Username
changed = true
} }
if puppet.Discriminator != info.Discriminator {
if puppet.ContactInfoSet { puppet.Discriminator = info.Discriminator
return false changed = true
} }
if puppet.IsBot != info.Bot {
puppet.IsBot = info.Bot
changed = true
}
if changed {
puppet.ContactInfoSet = false
puppet.ResendContactInfo()
return true
}
return false
}
func (puppet *Puppet) ResendContactInfo() {
if puppet.bridge.Config.Homeserver.Software != bridgeconfig.SoftwareHungry || puppet.ContactInfoSet {
return
}
contactInfo := map[string]any{ contactInfo := map[string]any{
"com.beeper.bridge.identifiers": []string{ "com.beeper.bridge.identifiers": []string{
fmt.Sprintf("discord:%s#%s", info.Username, info.Discriminator), fmt.Sprintf("discord:%s#%s", puppet.Username, puppet.Discriminator),
}, },
"com.beeper.bridge.remote_id": puppet.ID, "com.beeper.bridge.remote_id": puppet.ID,
"com.beeper.bridge.service": puppet.bridge.BeeperServiceName, "com.beeper.bridge.service": puppet.bridge.BeeperServiceName,
"com.beeper.bridge.network": puppet.bridge.BeeperNetworkName, "com.beeper.bridge.network": puppet.bridge.BeeperNetworkName,
"com.beeper.bridge.is_network_bot": info.Bot, "com.beeper.bridge.is_network_bot": puppet.IsBot,
} }
err := puppet.DefaultIntent().BeeperUpdateProfile(contactInfo) err := puppet.DefaultIntent().BeeperUpdateProfile(contactInfo)
if err != nil { if err != nil {
puppet.log.Warn().Err(err).Msg("Failed to store custom contact info in profile") puppet.log.Warn().Err(err).Msg("Failed to store custom contact info in profile")
return false
} else { } else {
puppet.ContactInfoSet = true puppet.ContactInfoSet = true
return true
} }
} }