Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                                 ;;
  3. ;; Copyright (C) KolibriOS team 2004-2018. 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. user_parser:
  15.  
  16.         mov     ebp, [window_active]                    ; print to the current window
  17.         mov     [window_print], ebp
  18.  
  19.         mov     ecx, [edit1.size]
  20.         test    ecx, ecx
  21.         jz      .ret                                    ; ignore empty commands
  22.  
  23.         mov     esi, input_text
  24.         mov     edi, user_command
  25.         call    recode                                  ; Convert to UTF-8
  26.         mov     word[edi], 0x0a0d                       ; terminate the line
  27.         sub     edi, user_command
  28.         mov     [user_command.size], edi
  29.  
  30.         cmp     byte[user_command], '/'                 ; is it a server command ?
  31.         je      .command
  32.  
  33.         cmp     [status], STATUS_LOGGED_IN
  34.         jne     .not_loggedin
  35.  
  36.         cmp     [ebp + window.type], WINDOWTYPE_CHANNEL
  37.         je      .send_privmsg
  38.         cmp     [ebp + window.type], WINDOWTYPE_CHAT
  39.         jne     .not_channel
  40.  
  41.   .send_privmsg:
  42.         if TIMESTAMP
  43.         call    print_timestamp
  44.         end if
  45.  
  46.         mov     al, '<'
  47.         call    print_char
  48.  
  49.         mov     esi, user_nick
  50.         call    print_asciiz
  51.  
  52.         mov     al, '>'
  53.         call    print_char
  54.         mov     al, ' '
  55.         call    print_char
  56.  
  57.         mov     eax, [user_command.size]
  58.         mov     byte[user_command + eax],0
  59.         mov     esi, user_command
  60.         call    print_asciiz
  61.  
  62.         mov     al, 10
  63.         call    print_char
  64.  
  65. ; and now send it to the server
  66.         mov     dword[packetbuf], 'PRIV'
  67.         mov     dword[packetbuf+4], 'MSG '
  68.  
  69.         lea     esi, [ebp + window.name]
  70.         mov     edi, packetbuf+8
  71.         mov     ecx, MAX_WINDOWNAME_LEN
  72.   .loop:
  73.         lodsb
  74.         test    al, al
  75.         jz      .done
  76.         stosb
  77.         dec     ecx
  78.         jnz     .loop
  79.   .done:
  80.  
  81.         mov     ax, ' :'
  82.         stosw
  83.  
  84.         mov     esi, user_command
  85.         mov     ecx, [user_command.size]
  86. ;        inc     ecx
  87.         rep     movsb
  88.  
  89. ; end the command with a CRLF
  90.         mov     ax, 0x0a0d
  91.         stosw
  92.  
  93.         lea     esi, [edi - packetbuf]
  94.         mcall   send, [socketnum], packetbuf, , 0
  95.  
  96.   .ret:
  97.         ret
  98.  
  99. ; Text begins with a '/' lets try to find the command in the lookup table.
  100.   .command:
  101.         mov     eax, dword[user_command+1]      ; skip '/'
  102.         or      eax, 0x20202020                 ; convert to lowercase
  103.  
  104.         mov     edi, user_commands
  105.         mov     ecx, user_commands.number
  106.         cmp     [status], STATUS_CONNECTED
  107.         jae     .cmd_loop
  108.         mov     ecx, user_commands.number2
  109.   .cmd_loop:
  110.         scasd
  111.         je      .got_cmd
  112.         add     edi, 4
  113.         dec     ecx
  114.         jnz     .cmd_loop
  115.  
  116.         cmp     [status], STATUS_CONNECTED
  117.         jb      .not_connected
  118.  
  119. ; Commands shorter then 3 chars are placed here
  120.         and     eax, 0x00ffffff
  121.         cmp     eax, 'me '
  122.         je      cmd_usr_me
  123.  
  124. ; If none of the listed commands, send text straight to server
  125.         jmp     cmd_usr_send
  126.  
  127.   .got_cmd:
  128.         jmp     dword[edi]
  129.  
  130.   .not_loggedin:
  131.         mov     esi, str_notloggedin
  132.         call    print_asciiz
  133.         ret
  134.  
  135.   .not_connected:
  136.         mov     esi, str_notconnected
  137.         call    print_asciiz
  138.         ret
  139.  
  140.   .not_channel:
  141.         mov     esi, str_notchannel
  142.         call    print_asciiz
  143.         ret
  144.  
  145.  
  146. ; user commands lookup table
  147. user_commands:
  148.         dd      'nick', cmd_usr_nick
  149.         dd      'real', cmd_usr_real
  150.         dd      'serv', cmd_usr_server
  151.         dd      'help', cmd_usr_help
  152.         dd      'code', cmd_usr_code
  153.  
  154.         .number2 = ($ - user_commands) / 8
  155.  
  156. ; All following commands require a connection to the server.
  157.         dd      'quer', cmd_usr_quer
  158.         dd      'quit', cmd_usr_quit
  159.         dd      'part', cmd_usr_part
  160.         dd      'ctcp', cmd_usr_ctcp
  161.         dd      'msg ', cmd_usr_msg
  162.  
  163.         .number = ($ - user_commands) / 8
  164.  
  165.  
  166.  
  167. cmd_usr_msg:
  168.  
  169.         lea     esi, [user_command+5]
  170.  
  171.         mov     dword[packetbuf], 'PRIV'
  172.         mov     dword[packetbuf+4], 'MSG '
  173.         lea     edi, [packetbuf+8]
  174.  
  175.   @@:
  176.         lodsb
  177.         test    al, al
  178.         jz      .fail
  179.         cmp     al, 10
  180.         je      .fail
  181.         cmp     al, 13
  182.         je      .fail
  183.         stosb
  184.         cmp     al, ' '
  185.         jne     @r
  186.  
  187.         mov     al, ':'
  188.         stosb
  189.  
  190.         push    edi
  191.   @@:
  192.         lodsb
  193.         test    al, al
  194.         jz      @f
  195.         cmp     al, 10
  196.         je      @f
  197.         cmp     al, 13
  198.         je      @f
  199.         stosb
  200.         jmp     @r
  201.   @@:
  202. ; end the command with a CRLF
  203.         mov     ax, 0x0a0d
  204.         stosw
  205.         mov     byte[edi], 0
  206.  
  207. ; now print to the window
  208.         if TIMESTAMP
  209.         call    print_timestamp
  210.         end if
  211.  
  212.         mov     esi, msg_header
  213.         call    print_asciiz
  214.  
  215.         mov     esi, packetbuf+8
  216.         mov     bl, ' '
  217.         call    print_string
  218.  
  219.         mov     al, '*'
  220.         call    print_char
  221.  
  222.         mov     al, ' '
  223.         call    print_char
  224.  
  225.         pop     esi
  226.         push    esi
  227.         call    print_asciiz
  228.         pop     esi
  229.  
  230.  
  231.         lea     esi, [edi - packetbuf]
  232.         mcall   send, [socketnum], packetbuf, , 0
  233.  
  234.   .fail:
  235.         ret
  236.  
  237.  
  238.  
  239. cmd_usr_quit:
  240.  
  241.         mov     esi, quit_msg
  242.         cmp     byte[user_command+5], ' '
  243.         jne     quit_server
  244.         lea     esi, [user_command+6]
  245.  
  246. ; esi = quit message
  247. quit_server:
  248.  
  249. ; User wants to close a channel, send PART command to server
  250.         mov     dword[packetbuf], 'QUIT'
  251.         mov     word[packetbuf+4], ' :'
  252.         lea     edi, [packetbuf+6]
  253. ; Append our quit msg
  254.   @@:
  255.         lodsb
  256.         cmp     al, 13
  257.         je      @f
  258.         test    al, al
  259.         jz      @f
  260.         stosb
  261.         jmp     @r
  262.   @@:
  263. ; end the command with a CRLF
  264.         mov     ax, 0x0a0d
  265.         stosw
  266.  
  267.         lea     esi, [edi - packetbuf]                  ; calculate length
  268.         mcall   send, [socketnum], packetbuf, , 0       ; and finally send to server
  269.  
  270.         mov     ebp, windows
  271.   .window_loop:
  272.         cmp     [ebp + window.type], WINDOWTYPE_NONE
  273.         je      .next_window
  274.         mov     [window_print], ebp
  275.         if TIMESTAMP
  276.         call    print_timestamp
  277.         end if
  278.         mov     esi, str_disconnected
  279.         call    print_asciiz
  280.         cmp     [ebp + window.type], WINDOWTYPE_CHANNEL
  281.         jne     .next_window
  282.         call    user_remove_all
  283.   .next_window:
  284.         add     ebp, sizeof.window
  285.         cmp     ebp, windows + (MAX_WINDOWS * sizeof.window)
  286.         jb      .window_loop
  287.  
  288.         mov     [status], STATUS_DISCONNECTED
  289.         mcall   close, [socketnum]
  290.  
  291.         ret
  292.  
  293.  
  294.  
  295.  
  296. cmd_usr_nick:
  297.  
  298.         cmp     [user_command.size], 5
  299.         je      .justprint
  300.         cmp     byte[user_command+5], ' '
  301.         jne     .fail
  302.         cmp     [socketnum], 0
  303.         je      .dontsend
  304.  
  305. ; Request nickname change to server
  306.         mov     dword[user_command+1], 'NICK'
  307.         mov     esi, [user_command.size]
  308.         mov     word[user_command + esi], 0x0a0d
  309.         inc     esi
  310.         mcall   send, [socketnum], user_command+1, , 0
  311.  
  312.   .fail:
  313.         ret
  314.  
  315. ; We arent logged in yet, directly change user_nick field and print notification to user.
  316.   .dontsend:
  317.         mov     ecx, MAX_NICK_LEN
  318.         mov     esi, user_command+6
  319.         mov     edi, user_nick
  320.   @@:
  321.         lodsb
  322.         cmp     al, 13
  323.         je      @f
  324.         stosb
  325.         dec     ecx
  326.         jnz     @r
  327.   @@:
  328.         xor     al, al
  329.         stosb
  330.  
  331.   .justprint:
  332.         mov     esi, str_nickchange
  333.         call    print_asciiz
  334.  
  335.         mov     esi, user_nick
  336.         call    print_asciiz
  337.  
  338.         mov     al, 10
  339.         call    print_char
  340.  
  341.         ret
  342.  
  343.  
  344.  
  345. cmd_usr_real:
  346.  
  347.         cmp     byte[user_command+5], ' '
  348.         jne     cmd_usr_send
  349.  
  350.         mov     ecx, MAX_REAL_LEN
  351.         mov     esi, user_command+6
  352.         mov     edi, user_real_name
  353.   .loop:
  354.         lodsb
  355.         cmp     al, 13
  356.         je      .done
  357.         stosb
  358.         dec     ecx
  359.         jnz     .loop
  360.   .done:
  361.         xor     al, al
  362.         stosb
  363.  
  364.         mov     esi, str_realchange
  365.         call    print_asciiz
  366.  
  367.         mov     esi, user_real_name
  368.         call    print_asciiz
  369.  
  370.         mov     al, 10
  371.         call    print_char
  372.  
  373.         ret
  374.  
  375.  
  376.  
  377. cmd_usr_server:
  378.  
  379.         mov     eax, dword[user_command+5]      ; check for 'er ', we only checked 'serv'
  380.         or      eax, 0x00002020
  381.         and     eax, 0x00ffffff
  382.         cmp     eax, 'er '
  383.         jne     cmd_usr_send
  384.  
  385. ; Server window is always first window in the list, switch to it.
  386.         mov     [window_print], windows
  387.         mov     [window_active], windows
  388.  
  389.         mov     ecx, [user_command.size]        ; ok now set the address
  390.         sub     ecx, 8
  391.  
  392.         mov     esi, user_command+8
  393.   .now:
  394.         push    esi
  395.         mov     edi, irc_server_name
  396.   .loop:                                        ; copy until zero byte, or ecx reaches zero.
  397.         lodsb
  398.         stosb
  399.         test    al, al
  400.         jz      .done
  401.         dec     ecx
  402.         jnz     .loop
  403.         xor     al, al
  404.         stosb
  405.   .done:
  406.         pop     esi
  407.  
  408. ; set it also in window name
  409.         mov     ebx, [window_print]
  410.         call    window_set_name
  411.  
  412. ; now connect
  413.         call    socket_connect
  414.  
  415.         ret
  416.  
  417.  
  418. cmd_usr_quer:
  419.  
  420.         mov     esi, user_command+7
  421.         call    window_open
  422. ;        test    ebx, ebx
  423. ;        jz      .fail
  424.  
  425.         ret
  426.  
  427.  
  428.  
  429. cmd_usr_help:
  430.  
  431.         mov     esi, str_help
  432.         call    print_asciiz
  433.  
  434.         ret
  435.  
  436.  
  437.  
  438. cmd_usr_code:
  439.  
  440.         ; TODO
  441.  
  442.         ret
  443.  
  444.  
  445.  
  446. ; User typed a part command
  447. cmd_usr_part:
  448.  
  449.         cmp     byte[user_command+5], 13        ; parameters given?
  450.         jne     cmd_usr_send                    ; yes, send command straight to server
  451.  
  452. ; close active window
  453. cmd_usr_close_window:
  454.  
  455.         mov     esi, [window_active]
  456.         mov     [window_print], esi
  457.         cmp     [esi + window.type], WINDOWTYPE_SERVER
  458.         je      .not_channel
  459.  
  460.         lea     esi, [esi + window.name]
  461.         call    cmd_usr_part_channel
  462.         call    window_close
  463.         ret
  464.  
  465.   .not_channel:
  466.         cmp     [esi + window.type], WINDOWTYPE_CHAT
  467.         jne     .not_chat
  468.  
  469.         call    window_close
  470.   .not_chat:
  471.  
  472.         ret
  473.  
  474.  
  475.  
  476. ; Send part command to server
  477. ; esi must point to channel name (ASCIIZ)
  478. cmd_usr_part_channel:
  479.  
  480. ; User wants to close a channel, send PART command to server
  481.         mov     dword[packetbuf], 'PART'
  482.         mov     byte[packetbuf+4], ' '
  483.         lea     edi, [packetbuf+5]
  484.   @@:
  485.         lodsb
  486.         test    al, al
  487.         jz      @f
  488.         cmp     al, 13
  489.         je      @f
  490.         cmp     al, 10
  491.         je      @f
  492.         stosb
  493.         jmp     @r
  494.   @@:
  495. ; end the command with a CRLF
  496.         mov     ax, 0x0a0d
  497.         stosw
  498.  
  499.         lea     esi, [edi - packetbuf]                  ; calculate length
  500.         mcall   send, [socketnum], packetbuf, , 0       ; and finally send to server
  501.  
  502.         ret
  503.  
  504.  
  505.  
  506. cmd_usr_ctcp:
  507.  
  508.         cmp     byte[user_command+5], ' '
  509.         jne     cmd_usr_send
  510.  
  511.         mov     esi, user_command+6
  512. ; prepare a 'PRIVMSG '
  513.         mov     dword[packetbuf], 'PRIV'
  514.         mov     dword[packetbuf+4], 'MSG '
  515.         lea     edi, [packetbuf+8]
  516.  
  517. ; append the destination (nickname/channel)
  518.   @@:
  519.         lodsb
  520.         test    al, al
  521.         jz      .fail
  522.         cmp     al, ' '
  523.         je      @f
  524.         stosb
  525.         jmp     @r
  526.   @@:
  527.  
  528.         mov     ax, ' :'
  529.         stosw
  530.         mov     al, 0x01
  531.         stosb
  532.  
  533.         push edi esi
  534.  
  535. ; copy the message itself
  536.   @@:
  537.         lodsb
  538.         test    al, al
  539.         jz      @f
  540.         cmp     al, 13
  541.         je      @f
  542.         cmp     al, 10
  543.         je      @f
  544.         stosb
  545.         jmp     @r
  546.   @@:
  547.  
  548. ; end of message
  549.         mov     al, 0x01
  550.         stosb
  551.         mov     ax, 0x0a0d
  552.         stosw
  553.         mov     byte[edi], 0
  554.  
  555. ; now print to the window
  556.         if TIMESTAMP
  557.         call    print_timestamp
  558.         end if
  559.  
  560.         mov     esi, ctcp_header
  561.         call    print_asciiz
  562.  
  563.         mov     esi, packetbuf+8
  564.         mov     bl, ' '
  565.         call    print_string
  566.  
  567.         mov     al, ']'
  568.         call    print_char
  569.  
  570.         mov     al, ' '
  571.         call    print_char
  572.  
  573.         pop     esi
  574.         call    print_asciiz
  575.         pop     esi
  576.  
  577.  
  578. ; now send it away
  579.         lea     esi, [edi - packetbuf]                  ; calculate length
  580.         mcall   send, [socketnum], packetbuf, , 0       ; and finally send to server
  581.  
  582.   .fail:
  583.  
  584.         ret
  585.  
  586.  
  587.  
  588. cmd_usr_me:
  589.  
  590. ; prepare a 'PRIVMSG '
  591.         mov     dword[packetbuf], 'PRIV'
  592.         mov     dword[packetbuf+4], 'MSG '
  593.         lea     edi, [packetbuf+8]
  594.  
  595. ; append the destination (nickname/channel)
  596.         mov     esi, [window_active]
  597.         lea     esi, [esi + window.name]
  598.   @@:
  599.         lodsb
  600.         test    al, al
  601.         je      @f
  602.         stosb
  603.         jmp     @r
  604.   @@:
  605.  
  606. ; Make the CTCP action header
  607.         mov     eax, ' :' + 0x01 shl 16 + 'A' shl 24
  608.         stosd
  609.         mov     eax, 'CTIO'
  610.         stosd
  611.         mov     al, 'N'
  612.         stosb
  613.  
  614. ; copy the message itself (including first space)
  615.         mov     esi, user_command+3
  616.   @@:
  617.         lodsb
  618.         cmp     al, 13
  619.         je      @f
  620.         stosb
  621.         jmp     @r
  622.   @@:
  623.  
  624. ; end of CTCP message
  625.         mov     al, 0x01
  626.         stosb
  627.         mov     ax, 0x0a0d
  628.         stosw
  629.  
  630. ; now send it to the server
  631.         lea     esi, [edi - packetbuf]                  ; calculate length
  632.         mcall   send, [socketnum], packetbuf, , 0       ; and finally send to server
  633.  
  634. ; print to local window
  635.         if TIMESTAMP
  636.         call    print_timestamp
  637.         end if
  638.  
  639.         mov     esi, action_header
  640.         call    print_asciiz
  641.  
  642.         mov     esi, user_nick
  643.         call    print_asciiz
  644.  
  645.         mov     esi, user_command+3
  646.         mov     bl, 13
  647.         call    print_string
  648.  
  649.         mov     al, 10
  650.         call    print_char
  651.  
  652.         ret
  653.  
  654.  
  655.  
  656. ; The user typed some undefined command, just send it to the server
  657. cmd_usr_send:
  658.  
  659.         mov     esi, [user_command.size]
  660.         mov     eax, [user_command.size]
  661.         add     eax, user_command+1
  662.         mov     word[eax], 0x0d0a
  663.         inc     esi
  664.         mcall   send, [socketnum], user_command+1, , 0
  665.  
  666.         ret
  667.  
  668.  
  669.  
  670.  
  671.  
  672.