home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / BBS / RBBS_PC / RCHAT300.ZIP / RCHAT300.BAS < prev    next >
Encoding:
BASIC Source File  |  1990-08-28  |  29.5 KB  |  773 lines

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