feedbag.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package handler
  2. import (
  3. "context"
  4. "io"
  5. "log/slog"
  6. "github.com/mk6i/retro-aim-server/server/oscar"
  7. "github.com/mk6i/retro-aim-server/server/oscar/middleware"
  8. "github.com/mk6i/retro-aim-server/state"
  9. "github.com/mk6i/retro-aim-server/wire"
  10. )
  11. type FeedbagService interface {
  12. DeleteItem(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, inBody wire.SNAC_0x13_0x0A_FeedbagDeleteItem) (wire.SNACMessage, error)
  13. Query(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame) (wire.SNACMessage, error)
  14. QueryIfModified(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, inBody wire.SNAC_0x13_0x05_FeedbagQueryIfModified) (wire.SNACMessage, error)
  15. RightsQuery(ctx context.Context, inFrame wire.SNACFrame) wire.SNACMessage
  16. StartCluster(ctx context.Context, inFrame wire.SNACFrame, inBody wire.SNAC_0x13_0x11_FeedbagStartCluster)
  17. UpsertItem(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, items []wire.FeedbagItem) (wire.SNACMessage, error)
  18. Use(ctx context.Context, sess *state.Session) error
  19. }
  20. func NewFeedbagHandler(logger *slog.Logger, feedbagService FeedbagService) FeedbagHandler {
  21. return FeedbagHandler{
  22. FeedbagService: feedbagService,
  23. RouteLogger: middleware.RouteLogger{
  24. Logger: logger,
  25. },
  26. }
  27. }
  28. type FeedbagHandler struct {
  29. FeedbagService
  30. middleware.RouteLogger
  31. }
  32. func (h FeedbagHandler) RightsQuery(ctx context.Context, _ *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  33. inBody := wire.SNAC_0x13_0x02_FeedbagRightsQuery{}
  34. if err := wire.Unmarshal(&inBody, r); err != nil {
  35. return err
  36. }
  37. outSNAC := h.FeedbagService.RightsQuery(ctx, inFrame)
  38. h.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  39. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  40. }
  41. func (h FeedbagHandler) Query(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, _ io.Reader, rw oscar.ResponseWriter) error {
  42. outSNAC, err := h.FeedbagService.Query(ctx, sess, inFrame)
  43. if err != nil {
  44. return err
  45. }
  46. h.LogRequest(ctx, inFrame, outSNAC)
  47. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  48. }
  49. func (h FeedbagHandler) QueryIfModified(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  50. inBody := wire.SNAC_0x13_0x05_FeedbagQueryIfModified{}
  51. if err := wire.Unmarshal(&inBody, r); err != nil {
  52. return err
  53. }
  54. outSNAC, err := h.FeedbagService.QueryIfModified(ctx, sess, inFrame, inBody)
  55. if err != nil {
  56. return err
  57. }
  58. h.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  59. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  60. }
  61. func (h FeedbagHandler) Use(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, _ io.Reader, _ oscar.ResponseWriter) error {
  62. h.LogRequest(ctx, inFrame, nil)
  63. return h.FeedbagService.Use(ctx, sess)
  64. }
  65. func (h FeedbagHandler) InsertItem(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  66. inBody := wire.SNAC_0x13_0x08_FeedbagInsertItem{}
  67. if err := wire.Unmarshal(&inBody, r); err != nil {
  68. return err
  69. }
  70. outSNAC, err := h.FeedbagService.UpsertItem(ctx, sess, inFrame, inBody.Items)
  71. if err != nil {
  72. return err
  73. }
  74. h.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  75. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  76. }
  77. func (h FeedbagHandler) UpdateItem(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  78. inBody := wire.SNAC_0x13_0x09_FeedbagUpdateItem{}
  79. if err := wire.Unmarshal(&inBody, r); err != nil {
  80. return err
  81. }
  82. outSNAC, err := h.FeedbagService.UpsertItem(ctx, sess, inFrame, inBody.Items)
  83. if err != nil {
  84. return err
  85. }
  86. h.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  87. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  88. }
  89. func (h FeedbagHandler) DeleteItem(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  90. inBody := wire.SNAC_0x13_0x0A_FeedbagDeleteItem{}
  91. if err := wire.Unmarshal(&inBody, r); err != nil {
  92. return err
  93. }
  94. outSNAC, err := h.FeedbagService.DeleteItem(ctx, sess, inFrame, inBody)
  95. if err != nil {
  96. return err
  97. }
  98. h.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  99. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  100. }
  101. func (h FeedbagHandler) StartCluster(ctx context.Context, _ *state.Session, inFrame wire.SNACFrame, r io.Reader, _ oscar.ResponseWriter) error {
  102. inBody := wire.SNAC_0x13_0x11_FeedbagStartCluster{}
  103. if err := wire.Unmarshal(&inBody, r); err != nil {
  104. return err
  105. }
  106. h.FeedbagService.StartCluster(ctx, inFrame, inBody)
  107. h.LogRequest(ctx, inFrame, inBody)
  108. return nil
  109. }
  110. func (h FeedbagHandler) EndCluster(ctx context.Context, _ *state.Session, inFrame wire.SNACFrame, _ io.Reader, _ oscar.ResponseWriter) error {
  111. h.LogRequest(ctx, inFrame, nil)
  112. return nil
  113. }