reaction.go 2.2 KB

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