oservice.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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 OServiceService interface {
  12. ClientOnline(ctx context.Context, bodyIn wire.SNAC_0x01_0x02_OServiceClientOnline, sess *state.Session) error
  13. ClientVersions(ctx context.Context, sess *state.Session, frame wire.SNACFrame, bodyIn wire.SNAC_0x01_0x17_OServiceClientVersions) wire.SNACMessage
  14. HostOnline() wire.SNACMessage
  15. IdleNotification(ctx context.Context, sess *state.Session, bodyIn wire.SNAC_0x01_0x11_OServiceIdleNotification) error
  16. RateParamsQuery(ctx context.Context, sess *state.Session, frame wire.SNACFrame) wire.SNACMessage
  17. RateParamsSubAdd(context.Context, *state.Session, wire.SNAC_0x01_0x08_OServiceRateParamsSubAdd)
  18. ServiceRequest(ctx context.Context, sess *state.Session, frame wire.SNACFrame, bodyIn wire.SNAC_0x01_0x04_OServiceServiceRequest) (wire.SNACMessage, error)
  19. SetPrivacyFlags(ctx context.Context, bodyIn wire.SNAC_0x01_0x14_OServiceSetPrivacyFlags)
  20. SetUserInfoFields(ctx context.Context, sess *state.Session, frame wire.SNACFrame, bodyIn wire.SNAC_0x01_0x1E_OServiceSetUserInfoFields) (wire.SNACMessage, error)
  21. UserInfoQuery(ctx context.Context, sess *state.Session, frame wire.SNACFrame) wire.SNACMessage
  22. }
  23. func NewOServiceHandler(logger *slog.Logger, oServiceService OServiceService) OServiceHandler {
  24. return OServiceHandler{
  25. OServiceService: oServiceService,
  26. RouteLogger: middleware.RouteLogger{
  27. Logger: logger,
  28. },
  29. }
  30. }
  31. type OServiceHandler struct {
  32. OServiceService
  33. middleware.RouteLogger
  34. }
  35. func (h OServiceHandler) RateParamsQuery(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, _ io.Reader, rw oscar.ResponseWriter) error {
  36. outSNAC := h.OServiceService.RateParamsQuery(ctx, sess, inFrame)
  37. h.LogRequestAndResponse(ctx, inFrame, nil, outSNAC.Frame, outSNAC.Body)
  38. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  39. }
  40. func (h OServiceHandler) RateParamsSubAdd(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  41. inBody := wire.SNAC_0x01_0x08_OServiceRateParamsSubAdd{}
  42. if err := wire.UnmarshalBE(&inBody, r); err != nil {
  43. return err
  44. }
  45. h.OServiceService.RateParamsSubAdd(ctx, sess, inBody)
  46. h.LogRequest(ctx, inFrame, inBody)
  47. return nil
  48. }
  49. func (h OServiceHandler) UserInfoQuery(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, _ io.Reader, rw oscar.ResponseWriter) error {
  50. outSNAC := h.OServiceService.UserInfoQuery(ctx, sess, inFrame)
  51. h.LogRequestAndResponse(ctx, inFrame, nil, outSNAC.Frame, outSNAC.Body)
  52. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  53. }
  54. func (h OServiceHandler) IdleNotification(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, _ oscar.ResponseWriter) error {
  55. inBody := wire.SNAC_0x01_0x11_OServiceIdleNotification{}
  56. if err := wire.UnmarshalBE(&inBody, r); err != nil {
  57. return err
  58. }
  59. h.LogRequest(ctx, inFrame, inBody)
  60. return h.OServiceService.IdleNotification(ctx, sess, inBody)
  61. }
  62. func (h OServiceHandler) ClientVersions(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  63. inBody := wire.SNAC_0x01_0x17_OServiceClientVersions{}
  64. if err := wire.UnmarshalBE(&inBody, r); err != nil {
  65. return err
  66. }
  67. outSNAC := h.OServiceService.ClientVersions(ctx, sess, inFrame, inBody)
  68. h.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  69. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  70. }
  71. func (h OServiceHandler) SetUserInfoFields(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  72. inBody := wire.SNAC_0x01_0x1E_OServiceSetUserInfoFields{}
  73. if err := wire.UnmarshalBE(&inBody, r); err != nil {
  74. return err
  75. }
  76. outSNAC, err := h.OServiceService.SetUserInfoFields(ctx, sess, inFrame, inBody)
  77. if err != nil {
  78. return err
  79. }
  80. h.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  81. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  82. }
  83. func (h OServiceHandler) Noop(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, _ io.Reader, rw oscar.ResponseWriter) error {
  84. // no-op keep-alive
  85. h.LogRequest(ctx, inFrame, nil)
  86. return nil
  87. }
  88. func (h OServiceHandler) SetPrivacyFlags(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, _ oscar.ResponseWriter) error {
  89. inBody := wire.SNAC_0x01_0x14_OServiceSetPrivacyFlags{}
  90. if err := wire.UnmarshalBE(&inBody, r); err != nil {
  91. return err
  92. }
  93. h.OServiceService.SetPrivacyFlags(ctx, inBody)
  94. h.LogRequest(ctx, inFrame, inBody)
  95. return nil
  96. }
  97. func (h OServiceHandler) ServiceRequest(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  98. inBody := wire.SNAC_0x01_0x04_OServiceServiceRequest{}
  99. if err := wire.UnmarshalBE(&inBody, r); err != nil {
  100. return err
  101. }
  102. outSNAC, err := h.OServiceService.ServiceRequest(ctx, sess, inFrame, inBody)
  103. if err != nil {
  104. return err
  105. }
  106. h.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  107. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  108. }
  109. func (h OServiceHandler) ClientOnline(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, _ oscar.ResponseWriter) error {
  110. inBody := wire.SNAC_0x01_0x02_OServiceClientOnline{}
  111. if err := wire.UnmarshalBE(&inBody, r); err != nil {
  112. return err
  113. }
  114. h.Logger.InfoContext(ctx, "user signed on")
  115. h.LogRequest(ctx, inFrame, inBody)
  116. return h.OServiceService.ClientOnline(ctx, inBody, sess)
  117. }