reaction.go 2.5 KB

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