buddy.go 1005 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package server
  2. import (
  3. "context"
  4. "io"
  5. "log/slog"
  6. "github.com/mkaminski/goaim/oscar"
  7. )
  8. type BuddyHandler interface {
  9. RightsQueryHandler(ctx context.Context, inFrame oscar.SNACFrame) oscar.SNACMessage
  10. }
  11. func NewBuddyRouter(logger *slog.Logger, buddyHandler BuddyHandler) BuddyRouter {
  12. return BuddyRouter{
  13. BuddyHandler: buddyHandler,
  14. RouteLogger: RouteLogger{
  15. Logger: logger,
  16. },
  17. }
  18. }
  19. type BuddyRouter struct {
  20. BuddyHandler
  21. RouteLogger
  22. }
  23. func (rt *BuddyRouter) RouteBuddy(ctx context.Context, inFrame oscar.SNACFrame, r io.Reader, w io.Writer, sequence *uint32) error {
  24. switch inFrame.SubGroup {
  25. case oscar.BuddyRightsQuery:
  26. inSNAC := oscar.SNAC_0x03_0x02_BuddyRightsQuery{}
  27. if err := oscar.Unmarshal(&inSNAC, r); err != nil {
  28. return err
  29. }
  30. outSNAC := rt.RightsQueryHandler(ctx, inFrame)
  31. rt.logRequestAndResponse(ctx, inFrame, inSNAC, outSNAC.Frame, outSNAC.Body)
  32. return sendSNAC(outSNAC.Frame, outSNAC.Body, sequence, w)
  33. default:
  34. return ErrUnsupportedSubGroup
  35. }
  36. }