buddy.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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 BuddyService interface {
  12. RightsQuery(ctx context.Context, inFrame wire.SNACFrame) wire.SNACMessage
  13. AddBuddies(ctx context.Context, sess *state.Session, inBody wire.SNAC_0x03_0x04_BuddyAddBuddies) error
  14. DelBuddies(_ context.Context, sess *state.Session, inBody wire.SNAC_0x03_0x05_BuddyDelBuddies) error
  15. }
  16. func NewBuddyHandler(logger *slog.Logger, buddyService BuddyService) BuddyHandler {
  17. return BuddyHandler{
  18. BuddyService: buddyService,
  19. RouteLogger: middleware.RouteLogger{
  20. Logger: logger,
  21. },
  22. }
  23. }
  24. type BuddyHandler struct {
  25. BuddyService
  26. middleware.RouteLogger
  27. }
  28. func (rt BuddyHandler) RightsQuery(ctx context.Context, _ *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  29. inSNAC := wire.SNAC_0x03_0x02_BuddyRightsQuery{}
  30. if err := wire.UnmarshalBE(&inSNAC, r); err != nil {
  31. return err
  32. }
  33. outSNAC := rt.BuddyService.RightsQuery(ctx, inFrame)
  34. rt.LogRequestAndResponse(ctx, inFrame, inSNAC, outSNAC.Frame, outSNAC.Body)
  35. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  36. }
  37. func (rt BuddyHandler) AddBuddies(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  38. inSNAC := wire.SNAC_0x03_0x04_BuddyAddBuddies{}
  39. if err := wire.UnmarshalBE(&inSNAC, r); err != nil {
  40. return err
  41. }
  42. rt.LogRequest(ctx, inFrame, inSNAC)
  43. return rt.BuddyService.AddBuddies(ctx, sess, inSNAC)
  44. }
  45. func (rt BuddyHandler) DelBuddies(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  46. inSNAC := wire.SNAC_0x03_0x05_BuddyDelBuddies{}
  47. if err := wire.UnmarshalBE(&inSNAC, r); err != nil {
  48. return err
  49. }
  50. rt.LogRequest(ctx, inFrame, inSNAC)
  51. return rt.BuddyService.DelBuddies(ctx, sess, inSNAC)
  52. }