reaction.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package database
  2. import (
  3. "database/sql"
  4. "errors"
  5. log "maunium.net/go/maulogger/v2"
  6. "maunium.net/go/mautrix/id"
  7. "maunium.net/go/mautrix/util/dbutil"
  8. )
  9. type Reaction struct {
  10. db *Database
  11. log log.Logger
  12. Channel PortalKey
  13. DiscordMessageID string
  14. MatrixEventID id.EventID
  15. // The discord ID of who create this reaction
  16. AuthorID string
  17. MatrixName string
  18. MatrixURL string // Used for custom emoji
  19. DiscordID string // The id or unicode of the emoji for discord
  20. }
  21. func (r *Reaction) Scan(row dbutil.Scannable) *Reaction {
  22. var discordID sql.NullString
  23. err := row.Scan(
  24. &r.Channel.ChannelID, &r.Channel.Receiver,
  25. &r.DiscordMessageID, &r.MatrixEventID,
  26. &r.AuthorID,
  27. &r.MatrixName, &r.MatrixURL,
  28. &discordID)
  29. if err != nil {
  30. if !errors.Is(err, sql.ErrNoRows) {
  31. r.log.Errorln("Database scan failed:", err)
  32. }
  33. return nil
  34. }
  35. r.DiscordID = discordID.String
  36. return r
  37. }
  38. func (r *Reaction) Insert() {
  39. query := "INSERT INTO reaction" +
  40. " (channel_id, receiver, discord_message_id, matrix_event_id," +
  41. " author_id, matrix_name, matrix_url, discord_id)" +
  42. " VALUES($1, $2, $3, $4, $5, $6, $7, $8);"
  43. var discordID sql.NullString
  44. if r.DiscordID != "" {
  45. discordID = sql.NullString{r.DiscordID, true}
  46. }
  47. _, err := r.db.Exec(
  48. query,
  49. r.Channel.ChannelID, r.Channel.Receiver,
  50. r.DiscordMessageID, r.MatrixEventID,
  51. r.AuthorID,
  52. r.MatrixName, r.MatrixURL,
  53. discordID,
  54. )
  55. if err != nil {
  56. r.log.Warnfln("Failed to insert reaction for %s@%s: %v", r.Channel, r.DiscordMessageID, err)
  57. }
  58. }
  59. func (r *Reaction) Update() {
  60. // TODO: determine if we need this. The only scenario I can think of that
  61. // would require this is if we insert a custom emoji before uploading to
  62. // the homeserver?
  63. }
  64. func (r *Reaction) Delete() {
  65. query := "DELETE FROM reaction WHERE" +
  66. " channel_id=$1 AND receiver=$2 AND discord_message_id=$3 AND" +
  67. " author_id=$4 AND discord_id=$5"
  68. var discordID sql.NullString
  69. if r.DiscordID != "" {
  70. discordID = sql.NullString{r.DiscordID, true}
  71. }
  72. _, err := r.db.Exec(
  73. query,
  74. r.Channel.ChannelID, r.Channel.Receiver,
  75. r.DiscordMessageID, r.AuthorID,
  76. discordID,
  77. )
  78. if err != nil {
  79. r.log.Warnfln("Failed to delete reaction for %s@%s: %v", r.Channel, r.DiscordMessageID, err)
  80. }
  81. }