Rev 4143 | Rev 4617 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
3545 | hidnplayr | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
4477 | hidnplayr | 3 | ;; Copyright (C) KolibriOS team 2004-2014. All rights reserved. ;; |
3545 | hidnplayr | 4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
||
4143 | hidnplayr | 6 | ;; Written by hidnplayr@kolibrios.org ;; |
3545 | hidnplayr | 7 | ;; ;; |
8 | ;; GNU GENERAL PUBLIC LICENSE ;; |
||
9 | ;; Version 2, June 1991 ;; |
||
10 | ;; ;; |
||
11 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
12 | |||
13 | |||
14 | user_parser: |
||
15 | |||
4143 | hidnplayr | 16 | push [window_active] ; print to the current window |
17 | pop [window_print] |
||
18 | |||
3545 | hidnplayr | 19 | mov eax, [edit1.size] |
3563 | hidnplayr | 20 | test eax, eax |
4477 | hidnplayr | 21 | jz .ret ; ignore empty commands |
3545 | hidnplayr | 22 | mov word [usercommand + eax], 0x0a0d ; terminate the line |
23 | |||
24 | cmp byte[usercommand], '/' ; is it a server command ? |
||
25 | je server_command |
||
26 | |||
27 | ; Ignore data commands when not connected. |
||
28 | cmp [status], STATUS_CONNECTED |
||
4477 | hidnplayr | 29 | jne .notconnected |
3545 | hidnplayr | 30 | |
31 | ; Ok, we said something, print it to our textbox |
||
32 | ; TODO: dont send if it's a server window? |
||
33 | |||
4143 | hidnplayr | 34 | if TIMESTAMP |
3545 | hidnplayr | 35 | call print_timestamp |
4143 | hidnplayr | 36 | end if |
3545 | hidnplayr | 37 | |
38 | mov bl, '<' |
||
39 | call print_character |
||
40 | |||
41 | mov esi, user_nick |
||
42 | call print_text2 |
||
43 | |||
3981 | hidnplayr | 44 | mov bl, '>' |
3545 | hidnplayr | 45 | call print_character |
3981 | hidnplayr | 46 | mov bl, ' ' |
3545 | hidnplayr | 47 | call print_character |
48 | |||
49 | mov eax, [edit1.size] |
||
50 | mov byte[usercommand + eax],0 |
||
51 | |||
52 | mov esi, usercommand |
||
53 | call print_text2 |
||
54 | |||
55 | mov bl, 10 |
||
56 | call print_character |
||
57 | |||
58 | ; and now send it to the server |
||
4143 | hidnplayr | 59 | mov dword[packetbuf], 'PRIV' |
60 | mov dword[packetbuf+4], 'MSG ' |
||
3545 | hidnplayr | 61 | |
3981 | hidnplayr | 62 | mov esi, [window_active] |
3545 | hidnplayr | 63 | add esi, window.name |
64 | mov edi, packetbuf+8 |
||
65 | mov ecx, MAX_WINDOWNAME_LEN |
||
66 | .loop: |
||
67 | lodsb |
||
68 | test al, al |
||
69 | jz .done |
||
70 | stosb |
||
71 | dec ecx |
||
72 | jnz .loop |
||
73 | .done: |
||
74 | |||
75 | mov ax, ' :' |
||
76 | stosw |
||
77 | |||
78 | mov esi, usercommand |
||
79 | mov ecx, [edit1.size] |
||
80 | inc ecx |
||
81 | call recode |
||
82 | |||
4143 | hidnplayr | 83 | ; end the command with a CRLF |
84 | mov ax, 0x0a0d |
||
85 | stosw |
||
3545 | hidnplayr | 86 | |
87 | lea esi, [edi - packetbuf] |
||
88 | mcall send, [socketnum], packetbuf, , 0 |
||
4477 | hidnplayr | 89 | .ret: |
3545 | hidnplayr | 90 | |
4477 | hidnplayr | 91 | ret |
3545 | hidnplayr | 92 | |
4477 | hidnplayr | 93 | .notconnected: |
94 | mov esi, str_notconnected |
||
95 | call print_text2 |
||
96 | |||
3545 | hidnplayr | 97 | ret |
98 | |||
99 | |||
100 | |||
101 | user_commands: |
||
102 | dd 'nick', cmd_usr_nick |
||
103 | dd 'real', cmd_usr_real |
||
104 | dd 'serv', cmd_usr_server |
||
105 | dd 'help', cmd_usr_help |
||
106 | dd 'code', cmd_usr_code |
||
4143 | hidnplayr | 107 | |
4477 | hidnplayr | 108 | .number2 = ($ - user_commands) / 8 |
109 | |||
110 | ; All following commands require a connection to the server. |
||
3545 | hidnplayr | 111 | dd 'quer', cmd_usr_quer |
112 | dd 'quit', cmd_usr_quit |
||
3981 | hidnplayr | 113 | dd 'part', cmd_usr_part |
4143 | hidnplayr | 114 | dd 'ctcp', cmd_usr_ctcp |
115 | dd 'msg ', cmd_usr_msg |
||
3545 | hidnplayr | 116 | |
117 | .number = ($ - user_commands) / 8 |
||
118 | |||
119 | |||
120 | |||
121 | server_command: |
||
122 | |||
4477 | hidnplayr | 123 | mov eax, dword[usercommand+1] ; skip '/' |
124 | or eax, 0x20202020 ; convert to lowercase |
||
3545 | hidnplayr | 125 | |
126 | mov edi, user_commands |
||
127 | mov ecx, user_commands.number |
||
4477 | hidnplayr | 128 | cmp [status], STATUS_CONNECTED |
129 | jne .loop |
||
130 | mov ecx, user_commands.number2 |
||
3545 | hidnplayr | 131 | .loop: |
132 | scasd |
||
133 | je .got_cmd |
||
134 | add edi, 4 |
||
135 | dec ecx |
||
136 | jnz .loop |
||
137 | |||
4477 | hidnplayr | 138 | cmp [status], STATUS_CONNECTED |
139 | jne .notconnected |
||
140 | |||
141 | jmp cmd_usr_send ; If none of the previous commands, just send to server |
||
142 | |||
3545 | hidnplayr | 143 | .got_cmd: |
144 | jmp dword[edi] |
||
145 | |||
4477 | hidnplayr | 146 | .notconnected: |
147 | mov esi, str_notconnected |
||
148 | call print_text2 |
||
3545 | hidnplayr | 149 | |
4477 | hidnplayr | 150 | ret |
3545 | hidnplayr | 151 | |
152 | |||
153 | |||
4143 | hidnplayr | 154 | cmd_usr_msg: |
155 | |||
156 | lea esi, [usercommand+5] |
||
157 | |||
158 | mov dword[packetbuf], 'PRIV' |
||
159 | mov dword[packetbuf+4], 'MSG ' |
||
160 | lea edi, [packetbuf+8] |
||
161 | |||
162 | @@: |
||
163 | lodsb |
||
164 | test al, al |
||
165 | jz .fail |
||
166 | cmp al, 10 |
||
167 | je .fail |
||
168 | cmp al, 13 |
||
169 | je .fail |
||
170 | stosb |
||
171 | cmp al, ' ' |
||
172 | jne @r |
||
173 | |||
174 | mov al, ':' |
||
175 | stosb |
||
176 | |||
177 | push edi |
||
178 | @@: |
||
179 | lodsb |
||
180 | test al, al |
||
181 | jz @f |
||
182 | cmp al, 10 |
||
183 | je @f |
||
184 | cmp al, 13 |
||
185 | je @f |
||
186 | stosb |
||
187 | jmp @r |
||
188 | @@: |
||
189 | ; end the command with a CRLF |
||
190 | mov ax, 0x0a0d |
||
191 | stosw |
||
192 | mov byte[edi], 0 |
||
193 | |||
194 | lea esi, [edi - packetbuf] |
||
195 | mcall send, [socketnum], packetbuf, , 0 |
||
196 | |||
197 | ; now print to the window |
||
198 | if TIMESTAMP |
||
199 | call print_timestamp |
||
200 | end if |
||
201 | |||
202 | mov esi, msg_header |
||
203 | call print_text2 |
||
204 | |||
205 | mov eax, packetbuf+8 |
||
206 | mov dl, ' ' |
||
207 | call print_text |
||
208 | |||
209 | mov bl, '*' |
||
210 | call print_character |
||
211 | |||
212 | mov bl, ' ' |
||
213 | call print_character |
||
214 | |||
215 | pop esi |
||
216 | call print_text2 |
||
217 | |||
218 | .fail: |
||
219 | ret |
||
220 | |||
221 | |||
222 | |||
3545 | hidnplayr | 223 | cmd_usr_quit: |
3981 | hidnplayr | 224 | mov esi, quit_msg |
225 | |||
3545 | hidnplayr | 226 | cmp byte[usercommand+5], ' ' |
4143 | hidnplayr | 227 | jne .with_message |
228 | lea esi, [usercommand+6] |
||
229 | .with_message: |
||
3981 | hidnplayr | 230 | call cmd_usr_quit_server |
3545 | hidnplayr | 231 | |
232 | mcall close, [socketnum] |
||
4143 | hidnplayr | 233 | mov [status], STATUS_DISCONNECTED |
3545 | hidnplayr | 234 | |
235 | mov ecx, MAX_WINDOWS |
||
236 | mov edi, windows |
||
237 | .loop: |
||
4143 | hidnplayr | 238 | mov [window_print], edi |
239 | push edi ecx |
||
240 | call window_close |
||
241 | pop ecx edi |
||
3545 | hidnplayr | 242 | add edi, sizeof.window |
243 | dec ecx |
||
244 | jnz .loop |
||
245 | |||
246 | ret |
||
247 | |||
248 | |||
249 | |||
3981 | hidnplayr | 250 | ; esi = quit message |
251 | cmd_usr_quit_server: |
||
3545 | hidnplayr | 252 | |
3981 | hidnplayr | 253 | ; User wants to close a channel, send PART command to server |
254 | mov dword[packetbuf], 'QUIT' |
||
255 | mov word[packetbuf+4], ' :' |
||
256 | lea edi, [packetbuf+6] |
||
257 | ; Append our quit msg |
||
258 | @@: |
||
259 | lodsb |
||
4143 | hidnplayr | 260 | cmp al, 13 |
261 | je @f |
||
262 | test al, al |
||
263 | jz @f |
||
3981 | hidnplayr | 264 | stosb |
4143 | hidnplayr | 265 | jmp @r |
266 | @@: |
||
3981 | hidnplayr | 267 | ; end the command with a CRLF |
268 | mov ax, 0x0a0d |
||
269 | stosw |
||
270 | |||
271 | lea esi, [edi - packetbuf] ; calculate length |
||
272 | mcall send, [socketnum], packetbuf, , 0 ; and finally send to server |
||
273 | |||
274 | ret |
||
275 | |||
276 | |||
277 | |||
278 | |||
3545 | hidnplayr | 279 | cmd_usr_nick: |
280 | |||
281 | cmp [edit1.size], 5 |
||
4143 | hidnplayr | 282 | je .dontsend |
3545 | hidnplayr | 283 | cmp byte[usercommand+5], ' ' |
4143 | hidnplayr | 284 | jne .fail |
285 | cmp [socketnum], 0 |
||
286 | je .dontsend |
||
3545 | hidnplayr | 287 | |
4143 | hidnplayr | 288 | mov dword[usercommand+1], 'NICK' |
289 | mov esi, [edit1.size] |
||
290 | mov word[usercommand + esi], 0x0a0d |
||
291 | inc esi |
||
292 | mcall send, [socketnum], usercommand+1, , 0 |
||
293 | |||
294 | .fail: |
||
295 | |||
296 | ret |
||
297 | |||
298 | .dontsend: |
||
3545 | hidnplayr | 299 | mov ecx, MAX_NICK_LEN |
300 | mov esi, usercommand+6 |
||
301 | mov edi, user_nick |
||
4143 | hidnplayr | 302 | @@: |
3545 | hidnplayr | 303 | lodsb |
304 | cmp al, 13 |
||
4143 | hidnplayr | 305 | je @f |
3545 | hidnplayr | 306 | stosb |
307 | dec ecx |
||
4143 | hidnplayr | 308 | jnz @r |
309 | @@: |
||
3545 | hidnplayr | 310 | xor al, al |
311 | stosb |
||
312 | |||
313 | mov esi, str_nickchange |
||
314 | call print_text2 |
||
315 | mov esi, user_nick |
||
316 | call print_text2 |
||
317 | mov esi, str_dotnewline |
||
318 | call print_text2 |
||
319 | |||
320 | ret |
||
321 | |||
322 | |||
323 | |||
324 | cmd_usr_real: |
||
325 | |||
326 | cmp byte[usercommand+5], ' ' |
||
327 | jne cmd_usr_send |
||
328 | |||
329 | mov ecx, MAX_REAL_LEN |
||
330 | mov esi, usercommand+6 |
||
331 | mov edi, user_real_name |
||
332 | .loop: |
||
333 | lodsb |
||
334 | cmp al, 13 |
||
335 | je .done |
||
336 | stosb |
||
337 | dec ecx |
||
338 | jnz .loop |
||
339 | .done: |
||
340 | xor al, al |
||
341 | stosb |
||
342 | |||
343 | mov esi, str_realchange |
||
344 | call print_text2 |
||
345 | mov esi, user_real_name |
||
346 | call print_text2 |
||
347 | mov esi, str_dotnewline |
||
348 | call print_text2 |
||
349 | |||
350 | ret |
||
351 | |||
352 | |||
353 | |||
354 | cmd_usr_server: |
||
355 | |||
356 | mov eax, dword[usercommand+5] ; check for 'er ', we only checked 'serv' |
||
357 | or eax, 0x00002020 |
||
358 | and eax, 0x00ffffff |
||
359 | cmp eax, 'er ' |
||
360 | jne cmd_usr_send |
||
361 | |||
4477 | hidnplayr | 362 | mov ecx, [edit1.size] ; ok now set the address |
3545 | hidnplayr | 363 | sub ecx, 8 |
364 | |||
365 | mov esi, usercommand+8 |
||
4477 | hidnplayr | 366 | .now: |
3545 | hidnplayr | 367 | push esi |
368 | mov edi, irc_server_name |
||
4477 | hidnplayr | 369 | .loop: ; copy until zero byte, or ecx reaches zero. |
370 | lodsb |
||
371 | stosb |
||
372 | test al, al |
||
373 | jz .done |
||
374 | dec ecx |
||
375 | jnz .loop |
||
3545 | hidnplayr | 376 | xor al, al |
377 | stosb |
||
4477 | hidnplayr | 378 | .done: |
3545 | hidnplayr | 379 | pop esi |
380 | |||
381 | ; set it also in window name |
||
382 | mov ebx, [window_print] |
||
383 | call window_set_name |
||
384 | |||
385 | ; now connect |
||
386 | call socket_connect |
||
387 | |||
388 | ret |
||
389 | |||
390 | |||
391 | cmd_usr_quer: |
||
392 | |||
393 | mov esi, usercommand+7 |
||
4477 | hidnplayr | 394 | call window_open |
3545 | hidnplayr | 395 | |
396 | ret |
||
397 | |||
398 | |||
399 | |||
400 | cmd_usr_help: |
||
401 | |||
402 | mov esi, str_help |
||
403 | call print_text2 |
||
404 | |||
405 | ret |
||
406 | |||
407 | |||
408 | |||
409 | cmd_usr_code: |
||
410 | |||
411 | ; TODO |
||
412 | |||
413 | ret |
||
414 | |||
415 | |||
416 | |||
3981 | hidnplayr | 417 | ; User typed a part command |
418 | cmd_usr_part: |
||
419 | |||
4143 | hidnplayr | 420 | cmp byte[usercommand+5], 13 ; parameters given? |
421 | jne cmd_usr_send ; yes, send command straight to server |
||
3981 | hidnplayr | 422 | |
4143 | hidnplayr | 423 | ; close active window |
424 | cmd_usr_close_window: |
||
425 | |||
426 | mov esi, [window_active] |
||
427 | mov [window_print], esi |
||
3981 | hidnplayr | 428 | cmp [esi + window.type], WINDOWTYPE_SERVER |
4143 | hidnplayr | 429 | je .not_channel |
3981 | hidnplayr | 430 | |
4143 | hidnplayr | 431 | lea esi, [esi + window.name] |
432 | call cmd_usr_part_channel |
||
433 | call window_close |
||
434 | ret |
||
3981 | hidnplayr | 435 | |
4143 | hidnplayr | 436 | .not_channel: |
437 | cmp [esi + window.type], WINDOWTYPE_CHAT |
||
438 | jne .not_chat |
||
439 | |||
440 | call window_close |
||
441 | .not_chat: |
||
442 | |||
3981 | hidnplayr | 443 | ret |
444 | |||
4143 | hidnplayr | 445 | |
446 | |||
3981 | hidnplayr | 447 | ; Send part command to server |
448 | ; esi must point to channel name (ASCIIZ) |
||
449 | cmd_usr_part_channel: |
||
450 | |||
451 | ; User wants to close a channel, send PART command to server |
||
452 | mov dword[packetbuf], 'PART' |
||
453 | mov byte[packetbuf+4], ' ' |
||
454 | lea edi, [packetbuf+5] |
||
455 | @@: |
||
456 | lodsb |
||
4143 | hidnplayr | 457 | test al, al |
458 | jz @f |
||
459 | cmp al, 13 |
||
460 | je @f |
||
461 | cmp al, 10 |
||
462 | je @f |
||
3981 | hidnplayr | 463 | stosb |
4143 | hidnplayr | 464 | jmp @r |
465 | @@: |
||
3981 | hidnplayr | 466 | ; end the command with a CRLF |
467 | mov ax, 0x0a0d |
||
468 | stosw |
||
469 | |||
470 | lea esi, [edi - packetbuf] ; calculate length |
||
471 | mcall send, [socketnum], packetbuf, , 0 ; and finally send to server |
||
472 | |||
473 | ret |
||
474 | |||
475 | |||
4477 | hidnplayr | 476 | |
4143 | hidnplayr | 477 | cmd_usr_ctcp: |
478 | |||
479 | cmp byte[usercommand+5], ' ' |
||
480 | jne cmd_usr_send |
||
481 | |||
482 | mov esi, usercommand+6 |
||
483 | ; prepare a 'PRIVMSG ' |
||
484 | mov dword[packetbuf], 'PRIV' |
||
485 | mov dword[packetbuf+4], 'MSG ' |
||
486 | lea edi, [packetbuf+8] |
||
487 | |||
488 | ; append the destination (nickname/channel) |
||
489 | @@: |
||
490 | lodsb |
||
491 | test al, al |
||
492 | jz .fail |
||
493 | cmp al, ' ' |
||
494 | je @f |
||
495 | stosb |
||
496 | jmp @r |
||
497 | @@: |
||
498 | |||
499 | mov ax, ' :' |
||
500 | stosw |
||
501 | mov al, 0x01 |
||
502 | stosb |
||
503 | |||
504 | ; copy the message itself |
||
505 | @@: |
||
506 | lodsb |
||
507 | test al, al |
||
508 | jz @f |
||
509 | cmp al, 13 |
||
510 | je @f |
||
511 | cmp al, 10 |
||
512 | je @f |
||
513 | stosb |
||
514 | jmp @r |
||
515 | @@: |
||
516 | |||
517 | ; end of message |
||
518 | mov al, 0x01 |
||
519 | stosb |
||
520 | mov ax, 0x0a0d |
||
521 | stosw |
||
522 | |||
523 | ; now send it away |
||
524 | lea esi, [edi - packetbuf] ; calculate length |
||
525 | mcall send, [socketnum], packetbuf, , 0 ; and finally send to server |
||
526 | |||
527 | ;; TODO: print to window |
||
528 | |||
529 | .fail: |
||
530 | |||
531 | ret |
||
532 | |||
533 | |||
4477 | hidnplayr | 534 | |
3981 | hidnplayr | 535 | ; The user typed some undefined command, just recode it and send to the server |
3545 | hidnplayr | 536 | cmd_usr_send: |
537 | |||
538 | mov esi, usercommand+1 |
||
539 | mov ecx, [edit1.size] |
||
540 | inc ecx |
||
541 | mov edi, packetbuf |
||
542 | call recode |
||
543 | |||
544 | lea esi, [edi - packetbuf] |
||
545 | mcall send, [socketnum], packetbuf, , 0 |
||
546 | |||
547 | ret' |
||
548 | |||
4143 | hidnplayr | 549 |