-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathircserver_stuff.asm
1533 lines (1454 loc) · 42.7 KB
/
ircserver_stuff.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
***************************************************************
* IRC client server command parsing and handling routines
***************************************************************
; --------------------------------------------------------------------------
; This is the main parsing routine that interprets the IRC server's commands
; and copies/formats/prints output or fills variables etc
; --------------------------------------------------------------------------
PARSE_SERVER_CMD
pshs Y,X,D
lda #server_timeout_count
sta <timeoutCounter
leax serverBuffer,U
lda ,X
cmpa #':'
bne PARSE_SERVER_CMD_CHECK_KEYWORDS
; if here, we have either server message or hostmask from other user
leax 1,X ; advance pointer passed the ':'
stx <sourceHostmaskPtr ; save pointer to source for later use if needed
lbsr FIND_NEXT_SPACE_NULL_CR ; find end of origin address/hostmask
leax 1,X ; skip expected space
; now check if the server command is numeric or keyword
lda ,X
cmpa #'0'
lbeq PARSE_SERVER_CMD_PREFIX_ZEROS
blo PARSE_SERVER_CMD_CHECK_KEYWORDS
cmpa #'2'
lbeq PARSE_SERVER_CMD_PREFIX_TWOS
cmpa #'3'
lbeq PARSE_SERVER_CMD_PREFIX_THREES
cmpa #'4'
lbeq PARSE_SERVER_CMD_PREFIX_FOURS
cmpa #'6'
lbeq PARSE_SERVER_CMD_PREFIX_SIXES
cmpa #'9'
lbls PARSE_SERVER_CMD_SHOW_RAW_CMD
PARSE_SERVER_CMD_CHECK_KEYWORDS
; check for KEYWORD commands
leay strJOINkeyword,PCR
lbsr COMPARE_PARAM
lbcc PARSE_SERVER_CMD_JOIN
leay strPINGkeyword,PCR
lbsr COMPARE_PARAM
lbcc PARSE_SERVER_CMD_PING
leay strQUITkeyword,PCR
lbsr COMPARE_PARAM
lbcc PARSE_SERVER_CMD_QUIT
leay strPARTkeyword,PCR
lbsr COMPARE_PARAM
lbcc PARSE_SERVER_CMD_PART
leay strNICKkeyword,PCR
lbsr COMPARE_PARAM
lbcc PARSE_SERVER_CMD_NICKNAME
leay strNOTICEkeyword,PCR
lbsr COMPARE_PARAM
lbcc PARSE_SERVER_CMD_NOTICE
leay strMODEkeyword,PCR
lbsr COMPARE_PARAM
lbcc PARSE_SERVER_CMD_MODE
leay strKICKkeyword,PCR
lbsr COMPARE_PARAM
lbcc PARSE_SERVER_CMD_KICK
leay strTOPICkeyword,PCR
lbcc PARSE_SERVER_CMD_TOPIC
; PRIVMSG CHECK HAS TO BE THE LAST ONE CHECKED
leay strPRIVMSGkeyword,PCR
lbsr COMPARE_PARAM
lbcs PARSE_SERVER_CMD_SHOW_RAW_CMD ; TEMPRARY for now
; if here, its a PRIVMSG server command
lbsr FIND_NEXT_SPACE_NULL_CR ; skip the keyword command
lda ,X+
cmpa #C$SPAC
lbne PARSE_SERVER_CMD_ERROR
; check if the destination is a channel or nickname
lda ,X
cmpa #'#'
lbne PARSE_SERVER_CMD_PREFIX_NOT_NUMERIC_CHECK_YOUR_NICK
; format message for channel text
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
lda #'{'
sta ,Y+
lda #colorChanName
lbsr COPY_COLOR_CODE_FOREGROUND
lbsr PARAM_COPY
lbsr SKIP_SERVER_MSG_COLON ; skip the expected space and possible ':'
stx <serverCmdPtr ; save buffer position
lda #colorNormal
lbsr COPY_COLOR_CODE_FOREGROUND
ldd #"} "
std ,Y++
; check for CTCP control code in case of an ACTION
lda ,X+
cmpa #$01
bne PARSE_SERVER_CMD_PREFIX_NOT_NUMERIC_NORMAL_CHAN_MSG
sty <outputBufferPtr
leay strACTIONkeyword,PCR
lbsr COMPARE_PARAM
lbcs PARSE_SERVER_CMD_SHOW_RAW_CMD
ldy <outputBufferPtr
; structure the ACTION to print
ldd #"* "
std ,Y++
lda #colorNickChan
lbsr COPY_COLOR_CODE_FOREGROUND
stx <serverCmdPtr
lbsr GET_NICK_FROM_SOURCE_HOSTMASK
leax sourceNickname,U
lbsr STRING_COPY_RAW
lda #C$SPAC
sta ,Y+
lda #colorNormal
lbsr COPY_COLOR_CODE_FOREGROUND
ldx <serverCmdPtr
lbsr FIND_NEXT_SPACE_NULL_CR
leax 1,X ; skip expected space
lbsr STRING_COPY_CR
lbra PARSE_SERVER_CMD_TERMINATE_PRINT_OUTPUTBUFFER
PARSE_SERVER_CMD_PREFIX_NOT_NUMERIC_NORMAL_CHAN_MSG
lda #'<'
sta ,Y+
lda #colorNickChan
lbsr COPY_COLOR_CODE_FOREGROUND
leax sourceNickname,U
lbsr GET_NICK_FROM_SOURCE_HOSTMASK
lbsr STRING_COPY
lda #colorNormal
lbsr COPY_COLOR_CODE_FOREGROUND
ldd #"> "
std ,Y++
ldx <serverCmdPtr
lbsr STRING_COPY_CR
lbra PARSE_SERVER_CMD_TERMINATE_PRINT_OUTPUTBUFFER
PARSE_SERVER_CMD_PREFIX_NOT_NUMERIC_CHECK_YOUR_NICK
leay serverYourNick,U
lbsr COMPARE_PARAM
lbcs PARSE_SERVER_CMD_SHOW_RAW_CMD
; if here, we have received a PRIVMSG from another user
lbsr FIND_NEXT_SPACE_NULL_CR ; skip our nickname in the command string
lbsr SKIP_SERVER_MSG_COLON ; skip expected space and possible ':' char
; check to see if this is a CTCP query
lda ,X
cmpa #$01 ; $01 = control code for CTCP messages
lbne PARSE_SERVER_CMD_PREFIX_NOT_NUMERIC_PRIVMSG_FOR_YOU
; if here, we have a CTCP query of some kind
leax 1,X ; skip control code prefix
leay strVERSIONkeyword,PCR
lbsr COMPARE_PARAM
bcc PARSE_SERVER_CMD_PREFIX_NOT_NUMERIC_CTCP_VERSION
leay strACTIONkeyword,PCR
lbsr COMPARE_PARAM
bcc PARSE_SERVER_CMD_PREFIX_NOT_NUMERIC_ACTION
lbra PARSE_SERVER_CMD_IGNORE_WHOLE_THING ; unsupported CTCP query so ignore
PARSE_SERVER_CMD_PREFIX_NOT_NUMERIC_ACTION
lbsr FIND_NEXT_SPACE_NULL_CR ; skip keyword
leax 1,X ; skip expected space
stx <serverCmdPtr
; build ACTION message to print
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
ldd #"* "
std ,Y++
lda #colorNickChan
lbsr COPY_COLOR_CODE_FOREGROUND
lbsr GET_NICK_FROM_SOURCE_HOSTMASK
leax sourceNickname,U
lbsr STRING_COPY_RAW
lda #colorNormal
lbsr COPY_COLOR_CODE_FOREGROUND
lda #C$SPAC
sta ,Y+
ldx <serverCmdPtr
lbsr STRING_COPY_CR
lbra PARSE_SERVER_CMD_TERMINATE_PRINT_OUTPUTBUFFER
PARSE_SERVER_CMD_PREFIX_NOT_NUMERIC_CTCP_VERSION
; inform user we got a CTCP version request
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
lda #colorJoinPart
lbsr COPY_COLOR_CODE_FOREGROUND
leax strUserMsgVersionRequested,PCR
lbsr STRING_COPY_RAW
lda #colorNickChan
lbsr COPY_COLOR_CODE_FOREGROUND
lbsr GET_NICK_FROM_SOURCE_HOSTMASK
leax sourceNickname,U
lbsr PARAM_COPY
ldd #cr_lf
std ,Y++
clr ,Y
leax outputBuffer,U
lbsr PRINT_CHATLOG_NULL_STRING
; now send our VERSION string back to reply
leax sourceNickname,U
lbsr SEND_CTCP_VERSION_REPLY
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
lda #colorJoinPart
lbsr COPY_COLOR_CODE_FOREGROUND
leax strUserMsgVersionSent,PCR
lbsr STRING_COPY_RAW
lda #colorNormal
lbsr COPY_COLOR_CODE_FOREGROUND
leax userVersionReply,U
lbsr STRING_COPY_CR
lbra PARSE_SERVER_CMD_TERMINATE_PRINT_OUTPUTBUFFER
PARSE_SERVER_CMD_PREFIX_NOT_NUMERIC_PRIVMSG_FOR_YOU
stx <serverCmdPtr
lbsr GET_NICK_FROM_SOURCE_HOSTMASK
leax sourceNickname,U
lbsr DESTINATION_FIND_ENTRY
bcc PARSE_SERVER_CMD_PREFIX_NOT_NUMERIC_DEST_ALREADY_EXISTS
; if here, it doesn't exist as a destination yet. add it if there is room in the list
ldb #1
lbsr DESTINATION_ADD_ENTRY
PARSE_SERVER_CMD_PREFIX_NOT_NUMERIC_DEST_ALREADY_EXISTS
; format message for private message
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
lda #'<'
sta ,Y+
lda #colorNickChan
lbsr COPY_COLOR_CODE_FOREGROUND
leax sourceNickname,U
lbsr STRING_COPY
lda #colorNormal
lbsr COPY_COLOR_CODE_FOREGROUND
ldd #"> "
std ,Y++
ldx <serverCmdPtr
lbsr STRING_COPY_CR
lbra PARSE_SERVER_CMD_TERMINATE_PRINT_OUTPUTBUFFER
; JOIN KEYWORD COMMAND HANDLER
PARSE_SERVER_CMD_JOIN
lbsr FIND_NEXT_SPACE_NULL_CR ; skip the keyword command
lda ,X+
cmpa #C$SPAC
lbne PARSE_SERVER_CMD_ERROR
leay serverChanName,U
lbsr PARAM_COPY
; was it YOU joining a channel?
leay serverYourNick,U
lbsr GET_NICK_FROM_SOURCE_HOSTMASK
leax sourceNickname,U
lbsr COMPARE_PARAM
bcs PARSE_SERVER_CMD_JOIN_NOT_YOU
; it WAS you. add new entry to destination list and tell user they joined
leax serverChanName,U
clrb
lbsr DESTINATION_ADD_ENTRY
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
lda #colorJoinPart
lbsr COPY_COLOR_CODE_FOREGROUND
ldd #"* "
std ,Y++
leax strUserMsgYouJoined,PCR
lbsr STRING_COPY_RAW
PARSE_SERVER_CMD_JOIN_PRINT_RESULT
lda #colorChanName
lbsr COPY_COLOR_CODE_FOREGROUND
leax serverChanName,U
lbsr STRING_COPY_RAW
lbra PARSE_SERVER_CMD_TERMINATE_PRINT_OUTPUTBUFFER
PARSE_SERVER_CMD_JOIN_NOT_YOU
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
lda #colorJoinPart
lbsr COPY_COLOR_CODE_FOREGROUND
ldd #"* "
std ,Y++
lda #colorNickChan
lbsr COPY_COLOR_CODE_FOREGROUND
leax sourceNickname,U
lbsr STRING_COPY
lda #colorJoinPart
lbsr COPY_COLOR_CODE_FOREGROUND
leax strUserMsgHasJoined,PCR
lbsr STRING_COPY_RAW
bra PARSE_SERVER_CMD_JOIN_PRINT_RESULT
PARSE_SERVER_CMD_NOTICE
lbsr FIND_NEXT_SPACE_NULL_CR ; skip the keyword command
lda ,X+ ; grab the expected space and skip passed it
cmpa #C$SPAC
lbne PARSE_SERVER_CMD_ERROR ; something went wrong I guess
stx <serverCmdPtr
; check if notice is sent to YOUR nick or something else
leay serverYourNick,U
lbsr COMPARE_PARAM
bcc PARSE_SERVER_CMD_NOTICE_YOUR_NICK
; if here, we have either a channel or unknown recipient
lda ,X
cmpa #'#'
beq PARSE_SERVER_CMD_NOTICE_CHANNEL
; essentially ignore the unknown nick and print the message content only
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
lda #colorNotice
lbsr COPY_COLOR_CODE_FOREGROUND
lbsr FIND_NEXT_SPACE_NULL_CR
bra PARSE_SERVER_CMD_NOTICE_DO_MSG_BODY
PARSE_SERVER_CMD_NOTICE_CHANNEL
; build the output string for channel notice
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
lda #colorNotice
lbsr COPY_COLOR_CODE_FOREGROUND
lda #'-'
sta ,Y+
lda #colorNickChan
lbsr COPY_COLOR_CODE_FOREGROUND
lbsr GET_NICK_FROM_SOURCE_HOSTMASK
leax sourceNickname,U
lbsr STRING_COPY_RAW
lda #colorNotice
lbsr COPY_COLOR_CODE_FOREGROUND
lda #'/'
sta ,Y+
lda #colorChanName
lbsr COPY_COLOR_CODE_FOREGROUND
ldx <serverCmdPtr
lbsr PARAM_COPY
lda #colorNotice
lbsr COPY_COLOR_CODE_FOREGROUND
ldd #"- "
std ,Y++
bra PARSE_SERVER_CMD_NOTICE_DO_MSG_BODY
PARSE_SERVER_CMD_NOTICE_YOUR_NICK
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
lda #colorNotice
lbsr COPY_COLOR_CODE_FOREGROUND
lda #'-'
sta ,Y+
lda #colorNickChan
lbsr COPY_COLOR_CODE_FOREGROUND
lbsr GET_NICK_FROM_SOURCE_HOSTMASK
leax sourceNickname,U
lbsr STRING_COPY_RAW
lda #colorNotice
lbsr COPY_COLOR_CODE_FOREGROUND
ldd #"- "
std ,Y++
ldx <serverCmdPtr
; skip over our nickname and any potential ':' characters
lbsr FIND_NEXT_SPACE_NULL_CR
PARSE_SERVER_CMD_NOTICE_DO_MSG_BODY
lbsr SKIP_SERVER_MSG_COLON
lbsr STRING_COPY_CR
ldd #cr_lf
std ,Y++
clr ,Y
leax outputBuffer,U
IFDEF use_word_wrap
lbsr PRINT_CHATLOG_WITH_WORD_WRAP
ELSE
lbsr PRINT_CHATLOG_NULL_STRING
ENDC
; before exiting, check if that was a notice from nickserv so we can maybe trigger an autologin
leay strNICKSERVkeyword,PCR
leax sourceNickname,U
lbsr COMPARE_PARAM
lbcs PARSE_SERVER_CMD_DONE
lda <nickServPassFlag
lbpl PARSE_SERVER_CMD_DONE ; NickServ isnt set to autologin or hasnt been setup yet. exit
; check if we already sent login info
lda <nickServLoginPending
lbeq PARSE_SERVER_CMD_DONE ; yep already sent login so we are done here
leax userNickservPass,U
lbsr NICKSERV_SEND_IDENTIFY
clr <nickServLoginPending
lbra PARSE_SERVER_CMD_DONE
PARSE_SERVER_CMD_PREFIX_ZEROS
ldd 1,X
cmpd #"01"
lbeq PARSE_SERVER_CMD_PRINT_MSG_BODY_ONLY
cmpd #"02"
lbeq PARSE_SERVER_CMD_PRINT_MSG_BODY_ONLY
cmpd #"03"
lbeq PARSE_SERVER_CMD_PRINT_MSG_BODY_ONLY
cmpd #"04"
beq PARSE_SERVER_CMD_PREFIX_ZEROS_004
cmpd #"05"
beq PARSE_SERVER_CMD_PREFIX_ZEROS_005
lbra PARSE_SERVER_CMD_SHOW_RAW_CMD
PARSE_SERVER_CMD_PREFIX_ZEROS_004
leax 4,X ; skip over code
leay serverYourNick,U
lbsr PARAM_COPY
lbcs PARSE_SERVER_CMD_ERROR
leax 1,X ; skip bordering space char
; this should be the server's name that we use to identify messages from it
leay serverHostname,U
lbsr PARAM_COPY
lbcs PARSE_SERVER_CMD_ERROR
inc <idValidatedFlag
inc <nickServLoginPending ; if autologin is setup for nickserv, this enables detection for it
; setup initial server timeout counter using VRN driver if exists
lda <nilPath
lbmi PARSE_SERVER_CMD_DONE
ldb #SS.FSet
ldx #server_timeout_interval
ldy #0
ldu #server_timeout_signal
os9 I$SetStt
ldu <uRegImage
lbra PARSE_SERVER_CMD_DONE
PARSE_SERVER_CMD_PREFIX_ZEROS_005
leax 4,X ; skip over code
leay strNetworkKeyword,PCR
lbsr STRING_SEARCH_KEYWORD
lbcs PARSE_SERVER_CMD_IGNORE_WHOLE_THING ; could be in next 005 msg
leay serverNetworkName,U
lbsr PARAM_COPY
lbcs PARSE_SERVER_CMD_ERROR
lbsr STATUS_BAR_UPDATE
; tell the user what their actual nickname is from the server
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
lda #colorJoinPart
lbsr COPY_COLOR_CODE_FOREGROUND
ldd #"* "
std ,Y++
leax strUserMsgYourNick,PCR
lbsr STRING_COPY
lda #colorYourNick
lbsr COPY_COLOR_CODE_FOREGROUND
leax serverYourNick,U
lbsr STRING_COPY
lbra PARSE_SERVER_CMD_TERMINATE_PRINT_OUTPUTBUFFER
PARSE_SERVER_CMD_PREFIX_TWOS
ldd 1,X
cmpd #"50"
lbeq PARSE_SERVER_CMD_PRINT_MSG_BODY_ONLY
cmpd #"51"
lbeq PARSE_SERVER_CMD_PRINT_MSG_BODY_ONLY
cmpd #"52"
beq PARSE_SERVER_CMD_PREFIX_TWOS_SINGLE_PARAM_MSG
cmpd #"53"
beq PARSE_SERVER_CMD_PREFIX_TWOS_SINGLE_PARAM_MSG
cmpd #"54"
beq PARSE_SERVER_CMD_PREFIX_TWOS_SINGLE_PARAM_MSG
cmpd #"55"
lbeq PARSE_SERVER_CMD_PRINT_MSG_BODY_ONLY
cmpd #"65"
beq PARSE_SERVER_CMD_PREFIX_TWOS_SKIP_TWO_PARAMS
cmpd #"66"
beq PARSE_SERVER_CMD_PREFIX_TWOS_SKIP_TWO_PARAMS
lbra PARSE_SERVER_CMD_SHOW_RAW_CMD
PARSE_SERVER_CMD_PREFIX_TWOS_SINGLE_PARAM_MSG
lbsr SKIP_COMMAND_AND_NICKNAME
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
ldd #"* "
std ,Y++
lbsr PARAM_COPY
lda #C$SPAC
sta ,Y+
lbsr SKIP_SERVER_MSG_COLON
lbsr STRING_COPY_CR
lbra PARSE_SERVER_CMD_TERMINATE_PRINT_OUTPUTBUFFER
PARSE_SERVER_CMD_PREFIX_TWOS_SKIP_TWO_PARAMS
lbsr SKIP_COMMAND_AND_NICKNAME
lbsr FIND_NEXT_SPACE_NULL_CR
leax 1,X
lbsr FIND_NEXT_SPACE_NULL_CR
lbsr SKIP_SERVER_MSG_COLON
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
ldd #"* "
std ,Y++
lbsr STRING_COPY_CR
lbra PARSE_SERVER_CMD_TERMINATE_PRINT_OUTPUTBUFFER
PARSE_SERVER_CMD_PREFIX_THREES
ldd 1,X
cmpd #"75"
beq PARSE_SERVER_CMD_PREFIX_THREES_MOTD_START
cmpd #"72"
lbeq PARSE_SERVER_CMD_PREFIX_THREES_MOTD
cmpd #"76"
beq PARSE_SERVER_CMD_PREFIX_THREES_MOTD_END
cmpd #"24"
lbeq PARSE_SERVER_CMD_PREFIX_THREES_CHANMODE
cmpd #"31"
lbeq PARSE_SERVER_CMD_PREFIX_THREES_TOPIC_NOT_SET
cmpd #"32"
lbeq PARSE_SERVER_CMD_PREFIX_THREES_TOPIC
cmpd #"33"
lbeq PARSE_SERVER_CMD_PREFIX_THREES_TOPIC_SET_BY
cmpd #"53"
lbeq PARSE_SERVER_CMD_PREFIX_THREES_NAMES
cmpd #"66"
lbeq PARSE_SERVER_CMD_PREFIX_THREES_NAMES_END
cmpd #"11"
lbeq PARSE_SERVER_CMD_PREFIX_THREES_WHOIS_HOSTMASK
cmpd #"12"
lbeq PARSE_SERVER_CMD_PREFIX_THREES_WHOIS_GENERIC
cmpd #"17"
lbeq PARSE_SERVER_CMD_PREFIX_THREES_WHOIS_IDLE_SIGNON
cmpd #"18"
lbeq PARSE_SERVER_CMD_PREFIX_THREES_WHOIS_GENERIC
cmpd #"19" ; whois channel list
lbeq PARSE_SERVER_CMD_PREFIX_THREES_WHOIS_GENERIC
cmpd #"30"
lbeq PARSE_SERVER_CMD_PREFIX_THREES_WHOIS_LOGIN
cmpd #"78"
lbeq PARSE_SERVER_CMD_PREFIX_THREES_WHOIS_GENERIC
lbra PARSE_SERVER_CMD_SHOW_RAW_CMD ; DEBUG for now
PARSE_SERVER_CMD_PREFIX_THREES_MOTD_START
lda <printMOTDflag
lbne PARSE_SERVER_CMD_PRINT_MSG_BODY_ONLY
; if here, then we are suppressing the MOTD cuz of crazy scrolling
leax strUserMsgMOTDsuppress,PCR
lbsr PRINT_INFO_ERROR_MESSAGE
lbra PARSE_SERVER_CMD_DONE
PARSE_SERVER_CMD_PREFIX_THREES_MOTD_END
lda <printMOTDflag
lbne PARSE_SERVER_CMD_PRINT_MSG_BODY_ONLY
; if here, we are done supressing. let user know
leax strUserMsgMOTDsuppressed,PCR
lbsr PRINT_CHATLOG_NULL_STRING
lbra PARSE_SERVER_CMD_DONE
PARSE_SERVER_CMD_PREFIX_THREES_MOTD
; check if user wants MOTD printed to screen (it can be very long)
lda <printMOTDflag
lbne PARSE_SERVER_CMD_PRINT_MSG_BODY_ONLY
lbra PARSE_SERVER_CMD_DONE
PARSE_SERVER_CMD_PREFIX_THREES_CHANMODE
; TODO LATER
lbra PARSE_SERVER_CMD_SHOW_RAW_CMD
PARSE_SERVER_CMD_PREFIX_THREES_TOPIC_NOT_SET
lbsr SKIP_COMMAND_AND_NICKNAME
stx <serverCmdPtr ; save pointer to chan name
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
lda #colorJoinPart
lbsr COPY_COLOR_CODE_FOREGROUND
ldd #"* "
std ,Y++
leax strUserMsgTopicNotSet,PCR
lbsr STRING_COPY_RAW
lda #colorChanName
lbsr COPY_COLOR_CODE_FOREGROUND
ldx <serverCmdPtr
lbsr PARAM_COPY
lbra PARSE_SERVER_CMD_TERMINATE_PRINT_OUTPUTBUFFER
PARSE_SERVER_CMD_PREFIX_THREES_TOPIC
lbsr SKIP_COMMAND_AND_NICKNAME
PARSE_SERVER_CMD_PREFIX_THREES_TOPIC_KEYWORD_ENTRY
stx <serverCmdPtr
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
lda #colorJoinPart
lbsr COPY_COLOR_CODE_FOREGROUND
ldd #"* "
std ,Y++
leax strUserMsgTopic,PCR
lbsr STRING_COPY
lda #colorChanName
lbsr COPY_COLOR_CODE_FOREGROUND
ldx <serverCmdPtr
lbsr PARAM_COPY
lbsr SKIP_SERVER_MSG_COLON
lda #colorJoinPart
lbsr COPY_COLOR_CODE_FOREGROUND
ldd #": "
std ,Y++
lbsr STRING_COPY_CR
lbra PARSE_SERVER_CMD_TERMINATE_PRINT_OUTPUTBUFFER
PARSE_SERVER_CMD_PREFIX_THREES_TOPIC_SET_BY
lbsr SKIP_COMMAND_AND_NICKNAME
stx <serverCmdPtr
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
lda #colorJoinPart
lbsr COPY_COLOR_CODE_FOREGROUND
ldd #"* "
std ,Y++
leax strUserMsgTopic,PCR
lbsr STRING_COPY
lda #colorChanName
lbsr COPY_COLOR_CODE_FOREGROUND
ldx <serverCmdPtr
lbsr PARAM_COPY
leax 1,X ; skip expected space
stx <serverCmdPtr ; save pointer to start of hostmask
lda #colorJoinPart
lbsr COPY_COLOR_CODE_FOREGROUND
leax strUserMsgTopicSetBy,PCR
lbsr STRING_COPY_RAW
lda #colorNickChan
lbsr COPY_COLOR_CODE_FOREGROUND
; extract the topic creator's nickname from his/her hostmask
ldx <serverCmdPtr ; get topic creator hostmask or nickname pointer back
lbsr PARAM_COPY_NICK_FROM_HOSTMASK
lbcs PARSE_SERVER_CMD_ERROR
lda #colorJoinPart
lbsr COPY_COLOR_CODE_FOREGROUND
; FOR TESTING
ldd #" o"
std ,Y++
ldd #"n "
std ,Y++
lbsr CONVERT_EPOCH_ASCII_TO_DWORD ; this always updates X to point to terminating char at end of epoch string
lbsr EPOCH_CALCULATE_DATE_TIME
lbsr COPY_STRING_EPOCH_TIMESTAMP
lbra PARSE_SERVER_CMD_TERMINATE_PRINT_OUTPUTBUFFER
PARSE_SERVER_CMD_PREFIX_THREES_NAMES
; if this is result of /NAMES command, always display it
lda <namesRequestedFlag
bne PARSE_SERVER_CMD_PREFIX_THREES_NAMES_REQUESTED
; if here, this is result of a JOIN. check if user wants these displayed
lda <showNamesOnJoinFlag
lbeq PARSE_SERVER_CMD_IGNORE_WHOLE_THING ; nope. ignore NAME server commands
PARSE_SERVER_CMD_PREFIX_THREES_NAMES_REQUESTED
lbsr SKIP_COMMAND_AND_NICKNAME
; now skip the next two chars which can be things like "= " or "@ " etc
leax 2,X
;ldd ,X++
;cmpd #"= "
; lbne PARSE_SERVER_CMD_ERROR ; something is wrong with syntax
; check names flag to see if we are expecting more nicknames from another
; 353 command
lda <moreNamesPendingFlag
beq PARSE_SERVER_CMD_PREFIX_THREES_NAMES_FIRST_TIME
lbsr FIND_NEXT_SPACE_NULL_CR ; skip the channel name
ldd ,X++
cmpd #" :"
lbne PARSE_SERVER_CMD_ERROR
; skip to printing the names
bra PARSE_SERVER_CMD_PREFIX_THREES_NAMES_NEXT
PARSE_SERVER_CMD_PREFIX_THREES_NAMES_FIRST_TIME
inc <moreNamesPendingFlag
stx <serverCmdPtr
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
lda #colorJoinPart
lbsr COPY_COLOR_CODE_FOREGROUND
ldd #"* "
std ,Y++
leax strUserMsgNames,PCR
lbsr STRING_COPY_RAW
lda #colorChanName
lbsr COPY_COLOR_CODE_FOREGROUND
ldx <serverCmdPtr
lbsr PARAM_COPY ; copy the channel name into the user message
lbsr SKIP_SERVER_MSG_COLON
stx <serverCmdPtr
; add the colon in the user msg and print
lda #colorJoinPart
lbsr COPY_COLOR_CODE_FOREGROUND
lda #':'
sta ,Y+
ldd #cr_lf
std ,Y++
; add color codes for normal foreground in at the end for usernames
lda #colorNormal
lbsr COPY_COLOR_CODE_FOREGROUND
clr ,Y
leax outputBuffer,U
lbsr PRINT_CHATLOG_NULL_STRING
; now lets do the fixed width printing of nicknames
ldx <serverCmdPtr
PARSE_SERVER_CMD_PREFIX_THREES_NAMES_NEXT
leay outputBuffer,U
lbsr PARAM_COPY
leay outputBuffer,U
lda <chatlogPath
lbsr PRINT_FIXED_WIDTH
lda ,X+
cmpa #C$CR
bne PARSE_SERVER_CMD_PREFIX_THREES_NAMES_NEXT
lbra PARSE_SERVER_CMD_DONE
PARSE_SERVER_CMD_PREFIX_THREES_NAMES_END
; if this is result of /NAMES command, always display it
lda <namesRequestedFlag
bne PARSE_SERVER_CMD_PREFIX_THREES_NAMES_END_REQUESTED
; if here, this is result of a JOIN. check if user wants these displayed
lda <showNamesOnJoinFlag
lbeq PARSE_SERVER_CMD_IGNORE_WHOLE_THING ; nope. ignore NAME server commands
; even if user wants to use names from join, skip if channel list was empty
lda <moreNamesPendingFlag
lbeq PARSE_SERVER_CMD_IGNORE_WHOLE_THING
PARSE_SERVER_CMD_PREFIX_THREES_NAMES_END_REQUESTED
clr <moreNamesPendingFlag
clr <namesRequestedFlag ; reset flag for next time
leay outputBuffer,U
ldd #cr_lf
std ,Y++
lbsr STRING_COPY_TIMESTAMP ; grab new timestamp and copy it in
lda #colorJoinPart
lbsr COPY_COLOR_CODE_FOREGROUND
ldd #"* "
std ,Y++
leax strUserMsgNamesEnd,PCR
lbsr STRING_COPY_RAW
lbra PARSE_SERVER_CMD_TERMINATE_PRINT_OUTPUTBUFFER
PARSE_SERVER_CMD_PREFIX_THREES_WHOIS_HOSTMASK
lbsr SKIP_COMMAND_AND_NICKNAME
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
lda #colorNotice
lbsr COPY_COLOR_CODE_FOREGROUND
ldd #"* "
std ,Y++
lda #'['
sta ,Y+
lbsr PARAM_COPY
ldd #"] "
std ,Y++
lda #'('
sta ,Y+
leax 1,X ; skip the space
lbsr PARAM_COPY
lda #'@'
sta ,Y+
leax 1,X ; skip the space
lbsr PARAM_COPY
ldd #"):"
std ,Y++
lda #C$SPAC
sta ,Y+
leax 2,X ; skip space and asterix normally found here
lbsr SKIP_SERVER_MSG_COLON
lbsr STRING_COPY_CR
lbra PARSE_SERVER_CMD_TERMINATE_PRINT_OUTPUTBUFFER
PARSE_SERVER_CMD_PREFIX_THREES_WHOIS_LOGIN
lbsr SKIP_COMMAND_AND_NICKNAME
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
lda #colorNotice
lbsr COPY_COLOR_CODE_FOREGROUND
ldd #"* "
std ,Y++
lda #'['
sta ,Y+
lbsr PARAM_COPY
ldd #"] "
std ,Y++
leax 1,X ; skip the space
stx <serverCmdPtr
lbsr FIND_NEXT_SPACE_NULL_CR
lbsr SKIP_SERVER_MSG_COLON
lbsr STRING_COPY_CR
lda #C$SPAC
sta ,Y+
ldx <serverCmdPtr
lbsr PARAM_COPY
lbra PARSE_SERVER_CMD_TERMINATE_PRINT_OUTPUTBUFFER
PARSE_SERVER_CMD_PREFIX_THREES_WHOIS_GENERIC
lbsr SKIP_COMMAND_AND_NICKNAME
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
lda #colorNotice
lbsr COPY_COLOR_CODE_FOREGROUND
ldd #"* "
std ,Y++
lda #'['
sta ,Y+
lbsr PARAM_COPY
ldd #"] "
std ,Y++
lbsr SKIP_SERVER_MSG_COLON
lbsr STRING_COPY_CR
lbra PARSE_SERVER_CMD_TERMINATE_PRINT_OUTPUTBUFFER
PARSE_SERVER_CMD_PREFIX_THREES_WHOIS_IDLE_SIGNON
lbsr SKIP_COMMAND_AND_NICKNAME
stx <outputBufferPtr ; save pointer to nickname in msg
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
lda #colorNotice
lbsr COPY_COLOR_CODE_FOREGROUND
ldd #"* "
std ,Y++
lda #'['
sta ,Y+
lbsr PARAM_COPY
ldd #"] "
std ,Y++
leax 1,X ; skip expected space
lbsr CONVERT_EPOCH_ASCII_TO_DWORD
stx <serverCmdPtr ; save pointer to terminator after idle time epoch value
lbsr EPOCH_CALCULATE_IDLE_TIME
leax strUserMsgWhoisIdle,PCR
lbsr STRING_COPY_RAW
lda #1 ; ignore leading zeros
ldb <epochDay
lbsr COPY_BYTE_TO_STRING
leax strUserMsgWhoisDays,PCR
lbsr STRING_COPY_RAW
lda #1 ; ignore leading zeros
ldb <epochHour
lbsr COPY_BYTE_TO_STRING
leax strUserMsgWhoisHours,PCR
lbsr STRING_COPY_RAW
lda #1 ; ignore leading zeros
ldb <epochMinute
lbsr COPY_BYTE_TO_STRING
leax strUserMsgWhoisMins,PCR
lbsr STRING_COPY_RAW
lda #1 ; ignore leading zeros
ldb <epochSecond
lbsr COPY_BYTE_TO_STRING
leax strUserMsgWhoisSecs,PCR
lbsr STRING_COPY_RAW
; now do the signon time
ldd #cr_lf
std ,Y++
lbsr STRING_COPY_TIMESTAMP
lda #colorNotice
lbsr COPY_COLOR_CODE_FOREGROUND
ldd #"* "
std ,Y++
lda #'['
sta ,Y+
ldx <outputBufferPtr
lbsr PARAM_COPY
ldd #"] "
std ,Y++
leax strUserMsgWhoisSignon,PCR
lbsr STRING_COPY_RAW
ldx <serverCmdPtr
leax 1,X ; skip expected space to point to signon epoch num
lbsr CONVERT_EPOCH_ASCII_TO_DWORD ; this routine skips whitespace already
lbsr EPOCH_CALCULATE_DATE_TIME
lbsr COPY_STRING_EPOCH_TIMESTAMP
lbra PARSE_SERVER_CMD_TERMINATE_PRINT_OUTPUTBUFFER
PARSE_SERVER_CMD_PREFIX_FOURS
ldd 1,X
cmpd #"22"
lbeq PARSE_SERVER_CMD_PRINT_MSG_BODY_ONLY
cmpd #"33"
lbeq PARSE_SERVER_CMD_NICK_IN_USE
cmpd #"01"
beq PARSE_SERVER_CMD_PREFIX_FOURS_NO_SUCH_NICK
cmpd #"03"
beq PARSE_SERVER_CMD_PREFIX_FOURS_NO_SUCH_CHAN
cmpd #"82"
beq PARSE_SERVER_CMD_PREFIX_FOURS_OP_PRIV_NEEDED
cmpd #"67" ; channel key already set
lbeq PARSE_SERVER_CMD_PREFIX_FOURS_CANNOT_JOIN_GENERIC
cmpd #"71" ; channel is full
lbeq PARSE_SERVER_CMD_PREFIX_FOURS_CANNOT_JOIN_GENERIC
cmpd #"73" ; invite only
lbeq PARSE_SERVER_CMD_PREFIX_FOURS_CANNOT_JOIN_GENERIC
cmpd #"74" ; you are banned
lbeq PARSE_SERVER_CMD_PREFIX_FOURS_CANNOT_JOIN_GENERIC
cmpd #"75" ; bad channel key
lbeq PARSE_SERVER_CMD_PREFIX_FOURS_CANNOT_JOIN_GENERIC
cmpd #"77" ; must be registered (+r)
beq PARSE_SERVER_CMD_PREFIX_FOURS_CANNOT_JOIN_GENERIC
lbra PARSE_SERVER_CMD_SHOW_RAW_CMD
PARSE_SERVER_CMD_PREFIX_FOURS_NO_SUCH_NICK
lbsr SKIP_COMMAND_AND_NICKNAME
stx <serverCmdPtr
; build output string to print to user
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
leax strErrorNoSuchNick,PCR
lbsr STRING_COPY_RAW
lda #colorNickChan
lbsr COPY_COLOR_CODE_FOREGROUND
ldx <serverCmdPtr
lbsr PARAM_COPY
lbra PARSE_SERVER_CMD_TERMINATE_PRINT_OUTPUTBUFFER
PARSE_SERVER_CMD_PREFIX_FOURS_NO_SUCH_CHAN
lbsr SKIP_COMMAND_AND_NICKNAME
stx <serverCmdPtr
; build output string to print to user
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
leax strErrorNoSuchChannel,PCR
lbsr STRING_COPY_RAW
lda #colorChanName
lbsr COPY_COLOR_CODE_FOREGROUND
ldx <serverCmdPtr
lbsr PARAM_COPY
lbra PARSE_SERVER_CMD_TERMINATE_PRINT_OUTPUTBUFFER
PARSE_SERVER_CMD_PREFIX_FOURS_OP_PRIV_NEEDED
lbsr SKIP_COMMAND_AND_NICKNAME
stx <serverCmdPtr
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
lda #colorJoinPart
lbsr COPY_COLOR_CODE_FOREGROUND
leax strErrorNoOps,PCR
lbsr STRING_COPY_RAW
lda #colorChanName
lbsr COPY_COLOR_CODE_FOREGROUND
ldx <serverCmdPtr
lbsr PARAM_COPY
lbra PARSE_SERVER_CMD_TERMINATE_PRINT_OUTPUTBUFFER
PARSE_SERVER_CMD_PREFIX_FOURS_CANNOT_JOIN_GENERIC
lbsr SKIP_COMMAND_AND_NICKNAME
stx <serverCmdPtr
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP
lbsr FIND_NEXT_SPACE_NULL_CR ; skip over chan name
lbsr SKIP_SERVER_MSG_COLON
lda #colorJoinPart
lbsr COPY_COLOR_CODE_FOREGROUND
ldd #"* "
std ,Y++
lbsr STRING_COPY_CR
lda #C$SPAC
sta ,Y+
lda #colorChanName
lbsr COPY_COLOR_CODE_FOREGROUND
ldx <serverCmdPtr
lbsr PARAM_COPY
lbra PARSE_SERVER_CMD_TERMINATE_PRINT_OUTPUTBUFFER
; if prefix is in 600s, here is where we check which one it is
PARSE_SERVER_CMD_PREFIX_SIXES
ldd 1,X
cmpd #"71"
lbeq PARSE_SERVER_CMD_PREFIX_THREES_WHOIS_GENERIC
lbra PARSE_SERVER_CMD_SHOW_RAW_CMD ; DEBUG for now
PARSE_SERVER_CMD_PING
; respond with the same message in a PONG
leay outputBuffer,U
ldd #"PO"
std ,Y++
ldd #"NG"
std ,Y++
lda #C$SPAC
sta ,Y+
leax 5,X
; I rewrote this part that originally used STRING_COPY_INCLUDE_CRLF since that routine isnt needed anymore
; if PING/PONG stops working though for some reason, its prob cuz of this.
lbsr STRING_COPY_CR
ldd #cr_lf
std ,Y++
clr ,Y
leax outputBuffer,U
lda <networkPath
lbsr WRITE_CRLF_STRING
lbra PARSE_SERVER_CMD_DONE
; this is the KEYWORD version of the topic server command
PARSE_SERVER_CMD_TOPIC
lbsr FIND_NEXT_SPACE_NULL_CR ; skip the command word
leax 1,X ; skip expected space
lbra PARSE_SERVER_CMD_PREFIX_THREES_TOPIC_KEYWORD_ENTRY
PARSE_SERVER_CMD_QUIT
lbsr FIND_NEXT_SPACE_NULL_CR ; skip the command word
stx <serverCmdPtr
leay outputBuffer,U
lbsr STRING_COPY_TIMESTAMP ; grab and copy in new timestamp
lda #colorQuit
lbsr COPY_COLOR_CODE_FOREGROUND
ldd #"* "
std ,Y++
lbsr GET_NICK_FROM_SOURCE_HOSTMASK
leax sourceNickname,U
lbsr STRING_COPY_RAW
leax strUserMsgQuit,PCR