locate.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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 LocateService interface {
  12. RightsQuery(ctx context.Context, inFrame wire.SNACFrame) wire.SNACMessage
  13. SetDirInfo(ctx context.Context, frame wire.SNACFrame) wire.SNACMessage
  14. SetInfo(ctx context.Context, sess *state.Session, inBody wire.SNAC_0x02_0x04_LocateSetInfo) error
  15. SetKeywordInfo(ctx context.Context, inFrame wire.SNACFrame) wire.SNACMessage
  16. UserInfoQuery(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, inBody wire.SNAC_0x02_0x05_LocateUserInfoQuery) (wire.SNACMessage, error)
  17. }
  18. func NewLocateHandler(locateService LocateService, logger *slog.Logger) LocateHandler {
  19. return LocateHandler{
  20. LocateService: locateService,
  21. RouteLogger: middleware.RouteLogger{
  22. Logger: logger,
  23. },
  24. }
  25. }
  26. type LocateHandler struct {
  27. LocateService
  28. middleware.RouteLogger
  29. }
  30. func (h LocateHandler) RightsQuery(ctx context.Context, _ *state.Session, inFrame wire.SNACFrame, _ io.Reader, rw oscar.ResponseWriter) error {
  31. outSNAC := h.LocateService.RightsQuery(ctx, inFrame)
  32. h.LogRequestAndResponse(ctx, inFrame, nil, outSNAC.Frame, outSNAC.Body)
  33. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  34. }
  35. func (h LocateHandler) SetInfo(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, _ oscar.ResponseWriter) error {
  36. inBody := wire.SNAC_0x02_0x04_LocateSetInfo{}
  37. if err := wire.Unmarshal(&inBody, r); err != nil {
  38. return err
  39. }
  40. h.LogRequest(ctx, inFrame, inBody)
  41. return h.LocateService.SetInfo(ctx, sess, inBody)
  42. }
  43. func (h LocateHandler) SetDirInfo(ctx context.Context, _ *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  44. inBody := wire.SNAC_0x02_0x09_LocateSetDirInfo{}
  45. if err := wire.Unmarshal(&inBody, r); err != nil {
  46. return err
  47. }
  48. outSNAC := h.LocateService.SetDirInfo(ctx, inFrame)
  49. h.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  50. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  51. }
  52. func (h LocateHandler) GetDirInfo(ctx context.Context, _ *state.Session, inFrame wire.SNACFrame, r io.Reader, _ oscar.ResponseWriter) error {
  53. inBody := wire.SNAC_0x02_0x0B_LocateGetDirInfo{}
  54. h.LogRequest(ctx, inFrame, inBody)
  55. return wire.Unmarshal(&inBody, r)
  56. }
  57. func (h LocateHandler) SetKeywordInfo(ctx context.Context, _ *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  58. inBody := wire.SNAC_0x02_0x0F_LocateSetKeywordInfo{}
  59. if err := wire.Unmarshal(&inBody, r); err != nil {
  60. return err
  61. }
  62. outSNAC := h.LocateService.SetKeywordInfo(ctx, inFrame)
  63. h.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  64. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  65. }
  66. func (h LocateHandler) UserInfoQuery(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  67. inBody := wire.SNAC_0x02_0x05_LocateUserInfoQuery{}
  68. if err := wire.Unmarshal(&inBody, r); err != nil {
  69. return err
  70. }
  71. outSNAC, err := h.LocateService.UserInfoQuery(ctx, sess, inFrame, inBody)
  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 LocateHandler) UserInfoQuery2(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  79. inBody := wire.SNAC_0x02_0x15_LocateUserInfoQuery2{}
  80. if err := wire.Unmarshal(&inBody, r); err != nil {
  81. return err
  82. }
  83. // SNAC functionality for LocateUserInfoQuery and LocateUserInfoQuery2 is
  84. // identical except for the Type field data type (uint16 vs uint32).
  85. wrappedBody := wire.SNAC_0x02_0x05_LocateUserInfoQuery{
  86. Type: uint16(inBody.Type2),
  87. ScreenName: inBody.ScreenName,
  88. }
  89. outSNAC, err := h.LocateService.UserInfoQuery(ctx, sess, inFrame, wrappedBody)
  90. if err != nil {
  91. return err
  92. }
  93. h.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  94. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  95. }