chat_nav.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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
  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.Unmarshal(&inBody, r); err != nil {
  37. return err
  38. }
  39. outSNAC := rt.ChatNavService.ExchangeInfo(ctx, inFrame, inBody)
  40. rt.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  41. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  42. }
  43. func (rt ChatNavHandler) RequestRoomInfo(ctx context.Context, _ *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  44. inBody := wire.SNAC_0x0D_0x04_ChatNavRequestRoomInfo{}
  45. if err := wire.Unmarshal(&inBody, r); err != nil {
  46. return err
  47. }
  48. outSNAC, err := rt.ChatNavService.RequestRoomInfo(ctx, inFrame, inBody)
  49. if err != nil {
  50. return err
  51. }
  52. rt.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  53. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  54. }
  55. func (rt ChatNavHandler) CreateRoom(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  56. inBody := wire.SNAC_0x0E_0x02_ChatRoomInfoUpdate{}
  57. if err := wire.Unmarshal(&inBody, r); err != nil {
  58. return err
  59. }
  60. outSNAC, err := rt.ChatNavService.CreateRoom(ctx, sess, inFrame, inBody)
  61. if err != nil {
  62. return err
  63. }
  64. roomName, _ := inBody.String(wire.ChatRoomTLVRoomName)
  65. rt.Logger.InfoContext(ctx, "user started a chat room", slog.String("roomName", roomName))
  66. rt.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  67. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  68. }