emoji.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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 EmojiQuery struct {
  10. db *Database
  11. log log.Logger
  12. }
  13. const (
  14. emojiSelect = "SELECT discord_id, discord_name, matrix_url FROM emoji"
  15. )
  16. func (eq *EmojiQuery) New() *Emoji {
  17. return &Emoji{
  18. db: eq.db,
  19. log: eq.log,
  20. }
  21. }
  22. func (eq *EmojiQuery) GetByDiscordID(discordID string) *Emoji {
  23. query := emojiSelect + " WHERE discord_id=$1"
  24. return eq.get(query, discordID)
  25. }
  26. func (eq *EmojiQuery) GetByMatrixURL(matrixURL id.ContentURI) *Emoji {
  27. query := emojiSelect + " WHERE matrix_url=$1"
  28. return eq.get(query, matrixURL.String())
  29. }
  30. func (eq *EmojiQuery) get(query string, args ...interface{}) *Emoji {
  31. return eq.New().Scan(eq.db.QueryRow(query, args...))
  32. }
  33. type Emoji struct {
  34. db *Database
  35. log log.Logger
  36. DiscordID string
  37. DiscordName string
  38. MatrixURL id.ContentURI
  39. }
  40. func (e *Emoji) Scan(row dbutil.Scannable) *Emoji {
  41. var matrixURL sql.NullString
  42. err := row.Scan(&e.DiscordID, &e.DiscordName, &matrixURL)
  43. if err != nil {
  44. if !errors.Is(err, sql.ErrNoRows) {
  45. e.log.Errorln("Database scan failed:", err)
  46. panic(err)
  47. }
  48. return nil
  49. }
  50. e.MatrixURL, _ = id.ParseContentURI(matrixURL.String)
  51. return e
  52. }
  53. func (e *Emoji) Insert() {
  54. query := "INSERT INTO emoji" +
  55. " (discord_id, discord_name, matrix_url)" +
  56. " VALUES ($1, $2, $3);"
  57. _, err := e.db.Exec(query, e.DiscordID, e.DiscordName, e.MatrixURL.String())
  58. if err != nil {
  59. e.log.Warnfln("Failed to insert emoji %s: %v", e.DiscordID, err)
  60. panic(err)
  61. }
  62. }
  63. func (e *Emoji) Delete() {
  64. query := "DELETE FROM emoji WHERE discord_id=$1"
  65. _, err := e.db.Exec(query, e.DiscordID)
  66. if err != nil {
  67. e.log.Warnfln("Failed to delete emoji %s: %v", e.DiscordID, err)
  68. panic(err)
  69. }
  70. }
  71. func (e *Emoji) APIName() string {
  72. if e.DiscordID != "" && e.DiscordName != "" {
  73. return e.DiscordName + ":" + e.DiscordID
  74. } else if e.DiscordName != "" {
  75. return e.DiscordName
  76. }
  77. return e.DiscordID
  78. }