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(' - ');
for k:=1 to j do
begin
s.add('Link, ');
end;
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.