chat.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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 ChatService interface {
  12. ChannelMsgToHost(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, inBody wire.SNAC_0x0E_0x05_ChatChannelMsgToHost) (*wire.SNACMessage, error)
  13. }
  14. func NewChatHandler(logger *slog.Logger, chatService ChatService) ChatHandler {
  15. return ChatHandler{
  16. ChatService: chatService,
  17. RouteLogger: middleware.RouteLogger{
  18. Logger: logger,
  19. },
  20. }
  21. }
  22. type ChatHandler struct {
  23. ChatService
  24. middleware.RouteLogger
  25. }
  26. func (rt ChatHandler) ChannelMsgToHost(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  27. inBody := wire.SNAC_0x0E_0x05_ChatChannelMsgToHost{}
  28. if err := wire.UnmarshalBE(&inBody, r); err != nil {
  29. return err
  30. }
  31. outSNAC, err := rt.ChatService.ChannelMsgToHost(ctx, sess, inFrame, inBody)
  32. if err != nil {
  33. return err
  34. }
  35. if outSNAC == nil {
  36. return nil
  37. }
  38. rt.Logger.InfoContext(ctx, "user sent a chat message")
  39. rt.LogRequestAndResponse(ctx, inFrame, inBody, outSNAC.Frame, outSNAC.Body)
  40. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  41. }