GROUP.PAS

6.1 KB 0718dbc65fd66fb6…
{$I DIRECT.INC}

unit group;

interface

uses gentypes;

const groupclassstr:array [groupclass] of string[8]=
          ('Public','Private','Personal');

procedure seekgfile (n:integer);
procedure listgroups;
function lookupgroup (nm:mstr):integer;
function groupaccess (var g:grouprec):boolean;
procedure addmember (var g:grouprec; n:integer);
function ismember (var g:grouprec; n:integer):boolean;
function getgroupclass:groupclass;
function getgroupnum:integer;
function init_email : boolean;

implementation

uses dos, configrt, gensubs, subs1, userret, flags, MainR2,
     email0, subs2, FileLock;

  procedure opengfile;
  begin
    assign (gfile,cfg.DATADIR+'GROUPS');
    reset (gfile);
    if ioresult<>0 then begin
      close (gfile);
      rewrite (gfile)
    end
  end;

  procedure seekgfile (n:integer);
  begin
    seek (gfile,n-1)
  end;

  function ismember (var g:grouprec; n:integer):boolean;
  var cnt:integer;
  begin
    ismember:=true;
    for cnt:=1 to g.nummembers do
      if g.members[cnt]=n then exit;
    ismember:=false
  end;

  function groupaccess (var g:grouprec):boolean;
  begin
    if issysop then begin
      groupaccess:=true;
      exit
    end;
    groupaccess:=false;
    case g.class of
      publicgroup:groupaccess:=true;
      personalgroup:groupaccess:=g.creator=unum;
      privategroup:groupaccess:=ismember (g,unum)
    end
  end;

  function lookupgroup (nm:mstr):integer;
  var cnt:integer;
      g:grouprec;
  begin
    lookupgroup:=0;
    seekgfile (1);
    for cnt:=1 to filesize(gfile) do begin
      read (gfile,g);
      if groupaccess(g)
        then if match(g.name,nm)
          then begin
            lookupgroup:=cnt;
            exit
          end
    end
  end;

  procedure listgroups;
  var g:grouprec;
      cnt:integer;
  begin
    Header('Name                          Class      ');
    if break then exit;
    seekgfile (1);
    for cnt:=1 to filesize(gfile) do begin
      read (gfile,g);
      if groupaccess(g) then begin
        tab (g.name,30);
        SendCr(groupclassstr[g.class]);
        if break then exit
      end
    end
  end;

  function getgroupclass:groupclass;
  var k:char;
  begin
    repeat
      inpt[1]:=#0;
{      writestr (strng^.groupclass);}
      k:=upcase(inpt[1]);
      if k in ['U','R','E'] then begin
        case k of
          'U':getgroupclass:=publicgroup;
          'R':getgroupclass:=privategroup;
          'E':getgroupclass:=personalgroup
        end;
        exit
      end
    until hungupon;
    getgroupclass:=publicgroup
  end;

  procedure addmember (var g:grouprec; n:integer);
  begin
    if ismember (g,n) then begin
      SendCr('That person is already a member!');
      exit
    end;
    if g.nummembers=maxgroupsize then begin
      SendCr('Sorry, group is full!');
      exit
    end;
    g.nummembers:=g.nummembers+1;
    g.members[g.nummembers]:=n
  end;

  procedure addgroup;
  var g:grouprec;
      un:integer;
  begin
    writestr ('Group name: &');
    if (length(inpt)=0) or (inpt='?') then exit;
    g.name:=inpt;
    if lookupgroup (g.name)<>0 then begin
      SendCr(^M'Group already exists!');
      exit
    end;
    g.class:=getgroupclass;
    g.creator:=unum;
    g.nummembers:=0;
    writestr ('Include yourself in the group? !');
    if yes then addmember (g,unum);
    SendCr(^M^R'Enter names of members, ('^S'Cr'^R') when done'^M);
    repeat
      writestr (^R'Member'^A': &');
      if length(inpt)>0 then begin
        un:=lookupuser (inpt);
        if un=0
          then SendCr('User not found!')
          else addmember (g,un)
      end
    until hungupon or (length(inpt)=0) or (g.nummembers=maxgroupsize);
    seek (gfile,filesize (gfile));
    nwrite (gfile,g);
    writestr (^M'Group created!');
    writelog (13,1,g.name)
  end;

  function maybecreategroup (nm:mstr):integer;
  begin
    writestr ('Create group '+nm+'? !');
    if yes then begin
      addtochain (nm);
      addgroup;
      maybecreategroup:=lookupgroup (nm)
    end else maybecreategroup:=0
  end;

  function getgroupnum:integer;
  var groupname:mstr;
      gn:integer;
      g:grouprec;
  begin
    getgroupnum:=0;
    groupname:=copy(inpt,2,255);
    repeat
      if length(groupname)=0 then begin
        writestr (^M^R'Group name ['^S'?'^R'] List'^A': &');
        if length(inpt)=0 then exit;
        if inpt[1]='/' then delete (inpt,1,1);
        if length(inpt)=0 then exit;
        groupname:=inpt
      end;
      if groupname='?' then begin
        listgroups;
        groupname:=''
      end
    until length(groupname)>0;
    gn:=lookupgroup (groupname);
    if gn=0 then begin
      SendCr('Group not found!');
      gn:=maybecreategroup (groupname);
      if gn=0 then exit
    end;
    seekgfile (gn);
    nread (gfile,g);
    if not groupaccess(g)
      then SendCr('Sorry, you may not access that group!')
      else getgroupnum:=gn
  end;

    Procedure GroupFlags;
    var gn,bn,un,cnt:integer;
        bname:sstr;
        ac:accesstype;
        g:grouprec;
        u:userrec;
        n:NewScanRec;
    begin
      SendCr('Grant all group members access to a sub-board'^M);
      gn:=getgroupnum;
      if gn=0 then exit;
      writestr ('Sub-board access name/number: &');
      SendCr('');
      bname:=inpt;
      opentempbdfile;
      bn:=searchboard(bname);
      closetempbdfile;
      if bn=-1 then begin
        SendCr('No such board!');
        exit
      end;
      writelog (14,3,bname);
      for cnt:=1 to g.nummembers do begin
        un:=g.members[cnt];
        SendCr(lookupuname(un));
        seek (ufile,un);
        nread (ufile,u);
        GetScanRec(N,MsgConf);
        setuseraccflag (N,bn,letin);
        WriteScanRec(N,MsgConf);
        seek (ufile,un);
        nwrite (ufile,u)
      end
    end;

  function init_email : boolean;
  begin
    init_email := true;
    readcatalogs(false);
    if isopen(gfile) then exit;
    close_them_all(gfile);
    opengfile;
    lastread := 0;
  end;

begin
end.