chat_nav.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package handler
  2. import (
  3. "context"
  4. "errors"
  5. "github.com/mkaminski/goaim/oscar"
  6. "github.com/mkaminski/goaim/server"
  7. "log/slog"
  8. )
  9. func NewChatNavService(logger *slog.Logger, cr *server.ChatRegistry) *ChatNavService {
  10. return &ChatNavService{Logger: logger, cr: cr}
  11. }
  12. type ChatNavService struct {
  13. Logger *slog.Logger
  14. cr *server.ChatRegistry
  15. }
  16. func (s ChatNavService) RequestChatRightsHandler(context.Context) oscar.XMessage {
  17. return oscar.XMessage{
  18. SnacFrame: oscar.SnacFrame{
  19. FoodGroup: oscar.CHAT_NAV,
  20. SubGroup: oscar.ChatNavNavInfo,
  21. },
  22. SnacOut: oscar.SNAC_0x0D_0x09_ChatNavNavInfo{
  23. TLVRestBlock: oscar.TLVRestBlock{
  24. TLVList: oscar.TLVList{
  25. oscar.NewTLV(0x02, uint8(10)),
  26. oscar.NewTLV(0x03, oscar.SNAC_0x0D_0x09_TLVExchangeInfo{
  27. Identifier: 4,
  28. TLVBlock: oscar.TLVBlock{
  29. TLVList: oscar.TLVList{
  30. oscar.NewTLV(0x0002, uint16(0x0010)),
  31. oscar.NewTLV(0x00c9, uint16(15)),
  32. oscar.NewTLV(0x00d3, "default Exchange"),
  33. oscar.NewTLV(0x00d5, uint8(2)),
  34. oscar.NewTLV(0xd6, "us-ascii"),
  35. oscar.NewTLV(0xd7, "en"),
  36. oscar.NewTLV(0xd8, "us-ascii"),
  37. oscar.NewTLV(0xd9, "en"),
  38. },
  39. },
  40. }),
  41. },
  42. },
  43. },
  44. }
  45. }
  46. func (s ChatNavService) CreateRoomHandler(ctx context.Context, sess *server.Session, newChatRoom func() server.ChatRoom, newChatSessMgr func() server.ChatSessionManager, snacPayloadIn oscar.SNAC_0x0E_0x02_ChatRoomInfoUpdate) (oscar.XMessage, error) {
  47. name, hasName := snacPayloadIn.GetString(oscar.ChatTLVRoomName)
  48. if !hasName {
  49. return oscar.XMessage{}, errors.New("unable to find chat name")
  50. }
  51. room := newChatRoom()
  52. room.DetailLevel = snacPayloadIn.DetailLevel
  53. room.Exchange = snacPayloadIn.Exchange
  54. room.InstanceNumber = snacPayloadIn.InstanceNumber
  55. room.Name = name
  56. chatSessMgr := newChatSessMgr()
  57. s.cr.Register(room, chatSessMgr)
  58. // add user to chat room
  59. chatSessMgr.NewSessionWithSN(sess.ID(), sess.ScreenName())
  60. return oscar.XMessage{
  61. SnacFrame: oscar.SnacFrame{
  62. FoodGroup: oscar.CHAT_NAV,
  63. SubGroup: oscar.ChatNavNavInfo,
  64. },
  65. SnacOut: oscar.SNAC_0x0D_0x09_ChatNavNavInfo{
  66. TLVRestBlock: oscar.TLVRestBlock{
  67. TLVList: oscar.TLVList{
  68. oscar.NewTLV(oscar.ChatNavTLVRoomInfo, oscar.SNAC_0x0E_0x02_ChatRoomInfoUpdate{
  69. Exchange: snacPayloadIn.Exchange,
  70. Cookie: room.Cookie,
  71. InstanceNumber: snacPayloadIn.InstanceNumber,
  72. DetailLevel: snacPayloadIn.DetailLevel,
  73. TLVBlock: oscar.TLVBlock{
  74. TLVList: room.TLVList(),
  75. },
  76. }),
  77. },
  78. },
  79. },
  80. }, nil
  81. }
  82. func (s ChatNavService) RequestRoomInfoHandler(_ context.Context, snacPayloadIn oscar.SNAC_0x0D_0x04_ChatNavRequestRoomInfo) (oscar.XMessage, error) {
  83. room, _, err := s.cr.Retrieve(string(snacPayloadIn.Cookie))
  84. if err != nil {
  85. return oscar.XMessage{}, err
  86. }
  87. return oscar.XMessage{
  88. SnacFrame: oscar.SnacFrame{
  89. FoodGroup: oscar.CHAT_NAV,
  90. SubGroup: oscar.ChatNavNavInfo,
  91. },
  92. SnacOut: oscar.SNAC_0x0D_0x09_ChatNavNavInfo{
  93. TLVRestBlock: oscar.TLVRestBlock{
  94. TLVList: oscar.TLVList{
  95. oscar.NewTLV(0x04, oscar.SNAC_0x0E_0x02_ChatRoomInfoUpdate{
  96. Exchange: 4,
  97. Cookie: room.Cookie,
  98. InstanceNumber: 100,
  99. DetailLevel: 2,
  100. TLVBlock: oscar.TLVBlock{
  101. TLVList: room.TLVList(),
  102. },
  103. }),
  104. },
  105. },
  106. },
  107. }, nil
  108. }