feedbag.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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. }
  19. func NewFeedbagHandler(logger *slog.Logger, feedbagService FeedbagService) FeedbagHandler {
  20. return FeedbagHandler{
  21. FeedbagService: feedbagService,
  22. RouteLogger: middleware.RouteLogger{
  23. Logger: logger,
  24. },
  25. }
  26. }
  27. type FeedbagHandler struct {
  28. FeedbagService
  29. middleware.RouteLogger
  30. }
  31. func (h FeedbagHandler) RightsQuery(ctx context.Context, _ *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  32. inBody := wire.SNAC_0x13_0x02_FeedbagRightsQuery{}
  33. if err := wire.Unmarshal(&inBody, r); err != nil {
  34. return err
  35. }
  36. outSNAC := h.FeedbagService.RightsQuery(ctx, inFrame)
  37. h.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  38. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  39. }
  40. func (h FeedbagHandler) Query(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, _ io.Reader, rw oscar.ResponseWriter) error {
  41. outSNAC, err := h.FeedbagService.Query(ctx, sess, inFrame)
  42. if err != nil {
  43. return err
  44. }
  45. h.LogRequest(ctx, inFrame, outSNAC)
  46. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  47. }
  48. func (h FeedbagHandler) QueryIfModified(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  49. inBody := wire.SNAC_0x13_0x05_FeedbagQueryIfModified{}
  50. if err := wire.Unmarshal(&inBody, r); err != nil {
  51. return err
  52. }
  53. outSNAC, err := h.FeedbagService.QueryIfModified(ctx, sess, inFrame, inBody)
  54. if err != nil {
  55. return err
  56. }
  57. h.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  58. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  59. }
  60. func (h FeedbagHandler) Use(ctx context.Context, _ *state.Session, inFrame wire.SNACFrame, _ io.Reader, _ oscar.ResponseWriter) error {
  61. h.LogRequest(ctx, inFrame, nil)
  62. return nil
  63. }
  64. func (h FeedbagHandler) InsertItem(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  65. inBody := wire.SNAC_0x13_0x08_FeedbagInsertItem{}
  66. if err := wire.Unmarshal(&inBody, r); err != nil {
  67. return err
  68. }
  69. outSNAC, err := h.FeedbagService.UpsertItem(ctx, sess, inFrame, inBody.Items)
  70. if err != nil {
  71. return err
  72. }
  73. h.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  74. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  75. }
  76. func (h FeedbagHandler) UpdateItem(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  77. inBody := wire.SNAC_0x13_0x09_FeedbagUpdateItem{}
  78. if err := wire.Unmarshal(&inBody, r); err != nil {
  79. return err
  80. }
  81. outSNAC, err := h.FeedbagService.UpsertItem(ctx, sess, inFrame, inBody.Items)
  82. if err != nil {
  83. return err
  84. }
  85. h.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  86. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  87. }
  88. func (h FeedbagHandler) DeleteItem(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  89. inBody := wire.SNAC_0x13_0x0A_FeedbagDeleteItem{}
  90. if err := wire.Unmarshal(&inBody, r); err != nil {
  91. return err
  92. }
  93. outSNAC, err := h.FeedbagService.DeleteItem(ctx, sess, inFrame, inBody)
  94. if err != nil {
  95. return err
  96. }
  97. h.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  98. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  99. }
  100. func (h FeedbagHandler) StartCluster(ctx context.Context, _ *state.Session, inFrame wire.SNACFrame, r io.Reader, _ oscar.ResponseWriter) error {
  101. inBody := wire.SNAC_0x13_0x11_FeedbagStartCluster{}
  102. if err := wire.Unmarshal(&inBody, r); err != nil {
  103. return err
  104. }
  105. h.FeedbagService.StartCluster(ctx, inFrame, inBody)
  106. h.LogRequest(ctx, inFrame, inBody)
  107. return nil
  108. }
  109. func (h FeedbagHandler) EndCluster(ctx context.Context, _ *state.Session, inFrame wire.SNACFrame, _ io.Reader, _ oscar.ResponseWriter) error {
  110. h.LogRequest(ctx, inFrame, nil)
  111. return nil
  112. }