home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / BBS / J_CONFX.ZIP / J_CONF3.PPS < prev   
Text File  |  1995-01-06  |  12KB  |  329 lines

  1. ; Program name:J_conf.pps Version 1.0
  2. ; Written by Tim Fritz 1/6/95
  3. ;
  4. ;  This program replaces the standard PCBoard J command 
  5. ;  (Join a conference) menu.  It allows the USER to specify 
  6. ;  if they would like to build a menu "on-the-fly" of those 
  7. ;  conferences they can join, or see a list of all available 
  8. ;  conferences.
  9. ;
  10. ;  A problem with any board is upkeep, i.e. conferences change, 
  11. ;  and new additions are made.  Wouldn't it be nice if the system 
  12. ;  just presented the user with the current list...no menu updates,
  13. ;  it would just use the data in the conference setup files! 
  14. ;
  15. ;  That is exactly what this PPE does.  It reads the cnames file
  16. ;  and presents the list of valid conferences to the
  17. ;  user along with the public/private status of the conference.
  18. ;  Since it uses the cnames file, you MUST do a normal save when 
  19. ;  adding or blanking out a conference.  Remember, cnames only gets
  20. ;  updated with normal save.
  21. ;
  22. ;  basic form of operation:
  23. ;    - if the parm "Build Menu" is sent it generates the cmnu file from
  24. ;      cnames.
  25. ;    - if a parm is sent and it is NOT "Build Menu", it is re-tokenized
  26. ;      and passed on to the normal J command
  27. ;    - if NO parms are sent (ie nothing is tokenized) the program
  28. ;      requests from the user if they would like a list of ALL
  29. ;      available conferences or just those they have access to.
  30. ;      ie:
  31. ;      List Conferences you can (J)oin or (A)ll 
  32. ;    
  33. ;  Basic process:
  34. ;  -if parm sent but NOT "Build Menu" then retokenize, stuff keyboard
  35. ;   and exit..
  36. ;  -if parm "Build Menu" sent:
  37. ;    -get the number of conferences on the board (line 108 of PCBoard.dat)
  38. ;    -get the location of the cnames file (line 31 of PCBoard.dat)
  39. ;    -read in the first line of each conference in cnames 
  40. ;     (33*Conference #+1) if it is NOT blank
  41. ;    -loop thru the file writing out the data to the CMNU file
  42. ;    -display the conference data for the user, x lines per screen
  43. ;     (be sure to let the user pick a conference between screens)
  44. ;    -exit
  45. ;  -if NO parms, request input from the user:
  46. ;    -List Conferences you can (J)oin or (A)ll 
  47. ;    -if A, display CMNU (if it does NOT exist, create it)
  48. ;    -if J, create a list "on-the-fly"
  49. ;
  50. ;  Installation:
  51. ;  -install by adding to the CMD.LST file using PCBSetup.
  52. ;   Example:
  53. ;    Command  Security   PPE/MNU File -or- Keystroke Replacement
  54. ;    -------  ---------  ------------------------------------------
  55. ;    J          10       C:\PCB\PPE\J_CONF\J_CONF3.PPE
  56. ;    JO         10       C:\PCB\PPE\J_CONF\J_CONF3.PPE
  57. ;    JOI        10       C:\PCB\PPE\J_CONF\J_CONF3.PPE
  58. ;    JOIN       10       C:\PCB\PPE\J_CONF\J_CONF3.PPE
  59. ;
  60. ; set the vars up
  61.  
  62. INTEGER iMaxConf      'Number of conferences on PCBoard
  63. INTEGER iColor        'Color interger for screen display color
  64. INTEGER iUser_rec     'Users record number
  65. INTEGER i             'General use interger counter var
  66. INTEGER k             'General use interger counter var
  67.  
  68. STRING  sCnamesPath   'drive, path, and file from PCBoard.dat for cnames
  69. STRING  sCmnuPath     'drive, path, and file for conference menu file
  70. STRING  sCurColor     'used for color control of screen output
  71.  
  72. STRING  s1            'General use string var
  73. STRING  s2            'General use string var
  74. STRING  s3            'General use string var
  75. STRING  s4            'General use string var
  76.  
  77. STRING  sResp         ' users resp to prompt 
  78.  
  79. STRING  saWW(3)       'string array for wworking routine
  80. INTEGER iWW           'integer counter for wworking
  81. INTEGER iWWShow       'integer counter for wworking
  82. INTEGER iWWxCur       'integer counter for wworking x cursor
  83. INTEGER iWWyCur       'integer counter for wworking y cursor
  84. INTEGER iWWxiCur      'integer counter for x cursor prior to calling wworking
  85. INTEGER iWWyiCur      'integer counter for y cursor prior to calling wworking
  86.  
  87. ;Init saWW
  88. saWW(0)="-"
  89. saWW(1)="\"
  90. saWW(2)="|"
  91. saWW(3)="/"
  92.  
  93.  
  94. ;  -if parm sent but NOT "Build Menu" then retokenize, stuff keyboard
  95. ;   and exit..
  96. IF (TOKCOUNT() > 0) THEN  
  97.  s1=""
  98.  WHILE (TOKCOUNT() > 0) s1=s1+GETTOKEN()+" "
  99.  TOKENIZE s1              're-tokenize so we can save it to s1
  100.  s1=TOKENSTR()            'save it to s1 for later use
  101.  TOKENIZE s1              'do it again so we can look it it
  102.  if ("BUILD"=UPPER(GETTOKEN()) & "MENU"=UPPER(GETTOKEN())) THEN 
  103.   ; Build the CMNU and exit
  104.   GOSUB BLD_CMNU  'go build the menu file
  105.  ELSE
  106.   'stuff the keyboard and exit
  107.   s1="J;"+s1
  108.   KBDSTUFF s1
  109.  ENDIF
  110. ELSE
  111.  ;  -NO parms, request input from the user:
  112.  ; ie  List Conferences you can (J)oin or (A)ll 
  113.  ; with default = J
  114.  sResp="J"
  115.  INPUTSTR "List Conferences you can (J)oin or (A)ll", sResp,@X0E,1,"JA",UPCASE+NEWLINE+GUIDE+FIELDLEN
  116.  IF (sResp="A") THEN
  117.   sResp=" "
  118.   GOSUB CMNU_DISPLAY  ' display the CMNU menu file
  119.  ELSE  'must be equal to J
  120.   sResp=" "
  121.   GOSUB ON_THE_FLY    'present the user with a list of accessable conferences 
  122.  ENDIF
  123. ENDIF
  124.  
  125. DEFCOLOR
  126. cls
  127. END
  128.  
  129. *********************************************************************
  130. ************************ Sub-Routines *******************************
  131. *********************************************************************
  132.  
  133.  
  134. *************************************************************************
  135. :BLD_CMNU    'build the CMNU menu file
  136.  ; Using the PPL functions PCBDAT() and READLINE()
  137.  ; we can find out number of conferences and where cnames is located
  138.  iMaxConf    = READLINE(PCBDAT(),108)
  139.  sCnamesPath = READLINE(PCBDAT(),31)
  140.  ;setup the file (cmnu) in the same path as cnames
  141.  sCmnuPath=FILEINF(sCnamesPath,6)+":"+FILEINF(sCnamesPath,7)+"CMNU"
  142.  ; blow away the old one
  143.  FCREATE 1, sCmnuPath, O_RW, S_DN             
  144.  FOR i = 0 to iMaxConf 
  145.   s1=READLINE(sCnamesPath,33*i+1)    'conference name
  146.   s2=READLINE(sCnamesPath,33*i+20)   '0=private, -1=public
  147.   IF (s2 ="-1")  s2="Public"
  148.   IF (s2 = "0")  s2="Private"
  149.   s3=READLINE(sCnamesPath,33*i+23)   'security level for access
  150.   IF (LEN(TRIM(s1," "))>0) THEN
  151.    s4=RIGHT("   "+I2S(i,10),3)       'get string of new extension
  152.    IF (s2 = "Private") THEN
  153.     FPUTLN 1," ",s4,"  ",MID(s1+space(62),1,62),s2
  154.    ELSE
  155.     FPUTLN 1," ",s4,"  ",MID(s1+space(62),1,62),s3
  156.    ENDIF
  157.   ENDIF
  158.  NEXT i
  159.  FCLOSE 1
  160. RETURN
  161. *************************************************************************
  162.  
  163.  
  164. *************************************************************************
  165. :CMNU_DISPLAY  ' display the CMNU menu file
  166.  ;set the color
  167.  GOSUB SET_COLOR
  168.  ;get the associated file location data
  169.  sCnamesPath = READLINE(PCBDAT(),31)
  170.  ;setup the file (cmnu) in the same path as cnames
  171.  sCmnuPath=FILEINF(sCnamesPath,6)+":"+FILEINF(sCnamesPath,7)+"CMNU"
  172.  
  173.  ;display the file
  174.  IF (!EXIST(sCmnuPath)) GOSUB BLD_CMNU  
  175.  FOPEN 1, sCmnuPath, O_RD, S_DN
  176.  FGET 1,s1
  177.  While (!FERR(1) & !ABORT()) DO
  178.   COLOR iColor
  179.   CLS
  180.   PRINTLN "  @INCONF@"
  181.   PRINTLN " ###  Conference Name/Descripton                                    Access"
  182.   PRINTLN " ---  ------------------------------------------------------------  -------" 
  183.   FOR i=1 to 12
  184.    IF (FERR(1)) BREAK
  185.    PRINTLN s1
  186.    IF (i=4) PRINTLN
  187.    IF (i=8) PRINTLN
  188.    IF (i < 12) FGET 1,s1
  189.   NEXT i
  190.   PRINTLN 
  191.   IF (i = 13 & !FERR(1)) THEN
  192.    INPUTSTR "(@TIMELEFT@ min left), Conference (#) to join or Enter for More",sResp,@X0E,5,"1234567890N",UPCASE+ERASELINE
  193.   ELSE
  194.    INPUTSTR "(@TIMELEFT@ min left), Conference (#) to join or Enter for none",sResp,@X0E,5,"1234567890N",UPCASE+ERASELINE
  195.   ENDIF
  196.   ; Lets see what they want
  197.   IF (LEN(trim(sResp," ")) > 0 ) THEN
  198.    IF (sResp="N") BREAK
  199.    sResp="J;"+sResp
  200.    KBDSTUFF sResp
  201.    BREAK
  202.   ENDIF
  203.   FGET 1,s1
  204.  ENDWHILE
  205. RETURN
  206. *************************************************************************
  207.  
  208.  
  209. *************************************************************************
  210. :ON_THE_FLY   'presnt the user with a list of accessable conferences 
  211.  ; get the number of conferences and location of cnames
  212.  iMaxConf    = READLINE(PCBDAT(),108)
  213.  sCnamesPath = READLINE(PCBDAT(),31)
  214.  ;set the color
  215.  GOSUB SET_COLOR
  216.  ; this is what it looks like
  217.  ;         1         2         3         4         5         6         7         8
  218.  ;12345678901234567890123456789012345678901234567890123456789012345678901234567890
  219.  ; ###  Conference Name/Description                                   Access"    
  220.  ; ---  ------------------------------------------------------------  -------" 
  221.  GETUSER                               'load up the system default vars   
  222.  iUser_rec=U_RECNUM(U_NAME())          'get the users record number
  223.  k=1                                   'counter to track display
  224.  FOR i = 0 to iMaxConf 
  225.   IF (k=1) THEN
  226.    COLOR iColor
  227.    CLS
  228.    PRINTLN "  @INCONF@"
  229.    PRINTLN " ###  Conference Name/Descripton                                    Access"
  230.    PRINTLN " ---  ------------------------------------------------------------  -------" 
  231.   ENDIF
  232.   GOSUB WWORKING
  233.  
  234.   s1=READLINE(sCnamesPath,33*i+1)     'conference name
  235.   IF (LEN(TRIM(s1," "))>0) THEN       'if no conf skip it
  236.    s2=READLINE(sCnamesPath,33*i+20)   '0=private, -1=public
  237.    s3=READLINE(sCnamesPath,33*i+23)   'security level for access
  238.    ;ck if user is qualified for this conference
  239.    IF (U_INCONF(iUser_rec,i) | (U_SEC >= S2I(s3,10) & s2="-1")) THEN
  240.     ; print one to the screen 
  241.     k=k+1
  242.     IF (s2 ="-1")  s2="Public"
  243.     IF (s2 = "0")  s2="Private"
  244.     s4=RIGHT("   "+I2S(i,10),3)       'get string of new extension
  245.     BACKUP 2
  246.     ;COLOR iColor
  247.     IF (s2 = "Private") THEN
  248.      PRINTLN " ",s4,"  ",MID(s1+space(62),1,62),s2
  249.     ELSE
  250.      PRINTLN " ",s4,"  ",MID(s1+space(62),1,62),s3
  251.     ENDIF
  252.     IF (k=4) PRINTLN
  253.     IF (k=8) PRINTLN
  254.    ENDIF
  255.   ENDIF
  256.  
  257.   ; ck if screen is full...if so let them make a choice
  258.   IF ((k = 13) | (i = iMaxConf)) THEN
  259.    BACKUP 2
  260.    ;COLOR iColor
  261.    IF ((k = 13) & (i <> iMaxConf)) THEN
  262.     PRINTLN " "
  263.     INPUTSTR "(@TIMELEFT@ min left), Conference (#) to join or Enter for More",sResp,@X0E,5,"1234567890N",UPCASE+ERASELINE
  264.    ELSEIF (i = iMaxConf)
  265.     PRINTLN " "
  266.     INPUTSTR "(@TIMELEFT@ min left), Conference (#) to join or Enter for none",sResp,@X0E,5,"1234567890N",UPCASE+ERASELINE
  267.    ENDIF
  268.    ; Lets see what they want
  269.    IF (LEN(trim(sResp," ")) > 0 ) THEN
  270.     IF (sResp="N") BREAK
  271.     sResp="J;"+sResp
  272.     KBDSTUFF sResp
  273.     BREAK
  274.    ENDIF
  275.    k=1
  276.   ENDIF
  277.  NEXT i                               
  278. RETURN
  279. *************************************************************************
  280.  
  281.  
  282.  
  283. *************************************************************************
  284. :SET_COLOR  'Set the display color based on the current background
  285.  IF (CURCOLOR()<10) THEN
  286.   sCurColor="0F"
  287.  ELSE
  288.   sCurColor=I2S(CURCOLOR(),16)
  289.   ;set our foreground based on the background color
  290.   ;for 0 (black) or 1 (blue) use F (bright white)
  291.   ;for all others use 0 (black)
  292.   ;if background color is greater then 7 subtract 8 from it first
  293.   i=S2I(LEFT(sCurColor,1),16)
  294.   IF (7 < i) i=i-8       'no blinking backgrounds !
  295.   IF (i = 1) THEN
  296.    sCurColor=I2S(i,16)+"F"
  297.   ELSE
  298.    sCurColor=I2S(i,16)+"8"
  299.   ENDIF
  300.  ENDIF
  301.  iColor=S2I(sCurColor,16)
  302. RETURN 
  303. *************************************************************************
  304.  
  305.  
  306. *************************************************************************
  307. :WWORKING
  308. ; routine to let users know that something is going on
  309. BACKUP 2
  310. COLOR iColor
  311. PRINT saWW(iWW%4), " "
  312. INC iWW
  313. iWWShow=1
  314. INC iWWShow
  315. RETURN
  316. *************************************************************************
  317.  
  318.  
  319.  
  320.  
  321.  
  322. ; this is what it looks like
  323. ;         1         2         3         4         5         6         7         8
  324. ;12345678901234567890123456789012345678901234567890123456789012345678901234567890
  325. ; ###  Conference Name/Description                                   Access"    
  326. ; ---  ------------------------------------------------------------  -------" 
  327. ;
  328.  
  329.