4
0

admin.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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. func NewAdminHandler(logger *slog.Logger, adminService AdminService) AdminHandler {
  12. return AdminHandler{
  13. RouteLogger: middleware.RouteLogger{
  14. Logger: logger,
  15. },
  16. AdminService: adminService,
  17. }
  18. }
  19. type AdminHandler struct {
  20. AdminService
  21. OServiceService
  22. middleware.RouteLogger
  23. }
  24. type AdminService interface {
  25. ConfirmRequest(ctx context.Context, sess *state.Session, frame wire.SNACFrame) (wire.SNACMessage, error)
  26. InfoQuery(ctx context.Context, sess *state.Session, frame wire.SNACFrame, body wire.SNAC_0x07_0x02_AdminInfoQuery) (wire.SNACMessage, error)
  27. InfoChangeRequest(ctx context.Context, sess *state.Session, frame wire.SNACFrame, body wire.SNAC_0x07_0x04_AdminInfoChangeRequest) (wire.SNACMessage, error)
  28. }
  29. func (rt AdminHandler) ConfirmRequest(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, _ io.Reader, rw oscar.ResponseWriter) error {
  30. outSNAC, err := rt.AdminService.ConfirmRequest(ctx, sess, inFrame)
  31. if err != nil {
  32. return err
  33. }
  34. rt.LogRequestAndResponse(ctx, inFrame, nil, outSNAC.Frame, outSNAC.Body)
  35. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  36. }
  37. func (rt AdminHandler) InfoQuery(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  38. inBody := wire.SNAC_0x07_0x02_AdminInfoQuery{}
  39. if err := wire.UnmarshalBE(&inBody, r); err != nil {
  40. return err
  41. }
  42. outSNAC, err := rt.AdminService.InfoQuery(ctx, sess, inFrame, inBody)
  43. if err != nil {
  44. return err
  45. }
  46. rt.LogRequestAndResponse(ctx, inFrame, nil, outSNAC.Frame, outSNAC.Body)
  47. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  48. }
  49. func (rt AdminHandler) InfoChangeRequest(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  50. inBody := wire.SNAC_0x07_0x04_AdminInfoChangeRequest{}
  51. if err := wire.UnmarshalBE(&inBody, r); err != nil {
  52. return err
  53. }
  54. outSNAC, err := rt.AdminService.InfoChangeRequest(ctx, sess, inFrame, inBody)
  55. if err != nil {
  56. return err
  57. }
  58. rt.LogRequestAndResponse(ctx, inFrame, nil, outSNAC.Frame, outSNAC.Body)
  59. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  60. }