unit UUser; interface uses sysutils,classes,uini; type MUser=class(Tobject) ID:String; Links:TStringList;{Available links which are not visited yet} LastVisitedLink:String; constructor create; destructor destroy; override; procedure clear; function link2page(index:integer):string; overload; function link2page:string; overload; function Update:boolean; {See if he has posted new links} procedure save(filename:string);overload; procedure save(ini:Mini); overload; procedure save; overload; procedure load(filename:string);overload; procedure load(ini:Mini); overload; procedure load; overload; procedure show(s:TStringList);overload; procedure show(s:TStrings);overload; procedure Removeall; function remove(s:string):Boolean; procedure GenerateReport(s:Tstringlist); function NoLinks:integer; end; implementation { MUser } uses Ubalatarin,udownload,Ulog; procedure MUser.clear; begin ID:=''; Links.Clear; LastVisitedLink:=''; end; constructor MUser.create; begin inherited; Links:=TStringList.Create; clear; end; destructor MUser.destroy; begin clear; Links.Free; inherited; end; procedure MUser.GenerateReport(s:Tstringlist); var j,k:integer; begin j:=Links.Count; s.add('
  • '+ID+' '+ ' '+ ' '); if j<>0 then begin s.add(' '); end; end; function MUser.link2page(index: integer): string; begin result:=format('%sprofile/browse/%s?page=%d',[Balatarin.address,ID,index]); end; function MUser.Update:boolean; var index,index2:integer; _Newlinks:TStringList; Newlinks:TStringList; errorhappened:Boolean; begin { Balatarin.ReadPatches;} result:=false; errorhappened:=false; log.post('Attempting to refresh %s',[ID]); _Newlinks:=TStringList.create; Newlinks:=TStringList.create; index:=0; while newlinks.Count<=BALATARIN_MAXLINKFETCH do begin index:=index+1; if index>BALATARIN_MAXPAGE then begin log.post(' Error while refereshing %s, inifinite loop.',[ID]); errorhappened:=true; break end; {Read} if Balatarin.download.execute(link2page(index),Balatarin.temp(HTML_TEMP))<>DOWNLOAD_DONE then begin log.post(' Error while refereshing %s',[ID]); errorhappened:=true; break end; {Parse} Balatarin.PLfromHTML(_Newlinks); {Add new ones} if LastVisitedLink='' then Newlinks.AddStrings(_Newlinks){Add them all} else begin index2:=_Newlinks.IndexOf(LastVisitedLink); if index2=-1 then Newlinks.AddStrings(_Newlinks) else begin while _Newlinks.Count>index2 do _Newlinks.Delete(_Newlinks.Count-1); Newlinks.AddStrings(_Newlinks); break;{Found the last visited link} end end; end; _Newlinks.free; if errorhappened then log.post(' Error while refereshing %s',[ID]) else begin if Newlinks.Count=0 then log.post('No new link found') else begin LastVisitedLink:=Newlinks[0]; log.post(format('%d New links Found (%d total)',[NewLinks.count,Links.count+NewLinks.count]),Links); Newlinks.AddStrings(Links); Links.Assign(Newlinks); end; result:=true; log.post(' Done refereshing %s',[ID]); end; Newlinks.free; end; procedure MUser.save; begin save(Balatarin.datadir+ID+'.ini'); end; function MUser.link2page: string; begin result:=format('%sprofile/show/%s',[Balatarin.address,ID]); end; procedure MUser.load; begin load(Balatarin.datadir+ID+'.ini'); end; function MUser.NoLinks: integer; begin Result:=Links.Count; end; procedure MUser.save(filename: string); var ini:Mini; begin log.post('Saving %s',[ID]); ini:=Mini.create; save(ini); ini.SaveTOFile(filename); ini.Free; end; procedure MUser.save(ini: Mini); begin ini.Writestring(ID,'ID',ID); ini.Writestringlist(ID,'Old',Links); ini.Writestring(ID,'Last',LastVisitedLink); end; procedure MUser.show(s: TStrings); begin show(TStringList(s)); end; procedure MUser.show(s: TStringList); begin log.post('Setting Window: %s',[ID]); s.Clear; s.Add('User '+ID); s.Add('Last Link: '+LastVisitedLink); s.add('Links:'); s.AddStrings(Links); end; procedure MUser.load(filename: string); var ini:Mini; begin clear; log.post('Loading %s',[ID]); ini:=Mini.create; ini.LoadFromFile(filename); load(ini); ini.Free; end; procedure MUser.load(ini: Mini); begin ID:=ini.Readstring(ID,'ID',''); ini.Readstringlist(ID,'Old',Links); LastVisitedLink:=ini.Readstring(ID,'Last',''); end; function MUser.remove(s: string): Boolean; var i:integer; ss:string; begin Result:=false; for i:=0 to Links.Count-1 do begin ss:=Links[i]; if copy(ss,length(ss)-length(s)+1,length(s))=s then begin log.post(' %dth link matched, deleted.',[i+1]); result:=true; links.Delete(i); break; end; end; end; procedure MUser.Removeall; begin Links.Clear; end; end.