snacs.go 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302
  1. package wire
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. )
  7. //
  8. // Food Group Codes
  9. //
  10. const (
  11. OService uint16 = 0x0001
  12. Locate uint16 = 0x0002
  13. Buddy uint16 = 0x0003
  14. ICBM uint16 = 0x0004
  15. Advert uint16 = 0x0005
  16. Invite uint16 = 0x0006
  17. Admin uint16 = 0x0007
  18. Popup uint16 = 0x0008
  19. PermitDeny uint16 = 0x0009
  20. UserLookup uint16 = 0x000A
  21. Stats uint16 = 0x000B
  22. Translate uint16 = 0x000C
  23. ChatNav uint16 = 0x000D
  24. Chat uint16 = 0x000E
  25. ODir uint16 = 0x000F
  26. BART uint16 = 0x0010
  27. Feedbag uint16 = 0x0013
  28. ICQ uint16 = 0x0015
  29. BUCP uint16 = 0x0017
  30. Alert uint16 = 0x0018
  31. Plugin uint16 = 0x0022
  32. UnnamedFG24 uint16 = 0x0024
  33. MDir uint16 = 0x0025
  34. ARS uint16 = 0x044A
  35. )
  36. //
  37. // General Error Codes
  38. //
  39. const (
  40. ErrorCodeInvalidSnac uint16 = 0x01
  41. ErrorCodeRateToHost uint16 = 0x02
  42. ErrorCodeRateToClient uint16 = 0x03
  43. ErrorCodeNotLoggedOn uint16 = 0x04
  44. ErrorCodeServiceUnavailable uint16 = 0x05
  45. ErrorCodeServiceNotDefined uint16 = 0x06
  46. ErrorCodeObsoleteSnac uint16 = 0x07
  47. ErrorCodeNotSupportedByHost uint16 = 0x08
  48. ErrorCodeNotSupportedByClient uint16 = 0x09
  49. ErrorCodeRefusedByClient uint16 = 0x0A
  50. ErrorCodeReplyTooBig uint16 = 0x0B
  51. ErrorCodeResponsesLost uint16 = 0x0C
  52. ErrorCodeRequestDenied uint16 = 0x0D
  53. ErrorCodeBustedSnacPayload uint16 = 0x0E
  54. ErrorCodeInsufficientRights uint16 = 0x0F
  55. ErrorCodeInLocalPermitDeny uint16 = 0x10
  56. ErrorCodeTooEvilSender uint16 = 0x11
  57. ErrorCodeTooEvilReceiver uint16 = 0x12
  58. ErrorCodeUserTempUnavail uint16 = 0x13
  59. ErrorCodeNoMatch uint16 = 0x14
  60. ErrorCodeListOverflow uint16 = 0x15
  61. ErrorCodeRequestAmbigous uint16 = 0x16
  62. ErrorCodeQueueFull uint16 = 0x17
  63. ErrorCodeNotWhileOnAol uint16 = 0x18
  64. ErrorCodeQueryFail uint16 = 0x19
  65. ErrorCodeTimeout uint16 = 0x1A
  66. ErrorCodeErrorText uint16 = 0x1B
  67. ErrorCodeGeneralFailure uint16 = 0x1C
  68. ErrorCodeProgress uint16 = 0x1D
  69. ErrorCodeInFreeArea uint16 = 0x1E
  70. ErrorCodeRestrictedByPc uint16 = 0x1F
  71. ErrorCodeRemoteRestrictedByPc uint16 = 0x20
  72. )
  73. //
  74. // Authentication
  75. //
  76. const (
  77. LoginTLVTagsScreenName uint16 = 0x01
  78. LoginTLVTagsRoastedPassword uint16 = 0x02
  79. LoginTLVTagsReconnectHere uint16 = 0x05
  80. LoginTLVTagsAuthorizationCookie uint16 = 0x06
  81. LoginTLVTagsErrorSubcode uint16 = 0x08
  82. LoginTLVTagsPasswordHash uint16 = 0x25
  83. )
  84. const (
  85. LoginErrInvalidUsernameOrPassword uint16 = 0x01
  86. )
  87. //
  88. // 0x01: OService
  89. //
  90. const (
  91. OServiceErr uint16 = 0x0001
  92. OServiceClientOnline uint16 = 0x0002
  93. OServiceHostOnline uint16 = 0x0003
  94. OServiceServiceRequest uint16 = 0x0004
  95. OServiceServiceResponse uint16 = 0x0005
  96. OServiceRateParamsQuery uint16 = 0x0006
  97. OServiceRateParamsReply uint16 = 0x0007
  98. OServiceRateParamsSubAdd uint16 = 0x0008
  99. OServiceRateDelParamSub uint16 = 0x0009
  100. OServiceRateParamChange uint16 = 0x000A
  101. OServicePauseReq uint16 = 0x000B
  102. OServicePauseAck uint16 = 0x000C
  103. OServiceResume uint16 = 0x000D
  104. OServiceUserInfoQuery uint16 = 0x000E
  105. OServiceUserInfoUpdate uint16 = 0x000F
  106. OServiceEvilNotification uint16 = 0x0010
  107. OServiceIdleNotification uint16 = 0x0011
  108. OServiceMigrateGroups uint16 = 0x0012
  109. OServiceMotd uint16 = 0x0013
  110. OServiceSetPrivacyFlags uint16 = 0x0014
  111. OServiceWellKnownUrls uint16 = 0x0015
  112. OServiceNoop uint16 = 0x0016
  113. OServiceClientVersions uint16 = 0x0017
  114. OServiceHostVersions uint16 = 0x0018
  115. OServiceMaxConfigQuery uint16 = 0x0019
  116. OServiceMaxConfigReply uint16 = 0x001A
  117. OServiceStoreConfig uint16 = 0x001B
  118. OServiceConfigQuery uint16 = 0x001C
  119. OServiceConfigReply uint16 = 0x001D
  120. OServiceSetUserInfoFields uint16 = 0x001E
  121. OServiceProbeReq uint16 = 0x001F
  122. OServiceProbeAck uint16 = 0x0020
  123. OServiceBartReply uint16 = 0x0021
  124. OServiceBartQuery2 uint16 = 0x0022
  125. OServiceBartReply2 uint16 = 0x0023
  126. OServiceUserInfoUserFlags uint16 = 0x01
  127. OServiceUserInfoSignonTOD uint16 = 0x03
  128. OServiceUserInfoIdleTime uint16 = 0x04
  129. OServiceUserInfoStatus uint16 = 0x06
  130. OServiceUserInfoOscarCaps uint16 = 0x0D
  131. OServiceUserInfoBARTInfo uint16 = 0x1D
  132. OServiceUserInfoUserFlags2 uint16 = 0x1F
  133. OServiceUserStatusAvailable uint32 = 0x00000000 // user is available
  134. OServiceUserStatusAway uint32 = 0x00000001 // user is away
  135. OServiceUserStatusDND uint32 = 0x00000002 // don't disturb user
  136. OServiceUserStatusOut uint32 = 0x00000004 // user is not available
  137. OServiceUserStatusBusy uint32 = 0x00000010 // user is busy
  138. OServiceUserStatusChat uint32 = 0x00000020 // user is available to chat
  139. OServiceUserStatusInvisible uint32 = 0x00000100 // user is invisible
  140. OServiceUserStatusWebAware uint32 = 0x00010000
  141. OServiceUserStatusHideIP uint32 = 0x00020000
  142. OServiceUserStatusBirthday uint32 = 0x00080000 // user is having a birthday :DDD
  143. OServiceUserStatusICQHomePage uint32 = 0x00200000
  144. OServiceUserStatusDirectRequireAuth uint32 = 0x10000000
  145. OServiceUserFlagUnconfirmed uint16 = 0x0001 // Unconfirmed account
  146. OServiceUserFlagAdministrator uint16 = 0x0002 // Server Administrator
  147. OServiceUserFlagAOL uint16 = 0x0004 // AOL (staff?) account
  148. OServiceUserFlagOSCARPay uint16 = 0x0008 // Commercial account
  149. OServiceUserFlagOSCARFree uint16 = 0x0010 // AIM (not AOL) account
  150. OServiceUserFlagUnavailable uint16 = 0x0020 // user is away
  151. OServiceUserFlagICQ uint16 = 0x0040 // ICQ user (OServiceUserFlagOSCARFree should also be set)
  152. OServiceUserFlagWireless uint16 = 0x0080 // On mobile device
  153. OServiceUserFlagInternal uint16 = 0x0100 // Internal account
  154. OServiceUserFlagFish uint16 = 0x0200 // IM forwarding enabled
  155. OServiceUserFlagBot uint16 = 0x0400 // Bot account
  156. OServiceUserFlagBeast uint16 = 0x0800 // Unknown
  157. OServiceUserFlagOneWayWireless uint16 = 0x1000 // On one way mobile device
  158. OServiceUserFlagOfficial uint16 = 0x2000 // Unknown
  159. OServiceUserFlag2BuddyMatchDirect uint32 = 0x00010000 // Unknown
  160. OServiceUserFlag2BuddyMatchIndirect uint32 = 0x00020000 // Unknown
  161. OServiceUserFlag2NoKnockKnock uint32 = 0x00040000 // Sender is safe
  162. OServiceUserFlag2ForwardMobile uint32 = 0x00080000 // Forward to mobile if no acive session
  163. OServicePrivacyFlagIdle uint32 = 0x00000001
  164. OServicePrivacyFlagMember uint32 = 0x00000002
  165. OServiceTLVTagsReconnectHere uint16 = 0x05
  166. OServiceTLVTagsLoginCookie uint16 = 0x06
  167. OServiceTLVTagsGroupID uint16 = 0x0D
  168. OServiceTLVTagsSSLCertName uint16 = 0x8D
  169. OServiceTLVTagsSSLState uint16 = 0x8E
  170. )
  171. type SNAC_0x01_0x02_OServiceClientOnline struct {
  172. GroupVersions []struct {
  173. FoodGroup uint16
  174. Version uint16
  175. ToolID uint16
  176. ToolVersion uint16
  177. }
  178. }
  179. type SNAC_0x01_0x03_OServiceHostOnline struct {
  180. FoodGroups []uint16
  181. }
  182. type SNAC_0x01_0x04_OServiceServiceRequest struct {
  183. FoodGroup uint16
  184. TLVRestBlock
  185. }
  186. type SNAC_0x01_0x04_TLVRoomInfo struct {
  187. Exchange uint16
  188. Cookie string `len_prefix:"uint8"`
  189. InstanceNumber uint16
  190. }
  191. type SNAC_0x01_0x05_OServiceServiceResponse struct {
  192. TLVRestBlock
  193. }
  194. // SNAC_0x01_0x07_OServiceRateParamsReply contains rate limits for rate classes and groups.
  195. //
  196. // Rate Classes:
  197. // - ID: Unique identifier for the rate class.
  198. // - WindowSize: The number of previously sent commands included in calculating
  199. // the current "rate average."
  200. // - ClearLevel: The threshold the average must reach to clear a rate limit.
  201. // - AlertLevel: The threshold for triggering an alert that tells the client
  202. // that it's getting close to the limit.
  203. // - LimitLevel: SNACs will be dropped if the rate falls below this value.
  204. // - DisconnectLevel: Server will disconnect if the rate falls below this value.
  205. // - CurrentLevel: The current value for the class; higher values are preferable.
  206. // Represents the current "rate average," resembling a moving average of the
  207. // times between each of the last WindowSize commands.
  208. // - MaxLevel: The maximum rate value; if the current value surpasses this,
  209. // it should be reset. The upper limit for a rate average.
  210. // - LastTime: Time elapsed since the last message was received by the server.
  211. // - CurrentState: Indicates whether the server is dropping SNACs for this rate class.
  212. //
  213. // Rate Groups:
  214. // - ID: Unique identifier for the rate group.
  215. // - Pairs: List of SNAC types associated with the rate group, including FoodGroup
  216. // (e.g., wire.ICBM) and SubGroup (e.g., wire.ICBMChannelMsgToHost).
  217. type SNAC_0x01_0x07_OServiceRateParamsReply struct {
  218. RateClasses []struct {
  219. ID uint16
  220. WindowSize uint32
  221. ClearLevel uint32
  222. AlertLevel uint32
  223. LimitLevel uint32
  224. DisconnectLevel uint32
  225. CurrentLevel uint32
  226. MaxLevel uint32
  227. LastTime uint32
  228. CurrentState uint8
  229. } `count_prefix:"uint16"`
  230. RateGroups []struct {
  231. ID uint16
  232. Pairs []struct {
  233. FoodGroup uint16
  234. SubGroup uint16
  235. } `count_prefix:"uint16"`
  236. }
  237. }
  238. type SNAC_0x01_0x08_OServiceRateParamsSubAdd struct {
  239. TLVRestBlock
  240. }
  241. type SNAC_0x01_0x0F_OServiceUserInfoUpdate struct {
  242. TLVUserInfo
  243. }
  244. type SNAC_0x01_0x10_OServiceEvilNotification struct {
  245. NewEvil uint16
  246. TLVUserInfo
  247. }
  248. type SNAC_0x01_0x10_OServiceEvilNotificationAnon struct {
  249. NewEvil uint16
  250. }
  251. type SNAC_0x01_0x11_OServiceIdleNotification struct {
  252. IdleTime uint32
  253. }
  254. type SNAC_0x01_0x14_OServiceSetPrivacyFlags struct {
  255. PrivacyFlags uint32
  256. }
  257. // IdleFlag returns whether other AIM users can see how long the user has been
  258. // idle.
  259. func (s SNAC_0x01_0x14_OServiceSetPrivacyFlags) IdleFlag() bool {
  260. return s.PrivacyFlags&OServicePrivacyFlagIdle == OServicePrivacyFlagIdle
  261. }
  262. // MemberFlag returns whether other AIM users can see how long the user has been
  263. // a member.
  264. func (s SNAC_0x01_0x14_OServiceSetPrivacyFlags) MemberFlag() bool {
  265. return s.PrivacyFlags&OServicePrivacyFlagMember == OServicePrivacyFlagMember
  266. }
  267. type SNAC_0x01_0x17_OServiceClientVersions struct {
  268. Versions []uint16
  269. }
  270. type SNAC_0x01_0x18_OServiceHostVersions struct {
  271. Versions []uint16
  272. }
  273. type SNAC_0x01_0x1E_OServiceSetUserInfoFields struct {
  274. TLVRestBlock
  275. }
  276. type SNAC_0x01_0x21_OServiceBARTReply struct {
  277. BARTID
  278. }
  279. //
  280. // 0x02: Locate
  281. //
  282. const (
  283. LocateErr uint16 = 0x0001
  284. LocateRightsQuery uint16 = 0x0002
  285. LocateRightsReply uint16 = 0x0003
  286. LocateSetInfo uint16 = 0x0004
  287. LocateUserInfoQuery uint16 = 0x0005
  288. LocateUserInfoReply uint16 = 0x0006
  289. LocateWatcherSubRequest uint16 = 0x0007
  290. LocateWatcherNotification uint16 = 0x0008
  291. LocateSetDirInfo uint16 = 0x0009
  292. LocateSetDirReply uint16 = 0x000A
  293. LocateGetDirInfo uint16 = 0x000B
  294. LocateGetDirReply uint16 = 0x000C
  295. LocateGroupCapabilityQuery uint16 = 0x000D
  296. LocateGroupCapabilityReply uint16 = 0x000E
  297. LocateSetKeywordInfo uint16 = 0x000F
  298. LocateSetKeywordReply uint16 = 0x0010
  299. LocateGetKeywordInfo uint16 = 0x0011
  300. LocateGetKeywordReply uint16 = 0x0012
  301. LocateFindListByEmail uint16 = 0x0013
  302. LocateFindListReply uint16 = 0x0014
  303. LocateUserInfoQuery2 uint16 = 0x0015
  304. LocateTypeSig uint32 = 0x00000001
  305. LocateTypeUnavailable uint32 = 0x00000002
  306. LocateTypeCapabilities uint32 = 0x00000004
  307. LocateTypeCerts uint32 = 0x00000008
  308. LocateTypeHtmlInfo uint32 = 0x00000400
  309. LocateTLVTagsInfoSigMime uint16 = 0x01
  310. LocateTLVTagsInfoSigData uint16 = 0x02
  311. LocateTLVTagsInfoUnavailableMime uint16 = 0x03
  312. LocateTLVTagsInfoUnavailableData uint16 = 0x04
  313. LocateTLVTagsInfoCapabilities uint16 = 0x05
  314. LocateTLVTagsInfoCerts uint16 = 0x06
  315. LocateTLVTagsInfoSigTime uint16 = 0x0A
  316. LocateTLVTagsInfoUnavailableTime uint16 = 0x0B
  317. LocateTLVTagsInfoSupportHostSig uint16 = 0x0C
  318. LocateTLVTagsInfoHtmlInfoData uint16 = 0x0E
  319. LocateTLVTagsInfoHtmlInfoType uint16 = 0x0D
  320. // LocateTLVTagsRightsMaxSigLen is the max signature length
  321. LocateTLVTagsRightsMaxSigLen uint16 = 0x01
  322. // LocateTLVTagsRightsMaxCapabilitiesLen is the max allowed # of full UUID capabilities
  323. LocateTLVTagsRightsMaxCapabilitiesLen uint16 = 0x02
  324. // LocateTLVTagsRightsMaxFindByEmailList is the maximum # of email addresses to look up at once
  325. LocateTLVTagsRightsMaxFindByEmailList uint16 = 0x03
  326. // LocateTLVTagsRightsMaxCertsLen is the largest CERT length for e2e crypto
  327. LocateTLVTagsRightsMaxCertsLen uint16 = 0x04
  328. // LocateTLVTagsRightsMaxMaxShortCapabilities is the max allowed # of short UUID capabilities allowed
  329. LocateTLVTagsRightsMaxMaxShortCapabilities uint16 = 0x05
  330. )
  331. type SNAC_0x02_0x03_LocateRightsReply struct {
  332. TLVRestBlock
  333. }
  334. type SNAC_0x02_0x04_LocateSetInfo struct {
  335. TLVRestBlock
  336. }
  337. type SNAC_0x02_0x06_LocateUserInfoReply struct {
  338. TLVUserInfo
  339. LocateInfo TLVRestBlock
  340. }
  341. type SNAC_0x02_0x09_LocateSetDirInfo struct {
  342. TLVRestBlock
  343. }
  344. type SNAC_0x02_0x0A_LocateSetDirReply struct {
  345. Result uint16
  346. }
  347. type SNAC_0x02_0x0B_LocateGetDirInfo struct {
  348. WatcherScreenNames string `len_prefix:"uint8"`
  349. }
  350. type SNAC_0x02_0x0F_LocateSetKeywordInfo struct {
  351. TLVRestBlock
  352. }
  353. type SNAC_0x02_0x10_LocateSetKeywordReply struct {
  354. // Unknown is a field whose purpose is not known
  355. Unknown uint16
  356. }
  357. type SNAC_0x02_0x05_LocateUserInfoQuery struct {
  358. Type uint16
  359. ScreenName string `len_prefix:"uint8"`
  360. }
  361. func (s SNAC_0x02_0x05_LocateUserInfoQuery) RequestProfile() bool {
  362. return s.Type&uint16(LocateTypeSig) == uint16(LocateTypeSig)
  363. }
  364. func (s SNAC_0x02_0x05_LocateUserInfoQuery) RequestAwayMessage() bool {
  365. return s.Type&uint16(LocateTypeUnavailable) == uint16(LocateTypeUnavailable)
  366. }
  367. type SNAC_0x02_0x15_LocateUserInfoQuery2 struct {
  368. Type2 uint32
  369. ScreenName string `len_prefix:"uint8"`
  370. }
  371. //
  372. // 0x03: Buddy
  373. //
  374. const (
  375. BuddyErr uint16 = 0x0001
  376. BuddyRightsQuery uint16 = 0x0002
  377. BuddyRightsReply uint16 = 0x0003
  378. BuddyAddBuddies uint16 = 0x0004
  379. BuddyDelBuddies uint16 = 0x0005
  380. BuddyWatcherListQuery uint16 = 0x0006
  381. BuddyWatcherListResponse uint16 = 0x0007
  382. BuddyWatcherSubRequest uint16 = 0x0008
  383. BuddyWatcherNotification uint16 = 0x0009
  384. BuddyRejectNotification uint16 = 0x000A
  385. BuddyArrived uint16 = 0x000B
  386. BuddyDeparted uint16 = 0x000C
  387. BuddyAddTempBuddies uint16 = 0x000F
  388. BuddyDelTempBuddies uint16 = 0x0010
  389. BuddyTLVTagsParmMaxBuddies uint16 = 0x01
  390. BuddyTLVTagsParmMaxWatchers uint16 = 0x02
  391. BuddyTLVTagsParmMaxIcqBroad uint16 = 0x03
  392. BuddyTLVTagsParmMaxTempBuddies uint16 = 0x04
  393. )
  394. type SNAC_0x03_0x02_BuddyRightsQuery struct {
  395. TLVRestBlock
  396. }
  397. type SNAC_0x03_0x03_BuddyRightsReply struct {
  398. TLVRestBlock
  399. }
  400. type SNAC_0x03_0x04_BuddyAddBuddies struct {
  401. Buddies []struct {
  402. ScreenName string `len_prefix:"uint8"`
  403. }
  404. }
  405. type SNAC_0x03_0x05_BuddyDelBuddies struct {
  406. Buddies []struct {
  407. ScreenName string `len_prefix:"uint8"`
  408. }
  409. }
  410. type SNAC_0x03_0x0B_BuddyArrived struct {
  411. TLVUserInfo
  412. }
  413. type SNAC_0x03_0x0C_BuddyDeparted struct {
  414. TLVUserInfo
  415. }
  416. //
  417. // 0x04: ICBM
  418. //
  419. const (
  420. ICBMErr uint16 = 0x0001
  421. ICBMAddParameters uint16 = 0x0002
  422. ICBMDelParameters uint16 = 0x0003
  423. ICBMParameterQuery uint16 = 0x0004
  424. ICBMParameterReply uint16 = 0x0005
  425. ICBMChannelMsgToHost uint16 = 0x0006
  426. ICBMChannelMsgToClient uint16 = 0x0007
  427. ICBMEvilRequest uint16 = 0x0008
  428. ICBMEvilReply uint16 = 0x0009
  429. ICBMMissedCalls uint16 = 0x000A
  430. ICBMClientErr uint16 = 0x000B
  431. ICBMHostAck uint16 = 0x000C
  432. ICBMSinStored uint16 = 0x000D
  433. ICBMSinListQuery uint16 = 0x000E
  434. ICBMSinListReply uint16 = 0x000F
  435. ICBMSinRetrieve uint16 = 0x0010
  436. ICBMSinDelete uint16 = 0x0011
  437. ICBMNotifyRequest uint16 = 0x0012
  438. ICBMNotifyReply uint16 = 0x0013
  439. ICBMClientEvent uint16 = 0x0014
  440. ICBMSinReply uint16 = 0x0017
  441. ICBMTLVAOLIMData uint16 = 0x02
  442. ICBMTLVRequestHostAck uint16 = 0x03
  443. ICBMTLVAutoResponse uint16 = 0x04
  444. ICBMTLVData uint16 = 0x05
  445. ICBMTLVStore uint16 = 0x06
  446. ICBMTLVICQblob uint16 = 0x07
  447. ICBMTLVAvatarInfo uint16 = 0x08
  448. ICBMTLVWantAvatar uint16 = 0x09
  449. ICBMTLVMultiUser uint16 = 0x0A
  450. ICBMTLVWantEvents uint16 = 0x0B
  451. ICBMTLVSubscriptions uint16 = 0x0C
  452. ICBMTLVBART uint16 = 0x0D
  453. ICBMTLVHostImID uint16 = 0x10
  454. ICBMTLVHostImArgs uint16 = 0x11
  455. ICBMTLVSendTime uint16 = 0x16
  456. ICBMTLVFriendlyName uint16 = 0x17
  457. ICBMTLVAnonymous uint16 = 0x18
  458. ICBMTLVWidgetName uint16 = 0x19
  459. ICBMMessageEncodingASCII uint16 = 0x00 // ANSI ASCII -- ISO 646
  460. ICBMMessageEncodingUnicode uint16 = 0x02 // ISO 10646.USC-2 Unicode
  461. ICBMMessageEncodingLatin1 uint16 = 0x03 // ISO 8859-1
  462. )
  463. // ICBMFragment represents an ICBM message component.
  464. type ICBMFragment struct {
  465. ID uint8
  466. Version uint8
  467. Payload []byte `len_prefix:"uint16"`
  468. }
  469. // ICBMMessage represents the text component of an ICBM message.
  470. type ICBMMessage struct {
  471. Charset uint16
  472. Language uint16
  473. Text []byte
  474. }
  475. type SNAC_0x04_0x02_ICBMAddParameters struct {
  476. Channel uint16
  477. ICBMFlags uint32
  478. MaxIncomingICBMLen uint16
  479. MaxSourceEvil uint16
  480. MaxDestinationEvil uint16
  481. MinInterICBMInterval uint32
  482. }
  483. type SNAC_0x04_0x05_ICBMParameterReply struct {
  484. MaxSlots uint16
  485. ICBMFlags uint32
  486. MaxIncomingICBMLen uint16
  487. MaxSourceEvil uint16
  488. MaxDestinationEvil uint16
  489. MinInterICBMInterval uint32
  490. }
  491. type SNAC_0x04_0x06_ICBMChannelMsgToHost struct {
  492. Cookie uint64
  493. ChannelID uint16
  494. ScreenName string `len_prefix:"uint8"`
  495. TLVRestBlock
  496. }
  497. type SNAC_0x04_0x07_ICBMChannelMsgToClient struct {
  498. Cookie uint64
  499. ChannelID uint16
  500. TLVUserInfo
  501. TLVRestBlock
  502. }
  503. // ICBMFragmentList creates an ICBM fragment list for an instant message
  504. // payload.
  505. func ICBMFragmentList(text string) ([]ICBMFragment, error) {
  506. msg := ICBMMessage{
  507. Charset: ICBMMessageEncodingASCII,
  508. Language: 0, // not clear what this means, but it works
  509. Text: []byte(text),
  510. }
  511. msgBuf := bytes.Buffer{}
  512. if err := Marshal(msg, &msgBuf); err != nil {
  513. return nil, fmt.Errorf("unable to marshal ICBM message: %w", err)
  514. }
  515. return []ICBMFragment{
  516. {
  517. ID: 5, // 5 = capabilities
  518. Version: 1,
  519. Payload: []byte{1, 1, 2}, // 1 = text
  520. },
  521. {
  522. ID: 1, // 1 = message text
  523. Version: 1,
  524. Payload: msgBuf.Bytes(),
  525. },
  526. }, nil
  527. }
  528. // UnmarshalICBMMessageText extracts message text from an ICBM fragment list.
  529. // Param b is a slice from TLV wire.ICBMTLVAOLIMData.
  530. func UnmarshalICBMMessageText(b []byte) (string, error) {
  531. var frags []ICBMFragment
  532. if err := Unmarshal(&frags, bytes.NewBuffer(b)); err != nil {
  533. return "", fmt.Errorf("unable to unmarshal ICBM fragment: %w", err)
  534. }
  535. for _, frag := range frags {
  536. if frag.ID == 1 { // 1 = message text
  537. msg := ICBMMessage{}
  538. err := Unmarshal(&msg, bytes.NewBuffer(frag.Payload))
  539. if err != nil {
  540. err = fmt.Errorf("unable to unmarshal ICBM message: %w", err)
  541. }
  542. return string(msg.Text), err
  543. }
  544. }
  545. return "", errors.New("unable to find message fragment")
  546. }
  547. type SNAC_0x04_0x08_ICBMEvilRequest struct {
  548. SendAs uint16
  549. ScreenName string `len_prefix:"uint8"`
  550. }
  551. type SNAC_0x04_0x09_ICBMEvilReply struct {
  552. EvilDeltaApplied uint16
  553. UpdatedEvilValue uint16
  554. }
  555. type SNAC_0x04_0x0B_ICBMClientErr struct {
  556. Cookie uint64
  557. ChannelID uint16
  558. ScreenName string `len_prefix:"uint8"`
  559. Code uint16
  560. ErrInfo []byte
  561. }
  562. type SNAC_0x04_0x0C_ICBMHostAck struct {
  563. Cookie uint64
  564. ChannelID uint16
  565. ScreenName string `len_prefix:"uint8"`
  566. }
  567. type SNAC_0x04_0x14_ICBMClientEvent struct {
  568. Cookie uint64
  569. ChannelID uint16
  570. ScreenName string `len_prefix:"uint8"`
  571. Event uint16
  572. }
  573. //
  574. // 0x07: Admin
  575. //
  576. const (
  577. AdminErr uint16 = 0x0001
  578. AdminInfoQuery uint16 = 0x0002
  579. AdminInfoReply uint16 = 0x0003
  580. AdminInfoChangeRequest uint16 = 0x0004
  581. AdminInfoChangeReply uint16 = 0x0005
  582. AdminAcctConfirmRequest uint16 = 0x0006
  583. AdminAcctConfirmReply uint16 = 0x0007
  584. AdminAcctDeleteRequest uint16 = 0x0008
  585. AdminAcctDeleteReply uint16 = 0x0009
  586. AdminInfoErrorValidateNickName uint16 = 0x0001
  587. AdminInfoErrorValidatePassword uint16 = 0x0002
  588. AdminInfoErrorValidateEmail uint16 = 0x0003
  589. AdminInfoErrorServiceTempUnavailable uint16 = 0x0004
  590. AdminInfoErrorFieldChangeTempUnavailable uint16 = 0x0005
  591. AdminInfoErrorInvalidNickName uint16 = 0x0006
  592. AdminInfoErrorInvalidPassword uint16 = 0x0007
  593. AdminInfoErrorInvalidEmail uint16 = 0x0008
  594. AdminInfoErrorInvalidRegistrationPreference uint16 = 0x0009
  595. AdminInfoErrorInvalidOldPassword uint16 = 0x000A
  596. AdminInfoErrorInvalidNickNameLength uint16 = 0x000B
  597. AdminInfoErrorInvalidPasswordLength uint16 = 0x000C
  598. AdminInfoErrorInvalidEmailLength uint16 = 0x000D
  599. AdminInfoErrorInvalidOldPasswordLength uint16 = 0x000E
  600. AdminInfoErrorNeedOldPassword uint16 = 0x000F
  601. AdminInfoErrorReadOnlyField uint16 = 0x0010
  602. AdminInfoErrorWriteOnlyField uint16 = 0x0011
  603. AdminInfoErrorUnsupportedType uint16 = 0x0012
  604. AdminInfoErrorAllOtherErrors uint16 = 0x0013
  605. AdminInfoErrorBadSnac uint16 = 0x0014
  606. AdminInfoErrorInvalidAccount uint16 = 0x0015
  607. AdminInfoErrorDeletedAccount uint16 = 0x0016
  608. AdminInfoErrorExpiredAccount uint16 = 0x0017
  609. AdminInfoErrorNoDatabaseAccess uint16 = 0x0018
  610. AdminInfoErrorInvalidDatabaseFields uint16 = 0x0019
  611. AdminInfoErrorBadDatabaseStatus uint16 = 0x001A
  612. AdminInfoErrorMigrationCancel uint16 = 0x001B
  613. AdminInfoErrorInternalError uint16 = 0x001C
  614. AdminInfoErrorPendingRequest uint16 = 0x001D
  615. AdminInfoErrorNotDTStatus uint16 = 0x001E
  616. AdminInfoErrorOutstandingConfirm uint16 = 0x001F
  617. AdminInfoErrorNoEmailAddress uint16 = 0x0020
  618. AdminInfoErrorOverLimit uint16 = 0x0021
  619. AdminInfoErrorEmailHostFail uint16 = 0x0022
  620. AdminInfoErrorDNSFail uint16 = 0x0023
  621. AdminInfoRegStatusNoDisclosure uint16 = 0x01
  622. AdminInfoRegStatusLimitDisclosure uint16 = 0x02
  623. AdminInfoRegStatusFullDisclosure uint16 = 0x03
  624. AdminInfoPermissionsReadOnly1 uint16 = 0x01
  625. AdminInfoPermissionsReadOnly2 uint16 = 0x02
  626. AdminInfoPermissionsReadWrite uint16 = 0x03
  627. AdminAcctConfirmStatusEmailSent uint16 = 0x00
  628. AdminAcctConfirmStatusAlreadyConfirmed uint16 = 0x1E
  629. AdminAcctConfirmStatusServerError uint16 = 0x23
  630. AdminTLVScreenNameFormatted uint16 = 0x01
  631. AdminTLVNewPassword uint16 = 0x02
  632. AdminTLVUrl uint16 = 0x04
  633. AdminTLVErrorCode uint16 = 0x08
  634. AdminTLVEmailAddress uint16 = 0x11
  635. AdminTLVOldPassword uint16 = 0x12
  636. AdminTLVRegistrationStatus uint16 = 0x13
  637. )
  638. // Used when client wants to get its account information
  639. // - AdminTLVScreenNameFormatted
  640. // - AdminTLVEmailAddress
  641. // - AdminTLVRegistrationStatus
  642. type SNAC_0x07_0x02_AdminInfoQuery struct {
  643. TLVRestBlock
  644. }
  645. type SNAC_0x07_0x03_AdminInfoReply struct {
  646. Permissions uint16
  647. TLVBlock
  648. }
  649. // AdminTLVScreenNameFormatted - change screenname formatting
  650. // AdminTLVEmailAddress - change account email
  651. // AdminTLVRegistrationStatus - change registration status
  652. // AdminTLVNewPassword, AdminTLVOldPassword - change password
  653. type SNAC_0x07_0x04_AdminInfoChangeRequest struct {
  654. TLVRestBlock
  655. }
  656. type SNAC_0x07_0x05_AdminChangeReply struct {
  657. Permissions uint16
  658. TLVBlock
  659. }
  660. type SNAC_0x07_0x06_AdminConfirmRequest struct{}
  661. type SNAC_0x07_0x07_AdminConfirmReply struct {
  662. Status uint16
  663. TLV
  664. }
  665. //
  666. // 0x09: PermitDeny
  667. //
  668. const (
  669. PermitDenyErr uint16 = 0x0001
  670. PermitDenyRightsQuery uint16 = 0x0002
  671. PermitDenyRightsReply uint16 = 0x0003
  672. PermitDenySetGroupPermitMask uint16 = 0x0004
  673. PermitDenyAddPermListEntries uint16 = 0x0005
  674. PermitDenyDelPermListEntries uint16 = 0x0006
  675. PermitDenyAddDenyListEntries uint16 = 0x0007
  676. PermitDenyDelDenyListEntries uint16 = 0x0008
  677. PermitDenyBosErr uint16 = 0x0009
  678. PermitDenyAddTempPermitListEntries uint16 = 0x000A
  679. PermitDenyDelTempPermitListEntries uint16 = 0x000B
  680. PermitDenyTLVMaxPermits uint16 = 0x01
  681. PermitDenyTLVMaxDenies uint16 = 0x02
  682. PermitDenyTLVMaxTempPermits uint16 = 0x03
  683. )
  684. type SNAC_0x09_0x03_PermitDenyRightsReply struct {
  685. TLVRestBlock
  686. }
  687. //
  688. // 0x0D: ChatNav
  689. //
  690. const (
  691. ChatNavErr uint16 = 0x0001
  692. ChatNavRequestChatRights uint16 = 0x0002
  693. ChatNavRequestExchangeInfo uint16 = 0x0003
  694. ChatNavRequestRoomInfo uint16 = 0x0004
  695. ChatNavRequestMoreRoomInfo uint16 = 0x0005
  696. ChatNavRequestOccupantList uint16 = 0x0006
  697. ChatNavSearchForRoom uint16 = 0x0007
  698. ChatNavCreateRoom uint16 = 0x0008
  699. ChatNavNavInfo uint16 = 0x0009
  700. ChatNavTLVMaxConcurrentRooms uint16 = 0x0002
  701. ChatNavTLVExchangeInfo uint16 = 0x0003
  702. ChatNavTLVRoomInfo uint16 = 0x0004
  703. )
  704. type SNAC_0x0D_0x03_ChatNavRequestExchangeInfo struct {
  705. Exchange uint16
  706. }
  707. type SNAC_0x0D_0x04_ChatNavRequestRoomInfo struct {
  708. Exchange uint16
  709. Cookie string `len_prefix:"uint8"`
  710. InstanceNumber uint16
  711. DetailLevel uint8
  712. }
  713. type SNAC_0x0D_0x09_ChatNavNavInfo struct {
  714. TLVRestBlock
  715. }
  716. type SNAC_0x0D_0x09_TLVExchangeInfo struct {
  717. Identifier uint16
  718. TLVBlock
  719. }
  720. //
  721. // 0x0E: Chat
  722. //
  723. const (
  724. ChatErr uint16 = 0x0001
  725. ChatRoomInfoUpdate uint16 = 0x0002
  726. ChatUsersJoined uint16 = 0x0003
  727. ChatUsersLeft uint16 = 0x0004
  728. ChatChannelMsgToHost uint16 = 0x0005
  729. ChatChannelMsgToClient uint16 = 0x0006
  730. ChatEvilRequest uint16 = 0x0007
  731. ChatEvilReply uint16 = 0x0008
  732. ChatClientErr uint16 = 0x0009
  733. ChatPauseRoomReq uint16 = 0x000A
  734. ChatPauseRoomAck uint16 = 0x000B
  735. ChatResumeRoom uint16 = 0x000C
  736. ChatShowMyRow uint16 = 0x000D
  737. ChatShowRowByUsername uint16 = 0x000E
  738. ChatShowRowByNumber uint16 = 0x000F
  739. ChatShowRowByName uint16 = 0x0010
  740. ChatRowInfo uint16 = 0x0011
  741. ChatListRows uint16 = 0x0012
  742. ChatRowListInfo uint16 = 0x0013
  743. ChatMoreRows uint16 = 0x0014
  744. ChatMoveToRow uint16 = 0x0015
  745. ChatToggleChat uint16 = 0x0016
  746. ChatSendQuestion uint16 = 0x0017
  747. ChatSendComment uint16 = 0x0018
  748. ChatTallyVote uint16 = 0x0019
  749. ChatAcceptBid uint16 = 0x001A
  750. ChatSendInvite uint16 = 0x001B
  751. ChatDeclineInvite uint16 = 0x001C
  752. ChatAcceptInvite uint16 = 0x001D
  753. ChatNotifyMessage uint16 = 0x001E
  754. ChatGotoRow uint16 = 0x001F
  755. ChatStageUserJoin uint16 = 0x0020
  756. ChatStageUserLeft uint16 = 0x0021
  757. ChatUnnamedSnac22 uint16 = 0x0022
  758. ChatClose uint16 = 0x0023
  759. ChatUserBan uint16 = 0x0024
  760. ChatUserUnban uint16 = 0x0025
  761. ChatJoined uint16 = 0x0026
  762. ChatUnnamedSnac27 uint16 = 0x0027
  763. ChatUnnamedSnac28 uint16 = 0x0028
  764. ChatUnnamedSnac29 uint16 = 0x0029
  765. ChatRoomInfoOwner uint16 = 0x0030
  766. ChatTLVPublicWhisperFlag uint16 = 0x01
  767. ChatTLVSenderInformation uint16 = 0x03
  768. ChatTLVMessageInformation uint16 = 0x05
  769. ChatTLVEnableReflectionFlag uint16 = 0x06
  770. // referenced from protocols/oscar/family_chatnav.c in lib purple
  771. ChatRoomTLVClassPerms uint16 = 0x02
  772. ChatRoomTLVMaxConcurrentRooms uint16 = 0x03 // required by aim 2.x-3.x
  773. ChatRoomTLVMaxNameLen uint16 = 0x04
  774. ChatRoomTLVFullyQualifiedName uint16 = 0x6A
  775. ChatRoomTLVCreateTime uint16 = 0xCA
  776. ChatRoomTLVFlags uint16 = 0xC9
  777. ChatRoomTLVMaxMsgLen uint16 = 0xD1
  778. ChatRoomTLVMaxOccupancy uint16 = 0xD2
  779. ChatRoomTLVRoomName uint16 = 0xD3
  780. ChatRoomTLVNavCreatePerms uint16 = 0xD5
  781. ChatRoomTLVCharSet1 uint16 = 0xD6
  782. ChatRoomTLVLang1 uint16 = 0xD7
  783. ChatRoomTLVCharSet2 uint16 = 0xD8
  784. ChatRoomTLVLang2 uint16 = 0xD9
  785. )
  786. type SNAC_0x0E_0x02_ChatRoomInfoUpdate struct {
  787. Exchange uint16
  788. Cookie string `len_prefix:"uint8"`
  789. InstanceNumber uint16
  790. DetailLevel uint8
  791. TLVBlock
  792. }
  793. type SNAC_0x0E_0x03_ChatUsersJoined struct {
  794. Users []TLVUserInfo
  795. }
  796. type SNAC_0x0E_0x04_ChatUsersLeft struct {
  797. Users []TLVUserInfo
  798. }
  799. type SNAC_0x0E_0x05_ChatChannelMsgToHost struct {
  800. Cookie uint64
  801. Channel uint16
  802. TLVRestBlock
  803. }
  804. type SNAC_0x0E_0x06_ChatChannelMsgToClient struct {
  805. Cookie uint64
  806. Channel uint16
  807. TLVRestBlock
  808. }
  809. //
  810. // 0x10: BART
  811. //
  812. //
  813. const (
  814. BARTTypesBuddyIconSmall uint16 = 0x00
  815. BARTTypesBuddyIcon uint16 = 0x01
  816. BARTTypesStatusStr uint16 = 0x02
  817. BARTTypesArriveSound uint16 = 0x03
  818. BARTTypesRichName uint16 = 0x04
  819. BARTTypesSuperIcon uint16 = 0x05
  820. BARTTypesRadioStation uint16 = 0x06
  821. BARTTypesSuperIconTrigger uint16 = 0x07
  822. BARTTypesStatusTextLink uint16 = 0x09
  823. BARTTypesLocation uint16 = 0x0B
  824. BARTTypesBuddyIconBig uint16 = 0x0C
  825. BARTTypesStatusTextTimestamp uint16 = 0x0D
  826. BARTTypesCurrentAvtrack uint16 = 0x0F
  827. BARTTypesDepartSound uint16 = 0x60
  828. BARTTypesImBackground uint16 = 0x80
  829. BARTTypesImChrome uint16 = 0x81
  830. BARTTypesImSkin uint16 = 0x82
  831. BARTTypesImSound uint16 = 0x83
  832. BARTTypesBadge uint16 = 0x84
  833. BARTTypesBadgeUrl uint16 = 0x85
  834. BARTTypesImInitialSound uint16 = 0x86
  835. BARTTypesFlashWallpaper uint16 = 0x88
  836. BARTTypesImmersiveWallpaper uint16 = 0x89
  837. BARTTypesBuddylistBackground uint16 = 0x100
  838. BARTTypesBuddylistImage uint16 = 0x101
  839. BARTTypesBuddylistSkin uint16 = 0x102
  840. BARTTypesSmileySet uint16 = 0x400
  841. BARTTypesEncrCertChain uint16 = 0x402
  842. BARTTypesSignCertChain uint16 = 0x403
  843. BARTTypesGatewayCert uint16 = 0x404
  844. )
  845. const (
  846. BARTErr uint16 = 0x0001
  847. BARTUploadQuery uint16 = 0x0002
  848. BARTUploadReply uint16 = 0x0003
  849. BARTDownloadQuery uint16 = 0x0004
  850. BARTDownloadReply uint16 = 0x0005
  851. BARTDownload2Query uint16 = 0x0006
  852. BARTDownload2Reply uint16 = 0x0007
  853. )
  854. const (
  855. BARTFlagsKnown uint8 = 0x00
  856. BARTFlagsCustom uint8 = 0x01
  857. BARTFlagsUrl uint8 = 0x02
  858. BARTFlagsData uint8 = 0x04
  859. BARTFlagsUnknown uint8 = 0x40
  860. BARTFlagsRedirect uint8 = 0x80
  861. BARTFlagsBanned uint8 = 0xC0
  862. )
  863. const (
  864. BARTReplyCodesSuccess uint8 = 0x00
  865. BARTReplyCodesInvalid uint8 = 0x01
  866. BARTReplyCodesNoCustom uint8 = 0x02
  867. BARTReplyCodesTooSmall uint8 = 0x03
  868. BARTReplyCodesTooBig uint8 = 0x04
  869. BARTReplyCodesInvalidType uint8 = 0x05
  870. BARTReplyCodesBanned uint8 = 0x06
  871. BARTReplyCodesNotfound uint8 = 0x07
  872. )
  873. // GetClearIconHash returns an opaque value set in BARTID hash that indicates
  874. // the user wants to clear their buddy icon.
  875. func GetClearIconHash() []byte {
  876. return []byte{0x02, 0x01, 0xd2, 0x04, 0x72}
  877. }
  878. // BARTInfo represents a BART feedbag item
  879. type BARTInfo struct {
  880. Flags uint8
  881. Hash []byte `len_prefix:"uint8"`
  882. }
  883. // HasClearIconHash reports whether the BART ID hash contains the
  884. // ClearIconHash sentinel value.
  885. func (h BARTInfo) HasClearIconHash() bool {
  886. return bytes.Equal(h.Hash, GetClearIconHash())
  887. }
  888. type BARTID struct {
  889. Type uint16
  890. BARTInfo
  891. }
  892. type SNAC_0x10_0x02_BARTUploadQuery struct {
  893. Type uint16
  894. Data []byte `len_prefix:"uint16"`
  895. }
  896. type SNAC_0x10_0x03_BARTUploadReply struct {
  897. Code uint8
  898. ID BARTID
  899. }
  900. type SNAC_0x10_0x04_BARTDownloadQuery struct {
  901. ScreenName string `len_prefix:"uint8"`
  902. Command uint8
  903. BARTID
  904. }
  905. type SNAC_0x10_0x05_BARTDownloadReply struct {
  906. ScreenName string `len_prefix:"uint8"`
  907. BARTID BARTID
  908. Data []byte `len_prefix:"uint16"`
  909. }
  910. // 0x13: Feedbag
  911. //
  912. const (
  913. FeedbagClassIdBuddy uint16 = 0x0000
  914. FeedbagClassIdGroup uint16 = 0x0001
  915. FeedbagClassIDPermit uint16 = 0x0002
  916. FeedbagClassIDDeny uint16 = 0x0003
  917. FeedbagClassIdPdinfo uint16 = 0x0004
  918. FeedbagClassIdBuddyPrefs uint16 = 0x0005
  919. FeedbagClassIdNonbuddy uint16 = 0x0006
  920. FeedbagClassIdTpaProvider uint16 = 0x0007
  921. FeedbagClassIdTpaSubscription uint16 = 0x0008
  922. FeedbagClassIdClientPrefs uint16 = 0x0009
  923. FeedbagClassIdStock uint16 = 0x000A
  924. FeedbagClassIdWeather uint16 = 0x000B
  925. FeedbagClassIdWatchList uint16 = 0x000D
  926. FeedbagClassIdIgnoreList uint16 = 0x000E
  927. FeedbagClassIdDateTime uint16 = 0x000F
  928. FeedbagClassIdExternalUser uint16 = 0x0010
  929. FeedbagClassIdRootCreator uint16 = 0x0011
  930. FeedbagClassIdFish uint16 = 0x0012
  931. FeedbagClassIdImportTimestamp uint16 = 0x0013
  932. FeedbagClassIdBart uint16 = 0x0014
  933. FeedbagClassIdRbOrder uint16 = 0x0015
  934. FeedbagClassIdPersonality uint16 = 0x0016
  935. FeedbagClassIdAlProf uint16 = 0x0017
  936. FeedbagClassIdAlInfo uint16 = 0x0018
  937. FeedbagClassIdInteraction uint16 = 0x0019
  938. FeedbagClassIdVanityInfo uint16 = 0x001D
  939. FeedbagClassIdFavoriteLocation uint16 = 0x001E
  940. FeedbagClassIdBartPdinfo uint16 = 0x001F
  941. FeedbagClassIdCustomEmoticons uint16 = 0x0024
  942. FeedbagClassIdMaxPredefined uint16 = 0x0024
  943. FeedbagClassIdXIcqStatusNote uint16 = 0x015C
  944. FeedbagClassIdMin uint16 = 0x0400
  945. FeedbagAttributesShared uint16 = 0x0064
  946. FeedbagAttributesInvited uint16 = 0x0065
  947. FeedbagAttributesPending uint16 = 0x0066
  948. FeedbagAttributesTimeT uint16 = 0x0067
  949. FeedbagAttributesDenied uint16 = 0x0068
  950. FeedbagAttributesSwimIndex uint16 = 0x0069
  951. FeedbagAttributesRecentBuddy uint16 = 0x006A
  952. FeedbagAttributesAutoBot uint16 = 0x006B
  953. FeedbagAttributesInteraction uint16 = 0x006D
  954. FeedbagAttributesMegaBot uint16 = 0x006F
  955. FeedbagAttributesOrder uint16 = 0x00C8
  956. FeedbagAttributesBuddyPrefs uint16 = 0x00C9
  957. FeedbagAttributesPdMode uint16 = 0x00CA
  958. FeedbagAttributesPdMask uint16 = 0x00CB
  959. FeedbagAttributesPdFlags uint16 = 0x00CC
  960. FeedbagAttributesClientPrefs uint16 = 0x00CD
  961. FeedbagAttributesLanguage uint16 = 0x00CE
  962. FeedbagAttributesFishUri uint16 = 0x00CF
  963. FeedbagAttributesWirelessPdMode uint16 = 0x00D0
  964. FeedbagAttributesWirelessIgnoreMode uint16 = 0x00D1
  965. FeedbagAttributesFishPdMode uint16 = 0x00D2
  966. FeedbagAttributesFishIgnoreMode uint16 = 0x00D3
  967. FeedbagAttributesCreateTime uint16 = 0x00D4
  968. FeedbagAttributesBartInfo uint16 = 0x00D5
  969. FeedbagAttributesBuddyPrefsValid uint16 = 0x00D6
  970. FeedbagAttributesBuddyPrefs2 uint16 = 0x00D7
  971. FeedbagAttributesBuddyPrefs2Valid uint16 = 0x00D8
  972. FeedbagAttributesBartList uint16 = 0x00D9
  973. FeedbagAttributesArriveSound uint16 = 0x012C
  974. FeedbagAttributesLeaveSound uint16 = 0x012D
  975. FeedbagAttributesImage uint16 = 0x012E
  976. FeedbagAttributesColorBg uint16 = 0x012F
  977. FeedbagAttributesColorFg uint16 = 0x0130
  978. FeedbagAttributesAlias uint16 = 0x0131
  979. FeedbagAttributesPassword uint16 = 0x0132
  980. FeedbagAttributesDisabled uint16 = 0x0133
  981. FeedbagAttributesCollapsed uint16 = 0x0134
  982. FeedbagAttributesUrl uint16 = 0x0135
  983. FeedbagAttributesActiveList uint16 = 0x0136
  984. FeedbagAttributesEmailAddr uint16 = 0x0137
  985. FeedbagAttributesPhoneNumber uint16 = 0x0138
  986. FeedbagAttributesCellPhoneNumber uint16 = 0x0139
  987. FeedbagAttributesSmsPhoneNumber uint16 = 0x013A
  988. FeedbagAttributesWireless uint16 = 0x013B
  989. FeedbagAttributesNote uint16 = 0x013C
  990. FeedbagAttributesAlertPrefs uint16 = 0x013D
  991. FeedbagAttributesBudalertSound uint16 = 0x013E
  992. FeedbagAttributesStockalertValue uint16 = 0x013F
  993. FeedbagAttributesTpalertEditUrl uint16 = 0x0140
  994. FeedbagAttributesTpalertDeleteUrl uint16 = 0x0141
  995. FeedbagAttributesTpprovMorealertsUrl uint16 = 0x0142
  996. FeedbagAttributesFish uint16 = 0x0143
  997. FeedbagAttributesXunconfirmedxLastAccess uint16 = 0x0145
  998. FeedbagAttributesImSent uint16 = 0x0150
  999. FeedbagAttributesOnlineTime uint16 = 0x0151
  1000. FeedbagAttributesAwayMsg uint16 = 0x0152
  1001. FeedbagAttributesImReceived uint16 = 0x0153
  1002. FeedbagAttributesBuddyfeedView uint16 = 0x0154
  1003. FeedbagAttributesWorkPhoneNumber uint16 = 0x0158
  1004. FeedbagAttributesOtherPhoneNumber uint16 = 0x0159
  1005. FeedbagAttributesWebPdMode uint16 = 0x015F
  1006. FeedbagAttributesFirstCreationTimeXc uint16 = 0x0167
  1007. FeedbagAttributesPdModeXc uint16 = 0x016E
  1008. FeedbagRightsMaxClassAttrs uint16 = 0x02
  1009. FeedbagRightsMaxItemAttrs uint16 = 0x03
  1010. FeedbagRightsMaxItemsByClass uint16 = 0x04
  1011. FeedbagRightsMaxClientItems uint16 = 0x05
  1012. FeedbagRightsMaxItemNameLen uint16 = 0x06
  1013. FeedbagRightsMaxRecentBuddies uint16 = 0x07
  1014. FeedbagRightsInteractionBuddies uint16 = 0x08
  1015. FeedbagRightsInteractionHalfLife uint16 = 0x09
  1016. FeedbagRightsInteractionMaxScore uint16 = 0x0A
  1017. FeedbagRightsMaxUnknown0b uint16 = 0x0B
  1018. FeedbagRightsMaxBuddiesPerGroup uint16 = 0x0C
  1019. FeedbagRightsMaxMegaBots uint16 = 0x0D
  1020. FeedbagRightsMaxSmartGroups uint16 = 0x0E
  1021. FeedbagErr uint16 = 0x0001
  1022. FeedbagRightsQuery uint16 = 0x0002
  1023. FeedbagRightsReply uint16 = 0x0003
  1024. FeedbagQuery uint16 = 0x0004
  1025. FeedbagQueryIfModified uint16 = 0x0005
  1026. FeedbagReply uint16 = 0x0006
  1027. FeedbagUse uint16 = 0x0007
  1028. FeedbagInsertItem uint16 = 0x0008
  1029. FeedbagUpdateItem uint16 = 0x0009
  1030. FeedbagDeleteItem uint16 = 0x000A
  1031. FeedbagInsertClass uint16 = 0x000B
  1032. FeedbagUpdateClass uint16 = 0x000C
  1033. FeedbagDeleteClass uint16 = 0x000D
  1034. FeedbagStatus uint16 = 0x000E
  1035. FeedbagReplyNotModified uint16 = 0x000F
  1036. FeedbagDeleteUser uint16 = 0x0010
  1037. FeedbagStartCluster uint16 = 0x0011
  1038. FeedbagEndCluster uint16 = 0x0012
  1039. FeedbagAuthorizeBuddy uint16 = 0x0013
  1040. FeedbagPreAuthorizeBuddy uint16 = 0x0014
  1041. FeedbagPreAuthorizedBuddy uint16 = 0x0015
  1042. FeedbagRemoveMe uint16 = 0x0016
  1043. FeedbagRemoveMe2 uint16 = 0x0017
  1044. FeedbagRequestAuthorizeToHost uint16 = 0x0018
  1045. FeedbagRequestAuthorizeToClient uint16 = 0x0019
  1046. FeedbagRespondAuthorizeToHost uint16 = 0x001A
  1047. FeedbagRespondAuthorizeToClient uint16 = 0x001B
  1048. FeedbagBuddyAdded uint16 = 0x001C
  1049. FeedbagRequestAuthorizeToBadog uint16 = 0x001D
  1050. FeedbagRespondAuthorizeToBadog uint16 = 0x001E
  1051. FeedbagBuddyAddedToBadog uint16 = 0x001F
  1052. FeedbagTestSnac uint16 = 0x0021
  1053. FeedbagForwardMsg uint16 = 0x0022
  1054. FeedbagIsAuthRequiredQuery uint16 = 0x0023
  1055. FeedbagIsAuthRequiredReply uint16 = 0x0024
  1056. FeedbagRecentBuddyUpdate uint16 = 0x0025
  1057. )
  1058. type SNAC_0x13_0x02_FeedbagRightsQuery struct {
  1059. TLVRestBlock
  1060. }
  1061. type SNAC_0x13_0x03_FeedbagRightsReply struct {
  1062. TLVRestBlock
  1063. }
  1064. type SNAC_0x13_0x05_FeedbagQueryIfModified struct {
  1065. LastUpdate uint32
  1066. Count uint8
  1067. }
  1068. type SNAC_0x13_0x06_FeedbagReply struct {
  1069. Version uint8
  1070. Items []FeedbagItem `count_prefix:"uint16"`
  1071. LastUpdate uint32
  1072. }
  1073. type SNAC_0x13_0x08_FeedbagInsertItem struct {
  1074. Items []FeedbagItem
  1075. }
  1076. type SNAC_0x13_0x09_FeedbagUpdateItem struct {
  1077. Items []FeedbagItem
  1078. }
  1079. type SNAC_0x13_0x0A_FeedbagDeleteItem struct {
  1080. Items []FeedbagItem
  1081. }
  1082. type SNAC_0x13_0x0E_FeedbagStatus struct {
  1083. Results []uint16
  1084. }
  1085. type SNAC_0x13_0x11_FeedbagStartCluster struct {
  1086. TLVRestBlock
  1087. }
  1088. //
  1089. // 0x17: BUCP
  1090. //
  1091. const (
  1092. BUCPErr uint16 = 0x0001
  1093. BUCPLoginRequest uint16 = 0x0002
  1094. BUCPLoginResponse uint16 = 0x0003
  1095. BUCPRegisterRequest uint16 = 0x0004
  1096. BUCPChallengeRequest uint16 = 0x0006
  1097. BUCPChallengeResponse uint16 = 0x0007
  1098. BUCPAsasnRequest uint16 = 0x0008
  1099. BUCPSecuridRequest uint16 = 0x000A
  1100. BUCPRegistrationImageRequest uint16 = 0x000C
  1101. )
  1102. type SNAC_0x17_0x02_BUCPLoginRequest struct {
  1103. TLVRestBlock
  1104. }
  1105. type SNAC_0x17_0x03_BUCPLoginResponse struct {
  1106. TLVRestBlock
  1107. }
  1108. type SNAC_0x17_0x06_BUCPChallengeRequest struct {
  1109. TLVRestBlock
  1110. }
  1111. type SNAC_0x17_0x07_BUCPChallengeResponse struct {
  1112. AuthKey string `len_prefix:"uint16"`
  1113. }
  1114. //
  1115. // 0x18: Alert
  1116. //
  1117. const (
  1118. AlertErr uint16 = 0x0001
  1119. AlertSetAlertRequest uint16 = 0x0002
  1120. AlertSetAlertReply uint16 = 0x0003
  1121. AlertGetSubsRequest uint16 = 0x0004
  1122. AlertGetSubsResponse uint16 = 0x0005
  1123. AlertNotifyCapabilities uint16 = 0x0006
  1124. AlertNotify uint16 = 0x0007
  1125. AlertGetRuleRequest uint16 = 0x0008
  1126. AlertGetRuleReply uint16 = 0x0009
  1127. AlertGetFeedRequest uint16 = 0x000A
  1128. AlertGetFeedReply uint16 = 0x000B
  1129. AlertRefreshFeed uint16 = 0x000D
  1130. AlertEvent uint16 = 0x000E
  1131. AlertQogSnac uint16 = 0x000F
  1132. AlertRefreshFeedStock uint16 = 0x0010
  1133. AlertNotifyTransport uint16 = 0x0011
  1134. AlertSetAlertRequestV2 uint16 = 0x0012
  1135. AlertSetAlertReplyV2 uint16 = 0x0013
  1136. AlertTransitReply uint16 = 0x0014
  1137. AlertNotifyAck uint16 = 0x0015
  1138. AlertNotifyDisplayCapabilities uint16 = 0x0016
  1139. AlertUserOnline uint16 = 0x0017
  1140. )
  1141. type TLVUserInfo struct {
  1142. ScreenName string `len_prefix:"uint8"`
  1143. WarningLevel uint16
  1144. TLVBlock
  1145. }
  1146. type FeedbagItem struct {
  1147. Name string `len_prefix:"uint16"`
  1148. GroupID uint16
  1149. ItemID uint16
  1150. ClassID uint16
  1151. TLVLBlock
  1152. }