I was bored and made this.
SCAR Code:
program GEGraber;
var
frmGE: TForm;
LabelInfo: TLabel;
LabelName, LabelMembers, LabelMinP, LabelCIP30: TLabel;
LabelMedP, LabelCIP90, LabelMaxP, LabelCIP180: TLabel;
tbSearchText: TEdit;
buttonSearch: TButton;
type
TItem = record
Name: string;
Member: boolean;
MinP: integer;
MedP: integer;
MaxP: integer;
Cip30: extended;
Cip90: extended;
Cip180: extended;
Graph: string;
end;
TItemArray = array[0..100] of TItem;
TSearch = record
Name: string;
URL: string;
Member: boolean;
end;
TSearchArray = array[0..100] of TSearch;
const
ItemsPerPage = 20;
function GE_GPToInt(Amount: string): integer;
var
Numb, Lett: string;
TempFloat: extended;
begin
Lett := {$IFDEF Simba}ExtractFromStr(Amount, Letters){$ELSE}TrimOthers(TrimNumbers(Trim(Amount))){$ENDIF};
Numb := Replace(Amount, Lett, ''{$IFDEF Simba}, []{$ENDIF});
TempFloat := StrToFloatDef(Numb, -1.0);
if (TempFloat = -1) then
begin
Result := -1;
Exit;
end;
case Lett of
'k': TempFloat := TempFloat * 1000.0;
'm': TempFloat := TempFloat * 1000000.0;
'': begin end;
else
WriteLn('Unknown Letter in GEToInt(' + Amount + ');');
end;
Result := StrToIntDef(FloatToStr(TempFloat), -1);
end;
function GE_GetPages(NumbOfItems: integer): integer;
begin
if (NumbOfItems = -1) then
begin
Result := -1;
Exit;
end;
Result := NumbOfItems / ItemsPerPage;
Result := NumbOfItems - (Result * ItemsPerPage);
if (Result > 0) then
Result := NumbOfItems / ItemsPerPage + 1
else
Result := NumbOfItems / ItemsPerPage;
end;
function GE_Search(Search: string; Limit: integer): TSearchArray;
var
URL, Content, TempStr: string;
Pages, I, J, K: integer;
begin
URL := 'http://services.runescape.com/m=itemdb_rs/results.ws?query=' + Search;
Content := GetPage(URL);
if ((Limit = -1) or (Limit = 0)) then
Limit := 100;
TempStr := Between('Your search for ''<i>', '</i>'' did not return any results.', Content);
if (TempStr = Search) then
begin
Result[0].Name := '';
Result[0].URL := '';
Result[0].Member := False;
Exit;
end;
Pages := GE_GetPages(StrToIntDef(Between('<div id="search_results_text">' + #10, ' items', Content), -1));
if (Pages = -1) then
begin
Result[0].Name := '';
Result[0].URL := '';
Result[0].Member := False;
Exit;
end;
K := 0;
for I := 1 to Pages do
begin
if (I <> 1) then
Content := GetPage(URL + '&page=' + IntToStr(I));
Content := Between('<tbody>', '</tbody>', Between('<table id="search_results_table" class="row_a">', '</table>', Content));
for J := 0 to ItemsPerPage - 1 do
begin
if (K >= Limit) then
Exit;
TempStr := Between('<td><a ', 'a></td>', Content);
Result[K].Name := Trim(Between('">', '</', TempStr));
Result[K].URL := Between('href="', '">', TempStr);
TempStr := Between('<tr', '</tr>', Content);
Result[K].Member := (Between('<img src="http://www.runescape.com/img/main/serverlist/star_', '.png" alt="', TempStr) = 'members');
if ((TempStr <> '') and (TempStr <> Content)) then
Content := Replace(Content, '<tr' + TempStr + '</tr>', ''{$IFDEF Simba}, []{$ENDIF});
if ((Result[K].Name = '') or (Result[K].URL = '')) then
Exit;
Inc(K);
end;
end;
end;
function GE_GetItem(Item: string): TItem;
var
TItemA: TSearchArray;
Page: string;
I: integer;
begin
TItemA := GE_Search(Item, 10);
for I := 0 to High(TItemA) do
if (LowerCase(TItemA[I].Name) = LowerCase(Item)) then
begin
Page := GetPage(TItemA[I].URL);
with Result do
begin
Name := TItemA[I].Name;
Member := TItemA[I].Member;
MinP := GE_GPToInt(Between('<b>Minimum price:</b> ', #10 + '</span>', Page));
MedP := GE_GPToInt(Between('<b>Market price:</b> ', #10 + '</span>', Page));
MaxP := GE_GPToInt(Between('<b>Maximum price:</b> ', #10 + '</span>', Page));
Cip30 := StrToFloatDef(Between('">', '%', Between('<b>30 Days:</b>', '</span>', Page)), -999);
Cip90 := StrToFloatDef(Between('">', '%', Between('<b>90 Days:</b>', '</span>', Page)), -999);;
Cip180 := StrToFloatDef(Between('">', '%', Between('<b>180 Days:</b>', '</span>', Page)), -999);;
Graph := Between('<td><img name="object" src="', '&scale=0&axis=0" alt=""></td>', Page);
end;
Break;
end;
if (Result.Name = '') then
Result.Name := 'Unknown Item';
end;
function GE_GetItems(Items: TStringArray): TItemArray;
var
I: integer;
begin
for I := 0 to High(Items) do
Result[I] := GE_GetItem(Items[I]);
end;
type
LastSearch = record
Text: string;
Time: integer;
end;
var
LastItem: LastSearch;
procedure OnClick(sender: TObject);
var
TempItem: TItem;
CIP30, CIP90, CIP180: string;
TimeRemaining: integer;
begin
if (tbSearchText.text = '') then
begin
LabelInfo.Caption := 'Info: You can''t search for nothing...';
Exit;
end;
if (tbSearchText.text = LastItem.Text) then
if (LastItem.Time < (GetTickCount - 30000)) then
begin
LastItem.Text := '';
LastItem.Time := 0;
end;
if (not (tbSearchText.text = LastItem.Text)) then
begin
LastItem.Text := tbSearchText.text;
LastItem.Time := GetTickCount;
LabelInfo.Caption := 'Info: Searching for ' + tbSearchText.text;
Wait(100);
TempItem := GE_GetItem(tbSearchText.text);
Wait(100);
LabelInfo.Caption := 'Info: Showing info for ' + tbSearchText.text;
LabelName.Caption := 'Item: ' + TempItem.Name;
LabelMembers.Caption := 'Members: ' + BoolToStr(TempItem.Member);
LabelMinP.Caption := 'Minimum Price: ' + IntToStr(TempItem.MinP);
LabelMedP.Caption := 'Market Price: ' + IntToStr(TempItem.MedP);
LabelMaxP.Caption := 'Maximum Price: ' + IntToStr(TempItem.MaxP);
CIP30 := FloatToStr(TempItem.Cip30);
CIP90 := FloatToStr(TempItem.Cip90);
CIP180 := FloatToStr(TempItem.Cip180);
if (StrToFloat(CIP30) > 0) then
CIP30 := '+' + CIP30;
if (StrToFloat(CIP90) > 0) then
CIP90 := '+' + CIP90;
if (StrToFloat(CIP180) > 0) then
CIP180 := '+' + CIP180;
LabelCIP30.Caption := 'CIP 30 Days: ' + CIP30 + '%';
LabelCIP90.Caption := 'CIP 90 Days: ' + CIP90 + '%';
LabelCIP180.Caption := 'CIP 180 Days: ' + CIP180 + '%';
if (TempItem.Name = 'Unknown Item') then
begin
LastItem.Text := '';
LastItem.Time := 0;
end;
end else
begin
TimeRemaining := ((LastItem.Time + 30000) - GetTickCount) / 1000;
LabelInfo.Caption := 'Info: You alredy have info showing for ' + tbSearchText.text +
#10 + ' ' +
'(Retry in ' + IntToStr(TimeRemaining) + 'secs)';
end;
end;
procedure InitForm;
begin
frmGE := {$IFDEF Simba}TForm.Create(nil){$ELSE}CreateForm{$ENDIF};
with frmGE do
begin
Left := 471;
Top := 337;
{$IFDEF Simba}Width := 325;{$ELSE}Width := 335;{$ENDIF}
{$IFDEF Simba}Height := 140;{$ELSE}Height := 168;{$ENDIF}
Caption := 'GEGraber by Dgby714';
end;
LabelInfo := TLabel.Create(frmGE);
with LabelInfo do
begin
Parent := frmGE;
Left := 8;
Top := 33;
Width := 26;
Height := 13;
Caption := 'Info: ';
end;
LabelName := TLabel.Create(frmGE);
with LabelName do
begin
Parent := frmGE;
Left := 8;
Top := 48;
Width := 26;
Height := 13;
Caption := 'Item: ';
end;
LabelMembers := TLabel.Create(frmGE);
with LabelMembers do
begin
Parent := frmGE;
Left := 8;
Top := 64;
Width := 74;
Height := 13;
Caption := 'Members: False';
end;
LabelMinP := TLabel.Create(frmGE);
with LabelMinP do
begin
Parent := frmGE;
Left := 8;
Top := 88;
Width := 71;
Height := 13;
Caption := 'Minimum Price: 0';
end;
LabelCIP30 := TLabel.Create(frmGE);
with LabelCIP30 do
begin
Parent := frmGE;
Left := 160;
Top := 88;
Width := 62;
Height := 13;
Caption := 'CIP 30 Days: 0%';
end;
LabelMedP := TLabel.Create(frmGE);
with LabelMedP do
begin
Parent := frmGE;
Left := 8;
Top := 104;
Width := 66;
Height := 13;
Caption := 'Market Price: 0';
end;
LabelCIP90 := TLabel.Create(frmGE);
with LabelCIP90 do
begin
Parent := frmGE;
Left := 160;
Top := 104;
Width := 65;
Height := 13;
Caption := 'CIP 90 Days: 0%';
end;
LabelMaxP := TLabel.Create(frmGE);
with LabelMaxP do
begin
Parent := frmGE;
Left := 8;
Top := 120;
Width := 77;
Height := 13;
Caption := 'Maximum Price: 0';
end;
LabelCIP180 := TLabel.Create(frmGE);
with LabelCIP180 do
begin
Parent := frmGE;
Left := 160;
Top := 120;
Width := 71;
Height := 13;
Caption := 'CIP 180 Days: 0%';
end;
tbSearchText := TEdit.Create(frmGE);
with tbSearchText do
begin
Parent := frmGE;
Left := 8;
Top := 8;
Width := 209;
Height := 20;
end;
buttonSearch := TButton.Create(frmGE);
with buttonSearch do
begin
Parent := frmGE;
Left := 240;
Top := 8;
Width := 75;
Height := 23;
Caption := 'Search';
OnClick := @OnClick;
end;
end;
procedure ShowFormModal;
begin
frmGE.ShowModal;
end;
var
TVA: TVariantArray;
begin
SetArrayLength(TVA, 0);
ThreadSafeCall('InitForm', TVA);
ThreadSafeCall('ShowFormModal', TVA);
end.