buddy.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package server
  2. import (
  3. "fmt"
  4. "github.com/mkaminski/goaim/oscar"
  5. "io"
  6. )
  7. const (
  8. BuddyErr uint16 = 0x0001
  9. BuddyRightsQuery = 0x0002
  10. BuddyAddBuddies = 0x0004
  11. BuddyDelBuddies = 0x0005
  12. BuddyWatcherListQuery = 0x0006
  13. BuddyWatcherSubRequest = 0x0008
  14. BuddyWatcherNotification = 0x0009
  15. BuddyRejectNotification = 0x000A
  16. BuddyArrived = 0x000B
  17. BuddyDeparted = 0x000C
  18. BuddyAddTempBuddies = 0x000F
  19. BuddyDelTempBuddies = 0x0010
  20. )
  21. func routeBuddy(snac oscar.SnacFrame, r io.Reader, w io.Writer, sequence *uint32) error {
  22. switch snac.SubGroup {
  23. case BuddyRightsQuery:
  24. return SendAndReceiveBuddyRights(snac, r, w, sequence)
  25. default:
  26. return ErrUnsupportedSubGroup
  27. }
  28. }
  29. func SendAndReceiveBuddyRights(snac oscar.SnacFrame, r io.Reader, w io.Writer, sequence *uint32) error {
  30. fmt.Printf("sendAndReceiveBuddyRights read SNAC frame: %+v\n", snac)
  31. snacPayloadIn := oscar.SNAC_0x03_0x02_BuddyRightsQuery{}
  32. if err := oscar.Unmarshal(&snacPayloadIn, r); err != nil {
  33. return err
  34. }
  35. fmt.Printf("sendAndReceiveBuddyRights read SNAC payload: %+v\n", snacPayloadIn)
  36. snacFrameOut := oscar.SnacFrame{
  37. FoodGroup: 0x03,
  38. SubGroup: 0x03,
  39. }
  40. snacPayloadOut := oscar.SNAC_0x03_0x03_BuddyRightsReply{
  41. TLVRestBlock: oscar.TLVRestBlock{
  42. TLVList: oscar.TLVList{
  43. {
  44. TType: 0x01,
  45. Val: uint16(100),
  46. },
  47. {
  48. TType: 0x02,
  49. Val: uint16(100),
  50. },
  51. {
  52. TType: 0x03,
  53. Val: uint16(100),
  54. },
  55. {
  56. TType: 0x04,
  57. Val: uint16(100),
  58. },
  59. },
  60. },
  61. }
  62. return writeOutSNAC(snac, snacFrameOut, snacPayloadOut, sequence, w)
  63. }
  64. func NotifyArrival(sess *Session, sm SessionManager, fm FeedbagManager) error {
  65. screenNames, err := fm.InterestedUsers(sess.ScreenName)
  66. if err != nil {
  67. return err
  68. }
  69. sm.BroadcastToScreenNames(screenNames, XMessage{
  70. snacFrame: oscar.SnacFrame{
  71. FoodGroup: BUDDY,
  72. SubGroup: BuddyArrived,
  73. },
  74. snacOut: oscar.SNAC_0x03_0x0A_BuddyArrived{
  75. TLVUserInfo: oscar.TLVUserInfo{
  76. ScreenName: sess.ScreenName,
  77. WarningLevel: sess.GetWarning(),
  78. TLVBlock: oscar.TLVBlock{
  79. TLVList: sess.GetUserInfo(),
  80. },
  81. },
  82. },
  83. })
  84. return nil
  85. }
  86. func NotifyDeparture(sess *Session, sm SessionManager, fm *FeedbagStore) error {
  87. screenNames, err := fm.InterestedUsers(sess.ScreenName)
  88. if err != nil {
  89. return err
  90. }
  91. sm.BroadcastToScreenNames(screenNames, XMessage{
  92. snacFrame: oscar.SnacFrame{
  93. FoodGroup: BUDDY,
  94. SubGroup: BuddyDeparted,
  95. },
  96. snacOut: oscar.SNAC_0x03_0x0B_BuddyDeparted{
  97. TLVUserInfo: oscar.TLVUserInfo{
  98. ScreenName: sess.ScreenName,
  99. WarningLevel: sess.GetWarning(),
  100. },
  101. },
  102. })
  103. return nil
  104. }