feedbag.go 5.4 KB

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