home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / BBS_UTIL / BM0406_A.ZIP / RCHAT401.ZIP / RCHAT401.BAS < prev    next >
BASIC Source File  |  1992-09-14  |  32KB  |  833 lines

  1. '
  2. ' RChat401  --  Or, RBBS-Chat, release 4.01.  A character by character
  3. '               internode chat program..
  4. '
  5. '  Not the worlds prettiest, or cleanest code.. but I'm under no illusions..
  6. '
  7. '  Copyright 1989-1992 By John Morris  All Rights Reserved
  8. '
  9. '  I'm not a big fan of global variables, but here goes..
  10. '
  11. '  $INCLUDE: 'RBBS-VAR.MOD'   'RBBS-VAR.BAS minus the DEF FN...
  12. '
  13.  
  14. REM **********************************************************************
  15. REM ***  Change 'CONST LogChatToDisk = -1' if you wish to record       ***
  16. REM ***  all of the chats. This is for your protection!   If you turn  ***
  17. REM ***  this option on (-1) then the users will be notified that      ***
  18. REM ***  the chat is being recorded (they have a right to know!)       ***
  19. REM ***  Chat filenames have this format: MM-DD-HH.CHAT or             ***
  20. REM ***  month-day-hour.CHT                                            ***
  21. REM **********************************************************************
  22.  
  23.    CONST LogChatToDisk = 0
  24.    CONST ChatFileName$ = "H:RBBSCHAT.DEF"  'change this to a RAM drive for
  25.                                            'best possible speed (see docs)
  26.                                            'must change to match BBS default
  27.                                            'drive or RAM disk..
  28.    DEFINT A - Z
  29.  
  30. REM *************************************************************
  31. REM ** The following are needed by only 2 or 3 subprograms, so,**
  32. REM ** they are declared COMMON, and then SHARED only in some  **
  33. REM ** of the subprgms.. the fewer that have access the better **
  34. REM *************************************************************
  35.  
  36.    COMMON /Chat/ DoTrueChat, HasPaged, UpperNode, LowerNode, SaveToDisk
  37.    COMMON /Chat/ NodesToSquelch$, RePage, DOSVersion
  38.  
  39. REM *************************************************************
  40. REM ** The below are the shared fields used by the subprograms **
  41. REM ** Each and every one is declared as COMMON SHARED so every**
  42. REM ** subprogram has access to the following variables        **
  43. REM *************************************************************
  44.  
  45.    COMMON SHARED /ChatField/ ChatActivity$, PagingNode$, PrivateFor$
  46.    COMMON SHARED /ChatField/ ChatInput$, ChatName$, InTrueChat$
  47.    COMMON SHARED /ChatField/ TrueChatIndex$, SavingToDisk$, BBSActivity$
  48. '
  49. 59800 ' $SUBTITLE: 'LogNewForChat - Save user info for chat'
  50. ' $PAGE
  51. '
  52. '  NAME    -- LogNewForChat
  53. '
  54. '  INPUTS  -- NodesInSystem -- needed for creation of RBBSCHAT.DEF
  55. '
  56. '  OUTPUTS -- Updates the node record in RBBSCHAT.DEF with this users
  57. '             name and chat activity (always "I") when the user logs on.
  58. '
  59. '  PURPOSE -- See OUTPUTS. Also, if no RBBSCHAT.DEF is not found, one will be
  60. '             created.
  61. '
  62.       SUB LogNewForChat(NodesInSystem) STATIC
  63.  
  64.       SHARED DOSVersion
  65.  
  66.       CALL FindItX (ChatFileName$, 10)
  67.       REM ** If "RBBSCHAT.DEF" does not exist, then create it **
  68.       IF NOT ZOK THEN
  69.          CALL OpenWrk10 (ChatFileName$)
  70.          FIELD 10, 128 AS TempNode$
  71.          LSET TempNode$ = SPACE$(128)
  72.          FOR Index = 1 TO ZMaxNodes
  73.             CALL Update10 (Index, ZFalse)
  74.          NEXT
  75.       END IF
  76.       ChatIndex = ZNodeRecIndex - 1
  77.       CLOSE 10
  78.       CALL OpenWrk10 (ChatFileName$)
  79.       CALL Field10
  80.       CALL LockUnlock10 (ZTrue)
  81.       CALL Update10 (ChatIndex, ZTrue)
  82.       LSET ChatActivity$ = "I"    ' I means inactive
  83.       LSET PagingNode$ = MKI$(0)
  84.       LSET ChatName$ = SPACE$(31)
  85.       IF ZActiveUserName$ = ZSysopPswd1$ + " " + ZSysopPswd2$ THEN
  86.          LSET ChatName$ = "SYSOP"
  87.        ELSE
  88.          LSET ChatName$ = ZActiveUserName$
  89.       END IF
  90.       LSET ChatInput$ = SPACE$(72)
  91.       LSET InTrueChat$ = "I"
  92.       CALL Update10 (ChatIndex, ZFalse)
  93.       CALL LockUnlock10 (ZFalse)
  94.       CLOSE 10
  95.       HasPaged = 0
  96.       END SUB
  97.  
  98. 59810 ' $SUBTITLE: 'CBCHECK - Check for a page attempt'
  99. ' $PAGE
  100. '
  101. '  NAME    -- CBCHECK
  102. '
  103. '  INPUTS  -- NONE
  104. '
  105. '  OUTPUTS -- ChatActivity$   Changed to reflect whether or not they
  106. '                             are going to chat
  107. '             WillChat        If WillChat is TRUE, then the user will
  108. '                             automatically be thrust unawares into
  109. '                             chat mode.. They said yes... didn't they?
  110. '
  111. '  PURPOSE -- Check to see if we have been paged from another node
  112. '
  113.       SUB CBCheck(WillChat) STATIC
  114.  
  115.       ' You might just wanna REM this out..
  116.       IF NOT ZAvailableForChat THEN
  117.          EXIT SUB
  118.       END IF
  119.  
  120.       WillChat = ZFalse
  121.       ZOutTxt$ = ""
  122.       IsTrueChat = ZFalse
  123.       CALL FindItX (ChatFileName$, 10)
  124.       IF NOT ZOK THEN
  125.          EXIT SUB
  126.       END IF
  127.       ChatIndex = ZNodeRecIndex - 1
  128.       CLOSE 10
  129.       CALL OpenWrk10 (ChatFileName$)
  130.       CALL Field10
  131.       CALL Update10 (ChatIndex, ZTrue)
  132.       IF ChatActivity$ = "R" THEN   'R means request for chat
  133.          PagerIndex = CVI(PagingNode$)
  134.          CALL RingCaller
  135.          CALL Update10 (PagerIndex, ZTrue)
  136.          IsTrueChat = (InTrueChat$ = "A")
  137.          ZOutTxt$ = ChatName$
  138.          CALL TrimTrail (ZOutTxt$, " ")
  139.          CALL NameCaps(ZOutTxt$)
  140.          CALL UpdtCalr("Paged for Chat by " + ZOutTxt$ + " on node" + STR$(PagerIndex), 1)
  141.          CALL QuickTPut( ZOutTxt$ + " is requesting that you join in a chat!", 1)
  142.          ZOutTxt$ = "Would you like to join the chat ([Y]/N)"  'JM920206
  143.          ZSubParm = 1
  144.          CALL TGet
  145.          IF ZSubParm = -1 THEN
  146.             CLOSE 10
  147.             EXIT SUB
  148.          END IF
  149.          CALL LockUnlock10 (ZTrue)
  150.          CALL Update10 (ChatIndex, ZTrue)
  151.          IF ZNo THEN
  152.             LSET ChatActivity$ = "N"   'No, I don't think I'll chat
  153.           ELSE
  154.             LSET ChatActivity$ = "Y"   'Yeah, I might just join a chat
  155.             WillChat = ZTrue
  156.          END IF
  157.          IF IsTrueChat THEN
  158.             LSET InTrueChat$ = "Y"
  159.           ELSE
  160.             LSET InTrueChat$ = "I"
  161.          END IF
  162.          CALL Update10 (ChatIndex, ZFalse)
  163.          CALL LockUnlock10 (ZFalse)
  164.       END IF
  165.       CLOSE 10
  166.       END SUB
  167.  
  168. 59820 ' $SUBTITLE: 'PageEm - attempt to page another user to chat'
  169. ' $PAGE
  170. '
  171. '  NAME    -- PageEm
  172. '
  173. '  INPUTS  -- ShowOnly         Show whos is on the other nodes only
  174. '             NodesInSystem    Number of nodes in this system
  175. '
  176. '  OUTPUTS -- HasPaged        -1 exit chat mode
  177. '                              0 don't check for reply to page
  178. '                              1 - NodesInSystem check for page reply
  179. '
  180. '  PURPOSE -- Page another user on the system and set up for a reply
  181. '             from the other user
  182. '
  183.       SUB PageEm(CurrentNodeIndex, NodesInSystem) STATIC
  184.  
  185.       REM ** Page 'Em needs access to the COMMON variable HasPaged & RePage **
  186.       SHARED DoTrueChat, HasPaged, UpperNode, LowerNode, RePage
  187.  
  188. RePageEm:
  189.       HasPaged = 0
  190.       CALL WhosOn (NodesInSystem)
  191.       CALL SkipLine(1)
  192.       ZOutTxt$ = "Chat with which node (1 -" + STR$(NodesInSystem) + ")" + ZPressEnter$
  193.       ZSubParm = 1
  194.       CALL TGet
  195.       IF ZWasQ = 0 OR ZSubParm = -1 THEN
  196.          EXIT SUB
  197.       END IF
  198.       CALL CheckInt(ZUserIn$(1))
  199.       CALL Field10
  200.       IF ZTestedIntValue > 0 AND ZTestedIntValue <= NodesInSystem AND _
  201.          ZTestedIntValue <> CurrentNodeIndex THEN
  202.          CALL Update10 (ZTestedIntValue, ZTrue)
  203.          IF ChatActivity$ = "A" THEN        'if other node already
  204.             IF InTrueChat$ = "A" THEN         'can't page 'em if in true chat
  205.                CALL QuickTPut1("Sorry, the node you requested is in a private chat!")
  206.                EXIT SUB
  207.             END IF
  208.             '
  209.             'If the other node is active in chat , but not in a private chat
  210.             'then we'll just drop down to 'CALL CBTrueChat'
  211.             '
  212.           ELSE
  213.             HasPaged = ZTestedIntValue
  214.             ZOutTxt$ = "Should this be a private chat ([Y]/N)"
  215.             ZSubParm = 1
  216.             CALL TGet
  217.             IF ZYes OR (ZWasQ = 0) THEN
  218.                DoTrueChat = ZTrue
  219.                LowerNode = HasPaged
  220.                UpperNode = HasPaged
  221.             END IF
  222.             CALL QuickTPut1("Hang on,  I'll let them know you want to chat")
  223.             CALL QuickTPut1("If you don't get an answer within a couple minutes,")
  224.             CALL QuickTPut1("then you probably won't get an answer")
  225.             LSET ChatActivity$ = "R"                        'R means Request
  226.             LSET PagingNode$ = MKI$(CurrentNodeIndex)
  227.             CALL LockUnlock10 (ZTrue)
  228.             CALL Update10 (ZTestedIntValue, ZFalse)
  229.             CALL LockUnlock10 (ZFalse)
  230.  
  231.             IF DoTrueChat THEN
  232.                CALL LockUnlock10 (ZTrue)
  233.                CALL Update10 (CurrentNodeIndex, ZTrue)
  234.                LSET InTrueChat$ = "A"
  235.                CALL Update10 (CurrentNodeIndex, ZFalse)
  236.                CALL LockUnlock10 (ZFalse)
  237.             END IF
  238.          END IF
  239.  
  240.          CALL CBTrueChat(NodesInSystem)
  241.  
  242.          ' user might want to repage some other node.. we'll just loop back
  243.          ' and start over..
  244.          IF RePage THEN
  245.             GOTO RePageEm
  246.          END IF
  247.  
  248.       END IF
  249.       END SUB
  250.  
  251. 59830 ' $SUBTITLE: 'CBTrueChat - The letter by letter chat'
  252. ' $PAGE
  253. '
  254. '  NAME    -- CBTrueChat
  255. '
  256. '  INPUTS  -- NodesInSystem
  257. '
  258. '  INTERNAL - NodesToSquelch$      STRING OF NODES NOT TO RECEIVE TEXT FROM
  259. '             HasPaged             NODE (IF ANY) THAT THIS USER PAGED
  260. '             CurrentNodeIndex     NODE RECORD IN "RBBSCHAT.DEF"
  261. '             ChatActivity$        CURRENT STATUS OF EACH NODE
  262. '             PagingNode$          NODE WHICH HAS PAGED THIS ONE
  263. '             ChatInput$           CURRENT TEXT INPUT BY USER FOR CHATTING
  264. '             ChatName$            NAME OF USER ON EACH NODE (NOT CURRENTLY USED)
  265. '             SquelchIt            BOOLEAN - MEANS NODE IS IGNORED
  266. '             ZUserIn$()           USED TO SAVE CURRENT STATUS OF EACH NODE
  267. '                                  THIS INFO IS LATER COMPARED, AND IF THAT
  268. '                                  STATUS IS CHANGED, THEN THE USER IS NOTIFIED
  269. '                                  OF THE CHANGE
  270. '             DoTrueChat           Means we are in a true chat mode, we'll
  271. '                                  only check one node for input
  272. '
  273. '
  274. '  OUTPUTS -- NONE
  275. '
  276. '  PURPOSE -- To allow users to chat between nodes in several different
  277. '             ways.
  278. '
  279.       SUB CBTrueChat(NodesInSystem) STATIC
  280.  
  281.       SHARED DoTrueChat, HasPaged, UpperNode, LowerNode, SaveToDisk
  282.       SHARED NodesToSquelch$, RePage
  283.  
  284.       CALL SaveUserActivity("C", ZNodeRecIndex, ZFalse)
  285.  
  286.       ZCol = 1
  287.       SendRemote = ZRemoteEcho
  288.       SaveToDisk = ZFalse
  289.       DoTrueChat = ZFalse
  290.       NodesToSquelch$ = ""
  291.  
  292.       REM This can now be set by 'PageEm' -before- CBTrueChat is ever called..
  293.       ' HasPaged = 0
  294.  
  295.       IF HasPaged AND LogChatToDisk THEN
  296.          CALL SetUpLogFile
  297.       END IF
  298.  
  299.       ChatSubParm = 0
  300.       CALL FindItX (ChatFileName$, 10)
  301.       IF ZOK THEN
  302.          CurrentNodeIndex = ZNodeRecIndex - 1
  303.          CLOSE 10
  304.          CALL OpenWrk10 (ChatFileName$)
  305.          CALL Field10
  306.  
  307.          IF NOT RePage THEN
  308.             CALL UpdtCalr("Entered CBTrueCh@ sim at " + TIME$, 1)
  309.          END IF
  310.  
  311.          CALL QuickTPut1("Type Ctrl-Q or ESCape for a list of commands")
  312.  
  313.          REDIM TrueChatIndexHold(NodesInSystem)
  314.  
  315.          RePage = ZFalse
  316.  
  317.          CALL LockUnlock10 (ZTrue)
  318.          CALL Update10 (CurrentNodeIndex, ZTrue)
  319.          REM ** Set up for truechat mode.. two nodes in a private chat **
  320.          IF InTrueChat$ = "Y" OR InTrueChat$ = "A" THEN
  321.             IF InTrueChat$ = "Y" THEN
  322.                 LSET InTrueChat$ = "A"
  323.                 LowerNode = CVI(PagingNode$)
  324.                 UpperNode = CVI(PagingNode$)
  325.             END IF
  326.             DoTrueChat = ZTrue
  327.           ELSE
  328.             LowerNode = 1
  329.             UpperNode = NodesInSystem
  330.          END IF
  331.          LSET ChatActivity$ = "A"
  332.          LSET TrueChatIndex$ = MKI$(1)
  333.          CALL Update10 (CurrentNodeIndex, ZFalse)
  334.          CALL LockUnlock10 (ZFalse)
  335.  
  336.          REM ** Load in current node status for later comparison **
  337.          FOR LineIndex = 1 TO NodesInSystem
  338.             CALL Update10 (LineIndex, ZTrue)
  339.             ZUserIn$(LineIndex) = ChatActivity$
  340.             REM ** save current index so we don't get a bunch of trash if **
  341.             REM ** a chat is already in progress.                         **
  342.             IF ChatActivity$ = "A" THEN
  343.                TrueChatIndexHold(LineIndex) = CVI(TrueChatIndex$)
  344.              ELSE
  345.                TrueChatIndexHold(LineIndex) = 1
  346.             END IF
  347.          NEXT
  348.  
  349.          REM ** Set Autologoff time before we start looping **
  350.          ZAutoLogoff! = TIMER + ZWaitBeforeDisconnect
  351.  
  352.          REM ** We are currently getting name from MESSAGES file.. set that up..
  353.          WasA1$ = ZActiveMessageFile$
  354.          ZActiveMessageFile$ = ZOrigMsgFile$
  355.          CALL OpenMsg
  356.          FIELD 1, 128 AS ZMsgRec$
  357.  
  358.          DO 'the wild chat thingie..
  359.  
  360. REM **************************************************************************
  361. REM ******Check for answer to page, or text from other users in chat  ********
  362. REM ******If the other guy has 'page availability' turned off, then   ********
  363. REM ******we simply won't tell this guy.. he won't know the difference********
  364. REM **************************************************************************
  365.             FOR LineIndex = LowerNode TO UpperNode
  366.  
  367.                SquelchIt = ZFalse
  368.                IF LineIndex <> CurrentNodeIndex THEN
  369.  
  370.                   CALL Update10 (LineIndex, ZTrue)
  371.                   Index$ = MID$(STR$(LineIndex), 2, 1)
  372.  
  373.                   REM ** Check to see if node (LineIndex) has been squelched **
  374.                   IF NodesToSquelch$ <> "" THEN
  375.                      SquelchIt = (INSTR(NodesToSquelch$, Index$) > 0)
  376.                   END IF
  377.  
  378.                   REM ** Check to see if other node in truechat **
  379.                   IF NOT SquelchIt AND NOT DoTrueChat THEN
  380.                      SquelchIt = (InTrueChat$ = "A")
  381.                   END IF
  382.  
  383.                   REM ** Check for answer to page (if a page was done) **
  384.                   IF HasPaged = LineIndex THEN
  385.                      IF ChatActivity$ <> "R" THEN
  386.                         IF ChatActivity$ = "N" THEN
  387.                            CALL QuickTPut("Paged user said NO to chat mode!", 1)
  388.                            HasPaged = 0
  389.                          ELSEIF ChatActivity$ = "Y" THEN
  390.                            REM ** if the other dude answered Yes, they will automatically
  391.                            REM ** be sent into the chat mode.. so don't bother telling the
  392.                            REM ** guy that they answered yes.. just turn off HasPaged
  393.                            HasPaged = 0
  394.                         END IF
  395.                      END IF
  396.                   END IF
  397.  
  398.                   ChatTemp$ = ""
  399.                   NameTemp$ = ""
  400.  
  401.                   REM ** Check for change in node activity              **
  402.                   REM ** In this case, see if someone has left the chat **
  403.                   REM ** node must not be squelched                     **
  404.                   IF NOT SquelchIt THEN
  405.                      IF (ZUserIn$(LineIndex) = "A") AND (ChatActivity$ = "I") THEN
  406.                         GOSUB 59840
  407.                         CALL QuickTPut(NameTemp$ + " on Node " + Index$ + " has exited chat mode!", 1)
  408.                         IF DoTrueChat THEN
  409.                            DoTrueChat = ZFalse
  410.                            CALL LockUnlock10 (ZTrue)
  411.                            CALL Update10 (CurrentNodeIndex, ZTrue)
  412.                            LSET InTrueChat$ = "I"
  413.                            LSET ChatInput$ = SPACE$(72)
  414.                            LSET TrueChatIndex$ = MKI$(1)
  415.                            CALL Update10 (CurrentNodeIndex, ZFalse)
  416.                            CALL LockUnlock10 (ZFalse)
  417.                            REM ** TrueChat over.. start looping thru all nodes
  418.                            LowerNode = 1
  419.                            UpperNode = NodesInSystem
  420.                         END IF
  421.                      END IF
  422.                      REM ** OR, If someone has joined the chat **
  423.                      IF (ZUserIn$(LineIndex) <> "A") AND (ChatActivity$ = "A") THEN
  424.                         GOSUB 59840
  425.                         CALL QuickTPut(NameTemp$ + " on Node " + Index$ + " has entered the chat!", 1)
  426.                         REM ** Save the ring buffer index as they currently see it **
  427.                         TrueChatIndexHold(LineIndex) = CVI(TrueChatIndex$)
  428.                      END IF
  429.                   END IF
  430.  
  431.                   REM ** Save new node status (if any) **
  432.                   ZUserIn$(LineIndex) = ChatActivity$
  433.  
  434.                   REM ** If other node is active (& not squelched) check it **
  435.                   IF (ChatActivity$ = "A") AND (NOT SquelchIt) THEN
  436.  
  437.                      IF (CVI(TrueChatIndex$) <> TrueChatIndexHold(LineIndex)) THEN
  438.  
  439.                         OtherNodeInput$ = MID$(ChatInput$, TrueChatIndexHold(LineIndex), 1)
  440.  
  441.                         IF OtherNodeInput$ = CHR$(8) THEN
  442.                            CALL LPrnt(ZLocalBkSp$, 0)
  443.                            CALL PutCom (ZBackSpace$)
  444.                            IF SaveToDisk THEN
  445.                               CALL PrintWork(ZBackSpace$)
  446.                            END IF
  447.                            IF ZCol > 0 THEN
  448.                               ZCol = ZCol - 1
  449.                            END IF
  450.                          ELSEIF OtherNodeInput$ = ZCarriageReturn$ THEN
  451.                            CALL SkipLine(1)
  452.                            IF SaveToDisk THEN
  453.                               CALL PrintWorkA("")
  454.                            END IF
  455.                            ZCol = 1
  456.                          ELSE
  457.                            IF SaveToDisk THEN 'save to disk before colorization
  458.                               CALL PrintWork(OtherNodeInput$)
  459.                            END IF
  460.                            CALL ColorText(OtherNodeInput$, LineIndex)
  461.                            CALL LPrnt (OtherNodeInput$, 0)
  462.                            CALL PutCom(OtherNodeInput$)
  463.                            ZCol = ZCol + 1
  464.                            IF (ZCol > 65 AND OtherNodeInput$ = CHR$(32)) THEN
  465.                               CALL SkipLine(1)
  466.                               IF SaveToDisk THEN
  467.                                  CALL PrintWorkA("")
  468.                               END IF
  469.                               ZCol = 1
  470.                            END IF
  471.                         END IF
  472.                         TrueChatIndexHold(LineIndex) = TrueChatIndexHold(LineIndex) + 1
  473.                         IF TrueChatIndexHold(LineIndex) > 72 THEN TrueChatIndexHold(LineIndex) = 1
  474.  
  475.                      END IF
  476.                   END IF
  477.                END IF
  478.             NEXT
  479.  
  480. REM *************************************************************************
  481. REM *******Get text from local user (local, as in, this node of RBBS)********
  482. REM *******Also local, as in.. SysOp                                 ********
  483. REM *************************************************************************
  484.  
  485.             CALL FindFKey                ' will also get local key pressed
  486.             IF ZSubParm < 0 THEN
  487.                EXIT DO
  488.             END IF
  489.  
  490.             Key$ = ""
  491.             IF NOT ZLocalUser THEN
  492.                CALL EOFComm (Char%)
  493.               ELSE
  494.                Char% = -1
  495.             END IF
  496.             IF Char% <> -1 THEN          'if remote key in then get it
  497.                CALL GetCom(Key$)
  498.               ELSE
  499.                Key$ = ZKeyPressed$       'INKEY$ is performed in FindFKey
  500.             END IF
  501.             IF Key$ <> "" THEN
  502.                IF LEN(Key$) = 1 THEN
  503.                   IF Key$ = ZEscape$ OR Key$ = CHR$(17) THEN
  504.                      CALL ChatCommand(ChatSubParm, CurrentNodeIndex, NodesInSystem)
  505.                      IF ChatSubParm OR RePage THEN
  506.                         EXIT DO
  507.                      END IF
  508.                    ELSE
  509.                      CALL LockUnlock10 (ZTrue)
  510.                      CALL Update10(CurrentNodeIndex, ZTrue)
  511.                      TempChatInput$ = ChatInput$
  512.                      TempTrueChatIndex = CVI(TrueChatIndex$)
  513.                      MID$(TempChatInput$, TempTrueChatIndex, 1) = Key$
  514.                      LSET ChatInput$ = TempChatInput$
  515.                      TempTrueChatIndex = TempTrueChatIndex + 1
  516.                      IF TempTrueChatIndex > 72 THEN
  517.                         TempTrueChatIndex = 1
  518.                      END IF
  519.                      LSET TrueChatIndex$ = MKI$(TempTrueChatIndex)
  520.                      CALL Update10(CurrentNodeIndex, ZFalse)
  521.                      CALL LockUnlock10 (ZFalse)
  522.                      IF Key$ <> CHR$(8) THEN
  523.                         IF SaveToDisk THEN
  524.                            CALL PrintWork(Key$)
  525.                         END IF
  526.                         IF ZWasGR = 2 AND Key$ <> ZCarriageReturn$ THEN
  527.                            Key$ = ZEmphasizeOff$ + Key$
  528.                         END IF
  529.                         CALL QuickTPut(Key$, 0)
  530.                       ELSE
  531.                         CALL LPrnt(ZLocalBkSp$, 0)
  532.                         IF (NOT ZLocalUser) AND SendRemote THEN
  533.                            CALL PutCom (ZBackSpace$)
  534.                         END IF
  535.                         IF SaveToDisk THEN
  536.                            CALL PrintWork(ZBackSpace$)
  537.                         END IF
  538.                         ZCol = ZCol - 2
  539.                      END IF
  540.                      IF Key$ = ZCarriageReturn$ THEN
  541.                         IF SendRemote AND ZLineFeeds THEN
  542.                            CALL PutCom(ZLineFeed$)
  543.                         END IF
  544.                         ZCol = 0
  545.                      END IF
  546.                      ZCol = ZCol + 1
  547.                   END IF
  548.                   REM ** Reset auto log-off timeski..
  549.                   ZAutoLogoff! = TIMER + ZWaitBeforeDisconnect
  550.                END IF
  551.             END IF
  552.  
  553.             REM ** I'll call the below.. pseudo-wordwrap.. or a way to
  554.             REM ** get around having to do word wrap.. it ain't easy in
  555.             REM ** char by char mode... Much easier in C than in BASIC
  556.  
  557.             IF (ZCol > 72) OR (ZCol > 65 AND Key$ = CHR$(32)) THEN
  558.                CALL SkipLine(1)
  559.                IF SaveToDisk THEN
  560.                   CALL PrintWorkA("")
  561.                END IF
  562.                ZCol = 1
  563.             END IF
  564.  
  565.             CALL CheckCarrier
  566.             IF ZSubParm = -1 THEN
  567.                EXIT DO
  568.             END IF
  569.             CALL CheckTimeRemain(MinsRemaining)
  570.             IF ZSubParm = -1 THEN
  571.                EXIT DO
  572.             END IF
  573.             CALL CheckTime(ZAutoLogoff!, TempElapsed!, 1)
  574.             IF TempElapsed! <= 0 THEN
  575.                ZWaitExpired = ZTrue
  576.                EXIT DO
  577.             END IF
  578.  
  579.          LOOP
  580.  
  581.          CALL LockUnlock10 (ZTrue)
  582.          CALL Update10 (CurrentNodeIndex, ZTrue)
  583.          LSET ChatInput$ = SPACE$(72)
  584.          LSET ChatActivity$ = "I"
  585.          LSET InTrueChat$ = "I"
  586.          CALL Update10 (CurrentNodeIndex, ZFalse)
  587.          CALL LockUnlock10 (ZFalse)
  588.          IF HasPaged > 0 THEN
  589.             CALL LockUnlock10 (ZTrue)
  590.             CALL Update10 (HasPaged, ZTrue)
  591.             IF ChatActivity$ = "R" THEN
  592.                LSET ChatActivity$ = "I"
  593.                CALL Update10 (HasPaged, ZFalse)
  594.             END IF
  595.             CALL LockUnlock10 (ZFalse)
  596.          END IF
  597.          CLOSE 10
  598.  
  599.          CLOSE 2
  600.          ZActiveMessageFile$ = WasA1$
  601.  
  602.          ERASE TrueChatIndexHold    'free memory taken by integer array
  603.  
  604.       END IF
  605.  
  606.       HasPaged = 0
  607.  
  608.       EXIT SUB
  609.  
  610. 59840 GET 1, (LineIndex + 1)
  611.       IF MID$(ZMsgRec$, 55, 2) = "-1" AND NOT ZSysop THEN
  612.          NameTemp$ = "SYSOP"
  613.        ELSE
  614.          NameTemp$ = MID$(ZMsgRec$, 1, 26)
  615.       END IF
  616.       CALL TrimTrail (NameTemp$, " ")
  617.       CALL NameCaps(NameTemp$)
  618.       RETURN
  619.  
  620.       END SUB
  621.  
  622. 59900 SUB ColorText(Text$, NodeIndex) STATIC
  623.  
  624.       IF ZWasGR = 2 THEN
  625.          TextColor = (NodeIndex MOD 5) + 2
  626.          Text$ = CHR$(27) + "[1;3" + RIGHT$(STR$(TextColor), 1) + ";40m" + Text$
  627.       END IF
  628.  
  629.       END SUB
  630.  
  631. REM **
  632. REM ** Save what a user is doing in the BBS.. for W)hos on mods..... **
  633. REM **
  634. 59910 SUB SaveUserActivity(Activity$, NodeRecordIndex, ReadIt) STATIC
  635.  
  636.       ChatNodeIndex = NodeRecordIndex - 1
  637.  
  638.       CLOSE 10
  639.       CALL OpenWrk10 (ChatFileName$)
  640.       CALL Field10
  641.  
  642.       IF ReadIt THEN
  643.          CALL Update10(ChatNodeIndex, ZTrue)
  644.          Activity$ = BBSActivity$
  645.        ELSE
  646.          CALL LockUnlock10 (ZTrue)
  647.          CALL Update10(ChatNodeIndex, ZTrue)
  648.          LSET BBSActivity$ = Activity$
  649.          CALL Update10(ChatNodeIndex, ZFalse)
  650.          CALL LockUnlock10 (ZFalse)
  651.       END IF
  652.  
  653.       IF NOT ReadIt THEN
  654.          CLOSE 10
  655.       END IF
  656.  
  657.       END SUB
  658.  
  659. REM **
  660. REM ** Chat command line mode.. this is where they can do certain functions
  661. REM ** pertaining to the chat
  662. REM **
  663. REM ** ChatSubParm is returned TRUE when a user wishes to exit the chat mode
  664.  
  665. 59920 SUB ChatCommand(ChatSubParm, CurrentNodeIndex, NodesInSystem) STATIC
  666.  
  667.       SHARED DoTrueChat, HasPaged, UpperNode, LowerNode, SaveToDisk
  668.       SHARED NodesToSquelch$, RePage
  669.  
  670.       CALL SkipLine(1)
  671. 59921 IF NOT ZExpertUser THEN
  672. 59922    ZFileName$ = "CHAT.MNU"
  673.          CALL Graphic(ZFileName$)
  674.          CALL BufFile(ZFileName$, WasX)
  675.       END IF
  676.       ZOutTxt$ = "CHAT command "
  677.       IF ZExpertUser THEN
  678.          ZOutTxt$ = ZOutTxt$ + "<[C],H,W,Q,X"
  679.          IF NOT DoTrueChat THEN
  680.             ZOutTxt$ = ZOutTxt$ + ",P,S,U"
  681.          END IF
  682.        ELSE
  683.          ZOutTxt$ = ZOutTxt$ + "<[C]hat,H)elp,W)ho,Q)uit,X)pert"
  684.          IF NOT DoTrueChat THEN
  685.             ZOutTxt$ = ZOutTxt$ + ",P)age,S)qlch,U)nsqlch"
  686.          END IF
  687.       END IF
  688.       ZOutTxt$ = ZOutTxt$ + ">"
  689.       ZSubParm = 1
  690.       CALL TGet
  691.       IF ZSubParm = -1 THEN
  692.          GOTO 59940
  693.       END IF
  694.       ChatSubParm = ZFalse
  695.       IF ZWasQ > 0 THEN
  696.          CALL AllCaps(ZUserIn$(1))
  697.          SELECT CASE LEFT$(ZUserIn$(1), 1)
  698.  
  699.             CASE "C"    REM ** Return to chat mode
  700.                EXIT SUB
  701.  
  702.             CASE "H", "?" REM ** Help.. means show the Chat menu
  703.                GOTO 59922
  704.  
  705.             CASE "W"    REM ** Show whos on the system
  706.                CALL WhosOn(NodesInSystem)
  707.                GOTO 59921
  708.  
  709.             CASE "Q"    REM ** Quit/Exit out of chat mode
  710.                ChatSubParm = ZTrue
  711.                EXIT SUB
  712.  
  713.             CASE "X"    REM ** Toggle expert mode
  714.                CALL Toggle(9)
  715.                GOTO 59921
  716.  
  717.             REM Got to eliminate this for now..
  718.             CASE "P"    REM ** Page another node to chat
  719.                RePage = ZTrue
  720.                EXIT SUB
  721.  
  722.             CASE "S"    REM ** Squelch -- turn off reception of any node
  723.                IF NOT DoTrueChat THEN
  724.                   ZOutTxt$ = "Which node do you wish to squelch (1 -" + STR$(NodesInSystem) + ")" + PRESS.ENTER$
  725.                   ZSubParm = 1
  726.                   CALL TGet
  727.                   IF ZSubParm = -1 THEN
  728.                      GOTO 59940
  729.                   END IF
  730.                   IF ZWasQ > 0 THEN
  731.                      CALL CheckInt(ZUserIn$(1))
  732.                      IF ZTestedIntValue <> CurrentNodeIndex THEN
  733.                         NodesToSquelch$ = NodesToSquelch$ + MID$(STR$(ZTestedIntValue), 2, 1)
  734.                         CALL QuickTPut("Node" + STR$(ZTestedIntValue) + " has been squelched!", 1)
  735.                       ELSE
  736.                         CALL QuickTPut1("Why Squelch Yourself?")
  737.                      END IF
  738.                   END IF
  739.                END IF
  740.                GOTO 59921
  741.  
  742.             CASE "U"    REM ** Turn reception of a node back to ON
  743.                IF NOT DoTrueChat THEN
  744.                   IF NodesToSquelch$ <> "" THEN
  745.                      ZOutTxt$ = "Which node do you wish to UNsquelch (1 -" + STR$(NodesInSystem) + ")" + PRESS.ENTER$
  746.                      ZSubParm = 1
  747.                      CALL TGet
  748.                      IF ZSubParm = -1 THEN
  749.                         GOTO 59940
  750.                      END IF
  751.                      IF ZWasQ > 0 THEN
  752.                         CALL CheckInt(ZUserIn$(1))
  753.                         Squelched = INSTR(NodesToSquelch$, MID$(STR$(ZTestedIntValue), 2, 1))
  754.                         IF Squelched = 1 THEN
  755.                            IF LEN(NodesToSquelch$) = 1 THEN
  756.                               NodesToSquelch$ = ""
  757.                             ELSE
  758.                               NodesToSquelch$ = MID$(NodesToSquelch$, Squelched + 1)
  759.                            END IF
  760.                          ELSEIF Squelched > 1 THEN
  761.                            NodesToSquelch$ = LEFT$(NodesToSquelch$, Squelched - 1) + _
  762.                                              MID$ (NodesToSquelch$, Squelched + 1)
  763.                         END IF
  764.                         IF Squelched > 0 THEN
  765.                            CALL QuickTPut("Node" + STR$(ZTestedIntValue) + " has been UNsquelched!", 1)
  766.                         END IF
  767.                      END IF
  768.                   END IF
  769.                END IF
  770.                GOTO 59921
  771.  
  772.             CASE ELSE   REM ** Illegal command entered.. show menu..
  773.                CALL QuickTPut1("Unknown command <" + LEFT$(ZUserIn$(1), 1) + ">")
  774.                GOTO 59922
  775.  
  776.          END SELECT
  777.       END IF
  778.       EXIT SUB
  779.  
  780.       REM ** user dropped carrier.. return in a way to abort chat mode
  781. 59940 ChatSubParm = ZTrue
  782.       END SUB
  783.  
  784.       REM ** here is where we set up chat log file.. hopefully with a unique
  785.       REM ** filename. The logging code is still quite fallible..
  786. 59930 SUB SetUpLogFile STATIC
  787.  
  788.       SHARED SaveToDisk
  789.  
  790.       TempTime$ = TIME$
  791.       TempDate$ = DATE$
  792.       FileName$ = LEFT$(TempDate$, 2) + _     'filename format is now:
  793.                   MID$ (TempDate$, 4, 2) + _  '   mmddhhmm.Css
  794.                   LEFT$(TempTime$, 2) + _
  795.                   MID$ (TempTime$, 4, 2) + _
  796.                   ".C" + _
  797.                   RIGHT$(Temptime$, 2)
  798.       CLOSE 2
  799.       CALL OpenOutW(FileName$)
  800.       CALL QuickTPut1("The SysOp has chosen to record all chats to disk.")
  801.       CALL LockUnlock10 (ZTrue)
  802.       CALL Update10 (CurrentNodeIndex, ZTrue)
  803.       LSET SavingToDisk$ = "Y"
  804.       CALL Update10 (CurrentNodeIndex, ZFalse)
  805.       CALL LockUnlock10 (ZFalse)
  806.       SaveToDisk = ZTrue
  807.       END SUB
  808.  
  809. 59990 SUB Field10 STATIC
  810.       REM ** all of these variables are SHARED between all subprograms in **
  811.       REM ** this module (RCHAT401.BAS)                                   **
  812.       FIELD 10, 1 AS ChatActivity$, _
  813.                2 AS PagingNode$,   _
  814.                2 AS PrivateFor$,   _
  815.               72 AS ChatInput$,    _
  816.               31 AS ChatName$,     _
  817.                1 AS InTrueChat$,   _
  818.                2 AS TrueChatIndex$,_
  819.                1 AS SavingToDisk$, _
  820.                1 AS BBSActivity$
  821.       END SUB
  822.  
  823.       REM ** Lock/Unlock  if LockMode = ZTrue, then Lock, else Unlock
  824. 59999 SUB LockUnlock10(LockMode) STATIC
  825.       ZWasEN$ = ChatFileName$
  826.       IF LockMode THEN
  827.          ZSubParm = 9
  828.        ELSE
  829.          ZSubParm = 10
  830.       END IF
  831.       CALL FileLock
  832.       END SUB
  833.