bg5
2012-03-12 23:19:30
function AllBetween(s1, s2, s: string): TStringArray; // auxiliary function
function GetPlayerStats(PlayerName : string) : array of TStringArray;
function GetPlayerStatsInt(PlayerName : string) : array of TIntegerArray;
function GetPlayerCombatStats (PlayerName : string) : TIntegerArray;
This is my suggestion to text.simba.
(*
AllBetween
~~~~~~~~
.. code-block:: pascal
function AllBetween(s1, s2, s: string): TStringArray;
Returns all strings between s1 and s2.
.. note::
by Janilabo
Example:
AllBetween('<tag>','</tag>','<tag>a</tag>...<tag>b</tag>123<tag>c</tag>');
Output:
['a','b','c']
.. code-block:: pascal
*)
function AllBetween(s1, s2, s: string): TStringArray;
var
sL, s1L, s2L, old_start, start, finish: Integer;
str: string;
begin
s1L := Length(s1);
s2L := Length(s2);
sL := Length(s);
if (s1 = '') or (s2 = '') or (s = '') or (s1L >= sL) or (s2L >= sL) or ((s1L + s2L) > sL) then
Exit;
start := PosEx(s1, s, 1)
repeat
if finish > 0 then
start := PosEx(s1, s, (finish + s2L));
if start > 0 then
begin
finish := PosEx(s2, s, start + 1);
if finish <= 0 then
Break;
repeat
old_start := start;
start := PosEx(s1, s, old_start + s1L);
until (start >= finish) or (start <= 0);
start := old_start;
if str <> '' then
str := str + '{ab_NS}';
str := str + Between(s1, s2, Copy(s, start, s2L + (finish - start)));
end else
Break;
until False;
if str <> '' then
Result := Explode('{ab_NS}', str);
str := '';
end; And this to…hmm online.simba?
(*
GetPlayerStats
~~~~~~~~
.. code-block:: pascal
function GetPlayerStats(PlayerName : string) : array of TStringArray;
Grab player's data from RS highscores and put them in arrays:
[0] - Level
[1] - Total XP
[2] - Rank
[3] - Skill name
[4] - Minigame score
[5] - Minigame rank
[6] - Minigame name
.. note::
by beginner5
Example:
s := GetPlayerStats('zezima');
for a:=0 to 25 do
writeln(s[3][a] +' : '+s[0][a]+' xp : '+s[1][a]+' rank : '+s[2][a] );
.. code-block:: pascal
*)
function GetPlayerStats(PlayerName : string) : array of TStringArray;
var
client,a,h :integer;
s :string;
begin
SetLength(Result,7);
client:=InitializeHTTPClientWrap(TRUE);
AddPostVariable(Client,'user1',PlayerName);
s := PostHTTPPageEx(Client,'http://services.runescape.com/m=hiscore/g=runescape/compare.ws');
FreeHTTPClient(client);
if (high(s)<20000) then
begin
srl_Warn('GetPlayerStats', 'Failed to get highscores page!', warn_AllVersions);
exit;
end;
Result[0] := Allbetween('<span class="columnLevel">','</span>',s); // lvl
Result[1] := Allbetween('<span class="columnTotal">','</span>',s); // XP
Result[2] := Allbetween('<span class="columnRank">','</span>',s); // rank
Result[3] := Allbetween('<span><span><span>','</span></span></span>',s); // skill name
Result[4] := Allbetween('<span class="columnScore">','</span>',s); // Minigame score
for a := 0 to 4 do
if (a <> 3) then DeleteValueInStrArray(Result[a],0);
SetLength(Result[5],12);
SetLength(Result[6],12);
for a:= 0 to 11 do
begin
Result[5][a] := Result[2][a+27]; // Minigame rank
Result[6][a] := Result[3][a+26]; // Minigame name
end;
SetLength(Result[2],26);
SetLength(Result[3],26);
end;
(*
GetPlayerStatsInt
~~~~~~~~
.. code-block:: pascal
function GetPlayerStatsInt(PlayerName : string) : array of TIntegerArray;
Grab player's data from RS highscores and put them in arrays as integers:
[0] - Level
[1] - Total XP
[2] - Rank
[3] - Minigame score
[4] - Minigame rank
.. note::
by beginner5
Example:
.. code-block:: pascal
*)
function GetPlayerStatsInt(PlayerName : string) : array of TIntegerArray;
var
ss : array of TStringArray;
a,b,h,hh :integer;
begin
SetLength(Result,5);
ss := GetPlayerStats(PlayerName);
h := high(ss[0]);
hh := high (ss[4]);
for a:= 0 to 4 do
begin
if (a<>3)and(a<>4) then SetLength(Result[a],h+1)
else SetLength(Result[a],hh+1);
for b:=0 to h do
if (a<>3)and(a<>4) then
begin
ss[a][b]:= ReplaceRegExpr('[^0-9]',ss[a][b],'',TRUE);
if (ss[a][b]<>'') then
Result[a][b] := strtoint(ss[a][b]);
end
else if (b<=hh) then
begin
ss[a+1][b]:= ReplaceRegExpr('[^0-9]',ss[a+1][b],'',TRUE);
if (ss[a+1][b]<>'') then
Result[a][b] := strtoint(ss[a+1][b]);
end;
end;
end;
(*
GetPlayerCombatStats
~~~~~~~~
.. code-block:: pascal
function GetPlayerCombatStats (PlayerName : string) : TIntegerArray;
Grab player's combat levels from RS highscores and put them in array in order:
[ attack , defence , strength , constitution , ranged , prayer , magic ]
.. note::
by beginner5
Example:
.. code-block:: pascal
*)
function GetPlayerCombatStats (PlayerName : string) : TIntegerArray;
var
temp :array of TintegerArray;
a : integer;
begin
SetLength(Result,7);
temp := GetPlayerStatsInt(PlayerName);
for a := 0 to 6 do
Result[a] := temp[0][a+1];
end; Example:
program PrintStats;
var
s : array of TStringArray;
begin
s := GetPlayerStats('zezima');
for a:=0 to 25 do
writeln(s[3][a] +' : '+s[0][a]+' xp : '+s[1][a]+' rank : '+s[2][a] );
end.