portal.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package database
  2. import (
  3. "database/sql"
  4. log "maunium.net/go/maulogger/v2"
  5. "maunium.net/go/mautrix/id"
  6. )
  7. type Portal struct {
  8. db *Database
  9. log log.Logger
  10. Key PortalKey
  11. MXID id.RoomID
  12. Name string
  13. Topic string
  14. Avatar string
  15. AvatarURL id.ContentURI
  16. Type int
  17. DMUser string
  18. FirstEventID id.EventID
  19. }
  20. func (p *Portal) Scan(row Scannable) *Portal {
  21. var mxid, avatarURL, firstEventID sql.NullString
  22. err := row.Scan(&p.Key.ChannelID, &p.Key.Receiver, &mxid, &p.Name, &p.Topic, &p.Avatar, &avatarURL, &firstEventID)
  23. if err != nil {
  24. if err != sql.ErrNoRows {
  25. p.log.Errorln("Database scan failed:", err)
  26. }
  27. return nil
  28. }
  29. p.MXID = id.RoomID(mxid.String)
  30. p.AvatarURL, _ = id.ParseContentURI(avatarURL.String)
  31. p.FirstEventID = id.EventID(firstEventID.String)
  32. return p
  33. }
  34. func (p *Portal) Insert() {
  35. query := "INSERT INTO portal" +
  36. " (channel_id, receiver, mxid, name, topic, avatar, avatar_url, first_event_id)" +
  37. " VALUES ($1, $2, $3, $4, $5, $6, $7, $8)"
  38. _, err := p.db.Exec(query, p.Key.ChannelID, p.Key.Receiver, p.MXID,
  39. p.Name, p.Topic, p.Avatar, p.AvatarURL.String(), p.FirstEventID.String())
  40. if err != nil {
  41. p.log.Warnfln("Failed to insert %s: %v", p.Key, err)
  42. }
  43. }
  44. func (p *Portal) Update() {
  45. query := "UPDATE portal SET" +
  46. " mxid=$1, name=$2, topic=$3, avatar=$4, avatar_url=$5, first_event_id=$6" +
  47. " WHERE channel_id=$7 AND receiver=$8"
  48. _, err := p.db.Exec(query, p.MXID, p.Name, p.Topic, p.Avatar,
  49. p.AvatarURL.String(), p.FirstEventID.String(), p.Key.ChannelID,
  50. p.Key.Receiver)
  51. if err != nil {
  52. p.log.Warnfln("Failed to update %s: %v", p.Key, err)
  53. }
  54. }
  55. func (p *Portal) Delete() {
  56. query := "DELETE FROM portal WHERE channel_id=$1 AND receiver=$2"
  57. _, err := p.db.Exec(query, p.Key.ChannelID, p.Key.Receiver)
  58. if err != nil {
  59. p.log.Warnfln("Failed to delete %s: %v", p.Key, err)
  60. }
  61. }