Subversion Repositories Kolibri OS

Rev

Rev 9979 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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