SYMBOL: opcode
SYMBOL: snac-flags
SYMBOL: snac-request-id
+SYMBOL: extra-data
SYMBOL: name
SYMBOL: message
{{ }} clone banned-hash-name set
{{ }} clone banned-hash-id set
<queue> modify-queue set
- ! 65535 random-int seq-num set
- 0 seq-num set
+ HEX: 7fff random-int seq-num set
1 stage-num set ;
: prepend-aim-protocol ( data -- )
stage-num get >byte
seq-num get >short
] "" make
- seq-num [ 1+ ] change
+ seq-num get dup HEX: 7fff >= [ 0 ] [ 1+ ] if seq-num set
swap dup >r length (>short) r> append append ;
: (send-aim) ( str -- )
head-short family set
head-short opcode set
head-short snac-flags set
- head-int snac-request-id set ;
+ head-int snac-request-id set
+ snac-flags get HEX: 8000 bitand 0 > [
+ head-short head-string extra-data set
+ extra-data get "Extra data: " writeln hexdump
+ ] when ;
: (unhandled-opcode) ( str -- )
! "Family: " write family get >hex write
(handle-supported-families)
] unless ;
+! : unscoped-stream get empty? [
+ ! head-short
+ ! [
+ ! head-short
+ ! head-short head-string <string-reader> [
+ ! cond
+ ! ] with-unscoped-stream
+ ! ] repeat
+ ! ] unless ;
+
: handle-supported-families
"Families: " print
(handle-supported-families)
] unless ;
: handle-online-info
- snac-flags get 32768 = [
- head-short drop
- head-short drop
- head-short drop
- head-short drop
- ] when
(handle-online-info)
; FAMILY: 1 OPCODE: f
] repeat ; FAMILY: 3 OPCODE: c
: parse-family-4h-header
- head-short drop
- head-short drop
- head-short drop
- head-short drop
- 8 head-string drop
- head-short channel set ;
+ extra-data get <string-reader> [
+ head-short drop
+ head-short drop
+ head-short drop
+ ] with-unscoped-stream ;
: parse-message-text ( -- str )
head-short drop head-short drop head-contents ;
: handle-incoming-message ( -- )
parse-family-4h-header
+ head-longlong drop
+ head-short channel set
head-byte head-string name set
head-short warning set
head-short parse-message-tlv
: handle-typing-message ( -- )
parse-family-4h-header
+ head-longlong drop
+ head-short channel set
head-byte head-string write
head-short
{
: second-server
aim-chat-ip get aim-chat-port get <client> conn set
1 stage-num set
- 65535 random-int seq-num set
+ HEX: 7fff random-int seq-num set
send-second-login read-aim drop
2 stage-num set ;