BIG ASS COMMIT
This commit is contained in:
257
database/user.go
257
database/user.go
@ -18,16 +18,14 @@ package database
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/Rhymen/go-whatsapp"
|
||||
|
||||
log "maunium.net/go/maulogger/v2"
|
||||
|
||||
"maunium.net/go/mautrix-whatsapp/types"
|
||||
"maunium.net/go/mautrix-whatsapp/whatsapp-ext"
|
||||
whatsappExt "maunium.net/go/mautrix-whatsapp/whatsapp-ext"
|
||||
"maunium.net/go/mautrix/id"
|
||||
)
|
||||
|
||||
@ -44,31 +42,33 @@ func (uq *UserQuery) New() *User {
|
||||
}
|
||||
|
||||
func (uq *UserQuery) GetAll() (users []*User) {
|
||||
rows, err := uq.db.Query(`SELECT mxid, jid, management_room, last_connection, client_id, client_token, server_token, enc_key, mac_key FROM "user"`)
|
||||
if err != nil || rows == nil {
|
||||
return nil
|
||||
}
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
users = append(users, uq.New().Scan(rows))
|
||||
}
|
||||
// rows, err := uq.db.Query(`SELECT mxid, jid, management_room, last_connection, client_id, client_token, server_token, enc_key, mac_key FROM "user"`)
|
||||
// if err != nil || rows == nil {
|
||||
// return nil
|
||||
// }
|
||||
// defer rows.Close()
|
||||
// for rows.Next() {
|
||||
// users = append(users, uq.New().Scan(rows))
|
||||
// }
|
||||
return
|
||||
}
|
||||
|
||||
func (uq *UserQuery) GetByMXID(userID id.UserID) *User {
|
||||
row := uq.db.QueryRow(`SELECT mxid, jid, management_room, last_connection, client_id, client_token, server_token, enc_key, mac_key FROM "user" WHERE mxid=$1`, userID)
|
||||
if row == nil {
|
||||
return nil
|
||||
}
|
||||
return uq.New().Scan(row)
|
||||
// row := uq.db.QueryRow(`SELECT mxid, jid, management_room, last_connection, client_id, client_token, server_token, enc_key, mac_key FROM "user" WHERE mxid=$1`, userID)
|
||||
// if row == nil {
|
||||
// return nil
|
||||
// }
|
||||
// return uq.New().Scan(row)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (uq *UserQuery) GetByJID(userID types.WhatsAppID) *User {
|
||||
row := uq.db.QueryRow(`SELECT mxid, jid, management_room, last_connection, client_id, client_token, server_token, enc_key, mac_key FROM "user" WHERE jid=$1`, stripSuffix(userID))
|
||||
if row == nil {
|
||||
return nil
|
||||
}
|
||||
return uq.New().Scan(row)
|
||||
func (uq *UserQuery) GetByJID(userID types.GroupMeID) *User {
|
||||
// row := uq.db.QueryRow(`SELECT mxid, jid, management_room, last_connection, client_id, client_token, server_token, enc_key, mac_key FROM "user" WHERE jid=$1`, stripSuffix(userID))
|
||||
// if row == nil {
|
||||
// return nil
|
||||
// }
|
||||
// return uq.New().Scan(row)
|
||||
return nil
|
||||
}
|
||||
|
||||
type User struct {
|
||||
@ -76,9 +76,10 @@ type User struct {
|
||||
log log.Logger
|
||||
|
||||
MXID id.UserID
|
||||
JID types.WhatsAppID
|
||||
JID types.GroupMeID
|
||||
Token types.AuthToken
|
||||
|
||||
ManagementRoom id.RoomID
|
||||
Session *whatsapp.Session
|
||||
LastConnection uint64
|
||||
}
|
||||
|
||||
@ -94,21 +95,21 @@ func (user *User) Scan(row Scannable) *User {
|
||||
}
|
||||
if len(jid.String) > 0 && len(clientID.String) > 0 {
|
||||
user.JID = jid.String + whatsappExt.NewUserSuffix
|
||||
user.Session = &whatsapp.Session{
|
||||
ClientId: clientID.String,
|
||||
ClientToken: clientToken.String,
|
||||
ServerToken: serverToken.String,
|
||||
EncKey: encKey,
|
||||
MacKey: macKey,
|
||||
Wid: jid.String + whatsappExt.OldUserSuffix,
|
||||
}
|
||||
} else {
|
||||
user.Session = nil
|
||||
}
|
||||
// user.Session = &whatsapp.Session{
|
||||
// ClientId: clientID.String,
|
||||
// ClientToken: clientToken.String,
|
||||
// ServerToken: serverToken.String,
|
||||
// EncKey: encKey,
|
||||
// MacKey: macKey,
|
||||
// Wid: jid.String + whatsappExt.OldUserSuffix,
|
||||
// }
|
||||
}// else {
|
||||
// user.Session = nil
|
||||
// }
|
||||
return user
|
||||
}
|
||||
|
||||
func stripSuffix(jid types.WhatsAppID) string {
|
||||
func stripSuffix(jid types.GroupMeID) string {
|
||||
if len(jid) == 0 {
|
||||
return jid
|
||||
}
|
||||
@ -130,41 +131,41 @@ func (user *User) jidPtr() *string {
|
||||
}
|
||||
|
||||
func (user *User) sessionUnptr() (sess whatsapp.Session) {
|
||||
if user.Session != nil {
|
||||
sess = *user.Session
|
||||
}
|
||||
return
|
||||
// if user.Session != nil {
|
||||
// sess = *user.Session
|
||||
// }
|
||||
return
|
||||
}
|
||||
|
||||
func (user *User) Insert() {
|
||||
sess := user.sessionUnptr()
|
||||
_, err := user.db.Exec(`INSERT INTO "user" (mxid, jid, management_room, last_connection, client_id, client_token, server_token, enc_key, mac_key) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`,
|
||||
user.MXID, user.jidPtr(),
|
||||
user.ManagementRoom, user.LastConnection,
|
||||
sess.ClientId, sess.ClientToken, sess.ServerToken, sess.EncKey, sess.MacKey)
|
||||
if err != nil {
|
||||
user.log.Warnfln("Failed to insert %s: %v", user.MXID, err)
|
||||
}
|
||||
// sess := user.sessionUnptr()
|
||||
// _, err := user.db.Exec(`INSERT INTO "user" (mxid, jid, management_room, last_connection, client_id, client_token, server_token, enc_key, mac_key) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`,
|
||||
// user.MXID, user.jidPtr(),
|
||||
// user.ManagementRoom, user.LastConnection,
|
||||
// sess.ClientId, sess.ClientToken, sess.ServerToken, sess.EncKey, sess.MacKey)
|
||||
// if err != nil {
|
||||
// user.log.Warnfln("Failed to insert %s: %v", user.MXID, err)
|
||||
// }
|
||||
}
|
||||
|
||||
func (user *User) UpdateLastConnection() {
|
||||
user.LastConnection = uint64(time.Now().Unix())
|
||||
_, err := user.db.Exec(`UPDATE "user" SET last_connection=$1 WHERE mxid=$2`,
|
||||
user.LastConnection, user.MXID)
|
||||
if err != nil {
|
||||
user.log.Warnfln("Failed to update last connection ts: %v", err)
|
||||
}
|
||||
// user.LastConnection = uint64(time.Now().Unix())
|
||||
// _, err := user.db.Exec(`UPDATE "user" SET last_connection=$1 WHERE mxid=$2`,
|
||||
// user.LastConnection, user.MXID)
|
||||
// if err != nil {
|
||||
// user.log.Warnfln("Failed to update last connection ts: %v", err)
|
||||
// }
|
||||
}
|
||||
|
||||
func (user *User) Update() {
|
||||
sess := user.sessionUnptr()
|
||||
_, err := user.db.Exec(`UPDATE "user" SET jid=$1, management_room=$2, last_connection=$3, client_id=$4, client_token=$5, server_token=$6, enc_key=$7, mac_key=$8 WHERE mxid=$9`,
|
||||
user.jidPtr(), user.ManagementRoom, user.LastConnection,
|
||||
sess.ClientId, sess.ClientToken, sess.ServerToken, sess.EncKey, sess.MacKey,
|
||||
user.MXID)
|
||||
if err != nil {
|
||||
user.log.Warnfln("Failed to update %s: %v", user.MXID, err)
|
||||
}
|
||||
// sess := user.sessionUnptr()
|
||||
// _, err := user.db.Exec(`UPDATE "user" SET jid=$1, management_room=$2, last_connection=$3, client_id=$4, client_token=$5, server_token=$6, enc_key=$7, mac_key=$8 WHERE mxid=$9`,
|
||||
// user.jidPtr(), user.ManagementRoom, user.LastConnection,
|
||||
// sess.ClientId, sess.ClientToken, sess.ServerToken, sess.EncKey, sess.MacKey,
|
||||
// user.MXID)
|
||||
// if err != nil {
|
||||
// user.log.Warnfln("Failed to update %s: %v", user.MXID, err)
|
||||
// }
|
||||
}
|
||||
|
||||
type PortalKeyWithMeta struct {
|
||||
@ -173,77 +174,81 @@ type PortalKeyWithMeta struct {
|
||||
}
|
||||
|
||||
func (user *User) SetPortalKeys(newKeys []PortalKeyWithMeta) error {
|
||||
tx, err := user.db.Begin()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = tx.Exec("DELETE FROM user_portal WHERE user_jid=$1", user.jidPtr())
|
||||
if err != nil {
|
||||
_ = tx.Rollback()
|
||||
return err
|
||||
}
|
||||
valueStrings := make([]string, len(newKeys))
|
||||
values := make([]interface{}, len(newKeys)*4)
|
||||
for i, key := range newKeys {
|
||||
pos := i * 4
|
||||
valueStrings[i] = fmt.Sprintf("($%d, $%d, $%d, $%d)", pos+1, pos+2, pos+3, pos+4)
|
||||
values[pos] = user.jidPtr()
|
||||
values[pos+1] = key.JID
|
||||
values[pos+2] = key.Receiver
|
||||
values[pos+3] = key.InCommunity
|
||||
}
|
||||
query := fmt.Sprintf("INSERT INTO user_portal (user_jid, portal_jid, portal_receiver, in_community) VALUES %s",
|
||||
strings.Join(valueStrings, ", "))
|
||||
_, err = tx.Exec(query, values...)
|
||||
if err != nil {
|
||||
_ = tx.Rollback()
|
||||
return err
|
||||
}
|
||||
return tx.Commit()
|
||||
// tx, err := user.db.Begin()
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
// _, err = tx.Exec("DELETE FROM user_portal WHERE user_jid=$1", user.jidPtr())
|
||||
// if err != nil {
|
||||
// _ = tx.Rollback()
|
||||
// return err
|
||||
// }
|
||||
// valueStrings := make([]string, len(newKeys))
|
||||
// values := make([]interface{}, len(newKeys)*4)
|
||||
// for i, key := range newKeys {
|
||||
// pos := i * 4
|
||||
// valueStrings[i] = fmt.Sprintf("($%d, $%d, $%d, $%d)", pos+1, pos+2, pos+3, pos+4)
|
||||
// values[pos] = user.jidPtr()
|
||||
// values[pos+1] = key.JID
|
||||
// values[pos+2] = key.Receiver
|
||||
// values[pos+3] = key.InCommunity
|
||||
// }
|
||||
// query := fmt.Sprintf("INSERT INTO user_portal (user_jid, portal_jid, portal_receiver, in_community) VALUES %s",
|
||||
// strings.Join(valueStrings, ", "))
|
||||
// _, err = tx.Exec(query, values...)
|
||||
// if err != nil {
|
||||
// _ = tx.Rollback()
|
||||
// return err
|
||||
// }
|
||||
// return tx.Commit()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (user *User) IsInPortal(key PortalKey) bool {
|
||||
row := user.db.QueryRow(`SELECT EXISTS(SELECT 1 FROM user_portal WHERE user_jid=$1 AND portal_jid=$2 AND portal_receiver=$3)`, user.jidPtr(), &key.JID, &key.Receiver)
|
||||
var exists bool
|
||||
_ = row.Scan(&exists)
|
||||
return exists
|
||||
// row := user.db.QueryRow(`SELECT EXISTS(SELECT 1 FROM user_portal WHERE user_jid=$1 AND portal_jid=$2 AND portal_receiver=$3)`, user.jidPtr(), &key.JID, &key.Receiver)
|
||||
// var exists bool
|
||||
// _ = row.Scan(&exists)
|
||||
// return exists
|
||||
return false
|
||||
}
|
||||
|
||||
func (user *User) GetPortalKeys() []PortalKey {
|
||||
rows, err := user.db.Query(`SELECT portal_jid, portal_receiver FROM user_portal WHERE user_jid=$1`, user.jidPtr())
|
||||
if err != nil {
|
||||
user.log.Warnln("Failed to get user portal keys:", err)
|
||||
return nil
|
||||
}
|
||||
var keys []PortalKey
|
||||
for rows.Next() {
|
||||
var key PortalKey
|
||||
err = rows.Scan(&key.JID, &key.Receiver)
|
||||
if err != nil {
|
||||
user.log.Warnln("Failed to scan row:", err)
|
||||
continue
|
||||
}
|
||||
keys = append(keys, key)
|
||||
}
|
||||
return keys
|
||||
// rows, err := user.db.Query(`SELECT portal_jid, portal_receiver FROM user_portal WHERE user_jid=$1`, user.jidPtr())
|
||||
// if err != nil {
|
||||
// user.log.Warnln("Failed to get user portal keys:", err)
|
||||
// return nil
|
||||
// }
|
||||
// var keys []PortalKey
|
||||
// for rows.Next() {
|
||||
// var key PortalKey
|
||||
// err = rows.Scan(&key.JID, &key.Receiver)
|
||||
// if err != nil {
|
||||
// user.log.Warnln("Failed to scan row:", err)
|
||||
// continue
|
||||
// }
|
||||
// keys = append(keys, key)
|
||||
// }
|
||||
// return keys
|
||||
return nil
|
||||
}
|
||||
|
||||
func (user *User) GetInCommunityMap() map[PortalKey]bool {
|
||||
rows, err := user.db.Query(`SELECT portal_jid, portal_receiver, in_community FROM user_portal WHERE user_jid=$1`, user.jidPtr())
|
||||
if err != nil {
|
||||
user.log.Warnln("Failed to get user portal keys:", err)
|
||||
return nil
|
||||
}
|
||||
keys := make(map[PortalKey]bool)
|
||||
for rows.Next() {
|
||||
var key PortalKey
|
||||
var inCommunity bool
|
||||
err = rows.Scan(&key.JID, &key.Receiver, &inCommunity)
|
||||
if err != nil {
|
||||
user.log.Warnln("Failed to scan row:", err)
|
||||
continue
|
||||
}
|
||||
keys[key] = inCommunity
|
||||
}
|
||||
return keys
|
||||
// rows, err := user.db.Query(`SELECT portal_jid, portal_receiver, in_community FROM user_portal WHERE user_jid=$1`, user.jidPtr())
|
||||
// if err != nil {
|
||||
// user.log.Warnln("Failed to get user portal keys:", err)
|
||||
// return nil
|
||||
// }
|
||||
// keys := make(map[PortalKey]bool)
|
||||
// for rows.Next() {
|
||||
// var key PortalKey
|
||||
// var inCommunity bool
|
||||
// err = rows.Scan(&key.JID, &key.Receiver, &inCommunity)
|
||||
// if err != nil {
|
||||
// user.log.Warnln("Failed to scan row:", err)
|
||||
// continue
|
||||
// }
|
||||
// keys[key] = inCommunity
|
||||
// }
|
||||
// return keys
|
||||
return nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user