Advertisement
heidi666

Bloc Dossier Script

Apr 20th, 2015
493
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 55.25 KB | None | 0 0
  1. import mechanize
  2. import cookielib
  3. from bs4 import BeautifulSoup as BS
  4. import datetime
  5. import sys
  6. from operator import itemgetter
  7.  
  8. br = mechanize.Browser()
  9. cj = cookielib.LWPCookieJar()
  10. br.set_cookiejar(cj)
  11. br.set_handle_robots(False)
  12. br.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:24.0) Gecko/20140610 Firefox/24.0 PaleMoon/24.6.2')]
  13.  
  14. def techlevels(alliance):
  15.     advanced = persian = almost = vietnam = korean = second = first = finest = stone = 0
  16.     for i in alliance:
  17.         if i['equipment'].rstrip() == 'Advanced':
  18.             advanced += 1
  19.         elif i['equipment'].rstrip() == 'Persian Gulf War surplus':
  20.             persian += 1
  21.         elif i['equipment'].rstrip() == 'Almost Modern':
  22.             almost += 1
  23.         elif i['equipment'].rstrip() == 'Vietnam War surplus':
  24.             vietnam += 1
  25.         elif i['equipment'].rstrip() == 'Korean War surplus':
  26.             korean += 1
  27.         elif i['equipment'].rstrip() == 'Second World War surplus':
  28.             second += 1
  29.         elif i['equipment'].rstrip() == 'First World War surplus':
  30.             first += 1
  31.         elif i['equipment'].rstrip() == 'Finest of the 19th century':
  32.             finest += 1
  33.         else:
  34.             stone += 1
  35.     return advanced, persian, almost, vietnam, korean, second, first, finest, stone
  36.  
  37. def airforcelevels(alliance):
  38.     vpowerful = powerful = large = somelarge = mediocre = meagre = small = none = 0
  39.     for i in alliance:
  40.         if i['airforce'].rstrip() == 'Very Powerful':
  41.             vpowerful += 1
  42.         elif i['airforce'].rstrip() == 'Powerful':
  43.             powerful += 1
  44.         elif i['airforce'].rstrip() == 'Large':
  45.             large += 1
  46.         elif i['airforce'].rstrip() == 'Somewhat Large':
  47.             somelarge += 1
  48.         elif i['airforce'].rstrip() == 'Mediocre':
  49.             mediocre += 1
  50.         elif i['airforce'].rstrip() == 'Meagre':
  51.             meagre += 1
  52.         elif i['airforce'].rstrip() == 'Small':
  53.             small += 1
  54.         else:
  55.             none += 1
  56.     return vpowerful, powerful, large, somelarge, mediocre, meagre, small, none
  57.  
  58. def traininglevels(alliance):
  59.     elite = good = standard = poor = rabble = 0
  60.     for i in alliance:
  61.         if i['training'].rstrip() == 'Elite':
  62.             elite += 1
  63.         elif i['training'].rstrip() == 'Good':
  64.             good += 1
  65.         elif i['training'].rstrip() == 'Standard':
  66.             standard += 1
  67.         elif i['training'].rstrip() == 'Poor':
  68.             poor += 1
  69.         else:
  70.             rabble += 1
  71.     return elite, good, standard, poor, rabble
  72.  
  73. def regionlevels(alliance):
  74.     mam = car = gra = ama = sco = saf = con = eaf = gui = waf = atl = egy = ara = mpo = per = sub = chi = ind = ein = pac = 0
  75.     for i in alliance:
  76.         if i['region'].rstrip() == 'Mesoamerica':
  77.             mam += 1
  78.         elif i['region'].rstrip() == 'Caribbean':
  79.             car += 1
  80.         elif i['region'].rstrip() == 'Gran Colombia':
  81.             gra += 1
  82.         elif i['region'].rstrip() == 'Amazonia':
  83.             ama += 1
  84.         elif i['region'].rstrip() == 'Southern Cone':
  85.             sco += 1
  86.         elif i['region'].rstrip() == 'Southern Africa':
  87.             saf += 1
  88.         elif i['region'].rstrip() == 'Congo':
  89.             con += 1
  90.         elif i['region'].rstrip() == 'East Africa':
  91.             eaf += 1
  92.         elif i['region'].rstrip() == 'Guinea':
  93.             gui += 1
  94.         elif i['region'].rstrip() == 'West Africa':
  95.             waf += 1
  96.         elif i['region'].rstrip() == 'Atlas':
  97.             atl += 1
  98.         elif i['region'].rstrip() == 'Egypt':
  99.             egy += 1
  100.         elif i['region'].rstrip() == 'Arabia':
  101.             ara += 1
  102.         elif i['region'].rstrip() == 'Mesopotamia':
  103.             mpo += 1
  104.         elif i['region'].rstrip() == 'Persia':
  105.             per += 1
  106.         elif i['region'].rstrip() == 'The Subcontinent':
  107.             sub += 1
  108.         elif i['region'].rstrip() == 'China':
  109.             chi += 1
  110.         elif i['region'].rstrip() == 'Indochina':
  111.             ind += 1
  112.         elif i['region'].rstrip() == 'East Indies':
  113.             ein += 1
  114.         elif i['region'].rstrip() == 'Pacific Rim':
  115.             pac += 1
  116.     return mam, car, gra, ama, sco, saf, con, eaf, gui, waf, atl, egy, ara, mpo, per, sub, chi, ind, ein, pac
  117.  
  118. def manpowerlevels(alliance):
  119.     untapped = plentiful = halved = low = neardep = depleted = 0
  120.     for i in alliance:
  121.         if i['manpower'].rstrip() == 'Untapped':
  122.             untapped += 1
  123.         elif i['manpower'].rstrip() == 'Plentiful':
  124.             plentiful += 1
  125.         elif i['manpower'].rstrip() == 'Halved':
  126.             halved += 1
  127.         elif i['manpower'].rstrip() == 'Low':
  128.             low += 1
  129.         elif i['manpower'].rstrip() == 'Near Depletion':
  130.             neardep += 1
  131.         elif i['manpower'].rstrip() == 'Depleted':
  132.             depleted += 1
  133.     return untapped, plentiful, halved, low, neardep, depleted
  134.  
  135. def approvallevels(alliance):
  136.     waag = adored = loved = liked = decent = middling = disliked = hated = despised = eop = 0
  137.     for i in alliance:
  138.         if i['approval'].rstrip() == 'Worshiped as a God':
  139.             waag += 1
  140.         elif i['approval'].rstrip() == 'Adored':
  141.             adored += 1
  142.         elif i['approval'].rstrip() == 'Loved':
  143.             loved += 1
  144.         elif i['approval'].rstrip() == 'Liked':
  145.             liked += 1
  146.         elif i['approval'].rstrip() == 'Decent':
  147.             decent += 1
  148.         elif i['approval'].rstrip() == 'Middling':
  149.             middling += 1
  150.         elif i['approval'].rstrip() == 'Disliked':
  151.             disliked += 1
  152.         elif i['approval'].rstrip() == 'Hated':
  153.             hated += 1
  154.         elif i['approval'].rstrip() == 'Utterly Despised':
  155.             despised += 1
  156.         elif i['approval'].rstrip() == 'Enemy of the People':
  157.             eop += 1
  158.     return waag, adored, loved, liked, decent, middling, disliked, hated, despised, eop
  159.  
  160. def polsystemlevels(alliance):
  161.     libdem = authdem = opr = junta = dictat = 0
  162.     for i in alliance:
  163.         if i['polsystem'].rstrip() == 'Liberal Democracy':
  164.             libdem += 1
  165.         elif i['polsystem'].rstrip() == 'Authoritarian Democracy':
  166.             authdem += 1
  167.         elif i['polsystem'].rstrip() == 'One Party Rule':
  168.             opr += 1
  169.         elif i['polsystem'].rstrip() == 'Military Junta':
  170.             junta += 1
  171.         elif i['polsystem'].rstrip() == 'Dictatorship':
  172.             dictat += 1
  173.     return libdem, authdem, opr, junta, dictat
  174.  
  175. def stabilitylevels(alliance):
  176.     unsink = entrenched = vstable = quiet = calm = tensions = chaotic = rioting = protests = collapse = 0
  177.     for i in alliance:
  178.         if i['stability'].rstrip() == 'Unsinkable':
  179.             unsink += 1
  180.         elif i['stability'].rstrip() == 'Entrenched':
  181.             entrenched += 1
  182.         elif i['stability'].rstrip() == 'Very Stable':
  183.             vstable += 1
  184.         elif i['stability'].rstrip() == 'Quiet':
  185.             quiet += 1
  186.         elif i['stability'].rstrip() == 'Seemingly Calm':
  187.             calm += 1
  188.         elif i['stability'].rstrip() == 'Growing Tensions':
  189.             tensions += 1
  190.         elif i['stability'].rstrip() == 'Chaotic':
  191.             chaotic += 1
  192.         elif i['stability'].rstrip() == 'Rioting':
  193.             rioting += 1
  194.         elif i['stability'].rstrip() == 'Mass Protests':
  195.             protests += 1
  196.         elif i['stability'].rstrip() == 'Brink of Collapse':
  197.             collapse += 1
  198.     return unsink, entrenched, vstable, quiet, calm, tensions, chaotic, rioting, protests, collapse
  199.  
  200. def rebelslevels(alliance):
  201.     norebels = terror = guerrilla = rebellion = civil = 0
  202.     for i in alliance:
  203.         if i['rebels'].rstrip() == 'None':
  204.             norebels += 1
  205.         elif i['rebels'].rstrip() == 'Scattered terrorists':
  206.             terror += 1
  207.         elif i['rebels'].rstrip() == 'Guerrillas':
  208.             guerrilla += 1
  209.         elif i['rebels'].rstrip() == 'Open Rebellion':
  210.             rebellion += 1
  211.         elif i['rebels'].rstrip() == 'Civil War':
  212.             civil += 1
  213.     return norebels, terror, guerrilla, rebellion, civil
  214.  
  215. def econsystemlevels(alliance):
  216.     free = mixed = command = 0
  217.     for i in alliance:
  218.         if i['econsystem'].rstrip() == 'Free Market':
  219.             free += 1
  220.         elif i['econsystem'].rstrip() == 'Mixed Economy':
  221.             mixed += 1
  222.         elif i['econsystem'].rstrip() == 'Central Planning':
  223.             command += 1
  224.     return free, mixed, command
  225.  
  226. def qollevels(alliance):
  227.     developed = good = decent = above = average = poor = impov = desp = disast = crisis = 0
  228.     for i in alliance:
  229.         if i['qol'].rstrip() == 'Developed':
  230.             developed += 1
  231.         elif i['qol'].rstrip() == 'Good':
  232.             good += 1
  233.         elif i['qol'].rstrip() == 'Decent':
  234.             decent += 1
  235.         elif i['qol'].rstrip() == 'Above Average':
  236.             above += 1
  237.         elif i['qol'].rstrip() == 'Average':
  238.             average += 1
  239.         elif i['qol'].rstrip() == 'Poor':
  240.             poor += 1
  241.         elif i['qol'].rstrip() == 'Impoverished':
  242.             impov += 1
  243.         elif i['qol'].rstrip() == 'Desperate':
  244.             desp += 1
  245.         elif i['qol'].rstrip() == 'Disastrous':
  246.             disast += 1
  247.         else:
  248.             crisis += 1
  249.     return developed, good, decent, above, average, poor, impov, desp, disast, crisis
  250.  
  251. def alignlevels(alliance):
  252.     west = non = east = 0
  253.     for i in alliance:
  254.         if i['alignment'].rstrip() == 'United States':
  255.             west += 1
  256.         elif i['alignment'].rstrip() == 'Neutral':
  257.             non += 1
  258.         elif i['alignment'].rstrip() == 'Soviet Union':
  259.             east += 1
  260.     return west, non, east
  261.  
  262. def replevels(alliance):
  263.     gandhi = angelic = nice = good = normal = quest = isolated = pariah = maddog = aoe = 0
  264.     for i in alliance:
  265.         if i['reputation'].rstrip() == 'Gandhi-like':
  266.             gandhi += 1
  267.         elif i['reputation'].rstrip() == 'Angelic':
  268.             angelic += 1
  269.         elif i['reputation'].rstrip() == 'Nice':
  270.             nice += 1
  271.         elif i['reputation'].rstrip() == 'Good':
  272.             good += 1
  273.         elif i['reputation'].rstrip() == 'Normal':
  274.             normal += 1
  275.         elif i['reputation'].rstrip() == 'Questionable':
  276.             quest += 1
  277.         elif i['reputation'].rstrip() == 'Isolated':
  278.             isolated += 1
  279.         elif i['reputation'].rstrip() == 'Pariah':
  280.             pariah += 1
  281.         elif i['reputation'].rstrip() == 'Mad Dog':
  282.             maddog += 1
  283.         elif i['reputation'].rstrip() == 'Axis of Evil':
  284.             aoe += 1
  285.     return gandhi, angelic, nice, good, normal, quest, isolated, pariah, maddog, aoe
  286.  
  287. def regiontroops(alliance):
  288.     mam = car = gra = ama = sco = saf = con = eaf = gui = waf = atl = egy = ara = mpo = per = sub = chi = ind = ein = pac = 0
  289.     for i in alliance:
  290.         if i['region'].rstrip() == 'Mesoamerica':
  291.             mam += i['troops']
  292.         elif i['region'].rstrip() == 'Caribbean':
  293.             car += i['troops']
  294.         elif i['region'].rstrip() == 'Gran Colombia':
  295.             gra += i['troops']
  296.         elif i['region'].rstrip() == 'Amazonia':
  297.             ama += i['troops']
  298.         elif i['region'].rstrip() == 'Southern Cone':
  299.             sco += i['troops']
  300.         elif i['region'].rstrip() == 'Southern Africa':
  301.             saf += i['troops']
  302.         elif i['region'].rstrip() == 'Congo':
  303.             con += i['troops']
  304.         elif i['region'].rstrip() == 'East Africa':
  305.             eaf += i['troops']
  306.         elif i['region'].rstrip() == 'Guinea':
  307.             gui += i['troops']
  308.         elif i['region'].rstrip() == 'West Africa':
  309.             waf += i['troops']
  310.         elif i['region'].rstrip() == 'Atlas':
  311.             atl += i['troops']
  312.         elif i['region'].rstrip() == 'Egypt':
  313.             egy += i['troops']
  314.         elif i['region'].rstrip() == 'Arabia':
  315.             ara += i['troops']
  316.         elif i['region'].rstrip() == 'Mesopotamia':
  317.             mpo += i['troops']
  318.         elif i['region'].rstrip() == 'Persia':
  319.             per += i['troops']
  320.         elif i['region'].rstrip() == 'The Subcontinent':
  321.             sub += i['troops']
  322.         elif i['region'].rstrip() == 'China':
  323.             chi += i['troops']
  324.         elif i['region'].rstrip() == 'Indochina':
  325.             ind += i['troops']
  326.         elif i['region'].rstrip() == 'East Indies':
  327.             ein += i['troops']
  328.         elif i['region'].rstrip() == 'Pacific Rim':
  329.             pac += i['troops']
  330.     return mam, car, gra, ama, sco, saf, con, eaf, gui, waf, atl, egy, ara, mpo, per, sub, chi, ind, ein, pac
  331.  
  332. def getsoup(url):
  333.     while True:
  334.         try:
  335.             temp = br.open(url)
  336.         except:
  337.             print "Timeout, requesting again."
  338.         else:
  339.             break
  340.     html = temp.read()
  341.     soup = BS(html)
  342.     # print soup.prettify()
  343.     return soup
  344.  
  345. def getdata(soup):
  346.     data = {}
  347.     if soup.find(size="2").string == 'online now':
  348.         data['online'] = 0
  349.     else:
  350.         data['online'] = int(soup.find(size="2").string[12:-10])
  351.     data['name'] = soup.find(id="nationtitle").string
  352.     data['approval'] = soup.find(text='Approval:').parent.next_sibling.next_sibling.contents[0].string
  353.     data['polsystem'] = soup.find(text='Political System:').parent.next_sibling.next_sibling.contents[0].string
  354.     data['stability'] = soup.find(text='Stability:').parent.next_sibling.next_sibling.contents[0].string
  355.     data['qol'] = soup.find(text='Quality of Life:').parent.next_sibling.next_sibling.contents[0].string
  356.     data['territory'] = int(str(soup.find(text='Territory:').parent.next_sibling.next_sibling.contents)[4:-20])
  357.     data['rebels'] = soup.find(text='Rebel Threat:').parent.next_sibling.next_sibling.contents[0].string
  358.     data['econsystem'] = soup.find(text='Economic System:').parent.next_sibling.next_sibling.contents[0].string
  359.     if soup.find(text='Industry:').parent.next_sibling.next_sibling.contents[0].string == 'None':
  360.         data['factories'] = 0
  361.     elif soup.find(text='Industry:').parent.next_sibling.next_sibling.contents[0].string == '1 factory':
  362.         data['factories'] = 1
  363.     else:
  364.         data['factories'] = int(soup.find(text='Industry:').parent.next_sibling.next_sibling.contents[0].string[:-10])
  365.     data['gdp'] = int(soup.find(text='Gross Domestic Product:').parent.next_sibling.next_sibling.contents[0].string[1:-8])
  366.     data['growth'] = int(soup.find(text='Growth:').parent.next_sibling.next_sibling.contents[0].string[1:-18])
  367.     if soup.find(text='Discovered Oil Reserves:').parent.next_sibling.next_sibling.contents[0].string == 'None':
  368.         data['oilres'] = 0
  369.     else:
  370.         data['oilres'] = int(soup.find(text='Discovered Oil Reserves:').parent.next_sibling.next_sibling.contents[0].string[:-5])
  371.     if soup.find(text='Oil Production:').parent.next_sibling.next_sibling.contents[0].string == 'None':
  372.         data['oilprod'] = 0
  373.     else:
  374.         data['oilprod'] = int(soup.find(text='Oil Production:').parent.next_sibling.next_sibling.contents[0].string[:-15])
  375.     try:
  376.         data['rmprod'] = int(soup.find(text='Raw Material Production:').parent.next_sibling.next_sibling.contents[0].string[:-23])
  377.     except:
  378.         print "rm" + soup.find(text='Raw Material Production:').parent.next_sibling.next_sibling.contents[0].string
  379.     data['alignment'] = soup.find(text='Official Alignment:').parent.next_sibling.next_sibling.contents[0].string
  380.     data['region'] = soup.find(text='Region:').parent.next_sibling.next_sibling.contents[0].string
  381.     data['reputation'] = soup.find(text='Reputation:').parent.next_sibling.next_sibling.contents[0].string
  382.     try:
  383.         data['troops'] = int(soup.find(text='Army Size:').parent.next_sibling.next_sibling.contents[0].string[:-18])
  384.     except:
  385.         print 'tr' + soup.find(text='Army Size:').parent.next_sibling.next_sibling.contents[0].string
  386.     data['manpower'] = soup.find(text='Manpower:').parent.next_sibling.next_sibling.contents[0].string
  387.     data['equipment'] = soup.find(text='Equipment:').parent.next_sibling.next_sibling.contents[0].string
  388.     data['training'] = soup.find(text='Training:').parent.next_sibling.next_sibling.contents[0].string
  389.     data['airforce'] = soup.find(text='Airforce:').parent.next_sibling.next_sibling.contents[0].string
  390.     if soup.find(text='Wars:').parent.next_sibling.next_sibling.contents[0].string == 'At peace.':
  391.         data['wars'] = 'peace'
  392.     else:
  393.         data['wars'] = 'war'
  394.     if soup.find(text='Uranium:') == None:
  395.         data['uranium'] = 0
  396.     else:
  397.         data['uranium'] = int(soup.find(text='Uranium:').parent.next_sibling.next_sibling.contents[0].string[:-5])
  398.     return data
  399.  
  400. def process(data):
  401.     generaldata = []
  402.     troopdata = []
  403.     for alliance in data:
  404.         datad = {}
  405.         troopd = {}
  406.         gdp = growth = troops = factories = territory = rmprod = oilprod = oilres = uranium = inactive = 0
  407.         for nation in alliance:
  408.             gdp += nation['gdp']
  409.             growth += nation['growth']
  410.             troops += nation['troops']
  411.             factories += nation['factories']
  412.             territory += nation['territory']
  413.             rmprod += nation['rmprod']
  414.             oilprod += nation['oilprod']
  415.             oilres += nation['oilres']
  416.             uranium += nation['uranium']
  417.             inactive += nation['online']
  418.  
  419.         datad['size'] = len(alliance)
  420.         datad['gdp'] = gdp
  421.         datad['avggdp'] = round(gdp/float(len(alliance)), 1)
  422.         datad['growth'] = growth
  423.         datad['avggrowth'] = round(growth/float(len(alliance)), 1)
  424.         datad['factories'] = factories
  425.         datad['avgfactories'] = round(factories/float(len(alliance)), 1)
  426.         datad['territory'] = territory
  427.         datad['avgterritory'] = round(territory/float(len(alliance)), 1)
  428.         datad['rmprod'] = rmprod
  429.         datad['avgrmprod'] = round(rmprod/float(len(alliance)), 1)
  430.         datad['oilprod'] = oilprod
  431.         datad['avgoilprod'] = round(oilprod/float(len(alliance)), 1)
  432.         datad['oilres'] = oilres
  433.         datad['avgoilres'] = round(oilres/float(len(alliance)), 1)
  434.         datad['inactive'] = inactive
  435.         datad['avginactive'] = round(inactive/float(len(alliance)), 1)
  436.         datad['uranium'] = uranium
  437.  
  438.         datad['advanced'], datad['persian'], datad['almost'], datad['vietnam'], datad['korean'], datad['second'], \
  439.             datad['first'], datad['finest'], datad['stone'] = techlevels(alliance)
  440.  
  441.         datad['vpowerful'], datad['powerful'], datad['large'], datad['somelarge'], datad['mediocre'], datad['meagre'], \
  442.             datad['small'], datad['noair'] = airforcelevels(alliance)
  443.  
  444.         datad['elite'], datad['good'], datad['standard'], datad['poortr'], datad['rabble'] = traininglevels(alliance)
  445.  
  446.         datad['mam'], datad['car'], datad['gra'], datad['ama'], datad['sco'], datad['saf'], datad['con'], datad['eaf'], \
  447.             datad['gui'], datad['waf'], datad['atl'], datad['egy'], datad['ara'], datad['mpo'], datad['per'], datad['sub'], \
  448.             datad['chi'], datad['ind'], datad['ein'], datad['pac'] = regionlevels(alliance)
  449.  
  450.         datad['untapped'], datad['plentiful'], datad['halved'], datad['low'], datad['neardep'], datad['depleted'] = manpowerlevels(alliance)
  451.  
  452.         datad['waag'], datad['adored'], datad['loved'], datad['liked'], datad['decent'], datad['middling'], datad['disliked'], \
  453.             datad['hated'], datad['despised'], datad['eop'] = approvallevels(alliance)
  454.  
  455.         datad['libdem'], datad['authdem'], datad['opr'], datad['junta'], datad['dictat'] = polsystemlevels(alliance)
  456.  
  457.         datad['unsink'], datad['entren'], datad['vstable'], datad['quiet'], datad['calm'], datad['tensions'], datad['chaotic'], \
  458.             datad['rioting'], datad['protests'], datad['collapse'] = stabilitylevels(alliance)
  459.  
  460.         datad['norebels'], datad['terror'], datad['guerrilla'], datad['rebellion'], datad['civil'] = rebelslevels(alliance)
  461.  
  462.         datad['free'], datad['mixed'], datad['command'] = econsystemlevels(alliance)
  463.  
  464.         datad['developed'], datad['good'], datad['decent'], datad['above'], datad['average'], datad['poorqol'], datad['impov'], \
  465.             datad['desp'], datad['disast'], datad['crisis'] = qollevels(alliance)
  466.  
  467.         datad['west'], datad['non'], datad['east'] = alignlevels(alliance)
  468.  
  469.         datad['gandhi'], datad['angelic'], datad['nice'], datad['good'], datad['normal'], datad['quest'], datad['isolated'], \
  470.             datad['pariah'], datad['maddog'], datad['aoe'] = replevels(alliance)
  471.  
  472.         troopd['troops'] = troops
  473.         troopd['avgtroops'] = round(troops/float(len(alliance)), 1)
  474.  
  475.         troopd['mam'], troopd['car'], troopd['gra'], troopd['ama'], troopd['sco'], troopd['saf'], troopd['con'], troopd['eaf'], \
  476.             troopd['gui'], troopd['waf'], troopd['atl'], troopd['egy'], troopd['ara'], troopd['mpo'], troopd['per'], troopd['sub'], \
  477.             troopd['chi'], troopd['ind'], troopd['ein'], troopd['pac'] = regiontroops(alliance)
  478.  
  479.         generaldata.append(datad)
  480.         troopdata.append(troopd)
  481.  
  482.     return generaldata, troopdata, uraniumlist
  483.  
  484. def difference(newdata, newtroopdata, prevdata, prevtroopdata):
  485.     datad = {}
  486.     troopd = {}
  487.  
  488.     datad['size'] = newdata['size'] - prevdata['size']
  489.     datad['gdp'] = newdata['gdp'] - prevdata['gdp']
  490.     datad['avggdp'] = newdata['avggdp'] - prevdata['avggdp']
  491.     datad['growth'] = newdata['growth'] - prevdata['growth']
  492.     datad['avggrowth'] = newdata['avggrowth'] - prevdata['avggrowth']
  493.     datad['factories'] = newdata['factories'] - prevdata['factories']
  494.     datad['avgfactories'] = newdata['avgfactories'] - prevdata['avgfactories']
  495.     datad['territory'] = newdata['territory'] - prevdata['territory']
  496.     datad['avgterritory'] = newdata['avgterritory'] - prevdata['avgterritory']
  497.     datad['rmprod'] = newdata['rmprod'] - prevdata['rmprod']
  498.     datad['avgrmprod'] = newdata['avgrmprod'] - prevdata['avgrmprod']
  499.     datad['oilprod'] = newdata['oilprod'] - prevdata['oilprod']
  500.     datad['avgoilprod'] = newdata['avgoilprod'] - prevdata['avgoilprod']
  501.     datad['oilres'] = newdata['oilres'] - prevdata['oilres']
  502.     datad['avgoilres'] = newdata['avgoilres'] - prevdata['avgoilres']
  503.     datad['inactive'] = newdata['inactive'] - prevdata['inactive']
  504.     datad['avginactive'] = newdata['avginactive'] - prevdata['avginactive']
  505.     datad['uranium'] = newdata['uranium'] - prevdata['uranium']
  506.  
  507.     datad['advanced'] = newdata['advanced'] - prevdata['advanced']
  508.     datad['persian'] = newdata['persian'] - prevdata['persian']
  509.     datad['almost'] = newdata['almost'] - prevdata['almost']
  510.     datad['vietnam'] = newdata['vietnam'] - prevdata['vietnam']
  511.     datad['korean'] = newdata['korean'] - prevdata['korean']
  512.     datad['second'] = newdata['second'] - prevdata['second']
  513.     datad['first'] = newdata['first'] - prevdata['first']
  514.     datad['finest'] = newdata['finest'] - prevdata['finest']
  515.     datad['stone'] = newdata['stone'] - prevdata['stone']
  516.  
  517.     datad['vpowerful'] = newdata['vpowerful'] - prevdata['vpowerful']
  518.     datad['powerful'] = newdata['powerful'] - prevdata['powerful']
  519.     datad['large'] = newdata['large'] - prevdata['large']
  520.     datad['somelarge'] = newdata['somelarge'] - prevdata['somelarge']
  521.     datad['mediocre'] = newdata['mediocre'] - prevdata['mediocre']
  522.     datad['meagre'] = newdata['meagre'] - prevdata['meagre']
  523.     datad['small'] = newdata['small'] - prevdata['small']
  524.     datad['noair'] = newdata['noair'] - prevdata['noair']
  525.  
  526.     datad['elite'] = newdata['elite'] - prevdata['elite']
  527.     datad['good'] = newdata['good'] - prevdata['good']
  528.     datad['standard'] = newdata['standard'] - prevdata['standard']
  529.     datad['poortr'] = newdata['poortr'] - prevdata['poortr']
  530.     datad['rabble'] = newdata['rabble'] - prevdata['rabble']
  531.  
  532.     datad['mam'] = newdata['mam'] - prevdata['mam']
  533.     datad['car'] = newdata['car'] - prevdata['car']
  534.     datad['gra'] = newdata['gra'] - prevdata['gra']
  535.     datad['ama'] = newdata['ama'] - prevdata['ama']
  536.     datad['sco'] = newdata['sco'] - prevdata['sco']
  537.     datad['saf'] = newdata['saf'] - prevdata['saf']
  538.     datad['con'] = newdata['con'] - prevdata['con']
  539.     datad['eaf'] = newdata['eaf'] - prevdata['eaf']
  540.     datad['gui'] = newdata['gui'] - prevdata['gui']
  541.     datad['waf'] = newdata['waf'] - prevdata['waf']
  542.     datad['atl'] = newdata['atl'] - prevdata['atl']
  543.     datad['egy'] = newdata['egy'] - prevdata['egy']
  544.     datad['ara'] = newdata['ara'] - prevdata['ara']
  545.     datad['mpo'] = newdata['mpo'] - prevdata['mpo']
  546.     datad['per'] = newdata['per'] - prevdata['per']
  547.     datad['sub'] = newdata['sub'] - prevdata['sub']
  548.     datad['chi'] = newdata['chi'] - prevdata['chi']
  549.     datad['ind'] = newdata['ind'] - prevdata['ind']
  550.     datad['ein'] = newdata['ein'] - prevdata['ein']
  551.     datad['pac'] = newdata['pac'] - prevdata['pac']
  552.  
  553.     datad['untapped'] = newdata['untapped'] - prevdata['untapped']
  554.     datad['plentiful'] = newdata['plentiful'] - prevdata['plentiful']
  555.     datad['halved'] = newdata['halved'] - prevdata['halved']
  556.     datad['low'] = newdata['low'] - prevdata['low']
  557.     datad['neardep'] = newdata['neardep'] - prevdata['neardep']
  558.     datad['depleted'] = newdata['depleted'] - prevdata['depleted']
  559.  
  560.     datad['waag'] = newdata['waag'] - prevdata['waag']
  561.     datad['adored'] = newdata['adored'] - prevdata['adored']
  562.     datad['loved'] = newdata['loved'] - prevdata['loved']
  563.     datad['liked'] = newdata['liked'] - prevdata['liked']
  564.     datad['decent'] = newdata['decent'] - prevdata['decent']
  565.     datad['middling'] = newdata['middling'] - prevdata['middling']
  566.     datad['disliked'] = newdata['disliked'] - prevdata['disliked']
  567.     datad['hated'] = newdata['hated'] - prevdata['hated']
  568.     datad['despised'] = newdata['despised'] - prevdata['despised']
  569.     datad['eop'] = newdata['eop'] - prevdata['eop']
  570.  
  571.     datad['libdem'] = newdata['libdem'] - prevdata['libdem']
  572.     datad['authdem'] = newdata['authdem'] - prevdata['authdem']
  573.     datad['opr'] = newdata['opr'] - prevdata['opr']
  574.     datad['junta'] = newdata['junta'] - prevdata['junta']
  575.     datad['dictat'] = newdata['dictat'] - prevdata['dictat']
  576.  
  577.     datad['unsink'] = newdata['unsink'] - prevdata['unsink']
  578.     datad['entren'] = newdata['entren'] - prevdata['entren']
  579.     datad['vstable'] = newdata['vstable'] - prevdata['vstable']
  580.     datad['quiet'] = newdata['quiet'] - prevdata['quiet']
  581.     datad['calm'] = newdata['calm'] - prevdata['calm']
  582.     datad['tensions'] = newdata['tensions'] - prevdata['tensions']
  583.     datad['chaotic'] = newdata['chaotic'] - prevdata['chaotic']
  584.     datad['rioting'] = newdata['rioting'] - prevdata['rioting']
  585.     datad['protests'] = newdata['protests'] - prevdata['protests']
  586.     datad['collapse'] = newdata['collapse'] - prevdata['collapse']
  587.  
  588.     datad['norebels'] = newdata['norebels'] - prevdata['norebels']
  589.     datad['terror'] = newdata['terror'] - prevdata['terror']
  590.     datad['guerrilla'] = newdata['guerrilla'] - prevdata['guerrilla']
  591.     datad['rebellion'] = newdata['rebellion'] - prevdata['rebellion']
  592.     datad['civil'] = newdata['civil'] - prevdata['civil']
  593.  
  594.     datad['free'] = newdata['free'] - prevdata['free']
  595.     datad['mixed'] = newdata['mixed'] - prevdata['mixed']
  596.     datad['command'] = newdata['command'] - prevdata['command']
  597.  
  598.     datad['developed'] = newdata['developed'] - prevdata['developed']
  599.     datad['good'] = newdata['good'] - prevdata['good']
  600.     datad['decent'] = newdata['decent'] - prevdata['decent']
  601.     datad['above'] = newdata['above'] - prevdata['above']
  602.     datad['average'] = newdata['average'] - prevdata['average']
  603.     datad['poorqol'] = newdata['poorqol'] - prevdata['poorqol']
  604.     datad['impov'] = newdata['impov'] - prevdata['impov']
  605.     datad['desp'] = newdata['desp'] - prevdata['desp']
  606.     datad['disast'] = newdata['disast'] - prevdata['disast']
  607.     datad['crisis'] = newdata['crisis'] - prevdata['crisis']
  608.  
  609.     datad['west'] = newdata['west'] - prevdata['west']
  610.     datad['non'] = newdata['non'] - prevdata['non']
  611.     datad['east'] = newdata['east'] - prevdata['east']
  612.  
  613.     datad['gandhi'] = newdata['gandhi'] - prevdata['gandhi']
  614.     datad['angelic'] = newdata['angelic'] - prevdata['angelic']
  615.     datad['nice'] = newdata['nice'] - prevdata['nice']
  616.     datad['good'] = newdata['good'] - prevdata['good']
  617.     datad['normal'] = newdata['normal'] - prevdata['normal']
  618.     datad['quest'] = newdata['quest'] - prevdata['quest']
  619.     datad['isolated'] = newdata['isolated'] - prevdata['isolated']
  620.     datad['pariah'] = newdata['pariah'] - prevdata['pariah']
  621.     datad['maddog'] = newdata['maddog'] - prevdata['maddog']
  622.     datad['aoe'] = newdata['aoe'] - prevdata['aoe']
  623.  
  624.     troopd['troops'] = newtroopdata['troops'] - prevtroopdata['troops']
  625.     troopd['avgtroops'] = newtroopdata['avgtroops'] - prevtroopdata['avgtroops']
  626.  
  627.     troopd['mam'] = newtroopdata['mam'] - prevtroopdata['mam']
  628.     troopd['car'] = newtroopdata['car'] - prevtroopdata['car']
  629.     troopd['gra'] = newtroopdata['gra'] - prevtroopdata['gra']
  630.     troopd['ama'] = newtroopdata['ama'] - prevtroopdata['ama']
  631.     troopd['sco'] = newtroopdata['sco'] - prevtroopdata['sco']
  632.     troopd['saf'] = newtroopdata['saf'] - prevtroopdata['saf']
  633.     troopd['con'] = newtroopdata['con'] - prevtroopdata['con']
  634.     troopd['eaf'] = newtroopdata['eaf'] - prevtroopdata['eaf']
  635.     troopd['gui'] = newtroopdata['gui'] - prevtroopdata['gui']
  636.     troopd['waf'] = newtroopdata['waf'] - prevtroopdata['waf']
  637.     troopd['atl'] = newtroopdata['atl'] - prevtroopdata['atl']
  638.     troopd['egy'] = newtroopdata['egy'] - prevtroopdata['egy']
  639.     troopd['ara'] = newtroopdata['ara'] - prevtroopdata['ara']
  640.     troopd['mpo'] = newtroopdata['mpo'] - prevtroopdata['mpo']
  641.     troopd['per'] = newtroopdata['per'] - prevtroopdata['per']
  642.     troopd['sub'] = newtroopdata['sub'] - prevtroopdata['sub']
  643.     troopd['chi'] = newtroopdata['chi'] - prevtroopdata['chi']
  644.     troopd['ind'] = newtroopdata['ind'] - prevtroopdata['ind']
  645.     troopd['ein'] = newtroopdata['ein'] - prevtroopdata['ein']
  646.     troopd['pac'] = newtroopdata['pac'] - prevtroopdata['pac']
  647.  
  648.     return datad, troopd
  649.  
  650. print "\nLogging in..."
  651. while True:
  652.     try:
  653.         loginresponse = br.open('http://blocgame.com')
  654.     except:
  655.         print "Timeout, requesting again."
  656.     else:
  657.         break
  658. br.form = list(br.forms())[0]
  659. br["username"] = 'username'
  660. br["password"] = 'password'
  661. response = br.submit()
  662. # print BS(response.read())
  663. print "Done."
  664.  
  665. alliancelinks = []
  666. print "\nGetting alliance urls..."
  667. for i in range(1,3):
  668.     soup = getsoup('http://blocgame.com/alliancerankings.php?page=%s' % i)
  669.     # print soup.prettify()
  670.     for link in soup.find_all('a'):
  671.         text = str(link.get('href'))
  672.         if 'alliancestats.php?allianceid=' in text and '=0' not in text:
  673.             alliancelinks.append(link.get('href'))
  674. print "Done."
  675.  
  676. j = 1
  677. names = []
  678. data = []
  679. uraniumlist = []
  680. for i in alliancelinks:
  681.     print "\nGathering data on alliance %s of %s..." % (j, len(alliancelinks))
  682.     alliance = []
  683.     nations = []
  684.  
  685.     soup = getsoup('http://blocgame.com/%s' % i)
  686.     names.append(soup.find('h1').string)
  687.  
  688.     print '  Gathering nation links...'
  689.  
  690.     for link in soup.find_all('a'):
  691.         if 'stats.php?id=' in str(link.get('href')):
  692.             nations.append(link.get('href'))
  693.  
  694.     print '  %s nations found.' % str(len(nations))
  695.  
  696.     k = 1
  697.     for i in nations:
  698.         soup = getsoup('http://blocgame.com/%s' % i)
  699.         nationdata = getdata(soup)
  700.         nationdata['id'] = i[13:]
  701.         if nationdata['uranium'] > 0:
  702.             uraniumlist.append({'name':nationdata['name'], 'id':nationdata['id'], 'uranium':nationdata['uranium']})
  703.         alliance.append(nationdata)
  704.         print '  %s of %s' % (str(k), str(len(nations)))
  705.         k += 1
  706.  
  707.     data.append(alliance)
  708.     j += 1
  709.     print "Done."
  710.  
  711. uraniumlist.sort(key=itemgetter('uranium'), reverse=True)
  712.  
  713. from info import prevnow, prevdata, prevnames
  714.  
  715. now = datetime.datetime.utcnow()
  716. with open('info.py', 'w') as f:
  717.     f.write("import datetime\n")
  718.     f.write("prevnow = %s\n" % repr(now))
  719.     f.write("prevnames = %s\n" % repr(names))
  720.     f.write("prevdata = %s" % repr(data))
  721.  
  722. generaldata, troopdata = process(data)
  723.  
  724. prevgeneraldata, prevtroopdata, prevuraniumlist = process(prevdata)
  725.  
  726. diffnames = []
  727. diffgeneraldata = []
  728. difftroopdata = []
  729. for alliance in names:
  730.     if alliance in prevnames:
  731.         diffnames.append(alliance)
  732.         newindex = names.index(alliance)
  733.         oldindex = prevnames.index(alliance)
  734.         diffgend, difftroopd = difference(generaldata[newindex], troopdata[newindex], prevgeneraldata[oldindex], prevtroopdata[oldindex])
  735.         diffgeneraldata.append(diffgend)
  736.         difftroopdata.append(difftroopd)
  737.  
  738. ########################################################
  739.  
  740. print "\nOutputting PDF..."
  741.  
  742. from reportlab.lib.styles import ParagraphStyle as PS
  743. from reportlab.platypus import PageBreak, Image, Table, TableStyle, Spacer
  744. from reportlab.platypus.paragraph import Paragraph
  745. from reportlab.platypus.doctemplate import PageTemplate, BaseDocTemplate
  746. from reportlab.platypus.tableofcontents import TableOfContents
  747. from reportlab.platypus.frames import Frame
  748. from reportlab.lib.units import cm
  749. from reportlab.lib.pagesizes import A4
  750. from reportlab.lib import colors
  751. import numpy as np
  752. import matplotlib
  753. matplotlib.use("Agg")
  754. import matplotlib.pyplot as plt
  755.  
  756. regions = ['Mesoamerica','Caribbean','Gran Colombia','Amazonia','Southern Cone','Southern Africa','Congo','East Africa','Guinea',
  757.     'West Africa','Atlas','Egypt','Arabia','Mesopotamia','Persia','The Subcontinent','China','Indochina','East Indies','Pacific Rim']
  758.  
  759. alignments = ['West', 'Neutral', 'East']
  760.  
  761. polsystems = ['Liberal Democracy','Authoritarian Democracy','One Party Rule','Military Junta','Dictatorship']
  762.  
  763. econsystems = ['Free Market','Mixed Economy','Central Planning']
  764.  
  765. approvallevels = ['Worshiped as a God','Adored','Loved','Liked','Decent','Middling','Disliked','Hated','Despised','Enemy of the People']
  766.  
  767. stabilitylevels = ['Unsinkable','Entrenched','Very Stable','Quiet','Calm','Growing Tensions','Chaotic','Rioting','Mass Protests','Brink of Collapse']
  768.  
  769. rebellevels = ['None','Scattered Terrorists','Guerrillas','Open Rebellion','Civil War']
  770.  
  771. qollevels = ['Developed','Good','Decent','Above Average','Average','Poor','Impoverished','Desperate','Disastrous','Humanitarian Crisis']
  772.  
  773. reputationlevels = ['Gandhi-Like','Angelic','Nice','Good','Normal','Questionable','Isolated','Pariah','Mad Dog','Axis of Evil']
  774.  
  775. techlevels = ['Advanced','Persian','Almost Modern','Vietnam','Korean','World War II','World War I','19th Century','Stone Age']
  776.  
  777. airforcelevels = ['Very Powerful','Powerful','Large','Somewhat Large','Mediocre','Meagre','Small','None']
  778.  
  779. traininglevels = ['Elite','Good','Standard','Poor','Rabble']
  780.  
  781. manpowerlevels = ['Untapped','Plentiful','Halved','Low','Near Depletion','Depleted']
  782.  
  783.  
  784. class MyDocTemplate(BaseDocTemplate):
  785.     def __init__(self, filename, **kw):
  786.         self.allowSplitting = 0
  787.         apply(BaseDocTemplate.__init__, (self, filename), kw)
  788.         template = PageTemplate('normal', [Frame(1.5*cm, 1.5*cm, 18*cm, 26.7*cm, id='F1')])
  789.         self.addPageTemplates(template)
  790.  
  791.     def afterFlowable(self, flowable):
  792.         "Registers TOC entries."
  793.         if flowable.__class__.__name__ == 'Paragraph':
  794.             text = flowable.getPlainText()
  795.             style = flowable.style.name
  796.             if style == 'Heading1':
  797.                 level = 0
  798.             elif style == 'Heading2':
  799.                 level = 1
  800.             else:
  801.                 return
  802.             E = [level, text, self.page]
  803.             #if we have a bookmark name append that to our notify data
  804.             bn = getattr(flowable,'_bookmarkName',None)
  805.             if bn is not None: E.append(bn)
  806.             self.notify('TOCEntry', tuple(E))
  807.  
  808. def doHeading(text,sty):
  809.     from hashlib import sha1
  810.     bn=sha1(text+sty.name).hexdigest()
  811.     h=Paragraph(text+'<a name="%s"/>' % bn,sty)
  812.     h._bookmarkName=bn
  813.     story.append(h)
  814.  
  815. def maketable(tdata):
  816.     t = Table(tdata)
  817.     t.setStyle(TableStyle([('ALIGN',(0,0),(-1,-1),'LEFT'),('VALIGN',(0,0),(-1,-1),'MIDDLE'),
  818.         ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),('BOX', (0,0), (-1,-1), 0.25, colors.black)]))
  819.     story.append(t)
  820.     story.append(Spacer(cm, 1*cm))
  821.  
  822. def tableonly(name, categories, data):
  823.     for index, value in enumerate(data):
  824.         if value > 0:
  825.             data[index] = Paragraph('<font color="green">+%s</font>' % value, PS('body'))
  826.         elif value < 0:
  827.             data[index] = Paragraph('<font color="red">%s</font>' % value, PS('body'))
  828.     tdata = [(name, 'Difference')] + [(categories[i], data[i]) for i in range(len(categories))]
  829.     maketable(tdata)
  830.  
  831. def graphanddata(xdata, ydata, ylabel, no):
  832.     N = len(xdata)
  833.     means = ydata
  834.  
  835.     ind = np.arange(N)  # the x locations for the groups
  836.     width = 0.75      # the width of the bars
  837.  
  838.     fig = plt.figure(figsize=(5,4))
  839.     plt.subplots_adjust(bottom=0.25)
  840.     ax = fig.add_subplot(111)
  841.     rects = ax.bar(ind, means, width, color='r')
  842.  
  843.     ax.set_ylabel(ylabel)
  844.     ax.grid(b=True, which='major', axis='y', zorder=3)
  845.     ax.set_xticks(ind+0.40)
  846.     ax.set_axisbelow(True)
  847.     ax.set_xlim(left=-0.25)
  848.     ax.set_xticklabels(xdata, fontsize=8, rotation='vertical')
  849.     ax.tick_params(direction='out', top=False, bottom=False, right=False)
  850.  
  851.     plt.savefig('foo%s.png' % no, bbox_inches='tight')
  852.     plt.close()
  853.     f = open('foo%s.png' % no, 'rb')
  854.     story.append(Image(f))
  855.  
  856.     if len(xdata) <= 10:
  857.         tdata = [(xdata[i], ydata[i]) for i in range(len(xdata))]
  858.     else:
  859.         tdata = [(xdata[i], ydata[i], xdata[i+10], ydata[i+10]) for i in range(10)]
  860.  
  861.     maketable(tdata)
  862.  
  863.     story.append(PageBreak())
  864.  
  865. title = PS(name='title', fontSize=50, leading=16, alignment=1, spaceAfter=20)
  866. smallertitle = PS(name='smallertitle', fontSize=30, leading=16, alignment=1, spaceAfter=20)
  867. h1 = PS(name='Heading1', fontSize=25, leading=15, spaceAfter=30)
  868. h2 = PS(name='Heading2', fontSize=16, leading=8, spaceAfter=20)
  869. h3 = PS(name='Heading3', fontSize=14, leading=8, spaceAfter=20)
  870. tagline = PS(name='tagline', fontSize=20, leading=14, alignment=1)
  871.  
  872. story = []
  873.  
  874. toc = TableOfContents()
  875. toc.levelStyles = [
  876.     PS(fontName='Times-Bold', fontSize=15, name='TOCHeading1', leftIndent=20, firstLineIndent=-20, spaceBefore=5, leading=5),
  877.     PS(fontSize=12, name='TOCHeading2', leftIndent=40, firstLineIndent=-20, spaceBefore=3, leading=3),
  878.     PS(fontSize=12, name='TOCHeading3', leftIndent=60, firstLineIndent=-20, spaceBefore=3, leading=3),
  879. ]
  880.  
  881. story.append(Paragraph('<b>>BLOC Dossier</b>', title))
  882. story.append(Spacer(cm, 1*cm))
  883. story.append(Paragraph('Generated on %s' % now.strftime('%d %B, %H:%M:%S'), tagline))
  884. story.append(Spacer(cm, 1.5*cm))
  885. story.append(Image('insert.png', 15*cm, 21*cm))
  886. story.append(PageBreak())
  887.  
  888. story.append(Paragraph('Table of Contents', smallertitle))
  889. story.append(toc)
  890. story.append(PageBreak())
  891.  
  892. print '  Initial done.'
  893.  
  894. doHeading('General Comparisons', h1)
  895.  
  896. doHeading('Alliance Size', h2)
  897. data = [alliance['size'] for alliance in generaldata]
  898. graphanddata(names, data, 'Alliance Size', 1)
  899.  
  900. doHeading('Total GDP', h2)
  901. data = [alliance['gdp'] for alliance in generaldata]
  902. graphanddata(names, data, 'Total GDP ($million)', 2)
  903.  
  904. doHeading('Average GDP', h2)
  905. data = [alliance['avggdp'] for alliance in generaldata]
  906. graphanddata(names, data, 'Average GDP ($million)', 3)
  907.  
  908. doHeading('Total growth', h2)
  909. data = [alliance['growth'] for alliance in generaldata]
  910. graphanddata(names, data, 'Total growth ($million / month)', 4)
  911.  
  912. doHeading('Average growth', h2)
  913. data = [alliance['avggrowth'] for alliance in generaldata]
  914. graphanddata(names, data, 'Average growth ($million / month)', 5)
  915.  
  916. doHeading('Total troops', h2)
  917. data = [alliance['troops'] for alliance in troopdata]
  918. graphanddata(names, data, 'Total troops (k)', 19)
  919.  
  920. doHeading('Average troops', h2)
  921. data = [alliance['avgtroops'] for alliance in troopdata]
  922. graphanddata(names, data, 'Average troops (k)', 20)
  923.  
  924. doHeading('Total Factories', h2)
  925. data = [alliance['factories'] for alliance in generaldata]
  926. graphanddata(names, data, 'Total Factories', 6)
  927.  
  928. doHeading('Average Factories', h2)
  929. data = [alliance['avgfactories'] for alliance in generaldata]
  930. graphanddata(names, data, 'Average Factories', 7)
  931.  
  932. doHeading('Total RM production', h2)
  933. data = [alliance['rmprod'] for alliance in generaldata]
  934. graphanddata(names, data, 'Total RM production (100 Tons / month)', 8)
  935.  
  936. doHeading('Average RM production', h2)
  937. data = [alliance['avgrmprod'] for alliance in generaldata]
  938. graphanddata(names, data, 'Average RM production (100 Tons / month)', 9)
  939.  
  940. doHeading('Total oil production', h2)
  941. data = [alliance['oilprod'] for alliance in generaldata]
  942. graphanddata(names, data, 'Total oil production (Mbbl / month)', 10)
  943.  
  944. doHeading('Average oil production', h2)
  945. data = [alliance['avgoilprod'] for alliance in generaldata]
  946. graphanddata(names, data, 'Average oil production (Mbbl / month)', 11)
  947.  
  948. doHeading('Total oil reserves', h2)
  949. data = [alliance['oilres'] for alliance in generaldata]
  950. graphanddata(names, data, 'Total oil reserves (Mbbl)', 12)
  951.  
  952. doHeading('Average oil reserves', h2)
  953. data = [alliance['avgoilres'] for alliance in generaldata]
  954. graphanddata(names, data, 'Average oil reserves (Mbbl)', 13)
  955.  
  956. doHeading('Total territory', h2)
  957. data = [alliance['territory'] for alliance in generaldata]
  958. graphanddata(names, data, 'Total territory (km^2)', 14)
  959.  
  960. doHeading('Average territory', h2)
  961. data = [alliance['avgterritory'] for alliance in generaldata]
  962. graphanddata(names, data, 'Average territory (km^2)', 15)
  963.  
  964. doHeading('Total time inactive', h2)
  965. data = [alliance['inactive'] for alliance in generaldata]
  966. graphanddata(names, data, 'Total time inactive (hours)', 16)
  967.  
  968. doHeading('Average time inactive', h2)
  969. data = [alliance['avginactive'] for alliance in generaldata]
  970. graphanddata(names, data, 'Average time inactive (hours)', 17)
  971.  
  972. doHeading('Total uranium', h2)
  973. data = [alliance['uranium'] for alliance in generaldata]
  974. graphanddata(names, data, 'Total uranium (Tons)', 18)
  975.  
  976. print '  General comparisons done.'
  977.  
  978. doHeading('Alliance Panels', h1)
  979. for i in range(len(names)):
  980.     doHeading('%s' % names[i], h2)
  981.  
  982.     story.append(Paragraph('Tech Level counts', h3))
  983.     data = [generaldata[i]['advanced'], generaldata[i]['persian'], generaldata[i]['almost'], generaldata[i]['vietnam'], generaldata[i]['korean'],
  984.         generaldata[i]['second'], generaldata[i]['first'], generaldata[i]['finest'], generaldata[i]['stone']]
  985.     graphanddata(techlevels, data, 'No. of nations', 30+14*i)
  986.  
  987.     story.append(Paragraph('Training Level counts', h3))
  988.     data = [generaldata[i]['elite'], generaldata[i]['good'], generaldata[i]['standard'], generaldata[i]['poortr'], generaldata[i]['rabble']]
  989.     graphanddata(traininglevels, data, 'No. of nations', 32+14*i)
  990.  
  991.     story.append(Paragraph('Airforce Level counts', h3))
  992.     data = [generaldata[i]['vpowerful'], generaldata[i]['powerful'], generaldata[i]['large'], generaldata[i]['somelarge'],
  993.         generaldata[i]['mediocre'], generaldata[i]['meagre'], generaldata[i]['small'], generaldata[i]['noair']]
  994.     graphanddata(airforcelevels, data, 'No. of nations', 31+14*i)
  995.  
  996.     story.append(Paragraph('Manpower Level counts', h3))
  997.     data = [generaldata[i]['untapped'], generaldata[i]['plentiful'], generaldata[i]['halved'], generaldata[i]['low'],
  998.         generaldata[i]['neardep'], generaldata[i]['depleted']]
  999.     graphanddata(manpowerlevels, data, 'No. of nations', 33+14*i)
  1000.  
  1001.     story.append(Paragraph('Region counts', h3))
  1002.     data = [generaldata[i]['mam'], generaldata[i]['car'], generaldata[i]['gra'], generaldata[i]['ama'], generaldata[i]['sco'],
  1003.         generaldata[i]['saf'], generaldata[i]['con'], generaldata[i]['eaf'], generaldata[i]['gui'], generaldata[i]['waf'],
  1004.         generaldata[i]['atl'], generaldata[i]['egy'], generaldata[i]['ara'], generaldata[i]['mpo'], generaldata[i]['per'],
  1005.         generaldata[i]['sub'], generaldata[i]['chi'], generaldata[i]['ind'], generaldata[i]['ein'], generaldata[i]['pac']]
  1006.     graphanddata(regions, data, 'No. of nations', 21+14*i)
  1007.  
  1008.     story.append(Paragraph('Region troop counts', h3))
  1009.     data = [troopdata[i]['mam'], troopdata[i]['car'], troopdata[i]['gra'], troopdata[i]['ama'], troopdata[i]['sco'],
  1010.         troopdata[i]['saf'], troopdata[i]['con'], troopdata[i]['eaf'], troopdata[i]['gui'], troopdata[i]['waf'],
  1011.         troopdata[i]['atl'], troopdata[i]['egy'], troopdata[i]['ara'], troopdata[i]['mpo'], troopdata[i]['per'],
  1012.         troopdata[i]['sub'], troopdata[i]['chi'], troopdata[i]['ind'], troopdata[i]['ein'], troopdata[i]['pac']]
  1013.     graphanddata(regions, data, 'Troops (k)', 34+14*i)
  1014.  
  1015.     story.append(Paragraph('Alignment counts', h3))
  1016.     data = [generaldata[i]['west'], generaldata[i]['non'], generaldata[i]['east']]
  1017.     graphanddata(alignments, data, 'No. of nations', 22+14*i)
  1018.  
  1019.     story.append(Paragraph('Political System counts', h3))
  1020.     data = [generaldata[i]['libdem'], generaldata[i]['authdem'], generaldata[i]['opr'], generaldata[i]['junta'], generaldata[i]['dictat']]
  1021.     graphanddata(polsystems, data, 'No. of nations', 23+14*i)
  1022.  
  1023.     story.append(Paragraph('Economic System counts', h3))
  1024.     data = [generaldata[i]['free'], generaldata[i]['mixed'], generaldata[i]['command']]
  1025.     graphanddata(econsystems, data, 'No. of nations', 24+14*i)
  1026.  
  1027.     story.append(Paragraph('Approval counts', h3))
  1028.     data = [generaldata[i]['waag'], generaldata[i]['adored'], generaldata[i]['loved'], generaldata[i]['liked'], generaldata[i]['decent'],
  1029.         generaldata[i]['middling'], generaldata[i]['disliked'], generaldata[i]['hated'], generaldata[i]['despised'], generaldata[i]['eop']]
  1030.     graphanddata(approvallevels, data, 'No. of nations', 25+14*i)
  1031.  
  1032.     story.append(Paragraph('Stability counts', h3))
  1033.     data = [generaldata[i]['unsink'], generaldata[i]['entren'], generaldata[i]['vstable'], generaldata[i]['quiet'], generaldata[i]['calm'],
  1034.         generaldata[i]['tensions'], generaldata[i]['chaotic'], generaldata[i]['rioting'], generaldata[i]['protests'], generaldata[i]['collapse']]
  1035.     graphanddata(stabilitylevels, data, 'No. of nations', 26+14*i)
  1036.  
  1037.     story.append(Paragraph('Rebel counts', h3))
  1038.     data = [generaldata[i]['norebels'], generaldata[i]['terror'], generaldata[i]['guerrilla'], generaldata[i]['rebellion'], generaldata[i]['civil']]
  1039.     graphanddata(rebellevels, data, 'No. of nations', 27+14*i)
  1040.  
  1041.     story.append(Paragraph('QoL counts', h3))
  1042.     data = [generaldata[i]['developed'], generaldata[i]['good'], generaldata[i]['decent'], generaldata[i]['above'], generaldata[i]['average'],
  1043.         generaldata[i]['poorqol'], generaldata[i]['impov'], generaldata[i]['desp'], generaldata[i]['disast'], generaldata[i]['crisis']]
  1044.     graphanddata(qollevels, data, 'No. of nations', 28+14*i)
  1045.  
  1046.     story.append(Paragraph('Reputation counts', h3))
  1047.     data = [generaldata[i]['gandhi'], generaldata[i]['angelic'], generaldata[i]['nice'], generaldata[i]['good'], generaldata[i]['normal'],
  1048.         generaldata[i]['quest'], generaldata[i]['isolated'], generaldata[i]['pariah'], generaldata[i]['maddog'], generaldata[i]['aoe']]
  1049.     graphanddata(reputationlevels, data, 'No. of nations', 29+14*i)
  1050.  
  1051.     print '  %s of %s panels done' % (str(i+1), str(len(names)))
  1052.  
  1053. doHeading('Differences (from %s)' % prevnow.strftime('%d %B, %H:%M:%S'), h1)
  1054. doHeading('General Comparisons diff', h1)
  1055.  
  1056. doHeading('Alliance Size diff', h2)
  1057. data = [alliance['size'] for alliance in diffgeneraldata]
  1058. tableonly('Alliance Size', diffnames, data)
  1059.  
  1060. story.append(PageBreak())
  1061.  
  1062. doHeading('Total GDP diff', h2)
  1063. data = [alliance['gdp'] for alliance in diffgeneraldata]
  1064. tableonly('GDP', diffnames, data)
  1065.  
  1066. story.append(PageBreak())
  1067.  
  1068. doHeading('Total growth diff', h2)
  1069. data = [alliance['growth'] for alliance in diffgeneraldata]
  1070. tableonly('Growth', diffnames, data)
  1071.  
  1072. story.append(PageBreak())
  1073.  
  1074. doHeading('Total troops diff', h2)
  1075. data = [alliance['troops'] for alliance in difftroopdata]
  1076. tableonly('Troops', diffnames, data)
  1077.  
  1078. story.append(PageBreak())
  1079.  
  1080. doHeading('Total Factories diff', h2)
  1081. data = [alliance['factories'] for alliance in diffgeneraldata]
  1082. tableonly('Factories', diffnames, data)
  1083.  
  1084. story.append(PageBreak())
  1085.  
  1086. doHeading('Total RM production diff', h2)
  1087. data = [alliance['rmprod'] for alliance in diffgeneraldata]
  1088. tableonly('RM Production', diffnames, data)
  1089.  
  1090. story.append(PageBreak())
  1091.  
  1092. doHeading('Total oil production diff', h2)
  1093. data = [alliance['oilprod'] for alliance in diffgeneraldata]
  1094. tableonly('Oil Production', diffnames, data)
  1095.  
  1096. story.append(PageBreak())
  1097.  
  1098. doHeading('Total oil reserves diff', h2)
  1099. data = [alliance['oilres'] for alliance in diffgeneraldata]
  1100. tableonly('Oil Reserves', diffnames, data)
  1101.  
  1102. story.append(PageBreak())
  1103.  
  1104. doHeading('Total territory diff', h2)
  1105. data = [alliance['territory'] for alliance in diffgeneraldata]
  1106. tableonly('Territory', diffnames, data)
  1107.  
  1108. story.append(PageBreak())
  1109.  
  1110. doHeading('Total time inactive diff', h2)
  1111. data = [alliance['inactive'] for alliance in diffgeneraldata]
  1112. tableonly('Time inactive', diffnames, data)
  1113.  
  1114. story.append(PageBreak())
  1115.  
  1116. print '  General differences done'
  1117.  
  1118. doHeading('Alliance Panels diff', h1)
  1119. for i in range(len(diffnames)):
  1120.     doHeading('%s' % names[i], h2)
  1121.  
  1122.     story.append(Paragraph('Tech Level counts diff', h3))
  1123.     data = [diffgeneraldata[i]['advanced'], diffgeneraldata[i]['persian'], diffgeneraldata[i]['almost'],
  1124.         diffgeneraldata[i]['vietnam'], diffgeneraldata[i]['korean'], diffgeneraldata[i]['second'],
  1125.         diffgeneraldata[i]['first'], diffgeneraldata[i]['finest'], diffgeneraldata[i]['stone']]
  1126.     tableonly('Tech levels', techlevels, data)
  1127.  
  1128.     story.append(Paragraph('Training Level counts diff', h3))
  1129.     data = [diffgeneraldata[i]['elite'], diffgeneraldata[i]['good'], diffgeneraldata[i]['standard'],
  1130.         diffgeneraldata[i]['poortr'], diffgeneraldata[i]['rabble']]
  1131.     tableonly('Training levels', traininglevels, data)
  1132.  
  1133.     story.append(Paragraph('Airforce Level counts diff', h3))
  1134.     data = [diffgeneraldata[i]['vpowerful'], diffgeneraldata[i]['powerful'], diffgeneraldata[i]['large'],
  1135.         diffgeneraldata[i]['somelarge'], diffgeneraldata[i]['mediocre'], diffgeneraldata[i]['meagre'],
  1136.         diffgeneraldata[i]['small'], diffgeneraldata[i]['noair']]
  1137.     tableonly('Airforce levels', airforcelevels, data)
  1138.  
  1139.     story.append(PageBreak())
  1140.  
  1141.     story.append(Paragraph('Manpower Level counts diff', h3))
  1142.     data = [diffgeneraldata[i]['untapped'], diffgeneraldata[i]['plentiful'], diffgeneraldata[i]['halved'],
  1143.         diffgeneraldata[i]['low'], diffgeneraldata[i]['neardep'], diffgeneraldata[i]['depleted']]
  1144.     tableonly('Manpower levels', manpowerlevels, data)
  1145.  
  1146.     story.append(Paragraph('Region counts diff', h3))
  1147.     data = [diffgeneraldata[i]['mam'], diffgeneraldata[i]['car'], diffgeneraldata[i]['gra'], diffgeneraldata[i]['ama'],
  1148.         diffgeneraldata[i]['sco'], diffgeneraldata[i]['saf'], diffgeneraldata[i]['con'], diffgeneraldata[i]['eaf'],
  1149.         diffgeneraldata[i]['gui'], diffgeneraldata[i]['waf'], diffgeneraldata[i]['atl'], diffgeneraldata[i]['egy'],
  1150.         diffgeneraldata[i]['ara'], diffgeneraldata[i]['mpo'], diffgeneraldata[i]['per'], diffgeneraldata[i]['sub'],
  1151.         diffgeneraldata[i]['chi'], diffgeneraldata[i]['ind'], diffgeneraldata[i]['ein'], diffgeneraldata[i]['pac']]
  1152.     tableonly('Region counts', regions, data)
  1153.  
  1154.     story.append(PageBreak())
  1155.  
  1156.     story.append(Paragraph('Region troop counts diff', h3))
  1157.     data = [difftroopdata[i]['mam'], difftroopdata[i]['car'], difftroopdata[i]['gra'], difftroopdata[i]['ama'], difftroopdata[i]['sco'],
  1158.         difftroopdata[i]['saf'], difftroopdata[i]['con'], difftroopdata[i]['eaf'], difftroopdata[i]['gui'], difftroopdata[i]['waf'],
  1159.         difftroopdata[i]['atl'], difftroopdata[i]['egy'], difftroopdata[i]['ara'], difftroopdata[i]['mpo'], difftroopdata[i]['per'],
  1160.         difftroopdata[i]['sub'], difftroopdata[i]['chi'], difftroopdata[i]['ind'], difftroopdata[i]['ein'], difftroopdata[i]['pac']]
  1161.     tableonly('Region troop counts', regions, data)
  1162.  
  1163.     story.append(Paragraph('Alignment counts diff', h3))
  1164.     data = [diffgeneraldata[i]['west'], diffgeneraldata[i]['non'], diffgeneraldata[i]['east']]
  1165.     tableonly('Alignments', alignments, data)
  1166.  
  1167.     story.append(Paragraph('Political System counts diff', h3))
  1168.     data = [diffgeneraldata[i]['libdem'], diffgeneraldata[i]['authdem'], diffgeneraldata[i]['opr'], diffgeneraldata[i]['junta'],
  1169.         diffgeneraldata[i]['dictat']]
  1170.     tableonly('Political systems', polsystems, data)
  1171.  
  1172.     story.append(PageBreak())
  1173.  
  1174.     story.append(Paragraph('Economic System counts diff', h3))
  1175.     data = [diffgeneraldata[i]['free'], diffgeneraldata[i]['mixed'], diffgeneraldata[i]['command']]
  1176.     tableonly('Economic systems', econsystems, data)
  1177.  
  1178.     story.append(Paragraph('Approval counts diff', h3))
  1179.     data = [diffgeneraldata[i]['waag'], diffgeneraldata[i]['adored'], diffgeneraldata[i]['loved'], diffgeneraldata[i]['liked'],
  1180.         diffgeneraldata[i]['decent'], diffgeneraldata[i]['middling'], diffgeneraldata[i]['disliked'], diffgeneraldata[i]['hated'],
  1181.         diffgeneraldata[i]['despised'], diffgeneraldata[i]['eop']]
  1182.     tableonly('Approval levels', approvallevels, data)
  1183.  
  1184.     story.append(Paragraph('Stability counts diff', h3))
  1185.     data = [diffgeneraldata[i]['unsink'], diffgeneraldata[i]['entren'], diffgeneraldata[i]['vstable'], diffgeneraldata[i]['quiet'],
  1186.         diffgeneraldata[i]['calm'], diffgeneraldata[i]['tensions'], diffgeneraldata[i]['chaotic'], diffgeneraldata[i]['rioting'],
  1187.         diffgeneraldata[i]['protests'], diffgeneraldata[i]['collapse']]
  1188.     tableonly('Stability levels', stabilitylevels, data)
  1189.  
  1190.     story.append(PageBreak())
  1191.  
  1192.     story.append(Paragraph('Rebel counts diff', h3))
  1193.     data = [diffgeneraldata[i]['norebels'], diffgeneraldata[i]['terror'], diffgeneraldata[i]['guerrilla'],
  1194.         diffgeneraldata[i]['rebellion'], diffgeneraldata[i]['civil']]
  1195.     tableonly('Rebel levels', rebellevels, data)
  1196.  
  1197.     story.append(Paragraph('QoL counts diff', h3))
  1198.     data = [diffgeneraldata[i]['developed'], diffgeneraldata[i]['good'], diffgeneraldata[i]['decent'], diffgeneraldata[i]['above'],
  1199.         diffgeneraldata[i]['average'], diffgeneraldata[i]['poorqol'], diffgeneraldata[i]['impov'], diffgeneraldata[i]['desp'],
  1200.         diffgeneraldata[i]['disast'], diffgeneraldata[i]['crisis']]
  1201.     tableonly('QoL levels', qollevels, data)
  1202.  
  1203.     story.append(Paragraph('Reputation counts diff', h3))
  1204.     data = [diffgeneraldata[i]['gandhi'], diffgeneraldata[i]['angelic'], diffgeneraldata[i]['nice'], diffgeneraldata[i]['good'],
  1205.         diffgeneraldata[i]['normal'], diffgeneraldata[i]['quest'], diffgeneraldata[i]['isolated'], diffgeneraldata[i]['pariah'],
  1206.         diffgeneraldata[i]['maddog'], diffgeneraldata[i]['aoe']]
  1207.     tableonly('Reputation levels', reputationlevels, data)
  1208.  
  1209.     story.append(PageBreak())
  1210.  
  1211.     print '  %s of %s panel diffs done' % (str(i+1), str(len(names)))
  1212.  
  1213. tdata = [('Nation Name', 'Nation ID', 'Uranium Quantity')] + [(nation['name'], nation['id'], nation['uranium']) for nation in uraniumlist]
  1214. t = Table(tdata)
  1215. t.setStyle(TableStyle([('ALIGN',(0,0),(-1,-1),'LEFT'),('VALIGN',(0,0),(-1,-1),'MIDDLE'),
  1216.     ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),('BOX', (0,0), (-1,-1), 0.25, colors.black)]))
  1217. story.append(t)
  1218.  
  1219. story.append(PageBreak())
  1220.  
  1221. doc = MyDocTemplate('bloc.pdf', pagesize=A4, title='BLOC Dossier', author='heidi')
  1222. doc.multiBuild(story)
  1223.  
  1224. print "Done."
  1225.  
  1226. print "\nCopying to ftp..."
  1227. import shutil
  1228.  
  1229. shutil.move('bloc.pdf', '/home/heidi/ftp/bloc.pdf')
  1230. print "Done."
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement