chat.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package server
  2. import (
  3. "context"
  4. "io"
  5. "log/slog"
  6. "github.com/mkaminski/goaim/oscar"
  7. "github.com/mkaminski/goaim/state"
  8. )
  9. type ChatHandler interface {
  10. ChannelMsgToHostHandler(ctx context.Context, sess *state.Session, chatID string, inFrame oscar.SNACFrame, inBody oscar.SNAC_0x0E_0x05_ChatChannelMsgToHost) (*oscar.SNACMessage, error)
  11. }
  12. func NewChatRouter(logger *slog.Logger, chatHandler ChatHandler) ChatRouter {
  13. return ChatRouter{
  14. ChatHandler: chatHandler,
  15. RouteLogger: RouteLogger{
  16. Logger: logger,
  17. },
  18. }
  19. }
  20. type ChatRouter struct {
  21. ChatHandler
  22. RouteLogger
  23. }
  24. func (rt *ChatRouter) RouteChat(ctx context.Context, sess *state.Session, chatID string, inFrame oscar.SNACFrame, r io.Reader, w io.Writer, sequence *uint32) error {
  25. switch inFrame.SubGroup {
  26. case oscar.ChatChannelMsgToHost:
  27. inBody := oscar.SNAC_0x0E_0x05_ChatChannelMsgToHost{}
  28. if err := oscar.Unmarshal(&inBody, r); err != nil {
  29. return err
  30. }
  31. outSNAC, err := rt.ChannelMsgToHostHandler(ctx, sess, chatID, 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 sendSNAC(outSNAC.Frame, outSNAC.Body, sequence, w)
  41. default:
  42. return ErrUnsupportedSubGroup
  43. }
  44. }