chat_nav.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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 ChatNavService interface {
  12. CreateRoom(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, inBody wire.SNAC_0x0E_0x02_ChatRoomInfoUpdate) (wire.SNACMessage, error)
  13. ExchangeInfo(ctx context.Context, inFrame wire.SNACFrame, inBody wire.SNAC_0x0D_0x03_ChatNavRequestExchangeInfo) (wire.SNACMessage, error)
  14. RequestChatRights(ctx context.Context, inFrame wire.SNACFrame) wire.SNACMessage
  15. RequestRoomInfo(ctx context.Context, inFrame wire.SNACFrame, inBody wire.SNAC_0x0D_0x04_ChatNavRequestRoomInfo) (wire.SNACMessage, error)
  16. }
  17. func NewChatNavHandler(chatNavService ChatNavService, logger *slog.Logger) ChatNavHandler {
  18. return ChatNavHandler{
  19. ChatNavService: chatNavService,
  20. RouteLogger: middleware.RouteLogger{
  21. Logger: logger,
  22. },
  23. }
  24. }
  25. type ChatNavHandler struct {
  26. ChatNavService
  27. middleware.RouteLogger
  28. }
  29. func (rt ChatNavHandler) RequestChatRights(ctx context.Context, _ *state.Session, inFrame wire.SNACFrame, _ io.Reader, rw oscar.ResponseWriter) error {
  30. outSNAC := rt.ChatNavService.RequestChatRights(ctx, inFrame)
  31. rt.LogRequestAndResponse(ctx, inFrame, nil, outSNAC.Frame, outSNAC.Body)
  32. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  33. }
  34. func (rt ChatNavHandler) RequestExchangeInfo(ctx context.Context, _ *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  35. inBody := wire.SNAC_0x0D_0x03_ChatNavRequestExchangeInfo{}
  36. if err := wire.UnmarshalBE(&inBody, r); err != nil {
  37. return err
  38. }
  39. outSNAC, err := rt.ChatNavService.ExchangeInfo(ctx, inFrame, inBody)
  40. if err != nil {
  41. return err
  42. }
  43. rt.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  44. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  45. }
  46. func (rt ChatNavHandler) RequestRoomInfo(ctx context.Context, _ *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  47. inBody := wire.SNAC_0x0D_0x04_ChatNavRequestRoomInfo{}
  48. if err := wire.UnmarshalBE(&inBody, r); err != nil {
  49. return err
  50. }
  51. outSNAC, err := rt.ChatNavService.RequestRoomInfo(ctx, inFrame, inBody)
  52. if err != nil {
  53. return err
  54. }
  55. rt.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  56. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  57. }
  58. func (rt ChatNavHandler) CreateRoom(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  59. inBody := wire.SNAC_0x0E_0x02_ChatRoomInfoUpdate{}
  60. if err := wire.UnmarshalBE(&inBody, r); err != nil {
  61. return err
  62. }
  63. outSNAC, err := rt.ChatNavService.CreateRoom(ctx, sess, inFrame, inBody)
  64. if err != nil {
  65. return err
  66. }
  67. roomName, _ := inBody.String(wire.ChatRoomTLVRoomName)
  68. rt.Logger.InfoContext(ctx, "user started a chat room", slog.String("roomName", roomName))
  69. rt.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  70. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  71. }