4
0

chat_nav.go 2.4 KB

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