Subversion Repositories Kolibri OS

Rev

Rev 4622 | Rev 4659 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                                 ;;
  3. ;; Copyright (C) KolibriOS team 2004-2014. All rights reserved.    ;;
  4. ;; Distributed under terms of the GNU General Public License       ;;
  5. ;;                                                                 ;;
  6. ;;   Written by hidnplayr@kolibrios.org                            ;;
  7. ;;                                                                 ;;
  8. ;;         GNU GENERAL PUBLIC LICENSE                              ;;
  9. ;;          Version 2, June 1991                                   ;;
  10. ;;                                                                 ;;
  11. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  12.  
  13.  
  14. server_parser:
  15.  
  16.         mov     esi, servercommand
  17.  
  18.         cmp     byte [esi], ':'
  19.         jne     .parse
  20.  
  21.   .spaceloop:
  22.         lodsb
  23.         test    al, al
  24.         jz      .fail
  25.         cmp     al, ' '
  26.         jne     .spaceloop
  27.  
  28.   .parse:
  29.         mov     eax, [esi]
  30.         or      eax, 0x20202020
  31.         mov     edi, server_commands
  32.         mov     ecx, server_commands.number
  33.  
  34.   .loop:
  35.         scasd
  36.         je      .got_cmd
  37.         add     edi, 4
  38.         dec     ecx
  39.         jnz     .loop
  40.  
  41.   .fail:
  42.         ret
  43.  
  44.   .got_cmd:
  45.         jmp     dword[edi]
  46.  
  47.  
  48. server_commands:
  49.  
  50.         dd      '001 ', cmd_justprint
  51.         dd      '002 ', cmd_justprint
  52.         dd      '003 ', cmd_justprint
  53.         dd      '004 ', cmd_justprint
  54.         dd      '005 ', cmd_justprint
  55.  
  56.         dd      '250 ', cmd_justprint
  57.         dd      '251 ', cmd_justprint
  58.         dd      '252 ', cmd_justprint
  59.         dd      '253 ', cmd_justprint
  60.         dd      '254 ', cmd_justprint
  61.         dd      '255 ', cmd_justprint
  62.  
  63.         dd      '265 ', cmd_justprint
  64.         dd      '266 ', cmd_justprint
  65.  
  66.         dd      '322 ', cmd_322         ; RPL_LIST
  67.         dd      '323 ', cmd_323         ; RPL_LISTEND
  68.         dd      '324 ', cmd_justprint
  69.         dd      '328 ', cmd_justprint   ; RPL_CHANNEL_URL
  70.         dd      '329 ', cmd_justprint
  71.         dd      '332 ', cmd_topic
  72.         dd      '333 ', cmd_333         ; nickname and time of topic
  73.         dd      '353 ', cmd_353         ; name reply
  74.         dd      '366 ', cmd_366         ; end of names list
  75.         dd      '372 ', cmd_justprint   ; motd
  76.         dd      '375 ', cmd_justprint   ; start of motd
  77.         dd      '376 ', cmd_justprint   ; end of motd
  78.         dd      '421 ', cmd_justprint   ; unknown command
  79.         dd      '433 ', cmd_justprint   ; nickname already in use
  80.  
  81.         dd      'join', cmd_join
  82.         dd      'kick', cmd_kick
  83.         dd      'mode', cmd_mode
  84.         dd      'nick', cmd_nick
  85.         dd      'part', cmd_part
  86.         dd      'ping', cmd_ping
  87.         dd      'priv', cmd_privmsg
  88.         dd      'quit', cmd_quit
  89.         dd      'noti', cmd_notice
  90.  
  91.         .number = ($ - server_commands) / 8
  92.  
  93.  
  94. align 4
  95. compare_to_nick:
  96.  
  97.         push    esi
  98.         mov     ecx, MAX_NICK_LEN
  99.         mov     esi, user_nick
  100.   .loop:
  101.         lodsb
  102.         cmp     al, ' '
  103.         jbe     .done
  104.         test    al, al
  105.         jz      .done
  106.         cmp     al, 'a'
  107.         jb      .ok
  108.         cmp     al, 'z'
  109.         ja      .ok
  110.         sub     al, 0x20
  111.   .ok:
  112.  
  113.         mov     bl, byte[edi]
  114.         cmp     bl, 'a'
  115.         jb      .ok2
  116.         cmp     bl, 'z'
  117.         ja      .ok2
  118.         sub     bl, 0x20
  119.   .ok2:
  120.         cmp     bl, al
  121.         jne     .not_equal
  122.         inc     edi
  123.         dec     ecx
  124.         jnz     .loop
  125.  
  126.   .done:
  127.         xor     eax, eax
  128.         pop     esi
  129.         ret
  130.  
  131.   .not_equal:
  132.         or      eax, -1
  133.         pop     esi
  134.         ret
  135.  
  136.  
  137.  
  138. align 4
  139. skip_parameter:
  140.  
  141. ; First: skip the parameter (scan untill space or colon)
  142.   .part1:
  143.         lodsb
  144.         cmp     al, ' '
  145.         je      .part2
  146.         cmp     al, ':'
  147.         jne     .part1
  148.  
  149. ; Skip all trailing spaces
  150.   .part3:
  151.         lodsb
  152.         cmp     al, ' '
  153.         je      .part3
  154.         dec     esi
  155.         ret
  156.  
  157. ; Now, skip all trailing spaces and first semicolon
  158.   .part2:
  159.         lodsb
  160.         cmp     al, ' '
  161.         je      .part2
  162.         cmp     al, ':'
  163.         je      .part3
  164.         dec     esi
  165.         ret
  166.  
  167.  
  168.  
  169.  
  170.  
  171. cmd_justprint:
  172.  
  173.         add     esi, 4
  174.         call    skip_parameter          ; our nickname
  175.  
  176.         call    print_asciiz
  177.  
  178.         mov     al, 10
  179.         call    print_char
  180.  
  181.         ret
  182.  
  183.  
  184. cmd_notice:
  185.  
  186.         if TIMESTAMP
  187.         call    print_timestamp
  188.         end if
  189.  
  190.         cmp     byte[servercommand], ':'
  191.         jne     .gogogo
  192.  
  193.         mov     byte [esi-1], 0
  194.         push    esi
  195.         mov     esi, str_1
  196.         call    print_asciiz
  197.         mov     esi, servercommand+1
  198.         mov     bl, '!'
  199.         call    print_string
  200.         mov     esi, str_2
  201.         call    print_asciiz
  202.         pop     esi
  203.  
  204.   .gogogo:
  205.         add     esi, 6
  206.         call    skip_parameter
  207.         call    skip_parameter
  208.         call    print_asciiz
  209.  
  210.         mov     al, 10
  211.         call    print_char
  212.  
  213.         ret
  214.  
  215.  
  216.  
  217. cmd_ping:
  218.  
  219. ; Just change PING to PONG
  220.         mov     dword[esi], 'PONG'
  221.  
  222. ; Find the end of the command
  223.         lea     edi, [esi + 5]
  224.         xor     al, al
  225.         repne   scasb
  226.  
  227. ; Now send it back
  228.         mov     edx, esi
  229.         mov     esi, edi
  230.         mov     word [esi], 0x0d0a
  231.         inc     esi
  232.         inc     esi
  233.         sub     esi, edx
  234.         mcall   send, [socketnum], , , 0
  235.  
  236.         ret
  237.  
  238.  
  239.  
  240. cmd_privmsg:
  241.  
  242.         mov     eax, dword[esi+4]
  243.         or      eax, 0x20202020
  244.         cmp     eax, 'msg '
  245.         jne     .fail
  246.         add     esi, 8          ; skip 'PRIVMSG '
  247.  
  248.         mov     edi, esi
  249.         call    compare_to_nick
  250.         jne     .channel
  251.  
  252. ; private chat message
  253.         push    esi
  254.         mov     esi, servercommand+1
  255.         call    window_open
  256.         test    ebx, ebx
  257.         jz      .fail2
  258.         pop     esi
  259.         call    skip_parameter  ; our own nickname
  260.  
  261.         cmp     byte[esi], 1    ; Client to Client protocol?
  262.         je      cmd_ctcp
  263.  
  264.         jmp     .print
  265.  
  266.   .channel:
  267.         call    window_open
  268.         test    ebx, ebx
  269.         jz      .fail
  270.  
  271.   .print:
  272. ; nope, just plain old privmsg, print it using '<nick> message' format
  273.         if TIMESTAMP
  274.         call    print_timestamp
  275.         end if
  276.  
  277.         push    esi
  278.         mov     al, '<'
  279.         call    print_char
  280.  
  281.         mov     esi, servercommand+1
  282.         mov     bl, '!'
  283.         call    print_string
  284.  
  285.         mov     al, '>'
  286.         call    print_char
  287.  
  288.         mov     al, ' '
  289.         call    print_char
  290.  
  291.         pop     esi
  292.         call    print_asciiz
  293.  
  294.         mov     al, 10
  295.         call    print_char
  296.  
  297.         ret
  298.  
  299.   .fail2:
  300.         pop     esi
  301.   .fail:
  302.         ret
  303.  
  304.  
  305.  
  306.  
  307. cmd_ctcp:
  308.  
  309.         inc     esi
  310.         mov     eax, dword[esi]
  311.         or      eax, 0x20202020
  312.  
  313.         cmp     eax, 'vers'
  314.         je      .version
  315.         cmp     eax, 'time'
  316.         je      .time
  317.         cmp     eax, 'ping'
  318.         je      .ping
  319.         cmp     eax, 'acti'
  320.         je      .action
  321.         cmp     eax, 'dcc '    ; TODO
  322.         je      cmd_dcc
  323.  
  324. ; Unknown CTCP command: TODO: just print to window??
  325.  
  326.   .fail:
  327.  
  328.         ret
  329.  
  330.   .time:
  331.         mov     byte[esi+4], ' '
  332.         lea     edi, [esi+5]
  333.  
  334.         ; TODO: add system date (fn 29) in human readable format
  335.  
  336.         mcall   3                       ; get system time
  337.  
  338.         mov     ecx, 3
  339.   .timeloop:
  340.         mov     bl, al
  341.         shr     al, 4
  342.         add     al, '0'
  343.         stosb
  344.  
  345.         mov     al, bl
  346.         and     al, 0x0f
  347.         add     al, '0'
  348.         stosb
  349.  
  350.         dec     ecx
  351.         jz      .timedone
  352.  
  353.         mov     al, ':'
  354.         stosb
  355.         shr     eax, 8
  356.         jmp     .timeloop
  357.  
  358.   .timedone:
  359.         xor     al, al
  360.         stosb
  361.         call    ctcp_reply
  362.  
  363.         if TIMESTAMP
  364.         call    print_timestamp
  365.         end if
  366.  
  367.         mov     esi, ctcp_header
  368.         call    print_asciiz
  369.  
  370.         mov     esi, servercommand+1
  371.         call    print_asciiz
  372.  
  373.         mov     esi, ctcp_time
  374.         call    print_asciiz
  375.  
  376.         ret
  377.  
  378.   .version:
  379.         mov     esi, str_version
  380.         call    ctcp_reply
  381.  
  382.         if TIMESTAMP
  383.         call    print_timestamp
  384.         end if
  385.  
  386.         mov     esi, ctcp_header
  387.         call    print_asciiz
  388.  
  389.         mov     esi, servercommand+1
  390.         call    print_asciiz
  391.  
  392.         mov     esi, ctcp_version
  393.         call    print_asciiz
  394.  
  395.         ret
  396.  
  397.   .ping:
  398.         call    ctcp_reply
  399.  
  400.         if TIMESTAMP
  401.         call    print_timestamp
  402.         end if
  403.  
  404.         mov     esi, ctcp_header
  405.         call    print_asciiz
  406.  
  407.         mov     esi, servercommand+1
  408.         call    print_asciiz
  409.  
  410.         mov     esi, ctcp_ping
  411.         call    print_asciiz
  412.  
  413.         ret
  414.  
  415.   .action:
  416.         add     esi, 7
  417.         push    esi
  418.  
  419.         if TIMESTAMP
  420.         call    print_timestamp
  421.         end if
  422.  
  423.         mov     esi, action_header
  424.         call    print_asciiz
  425.  
  426.         mov     esi, servercommand+1    ; print nickname
  427.         mov     bl, '!'
  428.         call    print_string
  429.  
  430.         mov     al, ' '
  431.         call    print_char
  432.  
  433.         pop     esi
  434.         call    print_asciiz
  435.  
  436.         mov     al, 10
  437.         call    print_char
  438.  
  439.         ret
  440.  
  441.  
  442. cmd_dcc:
  443.         add     esi, 4
  444.         mov     eax, dword[esi]
  445.         or      eax, 0x202020
  446.  
  447.         cmp     eax, 'send'
  448.         je      .send
  449.  
  450.         ret
  451.  
  452.   .send:
  453.         call    window_open
  454.         test    ebx, ebx
  455.         jz      .fail
  456.         mov     [ebx + window.type], WINDOWTYPE_DCC
  457.  
  458.   .fail:
  459.  
  460.         ret
  461.  
  462.  
  463.  
  464. ctcp_reply:
  465.  
  466.         push    esi
  467.         mov     dword [usercommand], 'NOTI'
  468.         mov     dword [usercommand+4], 'CE  '
  469.  
  470.         mov     esi, servercommand+1
  471.         mov     edi, usercommand+7
  472.   .nickloop:
  473.         lodsb
  474.         cmp     al, '!'
  475.         je      .done
  476.         cmp     al, ' '
  477.         je      .done
  478.         test    al, al
  479.         je      .fail
  480.         stosb
  481.         jmp     .nickloop
  482.   .done:
  483.         mov     byte [esi-1], 0
  484.         mov     ax, ' :'
  485.         stosw
  486.         mov     al, 1
  487.         stosb
  488.  
  489.         pop     esi
  490.   .replyloop:
  491.         lodsb
  492.         cmp     al, 1
  493.         jbe     .done2
  494.         stosb
  495.         jmp     .replyloop
  496.   .done2:
  497.  
  498.         mov     al, 1
  499.         stosb
  500.         mov     ax, 0x0a0d
  501.         stosw
  502.  
  503.         lea     esi, [edi - usercommand]
  504.         mcall   send, [socketnum], usercommand, , 0
  505.   .fail:
  506.         ret
  507.  
  508.  
  509.  
  510. cmd_part:
  511.  
  512.         cmp     byte [esi+4], ' '
  513.         jne     .fail
  514.         add     esi, 5  ; skip 'PART '
  515.  
  516. ; Is it me who parted?
  517.         mov     edi, servercommand+1
  518.         call    compare_to_nick
  519.         jne     .not_me
  520.  
  521. ; yes, close the window (if its open)
  522.         call    window_find
  523.         test    ebx, ebx
  524.         jz      @f
  525.         call    window_close
  526.   @@:
  527.   .fail:
  528.  
  529.         ret
  530.  
  531.  
  532. ; somebody else parted, just print message
  533.   .not_me:
  534.         push    esi
  535.         call    window_open
  536.         test    ebx, ebx
  537.         jz      .fail2
  538.  
  539.         if TIMESTAMP
  540.         call    print_timestamp
  541.         end if
  542.  
  543.         mov     esi, part_header
  544.         call    print_asciiz
  545.  
  546.         mov     esi, servercommand+1
  547.         mov     bl, '!'
  548.         call    print_string
  549.  
  550.         mov     esi, has_left_channel
  551.         call    print_asciiz
  552.  
  553.         pop     esi
  554.         call    print_asciiz
  555.  
  556.         mov     al, 10
  557.         call    print_char
  558.  
  559.         mov     ebx, [window_print]
  560.         mov     esi, servercommand+1
  561.         call    user_remove
  562.  
  563.         ret
  564.  
  565.   .fail2:
  566.         pop     esi
  567.  
  568.         ret
  569.  
  570.  
  571.  
  572. cmd_join:
  573.  
  574.         cmp     byte[esi+4], ' '
  575.         jne     .fail
  576.         add     esi, 5  ; skip 'JOIN '
  577.  
  578. ; did we join a channel?
  579.         mov     edi, servercommand+1
  580.         call    compare_to_nick
  581.         jne     .not_me
  582.  
  583.         push    esi
  584.         call    window_open
  585.         test    ebx, ebx
  586.         jz      .fail
  587.         mov     [ebx + window.type], WINDOWTYPE_CHANNEL
  588.         mov     [window_active], ebx
  589.  
  590.         if TIMESTAMP
  591.         call    print_timestamp
  592.         end if
  593.  
  594.         mov     esi, join_header
  595.         call    print_asciiz
  596.  
  597.         mov     esi, str_talking
  598.         call    print_asciiz
  599.  
  600.         pop     esi
  601.         mov     bl, ' '
  602.         call    print_string
  603.  
  604.         mov     al, 10
  605.         call    print_char
  606.  
  607.         call    draw_window
  608.  
  609.         ret
  610.  
  611.   .not_me:
  612.         push    esi
  613.         call    window_open
  614.         test    ebx, ebx
  615.         jz      .fail
  616.  
  617.         if TIMESTAMP
  618.         call    print_timestamp
  619.         end if
  620.  
  621.         mov     esi, join_header
  622.         call    print_asciiz
  623.  
  624.         mov     esi, servercommand+1
  625.         mov     bl, '!'
  626.         call    print_string
  627.  
  628.         mov     esi, joins_channel
  629.         call    print_asciiz
  630.  
  631.         pop     esi
  632.         call    print_asciiz
  633.  
  634.         mov     al, 10
  635.         call    print_char
  636.  
  637.         mov     ebx, [window_print]
  638.         mov     esi, servercommand+1
  639.         call    user_add
  640.  
  641.         ret
  642.  
  643.   .fail:
  644.         pop     esi
  645.         ret
  646.  
  647.  
  648.  
  649.  
  650. cmd_nick:
  651.  
  652.         cmp     byte[esi+4], ' '
  653.         jne     .fail
  654.         add     esi, 5          ; skip 'NICK '
  655.         cmp     byte[esi], ':'
  656.         jne     @f
  657.         inc     esi
  658.   @@:
  659.  
  660. ; Is it me who changed nick?
  661.         push    esi
  662.         mov     edi, servercommand+1
  663.         call    compare_to_nick
  664.         jne     .not_me
  665.  
  666. ; Yup, update user_nick
  667.         mov     ecx, MAX_NICK_LEN-1
  668.         mov     esi, [esp]
  669.         mov     edi, user_nick
  670.   @@:
  671.         lodsb
  672.         test    al, al
  673.         jz      @f
  674.         cmp     al, ' '
  675.         je      @f
  676.         cmp     al, 10
  677.         je      @f
  678.         cmp     al, 13
  679.         je      @f
  680.         cmp     al, ':'
  681.         je      @r
  682.         stosb
  683.         dec     ecx
  684.         jnz     @r
  685.   @@:
  686.         xor     al, al
  687.         stosb
  688.   .not_me:
  689.  
  690. ; Update in userlist
  691.         mov     ebx, windows
  692.         mov     ecx, MAX_WINDOWS
  693.   .window_loop:
  694.         push    ecx ebx
  695.         cmp     [ebx + window.type], WINDOWTYPE_CHANNEL
  696.         jne     .next_window
  697.  
  698.         mov     esi, servercommand+1
  699.         call    user_remove
  700.         test    edi, edi
  701.         jz      .next_window
  702.  
  703.         mov     esi, [esp + 8]
  704.         call    user_add
  705.  
  706. ; And print a notification in the channel
  707.         mov     [window_print], ebx
  708.  
  709.         if TIMESTAMP
  710.         call    print_timestamp
  711.         end if
  712.  
  713.         mov     esi, nick_header
  714.         call    print_asciiz
  715.  
  716.         mov     esi, servercommand+1
  717.         mov     bl, '!'
  718.         call    print_string
  719.  
  720.         mov     esi, is_now_known_as
  721.         call    print_asciiz
  722.  
  723.         mov     esi, [esp + 8]
  724.         call    print_asciiz
  725.  
  726.         mov     al, 10
  727.         call    print_char
  728.  
  729. ; Now do this for all open windows
  730.   .next_window:
  731.         pop     ebx ecx
  732.         add     ebx, sizeof.window
  733.         dec     ecx
  734.         jnz     .window_loop
  735.  
  736.         pop     esi
  737.  
  738.   .fail:
  739.  
  740.         ret
  741.  
  742.  
  743.  
  744.  
  745. cmd_kick:
  746.  
  747.         cmp     byte [esi+4], ' '
  748.         jne     .fail
  749.         add     esi, 5  ; skip 'KICK '
  750.  
  751. ; TODO: Is it me who got kicked?
  752. ; if so, mark channel as disconnected
  753.  
  754.   .not_me:
  755. ; find the channel user has been kicked from
  756.         push    esi
  757.         call    window_open
  758.         test    ebx, ebx
  759.         jz      .fail
  760.         push    esi
  761.  
  762.         if TIMESTAMP
  763.         call    print_timestamp
  764.         end if
  765.  
  766.         mov     esi, kick_header
  767.         call    print_asciiz
  768.  
  769.         pop     esi
  770.         mov     bl, ' '
  771.         call    print_string
  772.  
  773.         mov     esi, str_kicked
  774.         call    print_asciiz
  775.  
  776.         pop     esi
  777.         mov     bl, ' '
  778.         call    print_string
  779.  
  780.         mov     esi, str_by
  781.         call    print_asciiz
  782.  
  783.         mov     esi, servercommand+1
  784.         mov     bl, '!'
  785.         call    print_string
  786.  
  787.         mov     al, 10
  788.         call    print_char
  789.  
  790.         mov     ebx, [window_print]
  791.         mov     esi, servercommand+1
  792.         call    user_remove
  793.  
  794.         ret
  795.  
  796.   .fail:
  797.         pop     esi
  798.  
  799.         ret
  800.  
  801.  
  802.  
  803. cmd_quit:
  804.  
  805.         cmp     byte [esi+4], ' '
  806.         jne     .fail
  807.  
  808.         mov     ebx, windows
  809.         mov     ecx, MAX_WINDOWS
  810.  
  811.   .window_loop:
  812.         push    ecx
  813.         cmp     [ebx + window.type], WINDOWTYPE_CHANNEL
  814.         jne     .next_window
  815.  
  816.         mov     esi, servercommand+1
  817.         call    user_remove
  818.         test    edi, edi
  819.         jz      .next_window
  820.  
  821.         push    ebx
  822.         mov     [window_print], ebx
  823.  
  824.         if TIMESTAMP
  825.         call    print_timestamp
  826.         end if
  827.  
  828.         mov     esi, quit_header
  829.         call    print_asciiz
  830.  
  831.         mov     esi, servercommand+1
  832.         mov     bl, '!'
  833.         call    print_string
  834.  
  835.         mov     esi, has_quit_irc
  836.         call    print_asciiz
  837.  
  838. ; TODO: check if quit message was given, and print it to the window
  839.         pop     ebx
  840.   .next_window:
  841.         pop     ecx
  842.         add     ebx, sizeof.window
  843.         dec     ecx
  844.         jnz     .window_loop
  845.  
  846.   .fail:
  847.  
  848.  
  849.         ret
  850.  
  851.  
  852.  
  853. cmd_mode:
  854.  
  855.         cmp     byte [esi+4], ' '
  856.         jne     .fail
  857.         add     esi, 5  ; skip 'MODE '
  858.         push    esi
  859.         call    window_find
  860.         test    ebx, ebx
  861.         jz      .user
  862.         mov     [esp], esi
  863.         mov     [window_print], ebx
  864.  
  865.         if TIMESTAMP
  866.         call    print_timestamp
  867.         end if
  868.  
  869.         mov     esi, mode_header
  870.         call    print_asciiz
  871.  
  872.         mov     esi, servercommand+1
  873.         mov     bl, '!'
  874.         call    print_string
  875.  
  876.         mov     esi, sets_mode
  877.         call    print_asciiz
  878.  
  879.         pop     esi
  880.         call    print_asciiz
  881.  
  882.         mov     al, 10
  883.         call    print_char
  884.  
  885. ; TODO: keep track of user modes in username list
  886.  
  887.   .fail:
  888.         ret
  889.  
  890.  
  891.   .user:
  892.         if TIMESTAMP
  893.         call    print_timestamp
  894.         end if
  895.  
  896.         mov     esi, mode_header
  897.         call    print_asciiz
  898.  
  899.         mov     esi, [esp]
  900.         mov     bl, ' '
  901.         call    print_string
  902.  
  903.         mov     esi, sets_mode
  904.         call    print_asciiz
  905.  
  906.         pop     esi
  907.         call    skip_parameter
  908.         call    print_asciiz
  909.  
  910.         mov     al, 10
  911.         call    print_char
  912.  
  913.         ret
  914.  
  915.  
  916. cmd_353:                ; channel usernames reply
  917.  
  918.         add     esi, 4  ; skip '353 '
  919.         call    skip_parameter
  920.         inc     esi     ; channel type '*', '=' or '@'
  921.         inc     esi     ; ' '
  922.         call    window_open
  923.         test    ebx, ebx
  924.         jz      .fail
  925.  
  926. ; now find window ptr and check if this is the first 353 message
  927.         mov     ebx, [window_print]
  928.         test    [ebx + window.flags], FLAG_RECEIVING_NAMES
  929.         jnz     .add
  930.  
  931.         or      [ebx + window.flags], FLAG_RECEIVING_NAMES
  932. ;        mov     [ebx + window.users], 0
  933.         ; TODO: remove all users?
  934.  
  935.   .add:
  936.         push    esi
  937.         call    user_add
  938.         pop     esi
  939.  
  940.   .namesloop:
  941.         lodsb
  942.         test    al, al
  943.         jz      .done
  944.         cmp     al, ' '                 ; names list is separated with spaces
  945.         jne     .namesloop
  946.         jmp     .add
  947.  
  948.   .done:
  949.         call    draw_channel_list
  950.   .fail:
  951.  
  952.         ret
  953.  
  954.  
  955.  
  956.  
  957.  
  958. cmd_366:        ; channel usernames end
  959.  
  960.         add     esi, 4          ; skip '366 '
  961.         call    skip_parameter
  962.         call    window_open
  963.         test    ebx, ebx
  964.         jz      .fail
  965.         and     [ebx + window.flags], not FLAG_RECEIVING_NAMES
  966.   .fail:
  967.  
  968.         ret
  969.  
  970.  
  971.  
  972.  
  973. cmd_topic:
  974.  
  975.         add     esi, 4          ; skip '332 '
  976.         call    skip_parameter
  977.         call    window_open
  978.         test    ebx, ebx
  979.         jz      .fail
  980.  
  981.         if TIMESTAMP
  982.         call    print_timestamp
  983.         end if
  984.  
  985.         push    esi
  986.         mov     esi, topic_header
  987.         call    print_asciiz
  988.  
  989.         mov     esi, str_topic
  990.         call    print_asciiz
  991.  
  992.         pop     esi
  993.         call    print_asciiz
  994.  
  995.         mov     esi, str_topic_end
  996.         call    print_asciiz
  997.  
  998.   .fail:
  999.  
  1000.         ret
  1001.  
  1002.  
  1003. cmd_333:
  1004.  
  1005.         add     esi, 4          ; skip '333 '
  1006.         call    skip_parameter
  1007.         call    window_open
  1008.         test    ebx, ebx
  1009.         jz      .fail
  1010.  
  1011.         if TIMESTAMP
  1012.         call    print_timestamp
  1013.         end if
  1014.  
  1015.         push    esi
  1016.         mov     esi, topic_header
  1017.         call    print_asciiz
  1018.  
  1019.         mov     esi, str_setby
  1020.         call    print_asciiz
  1021.  
  1022.         pop     esi
  1023.         mov     bl, '!'
  1024.         call    print_string
  1025.  
  1026.         mov     al, 10
  1027.         call    print_char
  1028.  
  1029.   .fail:
  1030.  
  1031.         ret
  1032.  
  1033.  
  1034.  
  1035. cmd_322:        ; LIST
  1036.  
  1037.         add     esi, 4
  1038.         call    skip_parameter
  1039.  
  1040.         push    esi
  1041.         mov     esi, str_list
  1042.         call    window_open
  1043.         test    ebx, ebx
  1044.         jz      .fail
  1045.  
  1046.         mov     [window_active], ebx
  1047.         call    draw_windowtabs
  1048.         pop     esi
  1049.         call    print_asciiz
  1050.         mov     al, 10
  1051.         call    print_char
  1052.  
  1053.         ret
  1054.  
  1055.   .fail:
  1056.         pop     esi
  1057.  
  1058.         ret
  1059.  
  1060. cmd_323:        ; LIST END
  1061.  
  1062.         ret