The online racing simulator
How to retrieve LFS World stats?
Hello stats lovers Smile

This thread is for you if you are looking to gather LFS statistics and process them for displaying on your own website. It is for that purpose that I've created the Pubstat system, which is a webbased system where you can request all kinds of LFS racing statistics and information.

If you would like to know how it works, please read the following block of text, which should explain everything to you clearly :

NOTE 1 - if you are just looking to show the status of your host(s) on your webpages then you can use this URL :
Format : https://www.lfsworld.net/hoststatus/?h=[HOSTNAME]
Example : https://www.lfsworld.net/hoststatus/?h=Blackwood%20XFG%20XRG (https://www.lfsworld.net/hoststatus/?h=Blackwood%20XFG%20XRG)
You can use the output of that URL directly in an iframe, or if you append '&onlycontent' to the URL it will only output the actual content html and exclude the html header stuff.
You can also create your own stylesheets if you want and send them to me so you can use them.

NOTE 2 - as of 6 Nov 2006, identification has become obligatory. You must use the IdentKey or otherwise your Pubstat script will not work! See below for more information.

Live for Speed Pubstats S2 v1.5 (19 Feb 2011)

CHANGELOG :

v1.4 => v1.5
------------
NEW ?action=counters - get global car/track lapcount
NEW ?action=help - displays the full pubstat help text (omitting ?action will do the same)
?action=wr - added timestamp
?action=ch - added optional country filter
?action=teams - added optional team filter to search for only one team instead of downloading the whole list
?action=pb - added fuel data (Given in % of tank capacity)

v1.3 => v1.4
------------
NEW ?s=1/2/3 - alternate output formats can be selected (JSON, PHP Serialized, XML)
NEW ?action=fuel - returns fuel usages of a racer
?action=hl - added timestamp
?action=pb - added split times and timestamp
?action=pst - added racer's country
?action=pst - removed credits
?action=ch - added id_hl
?action=wr - added track and car query options
?action=teams - added team id
?action=hosts - added country code
?action=hl_log - removed 'format' query option. Use the global alternate output formats instead

v1.2 => v1.3
------------
?action=teams - changed teamname & url length from 64 bytes to 128
?action=hl - added split times
?action=ch - added split times
?action=wr - added split times
?action=pst - added details about current or last online activity

-------------------------------------------------------------------------------------
Legend: (all output is in plain text, unless specified otherwise)
-------------------------------------------------------------------------------------

<track> 3 digit representation.
000 (BL_gp), 001 (BL_gp_rev), 410 (KY_national, etc (game order)

<car> 3 character representation.
XFG, XRG, XRT, RB4, FXO, LX4, LX6, MRT, UF1, RAC, FZ5, FOX, XFR, UFR, FO8, FXR, XRR, FZR, BF1

<racer> a valid LFS username

<laptime> a laptime represented in milliseconds

<splitX> a splittime represented in milliseconds

<lapcount> number of laps

<fuel> Fuel needed for a lap. Given in % of tank capacity

<steering> w, m, ks, kn

<flags_hlaps>
1 LEFTHANDDRIVE
8 AUTOGEAR
16 SHIFTER
64 BRAKEHELP
128 AXISCLUTCH
512 AUTOCLUTCH
1024 MOUSESTEER *
2048 KN *
4096 KS *
(*) if not 1024, 2048 or 4096, steering is wheel.

<id_hl> ID used for hotlaps download : http://www.lfsworld.net/get_spr.php?file=<id_hl>

<id_wr> ID used for wr-hotlaps download : http://www.lfsworld.net/get_spr.php?file=<id_wr>&w=1

<log_filter> 1=WR's - 2=top10 - 3=top50 - 4=ALL

<starttime> Unix timestamp (UTC) - used for hotlaps upload log; only display entries newer than <starttime>

<timestamp> Unix timestamp (UTC)

-----------------------------------------------------------------
-----------------------------------------------------------------


Version numbers
---------------------
Since v1.1, Version numbers have been introduced, to make future updates easier while not having to disrupt your existing scripts. If you were already running a script, you don't have to change anything, unless you want to make use of the new features that come with the latest versions.
The current version is v1.5
Version numbers should be indicated in the url, via the "version" variable. If no version variable is given, the latest version will be used.

User-identification (Ident-Key)
--------------------------------------------
The option to identify yourself has been introduced in v1.2. From then on identification has been voluntary, but since v1.3, identification is obligatory for all. You cannot use Pubstat without identification. This is not so that we can play big brother - it is so that we get a clearer picture on the usage of Pubstat, since this is a large portion of LFS World traffic.
Identification is also meant to make the Premium Pubstat service possible.

You must use an Ident-Key that you can generate on behalf of your account on the [URL="https://www.lfsworld.net/?win=settings&whichTab=pubstat"]LFS World Settings[/URL] pages.
You can feed an Ident-Key to the pubstat script via the following variable:
&idk=<Ident-Key>

If you bind an IP address to an Ident-Key, then pubstat will make sure that only that IP address can use that Ident-Key.


FREE PUBSTAT vs PREMIUM PUBSTAT
------------------------------------
Pubstat usage is free, but there is a tarpit that forces you to wait 5 seconds between your requests.
It is for this reason that the Premium Pubstat version has been made available.
The Premium Pubstat version allows you to place unlimited requests without any tarpit. However each request costs £0.00001 and every MB of data you transfer costs £0.0015.
So if you want to make use of the Premium Pubstat service, you must put some extra money on your LFS account. You can do that from LFS World's "My LFSW Credit" window.

You can indicate in your Pubstat request URL that you want to make use of the Premium service by including the following variable : &ps=1
By doing so (and if you have money on your LFS account), you can place as many requests as you like, without having to wait.


SCRIPT LOCATION and ACTIONS (requests):
---------------------------------------

script url: https://www.lfsworld.net/pubstat/get_stat2.php?version=1.5&idk=<Your_Ident_Key_Here>&action=...


?action=help
------------
(returns this same document)


----------
?action=hl
----------
(get all hotlaps of a racer)

requires: &racer=<racer>
optional: -
returns: <id_hl> <track> <car> <split1> <split2> <split3> <laptime> <flags_hlaps> <timestamp>


----------
?action=ch
----------
(get all entries of a specific hotlap chart)

requires: &track=<track>&car=<car>
optional: &control=<steering>&country=<country>
returns: <id_hl> <split1> <split2> <split3> <laptime> <flags_hlaps> <racername>


----------
?action=wr
----------
(get wr's, either all or by track and/or car)

requires: -
optional: &track=<track>&car=<car>
returns: <id_wr> <track> <car> <split1> <split2> <split3> <laptime> <flags_hlaps> <racername> <timestamp>


----------
?action=pb
----------
(get all online pb's of a racer)

requires: &racer=<racer>
optional: -
returns: <track> <car> <split1> <split2> <split3> <laptime> <lapcount> <timestamp> <fuel>


------------
?action=fuel
------------
(get all fuel/lap tank percentages of a racer)
*NEW as of version 1.4*

requires: &racer=<racer>
optional: -
returns: <track> <car> <fuel>


-----------
?action=pst
-----------
(online statistics of one racer)

requires: &racer=<racer>
optional: -
returns: distance in metres
fuel burnt in cl
laps
hosts joined
wins
second
third
finished
quals
pole
drags
drag wins
country
online status (0 = offline, 1 = spectating, 2 = pits, 3 = in-race)
current / last hostname (or blank line if not online or on hidden host)
last_activity_time(*) (Unix timestamp (UTC))
current / last known track(*)
current / last known car(*)

(*) not always available.


-------------
?action=hosts
-------------
(get host list & information and online racers)

requires: -
optional: -
returns: HOST STRUCT:

HOSTNAME char[32]
TMLT byte[4]
TCRM byte[4] // Track, Config, Reversed, Max players allowed
CARS uint
RULES uint
LAPS byte
QUALMINS byte
COUNTRY char[2]
NROFRACERS byte
RACERNAMES char[24 * NROFRACERS]

LAPS work like this:
L is the given Laps value
0=practice
1-100=laps
101-190=110-1000 laps... 100+(L-100)*10
191-238=1-48 hours... L-190

TMLT means:
Type 0 : demo / 1 : S1 / 2 : S2
Main version times 10 (e.g. 5 means version 0.5)
Letter e.g. 'Y' in 0.5Y
TestId zero : official / non-zero : test patch id

(*) TRC is in numbers:
000 = bl1
001 = bl1r
010 = bl2
..
220 = fe3
221 = fe3r
..
etc.

cars bits:
XFG 1
XRG 2
XRT 4
RB4 8
FXO 16
LX4 32
LX6 64
MRT 128
etc etc

rules bits :
CAN_VOTE 1
CAN_SELECT 2
QUALIFY 4
PRIVATE 8
MODIFIED 16
MIDRACEJOIN 32
MUSTPIT 64
CAN_RESET 128
FCV 256
CRUISE 512


-------------
?action=teams
-------------
(get the entire teams database stored on lfs world)

requires: -
optional: &team=<teamname> (displays only the given team)
returns: TEAM STRUCT:

TID int;
TEAM char [128]
TAG char [6]
COUNTRY char [32]
URL char [128]
BITS int;
INFO_LEN word (2 bytes)
INFO char [INFO_LEN] (Note : urlencoded)
NR_MEMBERS word (2 bytes)
MEMBERS char [24] * NR_MEMBERS

BITS :
// 1 : race
// 2 : drift
// 4 : drag
// 8 : can apply
// 16 : has host
// 32 : Demo
// 64 : S1
// 128 : S2
// 256 : S3


--------------
?action=hl_log
--------------
(get latest entries from the hotlap upload log)

requires: &version=1.2 (or higher)
optional: &log_filter=<log_filter>&lines=[1-150]&control=<steering>&starttime=<starttime>
returns: preformatted text, "<u>18:36/05-01-2006</u> <b>sanxav</b> has uploaded a new hotlap to 4th place: <b>1:56.240</b> on <a href="http://www.lfsworld.net/?win=hotlaps&whichTab=trackcharts&track=as&config=national_rev&car=XFR&racer=sanxav" target="_blank"><b>AS national rev</b> with the <b>xf gtr</b></a>\n"

NOTE - use the alternate output formats to gather raw information instead of the preformatted html-lines
Variables :
<timestamp>
<racername>
<country>
<track>
<car>
<split1>
<split2>
<split3>
<split4>
<pos>
<flags_hlaps>
<id_hl>


----------------
?action=counters
----------------
(get global lapcounts of all cars and tracks)

requires: &type=(car|track)&version=1.4(or higher)
optional: -
returns: <car>|<track> <lapcount>


-------------------
Output compression
-------------------
(The output this script generates can be gzip compressed in 3 ways)

&c=1 gzencode
&c=2 gzcompress
&c=3 gzdeflate

------------------------
Alternate output formats
------------------------
Normally, pubstats will return data in the format as explained above with every ?action.
There is however an option to have the data returned to you in different formats, such as JSON, PHP Serialized and XML.
To select an alternate output type, append one of the following query variables :

&s=1 JSON
&s=2 PHP Serialized
&s=3 XML

NOTE 1 - XML output has a Content-Type: text/xml header, unless c=2 or c=3 is used. With c=1, a Content-Encoding: gzip header is sent, so that for example browsers can understand the compression.

-----
An additional funny is the online-highlights-log-per-country that you can get in .txt format (linux, so with \n line breaks, as is always the case on our sites really) :

https://www.lfsworld.net/highlight_countries/highlights_<Country_Name>.txt

***<Country_Name> Mind the capitals and underscore for spaces.***
Example: https://www.lfsworld.net/highl ... lights_United_Kingdom.txt

For use on your own site Smile
-----

Any questions? Something obvious missing? Please post them in this thread. Thanks and good luck (re)writing your scripts Smile

Victor

PS - since version numbers are introduced now, I'll attached every version's "readme" here.
Attached files
get_stat2_1.0.txt - 4.1 KB - 2591 views
get_stat2_1.1.txt - 4.7 KB - 1126 views
get_stat2_1.2.txt - 6.2 KB - 1355 views
get_stat2_1.3.txt - 9.1 KB - 1546 views
get_stat2_1.4.txt - 10.2 KB - 749 views
get_stat2_1.5.txt - 10.6 KB - 1196 views
the timestamp is GMT 0?
Quote from Victor :Something obvious missing?

Quote from Victor :<car> 3 character representation.
XFG, XRG, XRT, RB4, FXO, LX4, LX6, MRT, UF1, RAC, FZ5, FOX, XFR, UFR, FO8, FXR, XRR, FZR, BF1

?
Vic, in this line:

online status (0 = offline, 1 = spectating, 2 = pits, 3 = in-race)

For me appear blank when the racer is offline.

JS
A question here:

I extract host infos from the host list. I get everything right (cars, rules, qual mins, ...).

But reading the LAPS-Byte, I get 0 (=> practice) if no race is started (i.e. if the server is empty or people are in qualifying).

I thought the LAPS byte would just tell me, what the nr of laps in a (possible) race on this server is.

Take a look here to see the output of my server script.

Thanks for any help.
Quote from CrazyICE :the timestamp is GMT 0?

it's UTC.

Quote from jscorrea :Vic, in this line:

online status (0 = offline, 1 = spectating, 2 = pits, 3 = in-race)

For me appear blank when the racer is offline.

JS

Which in turn equals 0 equals offline?
And did you read the (*) note?

Quote from HorsePower :A question here:

I extract host infos from the host list. I get everything right (cars, rules, qual mins, ...).

But reading the LAPS-Byte, I get 0 (=> practice) if no race is started (i.e. if the server is empty or people are in qualifying).

I thought the LAPS byte would just tell me, what the nr of laps in a (possible) race on this server is.

Take a look here to see the output of my server script.

Thanks for any help.

Laps byte does show what number of laps is set on a host. The value explanations for this byte are noted above in the text. There's nothing more or less about it. That's what it is.
When a server is in qualifying mode, then you should see the QUALMINS byte is not 0 (but LAPS is)

if (qualmins) host is qualifying
else if (laps) race is in progress probably, or about to start
else practise mode
btw to all, the following line in the PST stat is buggy atm :

current / last car

This will be fixed in patch V, so you might not wanna take this value too seriously just yet.
scripting
ok guys. all this looks really interesting, however i am not one for writing scripts. if anyone has a template script i could use i would be ever so greatfull. i hope someone can help.

thanks
nevermind, spoke to victor already
hi
i don't know. what kind of stuff can you add to myspace pages? this is typically done through PHP, although there are some php scripts that generate images with the stats on them...but those still require a host that can process PHP to generate the images.

if you have such a thing, i'm going to be posting an updated version of my script soon that adds in some of the new functionality.

if you just want a simple image that shows if you are online or not, then look to this thread...all you would need to do is copy the url that is in that thread.
example : http://www.lfsworld.net/isonline.NickSpeed.gif ->

if you want more, and have a host that can run PHP, then my script might work for you.
Attached images
pubstats13_sig_example.jpg
Is there any way the hotlap id could also be given when retrieving all the hotlaps from a certain chart? The nation would also be useful, basically everything which you can get from the hotlap log. I doubt this will get added as i don't know if anyone other than myself would want it, but it would also be cool if the drivers' team could be included in the hotlap log and the other hotlap requests.

Thanks, Josh
What about Premium restriction on IdentKeys
Maybe I'm wrong, but I think there's a problem ATM.
I think Premium access restriction coud be really usefull, in case of IdentKey pishing. ATM it's quite easy to change from free acces to Premium acces, needs only adding &ps=1 at the end of the URL.

If I can obtain an IdentKey, I can use all credits on the corresponding account, I just have to use this identKey for my requests, with &ps=1. A simple "Allow Premium access (with fees)" checkbox with each IdentKey could solve this problem.

Cheers
if you're afraid about your identkey being misused, then you should bind an ip address to the identkey and it's safe from tampering basically
U know, in some cases, it's unusable : in France, 80% of ADSL connections use a dynamic IP, like mine. So if I do that, I'll have to update my IP on LFS World twice or more a day (some disconnections) to use mates@tracks or Mysolc (french program). Not really easy.
ok, but
Quote :If I can obtain an IdentKey, I can use all credits on the corresponding account,

How exactly would you get an IdentKey in the first place?
And how would you add a pubstat premium restriction?

Quote :A simple "Allow Premium access (with fees)" checkbox with each IdentKey could solve this problem.

No it would not, because then you still have exactly the same situation as now.

The main idea : don't give away your identkey. And phishing for them is overrated imho. How are you going to phish for someone else's idkey, especially if the people you talk about are on their own home networks, to which you have no access to?
Quote from Victor :How exactly would you get an IdentKey in the first place?

Like creating a free of charge mates@track or Mysolc program, but mine sends IdentKeys by mail. j/k
Quote from Victor : No it would not, because then you still have exactly the same situation as now.

I can have 3 IdentKeys. I create 2, the first one allowing Premium Acces, the 2nd disallowing it. I use the first one only in my own programs or websites, and I don't really care for the 2nd one.
Quote from Victor :The main idea : don't give away your identkey. And phishing for them is overrated imho. How are you going to phish for someone else's idkey, especially if the people you talk about are on their own home networks, to which you have no access to?

I understand your point of view, and I agree with that. But I have to trust programs which need my identkey for normal purposes. I trust mates@tracks and Mysolc, but who knows for next ones?
So in the end your question is more like, do i entrust 3rd party applications with my identkey?
Quote from Victor :So in the end your question is more like, do i entrust 3rd party applications with my identkey?

Not really. It's a only a part of the question.
For example, I trust my bank, I have an internet access to my account, I can pay fees using internet & so on.
But if my bank didn't gave me the required security level, I would not use all these features.
For example, besides account, password and https access, they sent me a card with 72 different codes, and ask for one of these codes (randomly) each time I try to make money orders or anything like that. After 3 mistakes, the internet acces to my account is locked, and they send me a mail.

IMO, as you store money on the LFS account, and give users a possibility to use it by a simple URL, you have to give them sufficient security level, and IMO, it's not the case ATM.

Maybe I'm paranoid
but, you don't use any 3rd party applications for internet banking. The two are hard to compare imo.

I need some time to think about it. In the end, it still comes down to whether you can trust 3rd party applications - no matter how much safety I code for on my side.

You may not use a 3rd party app with Premium Pubstat, so you might be helped with a checkbox that allows you to create Premium IDKeys, but this will not help those that do use a 3rd party app with a Premium IDKey. See the problem?
Now I totally agree with you.

Like I've said above, if I need a Premium Pubstat access, AND use of one or more third party programs, I'll create 2 IndentKeys, one absolutely private for the Premium acces, and the 2nd one, disallowing Premium Acces for all third party programs. And I don't care the 2nd one could be sent by email, used by someone else with an &ps=1, coz the checkbox disallows Premium acces.

IMO default checkbox value is disallow, of course (Yes, I'm really paranoid )

15th internet disconnection in 2 hours, f***ing telephone line and f***ing router using 6db noise margin
That's a no then i guess..?
not for now, no. Could be done with a next version.
Ok, thanks for the reply.

Josh
EDIT: Solved. And really don't know how. Must have overseen a bug.

I think I found a strange thing, which I don't understand:

I'm programming a team tracker for my team, which means that I have to refresh all PB's and HL's of my mates every now and then.

Since I use the free pubstats, I have a certain sleep time between two queries.

Now my strange observations:
  1. If I use uncompressed LFSW output, everything works fine with 6 seconds intervals.
  2. If I use compressed output (tested &c=2 and $c=3), the first query works ok, while from the second query - no matter what interval I use (tested up to 120 seconds) - I get the "can't reload this page that quickly after another" error.
What's wrong here?

FGED GREDG RDFGDR GSFDG