portal.go 2.1 KB

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