tool or program

Suggest and discuss new ideas or ways we can improve the game.
Post Reply
iceblink
Posts: 294
Joined: Fri Feb 27, 2009 11:46 pm

tool or program

Post by iceblink »

According to the rules "Any tool or program you use that gives you an added advantage and is not cleared and made available to every player is deemed illegal and therefore cheating. There is a list of approved programs on the downloads page. If you wish to develop a new program please discuss the idea with the administrators in the new features forum prior to proceeding."

Would an excel sheet that does some calculations fall under this rule?
What if the excel sheet had some degree of automation and fetched the content from the site by itself?
What if it did so automatically at set times?

Trying to find the boundaries of this rule :D
ecvej
Developer / Administrator
Posts: 704
Joined: Sun Sep 28, 2008 11:43 pm

Re: tool or program

Post by ecvej »

Would an excel sheet that does some calculations fall under this rule?
You using excel or notepad etc to copy / log info that you manually compare - not a tool or programme for this purpose.

Something with formulas programmed that does calculation / comparisons for you - please share with the wider play base. I think there's the ability to add attachments on the forum or you can contact me and I'll host it on the downloads page.
What if the excel sheet had some degree of automation and fetched the content from the site by itself?
What if it did so automatically at set times?
Should definitely be shared. Given the security risks of a programme logging into the accounts of players, the sharing would have to include the source code (at least with the admins) so we can verify it isn't harmful.

Also, rather than scraping the HTML site, we can grant you access to a JSON API which would be better suited and mean your app wouldn't break if we change the website layout. We need to do some more work on the API so would be good to have an end user testing it.

In general, we would welcome people developing apps for the game and would co-operate with them. In particular, the desktop apps are outdated, there isn't an iphone app and the android app needs work. Existing source code for them can be shared for people to improve.

PS we have really good security code for this stuff so we can see when people are using tools as they leave distinct patterns in the logs; they do repetitive things and do them much quicker than a human. For example, if a pilot, let's call him steamwink, started using a tool on 16 May at 7:33 PM and has been using it regularly since we would know :P
iceblink
Posts: 294
Joined: Fri Feb 27, 2009 11:46 pm

Re: tool or program

Post by iceblink »

Steamwink? :lol:

I'm willing to look into JSON as long as it doesn't smell too much of Java/JS, cause I don't think I will ever learn that.

Anyway the script is finally producing some useful output without too many errors, so it is time to share it.
Only tested on OSX, should also work on Linux, not sure about Windows (may require a terminal emulator of some sorts).

Script http://iceblink.synology.me/~patrick/TVS/tvscheck.py
Login data sample script http://iceblink.synology.me/~patrick/TVS/logindata.py

Sample output:
Image

So far it mainly shows condensed rankings, highlights changes, and calculates differences.
It also shows a simple map with highlighted dominance changes (red for disappeared legion dominance).
Still thinking about other things to add, if I have time.

And if you see any programming that could have been done better, let me know. Just go easy on me, I'm just an amateur :mrgreen:
ecvej
Developer / Administrator
Posts: 704
Joined: Sun Sep 28, 2008 11:43 pm

Re: tool or program

Post by ecvej »

Below is an extract of what the output is when using json instead of html. Some advantages for you of using the api instead of scraping the html:
  1. It displays up to 100 players instead of the 25 in the rankings
  2. there's no html chaff in the way of getting the data you want.
  3. for some pages you don't need to login
Python has excellent JSON abilities. https://docs.python.org/3/library/json.html

I expect the programme flow would be:

1) Download from the server
2) Check the response is valid JSON
3) If the rankings_pilots_total is < 100 you have everything. Perhaps not to worry now, but second page could be requested if player numbers grow
4) Iterate through the rankings_pilots array. Each object in that array is a player

Code: Select all

{
    "rankings_pilots_total": 44,
    "rankings_pilots": [
        {
            "tvs_username": "Mayo",
            "legion": 4,
            "level": 5,
            "hp": 11648,
            "maxhp": 12500,
            "ship": 33,
            "score": 115927,
            "kills": 1,
            "deaths": 0
        },
        {
            "tvs_username": "Aftermath",
            "legion": 5,
            "level": 5,
            "hp": 2478,
            "maxhp": 12500,
            "ship": 30,
            "score": 114805,
            "kills": 2,
            "deaths": 0
        },
        {
            "tvs_username": "the_hero",
            "legion": 3,
            "level": 5,
            "hp": 10938,
            "maxhp": 12500,
            "ship": 28,
            "score": 105093,
            "kills": 0,
            "deaths": 0
        },
        {
            "tvs_username": "ClemsonRoll",
            "legion": 4,
            "level": 5,
            "hp": 9771,
            "maxhp": 12500,
            "ship": 29,
            "score": 104711,
            "kills": 0,
            "deaths": 0
        },
        {
            "tvs_username": "Lethal Lordz",
            "legion": 3,
            "level": 5,
            "hp": 7717,
            "maxhp": 12500,
            "ship": 32,
            "score": 100875,
            "kills": 2,
            "deaths": 0
        },
        {
            "tvs_username": "faulcon",
            "legion": 3,
            "level": 5,
            "hp": 10004,
            "maxhp": 12500,
            "ship": 32,
            "score": 99511,
            "kills": 3,
            "deaths": 0
        },
        {
            "tvs_username": "Durandal",
            "legion": 2,
            "level": 5,
            "hp": 10822,
            "maxhp": 12500,
            "ship": 31,
            "score": 98401,
            "kills": 0,
            "deaths": 0
        },
        {
            "tvs_username": "Arch",
            "legion": 4,
            "level": 5,
            "hp": 11446,
            "maxhp": 12500,
            "ship": 29,
            "score": 96259,
            "kills": 0,
            "deaths": 0
        },
        {
            "tvs_username": "MJ23",
            "legion": 2,
            "level": 5,
            "hp": 12500,
            "maxhp": 12500,
            "ship": 31,
            "score": 91799,
            "kills": 0,
            "deaths": 0
        },
        {
            "tvs_username": "RaZeR",
            "legion": 3,
            "level": 5,
            "hp": 10668,
            "maxhp": 12500,
            "ship": 32,
            "score": 80762,
            "kills": 3,
            "deaths": 1
        },
        {
            "tvs_username": "Xyphistor",
            "legion": 3,
            "level": 5,
            "hp": 12150,
            "maxhp": 12500,
            "ship": 32,
            "score": 80370,
            "kills": 1,
            "deaths": 0
        },
        {
            "tvs_username": "Falashar",
            "legion": 4,
            "level": 5,
            "hp": 12141,
            "maxhp": 12500,
            "ship": 33,
            "score": 78101,
            "kills": 6,
            "deaths": 0
        },
        {
            "tvs_username": "Zypher",
            "legion": 4,
            "level": 5,
            "hp": 9000,
            "maxhp": 10000,
            "ship": 9,
            "score": 75009,
            "kills": 2,
            "deaths": 0
        },
        {
            "tvs_username": "Lethal2Trash",
            "legion": 4,
            "level": 5,
            "hp": 9218,
            "maxhp": 10000,
            "ship": 25,
            "score": 74843,
            "kills": 0,
            "deaths": 0
        },
        {
            "tvs_username": "Lanix",
            "legion": 1,
            "level": 5,
            "hp": 6034,
            "maxhp": 10000,
            "ship": 22,
            "score": 70089,
            "kills": 0,
            "deaths": 0
        },
        {
            "tvs_username": "Stranger",
            "legion": 2,
            "level": 5,
            "hp": 8981,
            "maxhp": 10000,
            "ship": 23,
            "score": 69495,
            "kills": 0,
            "deaths": 0
        },
        {
            "tvs_username": "Beef",
            "legion": 4,
            "level": 5,
            "hp": 8938,
            "maxhp": 10000,
            "ship": 11,
            "score": 68253,
            "kills": 1,
            "deaths": 0
        },
        {
            "tvs_username": "Yellow13",
            "legion": 4,
            "level": 5,
            "hp": 9552,
            "maxhp": 10000,
            "ship": 11,
            "score": 67920,
            "kills": 7,
            "deaths": 0
        },
        {
            "tvs_username": "David",
            "legion": 4,
            "level": 5,
            "hp": 8314,
            "maxhp": 10000,
            "ship": 9,
            "score": 65179,
            "kills": 2,
            "deaths": 0
        },
        {
            "tvs_username": "Galgaron",
            "legion": 2,
            "level": 5,
            "hp": 9776,
            "maxhp": 10000,
            "ship": 23,
            "score": 54752,
            "kills": 0,
            "deaths": 1
        },
        {
            "tvs_username": "Skirmisher",
            "legion": 4,
            "level": 5,
            "hp": 3313,
            "maxhp": 10000,
            "ship": 15,
            "score": 53743,
            "kills": 2,
            "deaths": 0
        },
        {
            "tvs_username": "calundra",
            "legion": 2,
            "level": 5,
            "hp": 8361,
            "maxhp": 10000,
            "ship": 13,
            "score": 50313,
            "kills": 1,
            "deaths": 0
        },
        {
            "tvs_username": "degener8",
            "legion": 2,
            "level": 5,
            "hp": 8109,
            "maxhp": 10000,
            "ship": 13,
            "score": 49573,
            "kills": 1,
            "deaths": 0
        },
        {
            "tvs_username": "Nivara",
            "legion": 2,
            "level": 5,
            "hp": 9843,
            "maxhp": 10000,
            "ship": 19,
            "score": 49150,
            "kills": 0,
            "deaths": 0
        },
        {
            "tvs_username": "Bsmoka",
            "legion": 3,
            "level": 5,
            "hp": 9368,
            "maxhp": 10000,
            "ship": 8,
            "score": 40080,
            "kills": 1,
            "deaths": 1
        },
        {
            "tvs_username": "Standishy",
            "legion": 5,
            "level": 5,
            "hp": 5572,
            "maxhp": 10000,
            "ship": 12,
            "score": 36276,
            "kills": 2,
            "deaths": 3
        },
        {
            "tvs_username": "ailill",
            "legion": 2,
            "level": 5,
            "hp": 10000,
            "maxhp": 10000,
            "ship": 23,
            "score": 34086,
            "kills": 0,
            "deaths": 1
        },
        {
            "tvs_username": "valdano",
            "legion": 2,
            "level": 5,
            "hp": 7414,
            "maxhp": 10000,
            "ship": 19,
            "score": 33617,
            "kills": 1,
            "deaths": 3
        },
        {
            "tvs_username": "PB&J",
            "legion": 2,
            "level": 5,
            "hp": 7814,
            "maxhp": 10000,
            "ship": 13,
            "score": 33019,
            "kills": 1,
            "deaths": 2
        },
        {
            "tvs_username": "Legion",
            "legion": 2,
            "level": 4,
            "hp": 7850,
            "maxhp": 8000,
            "ship": 5,
            "score": 30024,
            "kills": 3,
            "deaths": 4
        },
        {
            "tvs_username": "TalathTheMage",
            "legion": 4,
            "level": 4,
            "hp": 8000,
            "maxhp": 8000,
            "ship": 11,
            "score": 28494,
            "kills": 2,
            "deaths": 1
        },
        {
            "tvs_username": "son_of_squid",
            "legion": 1,
            "level": 4,
            "hp": 4434,
            "maxhp": 8000,
            "ship": 12,
            "score": 26387,
            "kills": 0,
            "deaths": 2
        },
        {
            "tvs_username": "Pjmaster",
            "legion": 3,
            "level": 4,
            "hp": 5482,
            "maxhp": 8000,
            "ship": 14,
            "score": 25978,
            "kills": 0,
            "deaths": 1
        },
        {
            "tvs_username": "Pharaoh",
            "legion": 1,
            "level": 4,
            "hp": 5931,
            "maxhp": 8000,
            "ship": 2,
            "score": 21631,
            "kills": 0,
            "deaths": 1
        },
        {
            "tvs_username": "SpiderWolve",
            "legion": 2,
            "level": 3,
            "hp": 5073,
            "maxhp": 6000,
            "ship": 13,
            "score": 14750,
            "kills": 4,
            "deaths": 3
        },
        {
            "tvs_username": "GojanTorresque",
            "legion": 4,
            "level": 3,
            "hp": 4592,
            "maxhp": 6000,
            "ship": 21,
            "score": 14302,
            "kills": 1,
            "deaths": 1
        },
        {
            "tvs_username": "12app",
            "legion": 3,
            "level": 3,
            "hp": 5463,
            "maxhp": 6000,
            "ship": 14,
            "score": 13886,
            "kills": 1,
            "deaths": 4
        },
        {
            "tvs_username": "Omega",
            "legion": 1,
            "level": 2,
            "hp": 3000,
            "maxhp": 4000,
            "ship": 3,
            "score": 5495,
            "kills": 0,
            "deaths": 1
        },
        {
            "tvs_username": "Wedge",
            "legion": 3,
            "level": 1,
            "hp": 2000,
            "maxhp": 2000,
            "ship": 6,
            "score": 2610,
            "kills": 2,
            "deaths": 2
        },
        {
            "tvs_username": "gerund",
            "legion": 4,
            "level": 1,
            "hp": 1696,
            "maxhp": 2000,
            "ship": 10,
            "score": 750,
            "kills": 0,
            "deaths": 3
        },
        {
            "tvs_username": "Morningstar",
            "legion": 3,
            "level": 1,
            "hp": 2000,
            "maxhp": 2000,
            "ship": 24,
            "score": 508,
            "kills": 0,
            "deaths": 2
        },
        {
            "tvs_username": "jarrok",
            "legion": 3,
            "level": 1,
            "hp": 2000,
            "maxhp": 2000,
            "ship": 8,
            "score": 300,
            "kills": 0,
            "deaths": 1
        },
        {
            "tvs_username": "Capt_nemo",
            "legion": 3,
            "level": 1,
            "hp": 2000,
            "maxhp": 2000,
            "ship": 8,
            "score": 0,
            "kills": 0,
            "deaths": 0
        },
        {
            "tvs_username": "Keeliani",
            "legion": 3,
            "level": 1,
            "hp": 2000,
            "maxhp": 2000,
            "ship": 24,
            "score": 0,
            "kills": 0,
            "deaths": 2
        }
    ]
}
Post Reply