portal.go 2.3 KB

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