From a91e0a85e5e16dcc374f95410ffbdee89669905b Mon Sep 17 00:00:00 2001 From: Clinton Weiss Date: Sat, 23 May 2015 00:24:18 +0000 Subject: [PATCH] First commit of new zKillboard repository including changes that use mongodb as the primary database. --- .gitattributes | 1 + .gitignore | 6 + .htaccess | 19 + AGPL.md | 661 ++++++++ CCP.md | 7 + LICENSE.md | 4 + README.md | 113 ++ api.wiki | 107 ++ classes/Account.php | 47 + classes/Api.php | 90 ++ classes/Crest2Api.php | 87 ++ classes/CrestTools.php | 49 + classes/Detail.php | 335 +++++ classes/Disqus.php | 49 + classes/Feed.php | 68 + classes/Fitting.php | 106 ++ classes/Google.php | 38 + classes/Info.php | 744 +++++++++ classes/Killmail.php | 93 ++ classes/Kills.php | 196 +++ classes/Mdb.php | 237 +++ classes/Moderator.php | 29 + classes/MongoFilter.php | 278 ++++ classes/Password.php | 42 + classes/Points.php | 121 ++ classes/Price.php | 166 ++ classes/RandomGenerator.php | 74 + classes/Ranks.php | 62 + classes/Registration.php | 34 + classes/Related.php | 229 +++ classes/Stats.php | 187 +++ classes/StompUtil.php | 67 + classes/Subdomains.php | 59 + classes/Summary.php | 148 ++ classes/Twit.php | 36 + classes/User.php | 172 +++ classes/UserConfig.php | 60 + classes/UserGlobals.php | 38 + classes/Util.php | 577 +++++++ classes/War.php | 56 + classes/XmlWrapper.php | 50 + classes/zKBSession.php | 38 + composer.json | 19 + composer.lock | 776 ++++++++++ cron/.gitignore | 2 + cron/0.apiProducer.php | 101 ++ cron/1.apiConsumer.php | 129 ++ cron/1.stompListen.php | 36 + cron/1.warConsumer.php | 79 + cron/2.crest_fetch.php | 97 ++ cron/3.queueProcess.php | 190 +++ cron/4.queueInfo.php | 163 ++ cron/6.queueStats.php | 162 ++ cron/9.allTimeRanks.php | 96 ++ cron/9.alliances.php | 66 + cron/9.characters.php | 52 + cron/9.corporations.php | 51 + cron/9.eve-kill.php | 19 + cron/9.nameSearch.php | 40 + cron/9.recentStats.php | 154 ++ cron/9.social.php | 84 ++ cron/9.updateGroups.php | 50 + cron/9.warProducer.php | 24 + cron/cacher.php | 57 + cron/cleanup.php | 27 + cron/cron.sh | 16 + cron/everyFifteen.php | 39 + cron/everyMinute.php | 21 + cron/fetchWallet.php | 107 ++ cron/h.report.php | 19 + cron/rotate.sh | 35 + cron/slowreset.php | 17 + cron/watch.sh | 3 + favicon.ico | Bin 0 -> 1150 bytes index.php | 54 + information/about.md | 33 + information/legal.md | 55 + information/payments.md | 22 + information/statistics.md | 32 + init.php | 35 + install/bash_complete_zkillboard | 18 + install/config.new.php | 150 ++ install/cronoverrides | 23 + install/install.php | 304 ++++ install/sde_update/sde_update.php | 20 + install/update.php | 169 +++ robots.txt | 7 + routes.php | 245 +++ themes/404.html | 17 + themes/account.html | 64 + themes/account/api.html | 87 ++ themes/account/campaigns.html | 37 + themes/account/changeemail.html | 14 + themes/account/changepassword.html | 26 + themes/account/components/campaign_team.html | 14 + themes/account/components/entity_list.html | 30 + themes/account/domains.html | 99 ++ themes/account/me.html | 23 + themes/account/payments.html | 35 + themes/account/sessions.html | 29 + themes/account/sitesettings.html | 62 + themes/account/tracker.html | 42 + themes/base.html | 195 +++ themes/campaign.html | 41 + themes/changepassword.html | 36 + themes/comments.html | 8 + themes/components/attackers.html | 22 + themes/components/attackers_list.html | 66 + themes/components/big_top_list.html | 32 + themes/components/corp_list.html | 23 + themes/components/corpstats.html | 35 + themes/components/disqus.html | 12 + themes/components/fitting_wheel.html | 135 ++ themes/components/flag_list.html | 35 + themes/components/history.html | 37 + themes/components/image_alli.html | 6 + themes/components/image_char.html | 12 + themes/components/image_corp.html | 9 + themes/components/image_faction.html | 6 + themes/components/image_item.html | 24 + themes/components/image_region.html | 4 + themes/components/image_ship.html | 16 + themes/components/image_system.html | 4 + themes/components/info_top.html | 120 ++ themes/components/info_top_image.html | 37 + themes/components/intel_table.html | 17 + themes/components/involved_summary.html | 26 + themes/components/item_list.html | 51 + themes/components/kill_list.html | 102 ++ themes/components/market.html | 19 + themes/components/pager.html | 37 + themes/components/pop_item_list.html | 36 + themes/components/rank_table.html | 69 + themes/components/related_list.html | 29 + themes/components/related_summary.html | 20 + themes/components/stacktrace.html | 13 + themes/components/stats_box.html | 72 + themes/components/summary.html | 33 + themes/components/tdfb.html | 48 + themes/components/text_alli.html | 7 + themes/components/text_char.html | 9 + themes/components/text_corp.html | 11 + themes/components/text_faction.html | 7 + themes/components/text_group.html | 2 + themes/components/text_item.html | 12 + themes/components/text_region.html | 5 + themes/components/text_ship.html | 10 + themes/components/text_shipclass.html | 5 + themes/components/text_system.html | 9 + themes/components/title.html | 1 + themes/components/top_killer_list.html | 44 + themes/components/top_list.html | 57 + themes/components/top_pilots.html | 11 + themes/components/victim_info.html | 87 ++ themes/components/war.html | 4 + themes/components/war_table.html | 30 + themes/components/wars_table.html | 26 + themes/css/bootstrap-tagmanager.css | 105 ++ themes/css/bootstrap-wysihtml5.css | 102 ++ themes/css/datepicker.css | 182 +++ themes/css/font-awesome.css | 1338 +++++++++++++++++ themes/css/main.css | 180 +++ themes/css/style-edits/amelia-main.css | 12 + themes/css/style-edits/cerulean-main.css | 12 + themes/css/style-edits/cyborg-main.css | 98 ++ themes/css/style-edits/default-main.css | 36 + themes/css/style-edits/journal-main.css | 12 + themes/css/style-edits/readable-main.css | 12 + themes/css/style-edits/simplex-main.css | 12 + themes/css/style-edits/slate-main.css | 12 + themes/css/style-edits/spacelab-main.css | 52 + themes/css/style-edits/united-main.css | 12 + themes/css/wysiwyg-color.css | 67 + themes/detail.html | 333 ++++ themes/dlogin.html | 60 + themes/error.html | 8 + themes/favicon.ico | Bin 0 -> 1150 bytes themes/footer.html | 13 + themes/forgotpassword.html | 24 + themes/img/3D.png | Bin 0 -> 47742 bytes themes/img/bg_cyborg_blueish.jpg | Bin 0 -> 456436 bytes themes/img/bg_cyborg_blueish.png | Bin 0 -> 2148145 bytes themes/img/bg_cyborg_redish.png | Bin 0 -> 2461290 bytes themes/img/bg_white.jpg | Bin 0 -> 943850 bytes themes/img/disqus_button.png | Bin 0 -> 5120 bytes themes/img/dust514.png | Bin 0 -> 6993 bytes themes/img/eve-question.png | Bin 0 -> 2422 bytes themes/img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes themes/img/glyphicons-halflings.png | Bin 0 -> 12799 bytes themes/img/grey.gif | Bin 0 -> 1201 bytes themes/img/km_external_link.png | Bin 0 -> 63770 bytes themes/img/lazyload.gif | Bin 0 -> 6365 bytes themes/img/panel/0h.png | Bin 0 -> 805 bytes themes/img/panel/0l.png | Bin 0 -> 805 bytes themes/img/panel/0m.png | Bin 0 -> 805 bytes themes/img/panel/0r.png | Bin 0 -> 805 bytes themes/img/panel/0s.png | Bin 0 -> 805 bytes themes/img/panel/1h.png | Bin 0 -> 2590 bytes themes/img/panel/1l.png | Bin 0 -> 1976 bytes themes/img/panel/1m.png | Bin 0 -> 2025 bytes themes/img/panel/1r.png | Bin 0 -> 2512 bytes themes/img/panel/2h.png | Bin 0 -> 3541 bytes themes/img/panel/2l.png | Bin 0 -> 2570 bytes themes/img/panel/2m.png | Bin 0 -> 2766 bytes themes/img/panel/2r.png | Bin 0 -> 3497 bytes themes/img/panel/3h.png | Bin 0 -> 4607 bytes themes/img/panel/3l.png | Bin 0 -> 3523 bytes themes/img/panel/3m.png | Bin 0 -> 3720 bytes themes/img/panel/3r.png | Bin 0 -> 4886 bytes themes/img/panel/4h.png | Bin 0 -> 5309 bytes themes/img/panel/4l.png | Bin 0 -> 4628 bytes themes/img/panel/4m.png | Bin 0 -> 4956 bytes themes/img/panel/5h.png | Bin 0 -> 6109 bytes themes/img/panel/5l.png | Bin 0 -> 5888 bytes themes/img/panel/5m.png | Bin 0 -> 6270 bytes themes/img/panel/5s.png | Bin 0 -> 7399 bytes themes/img/panel/6h.png | Bin 0 -> 7203 bytes themes/img/panel/6l.png | Bin 0 -> 7014 bytes themes/img/panel/6m.png | Bin 0 -> 7439 bytes themes/img/panel/7h.png | Bin 0 -> 8288 bytes themes/img/panel/7l.png | Bin 0 -> 8067 bytes themes/img/panel/7m.png | Bin 0 -> 8580 bytes themes/img/panel/8h.png | Bin 0 -> 9276 bytes themes/img/panel/8l.png | Bin 0 -> 8972 bytes themes/img/panel/8m.png | Bin 0 -> 9541 bytes themes/img/panel/blank.png | Bin 0 -> 195 bytes themes/img/panel/circle.png | Bin 0 -> 16840 bytes themes/img/panel/dustwheel.png | Bin 0 -> 33523 bytes themes/img/panel/error.jpg | Bin 0 -> 785 bytes themes/img/panel/h.png | Bin 0 -> 1480 bytes themes/img/panel/l.png | Bin 0 -> 1480 bytes themes/img/panel/m.png | Bin 0 -> 1480 bytes themes/img/panel/noship.png | Bin 0 -> 8879 bytes themes/img/panel/r.png | Bin 0 -> 1480 bytes themes/img/panel/tyrannis.png | Bin 0 -> 43642 bytes themes/img/panel/tyrannis_blue.png | Bin 0 -> 43560 bytes themes/img/panel/tyrannis_darkred.png | Bin 0 -> 42833 bytes themes/img/panel/tyrannis_default.png | Bin 0 -> 38343 bytes themes/img/panel/tyrannis_revelations.png | Bin 0 -> 42868 bytes themes/img/panel/working.jpg | Bin 0 -> 780 bytes themes/img/region_64.png | Bin 0 -> 7715 bytes themes/img/social/Untitled-1.png | Bin 0 -> 798 bytes themes/img/social/aol.png | Bin 0 -> 654 bytes themes/img/social/apple.png | Bin 0 -> 501 bytes themes/img/social/behance.png | Bin 0 -> 554 bytes themes/img/social/blogger.png | Bin 0 -> 489 bytes themes/img/social/delicious.png | Bin 0 -> 291 bytes themes/img/social/deviant_art.png | Bin 0 -> 546 bytes themes/img/social/digg.png | Bin 0 -> 400 bytes themes/img/social/dribbble.png | Bin 0 -> 751 bytes themes/img/social/email.png | Bin 0 -> 458 bytes themes/img/social/fb_1.png | Bin 0 -> 335 bytes themes/img/social/fb_2.png | Bin 0 -> 529 bytes themes/img/social/flickr.png | Bin 0 -> 436 bytes themes/img/social/forrst.png | Bin 0 -> 476 bytes themes/img/social/friend_feed.png | Bin 0 -> 386 bytes themes/img/social/google.png | Bin 0 -> 579 bytes themes/img/social/google_1.png | Bin 0 -> 568 bytes themes/img/social/google_plus.png | Bin 0 -> 637 bytes themes/img/social/heart.png | Bin 0 -> 462 bytes themes/img/social/lastfm.png | Bin 0 -> 589 bytes themes/img/social/linkedin.png | Bin 0 -> 401 bytes themes/img/social/microsoft.png | Bin 0 -> 604 bytes themes/img/social/netvibes.png | Bin 0 -> 261 bytes themes/img/social/newsvine.png | Bin 0 -> 523 bytes themes/img/social/orkut.png | Bin 0 -> 519 bytes themes/img/social/paypal.png | Bin 0 -> 524 bytes themes/img/social/picasa.png | Bin 0 -> 544 bytes themes/img/social/pinterest.png | Bin 0 -> 633 bytes themes/img/social/reddit.png | Bin 0 -> 705 bytes themes/img/social/rss.png | Bin 0 -> 636 bytes themes/img/social/share_this.png | Bin 0 -> 454 bytes themes/img/social/skype.png | Bin 0 -> 686 bytes themes/img/social/star.png | Bin 0 -> 431 bytes themes/img/social/stumble_upon.png | Bin 0 -> 501 bytes themes/img/social/technorati.png | Bin 0 -> 570 bytes themes/img/social/tumblr.png | Bin 0 -> 404 bytes themes/img/social/twitter_1.png | Bin 0 -> 519 bytes themes/img/social/twitter_2.png | Bin 0 -> 451 bytes themes/img/social/vimeo.png | Bin 0 -> 559 bytes themes/img/social/wp.png | Bin 0 -> 727 bytes themes/img/social/yahoo.png | Bin 0 -> 528 bytes themes/img/social/you_tube.png | Bin 0 -> 619 bytes themes/img/spark1.png | Bin 0 -> 1788 bytes themes/img/squizz_payment_example.png | Bin 0 -> 27670 bytes themes/img/squizz_subdomain_example.png | Bin 0 -> 44808 bytes themes/img/up-arrow.png | Bin 0 -> 1382 bytes themes/img/wreck.png | Bin 0 -> 3021 bytes themes/index.html | 33 + themes/information.html | 9 + themes/information/theme.md | 6 + themes/intel.html | 16 + themes/item.html | 47 + themes/js/bootstrap-datepicker.js | 474 ++++++ themes/js/bootstrap-tagmanager.js | 14 + themes/js/bootstrap-wysihtml5.js | 21 + themes/js/common.js | 99 ++ themes/js/jquery.min.js | 5 + themes/js/rankstablesort.js | 78 + themes/js/sclock1.js | 17 + themes/js/search.js | 81 + themes/js/tablesorter/jquery-latest.js | 154 ++ themes/js/tablesorter/jquery.metadata.js | 122 ++ themes/js/tablesorter/jquery.tablesorter.js | 1031 +++++++++++++ .../js/tablesorter/jquery.tablesorter.min.js | 4 + themes/js/wysihtml5-0.3.0.js | 243 +++ themes/kills.html | 18 + themes/lasthour.html | 20 + themes/livechat.html | 14 + themes/login.html | 51 + themes/logout.html | 8 + themes/merge.html | 46 + themes/moderator/moderator.html | 58 + themes/moderator/reportedkills.html | 50 + themes/moderator/reportedkills_view.html | 58 + themes/moderator/ticket_view.html | 49 + themes/moderator/tickets.html | 54 + themes/navigationbar.html | 169 +++ themes/overview.html | 209 +++ themes/postmail.html | 88 ++ themes/ranks.html | 37 + themes/register.html | 48 + themes/related.html | 99 ++ themes/search.html | 37 + themes/sitemap.html | 26 + themes/tickets.html | 114 ++ themes/tickets_view.html | 69 + themes/tracker.html | 11 + themes/wars.html | 18 + themes/xml/zkbsearch.xml | 8 + themes/zkillboard.php | 15 + twig.php | 161 ++ view/account.php | 284 ++++ view/api.php | 79 + view/apidna.php | 41 + view/apistats.php | 52 + view/autocomplete.php | 57 + view/battle_report.php | 12 + view/brsave.php | 11 + view/campaign.php | 37 + view/campaigns.php | 12 + view/changepassword.php | 48 + view/crestmail.php | 9 + view/detail.php | 254 ++++ view/dlogin.php | 41 + view/error.php | 45 + view/forgotpassword.php | 50 + view/index.php | 71 + view/information.php | 90 ++ view/intel.php | 14 + view/item.php | 35 + view/kills.php | 81 + view/lasthour.php | 28 + view/livechat.php | 3 + view/login.php | 48 + view/logout.php | 19 + view/merge.php | 80 + view/moderator.php | 110 ++ view/overview.php | 262 ++++ view/postmail.php | 89 ++ view/ranks.php | 24 + view/raw.php | 12 + view/register.php | 50 + view/related.php | 57 + view/search.php | 35 + view/sitemap.php | 56 + view/tickets.php | 45 + view/tickets_view.php | 36 + view/top.php | 48 + view/tracker.php | 82 + view/war.php | 48 + view/wars.php | 21 + 372 files changed, 21028 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .htaccess create mode 100644 AGPL.md create mode 100644 CCP.md create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 api.wiki create mode 100644 classes/Account.php create mode 100644 classes/Api.php create mode 100644 classes/Crest2Api.php create mode 100644 classes/CrestTools.php create mode 100644 classes/Detail.php create mode 100644 classes/Disqus.php create mode 100644 classes/Feed.php create mode 100644 classes/Fitting.php create mode 100644 classes/Google.php create mode 100644 classes/Info.php create mode 100644 classes/Killmail.php create mode 100644 classes/Kills.php create mode 100644 classes/Mdb.php create mode 100644 classes/Moderator.php create mode 100644 classes/MongoFilter.php create mode 100644 classes/Password.php create mode 100644 classes/Points.php create mode 100644 classes/Price.php create mode 100644 classes/RandomGenerator.php create mode 100644 classes/Ranks.php create mode 100644 classes/Registration.php create mode 100644 classes/Related.php create mode 100644 classes/Stats.php create mode 100644 classes/StompUtil.php create mode 100644 classes/Subdomains.php create mode 100644 classes/Summary.php create mode 100644 classes/Twit.php create mode 100644 classes/User.php create mode 100644 classes/UserConfig.php create mode 100644 classes/UserGlobals.php create mode 100644 classes/Util.php create mode 100644 classes/War.php create mode 100644 classes/XmlWrapper.php create mode 100644 classes/zKBSession.php create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 cron/.gitignore create mode 100644 cron/0.apiProducer.php create mode 100644 cron/1.apiConsumer.php create mode 100644 cron/1.stompListen.php create mode 100644 cron/1.warConsumer.php create mode 100644 cron/2.crest_fetch.php create mode 100644 cron/3.queueProcess.php create mode 100644 cron/4.queueInfo.php create mode 100644 cron/6.queueStats.php create mode 100644 cron/9.allTimeRanks.php create mode 100644 cron/9.alliances.php create mode 100644 cron/9.characters.php create mode 100644 cron/9.corporations.php create mode 100644 cron/9.eve-kill.php create mode 100644 cron/9.nameSearch.php create mode 100644 cron/9.recentStats.php create mode 100644 cron/9.social.php create mode 100644 cron/9.updateGroups.php create mode 100644 cron/9.warProducer.php create mode 100644 cron/cacher.php create mode 100644 cron/cleanup.php create mode 100755 cron/cron.sh create mode 100644 cron/everyFifteen.php create mode 100644 cron/everyMinute.php create mode 100644 cron/fetchWallet.php create mode 100644 cron/h.report.php create mode 100755 cron/rotate.sh create mode 100644 cron/slowreset.php create mode 100755 cron/watch.sh create mode 100644 favicon.ico create mode 100644 index.php create mode 100644 information/about.md create mode 100644 information/legal.md create mode 100644 information/payments.md create mode 100644 information/statistics.md create mode 100644 init.php create mode 100644 install/bash_complete_zkillboard create mode 100644 install/config.new.php create mode 100644 install/cronoverrides create mode 100644 install/install.php create mode 100644 install/sde_update/sde_update.php create mode 100644 install/update.php create mode 100644 robots.txt create mode 100644 routes.php create mode 100644 themes/404.html create mode 100644 themes/account.html create mode 100644 themes/account/api.html create mode 100644 themes/account/campaigns.html create mode 100644 themes/account/changeemail.html create mode 100644 themes/account/changepassword.html create mode 100644 themes/account/components/campaign_team.html create mode 100644 themes/account/components/entity_list.html create mode 100644 themes/account/domains.html create mode 100644 themes/account/me.html create mode 100644 themes/account/payments.html create mode 100644 themes/account/sessions.html create mode 100644 themes/account/sitesettings.html create mode 100644 themes/account/tracker.html create mode 100644 themes/base.html create mode 100644 themes/campaign.html create mode 100644 themes/changepassword.html create mode 100644 themes/comments.html create mode 100644 themes/components/attackers.html create mode 100644 themes/components/attackers_list.html create mode 100644 themes/components/big_top_list.html create mode 100644 themes/components/corp_list.html create mode 100644 themes/components/corpstats.html create mode 100644 themes/components/disqus.html create mode 100644 themes/components/fitting_wheel.html create mode 100644 themes/components/flag_list.html create mode 100644 themes/components/history.html create mode 100644 themes/components/image_alli.html create mode 100644 themes/components/image_char.html create mode 100644 themes/components/image_corp.html create mode 100644 themes/components/image_faction.html create mode 100644 themes/components/image_item.html create mode 100644 themes/components/image_region.html create mode 100644 themes/components/image_ship.html create mode 100644 themes/components/image_system.html create mode 100644 themes/components/info_top.html create mode 100644 themes/components/info_top_image.html create mode 100644 themes/components/intel_table.html create mode 100644 themes/components/involved_summary.html create mode 100644 themes/components/item_list.html create mode 100644 themes/components/kill_list.html create mode 100644 themes/components/market.html create mode 100644 themes/components/pager.html create mode 100644 themes/components/pop_item_list.html create mode 100644 themes/components/rank_table.html create mode 100644 themes/components/related_list.html create mode 100644 themes/components/related_summary.html create mode 100644 themes/components/stacktrace.html create mode 100644 themes/components/stats_box.html create mode 100644 themes/components/summary.html create mode 100644 themes/components/tdfb.html create mode 100644 themes/components/text_alli.html create mode 100644 themes/components/text_char.html create mode 100644 themes/components/text_corp.html create mode 100644 themes/components/text_faction.html create mode 100644 themes/components/text_group.html create mode 100644 themes/components/text_item.html create mode 100644 themes/components/text_region.html create mode 100644 themes/components/text_ship.html create mode 100644 themes/components/text_shipclass.html create mode 100644 themes/components/text_system.html create mode 100644 themes/components/title.html create mode 100644 themes/components/top_killer_list.html create mode 100644 themes/components/top_list.html create mode 100644 themes/components/top_pilots.html create mode 100644 themes/components/victim_info.html create mode 100644 themes/components/war.html create mode 100644 themes/components/war_table.html create mode 100644 themes/components/wars_table.html create mode 100644 themes/css/bootstrap-tagmanager.css create mode 100644 themes/css/bootstrap-wysihtml5.css create mode 100644 themes/css/datepicker.css create mode 100644 themes/css/font-awesome.css create mode 100644 themes/css/main.css create mode 100644 themes/css/style-edits/amelia-main.css create mode 100644 themes/css/style-edits/cerulean-main.css create mode 100644 themes/css/style-edits/cyborg-main.css create mode 100644 themes/css/style-edits/default-main.css create mode 100644 themes/css/style-edits/journal-main.css create mode 100644 themes/css/style-edits/readable-main.css create mode 100644 themes/css/style-edits/simplex-main.css create mode 100644 themes/css/style-edits/slate-main.css create mode 100644 themes/css/style-edits/spacelab-main.css create mode 100644 themes/css/style-edits/united-main.css create mode 100644 themes/css/wysiwyg-color.css create mode 100644 themes/detail.html create mode 100644 themes/dlogin.html create mode 100644 themes/error.html create mode 100644 themes/favicon.ico create mode 100644 themes/footer.html create mode 100644 themes/forgotpassword.html create mode 100644 themes/img/3D.png create mode 100644 themes/img/bg_cyborg_blueish.jpg create mode 100644 themes/img/bg_cyborg_blueish.png create mode 100644 themes/img/bg_cyborg_redish.png create mode 100644 themes/img/bg_white.jpg create mode 100644 themes/img/disqus_button.png create mode 100644 themes/img/dust514.png create mode 100644 themes/img/eve-question.png create mode 100644 themes/img/glyphicons-halflings-white.png create mode 100644 themes/img/glyphicons-halflings.png create mode 100644 themes/img/grey.gif create mode 100644 themes/img/km_external_link.png create mode 100644 themes/img/lazyload.gif create mode 100644 themes/img/panel/0h.png create mode 100644 themes/img/panel/0l.png create mode 100644 themes/img/panel/0m.png create mode 100644 themes/img/panel/0r.png create mode 100644 themes/img/panel/0s.png create mode 100644 themes/img/panel/1h.png create mode 100644 themes/img/panel/1l.png create mode 100644 themes/img/panel/1m.png create mode 100644 themes/img/panel/1r.png create mode 100644 themes/img/panel/2h.png create mode 100644 themes/img/panel/2l.png create mode 100644 themes/img/panel/2m.png create mode 100644 themes/img/panel/2r.png create mode 100644 themes/img/panel/3h.png create mode 100644 themes/img/panel/3l.png create mode 100644 themes/img/panel/3m.png create mode 100644 themes/img/panel/3r.png create mode 100644 themes/img/panel/4h.png create mode 100644 themes/img/panel/4l.png create mode 100644 themes/img/panel/4m.png create mode 100644 themes/img/panel/5h.png create mode 100644 themes/img/panel/5l.png create mode 100644 themes/img/panel/5m.png create mode 100644 themes/img/panel/5s.png create mode 100644 themes/img/panel/6h.png create mode 100644 themes/img/panel/6l.png create mode 100644 themes/img/panel/6m.png create mode 100644 themes/img/panel/7h.png create mode 100644 themes/img/panel/7l.png create mode 100644 themes/img/panel/7m.png create mode 100644 themes/img/panel/8h.png create mode 100644 themes/img/panel/8l.png create mode 100644 themes/img/panel/8m.png create mode 100644 themes/img/panel/blank.png create mode 100644 themes/img/panel/circle.png create mode 100644 themes/img/panel/dustwheel.png create mode 100644 themes/img/panel/error.jpg create mode 100644 themes/img/panel/h.png create mode 100644 themes/img/panel/l.png create mode 100644 themes/img/panel/m.png create mode 100644 themes/img/panel/noship.png create mode 100644 themes/img/panel/r.png create mode 100644 themes/img/panel/tyrannis.png create mode 100644 themes/img/panel/tyrannis_blue.png create mode 100644 themes/img/panel/tyrannis_darkred.png create mode 100644 themes/img/panel/tyrannis_default.png create mode 100644 themes/img/panel/tyrannis_revelations.png create mode 100644 themes/img/panel/working.jpg create mode 100644 themes/img/region_64.png create mode 100644 themes/img/social/Untitled-1.png create mode 100644 themes/img/social/aol.png create mode 100644 themes/img/social/apple.png create mode 100644 themes/img/social/behance.png create mode 100644 themes/img/social/blogger.png create mode 100644 themes/img/social/delicious.png create mode 100644 themes/img/social/deviant_art.png create mode 100644 themes/img/social/digg.png create mode 100644 themes/img/social/dribbble.png create mode 100644 themes/img/social/email.png create mode 100644 themes/img/social/fb_1.png create mode 100644 themes/img/social/fb_2.png create mode 100644 themes/img/social/flickr.png create mode 100644 themes/img/social/forrst.png create mode 100644 themes/img/social/friend_feed.png create mode 100644 themes/img/social/google.png create mode 100644 themes/img/social/google_1.png create mode 100644 themes/img/social/google_plus.png create mode 100644 themes/img/social/heart.png create mode 100644 themes/img/social/lastfm.png create mode 100644 themes/img/social/linkedin.png create mode 100644 themes/img/social/microsoft.png create mode 100644 themes/img/social/netvibes.png create mode 100644 themes/img/social/newsvine.png create mode 100644 themes/img/social/orkut.png create mode 100644 themes/img/social/paypal.png create mode 100644 themes/img/social/picasa.png create mode 100644 themes/img/social/pinterest.png create mode 100644 themes/img/social/reddit.png create mode 100644 themes/img/social/rss.png create mode 100644 themes/img/social/share_this.png create mode 100644 themes/img/social/skype.png create mode 100644 themes/img/social/star.png create mode 100644 themes/img/social/stumble_upon.png create mode 100644 themes/img/social/technorati.png create mode 100644 themes/img/social/tumblr.png create mode 100644 themes/img/social/twitter_1.png create mode 100644 themes/img/social/twitter_2.png create mode 100644 themes/img/social/vimeo.png create mode 100644 themes/img/social/wp.png create mode 100644 themes/img/social/yahoo.png create mode 100644 themes/img/social/you_tube.png create mode 100644 themes/img/spark1.png create mode 100644 themes/img/squizz_payment_example.png create mode 100644 themes/img/squizz_subdomain_example.png create mode 100644 themes/img/up-arrow.png create mode 100644 themes/img/wreck.png create mode 100644 themes/index.html create mode 100644 themes/information.html create mode 100644 themes/information/theme.md create mode 100644 themes/intel.html create mode 100644 themes/item.html create mode 100644 themes/js/bootstrap-datepicker.js create mode 100644 themes/js/bootstrap-tagmanager.js create mode 100644 themes/js/bootstrap-wysihtml5.js create mode 100644 themes/js/common.js create mode 100644 themes/js/jquery.min.js create mode 100644 themes/js/rankstablesort.js create mode 100644 themes/js/sclock1.js create mode 100644 themes/js/search.js create mode 100644 themes/js/tablesorter/jquery-latest.js create mode 100644 themes/js/tablesorter/jquery.metadata.js create mode 100644 themes/js/tablesorter/jquery.tablesorter.js create mode 100644 themes/js/tablesorter/jquery.tablesorter.min.js create mode 100644 themes/js/wysihtml5-0.3.0.js create mode 100644 themes/kills.html create mode 100644 themes/lasthour.html create mode 100644 themes/livechat.html create mode 100644 themes/login.html create mode 100644 themes/logout.html create mode 100644 themes/merge.html create mode 100644 themes/moderator/moderator.html create mode 100644 themes/moderator/reportedkills.html create mode 100644 themes/moderator/reportedkills_view.html create mode 100644 themes/moderator/ticket_view.html create mode 100644 themes/moderator/tickets.html create mode 100644 themes/navigationbar.html create mode 100644 themes/overview.html create mode 100644 themes/postmail.html create mode 100644 themes/ranks.html create mode 100644 themes/register.html create mode 100644 themes/related.html create mode 100644 themes/search.html create mode 100644 themes/sitemap.html create mode 100644 themes/tickets.html create mode 100644 themes/tickets_view.html create mode 100644 themes/tracker.html create mode 100644 themes/wars.html create mode 100644 themes/xml/zkbsearch.xml create mode 100644 themes/zkillboard.php create mode 100644 twig.php create mode 100644 view/account.php create mode 100644 view/api.php create mode 100644 view/apidna.php create mode 100644 view/apistats.php create mode 100644 view/autocomplete.php create mode 100644 view/battle_report.php create mode 100644 view/brsave.php create mode 100644 view/campaign.php create mode 100644 view/campaigns.php create mode 100644 view/changepassword.php create mode 100644 view/crestmail.php create mode 100644 view/detail.php create mode 100644 view/dlogin.php create mode 100644 view/error.php create mode 100644 view/forgotpassword.php create mode 100644 view/index.php create mode 100644 view/information.php create mode 100644 view/intel.php create mode 100644 view/item.php create mode 100644 view/kills.php create mode 100644 view/lasthour.php create mode 100644 view/livechat.php create mode 100644 view/login.php create mode 100644 view/logout.php create mode 100644 view/merge.php create mode 100644 view/moderator.php create mode 100644 view/overview.php create mode 100644 view/postmail.php create mode 100644 view/ranks.php create mode 100644 view/raw.php create mode 100644 view/register.php create mode 100644 view/related.php create mode 100644 view/search.php create mode 100644 view/sitemap.php create mode 100644 view/tickets.php create mode 100644 view/tickets_view.php create mode 100644 view/top.php create mode 100644 view/tracker.php create mode 100644 view/war.php create mode 100644 view/wars.php diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..4eb2283c --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +text eol=lf \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..2b6c108a --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +cache/ +composer.phar +db +config.php +vendor/ +sitemaps/ diff --git a/.htaccess b/.htaccess new file mode 100644 index 00000000..0edc03ed --- /dev/null +++ b/.htaccess @@ -0,0 +1,19 @@ +RewriteEngine on + +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_URI} !(.*)/$ +RewriteRule ^(.*)$ /$1/ [L,R=302] + +RewriteCond %{REQUEST_FILENAME} !-f +RewriteRule ^(.*)$ /index.php/$1 [L] + + + ExpiresActive On + ExpiresByType image/jpg "access plus 1 year" + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType text/javascript "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + diff --git a/AGPL.md b/AGPL.md new file mode 100644 index 00000000..9a5e16f7 --- /dev/null +++ b/AGPL.md @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. \ No newline at end of file diff --git a/CCP.md b/CCP.md new file mode 100644 index 00000000..8a7c4581 --- /dev/null +++ b/CCP.md @@ -0,0 +1,7 @@ +# CCP Copyright Notice + +EVE Online and the EVE logo are the registered trademarks of CCP hf. All rights are reserved worldwide. +All other trademarks are the property of their respective owners. EVE Online, the EVE logo, EVE and all associated logos and designs are the intellectual property of CCP hf. +All artwork, screenshots, characters, vehicles, storylines, world facts or other recognizable features of the intellectual property relating to these trademarks are likewise the intellectual property of CCP hf. + +CCP hf. has granted permission to __zKillboard__ to use EVE Online and all associated logos and designs for promotional and information purposes on its website but does not endorse, and is not in any way affiliated with, __zKillboard__. CCP is in no way responsible for the content on or functioning of this website, nor can it be liable for any damage arising from the use of this website. \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 00000000..dc1eece9 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,4 @@ +# zKillboard License + +## License +zKillboard uses the AGPLv3 license. Full license text is available in the `AGPL.md` file. diff --git a/README.md b/README.md new file mode 100644 index 00000000..e279e7b7 --- /dev/null +++ b/README.md @@ -0,0 +1,113 @@ +# zKillboard +zKillboard is a killboard created for EVE-Online, for use on zkillboard.com, but can also be used for single entities. + +# WARNING WARNING +This is the latest verison of zKillboard.com, which prefers NoSQL over MySQL. If you do not have experience with installing and maintaining a NoSQL database, specifically TokuMX v2.4, we do not recommend you try this at home unless you truly enjoy a challenge! There are some aspects of zKillboard.com that still utilize MySQL, but that is only because they haven't been integrated into NoSQL yet. + +# WARNING +This is BETA, which means it is a work in progress. It lacks complete documentation and is currently not meant for use in production. + +Since zKillboard is a beta product, it has a code base that is far from complete and enjoys numerous updates, deletions, and modifications to the code and accompanying tables. Please feel free to attempt to install zKillboard on your own server, however, we are not responsible for any difficulties you come across during installation and continuing execution of the product. + +# Credits +zKillboard is released under the GNU Affero General Public License, version 3. The full license is available in the `AGPL.md` file. +zKillboard also uses data and images from EVE-Online, which is covered by a seperate license from _[CCP](http://www.ccpgames.com/en/home)_. You can see the full license in the `CCP.md` file. +It also uses various 3rd party libraries, which all carry their own licensing. Please refer to them for more info. + +# Contact +`#zkb` on `irc.coldfront.net` +Mibbit link incase you're lazy: _http://chat.mibbit.com/?channel=%23zkb&server=irc.coldfront.net_ + +# LICENSE +see `LICENSE.md` file + +# Minimum requirements +- PHP 5.4+ / HHVM 3.0+ +- Apache + mod_rewrite, Nginx or any other httpd you prefer that supports php via mod_php or fastcgi. +- Linux, Mac OS X or Windows +- MariaDB 5.5+ +- TokuMX 2.4+ +- Composer +- cURL and php5-curl + +# Recommended requirements +- PHP 5.5+ / HHVM 3.0+ +- Linux +- MariaDB 5.5+ +- TokuMX 2.4+ +- Composer +- APC / Redis / Memcached (Doesn't matter which one) +- cURL and php5-curl + +# Nginx Config +``` +upstream php-upstream { + server unix:/tmp/php-fpm.sock; + server 127.0.0.1:9000; +} + +server { + server_name example.com www.example.com; + listen 80; + root /path/to/zkb_install; + + location / { + try_files $uri $uri/ /index.php$is_args$args; + } + + location ~ \.php$ { + try_files $uri = 404; + include fastcgi_params; + fastcgi_index index.php; + fastcgi_pass php-upstream; + } +} + +``` + +# Apache rewrite +Apache rewrite is handled by the .htaccess. + +# Apache Config +``` + + ServerAlias yourdomain.tld + + DocumentRoot /path/to/zkb_install/ + + Require all granted + Options FollowSymLinks MultiViews + AllowOverride All + Order allow,deny + Allow from all + + +``` + +# Other webservers +Other webservers are supported, aslong as they can run PHP, they should work. +But other webservers have other ways to write rewrites, so from our side of things, they are unsupported. +Feel free to issue pull requests to amend this. + +# Cronjobs +zKillboard comes with a script that automates the cron execution. +It keeps track of when each job has been run and how frequently it needs to be executed. +Just run it every minute via cron or a similar system: + +``` +* * * * * /var/killboard/zkillboard.com/cron/cron.sh +``` + +The cron.sh file handles the output as well as rotating of the logfiles in /cron/logs/ + +# Updating CCP tables +To update the CCP tables, run the cli script called ```updateCCPData``` like so (assuming you symlinked cli.php) ```zkillboard updateCCPData``` +It will then automatically download the latest tables from Fuzzysteve, and import them. + +# Admin account + +Every clean zKillboard installation comes with an admin account, default username and password is `admin`, it is highly recommended that you immediately change this password after you finish your installation. + +Current special features to the admin account: + +1) Any entities (pilots, corporations, etc.) added to the Admin's tracker will automatically be fetched from _https://zkillboard.com_ up to and including a full fetch of all kills, and maintaining a fetch of said kills on an hourly basis. This of course depends on the cronjob being setup. diff --git a/api.wiki b/api.wiki new file mode 100644 index 00000000..89d4436e --- /dev/null +++ b/api.wiki @@ -0,0 +1,107 @@ +[[Category:ZKillboard]][[Category:Third Party APIs]] + +== API == +The zKillboard API is for developers and/or enthusiasts who wants to integrate zKB into their website and/or application. + +== Rules == +* Do not hammer the server with API requests. +* Follow the cacheTime indicated in the expires headers, or the cachedUntil value if you are requesting XML +* If you must do several requests in a row, place space them out as much as possible. +* Please send ''Accept-Encoding: gzip'' as header, to help save bandwidth. +* Please send ''User-Agent: '' as a header. Replace '''' with your name, email, website etc. Example: User-Agent: https://zkillboard.com/ Maintainer: Karbowiak Mail: karbowiak@gmail.com + +== Advice == +* If you are hitting the API limit, perhaps you should condense your requests. E.G., instead of requesting one character at a time, request multiple characters. +* Be reasonable with your requests. Most entities don't have new kills every single hour, keep this in mind while programming your utility. +* When developing a tool, try caching the requests locally. This will help ensure you don't hit API limits during testing and also ensures you are testing against the same set of data. + +== Extra Info (Read before you start fetching) == +* Look at the X-Bin-Request-Count header and X-Bin-Max-Requests header for how many requests you've made, and how many you can make pr. hour. +* You can do any amount of requests pr. second that you want. +* All IDs used with the API are CCP IDs (Except killmail IDs, which can be internally set, but they are denoted with a - infront (negative numbers)) +* If you get an error 403, look at the ''Retry-After'' header. +* The API will maximum deliver of 200 killmails. +* If the ''/limit/'' modifier is used, then ''/page/'' is unavailable. +* startTime and endTime is datetime timestamps, in the format ''YmdHi''.. Example ''2012-11-25 19:00'' is written as ''201211251900'' +* ''/w-space/'' and ''/solo/'' can be combined with ''/kills/'' and ''/losses/'' +* To get combined ''/kills/'' and ''/losses/'', don't pass either ''/kills/'' or ''/losses/'' +* Up to 10 IDs can be fetched at the same time, by seperating them with a , (Comma) +* pastSeconds returns only kills that have happened in the past x seconds. +* pastSeconds can maximum go up to 7 days (604800 seconds) +* Default return is JSON, XML is available with ''/xml/'' parameter. +* Remember to finish with a / (Forward slash) +* All modifiers can be combined in any order +* If you do not paass /killID/ then you must pass at least two of the following modifiers. ''/w-space/'', ''/solo/'' or any of the ''/xID/'' ones. (characterID, allianceID, factionID etc.) +* Negative killIDs denote manually posted killmails. +* JSONP is available +* The API has CORS set. +* Page requests over 10 are only allowed for characterID, corporationID and allianceID + +== Defaults == +* Default sort is desc (latest to oldest) +* Default page is 1 +* Default format is JSON + +== URL Info == +* ''#'' is a number +* ''YmdHi'' is a timestamp in the following format: ''201201012333'' (2012-01-01 23:33) +* ''Y'' is a year in the following format: ''2012'' +* ''m'' is a month in the following format: ''01'' +* ''w'' is a week in the following format: ''01'' +* ''s'' is seconds + +== Page / Time / Limit modifiers == +* /limit/#/ +* /page/#/ +* /startTime/YmdHi/ +* /endTime/YmdHi/ +* /year/Y/ +* /month/m/ +* /week/w/ +* /beforeKillID/#/ +* /afterKillID/#/ +* /pastSeconds/s/ +* /killID/#/ + +== Fetch Type modifiers == +* /kills/ +* /losses/ +* /w-space/ +* /solo/ + +== Order modifiers == +* /orderDirection/asc/ (Oldest to latest) +* /orderDirection/desc/ (Latest to oldest) + +== Fetch modifiers == +* /characterID/#/ +* /corporationID/#/ +* /allianceID/#/ +* /factionID/#/ +* /shipTypeID/#/ +* /groupID/#/ +* /solarSystemID/#/ +* /regionID/#/ + +== Information modifiers == +* /no-items/ +* /no-attackers/ +* /api-only/ + +== Format modifiers == +* /xml/ + +== Examples == +* https://zkillboard.com/api/kills/w-space/ +* https://zkillboard.com/api/kills/w-space/xml/ +* https://zkillboard.com/api/losses/solo/ +* https://zkillboard.com/api/losses/solo/xml/ +* https://zkillboard.com/api/kills/characterID/268946627/ +* https://zkillboard.com/api/kills/characterID/268946627,1633218082/ +* https://zkillboard.com/api/kills/characterID/268946627/xml/ +* https://zkillboard.com/api/solo/kills/characterID/268946627/ +* https://zkillboard.com/api/w-space/corporationID/98076299/ +* https://zkillboard.com/api/w-space/corporationID/98076299/page/2/ +* https://zkillboard.com/api/kills/shipID/644,638/orderDirection/asc/ +* https://zkillboard.com/api/kills/regionID/10000002/ + diff --git a/classes/Account.php b/classes/Account.php new file mode 100644 index 00000000..def57084 --- /dev/null +++ b/classes/Account.php @@ -0,0 +1,47 @@ + $row["id"])); + $row["sunTypeID"] = $sunType; + break; + + case "item": + $row["typeID"] = $row["id"]; + $row["shipName"] = $row["name"]; + break; + + case "ship": + $row["shipTypeID"] = $row["id"]; + $row["${ent}Name"] = $row["name"]; + break; + + default: + $row["${ent}ID"] = $row["id"]; + $row["${ent}Name"] = $row["name"]; + break; + } + $part[] = $row; + } + $entlist[$ent] = $part; + } + return $entlist; + } +} diff --git a/classes/Api.php b/classes/Api.php new file mode 100644 index 00000000..bc55f3fa --- /dev/null +++ b/classes/Api.php @@ -0,0 +1,90 @@ +exists("apis", ['keyID' => $keyID, 'vCode' => $vCode]); + if ($exists) + { + return "We already have this API in our database."; + } + + $mdb->save("apis", ['keyID' => $keyID, 'vCode' => $vCode, 'label' => $label, 'lastApiUpdate' => new MongoDate(2), 'userID' => $userID]); + + return "Success, your API has been added."; + } + + public static function deleteKey($keyID) + { + global $mdb; + $keyID = (int) $keyID; + + $userID = (int) user::getUserID(); + if ($userID == null) return "You do not have access to remove any keys."; + + $result = $mdb->remove("apis", ['keyID' => $keyID, 'userID' => $userID]); + if ($result["n"] > 0) + { + $result = $mdb->remove("apiCharacters", ['keyID' => $keyID]); + } + + return "$keyID has been deleted"; + } + + public static function getKeys($userID) + { + global $mdb; + $userID = (int) $userID; + if ($userID == 0) return []; + + $result = $mdb->find("apis", ['userID' => $userID]); + return $result; + } + + public static function getCharacterKeys($userID) + { + global $mdb; + + $keys = self::getKeys($userID); + $result = []; + foreach ($keys as $key) + { + $chars = $mdb->find("apiCharacters", ['keyID' => $key["keyID"]]); + foreach ($chars as $char) $result[] = $char; + } + return $result; + } + + /** + * Returns an array of the characters assigned to this user. + * + * @static + * @param $userID int + * @return array + */ + public static function getCharacters($userID) + { + $result = self::getCharacterKeys($userID); + Info::addInfo($result); + return $result; + } + + /** + * Tests the access mask for KillLog access + * + * @static + * @param int $accessMask + * @return bool + */ + public static function hasBits($accessMask) + { + return ((int)($accessMask & 256) > 0); + } +} diff --git a/classes/Crest2Api.php b/classes/Crest2Api.php new file mode 100644 index 00000000..0d055305 --- /dev/null +++ b/classes/Crest2Api.php @@ -0,0 +1,87 @@ +findDoc("rawmails", ['killID' => $killID]); + $kill = $mdb->findDoc("killmails", ['killID' => $killID]); + + $killmail = array(); + $killmail["killID"] = (int) $killID; + $killmail["solarSystemID"] = (int) $crestmail["solarSystem"]["id"]; + $killmail["killTime"] = str_replace(".", "-", $crestmail["killTime"]); + $killmail["moonID"] = (int) @$crestmail["moon"]["id"]; + + $victim = array(); + $killmail["victim"] = self::getVictim($crestmail["victim"]); + $killmail["attackers"] = self::getAttackers($crestmail["attackers"]); + $killmail["items"] = self::getItems($crestmail["victim"]["items"]); + $killmail["zkb"] = $kill["zkb"]; + + return $killmail; + } + + private static function getVictim($pvictim) + { + $victim = array(); + $victim["shipTypeID"] = (int) $pvictim["shipType"]["id"]; + $victim["characterID"] = (int) @$pvictim["character"]["id"]; + $victim["characterName"] = (string) @$pvictim["character"]["name"]; + $victim["corporationID"] = (int) $pvictim["corporation"]["id"]; + $victim["corporationName"] = (string) @$pvictim["corporation"]["name"]; + $victim["allianceID"] = (int) @$pvictim["alliance"]["id"]; + $victim["allianceName"] = (string) @$pvictim["alliance"]["name"]; + $victim["factionID"] = (int) @$pvictim["faction"]["id"]; + $victim["factionName"] = (string) @$pvictim["faction"]["name"]; + $victim["damageTaken"] = (int) @$pvictim["damageTaken"]; + return $victim; + } + + private static function getAttackers($attackers) + { + $aggressors = array(); + foreach($attackers as $attacker) { + $aggressor = array(); + $aggressor["characterID"] = (int) @$attacker["character"]["id"]; + $aggressor["characterName"] = (string) @$attacker["character"]["name"]; + $aggressor["corporationID"] = (int) @$attacker["corporation"]["id"]; + $aggressor["corporationName"] = (string) @$attacker["corporation"]["name"]; + $aggressor["allianceID"] = (int) @$attacker["alliance"]["id"]; + $aggressor["allianceName"] = (string) @$attacker["alliance"]["name"]; + $aggressor["factionID"] = (int) @$attacker["faction"]["id"]; + $aggressor["factionName"] = (string) @$attacker["faction"]["name"]; + $aggressor["securityStatus"] = $attacker["securityStatus"]; + $aggressor["damageDone"] = (int) @$attacker["damageDone"]; + $aggressor["finalBlow"] = (int) @$attacker["finalBlow"]; + $aggressor["weaponTypeID"] = (int) @$attacker["weaponType"]["id"]; + $aggressor["shipTypeID"] = (int) @$attacker["shipType"]["id"]; + $aggressors[] = $aggressor; + } + return $aggressors; + } + + /** + * @param array $items + * @return array + */ + private static function getItems($items) + { + $retArray = array(); + foreach($items as $item) { + $i = array(); + $i["typeID"] = (int) @$item["itemType"]["id"]; + $i["flag"] = (int) @$item["flag"]; + $i["qtyDropped"] = (int) @$item["quantityDropped"]; + $i["qtyDestroyed"] = (int) @$item["quantityDestroyed"]; + $i["singleton"] = (int) @$item["singleton"]; + if (isset($item->items)) $i["items"] = self::getItems($item->items); + $retArray[] = $i; + } + return $retArray; + } +} diff --git a/classes/CrestTools.php b/classes/CrestTools.php new file mode 100644 index 00000000..40516aec --- /dev/null +++ b/classes/CrestTools.php @@ -0,0 +1,49 @@ +findDoc("rawmails", ['killID' => (int) $id]); + if ($mail != null) return $mail; + + // Nope, don't have it, go fetch + if ($hash == null) throw new Exception("rawmail not on record, must provide a hash"); + $url = "http://public-crest.eveonline.com/killmails/$id/$hash/"; + return self::getJSON($url); + } +} diff --git a/classes/Detail.php b/classes/Detail.php new file mode 100644 index 00000000..538677ef --- /dev/null +++ b/classes/Detail.php @@ -0,0 +1,335 @@ + $inv["shipName"], "shipTypeID" => $inv["shipTypeID"], "count" => $involved[$inv["shipTypeID"]]["count"] + 1); + elseif(isset($inv["shipTypeID"]) && isset($inv["shipName"])) + { + $involved[$inv["shipTypeID"]] = array("shipName" => $inv["shipName"], "shipTypeID" => $inv["shipTypeID"], "count" => 1); + } + else + continue; + } + + usort($involved, "sortByOrder"); + return $involved; + } + + public static function sortByOrder($a, $b) + { + return $a["count"] < $b["count"]; + } + + public static function usdeurgbp($totalprice) + { + $usd = 17; + $eur = 13; + $gbp = 10; + $plex = Price::getItemPrice("29668", date("Ymd")); + $usdval = $plex / $usd; + $eurval = $plex / $eur; + $gbpval = $plex / $gbp; + + return array("usd" => $totalprice / $usdval, "eur" => $totalprice / $eurval, "gbp" => $totalprice / $gbpval); + } + + public static function eftarray($md5, $items, $victimID = 0) + { + $Cache = Cache::get($md5."eftarray"); + if ($Cache) return $Cache; + + // EFT / Fitting Wheel + $eftarray["high"] = array(); // high + $eftarray["mid"] = array(); // mid + $eftarray["low"] = array(); // low + $eftarray["rig"] = array(); // rig + $eftarray["drone"] = array(); // drone + $eftarray["sub"] = array(); // sub + $eftammo["high"] = array(); // high ammo + $eftammo["mid"] = array(); // mid ammo + + foreach($items as $itm) + { + if (!isset($itm["inContainer"])) $itm["inContainer"] = 0; + if ($victimID >= 2100000000 && $victimID <= 2999999999) $itm["flagName"] = Info::getGroupName(Info::getGroupID($itm["typeID"])); + else if (!isset($itm["flagName"])) $itm["flagName"] = Info::getFlagName($itm["flag"]); + + if ($itm["flagName"] == "Infantry Modules") $itm["flagName"] = "Mid Slots"; + if ($itm["flagName"] == "Infantry Weapons") $itm["flagName"] = "High Slots"; + if ($itm["flagName"] == "Infantry Equipment") $itm["flagName"] = "Low Slots"; + if ($itm["flag"] == 89) { + $slot = Db::queryField("select coalesce(valueInt, valueFloat) slot from ccp_dgmTypeAttributes where typeID = :typeID and attributeID = 331", "slot", array(":typeID" => $itm["typeID"])); + if ($slot <= 5 && $slot >= 1) { + $itm["flagName"] = "High Slots"; + $itm["flag"] = 27 + ($slot - 1); + } + else if ($slot > 5 && $slot <= 10) { + $itm["flagName"] = "Low Slots"; + $itm["flag"] = 11 + ($slot - 6); + } + $itm["fittable"] = 1; + } + + if (!isset($itm["flag"]) || $itm["flag"] == 0) { + if ($itm["flagName"] == "High Slots") $itm["flag"] = 27; + if ($itm["flagName"] == "Mid Slots") $itm["flag"] = 19; + if ($itm["flagName"] == "Low Slots") $itm["flag"] = 11; + } + + $key = $itm["typeName"] . "|" . $itm["flagName"]; + if(isset($itm["flagName"])) + { + if(@$itm["fittable"] && $itm["inContainer"] == 0) // not ammo or whatever + { + $repeats = @$itm["quantityDropped"] + @$itm["quantityDestroyed"]; + $i = 0; + while($i < $repeats) + { + if($itm["flagName"] == "High Slots") + { +high: + if(isset($eftarray["high"][$itm["flag"]])) + { + $itm["flag"] = $itm["flag"]+1; + goto high; + } + $eftarray["high"][$itm["flag"]][] = array("typeName" => $itm["typeName"], "typeID" => $itm["typeID"]); + } + if($itm["flagName"] == "Mid Slots") + { +mid: + if(isset($eftarray["mid"][$itm["flag"]])) + { + $itm["flag"] = $itm["flag"]+1; + goto mid; + } + $eftarray["mid"][$itm["flag"]][] = array("typeName" => $itm["typeName"], "typeID" => $itm["typeID"]); + } + if($itm["flagName"] == "Low Slots") + { +low: + if(isset($eftarray["low"][$itm["flag"]])) + { + $itm["flag"] = $itm["flag"]+1; + goto low; + } + $eftarray["low"][$itm["flag"]][] = array("typeName" => $itm["typeName"], "typeID" => $itm["typeID"]); + } + if($itm["flagName"] == "Rigs") + { +rigs: + if(isset($eftarray["rig"][$itm["flag"]])) + { + $itm["flag"] = $itm["flag"]+1; + goto rigs; + } + $eftarray["rig"][$itm["flag"]][] = array("typeName" => $itm["typeName"], "typeID" => $itm["typeID"]); + } + if($itm["flagName"] == "SubSystems") + { +subs: + if(isset($eftarray["sub"][$itm["flag"]])) + { + $itm["flag"] = $itm["flag"]+1; + goto subs; + } + $eftarray["sub"][$itm["flag"]][] = array("typeName" => $itm["typeName"], "typeID" => $itm["typeID"]); + } + $i++; + } + } + else + { + if($itm["flagName"] == "Drone Bay") + $eftarray["drone"][$itm["flag"]][] = array("typeName" => $itm["typeName"], "typeID" => $itm["typeID"], "qty" => @$itm["quantityDropped"] + @$itm["quantityDestroyed"]); + } + } + } + + // Ammo shit + foreach($items as $itm) { + if (!isset($itm["inContainer"])) $itm["inContainer"] = 0; + if($itm["inContainer"] == 0 && !@$itm["fittable"] && isset($itm["flagName"])) // possibly ammo + { + if($itm["flagName"] == "High Slots") // high slot ammo + $eftarray["high"][$itm["flag"]][] = array("typeName" => $itm["typeName"], "typeID" => $itm["typeID"], "charge" => true); + if($itm["flagName"] == "Mid Slots") // mid slot ammo + $eftarray["mid"][$itm["flag"]][] = array("typeName" => $itm["typeName"], "typeID" => $itm["typeID"], "charge" => true); + if($itm["flagName"] == "Low Slots") // mid slot ammo + $eftarray["low"][$itm["flag"]][] = array("typeName" => $itm["typeName"], "typeID" => $itm["typeID"], "charge" => true); + } + } + foreach($eftarray as $key=>$value) { + if (sizeof($value)) { + asort($value); + $eftarray[$key] = $value; + } else unset($eftarray[$key]); + } + Cache::set($md5."eftarray", $eftarray); + return $eftarray; + } + + public static function combineditems($md5, $items) + { + $Cache = Cache::get($md5."combineditems"); + if($Cache) return $Cache; + + // Create the new item array with combined items and whatnot + $itemList = array(); + foreach($items as $itm) + { + if (!isset($itm["inContainer"])) $itm["inContainer"] = 0; + if ($itm["inContainer"] == 1) $itm["flag"] = 0; + if (!isset($itm["flagName"])) $itm["flagName"] = Info::getFlagName($itm["flag"]); + for ($i = 0; $i <= 1; $i++) { + $mItem = $itm; + if ($i == 0) @$mItem["quantityDropped"] = 0; + if ($i == 1) @$mItem["quantityDestroyed"] = 0; + if (@$mItem["quantityDropped"] == 0 && @$mItem["quantityDestroyed"] == 0) continue; + $key = static::buildItemKey($mItem); + + if(!isset($itemList[$key])) { + $itemList[$key] = $mItem; + $itemList[$key]["price"] = $mItem["price"] * ($mItem["quantityDropped"] + $mItem["quantityDestroyed"]); + } + else { + $itemList[$key]["quantityDropped"] += @$mItem["quantityDropped"]; + $itemList[$key]["quantityDestroyed"] += @$mItem["quantityDestroyed"]; + $itemList[$key]["price"] += $mItem["price"] * (@$mItem["quantityDropped"] + @$mItem["quantityDestroyed"]); + } + } + } + Cache::set($md5."combineditems", $itemList); + return $itemList; + } + + public static function fullCombinedItems($md5, $items) + { + // Create the new item array with combined items and whatnot + $itemList = array(); + foreach($items as $itm) + { + if ($itm["fittable"] != 1) continue; + if (!isset($itm["inContainer"])) $itm["inContainer"] = 0; + if ($itm["inContainer"] == 1) $itm["flag"] = 0; + if (!isset($itm["flagName"])) $itm["flagName"] = Info::getFlagName($itm["flag"]); + + $mItem = $itm; + if ($mItem["quantityDropped"] == 0 && $mItem["quantityDestroyed"] == 0) continue; + $key = $itm["typeID"]; + + if(!isset($itemList[$key])) { + $itemList[$key] = $mItem; + $itemList[$key]["price"] = $mItem["price"] * ($mItem["quantityDropped"] + $mItem["quantityDestroyed"]); + } + else $itemList[$key]["quantityDropped"] += $mItem["quantityDropped"]; + $itemList[$key]["quantityDropped"] += $mItem["quantityDestroyed"]; + $mItem["quantityDestroyed"] = 0; + $itemList[$key]["price"] += $mItem["price"] * ($mItem["quantityDropped"] + $mItem["quantityDestroyed"]); + } + return $itemList; + } + + public static function buildItemKey($itm) + { + $key = $itm["typeName"] . ($itm["singleton"] == 2 ? " (Copy)" : ""); + $key .= "|" . ($itm["quantityDropped"] > 0 ? "dropped" : "destroyed"); + if (!isset($itm["flagName"])) $itm["flagName"] = Info::getFlagName($itm["flag"]); + $key .= "|" . $itm["flagName"]; + if (in_array($itm["groupID"], array(340, 649)) && isset($itm["items"])) $key .= microtime() . rand(0, 10000); + return $key; + } + + public static function involvedCorpsAndAllis($md5, $involved) + { + $Cache = Cache::get($md5."involvedCorpsAndAllis"); + if($Cache) return $Cache; + + $involvedAlliCount = 0; + $involvedCorpCount = 0; + // Create the involved corps / alliances list + $invAll = array(); + foreach($involved as $inv) { + $allianceID = $inv["allianceID"]; + $corporationID = $inv["corporationID"]; + if (!isset($invAll["$allianceID"])) { + $involvedAlliCount++; + $invAll["$allianceID"] = array(); + if ($allianceID != 0) $invAll["$allianceID"]["allianceName"] = $inv["allianceName"]; + if ($allianceID != 0) $invAll["$allianceID"]["name"] = $inv["allianceName"]; + if ($allianceID != 0) $invAll["$allianceID"]["allianceID"] = $allianceID; + $invAll["$allianceID"]["corporations"] = array(); + $invAll["$allianceID"]["involved"] = 0; + } + $involvedCount = $invAll["$allianceID"]["involved"]; + $invAll["$allianceID"]["involved"] = $involvedCount + 1; + + if (!isset($invAll["$allianceID"]["corporations"]["$corporationID"])) { + $involvedCorpCount++; + $invAll["$allianceID"]["corporations"]["$corporationID"] = array(); + $invAll["$allianceID"]["corporations"]["$corporationID"]["corporationName"] = isset($inv["corporationName"]) ? $inv["corporationName"] : ""; + $invAll["$allianceID"]["corporations"]["$corporationID"]["name"] = isset($inv["corporationName"]) ? $inv["corporationName"] : ""; + $invAll["$allianceID"]["corporations"]["$corporationID"]["corporationID"] = $corporationID; + $invAll["$allianceID"]["corporations"]["$corporationID"]["involved"] = 0; + } + $involvedCount = $invAll["$allianceID"]["corporations"]["$corporationID"]["involved"]; + $invAll["$allianceID"]["corporations"]["$corporationID"]["involved"] = $involvedCount + 1; + } + uasort($invAll, "involvedSort"); + foreach($invAll as $id=>$alliance) { + $corps = $alliance["corporations"]; + uasort($corps, "involvedSort"); + $invAll["$id"]["corporations"] = $corps; + } + if ($involvedCorpCount <= 1 && $involvedAlliCount <= 1) $invAll = array(); + Cache::set($md5."involvedCorpsAndAllis", $invAll); + return $invAll; + } + + public static function involvedSort($field1, $field2) + { + if ($field1["involved"] == $field2["involved"] && isset($field1["name"]) && isset($field2["name"])) return strcasecmp($field1["name"], $field2["name"]); + return $field2["involved"] - $field1["involved"]; + } + + public static function droppedIsk($md5, $items) + { + $Cache = Cache::get($md5."droppedisk"); + if($Cache) return $Cache; + + $droppedisk = 0; + foreach($items as $dropped) { + $droppedisk += $dropped["price"] * ($dropped["singleton"] ? $dropped["quantityDropped"] / 100 : $dropped["quantityDropped"]); + } + + Cache::set($md5."droppedisk", $droppedisk); + return $droppedisk; + } + + public static function fittedIsk($md5, $items) + { + $key = $md5 . "fittedIsk"; + $cache = Cache::get($key); + if($cache) + return $cache; + + $fittedIsk = 0; + $flags = array("High Slots", "Mid Slots", "Low Slots", "SubSystems", "Rigs", "Drone Bay", "Fuel Bay"); + foreach($items as $item) + { + if(isset($item["flagName"]) && in_array($item["flagName"], $flags)) { + $qty = isset($item["quantityDropped"]) ? $item["quantityDropped"] : 0; + $qty += isset($item["quantityDestroyed"]) ? $item["quantityDestroyed"] : 0; + $fittedIsk = $fittedIsk + ($item["price"] * $qty); + } + } + Cache::set($key, $fittedIsk); + return $fittedIsk; + } +} diff --git a/classes/Disqus.php b/classes/Disqus.php new file mode 100644 index 00000000..ce0d7dbe --- /dev/null +++ b/classes/Disqus.php @@ -0,0 +1,49 @@ + $userID, + "username" => $username, + "email" => $email + ); + + if($characterID) + { + $data["avatar"] = "https://image.eveonline.com/Character/{$characterID}_32.jpg"; + $data["url"] = "{$fullAddr}/character/{$characterID}/"; + } + + $message = base64_encode(json_encode($data)); + $timestamp = time(); + $hmac = hash_hmac("sha1", $message . ' ' . $timestamp, $disqusSecretKey); + + $js = "var disqus_config = function() {\n"; + $js .= " this.page.remote_auth_s3 = '{$message} {$hmac} {$timestamp}';\n"; + $js .= " this.page.api_key = '{$disqusPublicKey}';\n"; + $js .= "\n"; + $js .= " this.sso = {\n"; + $js .= " name: 'zKillboard',\n"; + $js .= " button: '".$fullAddr."/themes/".$theme."/img/disqus_button.png',\n"; + $js .= " icon: '".$fullAddr."/themes/".$theme."/favicon.ico',\n"; + $js .= " url: '".$fullAddr."/dlogin/',\n"; + $js .= " logout: '".$fullAddr."/logout',\n"; + $js .= " width: '300',\n"; + $js .= " height: '245'\n"; + $js .= " };\n"; + $js .= " };"; + + return $js; + } +} diff --git a/classes/Feed.php b/classes/Feed.php new file mode 100644 index 00000000..0bf9e815 --- /dev/null +++ b/classes/Feed.php @@ -0,0 +1,68 @@ + 200) $parameters["limit"] = 200; + if (isset($parameters["page"])) $parameters["limit"] = 200; + if (!isset($parameters["limit"])) $parameters["limit"] = 200; + + $kills = Kills::getKills($parameters, true, false); + + return self::getJSON($kills, $parameters); + } + + /** + * Groups the kills together based on specified parameters + * @static + * @param array|null $kills + * @param array $parameters + * @return array + */ + public static function getJSON($kills, $parameters) + { + if ($kills == null) return array(); + $retValue = array(); + + foreach ($kills as $kill) { + $killID = $kill["killID"]; + $json = Crest2Api::convert($killID); + if (array_key_exists("no-items", $parameters)) unset($json["items"]); + if (isset($json["_stringValue"])) unset($json["_stringValue"]); + if (array_key_exists("finalblow-only", $parameters)) + { + $involved = count($json["attackers"]); + $json["zkb"]["involved"] = $involved; + if (!isset($json["attackers"])) continue; + $data = $json["attackers"]; + unset($json["attackers"]); + foreach($data as $attacker) + if($attacker["finalBlow"] == "1") + $json["attackers"][] = $attacker; + } + elseif (array_key_exists("no-attackers", $parameters)) + { + $involved = count($json["attackers"]); + $json["zkb"]["involved"] = $involved; + unset($json["attackers"]); + } + + $retValue[] = json_encode($json); + } + return $retValue; + } +} diff --git a/classes/Fitting.php b/classes/Fitting.php new file mode 100644 index 00000000..897a2f5b --- /dev/null +++ b/classes/Fitting.php @@ -0,0 +1,106 @@ + (@$item["quantityDropped"] + @$item["quantityDestroyed"])); + } + } + + foreach($fitArray as $key => $item) + { + $fitString .= "$key;".$item["count"].":"; + } + $fitString .= ":"; + return $fitString; + } +} diff --git a/classes/Google.php b/classes/Google.php new file mode 100644 index 00000000..dd5bf15b --- /dev/null +++ b/classes/Google.php @@ -0,0 +1,38 @@ + + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + + ga('create', '".$analyticsID."', '".$analyticsName."'); + ga('send', 'pageview'); + + + "; + return $html; + } + + public static function ad($caPub, $adSlot, $adWidth = 728, $adHeight = 90) + { + $html = ' + + + '; + return $html; + } +} diff --git a/classes/Info.php b/classes/Info.php new file mode 100644 index 00000000..380b04f0 --- /dev/null +++ b/classes/Info.php @@ -0,0 +1,744 @@ +findDoc("information", ['cacheTime' => 1500, 'type' => 'solarSystemID', 'id' => (int) $systemID]); + $data["solarSystemID"] = $data["id"]; + $data["solarSystemName"] = $data["name"]; + $data["security"] = $data["secStatus"]; + $data["sunTypeID"] = 3802; + return $data; + } + + /** + * Fetches information for a wormhole system + * @param int $systemID + * @return array + */ + public static function getWormholeSystemInfo($systemID) + { + if ($systemID < 3100000) return; + return Db::queryRow("select * from ccp_zwormhole_info where solarSystemID = :systemID", + array(":systemID" => $systemID), 3600); + } + + /** + * @static + * @param int $systemID + * @return string The system name of a solarSystemID + */ + public static function getSystemName($systemID) + { + $systemInfo = self::getSystemInfo($systemID); + return $systemInfo['solarSystemName']; + } + + /** + * @static + * @param int $systemID + * @return double The system secruity of a solarSystemID + */ + public static function getSystemSecurity($systemID) + { + $systemInfo = self::getSystemInfo($systemID); + return $systemInfo['security']; + } + + /** + * @static + * @param int $typeID + * @return string The item name. + */ + public static function getItemName($typeID) + { + global $mdb; + $name = $mdb->findField("information", "name", ['cacheTime' => 3600, 'type' => 'typeID', 'id' => (int) $typeID]); + return $name; + } + + /** + * Retrieves the name of a corporation ID + * + * @param string $name + * @return int The corporationID of a corporation + */ + public static function getCorpID($name) + { + global $mdb; + + $id = (int) $mdb->findField("information", "id", ['cacheTime' => 3600, 'type' => 'corporationID', 'name' => "/$name/i"]); + if ($id > 0) return $id; + return 0; + } + + /** + * @param int $allianceID + * @return array + */ + public static function getCorps($allianceID) + { + global $mdb; + + $corpList = $mdb->find("information", ['type' => 'corporationID', 'memberCount' => ['$gt' => 0], 'allianceID' => (int) $allianceID], ['name' => 1]); + + $retList = array(); + foreach ($corpList as $corp) { + $corp["corporationName"] = $corp["name"]; + $corp["corporationID"] = $corp["id"]; + $count = $mdb->count("apiCharacters", ['corporationID' => (int) $corp["id"], 'type' => 'Corporation']); + $corp["apiVerified"] = $count > 0 ? 1 : 0; + + + if ($count) { + $corp["keyCount"] = $mdb->count("apiCharacters", ['corporationID' => (int) $corp["id"], 'type' => 'Corporation']); + $errorValues = array(); + $nextCheck = $mdb->findField("apiCharacters", "cachedUntil", ['type' => 'Corporation', 'corporationID' => (int) $corp["id"]], ['cachedUntil' => -1]); + $corp["cachedUntilTime"] = date("Y-m-d H:i", $nextCheck->sec); + } + else { + $count = $mdb->count("apiCharacters", ['corporationID' => (int) $corp["id"]]); + $percentage = $corp["memberCount"] == 0 ? 0 : $count / $corp["memberCount"]; + if ($percentage == 1) $corp["apiVerified"] = 1; + else if ($percentage > 0) $corp["apiPercentage"] = number_format($percentage * 100, 1); + } + self::addInfo($corp); + $retList[] = $corp; + } + return $retList; + } + + /** + * Gets corporation stats + * @param int $allianceID + * @param array $parameters + * @return array + */ + public static function getCorpStats($allianceID, $parameters) + { + global $mdb; + + $corpList = $mdb->find("information", ['type' => 'corporationID', 'memberCount' => ['$gt' => 0], 'allianceID' => (int) $allianceID], ['name' => 1]); + $statList = array(); + foreach($corpList as $corp) + { + $parameters["corporationID"] = $corp["id"]; + $data = self::getCorpDetails($corp["id"], $parameters); + $statList[$corp["name"]]["corporationName"] = $data["corporationName"]; + $statList[$corp["name"]]["corporationID"] = $data["corporationID"]; + $statList[$corp["name"]]["ticker"] = $data["cticker"]; + $statList[$corp["name"]]["members"] = (int) @$data["memberCount"]; + $statList[$corp["name"]]["ceoName"] = (string) @$data["ceoName"]; + $statList[$corp["name"]]["ceoID"] = (int) @$data["ceoID"]; + $statList[$corp["name"]]["kills"] = $data["shipsDestroyed"]; + $statList[$corp["name"]]["killsIsk"] = $data["iskDestroyed"]; + $statList[$corp["name"]]["killPoints"] = $data["pointsDestroyed"]; + $statList[$corp["name"]]["losses"] = $data["shipsLost"]; + $statList[$corp["name"]]["lossesIsk"] = $data["iskLost"]; + $statList[$corp["name"]]["lossesPoints"] = $data["pointsLost"]; + if($data["iskDestroyed"] != 0 || $data["iskLost"] != 0) + $statList[$corp["name"]]["effeciency"] = $data["iskDestroyed"] / ($data["iskDestroyed"] + $data["iskLost"]) * 100; + else $statList[$corp["name"]]["effeciency"] = 0; + } + return $statList; + } + + /** + * Gets an alliance name + * @param int $id + * @return string + */ + public static function getAlliName($id) + { + global $mdb; + + $name = $mdb->findField("information", "name", ['type' => 'allianceID', 'id' => (int) $id]); + if ($name == null) return "Alliance $id"; + return $name; + } + + /** + * [getFactionTicker description] + * @param string $ticker + * @return string|null + */ + public static function getFactionTicker($ticker) + { + $data = array( + "caldari" => array("factionID" => "500001", "name" => "Caldari State"), + "minmatar" => array("factionID" => "500002", "name" => "Minmatar Republic"), + "amarr" => array("factionID" => "500003", "name" => "Amarr Empire"), + "gallente" => array("factionID" => "500004", "name" => "Gallente Federation") + ); + + if (isset($data[$ticker])) return $data[$ticker]; + return null; + } + + /** + * [getFactionName description] + * @param int $id + * @return string|false + */ + public static function getFactionName($id) + { + global $mdb; + $name = $mdb->findField("information", "name", ['cacheTime' => 3600, 'type' => 'factionID', 'id' => (int) $id]); + if ($name != null) return $name; + return isset($data["name"]) ? $data["name"] : "Faction $id"; + } + + /** + * [getRegionName description] + * @param int $id + * @return string + */ + public static function getRegionName($id) + { + global $mdb; + $data = $mdb->findField("information", "name", ['cacheTime' => 3600, 'type' => 'regionID', 'id' => (int) $id]); + return $data; + } + + /** + * [getRegionInfoFromSystemID description] + * @param int $systemID + * @return array + */ + public static function getRegionInfoFromSystemID($systemID) + { + global $mdb; + + $regionID = (int) $mdb->findField("information", "regionID", ['cacheTime' => 3600, 'type' => 'solarSystemID', 'id' => (int) $systemID]); + + $data = $mdb->findDoc("information", ['cacheTime' => 3600, 'type' => 'regionID', 'id' => $regionID]); + $data["regionID"] = $regionID; + $data["regionName"] = $data["name"]; + return $data; + } + + /** + * Attempt to find the name of a corporation in the corporations table. If not found then attempt to pull the name via an API lookup. + * + * @static + * @param int $id + * @return string The name of the corp if found, null otherwise. + */ + public static function getCorpName($id) + { + global $mdb; + + $name = $mdb->findField("information", "name", ['cacheTime' => 3600, 'type' => 'corporationID', 'id' => (int) $id]); + if ($name != null) return $name; + return "Corporation $id"; + } + + public static function getCorporationTicker($id) + { + global $mdb; + + return $mdb->findField("information", "ticker", ['cacheTime' => 3600, 'type' => 'corporationID', 'id' => (int) $id]); + } + + public static function getAllianceTicker($allianceID) + { + global $mdb; + + $ticker = $mdb->findField("information", "ticker", ['cacheTime' => 3600, 'type' => 'allianceID', 'id' => (int) $allianceID]); + if ($ticker != null) return $ticker; + return ""; + } + + /** + * Attempt to find the name of a character in the characters table. If not found then attempt to pull the name via an API lookup. + * + * @static + * @param int $id + * @return string The name of the corp if found, null otherwise. + */ + public static function getCharName($id) + { + global $mdb; + + $name = $mdb->findField("information", "name", ['cacheTime' => 3600, 'type' => 'characterID', 'id' => (int) $id]); + if ($name != null) return $name; + return "Character $id"; + } + + /** + * Character affiliation + */ + public static function getCharacterAffiliations($characterID) + { + $pheal = Util::getPheal(); + $pheal->scope = "eve"; + + $affiliations = $pheal->CharacterAffiliation(array("ids" => $characterID)); + + $corporationID = $affiliations->characters[0]->corporationID; + $corporationName = $affiliations->characters[0]->corporationName; + $allianceID = $affiliations->characters[0]->allianceID; + $allianceName = $affiliations->characters[0]->allianceName; + + // Get the ticker for corp and alliance + $corporationTicker = Info::getCorporationTicker($corporationID); + $allianceTicker = Info::getAllianceTicker($allianceID); + + return array("corporationID" => $corporationID, "corporationName" => $corporationName, "corporationTicker" => $corporationTicker, "allianceID" => $allianceID, "allianceName" => $allianceName, "allianceTicker" => $allianceTicker); + + } + + /** + * [getGroupID description] + * @param int $id + * @return int + */ + public static function getGroupID($id) + { + global $mdb; + + $groupID = (int) $mdb->findField("information", "groupID", ['cacheTime' => 3600, 'type' => 'typeID', 'id' => (int) $id]); + return $groupID; + } + + /** + * Get the name of the group + * + * @static + * @param int $groupID + * @return string + */ + public static function getGroupName($groupID) + { + global $mdb; + + $name = $mdb->findField("information", "name", ['cacheTime' => 3600, 'type' => 'groupID', 'id' => (int) $groupID]); + return $name; + } + + public static function findEntity($search) + { + $result = Db::query("select * from zz_name_search where name like :search limit 10", ['search' => "$search%"], 3600); + return $result; + } + + /** + * @param string $search + */ + private static function findEntitySearch(&$resultArray, $type, $query, $search) + { + $results = Db::query("${query}", array(":search" => $search), 3600); + self::addResults($resultArray, $type, $results); + } + + /** + * [addResults description] + * @param array $resultArray + * @param string $type + * @param array|null $results + */ + private static function addResults(&$resultArray, $type, $results) + { + if ($results != null) foreach ($results as $result) { + $keys = array_keys($result); + $result["type"] = $type; + $value = $result[$keys[0]]; + $resultArray["$type|$value"] = $result; + } + } + + /** + * Gets a pilots details + * @param int $id + * @return array + */ + public static function getPilotDetails($id, $parameters = array()) + { + global $mdb; + + $data = $mdb->findDoc("information", ['cacheTime' => 1500, 'type' => 'characterID', 'id' => (int) $id]); + if ($data != null) $data["characterID"] = (int) $id; + if ($data != null) $data["characteName"] = $data["name"]; + if ($data == null) $data = []; + + + self::addInfo($data); + $data["isCEO"] = $mdb->exists("information", ['type' => 'corporationID', 'id' => (int) @$data["corporationID"], 'ceoID' => (int) $id]); + $data["isExecutorCEO"] = $mdb->exists("information", ['type' => 'allianceID', 'id' => (int) @$data['allianceID'], 'executorCorpID' => (int) (int) @$data["corporationID"]]); + + $retValue = $parameters == null ? $data : Summary::getPilotSummary($data, $id, $parameters); + return $retValue; + } + + /** + * [getCorpDetails description] + * @param int $id + * @param array $parameters + * @return array + */ + public static function getCorpDetails($id, $parameters = array()) + { + global $mdb; + + $data = $mdb->findDoc("information", ['cacheTime' => 1500, 'type' => 'corporationID', 'id' => (int) $id]); + if ($data != null) $data["corporationID"] = (int) $id; + if ($data != null) $data["corporationName"] = $data["name"]; + if ($data != null) $data["cticker"] = @$data["ticker"]; + + self::addInfo($data); + $retValue = Summary::getCorpSummary($data, $id, $parameters); + + return $retValue; + } + + /** + * [getAlliDetails description] + * @param int $id + * @param array $parameters + * @return array + */ + public static function getAlliDetails($id, $parameters = array()) + { + global $mdb; + + $data = $mdb->findDoc("information", ['cacheTime' => 1500, 'type' => 'allianceID', 'id' => (int) $id]); + if ($data != null) $data["allianceID"] = (int) $id; + if ($data != null) $data["allianceName"] = @$data["name"]; + if ($data != null) $data["aticker"] = @$data["ticker"]; + + self::addInfo($data); + $retValue = Summary::getAlliSummary($data, $id, $parameters); + + return $retValue; + } + + /** + * [getFactionDetails description] + * @param int $id + * @return array + */ + public static function getFactionDetails($id, $parameters = array()) + { + $data["factionID"] = $id; + self::addInfo($data); + return Summary::getFactionSummary($data, $id, $parameters); + } + + /** + * [getSystemDetails description] + * @param int $id + * @return array + */ + public static function getSystemDetails($id, $parameters = array()) + { + $data = array("solarSystemID" => $id); + self::addInfo($data); + $retValue = Summary::getSystemSummary($data, $id, $parameters); + + return $retValue; + } + + /** + * [getRegionDetails description] + * @param int $id + * @return array + */ + public static function getRegionDetails($id, $parameters = array()) + { + $data = array("regionID" => $id); + self::addInfo($data); + return Summary::getRegionSummary($data, $id, $parameters); + } + + /** + * [getGroupDetails description] + * @param int $id + * @return array + */ + public static function getGroupDetails($id) + { + $data = array("groupID" => $id); + self::addInfo($data); + return Summary::getGroupSummary($data, $id); + } + + /** + * [getShipDetails description] + * @param int $id + * @return array + */ + public static function getShipDetails($id) + { + $data = array("shipTypeID" => $id); + self::addInfo($data); + $data["shipTypeName"] = $data["shipName"]; + return Summary::getShipSummary($data, $id); + } + + /** + * [addInfo description] + * @param mixed $element + * @return array|null + */ + public static function addInfo(&$element) + { + global $mdb; + + if ($element == null) return; + foreach ($element as $key => $value) { + $class = is_object($value) ? get_class($value) : null; + if ($class == "MongoId" || $class == "MongoDate") continue; + if (is_array($value)) $element[$key] = self::addInfo($value); + else if ($value != 0) switch ($key) { + case "lastChecked": + $element["lastCheckedTime"] = $value; + break; + case "cachedUntil": + $element["cachedUntilTime"] = $value; + break; + case "dttm": + $dttm = strtotime($value); + $element["ISO8601"] = date("c", $dttm); + $element["killTime"] = date("Y-m-d H:i", $dttm); + $element["MonthDayYear"] = date("F j, Y", $dttm); + break; + case "shipTypeID": + if (!isset($element["shipName"])) $element["shipName"] = self::getItemName($value); + if (!isset($element["groupID"])) $element["groupID"] = self::getGroupID($value); + if (!isset($element["groupName"])) $element["groupName"] = self::getGroupName($element["groupID"]); + break; + case "groupID": + global $loadGroupShips; // ugh + if (!isset($element["groupName"])) $element["groupName"] = self::getGroupName($value); + if ($loadGroupShips && !isset($element["groupShips"]) && !isset($element["noRecursion"])) + { + $groupTypes = $mdb->find("information", ['cacheTime' => 3600, 'type' => 'typeID', 'groupID' => (int) $value], ['name' => 1]); + $element["groupShips"] = []; + foreach ($groupTypes as $type) + { + $type["noRecursion"] = true; + $type["shipName"] = $type["name"]; + $type["shipTypeID"] = $type["id"]; + $element["groupShips"][] = $type; + } + } + break; + case "executorCorpID": + $element["executorCorpName"] = self::getCorpName($value); + break; + case "ceoID": + $element["ceoName"] = self::getCharName($value); + break; + case "characterID": + $element["characterName"] = self::getCharName($value); + break; + case "corporationID": + $element["corporationName"] = self::getCorpName($value); + break; + case "allianceID": + $element["allianceName"] = self::getAlliName($value); + break; + case "factionID": + $element["factionName"] = self::getFactionName($value); + break; + case "weaponTypeID": + $element["weaponTypeName"] = self::getItemName($value); + break; + case "typeID": + if (!isset($element["typeName"])) $element["typeName"] = self::getItemName($value); + $groupID = self::getGroupID($value); + if (!isset($element["groupID"])) $element["groupID"] = $groupID; + if (!isset($element["groupName"])) $element["groupName"] = self::getGroupName($groupID); + break; + case "solarSystemID": + $info = self::getSystemInfo($value); + if (sizeof($info)) { + $element["solarSystemName"] = $info["solarSystemName"]; + $element["sunTypeID"] = $info["sunTypeID"]; + $securityLevel = number_format($info["security"], 1); + if ($securityLevel == 0 && $info["security"] > 0) $securityLevel = 0.1; + $element["solarSystemSecurity"] = $securityLevel; + $element["systemColorCode"] = self::getSystemColorCode($securityLevel); + $regionInfo = self::getRegionInfoFromSystemID($value); + $element["regionID"] = $regionInfo["regionID"]; + $element["regionName"] = $regionInfo["regionName"]; + $wspaceInfo = self::getWormholeSystemInfo($value); + if ($wspaceInfo) { + $element["systemClass"] = $wspaceInfo["class"]; + $element["systemEffect"] = $wspaceInfo["effectName"]; + } + } + break; + case "regionID": + $element["regionName"] = self::getRegionName($value); + break; + case "flag": + $element["flagName"] = self::getFlagName($value); + break; + } + } + return $element; + } + + /** + * [getSystemColorCode description] + * @param int $securityLevel + * @return string + */ + public static function getSystemColorCode($securityLevel) + { + $sec = number_format($securityLevel, 1); + switch ($sec) { + case 1.0: + return "#33F9F9"; + case 0.9: + return "#4BF3C3"; + case 0.8: + return "#02F34B"; + case 0.7: + return "#00FF00"; + case 0.6: + return "#96F933"; + case 0.5: + return "#F5F501"; + case 0.4: + return "#E58000"; + case 0.3: + return "#F66301"; + case 0.2: + return "#EB4903"; + case 0.1: + return "#DC3201"; + default: + case 0.0: + return "#F30202"; + } + return ""; + } + + + public static $effectFitToSlot = array( + "12" => "High Slots", + "13" => "Mid Slots", + "11" => "Low Slots", + "2663" => "Rigs", + "3772" => "SubSystems", + "87" => "Drone Bay",); + + /** + * [$effectToSlot description] + * @var array + */ + public static $effectToSlot = array( + "12" => "High Slots", + "13" => "Mid Slots", + "11" => "Low Slots", + "2663" => "Rigs", + "3772" => "SubSystems", + "87" => "Drone Bay", + "5" => "Cargo", + "4" => "Corporate Hangar", + "0" => "Corporate Hangar", // Yes, two spaces, flag 0 is wierd and should be 4 + "89" => "Implants", + "133" => "Fuel Bay", + "134" => "Ore Hold", + "136" => "Mineral Hold", + "137" => "Salvage Hold", + "138" => "Specialized Ship Hold", + "90" => "Ship Hangar", + "148" => "Command Center Hold", + "149" => "Planetary Commodities Hold", + "151" => "Material Bay", + "154" => "Quafe Bay", + "155" => "Fleet Hangar", + ); + + /** + * [$infernoFlags description] + * @var array + */ + private static $infernoFlags = array( + 4 => array(116, 121), + 12 => array(27, 34), // Highs + 13 => array(19, 26), // Mids + 11 => array(11, 18), // Lows + 2663 => array(92, 98), // Rigs + 3772 => array(125, 132), // Subs + ); + + /** + * [getFlagName description] + * @param string $flag + * @return string + */ + public static function getFlagName($flag) + { + // Assuming Inferno Flags + $flagGroup = 0; + foreach (self::$infernoFlags as $infernoFlagGroup => $array) { + $low = $array[0]; + $high = $array[1]; + if ($flag >= $low && $flag <= $high) $flagGroup = $infernoFlagGroup; + if ($flagGroup != 0) return self::$effectToSlot["$flagGroup"]; + } + if ($flagGroup == 0 && array_key_exists($flag, self::$effectToSlot)) return self::$effectToSlot["$flag"]; + if ($flagGroup == 0 && $flag == 0) return "Corporate Hangar"; + if ($flagGroup == 0) return null; + return self::$effectToSlot["$flagGroup"]; + } + + /** + * [getSlotCounts description] + * @param int $shipTypeID + * @return array + */ + public static function getSlotCounts($shipTypeID) + { + $result = Db::query("select attributeID, valueInt, valueFloat from ccp_dgmTypeAttributes where typeID = :typeID and attributeID in (12, 13, 14, 1137)", + array(":typeID" => $shipTypeID), 86400); + $slotArray = array(); + foreach ($result as $row) { + if($row["valueInt"] == NULL && $row["valueFloat"] != NULL) + $value = $row["valueFloat"]; + elseif($row["valueInt"] != NULL && $row["valueFloat"] == NULL) + $value = $row["valueInt"]; + else + $value = NULL; + + if ($row["attributeID"] == 12) $slotArray["lowSlotCount"] = $value; + else if ($row["attributeID"] == 13) $slotArray["midSlotCount"] = $value; + else if ($row["attributeID"] == 14) $slotArray["highSlotCount"] = $value; + else if ($row["attributeID"] == 1137) $slotArray["rigSlotCount"] = $value; + } + return $slotArray; + } + + /** + * @param string $title + * @param string $field + * @param array $array + */ + public static function doMakeCommon($title, $field, $array) { + $retArray = array(); + $retArray["type"] = str_replace("ID", "", $field); + $retArray["title"] = $title; + $retArray["values"] = array(); + foreach($array as $row) { + $data = $row; + $data["id"] = $row[$field]; + if (isset($row[$retArray["type"] . "Name"])) $data["name"] = $row[$retArray["type"] . "Name"]; + else if(isset($row["shipName"])) $data["name"] = $row["shipName"]; + $data["kills"] = $row["kills"]; + $retArray["values"][] = $data; + } + return $retArray; + } +} diff --git a/classes/Killmail.php b/classes/Killmail.php new file mode 100644 index 00000000..79636eaf --- /dev/null +++ b/classes/Killmail.php @@ -0,0 +1,93 @@ + $killID)); + if ($kill != '') + { + Cache::set("Kill$killID", $kill); + return $kill; + } + return null; // No such kill in database + } + + public static function put($killID, $raw) + { + $file = static::getFile($killID, true); + + $sem = sem_get(5632); // kmdb is 5632 on a phone + if (!sem_acquire($sem)) throw new Exception("Unable to obtain kmdb semaphore"); + + // Thread safe from here until sem_release + if (!file_exists($file)) $kills = array(); + else + { + $contents = file_get_contents($file); + $deflated = gzdecode($contents); + $kills = unserialize($deflated); + $contents = null; + } + if (!isset($kills["$killID"])) + { + $kills["$killID"] = $raw; + $contents = serialize($kills); + $compressed = gzencode($contents); + file_put_contents($file, $compressed, LOCK_EX); + } + sem_release($sem); + } + + // https://forums.eveonline.com/default.aspx?g=posts&m=4900335#post4900335 + public static function getCrestHash($killID, $killmail = null) + { + if ($killmail == null) $killmail = json_decode(Killmail::get($killID), true); + + $victim = $killmail["victim"]; + $victimID = $victim["characterID"] == 0 ? "None" : $victim["characterID"]; + + $attackers = $killmail["attackers"]; + $attacker = null; + if ($attackers != null) foreach($attackers as $att) + { + if ($att["finalBlow"] != 0) $attacker = $att; + } + if ($attacker == null) $attacker = $attackers[0]; + $attackerID = $attacker["characterID"] == 0 ? "None" : $attacker["characterID"]; + + $shipTypeID = $victim["shipTypeID"]; + + $dttm = (strtotime($killmail["killTime"]) * 10000000) + 116444736000000000; + + $string = "$victimID$attackerID$shipTypeID$dttm"; + + $sha = sha1($string); + return $sha; + } + + protected static function getFile($killID, $createDir = false) + { + global $baseDir; + $kmBase = "$baseDir/kmdb/"; + + $id = $killID; + $botDir = abs($id % 1000); + while (strlen("$botDir") < 3) $botDir = "0" . $botDir; + $id = (int) $id / 1000; + $midDir = abs($id % 1000); + while (strlen("$midDir") < 3) $midDir = "0" . $midDir; + $id = (int) $id / 1000; + $topDir = $id % 1000; + + while (strlen("$topDir") < 4) $topDir = "0" . $topDir; + $dir = "$kmBase/d$topDir/"; + if ($createDir) @mkdir($dir, 0700, true); + + $file = "$dir/k$midDir.gz"; + return $file; + } +} diff --git a/classes/Kills.php b/classes/Kills.php new file mode 100644 index 00000000..73ab537e --- /dev/null +++ b/classes/Kills.php @@ -0,0 +1,196 @@ +findDoc("killmails", ['killID' => $killID, 'cacheTime' => 3600]); + Info::addInfo($killmail); + $killmail["victim"] = $killmail["involved"][0]; + $killmail["victim"]["killID"] = $killID; + foreach($killmail["involved"] as $inv) if (@$inv["finalBlow"] === true) $killmail["finalBlow"] = $inv; + $killmail["finalBlow"]["killID"] = $killID; + unset($killmail["_id"]); + + Cache::set($killHashKey, $killmail, 3600); + } + $details[$killID] = $killmail; + } + Cache::set($hashKey, $details, 60); + return $details; + } + + /** + * Merges killmail arrays + * + * @param $array1 + * @param string $type + * @param $array2 + * @return array + */ + private static function killMerge($array1, $type, $array2) + { + foreach ($array2 as $element) { + $killid = $element["killID"]; + Info::addInfo($element); + if (!isset($array1[$killid])) $array1[$killid] = array(); + $array1[$killid][$type] = $element; + $array1[$killid][$type]["commentID"] = $killid; + } + return $array1; + } + + /** + * Gets details for a kill + * + * @param $killID the killID of the kill you want details for + * @return array + */ + public static function getKillDetails($killID) + { + global $mdb; + $killmail = $mdb->findDoc("killmails", ['killID' => (int) $killID]); + $rawmail = $mdb->findDoc("rawmails", ['killID' => (int) $killID]); + $damage = (int) $rawmail["victim"]["damageTaken"]; + $killmail["damage"] = $damage; + + $killmail["dttm"] = date("Y-m-d G:i", $killmail["dttm"]->sec); + Info::addInfo($killmail); + + $victim = $killmail["involved"][0]; + $victim["damage"] = $damage; + + $kill = $victim; + $involved = $killmail["involved"]; + array_shift($involved); // remove the victim + + $items = self::getItems($rawmail, $killmail); + + $infoInvolved = array(); + $infoItems = array(); + + $rawmailInv = $rawmail["attackers"]; + $attackerCount = sizeof($rawmailInv); + $killmail["number_involved"] = $attackerCount; + + for ($index = 0; $index < $attackerCount; $index++) + { + $rawI = $rawmailInv[$index]; + $i = $involved[$index]; + $i["damage"] = $rawI["damageDone"]; + $i["weaponTypeID"] = @$rawI["weaponType"]["id"]; + $infoInvolved[] = Info::addInfo($i); + } + + unset($involved); + foreach ($items as $i) $infoItems[] = Info::addInfo($i); + unset($items); + + return array("info" => $killmail, "victim" => $victim, "involved" => $infoInvolved, "items" => $infoItems); + } + + public static function getItems(&$rawmail, &$killmail) + { + $killTime = $killmail["killTime"]; + $items = array(); + self::addItems($items, $rawmail["victim"]["items"], $killTime); + return $items; + } + + public static function addItems(&$itemArray, $items, $killTime, $inContainer = 0, $parentFlag = 0) { + if ($items == null) return; + if (is_array($items)) foreach ($items as $item) { + $typeID = $item["itemType"]["id"]; + $item["typeID"] = $typeID; + $item["price"] = Price::getItemPrice($typeID, $killTime); + $item["inContainer"] = $inContainer; + if ($inContainer) $item["flag"] = $parentFlag; + if ($inContainer && strpos(Info::getItemName($typeID), "Blueprint")) $item["singleton"] = 2; + unset($item["_stringValue"]); + $itemArray[] = $item; + $subItems = isset($item["items"]) ? $item["items"] : null; + unset($item["items"]); + if ($subItems != null) self::addItems($itemArray, $subItems, $killTime, 1, $item["flag"]); + } + } + + /** + * Merges two kill arrays together + * + * @param $array1 + * @param $array2 + * @param $maxSize + * @param $key + * @param $id + * @return array + */ + public static function mergeKillArrays($array1, $array2, $maxSize, $key, $id) + { + $maxSize = max(0, $maxSize); + $resultArray = array_diff_key($array1, $array2) + $array2; + while (sizeof($resultArray) > $maxSize) array_pop($resultArray); + foreach ($resultArray as $killID => $kill) { + if (!isset($kill["victim"])) continue; + $victim = $kill["victim"]; + if (@$victim[$key] == $id) $kill["displayAsLoss"] = true; + else $kill["displayAsKill"] = true; + $resultArray[$killID] = $kill; + } + return $resultArray; + } + + /** + * Returns an array of the kill + * + * @param $killID the ID of the kill + * @return array + */ + public static function getArray($killID) + { + $jsonRaw = Killmail::get($killID); + $decode = json_decode($jsonRaw, true); + $killarray = Info::addInfo($decode); + return $killarray; + } + + /** + * Returns json of the kill + * + * @param $killID the ID of the kill + * @return string + */ + public static function getJson($killID) + { + $jsonRaw = Killmail::get($killID); + $decoded = json_decode($jsonRaw, true); + $killarray = Info::addInfo($decoded); + return json_encode($killarray); + } +} diff --git a/classes/Mdb.php b/classes/Mdb.php new file mode 100644 index 00000000..68f9e277 --- /dev/null +++ b/classes/Mdb.php @@ -0,0 +1,237 @@ + true]; + private $multi = ['multiple' => true]; + + /* + Return a connection to the Mongo Database + */ + public function getDb($attempt = 0) + { + try + { + if ($this->mongoClient == null) $this->mongoClient = new MongoClient(); + if ($this->db == null) $this->db = $this->mongoClient->selectDB("zkillboard"); + + $this->queryCount++; + return $this->db; + } catch (Exception $ex) + { + if ($attempt >= 10) throw $ex; + $attempt++; + sleep($attempt); + return self::getDb($attempt); + } + } + + /* + Return the specified collection from the mongodb + */ + public function getCollection($collection) + { + $db = $this->getDb(); + return $db->$collection; + } + + /* + Returns the number of queries performed by this instance + */ + public function getQueryCount() + { + return $this->queryCount; + } + + /* + Returns a MongoDate object with a time of now plus delta + Delta is in seconds + To go back one hour call now(-3600) + */ + public function now($delta = 0) + { + return new MongoDate(time() + $delta); + } + + /* + Returns a count of the number of documents within a collection using the optinal query + */ + public function count($collection, $query = []) + { + $collection = $this->getCollection($collection); + return $collection->find($query)->timeout(-1)->count(); + } + + public function exists($collection, $query) + { + $collection = $this->getCollection($collection); + $cursor = $collection->find($query); + return $cursor->hasNext(); + } + + public function insert($collection, $values) + { + return $this->getCollection($collection)->insert($values); + } + + public function save($collection, $document) + { + return $this->getCollection($collection)->save($document); + } + + public function removeField($collection, $key, $value) + { + return $this->getCollection($collection)->update($key, ['$unset' => [$value => 1]]); + } + + public function set($collection, $key, $value, $multi = false) + { + return $this->getCollection($collection)->update($key, ['$set' => $value], ['multiple' => $multi]); + } + + + public function remove($collection, $key) + { + return $this->getCollection($collection)->remove($key); + } + + /* + Returns a result as an array of documents based on the given query, includes, sort, and limit + */ + public function find($collection, $query = [], $sort = [], $limit = null, $includes = []) + { + $cacheKey = null; + $cacheTime = isset($query["cacheTime"]) ? $query["cacheTime"] : 0; + unset($query["cacheTime"]); // reserved zkb field for caching doesn't need to be in queries + $serialized = "Mdb::find|$collection|" . serialize($query) . "|" . serialize($sort) . "|$limit|" . serialize($includes); + $cacheKey = $serialized; + if ($cacheTime > 0) + { + $cached = Cache::get($cacheKey); + if ($cached != null) return $cached; + } + if (php_sapi_name() != "cli" && $cacheTime == 0) + { + $params = "$collection|" . serialize($query) . "|" . serialize($sort) . "|$limit|" . serialize($includes); + } + + $timer = new Timer(); + $collection = $this->getCollection($collection); + $cursor = $collection->find($query, $includes); + + // Set an appropriate timeout for the query + if (php_sapi_name() == 'cli') $cursor->timeout(-1); + else $cursor->timeout(35000); + + // Set the sort and limit... + if (sizeof($sort)) $cursor->sort($sort); + if ($limit != null) $cursor->limit($limit); + $result = iterator_to_array($cursor); + $time = $timer->stop(); + //if ($time > 1000) Log::log("Long query (${time}ms): $serialized"); + + if ($cacheTime > 0 && sizeof($result) > 0) Cache::set($cacheKey, $result, $cacheTime); + + return $result; + } + + /* + Returns a result as a single document based on the given query, includes, snd sort + */ + public function findDoc($collection, $query = [], $sort = [], $includes = []) + { + // https://blog.serverdensity.com/checking-if-a-document-exists-mongodb-slow-findone-vs-find/ + // Using findOne is very slow if the document doesn't exist, so we'll use the existing find code + $result = $this->find($collection, $query, $sort, 1, $includes); + return array_shift($result); + } + + /* + Returns a single key's value from a single document based on the given query, includes, snd sort + */ + public function findField($collection, $field, $query = [], $sort = []) + { + $includes[$field] = 1; + $result = $this->findDoc($collection, $query, $sort, $includes); + return @$result[$field]; + } + + /* + Inserts a single row to a collection if the matching keys do not exist. If the matching keys + do exist, update the values accordingly. + */ + public function insertUpdate($collection, $keys, $values = []) + { + return $this->getCollection($collection)->findAndModify($keys, (sizeof($values) ? ['$set' => $values] : $keys), $this->emptyArray, ['upsert' => true]); + } + + public static function group($collection, $keys = [], $query = [], $count = [], $sum = [], $sort = [], $limit = null) + { + global $debug; + + // Turn keys into an array if is isn't already an array + if (!is_array($keys)) $keys = [$keys]; + + // Start the aggregation pipeline with the query + $pipeline = []; + if (sizeof($query)) $pipeline[] = [ '$match' => $query]; + + // Create the group by using the given key(s) + $ids = []; + foreach ($keys as $key=>$value) + { + if (is_numeric($key)) $ids[] = '$' . $value; + else $ids[$key] = ['$' . $key => '$' . $value]; + } + if (sizeof($ids) == 1 && isset($ids[0])) $ids = $ids[0]; + $group['_id'] = $ids; + + // If no counts or sums are given, assume a count based on the keys for the $group + if (sizeof($count) == 0 && sizeof($sum) == 0) $group['count'] = [ '$sum' => 1]; + + // Include counts in the $group + if (!is_array($count)) $count = [$count]; + foreach($count as $s) $group[str_replace(".", "_", $s) . 'Count'] = [ '$sum' => 1]; + + // Include sums in the $group + if (!is_array($sum)) $sum = [$sum]; + foreach($sum as $s) $group[str_replace(".", "_", $s) . 'Sum'] = [ '$sum' => '$' . $s]; + + // Add the group to the pipeline + $pipeline[] = ['$group' => $group]; + + // $project the keys into the result + $project['_id'] = 0; + foreach ($keys as $key=>$value) + { + if (is_numeric($key)) $project[$value] = '$_id'; + else $project[$key] = '$_id.' . $key; + } + if (sizeof($count) == 0 && sizeof($sum) == 0) $project['count'] = 1; + if (sizeof($count) > 0) foreach($count as $s) $project[str_replace(".", "_", $s) . 'Count'] = 1; + if (sizeof($sum) > 0) foreach($sum as $s) $project[str_replace(".", "_", $s) . 'Sum'] = 1; + $pipeline[] = ['$project' => $project]; + + // Assign the sort to the pipeline + if (sizeof($sort) > 0) $pipeline[] = ['$sort' => $sort]; + // And add the limit + if ($limit != null) $pipeline[] = ['$limit' => (int) $limit]; + //if ($debug) print_r($pipeline); + + // Prep the cursor + $mdb = new Mdb(); + $collection = $mdb->getCollection($collection); + if (!$debug) MongoCursor::$timeout = -1; // this should be deprecated but aggregate doesn't have a timeout + // Execute the query + $result = $collection->aggregate($pipeline); + if ($result["ok"] == 1) return $result["result"]; + throw new Exception("pipeline query failure"); + } +} + diff --git a/classes/Moderator.php b/classes/Moderator.php new file mode 100644 index 00000000..3981e757 --- /dev/null +++ b/classes/Moderator.php @@ -0,0 +1,29 @@ + $userID),0); // should this be star + return $info; + } + + public static function getUsers($page){ + if (!User::isModerator() and !User::isAdmin()) throw new Exception("Invalid Access!"); + $limit = 30; + $offset = ($page - 1) * $limit; + $users = Db::query("SELECT * FROM zz_users ORDER BY id LIMIT $offset, $limit", array(), 0); + return $users; + } + +} diff --git a/classes/MongoFilter.php b/classes/MongoFilter.php new file mode 100644 index 00000000..a172cece --- /dev/null +++ b/classes/MongoFilter.php @@ -0,0 +1,278 @@ + 200) $limit = 200; + if ($limit < 1) $limit = 1; + $page = isset($parameters["page"]) ? ($parameters["page"] == 0 ? 0 : $parameters["page"] - 1) : 0; + + $hashKey = "MongoFilter::getKills:" . serialize($parameters) . ":$limit:$page"; + $result = Cache::get($hashKey); + //if ($result != null) return $result; + + // Build the query parameters + $query = self::buildQuery($parameters); + if ($query === null) return null; + + // Start the query + $killmails = $mdb->getCollection("killmails"); + $cursor = $killmails->find($query, ['_id' => 0, 'killID' => 1 ])->timeout(-1); //->timeout(25000); + + // Apply the sort order + $sortDirection = isset($parameters["orderDirection"]) ? ($parameters["orderDirection"] == "asc" ? 1 : -1 ) : -1; + $sortKey = isset($parameters["orderBy"]) ? $parameters["orderBy"] : "killID"; + $cursor->sort([$sortKey => $sortDirection]); + + // Apply the limit + $limit = isset($parameters["limit"]) ? (int) $parameters["limit"] : 50; + if ($limit > 200) $limit = 200; + if ($limit < 1) $limit = 1; + if ($page > 0) $cursor->skip($page * $limit); + $cursor->limit($limit); + + $result = array(); + foreach($cursor as $row) $result[] = $row; + + Cache::set($hashKey, $result, 30); + + return $result; + } + + public static function buildQuery(&$parameters, $useElemMatch = true) + { + global $mdb; + + $elemMatch = []; + $and = []; + + foreach ($parameters as $key=>$value) + { + if (is_array($value)) $filter = ['$in' => $value]; + else $filter = $value; + switch ($key) + { + case "week": + case "xml": + case "cacheTime": + case "exHours": + case "apionly": + case "no-attackers": + case "no-items": + case "api": + case "apionly": + case "api-only": + case "api_only": + case "kill": + case "page": + case "limit": + case "combined": + case "mixed": + case "asc": + case "desc": + case "orderDirection": + break; + default: + if (is_numeric($key)) break; + if (strpos($key, ",") !== false) break; + error_log(date("Ymd H:i:s") . " Unknown flag $key\n", 3, "/var/www/zkillboard.com/cache/mf.log"); + //return array("giving up $key"); + break; + case "year": + $start = strtotime("$value-01-01"); + $end = strtotime("$value-12-31"); + $startKillID = self::getKillIDFromTime($start, 1); + $endKillID = self::getKillIDFromTime($end, -1); + $and[] = ['killID' => [ '$gte' => $startKillID]]; + if ($endKillID > 0) $and[] = ['killID' => [ '$lte' => $endKillID]]; + break; + case "month": + $year = $parameters["year"]; + $start = strtotime("$year-$value-01"); + $nextMonth = $value + 1; + $end = strtotime("$year-$nextMonth-01"); + $startKillID = self::getKillIDFromTime($start, 1); + $endKillID = self::getKillIDFromTime($end, -1); + $and[] = ['killID' => [ '$gte' => $startKillID]]; + if ($endKillID > 0) $and[] = ['killID' => [ '$lt' => $endKillID]]; + break; + case "relatedTime": + $time = strtotime($value); + $exHours = isset($parameters["exHours"]) ? (int) $parameters["exHours"] : 1; + $startKillID = self::getKillIDFromTime($time - ($exHours * 3600), 1); + $endKillID = self::getKillIDFromTime($time + ($exHours * 3600), -1); + $and[] = ['killID' => [ '$gte' => $startKillID]]; + $and[] = ['killID' => [ '$lte' => $endKillID]]; + break; + case "pastSeconds": + $prevKillID = self::getKillIDFromTime(time() - $value); + $and[] = ['killID' => ['$gte' => $prevKillID]]; + break; + case "beforeKillID": + $and[] = ['killID' => [ '$lt' => ((int) $value ) ]]; + break; + case "afterKillID": + $and[] = ['killID' => [ '$gt' => ((int) $value ) ]]; + break; + case "war": + case "warID": + $and[] = ['warID' => (int) $filter]; + break; + case "killID": + $and[] = ['killID' => (int) $filter]; + break; + case "iskValue": + $and[] = ['zkb.totalValue' => [ '$gte' => ((double) $value )]]; + break; + case "victim": + case "reset": + if (sizeof($elemMatch)) + { + $and[] = ['involved' => ['$elemMatch' => $elemMatch]]; + $elemMatch = []; + } + break; + case "kills": + if ($value == false) break; + if ($useElemMatch) $elemMatch["isVictim"] = false; + else $and[] = ["involved.isVictim" => false]; + break; + case "losses": + if ($useElemMatch) $elemMatch["isVictim"] = true; + else $and[] = ["involved.isVictim" => true]; + break; + case "finalblow-only": + if ($useElemMatch) $elemMatch["finalBlow"] = true; + else $and[] = ["involved.finalBlow" => true]; + break; + case "allianceID": + case "characterID": + case "corporationID": + case "groupID": + case "factionID": + case "shipTypeID": + case "isVictim": + if ($useElemMatch) $elemMatch[$key] = $filter; + else $and[] = ["involved." . $key => $filter]; + break; + case 'regionID': + case "solarSystemID": + $and[] = ['system.' . $key => $filter]; + break; + case "awox": + $and[] = ['awox' => true]; + break; + case "solo": + $and[] = ['solo' => true]; + break; + case "startTime": + $killID = self::getKillIDFromDttm($value, 1); + $and[] = ['killID' => ['$gte' => $killID ]]; + $parameters["orderDirection"] = "asc"; + break; + case "endTime": + $killID = self::getKillIDFromDttm($value, 1); + $and[] = ['killID' => ['$lte' => $killID ]]; + break; + case "orderBy": + // handled by sort, can be ignored + break; + case "w-space": + $and[] = ['system.regionID' => ['$gte' => 11000001]]; + $and[] = ['system.regionID' => ['$lte' => 11000032]]; + break; + case "highsec": + $and[] = ['system.security' => ['$gte' => 0.45]]; + break; + case "lowsec": + $and[] = ['system.security' => ['$lt' => 0.45]]; + $and[] = ['system.security' => ['$gte' => 0.05]]; + break; + case "nullsec": + $and[] = ['system.security' => ['$lt' => 0.05]]; + break; + case "afterSequence": + $and[] = ['sequence' => ['$gt' => $value]]; + break; + case 'beforeSequence': + $and[] = ['sequence' => ['$lt' => $value]]; + break; + } + } + + // Add elemMatch to the $and statement + if (sizeof($elemMatch) > 0) $and[] = ['involved' => ['$elemMatch' => $elemMatch]]; + + // Prep the query, not using $and if it isn't needed + $query = array(); + if (sizeof($and) == 1) $query = $and[0]; + else if (sizeof($and) > 1) $query = ['$and' => $and]; + + return $query; + } + + public static function getKillIDFromTime($time, $sort = 1) + { + global $mdb; + + $start = null; + $end = null; + if ($sort == 1) + { + $start = $time; + $end = $time + 9600; + } else + { + $start = $time - 9600; + $end = $time; + } + + $begin = new MongoDate($start); + $final = new MongoDate($end); + + $killmails = $mdb->getCollection("killmails"); + $query = ['$and' => [[ 'dttm' => [ '$gte' => $begin]], [ 'dttm' => ['$lte' => $final ]]]]; + $result = $killmails->find($query, ['_id' => 0, 'killID' => true])->sort(['killID' => $sort])->limit(1); + foreach ($result as $row) + { + return $row["killID"]; + } + return 0; + } + + public static function getKillIDFromDttm($dttm, $sort) + { + global $mdb; + + if (is_string($dttm)) $time = strtotime($dttm); + else $time = $dttm; + + $start = null; + $end = null; + if ($sort == 1) + { + $start = $time; + $end = $time + 9600; + } else + { + $start = $time - 9600; + $end = $time; + } + + $begin = new MongoDate($start); + $final = new MongoDate($end); + + $killmails = $mdb->getCollection("killmails"); + $query = ['$and' => [[ 'dttm' => [ '$gte' => $begin]], [ 'dttm' => ['$lte' => $final ]]]]; + $result = $killmails->find($query, ['_id' => 0, 'killID' => true])->sort(['killID' => $sort])->limit(1); + foreach ($result as $row) + { + return $row["killID"]; + } + return 0; + } +} diff --git a/classes/Password.php b/classes/Password.php new file mode 100644 index 00000000..c8be874d --- /dev/null +++ b/classes/Password.php @@ -0,0 +1,42 @@ + $password, ":userID" => $userID)); + return "Updated password"; + } + + /** + * @param string $plainTextPassword + */ + public static function checkPassword($plainTextPassword, $storedPassword = NULL) + { + if($plainTextPassword && $storedPassword) + return self::pwCheck($plainTextPassword, $storedPassword); + else + { + $userID = user::getUserID(); + if($userID) + { + $storedPw = Db::queryField("SELECT password FROM zz_users WHERE id = :userID", "password", array(":userID" => $userID), 0); + return self::pwCheck($plainTextPassword, $storedPw); + } + } + } + + private static function pwCheck($plainTextPassword, $storedPassword) + { + if (!password_verify($plainTextPassword, $storedPassword)) + return false; + return true; + } +} diff --git a/classes/Points.php b/classes/Points.php new file mode 100644 index 00000000..ff3e35dd --- /dev/null +++ b/classes/Points.php @@ -0,0 +1,121 @@ + array("Assault Ship", 100), + 397 => array("Assembly Array", 10), + 1201 => array('Attack Battlecruiser', 300), + 419 => array("Battlecruiser", 250), + 27 => array("Battleship", 750), + 898 => array("Black Ops", 1800), + 1202 => array("Blockade Runner", 125), + 883 => array("Capital Industrial Ship", 1000), + 29 => array("Capsule", 5), + 547 => array("Carrier", 3000), + 906 => array("Combat Recon Ship", 350), + 540 => array("Command Ship", 450), + 365 => array("Control Tower", 250), + 471 => array("Corporate Hangar Array", 50), + 830 => array("Covert Ops", 80), + 26 => array("Cruiser", 100), + 838 => array("Cynosural Generator Array", 10), + 839 => array("Cynosural System Jammer", 50), + 420 => array("Destroyer", 60), + 485 => array("Dreadnought", 4000), + 893 => array("Electronic Attack Ship", 200), + 439 => array("Electronic Warfare Battery", 50), + 837 => array("Energy Neutralizing Battery", 50), + 543 => array("Exhumer", 20), + 833 => array("Force Recon Ship", 350), + 513 => array("Freighter", 300), + 25 => array("Frigate", 50), + 358 => array("Heavy Assault Ship", 400), + 894 => array("Heavy Interdictor", 600), + 28 => array("Industrial", 20), + 941 => array("Industrial Command Ship", 800), + 1012 => array("Infrastructure Hubs", 500), + 831 => array("Interceptor", 60), + 541 => array("Interdictor", 60), + 902 => array("Jump Freighter", 500), + 707 => array("Jump Portal Array", 10), + 832 => array("Logistics", 175), + 900 => array("Marauder", 1000), + 463 => array("Mining Barge", 20), + 449 => array("Mobile Hybrid Sentry", 10), + 413 => array("Mobile Laboratory", 10), + 430 => array("Mobile Laser Sentry", 10), + 417 => array("Mobile Missile Sentry", 10), + 426 => array("Mobile Projectile Sentry", 10), + 438 => array("Mobile Reactor", 10), + 416 => array("Moon Mining", 10), + 1106 => array("Orbital Construction Platform", 5), + 1025 => array("Orbital Infrastructure", 500), + 1022 => array("Prototype Exploration Ship", 5), + 311 => array("Refining Array", 10), + 237 => array("Rookie ship", 5), + 709 => array("Scanner Array", 10), + 440 => array("Sensor Dampening Battery", 10), + 444 => array("Shield Hardening Array", 10), + 363 => array("Ship Maintenance Array", 10), + 31 => array("Shuttle", 5), + 404 => array("Silo", 10), + 1005 => array("Sovereignty Blockade Units", 250), + 441 => array("Stasis Webification Battery", 10), + 834 => array("Stealth Bomber", 80), + 963 => array("Strategic Cruiser", 750), + 659 => array("Supercarrier", 6000), + 1305 => array("Tactical Destroyer", 450), + 1003 => array("Territorial Claim Units", 500), + 30 => array("Titan", 20000), + 473 => array("Tracking Array", 10), + 380 => array("Transport Ship", 30), + 443 => array("Warp Scrambling Battery", 10), + ); + + public static function getPointValues() + { + return self::$pointsArray; + } + + public static function getPoints($groupID) + { + if (!isset(self::$pointsArray[$groupID])) return 0; + $arr = self::$pointsArray[$groupID]; + if (!isset($arr[1])) return 0; + return $arr[1]; + } + + public static function updatePoints($killID, $tempTables = false) + { + return 1; + } + + public static function calculatePoints($killID, $tempTables = false) + { + return 1; + } + + public static function getKillPoints($kill, $price) + { + $vicpoints = self::getPoints($kill["involved"]["0"]["groupID"]); + $vicpoints += $price / 10000000; + $maxpoints = round($vicpoints * 1.2); + + $invpoints = 0; + foreach ($kill["involved"] as $key=>$inv) + { + if ($key == 0) continue; + $invpoints += isset($inv["groupID"]) ? self::getPoints($inv["groupID"]) : 1; + } + + if (($vicpoints + $invpoints) == 0) return 0; + $gankfactor = $vicpoints / ($vicpoints + $invpoints); + $points = ceil($vicpoints * ($gankfactor / 0.75)); + + if ($points > $maxpoints) $points = $maxpoints; + $points = $points / (sizeof($kill["involved"]) - 1); + + return (int) max(1, round($points, 0)); // a kill is always worth at least one point + } +} diff --git a/classes/Price.php b/classes/Price.php new file mode 100644 index 00000000..97252bdb --- /dev/null +++ b/classes/Price.php @@ -0,0 +1,166 @@ += date_sub(:date, interval 3 day) and priceDate <= :date", "avgPrice", array(":typeID" => $typeID, ":date" => $date), 3600); + if ($price == 0) $price = Db::queryField("select avgPrice from zz_item_price_lookup where typeID = :typeID order by abs(datediff(date(date_sub(:date, interval 1 day)), date(priceDate))) limit 1", "avgPrice", array(":typeID" => $typeID, ":date" => $date), 3600); + if ($price != null) return $price; + return 0; + } + + protected static function doPopulatePrice($typeID, $date) + { + $todaysLookup = "CREST-Market:" . date("Ymd"); + $todaysLookupTypeID = $todaysLookup . ":$typeID"; + + $isDone = (bool) Storage::retrieve($todaysLookupTypeID, false); + if ($typeID != 2233 && $isDone) return; + + static::doPopulateRareItemPrices($todaysLookup); // Populate rare items and today's lookup and do some cleanup + + if ($typeID == 2233) + { + $gantry = Price::getItemPrice(3962, $date, true); + $nodes = Price::getItemPrice(2867, $date, true); + $modules = Price::getItemPrice(2871, $date, true); + $mainframes = Price::getItemPrice(2876, $date, true); + $cores = Price::getItemPrice(2872, $date, true); + $total = $gantry + (($nodes + $modules + $mainframes + $cores) * 8); + Db::execute("replace into zz_item_price_lookup (typeID, priceDate, lowPrice, avgPrice, highPrice) values (:typeID, :date, :low, :avg, :high)", array(":typeID" => $typeID, ":date" => $date, ":low" => $total, ":avg" => $total, ":high" => $total)); + Storage::store($todaysLookupTypeID, "true"); // Add today's lookup entry for this item + return $total; + } + + //Log::log("Fetching price for $typeID: " . Info::getItemName($typeID)); + $url = "http://public-crest.eveonline.com/market/10000002/types/$typeID/history/"; + $raw = Util::getData($url); + $json = json_decode($raw, true); + if (isset($json["items"])) + { + foreach ($json["items"] as $row) + { + $hasRow = Db::queryField("select count(1) count from zz_item_price_lookup where typeID = :typeID and priceDate = :date", "count", array(":typeID" => $typeID, ":date" => $row["date"])); + if ($hasRow == 0) + { + Db::execute("insert ignore into zz_item_price_lookup (typeID, priceDate, lowPrice, avgPrice, highPrice) values (:typeID, :date, :low, :avg, :high)", array(":typeID" => $typeID, ":date" => $row["date"], ":low" => $row["lowPrice"], ":avg" => $row["avgPrice"], ":high" => $row["highPrice"])); + } + } + } + Storage::store($todaysLookupTypeID, "true"); // Add today's lookup entry for this item + } + + /** + * Enters values into the lookup table that are not generally found on the market + * @pararm $todaysLookup string Today's lookup value + */ + protected static function doPopulateRareItemPrices($todaysLookup) + { + global $mdb; + + $isDone = (bool) Storage::retrieve($todaysLookup, false); + if ($isDone) return; + + // Base lookups for today have been populated - do it here to allow later recursion + Storage::store($todaysLookup, "true"); + + $motherships = $mdb->find("information", ['type' => "typeID", 'groupID' => 659]); + if (sizeof($motherships) == 0) exit("no motherships, bailing"); // Haven't loaded all data yet, bail! + foreach ($motherships as $mothership) { + $typeID = $mothership["typeid"]; + if ($typeID == 3514) continue; + static::setPrice($typeID, 20000000000); // 20b + } + static::setPrice(3514, 100000000000); // Revenant, 100b + + $titans = $mdb->find("information", ['type' => "typeID", 'groupID' => 30]); + if (sizeof($titans) == 0) exit("no titans, bailing"); // Haven't loaded all data yet, bail! + foreach ($titans as $titan) { + $typeID = $titan["typeid"]; + static::setPrice($typeID, 100000000000); // 100b + } + + // We don't need daily prices on the following ships... + Db::execute("delete from zz_item_price_lookup where typeID in (2834, 3516, 11375, 33397, 32788, 2836, 3518, 32790, 33395, 32209, 33673, 33675, 11940, 11942, 635, 11011, 25560, 13202, 26840, 11936, 11938, 26842)"); + + $tourneyFrigates = array( + 2834, // Utu + 3516, // Malice + 11375, // Freki + ); + foreach($tourneyFrigates as $typeID) static::setPrice($typeID, 80000000000); // 80b + static::setPrice(33397, 120000000000); // Chremoas, 120b + static::setPrice(32788, 100000000000); // Cambion, 100b + + static::setPrice(2836, 150000000000); // Adrestia, 150b + static::setPrice(3518, 90000000000); // Vangel, 90b + static::setPrice(32790, 100000000000); // Etana, 100b + static::setPrice(33395, 125000000000); // Moracha, 125b + static::setPrice(32209, 100000000000); // Mimir, 100b + + // AT XII Prizes + static::setPrice(33675, 120000000000); // Chameleon + static::setPrice(33673, 100000000000); // Whiptail + + // Rare CCP Ships (1 trillion! cuz why not) + static::setPrice(9860, 1000000000000); // Polaris + static::setPrice(11019, 1000000000000); // Cockroach + + $rareCruisers = array( // Ships we should never see get blown up! + 11940, // Gold Magnate + 11942, // Silver Magnate + 635, // Opux Luxury Yacht + 11011, // Guardian-Vexor + 25560, // Opux Dragoon Yacht + ); + foreach($rareCruisers as $typeID) static::setPrice($typeID, 500000000000); // 500b + + $rareBattleships = array( // More ships we should never see get blown up! + 13202, // Megathron Federate Issue + 26840, // Raven State Issue + 11936, // Apocalypse Imperial Issue + 11938, // Armageddon Imperial Issue + 26842, // Tempest Tribal Issue + ); + foreach($rareBattleships as $typeID) static::setPrice($typeID, 750000000000); // 750b + + // Clear all older lookup entries and leave today's lookup entries + Db::execute("delete from zz_storage where locker not like '$todaysLookup%' and locker like 'CREST-Market%'"); + } + + protected static function setPrice($typeID, $price, $low = -1, $high = -1) + { + if ($low == -1) $low = $price; + if ($high == -1) $high = $price; + Db::execute("replace into zz_item_price_lookup (typeID, priceDate, lowPrice, avgPrice, highPrice) values (:typeID, date(now()), :low, :avg, :high)", array(":typeID" => $typeID, ":low" => $price, ":avg" => $low, ":high" => $high)); + } +} diff --git a/classes/RandomGenerator.php b/classes/RandomGenerator.php new file mode 100644 index 00000000..a23504d0 --- /dev/null +++ b/classes/RandomGenerator.php @@ -0,0 +1,74 @@ +GetRandom(64, 0)); + } + } catch (Exception $ex) { + } + } + + // Fallback to good old mt_rand() + return uniqid(mt_rand(), true); + } + + /** + * Generates a random token that can be used for session IDs, CSRF tokens etc., based on + * hash algorithms. + * + * If you are using it as a password equivalent (e.g. autologin token) do NOT store it + * in the database as a plain text but encrypt it with Member::encryptWithUserSettings. + * + * @param String $algorithm Any identifier listed in hash_algos() (Default: whirlpool) + * + * @return String Returned length will depend on the used $algorithm + */ + public function randomToken($algorithm = 'whirlpool') { + return hash($algorithm, $this->generateEntropy()); + } +} diff --git a/classes/Ranks.php b/classes/Ranks.php new file mode 100644 index 00000000..5b691169 --- /dev/null +++ b/classes/Ranks.php @@ -0,0 +1,62 @@ + $email, ":username" => $username), 0); + return $check; + } + + public static function registerUser($username, $password, $email) + { + global $baseAddr; + + if (strtolower($username) == "evekill" || strtolower($username) == "eve-kill") + return array("type" => "error", "message" => "Restrictd user name"); + + $check = Db::queryField("SELECT count(*) count FROM zz_users WHERE email = :email OR username = :username", "count", array(":email" => $email, ":username" => $username), 0); + if ($check == 0) { + $hashedpassword = Password::genPassword($password); + Db::execute("INSERT INTO zz_users (username, password, email) VALUES (:username, :password, :email)", array(":username" => $username, ":password" => $hashedpassword, ":email" => $email)); + $subject = "$baseAddr Registration"; + $message = "Thank you, $username, for registering at $baseAddr"; + Email::send($email, $subject, $message); + $message = "You have been registered, you should recieve a confirmation email in a moment, in the mean time you can click login and login!"; + return array("type" => "success", "message" => $message); + } + else + { + $message = "Username / email is already registered"; + return array("type" => "error", "message" => $message); + } + } +} diff --git a/classes/Related.php b/classes/Related.php new file mode 100644 index 00000000..acc855f2 --- /dev/null +++ b/classes/Related.php @@ -0,0 +1,229 @@ + $kill) static::addAllInvolved($involvedEntities, $killID); + + $blueTeam = array(); + $redTeam = static::findWinners($kills, "allianceID"); + foreach($involvedEntities as $entity=>$chars) if (!in_array($entity, $redTeam)) $blueTeam[] = $entity; + + if (isset($options["A"])) static::assignSides($options["A"], $redTeam, $blueTeam); + if (isset($options["B"])) static::assignSides($options["B"], $blueTeam, $redTeam); + + $redInvolved = static::getInvolved($kills, $redTeam); + $blueInvolved = static::getInvolved($kills, $blueTeam); + + $redKills = static::getKills($kills, $redTeam); + $blueKills = static::getKills($kills, $blueTeam); + + static::addMoreInvolved($redInvolved, $redKills); + static::addMoreInvolved($blueInvolved, $blueKills); + Info::addInfo($redInvolved); + Info::addInfo($blueInvolved); + + $redTotals = static::getStatsKillList(array_keys($redKills)); + $redTotals["pilotCount"] = sizeof($redInvolved); + $blueTotals = static::getStatsKillList(array_keys($blueKills)); + $blueTotals["pilotCount"] = sizeof($blueInvolved); + + $red = static::addInfo($redTeam); + asort($red); + $blue = static::addInfo($blueTeam); + asort($blue); + + usort($redInvolved, "Related::compareShips"); + usort($blueInvolved, "Related::compareShips"); + + $retValue = array( + "teamA" => array( + "list" => $redInvolved, + "kills" => $redKills, + "totals" => $redTotals, + "entities" => $red, + ), + "teamB" => array( + "list" => $blueInvolved, + "kills" => $blueKills, + "totals" => $blueTotals, + "entities" => $blue, + ), + ); + + return $retValue; + } + + private static function addAllInvolved(&$entities, $killID) + { + global $mdb; + $kill = $mdb->findDoc("killmails", ['cacheTime' => 3600, 'killID' => $killID]); + + static::$killstorage[$killID] = $kill; + + $victim = $kill["involved"][0]; + static::addInvolved($entities, $victim); + $involved = $kill["involved"]; + array_shift($involved); + if (is_array($involved)) foreach($involved as $entry) static::addInvolved($entities, $entry); + } + + private static function addInvolved(&$entities, &$entry) + { + $entity = isset($entry["allianceID"]) && $entry["allianceID"] != 0 ? $entry["allianceID"] : @$entry["corporationID"]; + if (!isset($entities["$entity"])) $entities["$entity"] = array(); + if (!in_array(@$entry["characterID"], $entities["$entity"])) $entities["$entity"][] = @$entry["characterID"]; + } + + private static function getInvolved(&$kills, $team) + { + $involved = array(); + foreach($kills as $kill) + { + $kill = static::$killstorage[$kill["victim"]["killID"]]; + + $attackers = $kill["involved"]; + array_shift($attackers); + if (is_array($attackers)) foreach($attackers as $entry) + { + $add = false; + if (in_array(@$entry["allianceID"], $team)) $add = true; + if (in_array(@$entry["corporationID"], $team)) $add = true; + + if ($add) + { + $key = @$entry["characterID"] . ":" . @$entry["corporationID"] . ":" . @$entry["allianceID"] . ":" . @$entry["shipTypeID"]; + $entry["shipName"] = Info::getItemName(@$entry["shipTypeID"]); + if (!in_array($key, $involved)) $involved[$key] = $entry; + } + } + } + return $involved; + } + + private static function addMoreInvolved(&$team, $kills) + { + foreach($kills as $kill) + { + $victim = $kill["victim"]; + Info::addInfo($victim); + if (@$victim["characterID"] > 0 && @$victim["groupID"] != 29) + { + $key = @$victim["characterID"] . ":" . @$victim["corporationID"] . ":" . (int) @$victim["allianceID"] . ":" . $victim["shipTypeID"]; + $victim["destroyed"] = $victim["killID"]; + $team[$key] = $victim; + } + } + } + + private static function getKills(&$kills, $team) + { + $teamsKills = array(); + foreach($kills as $killID=>$kill) + { + $victim = $kill["victim"]; + $add = in_array((int) @$victim["allianceID"], $team) || in_array($victim["corporationID"], $team); + + if ($add) + { + $teamsKills[$killID] = $kill; + } + } + return $teamsKills; + } + + + + private static function getStatsKillList($killIDs) + { + $totalPrice = 0; + $totalPoints = 0; + $groupIDs = array(); + $totalShips = 0; + foreach ($killIDs as $killID) { + $kill = Kills::getKillDetails($killID); + $info = $kill["info"]; + $victim = $kill["victim"]; + $totalPrice += $info["zkb"]["totalValue"]; + $totalPoints += $info["zkb"]["points"]; + $groupID = $victim["groupID"]; + if (!isset($groupIDs[$groupID])) { + $groupIDs[$groupID] = array(); + $groupIDs[$groupID]["count"] = 0; + $groupIDs[$groupID]["isk"] = 0; + $groupIDs[$groupID]["points"] = 0; + } + $groupIDs[$groupID]["groupID"] = $groupID; + $groupIDs[$groupID]["count"]++; + $groupIDs[$groupID]["isk"] += $info["zkb"]["totalValue"]; + $groupIDs[$groupID]["points"] += $info["zkb"]["points"]; + $totalShips++; + } + Info::addInfo($groupIDs); + return array( + "total_price" => $totalPrice, "groupIDs" => $groupIDs, "totalShips" => $totalShips, + "total_points" => $totalPoints + ); + } + + private static function addInfo(&$team) + { + global $mdb; + + $retValue = array(); + foreach($team as $entity) + { + $retValue[$entity] = $mdb->findField("information", "name", ['id' => ((int) $entity)]); + } + return $retValue; + } + + /** + * @param string $typeColumn + */ + private static function findWinners(&$kills, $typeColumn) + { + $involvedArray = array(); + foreach ($kills as $killID=>$kill) { + $finalBlow = @$kill["finalBlow"]; + $added = self::addInvolvedEntity($involvedArray, $killID, @$finalBlow["allianceID"]); + if (!$added) $added = self::addInvolvedEntity($involvedArray, $killID, @$finalBlow["corporationID"]); + if (!$added) $added = self::addInvolvedEntity($involvedArray, $killID, @$finalBlow["characterID"]); + } + return array_keys($involvedArray); + } + + + + private static function addInvolvedEntity(&$involvedArray, &$killID, $entity) + { + if ($entity == 0) return false; + if (!isset($involvedArray["$entity"])) $involvedArray["$entity"] = array(); + if (!in_array($killID, $involvedArray["$entity"])) + { + $involvedArray["$entity"][] = $killID; + return true; + } + return false; + } + + private static function assignSides($assignees, &$teamA, &$teamB) + { + foreach($assignees as $id) + { + if (!isset($teamA[$id])) $teamA[] = $id; + if (($key = array_search($id, $teamB)) !== false) unset($teamB[$key]); + } + } + + public static function compareShips($a, $b) + { + $aSize = Db::queryField("select mass from ccp_invTypes where typeID = :typeID", "mass", array(":typeID" => @$a["shipTypeID"])); + $bSize = Db::queryField("select mass from ccp_invTypes where typeID = :typeID", "mass", array(":typeID" => @$b["shipTypeID"])); + return $aSize < $bSize; + } +} diff --git a/classes/Stats.php b/classes/Stats.php new file mode 100644 index 00000000..03d24072 --- /dev/null +++ b/classes/Stats.php @@ -0,0 +1,187 @@ +getCollection("oneWeek"); + else $killmails = $mdb->getCollection("killmails"); + if (isset($parameters["pastSeconds"]) && $parameters["pastSeconds"] == 604800) unset($parameters["pastSeconds"]); + + $query = MongoFilter::buildQuery($parameters); + if (!$mdb->exists("killmails", $query)) return []; + $andQuery = MongoFilter::buildQuery($parameters, false); + + if ($groupByColumn == "solarSystemID" || $groupByColumn == "regionID") $keyField = "system.$groupByColumn"; + else $keyField = "involved.$groupByColumn"; + + $id = $type = $isVictim = null; + if ($groupByColumn != "solarSystemID" && $groupByColumn != "regionID") foreach ($parameters as $k=>$v) + { + if (strpos($k, "ID") === false) continue; + if (!is_array($v) || sizeof($v) < 1) continue; + $id = $v[0]; + if ($k != "solarSystemID" && $k != "regionID") $type = "involved.$k"; + else $type = "system.$k"; + } + + $timer = new Timer(); + $pipeline = []; + $pipeline[] = [ '$match' => $query]; + if ($groupByColumn != "solarSystemID" && $groupByColumn != "regionID") $pipeline[] = ['$unwind' => '$involved']; + if ($type != null && $id != null) $pipeline[] = ['$match' => [$type => $id, 'involved.isVictim' => false]]; + $pipeline[] = ['$match' => [$keyField => ['$ne' => null]]]; + $pipeline[] = ['$match' => $andQuery]; + $pipeline[] = ['$group' => [ '_id' => [ 'killID' => '$killID', $groupByColumn => '$' . $keyField]]]; + $pipeline[] = ['$group' => ['_id' => '$_id.' . $groupByColumn, 'kills' => ['$sum' => 1] ]]; + $pipeline[] = ['$sort' => ['kills' => -1]]; + if (!isset($parameters["nolimit"])) $pipeline[] = ['$limit' => 10]; + $pipeline[] = ['$project' => [$groupByColumn => '$_id', 'kills' => 1, '_id' => 0]]; + + if (!$debug) MongoCursor::$timeout = -1; + $result = $killmails->aggregateCursor($pipeline); + $result = iterator_to_array($result); + /*if ($timer->stop() > 100) + { + $params = serialize($parameters); + Log::log("agg by $groupByColumn took " . $timer->stop() . "ms - $params"); + }*/ + + Info::addInfo($result); + Cache::set($hashKey, $result, 3600); + + return $result; + } + + private static function getExtendedTop($groupByColumn, $parameters = array(), $allTime = false) + { + return array(); + } + + public static function calcStats($killID, $adding = true) + { + } + + /** + * @param string $type + */ + private static function statLost($type, $typeID, $groupID, $modifier, $points, $isk) + { + } + + /** + * @param string $type + */ + private static function statDestroyed($type, $typeID, $groupID, $modifier, $points, $isk) + { + } +} diff --git a/classes/StompUtil.php b/classes/StompUtil.php new file mode 100644 index 00000000..595bab15 --- /dev/null +++ b/classes/StompUtil.php @@ -0,0 +1,67 @@ +send($destination, $json); + } + $data = json_decode($json, true); + //$map = json_encode(array("solarSystemID" => $data["solarSystemID"], "killID" => $data["killID"], "characterID" => $data["victim"]["characterID"], "corporationID" => $data["victim"]["corporationID"], "allianceID" => $data["victim"]["allianceID"], "shipTypeID" => $data["victim"]["shipTypeID"], "killTime" => $data["killTime"], "involved" => count($data["attackers"]), "totalValue" => $data["zkb"]["totalValue"], "pointsPrInvolved" => $data["zkb"]["points"])); + //$stomp->send("/topic/starmap.systems.active", $map); + } + } + + private static function getDestinations($kill) + { + $kill = json_decode($kill, true); + $destinations = array(); + + $destinations[] = "/topic/kills"; + $destinations[] = "/topic/location.solarsystem.".$kill["solarSystemID"]; + + // victim + if($kill["victim"]["characterID"] > 0) $destinations[] = "/topic/involved.character.".$kill["victim"]["characterID"]; + if($kill["victim"]["corporationID"] > 0) $destinations[] = "/topic/involved.corporation.".$kill["victim"]["corporationID"]; + if($kill["victim"]["factionID"] > 0) $destinations[] = "/topic/involved.faction.".$kill["victim"]["factionID"]; + if($kill["victim"]["allianceID"] > 0) $destinations[] = "/topic/involved.alliance.".$kill["victim"]["allianceID"]; + + // attackers + foreach($kill["attackers"] as $attacker) + { + if($attacker["characterID"] > 0) $destinations[] = "/topic/involved.character." . $attacker["characterID"]; + if($attacker["corporationID"] > 0) $destinations[] = "/topic/involved.corporation." . $attacker["corporationID"]; + if($attacker["factionID"] > 0) $destinations[] = "/topic/involved.faction." . $attacker["factionID"]; + if($attacker["allianceID"] > 0) $destinations[] = "/topic/involved.alliance." . $attacker["allianceID"]; + } + + return $destinations; + } +} diff --git a/classes/Subdomains.php b/classes/Subdomains.php new file mode 100644 index 00000000..ab1f0cce --- /dev/null +++ b/classes/Subdomains.php @@ -0,0 +1,59 @@ + $serverName), 60); + if ($alias) + { + header("Location: http://$alias") ; + exit(); + } + if ($serverName != $baseAddr && strlen(str_replace(".$baseAddr", "", $serverName)) > 5) + { + $serverName = Db::queryField("select subdomain from zz_subdomains where alias = :serverName", "subdomain", array(":serverName" => $serverName)); + if (strlen($serverName) == 0) + { + header("Location: http://$baseAddr") ; + exit(); + } + } + $adfree = Db::queryField("select count(*) count from zz_subdomains where adfreeUntil >= now() and subdomain = :serverName", "count", array(":serverName" => $serverName)); + + $board = str_replace(".$baseAddr", "", $serverName); + $board = str_replace("_", " ", $board); + $board = preg_replace('/^dot\./i', '.', $board); + $board = preg_replace('/\.dot$/i', '.', $board); + try { + if ($board == "www") $app->redirect($fullAddr, 302); + } catch (Exception $e) { + return; + } + if ($board == $baseAddr) return []; + $numDays = 7; + + $faction = null; //Db::queryRow("select * from ccp_zfactions where ticker = :board", array(":board" => $board), 3600); + $alli = $mdb->findDoc("information", ['cacheTime' => 3600, 'type' => 'allianceID', 'ticker' => strtoupper($board)], ['memberCount' => -1]); + $corp = $mdb->findDoc("information", ['cacheTime' => 3600, 'type' => 'corporationID', 'ticker' => strtoupper($board)], ['memberCount' => -1]); + + $columnName = null; + $id = null; + if ($faction) { + $p = array("factionID" => (int) $faction["factionID"]); + $twig->addGlobal("statslink", "/faction/" . $faction["factionID"] . "/"); + } else if ($alli) { + $p = array("allianceID" => (int) $alli["id"]); + $twig->addGlobal("statslink", "/alliance/" . $alli["id"] . "/"); + } else if ($corp) { + $p = array("corporationID" => (int) $corp["id"]); + $twig->addGlobal("statslink", "/corporation/" . $corp["id"] . "/"); + } else $p = array(); + + return $p; + } + +} diff --git a/classes/Summary.php b/classes/Summary.php new file mode 100644 index 00000000..b1104dab --- /dev/null +++ b/classes/Summary.php @@ -0,0 +1,148 @@ +findDoc("statistics", ['type' => $type, 'id' => (int) $id]);; +//if ($stats == null) echo $type; + if ($stats == null) $stats = []; + $data["stats"] = $stats; + $data[""] = $stats; + + $arr = ['ships', 'isk', 'points']; + if ($arr != null) foreach ($arr as $a) + { + $data["{$a}Destroyed"] = (int) @$stats["{$a}Destroyed"]; + $data["{$a}DestroyedRank"] = (int) @$stats["{$a}DestroyedRank"]; + $data["{$a}Lost"] = (int) @$stats["{$a}Lost"]; + $data["{$a}LostRank"] = (int) @$stats["{$a}LostRank"]; + } + $data["overallRank"] = @$stats["overallRank"]; + + return $data; + } + + /** + * @param array $data + * @param integer $id + * @param array $parameters + * @return array + */ + public static function getCorpSummary(&$data, $id, $parameters = array()) + { + return self::getSummary('corp', 'corporationID', $data, $id, $parameters); + } + + /** + * @param array $data + * @param integer $id + * @param array $parameters + * @return array + */ + public static function getAlliSummary(&$data, $id, $parameters = array()) + { + return self::getSummary('alli', 'allianceID', $data, $id, $parameters); + } + + /** + * @param array $data + * @param integer $id + * @param array $parameters + * @return array + */ + public static function getFactionSummary(&$data, $id, $parameters = array()) + { + return self::getSummary('faction', 'factionID', $data, $id, $parameters); + } + + /** + * @param array $data + * @param integer $id + * @param array $parameters + * @return array + */ + public static function getShipSummary(&$data, $id, $parameters = array()) + { + return self::getSummary('ship', 'shipTypeID', $data, $id, $parameters); + } + + /** + * @param array $data + * @param integer $id + * @param array $parameters + * @return array + */ + public static function getGroupSummary(&$data, $id, $parameters = array()) + { + return self::getSummary('group', 'groupID', $data, $id, $parameters); + } + + /** + * @param array $data + * @param integer $id + * @param array $parameters + * @return array + */ + public static function getRegionSummary(&$data, $id, $parameters = array()) + { + return self::getSummary('region', 'regionID', $data, $id, $parameters); + } + + /** + * @param array $data + * @param integer $id + * @param array $parameters + * @return array + */ + public static function getSystemSummary(&$data, $id, $parameters = array()) + { + return self::getSummary('system', 'solarSystemID', $data, $id, $parameters); + } + + /** + * @param $type + * @param $typeID + * @return array + */ + public static function getMonthlyHistory($type, $typeID) + { + global $mdb; + + $stats = $mdb->findDoc("statistics", ['type' => $type, 'id' => (int) $typeID]); + if (!isset($stats["months"])) return []; + $months = $stats["months"]; + krsort($months); + return $months; + } +} diff --git a/classes/Twit.php b/classes/Twit.php new file mode 100644 index 00000000..ff5fd544 --- /dev/null +++ b/classes/Twit.php @@ -0,0 +1,36 @@ +send($message); + } + + public static function getMessages($amount = 1) + { + global $consumerKey, $consumerSecret, $accessToken, $accessTokenSecret; + $twitter = new Twitter($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret); + + return $twitter->load(Twitter::REPLIES, $amount); + } + + public static function findMessages($amount = 1) + { + global $consumerKey, $consumerSecret, $accessToken, $accessTokenSecret; + $twitter = new Twitter($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret); + + return $twitter->load(Twitter::ME_AND_FRIENDS, $amount); + } + + public static function shortenUrl($url) + { + return file_get_contents("http://is.gd/api.php?longurl=" . $url); + } +} diff --git a/classes/User.php b/classes/User.php new file mode 100644 index 00000000..6c4bdb64 --- /dev/null +++ b/classes/User.php @@ -0,0 +1,172 @@ + $username), 30); + $userAgent = $_SERVER["HTTP_USER_AGENT"]; + $ip = IP::get(); + Db::execute("INSERT INTO zz_users_sessions (userID, sessionHash, validTill, userAgent, ip) VALUES (:userID, :sessionHash, :validTill, :userAgent, :ip)", + array(":userID" => $userID, ":sessionHash" => $hash, ":validTill" => $validTill, ":userAgent" => $userAgent, ":ip" => $ip)); + $app->setEncryptedCookie($cookie_name, $hash, time() + $cookie_time, "/", $baseAddr, $cookie_ssl, true); + } + $_SESSION["loggedin"] = $username; + return true; + } + + /** + * @param string $username + * @param string $password + * @return bool + */ + public static function checkLogin($username, $password) + { + $p = Db::query("SELECT username, password FROM zz_users WHERE username = :username", array(":username" => $username), 0); + if(!empty($p[0])) + { + $pw = $p[0]["password"]; + + if(Password::checkPassword($password, $pw)) + return true; + return false; + } + return false; + } + + /** + * @param int $userID + * @return array|null + */ + public static function checkLoginHashed($userID) + { + return Db::query("SELECT sessionHash FROM zz_users_sessions WHERE userID = :userID AND now() < validTill", array(":userID" => $userID), 0); + } + + /** + * @return bool + */ + public static function autoLogin() + { + global $cookie_name, $cookie_time, $app; + $sessionCookie = $app->getEncryptedCookie($cookie_name, false); + + if (!empty($sessionCookie)) { + $cookie = explode("/", $sessionCookie); + $username = $cookie[0]; + //$cookieHash = $cookie[1]; + $userID = Db::queryField("SELECT id FROM zz_users WHERE username = :username", "id", array(":username" => $username), 30); + $hashes = self::checkLoginHashed($userID); + foreach($hashes as $hash) + { + $hash = $hash["sessionHash"]; + if ($sessionCookie == $hash) { + $_SESSION["loggedin"] = $username; + return true; + } + } + return false; + } + return false; + } + + /** + * @return bool + */ + public static function isLoggedIn() + { + return isset($_SESSION["loggedin"]); + } + + /** + * @return array|null + */ + public static function getUserInfo() + { + if (isset($_SESSION["loggedin"])) { + $id = Db::query("SELECT id, username, email, dateCreated, admin, moderator, characterID FROM zz_users WHERE username = :username", array(":username" => $_SESSION["loggedin"]), 1); + return @array("id" => $id[0]["id"], "username" => $id[0]["username"], "admin" => $id[0]["admin"], "moderator" => $id[0]["moderator"], "email" => $id[0]["email"], "characterID" => $id[0]["characterID"], "dateCreated" => $id[0]["dateCreated"]); + } + return null; + } + + /** + * @return int|null + */ + public static function getUserID() + { + if (isset($_SESSION["loggedin"])) { + $id = Db::queryField("SELECT id FROM zz_users WHERE username = :username", "id", array(":username" => $_SESSION["loggedin"]), 30); + return (int) $id; + } + return null; + } + + /** + * @return bool + */ + public static function isModerator() + { + $info = self::getUserInfo(); + return $info["moderator"] == 1; + } + + /** + * @return bool + */ + public static function isAdmin() + { + $info = self::getUserInfo(); + return $info["admin"] == 1; + } + + /** + * @param int $userID + * @return string + */ + public static function getUsername($userID) + { + return Db::queryField("SELECT username FROM zz_users WHERE userID = :userID", array(":userID" => $userID)); + } + + /** + * @param int $userID + * @return array|null + */ + public static function getSessions($userID) + { + return Db::query("SELECT sessionHash, dateCreated, validTill, userAgent, ip FROM zz_users_sessions WHERE userID = :userID", array(":userID" => $userID), 0); + } + + /** + * @param int $userID + * @param string $sessionHash + */ + public static function deleteSession($userID, $sessionHash) + { + Db::execute("DELETE FROM zz_users_sessions WHERE userID = :userID AND sessionHash = :sessionHash", array(":userID" => $userID, ":sessionHash" => $sessionHash)); + } + + public static function getBalance($userID) + { + $balance = Db::queryField("select balance from zz_account_balance where userID = :userID", "balance", array(":userID" => $userID), 3600); + if ($balance == null) $balance = 0; + return $balance; + } + + public static function getPaymentHistory($userID) + { + return Db::query("select * from zz_account_history where userID = :userID", array(":userID" => $userID), 0); + } +} diff --git a/classes/UserConfig.php b/classes/UserConfig.php new file mode 100644 index 00000000..a4822957 --- /dev/null +++ b/classes/UserConfig.php @@ -0,0 +1,60 @@ + $id), 0); + foreach ($result as $row) { + self::$userConfig[$row["locker"]] = $row["content"]; + } + } + + public static function get($key, $defaultValue = null) + { + if (!User::isLoggedIn()) return $defaultValue; + $id = User::getUserID(); + self::loadUserConfig($id); + + $value = isset(self::$userConfig["$key"]) ? self::$userConfig["$key"] : null; + if ($value === null) return $defaultValue; + $value = json_decode($value, true); + return $value; + } + + public static function getAll() + { + if (!user::isLoggedIn()) return null; + + $id = User::getUserID(); + self::loadUserConfig($id); + + foreach(self::$userConfig as $key => $value) + self::$userConfig[$key] = json_decode($value, true); + + return self::$userConfig; + } + + public static function set($key, $value) + { + if (!User::isLoggedIn()) throw new Exception("User is not logged in."); + $id = User::getUserID(); + self::$userConfig = null; + + if (is_null($value) || (is_string($value) && strlen(trim($value)) == 0)) { + // Just remove the row and let the defaults take over + return Db::execute("delete from zz_users_config where id = :id and locker = :key", array(":id" => $id, ":key" => $key)); + } + + $value = json_encode($value); + return Db::execute("insert into zz_users_config (id, locker, content) values (:id, :key, :value) + on duplicate key update content = :value", array(":id" => $id, ":key" => $key, ":value" => $value)); + } +} diff --git a/classes/UserGlobals.php b/classes/UserGlobals.php new file mode 100644 index 00000000..f6bf3a14 --- /dev/null +++ b/classes/UserGlobals.php @@ -0,0 +1,38 @@ + $val) $this->addGlobal($result, $key, $val); + + $this->addGlobal($result, "sessionusername", $u["username"]); + $this->addGlobal($result, "sessionuserid", $u["id"]); + $this->addGlobal($result, "sessionadmin", (bool)$u["admin"]); + $this->addGlobal($result, "sessionmoderator", (bool)$u["moderator"]); + } + + global $mdb; + $kills = $mdb->findField("storage", "contents", ['cacheTime' => 60, 'locker' => 'killsProcessed']); + $this->addGlobal($result, "killsLastHour", $kills, 0); + return $result; + } + + private function addGlobal(&$array, $key, $value, $defaultValue = null) + { + if ($value == null && $defaultValue == null) return; + else if ($value == null) $array[$key] = $defaultValue; + else $array[$key] = $value; + } +} diff --git a/classes/Util.php b/classes/Util.php new file mode 100644 index 00000000..3b3cd1db --- /dev/null +++ b/classes/Util.php @@ -0,0 +1,577 @@ + now()", "count", array(), 1); + return $stop904 > 0; + } + + public static function getCrest($url) + { + \Perry\Setup::$fetcherOptions = ["connect_timeout" => 15, "timeout" => 30]; + return \Perry\Perry::fromUrl($url); + } + + /** + * @param integer $keyID + * @param string $vCode + */ + public static function getPheal($keyID = null, $vCode = null, $overRide = false) + { + if ($overRide == false) return null; + global $phealCacheLocation, $apiServer, $baseAddr, $ipsAvailable; + + if (!$overRide && static::is904Error()) + { + if (php_sapi_name() == 'cli') exit(); + return null; // Web requests shouldn't be hitting the API... + } + + \Pheal\Core\Config::getInstance()->http_method = "curl"; + \Pheal\Core\Config::getInstance()->http_user_agent = "API Fetcher for http://$baseAddr"; + if(!empty($ipsAvailable)) + { + $max = count($ipsAvailable)-1; + $ipID = mt_rand(0, $max); + \Pheal\Core\Config::getInstance()->http_interface_ip = $ipsAvailable[$ipID]; + } + \Pheal\Core\Config::getInstance()->http_post = false; + \Pheal\Core\Config::getInstance()->http_keepalive = true; // default 15 seconds + \Pheal\Core\Config::getInstance()->http_keepalive = 10; // KeepAliveTimeout in seconds + \Pheal\Core\Config::getInstance()->http_timeout = 30; + if ($phealCacheLocation != null) \Pheal\Core\Config::getInstance()->cache = new \Pheal\Cache\FileStorage($phealCacheLocation); + \Pheal\Core\Config::getInstance()->api_customkeys = true; + \Pheal\Core\Config::getInstance()->api_base = $apiServer; + + if ($keyID != null && $vCode != null) $pheal = new \Pheal\Pheal($keyID, $vCode); + else $pheal = new \Pheal\Pheal(); + return $pheal; + } + + public static function pluralize($string) + { + if (!self::endsWith($string, "s")) return $string . "s"; + else return $string . "es"; + } + + /** + * @param string $haystack + * @param string $needle + */ + public static function startsWith($haystack, $needle) + { + $length = strlen($needle); + return (substr($haystack, 0, $length) === $needle); + } + + public static function endsWith($haystack, $needle) + { + return substr($haystack, -strlen($needle)) === $needle; + } + + public static function getKillHash($killID = null, $kill = null) + { + if ($killID != null) { + $json = Killmail::get($killID); + if ($json === null) throw new Exception("Cannot find kill $killID"); + $kill = json_decode($json); + if ($kill === null) throw new Exception("Cannot json_decode $killID"); + } + if ($kill === null) throw new Exception("Can't hash an empty kill"); + + $hashStr = ""; + $hashStr .= ":$kill->killTime:$kill->solarSystemID:$kill->moonID:"; + $victim = $kill->victim; + $hashStr .= ":$victim->characterID:$victim->shipTypeID:$victim->damageTaken:"; + + return hash("sha256", $hashStr); + } + + public static function calcX($slot, $size) + { + $angle = $slot * (360 / 32) - 4; + $rad = deg2rad($angle); + $radius = $size / 2; + return (int)(($radius * cos($rad))); + } + + public static function calcY($slot, $size) + { + $angle = $slot * (360 / 32) - 4; + $rad = deg2rad($angle); + $radius = $size / 2; + return (int)(($radius * sin($rad))); + } + + private static $formatIskIndexes = array("", "k", "m", "b", "t", "tt", "ttt"); + + public static function formatIsk($value) + { + $numDecimals = (((int)$value) == $value) && $value < 10000 ? 0 : 2; + if ($value == 0) return number_format(0, $numDecimals); + if ($value < 10000) return number_format($value, $numDecimals); + $iskIndex = 0; + while ($value > 999.99) { + $value /= 1000; + $iskIndex++; + } + return number_format($value, $numDecimals) . self::$formatIskIndexes[$iskIndex]; + } + + public static function convertUriToParameters($additionalParameters = array(), $addExtraParameters = true) + { + $parameters = array(); + @$uri = $_SERVER["REQUEST_URI"]; + $split = explode("/", $uri); + $currentIndex = 0; + foreach ($split as $key) + { + $value = $currentIndex + 1 < count($split) ? $split[$currentIndex + 1] : null; + switch ($key) { + case "kills": + case "losses": + case "w-space": + case "lowsec": + case "nullsec": + case "highsec": + case "solo": + $parameters[$key] = true; + break; + case "character": + case "characterID": + case "corporation": + case "corporationID": + case "alliance": + case "allianceID": + case "faction": + case "factionID": + case "ship": + case "shipID": + case "shipTypeID": + case "group": + case "groupID": + case "system": + case "solarSystemID": + case "systemID": + case "region": + case "regionID": + if ($value != null) { + if (strpos($key, "ID") === false) $key = $key . "ID"; + if ($key == "systemID") $key = "solarSystemID"; + else if ($key == "shipID") $key = "shipTypeID"; + $exploded = explode(",", $value); + foreach($exploded as $aValue) + { + if ($aValue != (int) $aValue || ((int) $aValue) == 0) die(); //throw new Exception("Invalid ID passed: $aValue"); + } + if (sizeof($exploded) > 10) throw new Exception("Too many IDs! Max: 10"); + $ints = []; + foreach ($exploded as $ex) $ints[] = (int) $ex; + $parameters[$key] = $ints; + } + break; + case "page": + $value = (int)$value; + if ($value < 1) $value = 1; + $parameters[$key] = (int) $value; + break; + case "orderDirection": + if (!($value == "asc" || $value == "desc")) throw new Exception("Invalid orderDirection! Allowed: asc, desc"); + $parameters[$key] = "desc"; + $parameters[$key] = $value; + break; + case "pastSeconds": + $value = (int) $value; + if (($value / 86400) > 7) throw new Exception("pastSeconds is limited to a max of 7 days"); + $parameters[$key] = (int) $value; + break; + case "startTime": + case "endTime": + $time = strtotime($value); + if($time < 0) throw new Exception("$value is not a valid time format"); + $parameters[$key] = $value; + break; + case "limit": + $value = (int) $value; + if ($value < 200) $parameters["limit"] = $value; + elseif($value > 200) $parameters["limit"] = 200; + elseif($value <= 0) $parameters["limit"] = 1; + break; + case "beforeKillID": + case "afterKillID": + case "killID": + if (!is_numeric($value)) throw new Exception("$value is not a valid entry for $key"); + $parameters[$key] = (int) $value; + break; + case "iskValue": + if (!is_numeric($value)) throw new Exception("$value is not a valid entry for $key"); + $parameters[$key] = (int) $value; + break; + case "xml": + $parameters[$key] = true; + break; + case "zkbOnly": + $parameters[$key] = true; + break; + case "pretty": + $parameters[$key] = true; + break; + case "no-items": + $parameters[$key] = true; + break; + default: + if($addExtraParameters == true) + { + if (is_numeric($value) && $value < 0) continue; //throw new Exception("$value is not a valid entry for $key"); + if ($key != "" && $value != "") $parameters[$key] = $value; + } + + // Add more parameters to the $parameters array + if(!empty($additionalParameters)) + { + foreach($additionalParameters as $extra) + if($extra == $key) + $parameters[$key] = $value; + } + break; + } + $currentIndex++; + } + + if (false && isset($parameters["page"]) && $parameters["page"] > 10 && isset($parameters["api"])) { + // Verify that the request is for a character, corporation, or alliance + // This will prevent scrape attempts against regions, ships, systems, etc. which + // are very hard against the database + $legitEntities = array("characterID", "corporationID", "allianceID"); + $legit = false; + foreach ($legitEntities as $entity) { + $legit |= in_array($entity, array_keys($parameters)); + } + if (!$legit) + { + header("HTTP/1.1 403 page > 10 not allowed for this modifier type."); + die(); + } + } + return $parameters; + } + + public static function shortString($string, $maxLength = 8) + { + return $string; + if (strlen($string) <= $maxLength) return $string; + return substr($string, 0, $maxLength - 3) . "..."; + } + + public static function truncate($str, $length = 200, $trailing = "...") + { + return $str; + $length -= mb_strlen($trailing); + if (mb_strlen($str) > $length) { + // string exceeded length, truncate and add trailing dots + return mb_substr($str, 0, $length) . $trailing; + } + else + { + // string was already short enough, return the string + $res = $str; + } + return $res; + } + + public static function pageTimer() + { + global $timer; + return $timer->stop(); + } + + public static function isActive($pageType, $currentPage, $retValue = "active") + { + return strtolower($pageType) == strtolower($currentPage) ? $retValue : ""; + } + + private static $months = array("", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"); + + public static function getMonth($month) + { + return self::$months[$month]; + } + + private static $longMonths = array("", "January", "February", "March", "April", "May", "June", "July", "August", + "September", "October", "November", "December"); + + public static function getLongMonth($month) + { + return self::$longMonths[(int) $month]; + } + + public static function scrapeCheck() + { +return; + global $apiWhiteList, $maxRequestsPerHour; + $maxRequestsPerHour = isset($maxRequestsPerHour) ? $maxRequestsPerHour : 360; + + $uri = $_SERVER["REQUEST_URI"]; + $uri = explode("?", $uri); + $uri = substr($uri[0], 0, 256); + $ip = substr(IP::get(), 0, 64); + + if(!in_array($ip, $apiWhiteList)) + { + $count = Db::queryField("select count(*) count from zz_scrape_prevention where ip = :ip and dttm >= date_sub(now(), interval 1 hour)", "count", array(":ip" => $ip), 0); + + if($count > $maxRequestsPerHour) + { + $date = date("Y-m-d H:i:s"); + $cachedUntil = date("Y-m-d H:i:s", time() + 3600); + if(stristr($_SERVER["REQUEST_URI"], "xml")) + { + $data = ""; // separating the ? and > allows vi to still color format code nicely + $data .= ""; + $data .= "$date"; + $data .= ""; + $data .= "You have too many API requests in the last hour. You are allowed a maximum of $maxRequestsPerHour requests."; + $data .= ""; + $data .= "$cachedUntil"; + $data .= ""; + header("Content-type: text/xml; charset=utf-8"); + } + else + { + header("Content-type: application/json; charset=utf-8"); + $data = json_encode(array("Error" => "You have too many API requests in the last hour. You are allowed a maximum of $maxRequestsPerHour requests.", "cachedUntil" => $cachedUntil)); + } + header("X-Bin-Request-Count: ". $count); + header("X-Bin-Max-Requests: ". $maxRequestsPerHour); + header("Retry-After: " . $cachedUntil . " GMT"); + header("HTTP/1.1 429 Too Many Requests"); + header("Etag: ".(md5(serialize($data)))); + echo $data; + die(); + } + header("X-Bin-Request-Count: ". $count); + header("X-Bin-Max-Requests: ". $maxRequestsPerHour); + } + Db::execute("insert into zz_scrape_prevention values (:ip, :uri, now())", array(":ip" => $ip, ":uri" => $uri)); + } + + public static function isValidCallback($subject) + { + $identifier_syntax = '/^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{200C}\x{200D}]*+$/u'; + + $reserved_words = array('break', 'do', 'instanceof', 'typeof', 'case', + 'else', 'new', 'var', 'catch', 'finally', 'return', 'void', 'continue', + 'for', 'switch', 'while', 'debugger', 'function', 'this', 'with', + 'default', 'if', 'throw', 'delete', 'in', 'try', 'class', 'enum', + 'extends', 'super', 'const', 'export', 'import', 'implements', 'let', + 'private', 'public', 'yield', 'interface', 'package', 'protected', + 'static', 'null', 'true', 'false'); + + return preg_match($identifier_syntax, $subject) && ! in_array(mb_strtolower($subject, 'UTF-8'), $reserved_words); + } + + public static function themesAvailable() + { + $dir = "themes/"; + $avail = scandir($dir); + foreach($avail as $key => $val) + if($val == "." || $val == "..") + unset($avail[$key]); + return $avail; + } + + /** + * @param string $haystack + */ + public static function strposa($haystack, $needles=array(), $offset=0) + { + $chr = array(); + foreach($needles as $needle) { + $res = strpos($haystack, $needle, $offset); + if ($res !== false) $chr[$needle] = $res; + } + if(empty($chr)) return false; + return min($chr); + } + + /** + * @param string $url + * @return string|null $result + */ + public static function getData($url, $cacheTime = 3600) + { + global $ipsAvailable, $baseAddr; + + $md5 = md5($url); + $result = $cacheTime > 0 ? Cache::get($md5) : null; + + if(!$result) + { + $curl = curl_init(); + curl_setopt_array($curl, array( + CURLOPT_USERAGENT => "zKillboard dataGetter for site: {$baseAddr}", + CURLOPT_TIMEOUT => 30, + CURLOPT_POST => false, + CURLOPT_FORBID_REUSE => false, + CURLOPT_ENCODING => "", + CURLOPT_URL => $url, + CURLOPT_HTTPHEADER => array("Connection: keep-alive", "Keep-Alive: timeout=10, max=1000"), + CURLOPT_RETURNTRANSFER => true, + CURLOPT_FAILONERROR => true + ) + ); + + if(count($ipsAvailable) > 0) + { + $ip = $ipsAvailable[time() % count($ipsAvailable)]; + curl_setopt($curl, CURLOPT_INTERFACE, $ip); + } + $result = curl_exec($curl); + if ($cacheTime > 0) Cache::set($md5, $result, $cacheTime); + } + + return $result; + } + + /** + * @param string $url + * @param array + * @param array + * @return array $result + */ + public static function postData($url, $postData = array(), $headers = array()) + { + global $ipsAvailable, $baseAddr; + $userAgent = "zKillboard dataGetter for site: {$baseAddr}"; + if(!isset($headers)) + $headers = array("Connection: keep-alive", "Keep-Alive: timeout=10, max=1000"); + + $curl = curl_init(); + $postLine = ""; + + if(!empty($postData)) + foreach($postData as $key => $value) + $postLine .= $key . "=" . $value . "&"; + + rtrim($postLine, "&"); + + curl_setopt($curl, CURLOPT_URL, $url); + curl_setopt($curl, CURLOPT_USERAGENT, $userAgent); + curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); + if(!empty($postData)) + { + curl_setopt($curl, CURLOPT_POST, count($postData)); + curl_setopt($curl, CURLOPT_POSTFIELDS, $postLine); + } + + if(count($ipsAvailable) > 0) + { + $ip = $ipsAvailable[time() % count($ipsAvailable)]; + curl_setopt($curl, CURLOPT_INTERFACE, $ip); + } + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); + + $result = curl_exec($curl); + + curl_close($curl); + return $result; + } + + /** + * Gets post data, and returns it + * @param string $var The variable you can to return + * @return string|null + */ + public static function getPost($var) + { + return isset($_POST[$var]) ? $_POST[$var] : null; + } + + public static function informationPages() + { + global $baseDir, $theme; + $mdDir = $baseDir . "information/"; + $data = scandir($mdDir); + + foreach($data as $key => $file) + { + if($file == "." || $file == "..") + continue; + + if(is_dir($mdDir . $file)) + { + $subData = scandir($mdDir . $file); + foreach($subData as $key => $subDir) + { + if($subDir == "." || $subDir == "..") + continue; + + $pages[$file][] = array("name" => strtolower(str_replace(".md", "", $subDir)), "path" => "$mdDir$file/$subDir"); + } + } + else + $pages[strtolower(str_replace(".md", "", $file))][] = array("name" => strtolower(str_replace(".md", "", $file)), "path" => "$mdDir$file"); + } + + // Look if the theme has any information pages it wants to present + $theme = UserConfig::get("theme", $theme); + $tDir = $baseDir . "themes/" . $theme . "/information/"; + $data = null; + if(is_dir($tDir)) + $data = scandir($tDir); + + if($data) + { + foreach($data as $key => $file) + { + if($file == "." || $file == "..") + continue; + + if(is_dir($tDir . $file)) + { + $subData = scandir($tDir . $file); + foreach($subData as $key => $subDir) + { + if($subDir == "." || $subDir == "..") + continue; + + $pages[$file][] = array("name" => strtolower(str_replace(".md", "", $subDir)), "path" => "$tDir$file/$subDir"); + } + } + else + $pages[strtolower(str_replace(".md", "", $file))][] = array("name" => strtolower(str_replace(".md", "", $file)), "path" => "$tDir$file"); + } + } + return $pages; + } + + public static function out($text) + { + echo date("Y-m-d H:i:s") . " > $text\n"; + } + + public static function exitNow() + { + return date("s") == 59; + } +} diff --git a/classes/War.php b/classes/War.php new file mode 100644 index 00000000..5c8eb117 --- /dev/null +++ b/classes/War.php @@ -0,0 +1,56 @@ + $id)); + if ($alliID != 0) $id = $alliID; + } + $active = $active ? "" : "not"; + $aggressing = Db::query("select * from zz_wars where aggressor = :id and timeFinished is $active null", array(":id" => $id)); + $defending = Db::query("select * from zz_wars where defender = :id and timeFinished is $active null", array(":id" => $id)); + if ($combined) return array_merge($aggressing, $defending); + return array("agr" => $aggressing, "dfd" => $defending); + } + + public static function getKillIDWarInfo($killID) + { + global $mdb; + $warID = $mdb->findField("killmails", "warID", ['killID' => $killID]); + return self::getWarInfo($warID); + } + + public static function getWarInfo($warID) + { + global $mdb; + $warInfo = array(); + if ($warID == null) return $warInfo; + $warInfo = $mdb->findDoc("information", ['type' => 'warID', 'id' => $warID]); + + $warInfo["warID"] = $warID; + $agr = $warInfo["aggressor"]["id"]; + $agrIsAlliance = self::isAlliance($agr); + $agrName = $agrIsAlliance ? Info::getAlliName($agr) : Info::getCorpName($agr); + $warInfo["agrName"] = $agrName; + $warInfo["agrLink"] = ($agrIsAlliance ? "/alliance/" : "/corporation/") . "$agr/"; + + $dfd = $warInfo["defender"]["id"]; + $dfdIsAlliance = self::isAlliance($dfd); + $dfdName = $dfdIsAlliance ? Info::getAlliName($dfd) : Info::getCorpName($dfd); + $warInfo["dfdName"] = $dfdName; + $warInfo["dfdLink"] = ($dfdIsAlliance ? "/alliance/" : "/corporation/") . "$dfd/"; + + $warInfo["dscr"] = "$agrName vs $dfdName"; + return $warInfo; + } + + public static function isAlliance($entityID) + { + global $mdb; + return $mdb->exists("information", ['type' => 'allianceID', 'id' => $entityID]); + } +} diff --git a/classes/XmlWrapper.php b/classes/XmlWrapper.php new file mode 100644 index 00000000..7a945913 --- /dev/null +++ b/classes/XmlWrapper.php @@ -0,0 +1,50 @@ +'; + $xml .= ''; + $date = date("Y-m-d H:i:s"); + $cachedUntil = date("Y-m-d H:i:s", strtotime("+1 hour")); + + $xml .= ''.$date.''; + $xml .= ''; + if(!empty($array)) + { + $xml .= ''; + foreach($array as $kill) + { + $xml .= ''; + $xml .= ''; + if(!isset($parameters["no-attackers"]) && !empty($kill["attackers"])) + { + $xml .= ''; + foreach($kill["attackers"] as $attacker) + $xml .= ''; + $xml .= ''; + } + if(!isset($parameters["no-items"]) && !empty($kill["items"])) + { + $xml .= ''; + foreach($kill["items"] as $item) + $xml .= ''; + $xml .= ''; + } + $xml .= ''; + } + $xml .= ''; + } + else + { + $cachedUntil = date("Y-m-d H:i:s", strtotime("+5 minutes")); + $xml .= "No kills available"; + } + $xml .= ''; + $xml .= ''.$cachedUntil.''; + $xml .= ''; + return $xml; + } + +} diff --git a/classes/zKBSession.php b/classes/zKBSession.php new file mode 100644 index 00000000..b6c0f287 --- /dev/null +++ b/classes/zKBSession.php @@ -0,0 +1,38 @@ +ttl); + return true; + } + + public function destroy($id) + { + Cache::delete($id); + return true; + } + + public function gc($maxlifetime) + { + return true; + } +} diff --git a/composer.json b/composer.json new file mode 100644 index 00000000..d8eb00b5 --- /dev/null +++ b/composer.json @@ -0,0 +1,19 @@ +{ + "require": { + "3rdpartyeve/phealng": "1.*", + "3rdpartyeve/perry": "1.*", + "phpmailer/phpmailer": "*", + "mobiledetect/mobiledetectlib": "*", + "dg/twitter-php": "*", + "ircmaxell/password-compat": "*", + "cvweiss/zlibrary" : "*", + "slim/slim": "2.*", + "slim/views": "0.1.*", + "filp/whoops": "1.*", + "zeuxisoo/slim-whoops": "0.2.0", + "twig/twig": "1.*", + "erusev/parsedown": "dev-master" + }, + "minimum-stability": "stable", + "prefer-stable": true +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 00000000..09671b38 --- /dev/null +++ b/composer.lock @@ -0,0 +1,776 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "8484b92d751739da72ad0f371b48a939", + "packages": [ + { + "name": "3rdpartyeve/perry", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/3rdpartyeve/perry.git", + "reference": "06a0141e18733887005d8548d5de2fda5507648c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/3rdpartyeve/perry/zipball/06a0141e18733887005d8548d5de2fda5507648c", + "reference": "06a0141e18733887005d8548d5de2fda5507648c", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "4.0.*" + }, + "require-dev": { + "phpunit/phpunit": "4.0.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Perry\\": "src/Perry/", + "Psr\\": "src/Psr/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Peter Petermann", + "email": "ppetermann80@googlemail.com" + } + ], + "description": "A PHP Library to access EVE Online's CREST API", + "time": "2014-07-25 14:44:48" + }, + { + "name": "3rdpartyeve/phealng", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/3rdpartyeve/phealng.git", + "reference": "9ade7445bfbb7897184f76a48ff35b1b5b76855f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/3rdpartyeve/phealng/zipball/9ade7445bfbb7897184f76a48ff35b1b5b76855f", + "reference": "9ade7445bfbb7897184f76a48ff35b1b5b76855f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pheal\\": "lib/Pheal/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Peter Petermann", + "email": "ppetermann80@googlemail.com", + "homepage": "http://devedge.eu" + }, + { + "name": "Wollari", + "homepage": "http://evemaps.dotlan.net/" + } + ], + "description": "PHP Eve Api Library, a simple PHP lib to access the EVE Online API", + "homepage": "https://github.com/3rdpartyeve/phealng", + "keywords": [ + "EVE API", + "EVE Online", + "Pheal", + "PhealNG" + ], + "time": "2014-06-17 10:36:52" + }, + { + "name": "cvweiss/zcache", + "version": "v0.1.3", + "source": { + "type": "git", + "url": "https://github.com/cvweiss/zcache.git", + "reference": "c502ab29aa72a7be2b342ca731a692f4560cd3e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cvweiss/zcache/zipball/c502ab29aa72a7be2b342ca731a692f4560cd3e4", + "reference": "c502ab29aa72a7be2b342ca731a692f4560cd3e4", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-0": { + "": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GNU Affero General Public License" + ], + "authors": [ + { + "name": "Clinton Weiss", + "email": "cvweiss@gmail.com" + } + ], + "description": "Library of classes to simplify caching", + "time": "2014-05-15 19:36:29" + }, + { + "name": "cvweiss/zlibrary", + "version": "v0.3.2", + "source": { + "type": "git", + "url": "https://github.com/cvweiss/zlibrary.git", + "reference": "999dd5c09ee9ecb3c7ebc17334d945b55b76ce28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cvweiss/zlibrary/zipball/999dd5c09ee9ecb3c7ebc17334d945b55b76ce28", + "reference": "999dd5c09ee9ecb3c7ebc17334d945b55b76ce28", + "shasum": "" + }, + "require": { + "cvweiss/zcache": "*" + }, + "type": "library", + "autoload": { + "psr-0": { + "": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GNU Affero General Public License" + ], + "authors": [ + { + "name": "Clinton Weiss", + "email": "cvweiss@gmail.com" + } + ], + "description": "Library of classes to simplify various tasks", + "time": "2014-05-13 14:04:08" + }, + { + "name": "dg/twitter-php", + "version": "v3.3", + "source": { + "type": "git", + "url": "https://github.com/dg/twitter-php.git", + "reference": "9836ec207ce85ad0b78172d54db3aafac82fb815" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dg/twitter-php/zipball/9836ec207ce85ad0b78172d54db3aafac82fb815", + "reference": "9836ec207ce85ad0b78172d54db3aafac82fb815", + "shasum": "" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "http://davidgrudl.com" + } + ], + "description": "Small and easy Twitter wrapper for PHP.", + "homepage": "https://github.com/dg/twitter-php", + "keywords": [ + "oauth", + "twitter" + ], + "time": "2014-03-10 18:09:07" + }, + { + "name": "erusev/parsedown", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/erusev/parsedown.git", + "reference": "0220a930101e0e95472fcc71a5ea2c32e95d0721" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/erusev/parsedown/zipball/0220a930101e0e95472fcc71a5ea2c32e95d0721", + "reference": "0220a930101e0e95472fcc71a5ea2c32e95d0721", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-0": { + "Parsedown": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "http://erusev.com" + } + ], + "description": "Parser for Markdown.", + "homepage": "http://parsedown.org", + "keywords": [ + "markdown", + "parser" + ], + "time": "2014-08-26 06:31:52" + }, + { + "name": "filp/whoops", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "9f451fbc7b8cad5e71300672c340c28c6bec09ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/9f451fbc7b8cad5e71300672c340c28c6bec09ff", + "reference": "9f451fbc7b8cad5e71300672c340c28c6bec09ff", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "mockery/mockery": "0.9.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-0": { + "Whoops": "src/" + }, + "classmap": [ + "src/deprecated" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://github.com/filp/whoops", + "keywords": [ + "error", + "exception", + "handling", + "library", + "silex-provider", + "whoops", + "zf2" + ], + "time": "2014-07-11 05:56:54" + }, + { + "name": "guzzlehttp/guzzle", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "40db53833aaea528347994acd4578d7b9b2211ee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/40db53833aaea528347994acd4578d7b9b2211ee", + "reference": "40db53833aaea528347994acd4578d7b9b2211ee", + "shasum": "" + }, + "require": { + "guzzlehttp/streams": "~1.0", + "php": ">=5.4.0" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "~4.0", + "psr/log": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2014-04-16 17:33:22" + }, + { + "name": "guzzlehttp/streams", + "version": "1.5.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/streams.git", + "reference": "fb0d1ee29987c2bdc59867bffaade6fc88c2675f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/streams/zipball/fb0d1ee29987c2bdc59867bffaade6fc88c2675f", + "reference": "fb0d1ee29987c2bdc59867bffaade6fc88c2675f", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Stream\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Provides a simple abstraction over streams of data (Guzzle 4+)", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "Guzzle", + "stream" + ], + "time": "2014-08-10 23:57:01" + }, + { + "name": "ircmaxell/password-compat", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/ircmaxell/password_compat.git", + "reference": "1fc1521b5e9794ea77e4eca30717be9635f1d4f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ircmaxell/password_compat/zipball/1fc1521b5e9794ea77e4eca30717be9635f1d4f4", + "reference": "1fc1521b5e9794ea77e4eca30717be9635f1d4f4", + "shasum": "" + }, + "type": "library", + "autoload": { + "files": [ + "lib/password.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anthony Ferrara", + "email": "ircmaxell@php.net", + "homepage": "http://blog.ircmaxell.com" + } + ], + "description": "A compatibility library for the proposed simplified password hashing algorithm: https://wiki.php.net/rfc/password_hash", + "homepage": "https://github.com/ircmaxell/password_compat", + "keywords": [ + "hashing", + "password" + ], + "time": "2013-04-30 19:58:08" + }, + { + "name": "mobiledetect/mobiledetectlib", + "version": "2.8.4", + "source": { + "type": "git", + "url": "https://github.com/serbanghita/Mobile-Detect.git", + "reference": "58754ad5562d730e9ff64654494165a3dafe10cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/58754ad5562d730e9ff64654494165a3dafe10cb", + "reference": "58754ad5562d730e9ff64654494165a3dafe10cb", + "shasum": "" + }, + "require": { + "php": ">=5.0.0" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "type": "library", + "autoload": { + "classmap": [ + "Mobile_Detect.php" + ], + "psr-0": { + "Detection": "namespaced/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Serban Ghita", + "email": "serbanghita@gmail.com", + "homepage": "http://mobiledetect.net", + "role": "Developer" + } + ], + "description": "Mobile_Detect is a lightweight PHP class for detecting mobile devices. It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.", + "homepage": "https://github.com/serbanghita/Mobile-Detect", + "keywords": [ + "detect mobile devices", + "mobile", + "mobile detect", + "mobile detector", + "php mobile detect" + ], + "time": "2014-08-25 07:57:48" + }, + { + "name": "phpmailer/phpmailer", + "version": "v5.2.8", + "source": { + "type": "git", + "url": "https://github.com/PHPMailer/PHPMailer.git", + "reference": "d3802c597bff8f6c2ccfa3eab2a511aa01b8d68f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/d3802c597bff8f6c2ccfa3eab2a511aa01b8d68f", + "reference": "d3802c597bff8f6c2ccfa3eab2a511aa01b8d68f", + "shasum": "" + }, + "require": { + "php": ">=5.0.0" + }, + "require-dev": { + "phpdocumentor/phpdocumentor": "*", + "phpunit/phpunit": "4.0.*" + }, + "type": "library", + "autoload": { + "classmap": [ + "class.phpmailer.php", + "class.pop3.php", + "class.smtp.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1" + ], + "authors": [ + { + "name": "Jim Jagielski", + "email": "jimjag@gmail.com" + }, + { + "name": "Marcus Bointon", + "email": "phpmailer@synchromedia.co.uk" + }, + { + "name": "Andy Prevost", + "email": "codeworxtech@users.sourceforge.net" + }, + { + "name": "Brent R. Matzelle" + } + ], + "description": "PHPMailer is a full-featured email creation and transfer class for PHP", + "time": "2014-05-14 07:04:18" + }, + { + "name": "slim/slim", + "version": "2.4.3", + "source": { + "type": "git", + "url": "https://github.com/codeguy/Slim.git", + "reference": "4906b77a07c7bd6ff1a99aea903e940a2d4fa106" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/codeguy/Slim/zipball/4906b77a07c7bd6ff1a99aea903e940a2d4fa106", + "reference": "4906b77a07c7bd6ff1a99aea903e940a2d4fa106", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "suggest": { + "ext-mcrypt": "Required for HTTP cookie encryption" + }, + "type": "library", + "autoload": { + "psr-0": { + "Slim": "." + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Josh Lockhart", + "email": "info@joshlockhart.com", + "homepage": "http://www.joshlockhart.com/" + } + ], + "description": "Slim Framework, a PHP micro framework", + "homepage": "http://github.com/codeguy/Slim", + "keywords": [ + "microframework", + "rest", + "router" + ], + "time": "2014-04-05 18:33:59" + }, + { + "name": "slim/views", + "version": "0.1.2", + "target-dir": "Slim/Views", + "source": { + "type": "git", + "url": "https://github.com/codeguy/Slim-Views.git", + "reference": "f0a05ea0b654218e40de692ed7cddcad1cf4b828" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/codeguy/Slim-Views/zipball/f0a05ea0b654218e40de692ed7cddcad1cf4b828", + "reference": "f0a05ea0b654218e40de692ed7cddcad1cf4b828", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "slim/slim": ">=2.4.0" + }, + "suggest": { + "smarty/smarty": "Smarty templating system", + "twig/twig": "Twig templating system" + }, + "type": "library", + "autoload": { + "psr-0": { + "Slim\\Views": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andrew Smith", + "email": "a.smith@silentworks.co.uk", + "homepage": "http://thoughts.silentworks.co.uk/" + }, + { + "name": "Josh Lockhart", + "email": "info@joshlockhart.com", + "homepage": "http://www.joshlockhart.com/" + } + ], + "description": "Smarty and Twig View Parser package for the Slim Framework", + "homepage": "http://github.com/codeguy/Slim-Views", + "keywords": [ + "extensions", + "slimphp", + "templating" + ], + "time": "2014-04-03 16:31:10" + }, + { + "name": "twig/twig", + "version": "v1.16.0", + "source": { + "type": "git", + "url": "https://github.com/fabpot/Twig.git", + "reference": "8ce37115802e257a984a82d38254884085060024" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fabpot/Twig/zipball/8ce37115802e257a984a82d38254884085060024", + "reference": "8ce37115802e257a984a82d38254884085060024", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.16-dev" + } + }, + "autoload": { + "psr-0": { + "Twig_": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + }, + { + "name": "Twig Team", + "homepage": "https://github.com/fabpot/Twig/graphs/contributors", + "role": "Contributors" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "http://twig.sensiolabs.org", + "keywords": [ + "templating" + ], + "time": "2014-07-05 12:19:05" + }, + { + "name": "zeuxisoo/slim-whoops", + "version": "0.2.0", + "source": { + "type": "git", + "url": "https://github.com/zeuxisoo/php-slim-whoops.git", + "reference": "189d6f8907e0f78d18513bb14897a91dd68a423f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zeuxisoo/php-slim-whoops/zipball/189d6f8907e0f78d18513bb14897a91dd68a423f", + "reference": "189d6f8907e0f78d18513bb14897a91dd68a423f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "filp/whoops": "1.*", + "phpunit/phpunit": "3.7.*@dev", + "slim/slim": "2.*" + }, + "type": "library", + "autoload": { + "psr-0": { + "Zeuxisoo\\Whoops\\Provider\\Slim\\WhoopsMiddleware": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zeuxis Lo", + "email": "seekstudio@gmail.com", + "homepage": "http://www.chair.im/", + "role": "Developer" + } + ], + "description": "PHP whoops error on slim framework", + "homepage": "https://github.com/zeuxisoo/php-slim-whoops/", + "keywords": [ + "error", + "exception", + "slim", + "whoops" + ], + "time": "2014-04-02 04:57:23" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "erusev/parsedown": 20 + }, + "prefer-stable": true, + "platform": [], + "platform-dev": [] +} diff --git a/cron/.gitignore b/cron/.gitignore new file mode 100644 index 00000000..f81aa792 --- /dev/null +++ b/cron/.gitignore @@ -0,0 +1,2 @@ +locks +logs diff --git a/cron/0.apiProducer.php b/cron/0.apiProducer.php new file mode 100644 index 00000000..e9ff1df1 --- /dev/null +++ b/cron/0.apiProducer.php @@ -0,0 +1,101 @@ +getCollection("apis"); +$information = $mdb->getCollection("information"); + +$apis->update(['lastApiUpdate' => null], ['$set' => ['lastApiUpdate' => new MongoDate(2)]], ['multiple' => true]); +$apis->update(['killID' => null], ['$set' => ['killID' => 0]], ['multiple' => true]); +$apis->update(['errorCode' => null], ['$set' => ['errorCode' => 0]], ['multiple' => true]); +$apis->update(['errorCode' => 28], ['$set' => ['errorCode' => 0]], ['multiple' => true]); + +$timer = new Timer(); +$requestNum = 0; + +while ($timer->stop() <= 58000) +{ + $row = $apis->findAndModify(['lastApiUpdate' => [ '$lt' => $mdb->now(-10800) ]], ['$set' => ['errorCode' => 0, 'lastApiUpdate' => new MongoDate(time())]], [], [ 'sort' => ['lastApiUpdate' => 1 ]]); + + if ($row == null) + { + sleep(1); + continue; + } + $pid = pcntl_fork(); + if ($pid == -1) exit(); + if ($pid != 0) + { + usleep(50000); + continue; + } + + $keyID = $row["keyID"]; + $vCode = $row["vCode"]; + + if (!isset($row["characters"])) $row["characters"] = []; + $hasKills = false; + foreach ($row["characters"] as $charID=>$killID) + { + $hasKills |= $killID > 0; + } + + $errorCode = (int) @$row["errorCode"]; + if ($errorCode == 0 || $errorCode == 221) + { + \Pheal\Core\Config::getInstance()->http_user_agent = "API Fetcher for http://$baseAddr"; + \Pheal\Core\Config::getInstance()->http_post = false; + \Pheal\Core\Config::getInstance()->http_keepalive = true; // default 15 seconds + \Pheal\Core\Config::getInstance()->http_keepalive = 10; // KeepAliveTimeout in seconds + \Pheal\Core\Config::getInstance()->http_timeout = 30; + //if ($phealCacheLocation != null) \Pheal\Core\Config::getInstance()->cache = new \Pheal\Cache\FileStorage($phealCacheLocation); + \Pheal\Core\Config::getInstance()->api_customkeys = true; + + $requestNum++; + $apiServer = $apiServers[($requestNum % (sizeof($apiServers)))]; + \Pheal\Core\Config::getInstance()->api_base = $apiServer; + $pheal = new \Pheal\Pheal($keyID, $vCode); + try + { + $apiKeyInfo = $pheal->ApiKeyInfo(); + } catch (Exception $ex) + { + $errorCode = (int) $ex->getCode(); + if ($errorCode == 904) { Util::out("(apiProducer) 904'ed"); exit(); } + if ($errorCode == 28) + { + $apis->update(['_id' => $row["_id"]], ['$set' => ['lastApiUpdate' => $mdb->now(-9600)]]); + Util::out("(apiProducer) API Server timeout"); + exit(); + } + if ($errorCode != 221 && $debug) Util::out("(apiProducer) Error Validating $keyID: " . $ex->getCode() . " " . $ex->getMessage()); + $apis->update(['_id' => $row["_id"]], ['$set' => ['errorCode' => $errorCode]]); + } + + if ($errorCode == 0) + { + $key = @$apiKeyInfo->key; + $accessMask = @$key->accessMask; + $characterIDs = array(); + if ($accessMask & 256) + { + foreach ($apiKeyInfo->key->characters as $character) + { + $characterID = (int) $character->characterID; + if (!isset($row["characters"][$characterID])) $row["characters"]["$characterID"] = 0; + $lastKillID = $row["characters"]["$characterID"]; + + // Make sure we have the names and id's in the information table + $mdb->insertUpdate("information", ['type' => 'corporationID', 'id' => ((int) $character->corporationID)], ['name' => ((string) $character->corporationName)]); + $mdb->insertUpdate("information", ['type' => 'characterID', 'id' => ((int) $characterID)], ['name' => ((string) $character->characterName), 'corporationID' => ((int) $character->corporationID)]); + + $type = $apiKeyInfo->key->type; + if ($debug) Util::out("Adding $keyID $characterID $type $vCode"); + + if (!$mdb->exists("apiCharacters", ['keyID' => $keyID, 'vCode' => $vCode, 'characterID' => $characterID, 'type' => $type])) $mdb->insert("apiCharacters", ['keyID' => $keyID, 'vCode' => $vCode, 'characterID' => $characterID, 'corporationID' => ((int) $character->corporationID), 'type' => $type, 'cachedUntil' => new MongoDate(2)]); + } + } + } + } + exit(); +} diff --git a/cron/1.apiConsumer.php b/cron/1.apiConsumer.php new file mode 100644 index 00000000..55f168e0 --- /dev/null +++ b/cron/1.apiConsumer.php @@ -0,0 +1,129 @@ +stop() <= 58000) +{ + $rows = $mdb->find("apiCharacters", ['cachedUntil' => ['$lt' => $mdb->now()]], ['cachedUntil' => 1], 1000); + if ($rows == null || sizeof($rows == 0)) sleep(1); + foreach ($rows as $row) + { + if ($timer->stop() > 58000) exit(); + $mdb->set("apiCharacters", $row, ['cachedUntil' => $mdb->now(7200)]); + + $pid = pcntl_fork(); + if ($pid == -1) exit(); + if ($pid != 0) + { + usleep(50000); + continue; + } + + $charID = $row["characterID"]; + $keyID = $row["keyID"]; + $vCode = $row["vCode"]; + $type = $row["type"]; + $maxKillID = (int) @$row["killID"]; + $charCorp = $type == "Corporation" ? "corp" : "char"; + $killsAdded = 0; + + \Pheal\Core\Config::getInstance()->http_method = "curl"; + \Pheal\Core\Config::getInstance()->http_user_agent = "API Fetcher for http://$baseAddr"; + \Pheal\Core\Config::getInstance()->http_post = false; + \Pheal\Core\Config::getInstance()->http_keepalive = 30; // KeepAliveTimeout in seconds + \Pheal\Core\Config::getInstance()->http_timeout = 60; + //if ($phealCacheLocation != null) \Pheal\Core\Config::getInstance()->cache = new \Pheal\Cache\FileStorage($phealCacheLocation); + \Pheal\Core\Config::getInstance()->api_customkeys = true; + \Pheal\Core\Config::getInstance()->api_base = "https://api.eveonline.com/"; + $pheal = new \Pheal\Pheal($keyID, $vCode); + + $charCorp = ($type == "Corporation" ? 'corp' : 'char'); + $pheal->scope = $charCorp; + $result = null; + + $params = array(); + $params['characterID'] = $charID; + $result = null; + + try + { + $result = $pheal->KillMails($params); + //Util::out("(apiConsumer) Poked KillLog $keyID $vCode $charID"); + } catch (Exception $ex) + { + $errorCode = $ex->getCode(); + if ($errorCode == 904) { Util::out("(apiConsumer) 904'ed..."); exit(); } + if ($errorCode == 28) + { + Util::out("(apiConsumer) API Server timeout"); + exit(); + } + // Error code 0: Scotty is up to his shenanigans again (aka server issue) + // Error code 221: server randomly throwing an illegal access error even though this is a legit call + if ($errorCode != 0 && $errorCode != 221) $mdb->remove("apiCharacters", $row); + exit(); + } + $newMaxKillID = $maxKillID; + foreach ($result->kills as $kill) + { + $killID = (int) $kill->killID; + + //$exists = $mdb->exists("killmails", ['killID' => $killID]); + $newMaxKillID = (int) max($newMaxKillID, $killID); + + $json = json_encode($kill->toArray()); + $killmail = json_decode($json, true); + $killmail["killID"] = (int) $killID; // make sure killID is an int; + if (!$mdb->exists("crestmails", ['killID' => $killID]) && !$mdb->exists("apimails", ['killID' => $killID])) $mdb->insertUpdate("apimails", $killmail); + + $victim = $killmail["victim"]; + $victimID = $victim["characterID"] == 0 ? "None" : $victim["characterID"]; + + $attackers = $killmail["attackers"]; + $attacker = null; + if ($attackers != null) foreach($attackers as $att) + { + if ($att["finalBlow"] != 0) $attacker = $att; + } + if ($attacker == null) $attacker = $attackers[0]; + $attackerID = $attacker["characterID"] == 0 ? "None" : $attacker["characterID"]; + + $shipTypeID = $victim["shipTypeID"]; + + $dttm = (strtotime($killmail["killTime"]) * 10000000) + 116444736000000000; + + $string = "$victimID$attackerID$shipTypeID$dttm"; + + $hash = sha1($string); + + $killInsert = ['killID' => (int) $killID, 'hash' => $hash]; + $exists = $mdb->exists("crestmails", $killInsert); + if (!$exists) $mdb->getCollection("crestmails")->save(['killID' => (int) $killID, 'hash' => $hash, 'processed' => false, 'source' => 'api', 'added' => $mdb->now()]); + if (!$exists) $killsAdded++; + if (!$exists && $debug) Util::out("Added $killID from API"); + } + + // helpful info for output if needed + $info = $mdb->findDoc("information", ['type' => 'characterID', 'id' => $charID], [], [ 'name' => 1, 'corporationID' => 1]); + $corpInfo = $mdb->findDoc("information", ['type' => 'corporationID', 'id' => @$info["corporationID"]], [], [ 'name' => 1]); + + // If we got new kills tell the log about it + if ($killsAdded > 0) + { + if ($type == "Corporation") $name = "corp " . @$corpInfo["name"]; + else $name = "char " . @$info["name"]; + while (strlen("$killsAdded") < 3) $killsAdded = " " . $killsAdded; + Util::out("$killsAdded kills added by $name"); + } + + // Temp code to show chars as api verified in the mariadb + $corpID = (int) @$info["corporationID"]; + //Db::execute("replace into zz_api_characters (keyID, characterID, corporationID, isDirector, maxKillID, lastChecked, errorCode) values (:keyID, :charID, :corpID, :isD, :maxKillID, now(), 0)", array(":keyID" => $keyID, ":charID" => $charID, ":isD" => ($type == "Corporation" ? 'T' : 'F'), ":maxKillID" => $newMaxKillID, ":corpID" => $corpID)); + + $cachedUntil = $newMaxKillID == 0 ? $mdb->now(86400) : new MongoDate(strtotime($result->cached_until)); + $mdb->set("apiCharacters", $row, ['maxKillID' => $newMaxKillID, 'cachedUntil' => $cachedUntil]); + exit(); + } +} diff --git a/cron/1.stompListen.php b/cron/1.stompListen.php new file mode 100644 index 00000000..522dfbc4 --- /dev/null +++ b/cron/1.stompListen.php @@ -0,0 +1,36 @@ +setReadTimeout(1); +foreach($topics as $topic) $stomp->subscribe($topic, array("id" => "zkb-".$baseAddr, "persistent" => "true", "ack" => "client", "prefetch-count" => 1)); + +$stompCount = 0; +$timer = new Timer(); + +while ($timer->stop() <= 86400000) +{ + $frame = $stomp->readFrame(); + if(!empty($frame)) + { + $killdata = json_decode($frame->body, true); + $killID = (int) $killdata["killID"]; + + if ($killID == 0) continue; + $hash = $hash = Killmail::getCrestHash($killID, $killdata); + $killdata["killID"] = $killID; // Make sure its an int + if (!$mdb->exists("apimails", ['killID' => $killID])) $mdb->insertUpdate("apimails", $killdata); + if (!$mdb->exists("crestmails", ['killID' => $killID, 'hash' => $hash])) + { + $stompCount++; + $i = $mdb->getCollection("crestmails")->insert(['killID' => $killID, 'hash' => $hash, 'processed' => false, 'source' => 'stomp', 'added' => $mdb->now()]); + } + if (!$mdb->exists("stompmails", ['killID' => $killID])) $mdb->save("stompmails", $killdata); + $stomp->ack($frame->headers["message-id"]); + } +} +if ($stompCount > 0) Util::out("New kills from STOMP: $stompCount"); diff --git a/cron/1.warConsumer.php b/cron/1.warConsumer.php new file mode 100644 index 00000000..54853b3c --- /dev/null +++ b/cron/1.warConsumer.php @@ -0,0 +1,79 @@ +stop() < 58000) +{ + $now = $timer->stop(); + $wars = $mdb->find("information", ['type' => 'warID', 'lastCrestUpdate' => ['$lt' => $mdb->now(-9600)], 'finished' => ['$ne' => true]], ['lastCrestUpdate' => 1], 1000); + + if (count($wars) == 0) exit(); + + foreach ($wars as $warRow) + { + if ($timer->stop() > 58000) exit(); + $id = $warRow["id"]; + + if (@$warRow["timeFinished"] != null) + { + $threeDays = date("Y-m-d", (time() - (86400 * 3))); + + $warFinished = substr($warRow["timeFinished"], 0, 10); + if ($warFinished <= $threeDays) + { + $mdb->set("information", ['type' => 'warID', 'id' => $id], ['finished' => true]); + continue; + } + } + + $href = "https://public-crest.eveonline.com/wars/$id/"; + $war = CrestTools::getJSON($href); + + $war["lastCrestUpdate"] = $mdb->now(); + $war["id"] = $id; + $war["finished"] = false; + $mdb->insertUpdate("information", ['type' => 'warID', 'id' => $id], $war); + + $prevKills = @$warRow["agrShipsKilled"] + @$warRow["dfdShipsKilled"]; + $currKills = $war["aggressor"]["shipsKilled"] + $war["defender"]["shipsKilled"]; + //echo "$id - $prevKills $currKills " . $warRow["lastCrestUpdate"] . "\n"; + + // Don't fetch killmail api for wars with no kill count change + if ($prevKills != $currKills) + { + $kmHref = $war["killmails"]; + $page = floor($mdb->count("warmails", ['warID' => $id]) / 2000); + if ($page == 0) $page = 1; + else if ($page > 1) $kmHref .= "?page=$page"; + while ($kmHref != null) + { + //echo "$kmHref\n"; + sleep(1); + $killmails = CrestTools::getJSON($kmHref); + + foreach($killmails["items"] as $kill) + { + $href = $kill["href"]; + $exploded = explode("/", $href); + $killID = (int) $exploded[4]; + $hash = $exploded[5]; + + $mdb->insertUpdate("warmails", ['warID' => $id, 'killID' => $killID]); + if (!$mdb->exists("crestmails", ['killID' => $killID, 'hash' => $hash])) + { + $mdb->insert("crestmails", ['killID' => (int) $killID, 'hash' => $hash], ['processed' => false]); + Util::out("New WARmail $killID"); + } + //$added += $aff; + } + $next = @$killmails["next"]["href"]; + if ($next != $kmHref) $kmHref = $next; + else $kmHref = null; + } + } + sleep(1); + } +} diff --git a/cron/2.crest_fetch.php b/cron/2.crest_fetch.php new file mode 100644 index 00000000..94659461 --- /dev/null +++ b/cron/2.crest_fetch.php @@ -0,0 +1,97 @@ +getCollection("crestmails"); +$rawmails = $mdb->getCollection("rawmails"); +$queueProcess = $mdb->getCollection("queueProcess"); + +$counter = 0; +$timer = new Timer(); +while (!Util::exitNow() && $timer->stop() < 115000) +{ + $unprocessed = $crestmails->find(array("processed" => false))->sort(['killID' => -1])->limit(10); + + if (!$unprocessed->hasNext()) sleep(1); + foreach ($unprocessed as $crestmail) + { + if (Util::exitNow()) break; + $id = $crestmail["killID"]; + $hash = $crestmail["hash"]; + + if ($mdb->exists("killmails", ['killID' => $id])) + { + $crestmails->update($crestmail, array('$set' => array("processed" => true))); + continue; + } + + $killmail = CrestTools::fetch($id, $hash); + if ($killmail == null || $killmail == "") + { + $crestmails->update($crestmail, array('$set' => array("processed" => null))); + continue; + } + unset($crestmail["npcOnly"]); + unset($killmail["zkb"]); + unset($killmail["_id"]); + + if (!$mdb->exists("rawmails", ['killID' => (int) $id])) $rawmails->save($killmail); + + if (!validKill($killmail)) + { + $crestmail["npcOnly"] = true; + $crestmail["processed"] = true; + $crestmails->save($crestmail); + continue; + } + + $killID = @$killmail["killID"]; + if ($killID != 0) + { + $crestmail["processed"] = true; + $crestmails->save($crestmail); + $queueProcess->update(["killID" => $id], ["killID" => $id], ["upsert" => true]); + $counter++; + + $mdb->getCollection("queueShare")->insert(['killID' => $killID]); + } + else + { + $crestmails->update($crestmail, array('$set' => array("processed" => null))); + } + } +} +if ($debug && $counter > 0) Util::out("Added " . number_format($counter, 0) . " Kills."); + + +function validKill(&$kill) +{ + // Show all pod kills + $victimShipID = $kill["victim"]["shipType"]["id"]; + if ($victimShipID == 670 || $victimShipID == 33328) return true; + + $npcOnly = true; + $victimCorp = $kill["victim"]["corporation"]["id"] < 1000999 ? 0 : $kill["victim"]["corporation"]["id"]; + + $blueOnBlue = true; + foreach ($kill["attackers"] as $attacker) { + if (isset($attacker["shipType"]["id"])) + { + $attackerGroupID = Info::getGroupID($attacker["shipType"]["id"]); + if ($attackerGroupID == 365) return true; // A tower is involved + if ($attackerGroupID == 99) return true; // A sentry gun is involved + } + + if (isset($attacker["shipType"]["id"]) && $attacker["shipType"]["id"] == 34495) return true; // A drifter is involved + + // Don't process the kill if it's NPC only + if (isset($attacker["corporation"]["id"]) && $attacker["corporation"]["id"] == 1000125) return true; + //if (!isset($attacker["character"]["id"]) || !isset($attacker["corporation"]["id"])) continue; + $npcOnly &= @$attacker["character"]["id"] == 0 && (@$attacker["corporation"]["id"] < 1999999 && @$attacker["corporation"]["id"] != 1000125); + } + if ($npcOnly) return false; + + return true; +} diff --git a/cron/3.queueProcess.php b/cron/3.queueProcess.php new file mode 100644 index 00000000..11b1d9ec --- /dev/null +++ b/cron/3.queueProcess.php @@ -0,0 +1,190 @@ +getCollection("crestmails"); +$killmails = $mdb->getCollection("killmails"); +$queueProcess = $mdb->getCollection("queueProcess"); +$storage = $mdb->getCollection("storage"); + +$counter = 0; +$timer = new Timer(); + +while(!Util::exitNow()) +{ + $mails = $queueProcess->find()->sort(['killID' => -1]); + if (!$mails->hasNext()) sleep(1); + foreach ($mails as $row) + { + $killID = $row["killID"]; + $raw = $mdb->findDoc("rawmails", ['killID' => $killID]); + $mail = $raw; + + $kill = array(); + $kill["killID"] = $killID; + + $crestmail = $crestmails->findOne(["killID" => $killID, "processed" => true]); + if ($crestmail == null) continue; + + $date = substr($mail["killTime"], 0, 10); + $date = str_replace(".", "-", $date); + $today = date("Y-m-d"); + $kill["dttm"] = new MongoDate(strtotime(str_replace(".", "-", $mail["killTime"]) . " UTC")); + + $system = $mdb->findDoc("information", ['type' => 'solarSystemID', 'id' => (int) $mail["solarSystem"]["id"]]); + if ($system == null) + { + Util::out("Unknown system - " . $mail["solarSystem"]["id"]); + continue; + } + $solarSystem = array(); + $solarSystem["solarSystemID"] = (int) $mail["solarSystem"]["id"]; + $solarSystem["security"] = (double) $system["secStatus"]; + $solarSystem["regionID"] = (int) $system["regionID"]; + $kill["system"] = $solarSystem; + + $sequence = $mdb->findField("killmails", "sequence", ['sequence' => [ '$ne' => null]], ['sequence' => -1]); + if ($sequence == null) $sequence = 0; + $kill["sequence"] = $sequence + 1; + + $kill["attackerCount"] = (int) $mail["attackerCount"]; + $victim = createInvolved($mail["victim"]); + $victim["isVictim"] = true; + $kill["vGroupID"] = $victim["groupID"]; + + $involved = array(); + $involved[] = $victim; + + foreach($mail["attackers"] as $attacker) + { + $att = createInvolved($attacker); + $att["isVictim"] = false; + $involved[] = $att; + } + $kill["involved"] = $involved; + $kill["awox"] = isAwox($kill); + $kill["solo"] = isSolo($kill); + + $items = $mail["victim"]["items"]; + $i = array(); + $destroyedValue = 0; + $droppedValue = 0; + + $totalValue = processItems($mail["victim"]["items"], $date); + $totalValue += Price::getItemPrice($mail["victim"]["shipType"]["id"], $date, true); + + $zkb = array(); + + if (isset($mail["war"]["id"]) && $mail["war"]["id"] != 0) $kill["warID"] = (int) $mail["war"]["id"]; + + $zkb["hash"] = $crestmail["hash"]; + $zkb["totalValue"] = (double) $totalValue; + $zkb["points"] = (int) Points::getKillPoints($kill, $zkb["totalValue"]); + $kill["zkb"] = $zkb; + + $exists = $killmails->count(['killID' => $killID]); + if ($exists == 0) $killmails->save($kill); + $oneWeekExists = $mdb->exists("oneWeek", ['killID' => $killID]); + if (!$oneWeekExists) $mdb->getCollection("oneWeek")->save($kill); + + $storage->update(array("locker" => "killsProcessed"), array('$inc' => array('contents' => 1)), array('upsert' => true)); + $storage->update(array("locker" => "totalKills"), array('$inc' => array('contents' => 1)), array('upsert' => true)); + $mdb->insertUpdate("queueInfo", ['killID' => $killID]); + $mdb->insertUpdate("queueSocial", ['killID' => $killID]); + + $queueProcess->remove($row); + + $counter++; + if (Util::exitNow()) break; + } + sleep(1); + if ($timer->stop() > 110000) exit(); +} +if ($debug && $counter > 0) Util::out("Processed " . number_format($counter, 0) . " Kills."); + +function createInvolved($data) +{ + global $mdb; + $dataArray = array("character", "corporation", "alliance", "faction", "shipType"); + $array = array(); + + foreach ($dataArray as $index) + { + if (isset($data[$index]["id"]) && $data[$index]["id"] != 0) $array["${index}ID"] = (int) $data[$index]["id"]; + } + if (isset($array["shipTypeID"]) && Info::getGroupID($array["shipTypeID"]) == -1) + { + $mdb->getCollection("information")->update(['type' => 'group'], ['$set' => [ 'lastCrestUpdate' => new MongoDate(1)]]); + Util::out("Bailing on processing a kill, unable to find groupID for " . $array["shipTypeID"]); + exit(); + } + if (isset($array["shipTypeID"])) $array["groupID"] = (int) Info::getGroupID($array["shipTypeID"]); + if (isset($data["finalBlow"]) && $data["finalBlow"] == true) $array["finalBlow"] = true; + return $array; +} + +function processItems($items, $dttm, $isCargo = false, $parentFlag = 0) +{ + $totalCost = 0; + foreach ($items as $item) { + $totalCost += processItem($item, $dttm, $isCargo, $parentFlag); + if (@is_array($item["items"])) { + $itemContainerFlag = $item["flag"]; + $totalCost += processItems($item["items"], $dttm, true, $itemContainerFlag); + } + } + return $totalCost; +} + +function processItem($item, $dttm, $isCargo = false, $parentContainerFlag = -1) +{ + $typeID = $item["itemType"]["id"]; + $itemName = Db::queryField("select typeName from ccp_invTypes where typeID = :typeID", "typeName", array(":typeID" => $typeID), 0); + if ($itemName == null) $itemName = "TypeID $typeID"; + + if ($typeID == 33329 && $item["flag"] == 89) $price = 0.01; // Golden pod implant can't be destroyed + else $price = Price::getItemPrice($typeID, $dttm, true); + if ($isCargo && strpos($itemName, "Blueprint") !== false) $item["singleton"] = 2; + if ($item["singleton"] == 2) { + $price = $price / 100; + } + + return ($price * (@$item["quantityDropped"] + @$item["quantityDestroyed"])); +} + +function isAwox($row) +{ + $isAwox = false; + $victim = $row["involved"][0]; + $vGroupID = $row["vGroupID"]; + if (isset($victim["corporationID"]) && $vGroupID != 29) + { + $vicCorpID = $victim["corporationID"]; + if ($vicCorpID > 0) foreach ($row["involved"] as $key=>$involved) + { + if ($key == 0) continue; + if (!isset($involved["finalBlow"])) continue; + if ($involved["finalBlow"] != true) continue; + + if (!isset($involved["corporationID"])) continue; + $invCorpID = $involved["corporationID"]; + if ($invCorpID == 0) continue; + if ($invCorpID <= 1999999) continue; + $isAwox |= $vicCorpID == $invCorpID; + } + } + return $isAwox; +} + +function isSolo($row) +{ + $notSolo = [29, 31, 237]; + + if ($row["attackerCount"] > 1) return false; + + // make sure the victim isn't a pod, shuttle, or noobship + $vGroupID = $row["vGroupID"]; + return !in_array($vGroupID, $notSolo); + exit(); +} diff --git a/cron/4.queueInfo.php b/cron/4.queueInfo.php new file mode 100644 index 00000000..a0688989 --- /dev/null +++ b/cron/4.queueInfo.php @@ -0,0 +1,163 @@ +getCollection("queueInfo"); +$queueStats = $mdb->getCollection("queueStats"); +$killmails = $mdb->getCollection("killmails"); +$rawmails = $mdb->getCollection("rawmails"); +$information = $mdb->getCollection("information"); +$statArray = ["characterID", "corporationID", "allianceID", "factionID", "shipTypeID", "groupID"]; + +while (!Util::exitNow()) +{ + $queue = $queueInfo->find()->sort(['_id' => -1])->limit(1000); + if (!$queue->hasNext()) sleep(1); + foreach ($queue as $row) + { + if (Util::exitNow()) break; + $killID = $row["killID"]; + + updateInfo($killID); + updateStatsQueue($killID); + + $queueInfo->remove(['killID' => $killID]); + } +} + +function updateStatsQueue($killID) +{ + global $killmails, $statArray, $queueStats; + + $kill = $killmails->findOne(['killID' => $killID]); + $involved = $kill["involved"]; + $sequence = $kill["sequence"]; + + // solar system + addToStatsQueue("solarSystemID", $kill["system"]["solarSystemID"], $sequence); + addToStatsQueue("regionID", $kill["system"]["regionID"], $sequence); + + $addedArray = []; + foreach ($involved as $inv) + { + foreach ($statArray as $stat) + { + if (isset($inv[$stat])) addToStatsQueue($stat, $inv[$stat], $sequence); + } + } +} + +function addToStatsQueue($type, $id, $sequence) +{ + global $queueStats, $mdb; + + $arr = ['type' => $type, 'id' => $id, 'sequence' => $sequence]; + if (!$mdb->exists("queueStats", $arr)) $queueStats->insert($arr); +} + +function updateInfo($killID) +{ + global $mdb, $debug; + + $killmail = $mdb->findDoc("rawmails", ['killID' => $killID]); + $system = $killmail["solarSystem"]; + $id = (int) $system["id"]; + if ($id == 0) return; + if ($mdb->count("information", ['type' => 'solarSystemID', 'id' => $id]) == 0) + { + // system doesn't exist in our database yet + $name = $system["name"]; + $crestSystem = CrestTools::getJSON($system["href"]); + if ($crestSystem == "") exit("no system \o/ $killID $id" . $system["href"]); + + $ex = explode("/", $crestSystem["constellation"]["href"]); + $constID = (int) $ex[4]; + if (!$mdb->exists("information", ['type' => 'constellationID', 'id' => $constID])) + { + $crestConst = CrestTools::getJSON($crestSystem["constellation"]["href"]); + if ($crestConst == "") exit(); + $constName = $crestConst["name"]; + + $regionURL = $crestConst["region"]["href"]; + $ex = explode("/", $regionURL); + $regionID = (int) $ex[4]; + + $mdb->insertUpdate("information", ['type' => 'constellationID', 'id' => $constID], ['name' => $constName, 'regionID' => $regionID]); + if ($debug) Util::out("Added constellation: $constName"); + } + $constellation = $mdb->findDoc("information", ['type' => 'constellation', 'id' => $constID]); + $regionID = (int) $constellation["regionID"]; + + if (!$mdb->exists("information", ['type' => 'regionID', 'id' => $regionID])) + { + $regionURL = "http://public-crest.eveonline.com/regions/$regionID/"; + $crestRegion = CrestTools::getJSON($regionURL); + if ($crestRegion == "") exit(); + + $regionName = $crestRegion["name"]; + $mdb->insertUpdate("information", ['type' => 'regionID', 'id' => $regionID], ['name' => $regionName]); + if ($debug) Util::out("Added region: $regionName"); + } + $mdb->insertUpdate("information", ['type' => 'solarSystemID', 'id' => $id], ['name' => $name, 'regionID' => $regionID, "secStatus" => ((double) $crestSystem["securityStatus"]), "secClass" => $crestSystem["securityClass"]]); + Util::out("Added system: $name"); + } + + updateItems($killID, $killmail["killTime"], @$killmail["victim"]["items"]); + updateEntity($killID, $killmail["victim"]); + foreach ($killmail["attackers"] as $entity) updateEntity($killID, $entity); +} + +function updateItems($killID, $killTime, $items) +{ + global $mdb; + + $time = strtotime(str_replace(".", "-", $killTime) . " UTC"); + if ($time < (time() - 2419200)) return; + + $dttm = new MongoDate($time); + foreach ($items as $item) + { + $typeID = (int) $item["itemType"]["id"]; + if (!$mdb->exists("itemmails", ['killID' => $killID, 'typeID' => $typeID])) $mdb->insert("itemmails", ['killID' => $killID, 'typeID' => $typeID, 'dttm' => $dttm]); + if (isset($items["items"])) updateItems($killID, $killTime, $items["items"]); + } +} + +function updateEntity($killID, $entity) +{ + global $information, $mdb, $debug; + $types = ["character", "corporation", "alliance", "faction"]; + + $timer = new Timer(); + for ($index = 0; $index < 4; $index++) + { + $type = $types[$index]; + if (!isset($entity[$type]["id"])) continue; + + $id = $entity[$type]["id"]; + $name = $entity[$type]["name"]; + + // Look for the current entry + $query = ['type' => $type . "ID", 'id' => $id, 'killID' => ['$gte' => $killID ]]; + if ($mdb->exists("information", $query)) continue; + unset($query["killID"]); + $row = $mdb->findDoc("information", $query); + + $new = ($row == null); + if (!isset($row["killID"])) $row["killID"] = 0; + if ($row != null && $killID <= $row["killID"]) echo "continuing..\n"; + if ($row != null && $killID <= $row["killID"]) continue; + + $updates = []; + $updates["name"] = $name; + $updates["killID"] = $killID; + + for ($subIndex = $index + 1; $subIndex < 4; $subIndex++) + { + $subType = $types[$subIndex]; + $updates["${subType}ID"] = (int) @$entity[$subType]["id"]; + } + $mdb->insertUpdate("information", $query, $updates); + if ($new && $debug) Util::out("Added $type: $name"); + } +} diff --git a/cron/6.queueStats.php b/cron/6.queueStats.php new file mode 100644 index 00000000..1cbec87b --- /dev/null +++ b/cron/6.queueStats.php @@ -0,0 +1,162 @@ +find("queueStats", [], ['sequence' => -1], 10000); + foreach ($calcStats as $row) + { + if ($timer->stop() > $maxTime) break; + while (sizeof($children) >= $maxChildren) + { + foreach($children as $child=>$v) + { + $status = 0; + $pid = pcntl_waitpid($child, $status, WNOHANG); + if ($pid == -1 || $pid > 0) unset($children[$child]); + } + if (sizeof($children) >= $maxChildren) usleep(1000); + } + + $id = $row["id"]; + $type = $row["type"]; + if (in_array($id, $inProgress)) continue; + $inProgress[] = $id; + $pid = pcntl_fork(); + if ($pid == 0) + { + //echo "running $type $id\n"; + calcStats($row); + $mdb->getCollection("queueStats")->remove($row); + $mdb->getCollection("queueStats")->remove(['type' => $row["type"], 'id' => $row["id"], 'sequence' => ['$lte' => $row["sequence"]]]); + exit(); + } + $children[$pid] = true; + } + $status = 0; + foreach($children as $child=>$v) pcntl_waitpid($child, $status); + $inProgress = []; + if (sizeof($calcStats) == 0) sleep(1); +} while ($timer->stop() <= $maxTime); +$status = 0; +foreach ($children as $pid=>$value) pcntl_wait($pid, $status); + +function calcStats($row) +{ + global $mdb, $debug; + + $type = $row["type"]; + $id = $row["id"]; + $newSequence = $row["sequence"]; + + $key = ['type' => $type, 'id' => $id]; + $stats = $mdb->findDoc("statistics", $key); + if ($stats === null) + { + $stats = []; + $stats['type'] = $type; + $stats['id'] = $id; + } + + $oldSequence = (int) @$stats["sequence"]; + if ($newSequence <= $oldSequence) return; + + for ($i = 0; $i <= 1; $i++) + { + $isVictim = ($i == 0); + if (($type == "regionID" || $type == "solarSystemID") && $isVictim == true) continue; + + // build the query + $query = [$row["type"] => $row["id"], 'isVictim' => $isVictim]; + $query = MongoFilter::buildQuery($query); + // set the proper sequence values + $query = ['$and' => [['sequence' => ['$gt' => $oldSequence]], ['sequence' => ['$lte' => $newSequence]], $query]]; + + $allTime = $mdb->group("killmails", [], $query, 'killID', ['zkb.points', 'zkb.totalValue']); + mergeAllTime($stats, $allTime, $isVictim); + + $groups = $mdb->group("killmails", "vGroupID", $query, 'killID', ['zkb.points', 'zkb.totalValue'], ['vGroupID' => 1]); + mergeGroups($stats, $groups, $isVictim); + + $months = $mdb->group("killmails", ['year' => 'dttm', 'month' => 'dttm'], $query, 'killID', ['zkb.points', 'zkb.totalValue'], ['year' => 1, 'month' => 1]); + mergeMonths($stats, $months, $isVictim); + } + + // Update the sequence + $stats["sequence"] = $newSequence; + // save it + $mdb->getCollection("statistics")->save($stats); + + $r = $mdb->getDb()->command(['getLastError' => 1]); + if ($r["ok"] != 1) die("stats update failure"); + if ($debug) Util::out("Stats completed for: $type $id $newSequence"); +} + +function mergeAllTime(&$stats, $result, $isVictim) +{ + if (sizeof($result) == 0) return; + + $row = $result[0]; + $dl = ($isVictim ? "Lost" : "Destroyed"); + @$stats["ships$dl"] += $row["killIDCount"]; + @$stats["points$dl"] += $row["zkb_pointsSum"]; + @$stats["isk$dl"] += (int) $row["zkb_totalValueSum"]; +} + +function mergeGroups(&$stats, $result, $isVictim) +{ + if (sizeof($result) == 0) return; + + $dl = ($isVictim ? "Lost" : "Destroyed"); + if (!isset($stats["groups"])) $stats["groups"] = []; + $groups = $stats["groups"]; + foreach ($result as $row) + { + $groupID = $row["vGroupID"]; + if (!isset($groups[$groupID])) $groups[$groupID] = []; + $groupStats = $groups[$groupID]; + $groupStats["groupID"] = $groupID; + + @$groupStats["ships$dl"] += $row["killIDCount"]; + @$groupStats["points$dl"] += $row["zkb_pointsSum"]; + @$groupStats["isk$dl"] += (int) $row["zkb_totalValueSum"]; + + $groups[$groupID] = $groupStats; + } + $stats["groups"] = $groups; +} + +function mergeMonths(&$stats, $result, $isVictim) +{ + if (sizeof($result) == 0) return; + + $dl = ($isVictim ? "Lost" : "Destroyed"); + if (!isset($stats["months"])) $stats["months"] = []; + $months = $stats["months"]; + foreach ($result as $row) + { + $year = $row["year"]; + $month = $row["month"]; + if (strlen($month) < 2) $month = "0$month"; + $yearMonth = "$year$month"; + + if (!isset($months[$yearMonth])) $months[$yearMonth] = []; + $monthStats = $months[$yearMonth]; + $monthStats["year"] = $year; + $monthStats["month"] = (int) $month; + + @$monthStats["ships$dl"] += $row["killIDCount"]; + @$monthStats["points$dl"] += $row["zkb_pointsSum"]; + @$monthStats["isk$dl"] += (int) $row["zkb_totalValueSum"]; + + $months[$yearMonth] = $monthStats; + } + $stats["months"] = $months; +} diff --git a/cron/9.allTimeRanks.php b/cron/9.allTimeRanks.php new file mode 100644 index 00000000..e7e8c446 --- /dev/null +++ b/cron/9.allTimeRanks.php @@ -0,0 +1,96 @@ +count("statistics", ['type' => $type]); + $rankingIDs = []; + + foreach ($categories as $category) + { + for ($i = 0; $i <= 1; $i++) + { + $field = $category . ($i == 0 ? "Destroyed" : "Lost"); + Util::out("$type Overall ranking $field"); + + $currentValue = -1; + $currentRank = 0; + + $mdb->getCollection("statistics")->update(['type' => $type, $field => null], ['$set' => [$field => 0]], ['multiple' => true, 'socketTimeoutMS' => -1]); + $allIDs = $mdb->find("statistics", ['type' => $type], [$field => -1], null, ['months' => 0, 'groups' => 0]); + $currentRank = 0; + foreach ($allIDs as $row) + { + $currentRank++; + $mdb->getCollection("statistics")->update($row, ['$set' => [ "{$field}Rank" => $currentRank ]]); + } + } + } + + $size = $mdb->count("statistics", ['type' => $type]); + $counter = 0; + Util::out("$type Overall rank calcing"); + $cursor = $mdb->find("statistics", ['type' => $type], [], null, ['months' => 0, 'groups' => 0]); + foreach ($cursor as $row) + { + $counter++; + $id = $row['id']; + + $shipsDestroyed = getValue($row, "shipsDestroyed", $size); + $shipsDestroyedRank = getValue($row, "shipsDestroyedRank", $size); + $shipsLost = getValue($row, "shipsLost", $size); + $shipsLostRank = getValue($row, "shipsLostRank", $size); + $shipsEff = ($shipsDestroyed / ($shipsDestroyed + $shipsLost)); + + $iskDestroyed = getValue($row, "iskDestroyed", $size); + $iskDestroyedRank = getValue($row, "iskDestroyedRank", $size); + $iskLost = getValue($row, "iskLost", $size); + $iskLostRank = getValue($row, "iskLostRank", $size); + $iskEff = ($iskDestroyed / ($iskDestroyed + $iskLost)); + + $pointsDestroyed = getValue($row, "pointsDestroyed", $size); + $pointsDestroyedRank = getValue($row, "pointsDestroyedRank", $size); + $pointsLost = getValue($row, "pointsLost", $size); + $pointsLostRank = getValue($row, "pointsLostRank", $size); + $pointsEff = ($pointsDestroyed / ($pointsDestroyed + $pointsLost)); + + $avg = ceil(($shipsDestroyedRank + $iskDestroyedRank + $pointsDestroyedRank) / 3); + $adjuster = (1 + $shipsEff + $iskEff + $pointsEff) / 4; + $score = ceil($avg / $adjuster); + + $mdb->getCollection("statistics")->update($row, ['$set' => [ 'overallScore' => (int) $score ]]); + } + + Util::out("$type Overall rank updating"); + $currentRank = 0; + $result = $mdb->find("statistics", ['type' => $type], ['overallScore' => 1], null, ['months' => 0, 'groups' => 0]); + foreach ($result as $row) + { + if (@$row["overallScore"] == null) $mdb->getCollection("statistics")->update($row, ['$unset' => [ 'overallRank' => 1 ]]); + else + { + $currentRank++; + $mdb->getCollection("statistics")->update($row, ['$set' => [ 'overallRank' => $currentRank ]]); + $mdb->insertUpdate("ranksProgress", ['type' => $type, 'id' => $row['id'], 'date' => $date], ['overallRank' => $currentRank]); + } + } + Util::out("Completed all time ranks for $type"); +} + +function getValue($array, $field, $default) +{ + $value = @$array[$field]; + if (((int) $value) != 0) return $value; + return $default; +} diff --git a/cron/9.alliances.php b/cron/9.alliances.php new file mode 100644 index 00000000..7a5a9b56 --- /dev/null +++ b/cron/9.alliances.php @@ -0,0 +1,66 @@ +now(3600 * 3); // 8 hours +$timer = new Timer(); + +$mdb->getCollection("information")->update(['type' => 'allianceID', 'lastApiUpdate' => null], ['$set' => ['lastApiUpdate' => new MongoDate(2) ]], ['multiple' => true]); +$alliances = $mdb->find("information", ['type' => 'allianceID', 'lastApiUpdate' => [ '$lt' => $old]], ['lastApiUpdate' => 1], 100); +foreach ($alliances as $alliance) +{ + if (Util::exitNow() || $timer->stop() > 110000) exit(); + $id = $alliance["id"]; + $name = $alliance["name"]; + //echo "$id $name\n"; + + $currentInfo = $mdb->findDoc("information", ['type' => 'alliance', 'id' => $id]); + + if (false && @$currentInfo["deleted"] == true) + { + $mdb->set("information", ['type' => 'alliance', 'id' => $id], ['lastApiUpdate' => $mdb->now()]); + continue; + } + + $alliCrest = CrestTools::getJSON("http://public-crest.eveonline.com/alliances/$id/"); + if ($alliCrest == null || !isset($alliCrest["name"])) + { + sleep(1); + $mdb->set("information", ['type' => 'alliance', 'id' => $id], ['lastApiUpdate' => $mdb->now()]); + continue; + } + + $update = []; + $update["lastApiUpdate"] = $mdb->now(); + $update["corpCount"] = (int) $alliCrest["corporationsCount"]; + $update["executorCorpID"] = (int) $alliCrest["executorCorporation"]["id"]; + addCorp($update["executorCorpID"]); + $memberCount = 0; + $update["deleted"] = $alliCrest["deleted"]; + + $mdb->set("information", ['type' => 'corporationID', 'allianceID' => $id], ['allianceID' => 0]); + if ($alliCrest["corporations"]) foreach ($alliCrest["corporations"] as $corp) + { + $corpID = (int) $corp["id"]; + addCorp($corpID); + $infoCorp = $mdb->findDoc("information", ['type' => 'corporationID', 'id' => $corpID]); + $memberCount += ((int) @$infoCorp["memberCount"]); + $mdb->set("information", ['type' => 'corporationID', 'id' => $corpID], ['allianceID' => $id]); + } + $update["memberCount"] = $memberCount; + $update["ticker"] = $alliCrest["shortName"]; + $update["name"] = $alliCrest["name"]; + + $mdb->insertUpdate("information", ['type' => 'allianceID', 'id' => $id], $update); + sleep(1); +} + +function addCorp($id) +{ + global $mdb; + + $query = ['type' => 'corporationID', 'id' => (int) $id]; + $infoCorp = $mdb->findDoc("information", $query); + if ($infoCorp == null) $mdb->insertUpdate("information", $query); +} diff --git a/cron/9.characters.php b/cron/9.characters.php new file mode 100644 index 00000000..5bc99ab3 --- /dev/null +++ b/cron/9.characters.php @@ -0,0 +1,52 @@ +getCollection("information"); +$timer = new Timer(); +$counter = 0; + +// This method doesn't lock the database for seconds at a time +$notSet = $information->find(['type' => 'characterID', 'lastApiUpdate' => null]); +foreach ($notSet as $row) +{ + $information->update($row, ['$set' => ['lastApiUpdate' => new MongoDate(2)]]); +} + +while ($timer->stop() < 55000) +{ + $result = $mdb->find("information", ['type' => 'characterID', 'lastApiUpdate' => [ '$lt' => $mdb->now(86400)]], ['lastApiUpdate' => 1], 100); + $ids = []; + foreach ($result as $row) $ids[] = $row["id"]; + $stringIDs = implode(",", $ids); + $href = "https://api.eveonline.com/eve/CharacterAffiliation.xml.aspx?ids=$stringIDs"; + $raw = file_get_contents($href); + $xml = @simplexml_load_string($raw); + + foreach ($xml->result->rowset->row as $info) + { + $updates = []; + + $id = (int) $info["characterID"]; + $row = $mdb->findDoc("information", ['type' => 'characterID', 'id' => $id]); + if (isset($info["characterName"])) + { +$counter++; + if ($row["name"] != (string) $info["characterName"]) $mdb->set("information", $row, ['name' => (string) $info["characterName"]]); + if (@$row["corporationID"] != (int) $info["corporationID"]) $updates[] = ['corporationID' => (int) $info["corporationID"]]; + if (!$mdb->exists("information", ['type' => 'corporationID', 'id' => (int) $info["corporationID"]])) $mdb->insert("information", ['type' => 'corporationID', 'id' => (int) $info["corporationID"], 'name' => (string) $info["corporationName"]]); + + if (isset($row["allianceID"]) && $info["allianceID"] == 0) $mdb->removeField("information", $row, "allianceID"); + else if (@$row["allianceID"] != (int) $info["allianceID"]) $updates[] = ['allianceID' => (int) $info["allianceID"]]; + if ($info["allianceID"] != 0 && !$mdb->exists("information", ['type' => 'allianceID', 'id' => (int) $info["allianceID"]])) $mdb->insert("information", ['type' => 'allianceID', 'id' => (int) $info["allianceID"], 'name' => (string) $info["allianceName"]]); + + if (isset($row["factionID"]) && $info["factionID"] == 0) $mdb->removeField("information", $row, "factionID"); + else if (@$row["factionID"] != (int) $info["factionID"]) $updates[] = ['factionID' => (int) $info["factionID"]]; + if ($info["factionID"] != 0 && !$mdb->exists("information", ['type' => 'factionID', 'id' => (int) $info["factionID"]])) $mdb->insert("information", ['type' => 'factionID', 'id' => (int) $info["factionID"], 'name' => (string) $info["factionName"]]); + } + $updates["lastApiUpdate"] = new MongoDate(time()); + $mdb->insertUpdate("information", ['type' => 'characterID', 'id' => (int) $row["id"]], $updates); + } + sleep(1); +} diff --git a/cron/9.corporations.php b/cron/9.corporations.php new file mode 100644 index 00000000..723e6673 --- /dev/null +++ b/cron/9.corporations.php @@ -0,0 +1,51 @@ +getCollection("information"); +$timer = new Timer(); + +$information->update(['type' => 'corporationID', 'lastApiUpdate' => null], ['$set' => ['lastApiUpdate' => new MongoDate(2)]], ['multiple' => true]); + +$result = $mdb->find("information", ['type' => 'corporationID', 'lastApiUpdate' => [ '$lt' => $mdb->now(86400)]], ['lastApiUpdate' => 1], 1000); +foreach ($result as $row) +{ + if (Util::exitNow() || $timer->stop() > 110000) exit(); + + $updates = []; + if (!isset($row["memberCount"]) || (isset($row["memberCount"]) && $row["memberCount"] != 0)) + { + $id = $row["id"]; + sleep(1); // slow things down + $raw = @file_get_contents("https://api.eveonline.com/corp/CorporationSheet.xml.aspx?corporationID=$id"); + if ($raw != "") + { + $counter++; + $xml = @simplexml_load_string($raw); + if ($xml != null) + { + $corpInfo = $xml->result; + if (isset($corpInfo->ticker)) + { + $ceoID = (int) $corpInfo->ceoID; + $ceoName = (string) $corpInfo->ceoName; + $updates["ticker"] = (string) $corpInfo->ticker; + $updates["ceoID"] = $ceoID; + $updates["memberCount"] = (int) $corpInfo->memberCount; + $updates["allianceID"] = (int) $corpInfo->allianceID; + if (!isset($row["name"])) $updates["name"] = (string) $corpInfo->corporationName; + + // Does the CEO exist in our info table? + $ceoExists = $mdb->count("information", ['type' => 'characterID', 'id' => $ceoID]); + if ($ceoExists == 0) + { + $mdb->insertUpdate("information", ['type' => 'characterID', 'id' => $ceoID], ['name' => $ceoName, 'corporationID' => $id]); + } + } + } + } + } + $updates["lastApiUpdate"] = new MongoDate(time()); + $mdb->insertUpdate("information", ['type' => 'corporationID', 'id' => (int) $row["id"]], $updates); +} diff --git a/cron/9.eve-kill.php b/cron/9.eve-kill.php new file mode 100644 index 00000000..b50b454e --- /dev/null +++ b/cron/9.eve-kill.php @@ -0,0 +1,19 @@ +find("queueShare", [], ['killID' => 1]); +foreach ($queueShare as $row) +{ + $killID = $row["killID"]; + if ($killID >= 45000000) // This is temporary while we're revalidating all older mails + { + $hash = $mdb->findField("crestmails", "hash", ['killID' => $killID, 'processed' => true]); + @file_get_contents("https://beta.eve-kill.net/crestmail/$killID/$hash/"); + } + $mdb->remove("queueShare", ['killID' => $killID]); +} diff --git a/cron/9.nameSearch.php b/cron/9.nameSearch.php new file mode 100644 index 00000000..c0d8fc3a --- /dev/null +++ b/cron/9.nameSearch.php @@ -0,0 +1,40 @@ +getCollection("information")->find(); + +foreach ($entities as $entity) +{ + $type = $entity["type"]; + $id = $entity["id"]; + $name = @$entity["name"]; + if ($name == "") continue; + + $flag = ""; + switch ($type) + { + case "warID": + continue; + case "corporationID": + $flag = @$entity["ticker"]; + break; + case "allianceID": + $flag = @$entity["ticker"]; + break; + case "typeID": + if ($mdb->exists("killmails", ['involved.shipTypeID' => $id])) $flag = "ship"; + break; + } + if ($flag == null) $flag = ""; + + $count = Db::queryField("select count(1) count from zz_name_search where type = :type and id = :id", "count", [":type" => $type, ":id" => $id], 0); + if ($count > 0) continue; + //echo "$type $id $name $flag\n"; + Db::execute("insert ignore into zz_name_search (type, id, name, flag) values (:type, :id, :name, :flag)", [':type' => $type, ':id' => $id, ':name' => $name, ":flag" => $flag]); +} diff --git a/cron/9.recentStats.php b/cron/9.recentStats.php new file mode 100644 index 00000000..056bacee --- /dev/null +++ b/cron/9.recentStats.php @@ -0,0 +1,154 @@ +remove("ranksProgress", ['date' => [ '$lt' => $mdb->now(-86400 * 14) ]]); + +foreach ($types as $type) +{ + Util::out("Started recent calcs for $type"); + //$calcStats = $mdb->find("information", ['type' => $type]); + //foreach ($calcStats as $row) calcStats($row, $ninetyDayKillID); + Util::out("Completed recent calcs for $type"); +} + +function calcStats($row, $ninetyDayKillID) +{ + global $mdb, $debug; + + $type = $row["type"]; + $id = $row["id"]; + + $killID = (int) @$row["killID"]; + $key = ['type' => $type, 'id' => $id]; + if ($killID < $ninetyDayKillID || !$mdb->exists("statistics", $key)) + { + $mdb->getCollection("statistics")->update($key, ['$unset' => ['recentShipsLost' => 1, 'recentPointsLost' => 1, 'recentIskLost' => 1, 'recentShipsDestroyed' => 1, 'recentPointsDestroyed' => 1, 'recentIskDestroyed' => 1]]); + return; + } + + $stats = []; + for ($i = 0; $i <= 1; $i++) + { + $isVictim = ($i == 0); + if (($type == "regionID" || $type == "solarSystemID") && $isVictim == true) continue; + + // build the query + $query = [$row["type"] => $row["id"], 'isVictim' => $isVictim]; + $query = MongoFilter::buildQuery($query); + // set the proper sequence values + $query = ['$and' => [['killID' => ['$gte' => $ninetyDayKillID]], $query]]; + + $recent = $mdb->group("killmails", [], $query, 'killID', ['zkb.points', 'zkb.totalValue']); + mergeAllTime($stats, $recent, $isVictim); + } + $mdb->getCollection("statistics")->update($key, ['$set' => $stats]); +} + +function mergeAllTime(&$stats, $result, $isVictim) +{ + if (sizeof($result) == 0) return; + + $row = $result[0]; + $dl = ($isVictim ? "Lost" : "Destroyed"); + @$stats["recentShips$dl"] += $row["killIDCount"]; + @$stats["recentPoints$dl"] += $row["zkb_pointsSum"]; + @$stats["recentIsk$dl"] += (int) $row["zkb_totalValueSum"]; +} + +$categories = ['Ships', 'Isk', 'Points']; + +foreach ($types as $type) +{ + Util::out("Starting recent ranking for $type"); + $size = $mdb->count("statistics", ['type' => $type]); + $rankingIDs = []; + + foreach ($categories as $category) + { + for ($i = 0; $i <= 1; $i++) + { + $field = $category . ($i == 0 ? "Destroyed" : "Lost"); + + $currentValue = -1; + $currentRank = 0; + + $allIDs = $mdb->find("statistics", ['type' => $type], ["recent$field" => -1], null, ['months' => 0, 'groups' => 0]); + $currentRank = 0; + + foreach ($allIDs as $row) + { + if (!isset($row["recent$field"])) continue; + $currentRank++; + $mdb->getCollection("statistics")->update($row, ['$set' => [ "recent{$field}Rank" => $currentRank ]]); + } + } + } + + $size = $mdb->count("statistics", ['type' => $type]); + $counter = 0; + $cursor = $mdb->find("statistics", ['type' => $type], [], null, ['months' => 0, 'groups' => 0]); + foreach ($cursor as $row) + { + $counter++; + $id = $row['id']; + + $shipsDestroyed = getValue($row, "recentShipsDestroyed", $size); + $shipsDestroyedRank = getValue($row, "recentShipsDestroyedRank", $size); + $shipsLost = getValue($row, "recentShipsLost", $size); + $shipsLostRank = getValue($row, "recentShipsLostRank", $size); + $shipsEff = ($shipsDestroyed / ($shipsDestroyed + $shipsLost)); + + $iskDestroyed = getValue($row, "recentIskDestroyed", $size); + $iskDestroyedRank = getValue($row, "recentIskDestroyedRank", $size); + $iskLost = getValue($row, "recentIskLost", $size); + $iskLostRank = getValue($row, "recentIskLostRank", $size); + $iskEff = ($iskDestroyed / ($iskDestroyed + $iskLost)); + + $pointsDestroyed = getValue($row, "recentPointsDestroyed", $size); + $pointsDestroyedRank = getValue($row, "recentPointsDestroyedRank", $size); + $pointsLost = getValue($row, "recentPointsLost", $size); + $pointsLostRank = getValue($row, "recentPointsLostRank", $size); + $pointsEff = ($pointsDestroyed / ($pointsDestroyed + $pointsLost)); + + $avg = ceil(($shipsDestroyedRank + $iskDestroyedRank + $pointsDestroyedRank) / 3); + $adjuster = (1 + $shipsEff + $iskEff + $pointsEff) / 4; + $score = ceil($avg / $adjuster); + + $mdb->getCollection("statistics")->update($row, ['$set' => [ 'recentOverallScore' => (int) $score ]]); + } + + $currentRank = 0; + $result = $mdb->find("statistics", ['type' => $type], ['recentOverallScore' => 1], null, ['months' => 0, 'groups' => 0]); + + foreach ($result as $row) + { + if (@$row["recentOverallScore"] == null) $mdb->getCollection("statistics")->update($row, ['$unset' => [ 'recentOverallRank' => 1 ]]); + else + { + $currentRank++; + $mdb->getCollection("statistics")->update($row, ['$set' => [ 'recentOverallRank' => $currentRank ]]); + $mdb->insertUpdate("ranksProgress", ['type' => $type, 'id' => $row['id'], 'date' => $date], ['recentOverallRank' => $currentRank]); + } + } +} + +function getValue($array, $field, $default) +{ + $value = @$array[$field]; + if (((int) $value) != 0) return $value; + return $default; +} diff --git a/cron/9.social.php b/cron/9.social.php new file mode 100644 index 00000000..fc46d09f --- /dev/null +++ b/cron/9.social.php @@ -0,0 +1,84 @@ +find("queueSocial", [], [], 100); + foreach ($result as $row) + { + $killID = $row["killID"]; + beSocial($killID); + $mdb->getCollection("queueSocial")->remove($row); + } + if (sizeof($result) == 0) sleep(1); +} + +function beSocial($killID) +{ + global $beSocial, $mdb; + + if (!isset($beSocial)) $beSocial = false; + if ($beSocial == false) return; + + if ($killID < 0) return; + $ircMin = 10000000000; + $twitMin = 10000000000; + + $kill = $mdb->findDoc("killmails", ['killID' => $killID]); + + if (@$kill["social"] == true) return; + $hours24 = time() - 86400; + if ($kill["dttm"]->sec < $hours24) return; + + + // Get victim info + $victimInfo = $kill["involved"][0]; + if ($victimInfo == null) return; + $totalPrice = $kill["zkb"]["totalValue"]; + + + while ($mdb->count("queueInfo", ['killID' => $killID])) sleep(1); + Info::addInfo($victimInfo); + + // Reduce spam of freighters and jump freighters + $shipGroupID = $victimInfo["groupID"]; + if (in_array($shipGroupID, array(513, 902))) { + $shipPrice = Price::getItemPrice($victimInfo["shipTypeID"], date("Ymd")); + $ircMin += $shipPrice; + $twitMin += $shipPrice; + } + + $worthIt = false; + $worthIt |= $totalPrice >= $ircMin; + if (!$worthIt) return; + + $tweetIt = false; + $tweetIt |= $totalPrice >= $twitMin; + + global $fullAddr, $twitterName; + $url = "$fullAddr/kill/$killID/"; + + if ($url == "") $url = "$fullAddr/kill/$killID/"; + $message = "|g|" . $victimInfo["shipName"] . "|n| worth |r|" . Util::formatIsk($totalPrice) . " ISK|n| was destroyed! $url"; + if (!isset($victimInfo["characterName"])) $victimInfo["characterName"] = $victimInfo["corporationName"]; + if (strlen($victimInfo["characterName"]) < 25) { + $name = $victimInfo["characterName"]; + if (Util::endsWith($name, "s")) $name .= "'"; + else $name .= "'s"; + $message = "$name $message"; + } + $mdb->getCollection("killmails")->update(['killID' => $killID], ['$unset' => ['social' => true]]); + + Log::irc("$message"); + $message = Log::stripIRCColors($message); + + $message .= " #tweetfleet #eveonline"; + if (strlen($message) > 120) $message = str_replace(" worth ", ": ", $message); + if (strlen($message) > 120) $message = str_replace(" was destroyed!", "", $message); + if ($tweetIt && strlen($message) <= 120) { + $return = Twit::sendMessage($message); + $twit = "https://twitter.com/{$twitterName}/status/" . $return->id; + Log::irc("Message was also tweeted: |g|$twit"); + } +} diff --git a/cron/9.updateGroups.php b/cron/9.updateGroups.php new file mode 100644 index 00000000..486bfe9b --- /dev/null +++ b/cron/9.updateGroups.php @@ -0,0 +1,50 @@ +findField("storage", "contents", ['locker' => 'groupsPopulated']); +if ($groupsPopulated === true && date("H") % 12 != 0 && date("i") != 25) exit; + +$groups = CrestTools::getJSON("http://public-crest.eveonline.com/inventory/groups/"); +$newGroups = 0; +$newItems = 0; + +foreach ($groups["items"] as $group) +{ + $href = $group["href"]; + $groupID = (int) getGroupID($href); + $name = $group["name"]; + + $exists = $mdb->count("information", ['type' => 'groupID', 'id' => $groupID]); + if ($exists == 0) $newGroups++; + $mdb->insertUpdate("information", ['type' => 'groupID', 'id' => $groupID], ['name' => $name, 'lastCrestUpdate' => $mdb->now()]); + + $types = CrestTools::getJSON($href); + if ($types != null) foreach ($types["types"] as $type) + { + $typeID = (int) getTypeID($type["href"]); + $name = $type["name"]; + + $exists = $mdb->count("information", ['type' => 'typeID', 'id' => $typeID]); + if ($exists > 0) continue; + + Util::out("Discovered item: $name"); + $newItems++; + + $mdb->insertUpdate("information", ['type' => 'typeID', 'id' => $typeID], ['name' => $name, 'groupID' => $groupID, 'lastCrestUpdate' => new MongoDate(1)]); + } +} +$mdb->insertUpdate("storage", ['locker' => 'groupsPopulated'], ['contents' => true]); +if ($newGroups > 0) Log::irc("Added $newGroups new groupIDs"); +if ($newItems > 0) Log::irc("Added $newItems new typeIDs"); + +function getTypeID($href) +{ + $ex = explode("/", $href); + return $ex[4]; +} +function getGroupID($href) +{ + $ex = explode("/", $href); + return $ex[5]; +} diff --git a/cron/9.warProducer.php b/cron/9.warProducer.php new file mode 100644 index 00000000..3120cc35 --- /dev/null +++ b/cron/9.warProducer.php @@ -0,0 +1,24 @@ +count("information", ['type' => 'warID']) / 2000); +if ($page == 0) $page = 1; + +$next = "http://public-crest.eveonline.com/wars/?page=$page"; +do { + $wars = CrestTools::getJSON($next); + if ($wars == null) exit(); + $next = @$wars["next"]["href"]; + foreach($wars["items"] as $war) + { + $warID = (int) $war["id"]; +//echo "$warID\n"; + if (!$mdb->exists("information", ['type' => 'warID', 'id' => $warID])) $mdb->save("information", ['type' => 'warID', 'id' => $warID, 'lastCrestUpdate' => new MongoDate(2)]); + } + sleep(5); +} while ($next != null); diff --git a/cron/cacher.php b/cron/cacher.php new file mode 100644 index 00000000..d9968901 --- /dev/null +++ b/cron/cacher.php @@ -0,0 +1,57 @@ +find("queueServer"); + foreach ($queueServer as $row) + { + $agent = strtolower(@$row["HTTP_USER_AGENT"]); + if (!isBot($agent)) + { + if (isset($row["REQUEST_URI"])) + { + $uri = $row["REQUEST_URI"]; + if (Util::startsWith($uri, "/kill/") || $uri == "/") + { + if (!$mdb->exists("htmlCache", ['uri' => $uri])) + { + $contents = @file_get_contents("https://zkillboard.com{$uri}"); + if ($contents != "") + { + $mdb->save("htmlCache", ['uri' => $uri, 'dttm' => $mdb->now(), 'contents' => $contents]); + //echo strlen($contents) . " $uri\n"; + } + } + + } + } + } + $mdb->remove("queueServer", $row); + } + usleep(100000); +} + +function isBot($agent) +{ + if (strpos($agent, "chrome") !== false) return false; + if (strpos($agent, "chrome") !== false) return false; + if (strpos($agent, "eve-igb") !== false) return false; + + if ($agent == "") return true; + if (strpos($agent, "bot") !== false) return true; + if (strpos($agent, "curl") !== false) return true; + if (strpos($agent, "evekb") !== false) return true; + if (strpos($agent, "ltx71") !== false) return true; + if (strpos($agent, "slurp") !== false) return true; + if (strpos($agent, "www.admantx.com") !== false) return true; + if (strpos($agent, "spider") !== false) return true; + if (strpos($agent, "disqus") !== false) return true; + if (strpos($agent, "dotlan") !== false) return true; + if (strpos($agent, "crawler") !== false) return true; + if (strpos($agent, "googledocs") !== false) return true; + if (strpos($agent, "mediapartners-google") !== false) return true; + return false; +} diff --git a/cron/cleanup.php b/cron/cleanup.php new file mode 100644 index 00000000..3a8fcc73 --- /dev/null +++ b/cron/cleanup.php @@ -0,0 +1,27 @@ +find("stompmails"); +foreach ($stompmails as $mail) +{ + $killID = (int) $mail["killID"]; + if ($mdb->exists("crestmails", ['killID' => $killID, 'processed' => true])) + { + $mdb->remove("stompmails", $mail); + } +} + +$apimails = $mdb->find("apimails"); +foreach ($apimails as $mail) +{ + $killID = (int) $mail["killID"]; + if ($mdb->exists("crestmails", ['killID' => $killID, 'processed' => true])) + { + $mdb->remove("apimails", $mail); + } + //else $mdb->set("crestmails", ['killID' => $killID], ['processed' => false]); +} diff --git a/cron/cron.sh b/cron/cron.sh new file mode 100755 index 00000000..7996c616 --- /dev/null +++ b/cron/cron.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) + +cd $DIR +mkdir -p locks +mkdir -p logs + +./rotate.sh + +for each in $(ls *.php | grep -v nolock); do + touch locks/$each.lock + { + flock -x -w 55 locks/$each.lock php5 $each >> logs/$each.log 2>&1 + } & +done diff --git a/cron/everyFifteen.php b/cron/everyFifteen.php new file mode 100644 index 00000000..b704f3e6 --- /dev/null +++ b/cron/everyFifteen.php @@ -0,0 +1,39 @@ + 5000000000), true, false))); +Storage::store("Kills10b+", json_encode(Kills::getKills(array("iskValue" => 10000000000), true, false))); + +Storage::store("TopChars", json_encode(Info::doMakeCommon("Top Characters", "characterID", getStats('pilot', 'characterID')))); +Storage::store("TopCorps", json_encode(Info::doMakeCommon("Top Corporations", "corporationID", getStats('corp', 'corporationID', false)))); +Storage::store("TopAllis", json_encode(Info::doMakeCommon("Top Alliances", "allianceID", getStats('alli', 'allianceID')))); +Storage::store("TopShips", json_encode(Info::doMakeCommon("Top Ships", "shipTypeID", getStats('ship', 'shipTypeID')))); +Storage::store("TopSystems", json_encode(Info::doMakeCommon("Top Systems", "solarSystemID", getStats('system', 'solarSystemID')))); +Storage::store("TopIsk", json_encode(Stats::getTopIsk(array("pastSeconds" => ($numDays*86400), "limit" => 5)))); +Storage::store("TopPods", json_encode(Stats::getTopIsk(array("groupID" => 29, "pastSeconds" => ($numDays*86400), "limit" => 5)))); +Storage::store("TopPoints", json_encode(Stats::getTopPoints("killID", array("losses" => true, "pastSeconds" => ($numDays*86400), "limit" => 5)))); + +// Clean up the related killmails cache +$cache = new FileCache($baseDir . "/cache/related/"); +$cache->cleanUp(); + +// Cleanup the overall file cache +$fc = new FileCache(); +$fc->cleanup(); + +function getStats($type, $column) +{ + $result = Stats::getTop($column, ['isVictim' => false, 'pastSeconds' => 604800]); + return $result; +} diff --git a/cron/everyMinute.php b/cron/everyMinute.php new file mode 100644 index 00000000..04b57b02 --- /dev/null +++ b/cron/everyMinute.php @@ -0,0 +1,21 @@ += time()) exit(); + +if (Util::isMaintenanceMode()) return; +if (Util::is904Error()) return; +global $walletApis; + +if (!is_array($walletApis)) return; + +foreach ($walletApis as $api) +{ + $type = $api["type"]; + $keyID = $api["keyID"]; + $vCode = $api["vCode"]; + $charID = $api["charID"]; + + $pheal = Util::getPheal($keyID, $vCode, true); + $arr = array("characterID" => $charID, "rowCount" => 1000); + + if ($type == "char") $q = $pheal->charScope->WalletJournal($arr); + else if ($type == "corp") $q = $pheal->corpScope->WalletJournal($arr); + else continue; + + //$cachedUntil = $q->cached_until; + if (count($q->transactions)) insertRecords($charID, $q->transactions); +} +Db::execute("replace into zz_storage values ('NextWalletFetch', date_add(now(), interval 35 minute))"); + +applyBalances(); + +function applyBalances() +{ + global $walletCharacterID, $baseAddr; + $toBeApplied = Db::query("select * from zz_account_wallet where paymentApplied = 0", array(), 0); + foreach($toBeApplied as $row) + { + if ($row["ownerID2"] != $walletCharacterID) continue; + $userID = null; + + $reason = $row["reason"]; + if (strpos($reason, ".{$baseAddr}") !== false) { + global $adFreeMonthCost; + $months = $row["amount"] / $adFreeMonthCost; + $bonusMonths = floor($months / 6); + $months += $bonusMonths; + $subdomain = trim(str_replace("DESC: ", "", $reason)); + $subdomain = str_replace("http://", "", $subdomain); + $subdomain = str_replace("https://", "", $subdomain); + $subdomain = str_replace("/", "", $subdomain); + + $aff = Db::execute("insert into zz_subdomains (subdomain, adfreeUntil) values (:subdomain, date_add(now(), interval $months month)) on duplicate key update adfreeUntil = date_add(if(adfreeUntil is null, now(), adfreeUntil), interval $months month)", array(":subdomain" => $subdomain)); + if ($aff) Db::execute("update zz_account_wallet set paymentApplied = 1 where refID = :refID", array(":refID" => $row["refID"])); + continue; + } + if ($reason) + { + $reason = trim(str_replace("DESC: ", "", $reason)); + $userID = Db::queryField("select id from zz_users where username = :reason", "id", array(":reason" => $reason)); + } + + if ($userID == null) + { + $charID = $row["ownerID1"]; + $keyIDs = Db::query("select keyID from zz_api_characters where characterID = :charID", array(":charID" => $charID), 1); + foreach($keyIDs as $keyIDRow) { + if ($userID) continue; + $keyID = $keyIDRow["keyID"]; + $userID = Db::queryField("select userID from zz_api where keyID = :keyID", "userID", array(":keyID" => $keyID), 1); + } + } + + if ($userID) + { + Db::execute("insert into zz_account_balance values (:userID, :amount) on duplicate key update balance = balance + :amount", array(":userID" => $userID, ":amount" => $row["amount"])); + Db::execute("update zz_account_wallet set paymentApplied = 1 where refID = :refID", array(":refID" => $row["refID"])); + } + } +} + +function insertRecords($charID, $records) { + foreach ($records as $record) { + Db::execute("insert ignore into zz_account_wallet (characterID, dttm, refID, refTypeID, ownerName1, ownerID1, ownerName2, ownerID2, argName1, argID1,amount, balance, reason, taxReceiverID, taxAmount) values (:charID, :dttm , :refID, :refTypeID, :ownerName1, :ownerID1, :ownerName2, :ownerID2, :argName1, :argID1, :amount, :balance, :reason, :taxReceiverID, :taxAmount)", + array( + ":charID" => $charID, + ":dttm" => $record["date"], + ":refID" => $record["refID"], + ":refTypeID" => $record["refTypeID"], + ":ownerName1" => $record["ownerName1"], + ":ownerID1" => $record["ownerID1"], + ":ownerName2" => $record["ownerName2"], + ":ownerID2" => $record["ownerID2"], + ":argName1" => $record["argName1"], + ":argID1" => $record["argID1"], + ":amount" => $record["amount"], + ":balance" => $record["balance"], + ":reason" => $record["reason"], + ":taxReceiverID" => $record["taxReceiverID"], + ":taxAmount" => $record["taxAmount"] + ) + ); + } +} diff --git a/cron/h.report.php b/cron/h.report.php new file mode 100644 index 00000000..b94f78bb --- /dev/null +++ b/cron/h.report.php @@ -0,0 +1,19 @@ +findField("storage", "contents", ['locker' => 'killsProcessed']); +$count = $mdb->findField("storage", "contents", ['locker' => 'totalKills']); + +if ($kills > 0) +{ + Log::irc("|g|" . number_format($kills, 0) . "|n| kills processed."); + Util::out(number_format($kills, 0) . " kills added, now at " . number_format($count, 0) . " kills."); +} + +$mdb->getCollection("storage")->update(array("locker" => "killsProcessed"), array('$inc' => array('contents' => (-1 * $kills))), array('upsert' => true)); diff --git a/cron/rotate.sh b/cron/rotate.sh new file mode 100755 index 00000000..08e24ff3 --- /dev/null +++ b/cron/rotate.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +now=$(date +%H%M) +test "$now" != "0000" && exit # Not midnight? exit now + +rotate () { +# Deletes old log file +if [ -f $1 ] ; then + CNT=5 + let P_CNT=CNT-1 + if [ -f $1.5 ] ; then + rm $1.5 + fi + + # Renames logs .1 trough .4 + while [[ $CNT -ne 1 ]] ; do + if [ -f $1.${P_CNT} ] ; then + mv $1.${P_CNT} $1.${CNT} + fi + let CNT=CNT-1 + let P_CNT=P_CNT-1 + done + + # Renames current log to .1 + mv $1 $1.1 + touch $1 +fi +} + +DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) +cd $DIR/logs + +for each in *.log; do + rotate $each +done diff --git a/cron/slowreset.php b/cron/slowreset.php new file mode 100644 index 00000000..084dbd4d --- /dev/null +++ b/cron/slowreset.php @@ -0,0 +1,17 @@ +findField("killmails", "killID", [], ['killID' => -1]); +for ($i = $killID; $i >= ($killID - 5000); $i--) +{ + $crestmail = $mdb->findDoc("crestmails", ['killID' => $i]); + if ($crestmail == null) continue; + if (@$crestmail["processed"] === true) continue; + if (@$crestmail["processed"] === false) continue; + + $hash = $crestmail["hash"]; + //echo "Reseting http://public-crest.eveonline.com/killmails/$i/$hash/\n"; + $mdb->set("crestmails", ['killID' => $i], ['processed' => false]); + sleep(1); +} diff --git a/cron/watch.sh b/cron/watch.sh new file mode 100755 index 00000000..c45972a6 --- /dev/null +++ b/cron/watch.sh @@ -0,0 +1,3 @@ +#!/bin/bash +clear +tail -n0 -F -q logs/*.log diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..14956a8b5f41f04ff0f0cc78157cc0e481d3110d GIT binary patch literal 1150 zcmdr~y9$Fq5L{m%C}@?|bmlt*f5SSR-=Y6ut6-yro!|pS{G-X9Apt{>prmn+-GjNE z*&R3{iH~g)*DKvsq6-n-I2mH(iStFoZ(jn8oicS@hhZ4Iym_97s;W?yC4Aq9EXzOX zD2jq02v8IS#&N_v&&aY2VHiTwv`r1uG!e%!(lkZWG;jViO-PaiQ53mc%z|HAV;hwHj44OLZ9*ENP=Sh!n!(Ia{#Nm^+f`9q)c`@Topwk!Vv6MOw*{*m2J Jz-0^j;{irgbE^OV literal 0 HcmV?d00001 diff --git a/index.php b/index.php new file mode 100644 index 00000000..bb780626 --- /dev/null +++ b/index.php @@ -0,0 +1,54 @@ +findField("htmlCache", "contents", ['uri' => $uri]); + if ($contents != null) + { + echo $contents; + exit(); + } + + $_SERVER["requestDttm"] = $mdb->now(); + $mdb->insert("queueServer", $_SERVER); + } +} + +// Theme +if(User::isLoggedIn()) $theme = UserConfig::get("theme"); +$app->config(array("templates.path" => $baseDir."themes/")); + +// Error handling +$app->error(function (\Exception $e) use ($app){ include ( "view/error.php" ); }); + +// Load the routes - always keep at the bottom of the require list ;) +include( "routes.php" ); + +// Load twig stuff +include( "twig.php" ); + +// Load the theme stuff AFTER routes and Twig, so themers can add crap to twig's global space +require_once("themes/zkillboard.php"); + +// Run the thing! +$app->run(); diff --git a/information/about.md b/information/about.md new file mode 100644 index 00000000..a8c44873 --- /dev/null +++ b/information/about.md @@ -0,0 +1,33 @@ +# About +
+zKillboard is a collaborative effort by many people, see our GitHub repository for a complete history. + +# Contacts + +- Squizz Caphinator + - Twitter: [@squizzc](https://twitter.com/squizzc) + - EMail: squizzc@gmail.com +- Karbowiak: + - Facebook: [http://facebook.com/Karbowiak](http://facebook.com/Karbowiak) + - EMail: karbowiak@gmail.com + - Twitter: [@mkarbowiak](https://twitter.com/mkarbowiak) + - G+: [Michael Karbowiak](https://plus.google.com/+MichaelKarbowiak/) + +# 3rd Parties + +Information from 3rd party sites, are owned by the 3rd party site, and are made available to us (and possibly others) via APIs. If you want access to the same information for your site, you need to contact the owner of the 3rd party. + +#### Un-ordered list of 3rd parties used: +- EVEWho +- EVE-Board +- EVE-Search +- EVE-Gate +- DOTLAN +- EVE Skunk +- Osmium +- EVEFit +- EVE-Online +- EVEEye +- Wormhol.es + +Social images by http://www.pinkmoustache.net/ \ No newline at end of file diff --git a/information/legal.md b/information/legal.md new file mode 100644 index 00000000..656bc2e2 --- /dev/null +++ b/information/legal.md @@ -0,0 +1,55 @@ +

Legal

+
+

CCP

+

EVE Online and the EVE logo are the registered trademarks of CCP hf. All rights are reserved worldwide. +All other trademarks are the property of their respective owners. EVE Online, the EVE logo, EVE and +all associated logos and designs are the intellectual property of CCP hf. All artwork, screenshots, +characters, vehicles, storylines, world facts or other recognizable features of the intellectual property +relating to these trademarks are likewise the intellectual property of CCP hf. CCP hf. has granted +permission to EVSCO to use EVE Online and all associated logos and designs for promotional and information +purposes on its website but does not endorse, and is not in any way affiliated with, EVSCO. CCP is in no +way responsible for the content on or functioning of this website, nor can it be liable for any damage +arising from the use of this website.

+ +
+ +

License

+zKillboard uses the AGPLv3 license. Full license text is available in the `AGPL.md` file. +

Copyright

+Copyright (C) 2012-2013, EVE-KILL Team and EVSCO. All rights reserved. + +
+ +

General Rules

+
    +
  • Failure to comply with any of the regulations in this subcategory will result in the immediate termination of your service.
  • +
  • Any intentional action that by any means interrupts the service of zKillboard is prohibited.
  • +
  • Accessing the API for the purpose of causing increased load on the server is not allowed, and will result in an IP ban from the service.
  • +
  • Placing commercial advertisements, be it links, images or any other form, into any part of the site, is not allowed.
  • +
+ +

Obligations

+
    +
  • Items listed in this section are guaranteed by zKillboard as a term of service.
  • +
  • Under no circumstances is a refund guaranteed by zKillboard. Refunds, however, may be administered at the discretion of the killboard administrators.
  • +
  • zKillboard will not release API keys, emails or passwords to the public, or anyone else without prior consent of the account holder.
  • +
+ +
+ +

Cookies

+

zKillboard.com (and other sites hosted on the zKB software) use cookies for essential purposes. Such as auto login and analytics. We use cookies in order to give you the best experience possible (Logging in, staying logged in). zKillboard.com will never use the cookie data for targetted advertising or similar stuff (Self hosted boards is a different matter)

+ +7fc8ef54a8154c28341bf9a47443a5ce +

Is used by our session_id system

+PHPSESSID +

Is used by our session_id system

+zKB +

Cookie that allows you to be logged in automatically

+ +__utma __utmb __utmc __utmz +

These cookies are set by Google Analytics, and tell us how many people visit the website, how they arrived at the site, what pages they visit, what web browsers they are using to view pages etc. They cannot identify you personally.

+ +Self hosted boards: +

zKB is open source software, and can thus be hosted by people on their own servers. And they may use cookies differently from zKillboard.com.
+This is not something we can prevent or do anything against.

\ No newline at end of file diff --git a/information/payments.md b/information/payments.md new file mode 100644 index 00000000..c4625fc7 --- /dev/null +++ b/information/payments.md @@ -0,0 +1,22 @@ +# Payments +
+ +![zkillboard](https://image.eveonline.com/Character/93382481_128.jpg "zkillboard") +- You can make payments to zKillboard that will remove ads when you're logged in. +- You can be ad free on zKillboard.com and all subdomains when they are implemented (SoonTM) +- Each month of ad free time costs {cost} ISK. +- Each 6 months you purchase will give you a bonus month +- To make a payment, send ISK to the character zKillboard, or use this handy in game link: zKillboard. +- The wallet is checked aproximately every 35 minutes. + +There are two methods of paying. + +- Include your account name in the reason code. E.g. if your login is squizz, then include squizz in the payment reason. Must be an exact match! +- Have an API tied to your account that includes the character you sent the ISK from. + +# Subdomain +To make a payment for a subdomain, all you have to do is include the URL, and only the URL of the subdomain in the payment reason. + +
![](/themes/zkillboard/img/squizz_subdomain_example.png) + +Anyone can make the payment for any killboard! \ No newline at end of file diff --git a/information/statistics.md b/information/statistics.md new file mode 100644 index 00000000..5614c7a6 --- /dev/null +++ b/information/statistics.md @@ -0,0 +1,32 @@ +# Statistics +
+### Kills +{kills} kills processed ({percentage}%)
+######*These numbers are updated hourly...* + +### API +Number of API calls and their result in the last hour.
+ +{apitable} + +### Points +``` +Calculation: + $vicpoints = Points::getPoints($victim["groupID"]); + $vicpoints += $kill["total_price"] / 10000000; + $maxpoints = round($vicpoints * 1.2); + + $invpoints = 0; + foreach ($involved as $inv) + { + $invpoints += Points::getPoints($inv["groupID"]); + } + + $gankfactor = $vicpoints / ($vicpoints + $invpoints); + $points = ceil($vicpoints * ($gankfactor / 0.75)); + if ($points > $maxpoints) $points = $maxpoints; + $points = round($points, 0); +``` + +### Point System +{pointsystem} diff --git a/init.php b/init.php new file mode 100644 index 00000000..bdb3d097 --- /dev/null +++ b/init.php @@ -0,0 +1,35 @@ +. + */ + +date_default_timezone_set("UTC"); + +// Database parameters +$dbUser = "%dbuser%"; +$dbPassword = "%dbpassword%"; +$dbName = "%dbname%"; +$dbHost = "%dbhost%"; +$dbSocket = null; +$dbExplain = false; +$enableAnalyze = false; + +// IPs available +$ipsAvailable = array(); // Set it to the external IP(s) you have available + +// External Servers +$apiServer = "%apiserver%"; +$imageServer = "%imageserver%"; + +// Base +$baseFile = __FILE__; +$baseDir = dirname($baseFile) . "/"; +$baseUrl = "/"; +$baseAddr = "%baseaddr%"; +$fullAddr = "http://" . $baseAddr; +chdir($baseDir); + +// SSO +$ssoEnable = false; +$ssoServer = "https://login.eveonline.com"; // use https://sisilogin.testeveonline.com for the test server +$ssoResponseType = "code"; +$ssoRedirectURI = "{$fullAddr}/auth/eve/"; +$ssoClientID = ""; +$ssoSecret = ""; +$ssoScope = ""; +$ssoState = ""; + +// Theme / Style and Name +$killboardName = "zKillboard"; +$theme = "zkillboard"; +$style = "cyborg"; + +// Debug +$debug = true; + +// Logfile +$logfile = "%logfile%"; +$ircLogFile = ""; +$ircAdminLogFile = ""; +$ircLogFrom = "$baseAddr - "; + +// Memcache +$memcacheServer = "%memcache%"; +$memcachePort = "%memcacheport%"; + +// Redis +$redisServer = "%redis%"; +$redisPort = "%redisport%"; + +// Pheal +$phealCacheLocation = "%phealcachelocation%"; + +// Cookiiieeeee +$cookie_name = "zKB"; +$cookie_ssl = false; +$cookie_time = (3600 * 24 * 30); // 30 days +$cookie_secret = "%cookiesecret%"; + +// API +$apiRequestsPrDay = 17280; // Once every 5 seconds +$apiWhiteList = array(); + +// Stomp +$stompServer = "tcp://eve-kill.net:61613"; +$stompUser = "guest"; +$stompPassword = "guest"; + +// Disqus +$disqus = false; +$disqusSSO = false; +$disqusShortName = ""; +$disqusSecretKey = ""; +$disqusPublicKey = ""; + +// Email stuff +$emailsmtp = ""; +$emailusername = ""; +$emailpassword = ""; +$sentfromemail = ""; +$sentfromdomain = ""; + +// Twitter +$twitterName = ""; +$consumerKey = ""; +$consumerSecret = ""; +$accessToken = ""; +$accessTokenSecret = ""; + +// Ads / Analytics +$showAds = false; +$adFreeMonthCost = 0; +$walletCharacterID = 0; +$showAnalytics = false; +$topCaPub = ""; // ca-pub- +$topAdSlot = ""; // google_ad_slot number +$bottomCaPub = ""; // ca-pub- +$bottomAdSlot = ""; // google_ad_slot number +$analyticsID = ""; // UA- +$analyticsName = ""; // name + +// Facebook like button +$showFacebook = false; +$facebookAppID = null; + +// Slim config +$config = array( + "mode" => ($debug ? "development" : "production"), + "debug" => ($debug ? true : false), + "log.enabled" => false, + "cookies.secret_key" => $cookie_secret + ); + +$useSemaphores = false; +$semaphoreModulus = 10; + +# Save killmails to file system if enabled. +$fsKillmails = false; + +# Be Social, or not by default +$beSocial = false; + +# Parse kills in ascending killID order +$parseAscending = true; diff --git a/install/cronoverrides b/install/cronoverrides new file mode 100644 index 00000000..6ccf6d2c --- /dev/null +++ b/install/cronoverrides @@ -0,0 +1,23 @@ +{ + "apiErrorList":{ + "3600":"" + }, + "stompReceive":{ + "0":"disabled" + }, + "feedEDK":{ + "3600":"fetch" + }, + "feedzKB":{ + "60":"" + }, + "warFetcher":{ + "10800":"disabled" + }, + "wars":{ + "0":"disabled" + }, + "sitemap":{ + "86400":"disabled" + } +} \ No newline at end of file diff --git a/install/install.php b/install/install.php new file mode 100644 index 00000000..2c71110f --- /dev/null +++ b/install/install.php @@ -0,0 +1,304 @@ +. + */ +if(php_sapi_name() != "cli") + die("This is a cli script!"); + +$base = dirname(__FILE__); + +function exception_error_handler($errno, $errstr, $errfile, $errline ) +{ + if (error_reporting() === 0) { return; } //error has been suppressed with "@" + throw new ErrorException($errstr, $errno, 0, $errfile, $errline); +} + +// Force all warnings into errors +set_error_handler("exception_error_handler"); + +if (file_exists("$base/../config.php")) +{ + out("|r|Your config.php is already setup, if you want to reinstall please delete it.", true); +} + +out("We will prompt you with a few questions. If at any time you are unsure and want to back out of the installation hit |g|CTRL+C.|n| + +Questions will always have a default answer specified in []'s. Example: |g|What is 1+1? [2]|n| +Hitting enter will let you select the default answer."); + +$settings = array(); + +// Database +$settings["dbuser"] = prompt("Database username?", "zkillboard"); +$settings["dbpassword"] = prompt("Database password?", "zkillboard"); +$settings["dbname"] = prompt("Database name?", "zkillboard"); +$settings["dbhost"] = prompt("Database server?", "localhost"); + +// Memcache +$settings["memcache"] = ""; +$settings["memcacheport"] = ""; + +$memc = prompt("|g|Do you have memcached installed?|n|", "yes"); +if($memc == "yes") +{ + $settings["memcache"] = prompt("Memcache server?", "localhost"); + $settings["memcacheport"] = prompt("Memcache port?", "11211"); +} + +// Redis +$settings["redis"] = ""; +$settings["redisport"] = ""; + +$redis = prompt("|g|Do you have Redis and Phpredis installed?|n|", "yes"); +if($redis == "yes") +{ + $settings["redis"] = prompt("Redis server?", "localhost"); + $settings["redisport"] = prompt("Redis port?", "6379"); +} + +// Pheal cache +out("|g|It is highly recommended you find a good location other than the default for these files.|n|"); +$settings["phealcachelocation"] = prompt("Where do you want to store Pheal's cache files?", "/tmp/"); + +// Server addr +out("What is the address of your server? |g|e.g. zkillboard.com|n|"); +$settings["baseaddr"] = prompt("Domain name?", "zkillboard.com"); + +// Log +$settings["logfile"] = prompt("Log file location?", "/var/log/zkb.log"); +touch($settings["logfile"]); // Touch the log file so that it'll actually get created. + +// Image server +out("Image and API server."); +$settings["apiserver"] = prompt("API Server?", "https://api.eveonline.com/"); +$settings["imageserver"] = prompt("Image Server?", "https://image.eveonline.com/"); + +// Secret key for cookies +out("A secret key is needed for your cookies to be encrypted."); +$cookiesecret = prompt("Secret key for cookies?", uniqid(time())); +$settings["cookiesecret"] = sha1($cookiesecret); + +// Set admin password +require $base.'/../classes/Password.php'; +out("Set password for 'admin' user. It's recommend to change this!"); +$admpw = prompt("Password", substr(str_shuffle('abcefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'), 0, 12)); +$admpw = Password::genPassword($admpw); + +// Get default config +$configFile = file_get_contents("$base/config.new.php"); + +// Create the new config +foreach($settings as $key=>$value) + $configFile = str_replace("%$key%", $value, $configFile); + +// Save the file and then attempt to load and initialize from that file +$configLocation = "$base/../config.php"; +if (file_put_contents($configLocation, $configFile) === false) + out("|r|Unable to write configuration file at $configLocation", true); + +try +{ + out("|g|Config file written, now attempting to initialize settings"); + require_once( "$base/../config.php" ); + + // Check if composer isn't already installed + $location = exec("which composer"); + if(!$location) // Composer isn't installed + { + out("Installing composer:\n"); + chdir("$base/.."); + + passthru("php -r \"eval('?>'.file_get_contents('https://getcomposer.org/installer'));\""); + + chdir("$base/.."); + out("\nInstalling vendor files"); + passthru("php composer.phar install --optimize-autoloader"); + + out("\n|g|composer install complete!"); + } + else // Composer IS installed + { + out("Using already installed composer:\n"); + chdir("$base/.."); + out("\nInstalling vendor files."); + passthru("composer install --optimize-autoloader"); + out("\n|g|Vendor file installation completed."); + } + chdir("$base/.."); + + require_once("$base/../init.php" ); + + $one = Db::queryField("select 1 one from dual", "one", array(), 1); + if ($one != "1") + throw new Exception("We were able to connect but the database did not return the expected '1' for: select 1 one from dual;"); + + out("|g|Success! Database initialized."); +} +catch (Exception $ex) +{ + out("|r|Error! Removing configuration file."); + unlink($configLocation); + throw $ex; +} + +$ln = false; +// Move bash_complete_zkillboard to the bash_complete folder +try +{ + file_put_contents("/etc/bash_completion.d/zkillboard", file_get_contents("$base/bash_complete_zkillboard")); + exec("chmod +x $base/../cli.php"); + $ln = true; +} +catch (Exception $ex) +{ + out("|r|Error! Couldn't move the bash_complete file into /etc/bash_completion.d/, please do this after the installer is done."); +} + +// ln the cli into /usr/sbin/zkillboard +if($ln == true) +{ + try + { + passthru("ln -s $base/../cli.php /usr/sbin/zkillboard"); + } + catch(Exception $e) + { + out("|r|Error!|n| file most likely already exists. Check after the installer is done, and if it doesn't, run: ln -s $base/../cli.php /usr/sbin/zkillboard"); + } +} + +// move cron.overrides to main dir +// Save the file and then attempt to load and initialize from that file +$cronoverridesLoc = "$base/../cronoverrides"; +$cronOverrides = file_get_contents("$base/cron.overrides"); +if (file_put_contents($cronoverridesLoc, $cronOverrides) === false) + out("|r|Unable to write cron.overrides at $cronoverridesLoc", true); + +// Now install the db structure +try +{ + $sqlFiles = scandir("$base/sql"); + foreach($sqlFiles as $file) + { + if (Util::endsWith($file, ".sql")) + { + $table = str_replace(".sql", "", $file); + out("Adding table |g|$table|n| ... ", false, false); + $sqlFile = "$base/sql/$file"; + loadFile($sqlFile); + // Ensure the table starts with base parameters and doesn't inherit anything from zkillboard.com + if (!Util::startsWith($table, "ccp_")) + Db::execute("truncate table $table"); + + out("|g|done"); + } + } +} +catch (Exception $ex) +{ + out("|r|Error! Removing configuration file."); + unlink($configLocation); + throw $ex; +} + +try +{ + out("|g|Installing default admin user..."); + // Install the default admin user + Db::execute("INSERT INTO zz_users (username, moderator, admin, password) VALUES ('admin', 1, 1, '".$admpw."')"); +} +catch (Exception $ex) +{ + out("|r|Error! Unable to add default admin user..."); + unlink($configLocation); + throw $ex; +} + +out("|g|Creating cache directories"); +@mkdir($baseDir."cache/"); +@mkdir($baseDir."cache/sessions/"); +@mkdir($baseDir."cache/pheal/"); + +out("|g|Enjoy your new installation of zKillboard, you may browse to it here: http://" . $settings["baseaddr"] . "\n"); +exit; + +function loadFile($file) +{ + if (Util::endsWith($file, ".gz")) $handle = gzopen($file, "r"); + else $handle = fopen($file, "r"); + + $query = ""; + while ($buffer = fgets($handle)) + { + $query .= $buffer; + if (strpos($query, ";") !== false) + { + $query = str_replace(";", "", $query); + Db::execute($query); + $query = ""; + } + } + fclose($handle); +} + +function out($message, $die = false, $newline = true) +{ + $colors = array( + "|w|" => "1;37", //White + "|b|" => "0;34", //Blue + "|g|" => "0;32", //Green + "|r|" => "0;31", //Red + "|n|" => "0" //Neutral + ); + + $message = "$message|n|"; + foreach($colors as $color => $value) + $message = str_replace($color, "\033[".$value."m", $message); + + if($newline) + echo $message.PHP_EOL; + else + echo $message; + + if($die) die(); +} + +function prompt($prompt, $default = "") +{ + out("$prompt [$default] ", false, false); + $answer = trim(fgets(STDIN)); + if (strlen($answer) == 0) + return $default; + + return $answer; +} + +// Password prompter kindly borrowed from http://stackoverflow.com/questions/187736/command-line-password-prompt-in-php +function prompt_silent($prompt = "Enter Password:") +{ + $command = "/usr/bin/env bash -c 'echo OK'"; + if (rtrim(shell_exec($command)) !== 'OK') + { + trigger_error("Can't invoke bash"); + return; + } + $command = "/usr/bin/env bash -c 'read -s -p \"" + . addslashes($prompt) + . "\" mypassword && echo \$mypassword'"; + $password = rtrim(shell_exec($command)); + echo "\n"; + return $password; +} diff --git a/install/sde_update/sde_update.php b/install/sde_update/sde_update.php new file mode 100644 index 00000000..0cfb8f1f --- /dev/null +++ b/install/sde_update/sde_update.php @@ -0,0 +1,20 @@ +. + */ +if(php_sapi_name() != "cli") + die("This is a cli script!"); + +$base = dirname(__FILE__); + +if(php_sapi_name() != "cli") +die("This is a cli script!"); + +if(!extension_loaded('pcntl')) +die("This script needs the pcntl extension!"); + +// Update composer and any vendor products +out("\nUpdating composer..."); +chdir("$base/.."); +passthru("php composer.phar self-update"); +out("\nUpdating vendor files..."); +passthru("php composer.phar update --optimize-autoloader"); + +require_once( "config.php" ); +chdir("$base"); + +// vendor autoload +require( "$base/../vendor/autoload.php" ); + +// zkb class autoloader +spl_autoload_register("zkbautoload"); + +function zkbautoload($class_name) +{ + global $base; + $fileName = "$base/../classes/$class_name.php"; + if (file_exists($fileName)) + { + require_once $fileName; + return; + } +} + +Db::execute("SET SESSION wait_timeout = 120000000"); +out("\n|g|Starting maintenance mode...|n|"); +Db::execute("replace into zz_storage values ('maintenance', 'true')"); +out("|b|Waiting 60 seconds for all executing scripts to stop...|n|"); +sleep(60); + +// Get a list of all tables +$tableResult = Db::query("show tables", array(), 0, false); +$tables = array(); +foreach($tableResult as $row) +{ + $table = array_pop($row); + $tables[$table] = true; +} + +// Now install the db structure +try { + $sqlFiles = scandir("$base/sql"); + foreach($sqlFiles as $file) + { + if (Util::endsWith($file, ".sql")) + { + $table = str_replace(".sql", "", $file); + out("Updating table |g|$table|n| ... ", false, false); + $sqlFile = "$base/sql/$file"; + loadFile($sqlFile, $table); + out("|w|done|n|"); + $tables[$table] = false; + } + } + foreach ($tables as $table=>$drop) + { + if ($drop && Util::startsWith($table, "zz_")) + { + out("|r|Dropping table: |g|$table|n|\n", false, false); + Db::execute("drop table $table"); + } + } +} +catch (Exception $ex) +{ + out("|r|Error!|n|"); + throw $ex; +} + +$count = Db::execute("INSERT IGNORE INTO zz_users (username, moderator, admin, password) VALUES ('admin', 1, 1, '$2y$10\$maxuZ/qozcjIgr7ZSnrWJemywbThbPiJDYIuOk9eLxF0pGE5SkNNu')"); +if ($count > 0) + out("\n\n|r|*** NOTICE ***\nDefault admin user has been added with password 'admin'\nIt is strongly recommended you change this password!\n*** NOTICE ***\n"); + +out("|g|Unsetting maintenance mode|n|"); +Db::execute("delete from zz_storage where locker = 'maintenance'"); +out("All done, enjoy your update!"); + +function loadFile($file, $table) +{ + if (Util::endsWith($file, ".gz")) + $handle = gzopen($file, "r"); + else + $handle = fopen($file, "r"); + + //Check to see if we are adding new tables + if(Db::queryRow("SHOW TABLES LIKE'$table'", array(), 0, false)!= null) + { + if (Util::startsWith($table, "ccp_")) + Db::execute("drop table $table"); + else + Db::execute("alter table $table rename old_$table"); + } + + + $query = ""; + while ($buffer = fgets($handle)) { + $query .= $buffer; + if (strpos($query, ";") !== false) { + $query = str_replace(";", "", $query); + Db::execute($query); + $query = ""; + } + } + fclose($handle); + + if (Db::queryRow("SHOW TABLES LIKE 'old_$table'", array(), 0, false)!= null){ // Check again to see if the old_table is there + if (!Util::startsWith($table, "ccp_")) { + try { + Db::execute("insert ignore into $table select * from old_$table"); + Db::execute("drop table old_$table"); + } catch (Exception $ex) { + Db::execute("drop table $table"); + Db::execute("alter table old_$table rename $table"); + throw $ex; + } + } + } +} + +function out($message, $die = false, $newline = true) +{ + $colors = array( + "|w|" => "1;37", //White + "|b|" => "0;34", //Blue + "|g|" => "0;32", //Green + "|r|" => "0;31", //Red + "|n|" => "0" //Neutral + ); + + $message = "$message|n|"; + foreach($colors as $color => $value) + $message = str_replace($color, "\033[".$value."m", $message); + + if($newline) + echo $message.PHP_EOL; + else + echo $message; +} diff --git a/robots.txt b/robots.txt new file mode 100644 index 00000000..b201bc92 --- /dev/null +++ b/robots.txt @@ -0,0 +1,7 @@ +User-agent: * +Disallow: /api/* +Disallow: */page/* +Disallow: *related* +Disallow: *stats* +Disallow: *top* +sitemap: https://zkillboard.com/sitemaps/sitemaps.xml diff --git a/routes.php b/routes.php new file mode 100644 index 00000000..b672efa1 --- /dev/null +++ b/routes.php @@ -0,0 +1,245 @@ +notFound(function () use ($app) { + $app->redirect("..", 302); +}); + +// Default route +$app->get("/(page/:page/)", function ($page = 1) use ($app){ + include( "view/index.php" ); +}); + +$app->get("/kills.html/", function($page = "about") use ($app) { +die(""); +}); + +// Information about zKillboard +$app->get("/information/(:page/)(:subPage/)", function($page = "about", $subPage = null) use ($app) { + include( "view/information.php" ); +}); + +// Support +$app->get("/livechat/", function() use ($app) { + include( "view/livechat.php" ); +}); + +// Tickets +$app->map("/tickets/", function() use ($app) { + include( "view/tickets.php" ); +})->via("GET", "POST"); + +$app->map("/tickets/view/:id/", function($id) use ($app) { + include( "view/tickets_view.php" ); +})->via("GET", "POST"); + +// Tracker +$app->get("/tracker(/page/:page)/", function($page = 1) use ($app) { + include( "view/tracker.php" ); +}); + +// View kills +$app->get("/kills/page/:page/", function($page = 1) use ($app) { + $type = NULL; + include( "view/kills.php" ); +}); +$app->get("/kills(/:type)(/page/:page)/", function($type = NULL, $page = 1) use ($app) { + include( "view/kills.php" ); +}); + +// View related kills +$app->get("/related/:system/:time/(o/:options/)", function($system, $time, $options = "") use ($app) { + include( "view/related.php" ); +}); + +// View Battle Report +$app->get("/br/:battleID/", function($battleID) use ($app) { + include( "view/battle_report.php" ); +}); + +// View Battle Report +$app->get("/brsave/", function() use ($app) { + include( "view/brsave.php" ); +}); + +// View top +$app->get("/top/lasthour/", function() use ($app) { + include( "view/lasthour.php" ); +}); +$app->get("/ranks/:pageType/:subType/", function($pageType, $subType) use ($app) { + include( "view/ranks.php" ); +}); +$app->get("/top(/:type)(/:page)(/:time+)/", function($type = "weekly", $page = NULL, $time = array()) use ($app) { + include( "view/top.php" ); +}); + +// Raw Kill Detail +$app->get("/raw/:id/", function($id) use ($app) { + include( "view/raw.php" ); +}); + +// Kill Detail View +$app->get("/detail/:id(/:pageview)/", function($id, $pageview = "overview") use ($app) { + $app->redirect("/kill/$id/", 301); // Permanent redirect + die(); +}); +$app->get("/kill/:id(/:pageview)/", function($id, $pageview = "overview") use ($app) { + include( "view/detail.php" ); +})->via("GET", "POST"); + +// Search +$app->map("/search(/:search)/", function($search = NULL) use ($app) { + include( "view/search.php" ); +})->via("GET", "POST"); + +// Login stuff +$app->map("/dlogin/", function() use ($app) { + global $cookie_name, $cookie_time; + include( "view/dlogin.php" ); +})->via("GET", "POST"); + +$app->map("/login/", function() use ($app) { + global $cookie_name, $cookie_time; + include( "view/login.php" ); +})->via("GET", "POST"); + +// Sitemap +$app->get("/sitemap/", function() use ($app) { + global $cookie_name, $cookie_time, $baseAddr; + include( "view/sitemap.php" ); +}); + +// Logout +$app->get("/logout/", function() use ($app) { + global $cookie_name, $cookie_time, $baseAddr; + include( "view/logout.php" ); +}); + +// Forgot password +$app->map("/forgotpassword/", function() use ($app) { + global $cookie_name, $cookie_time; + include( "view/forgotpassword.php" ); +})->via("GET", "POST"); + +// Change password +$app->map("/changepassword/:hash/", function($hash) use ($app) { + include( "view/changepassword.php" ); +})->via("GET", "POST"); + +// Register +$app->map("/register/", function() use ($app) { + global $cookie_name, $cookie_time; + include( "view/register.php" ); +})->via("GET", "POST"); + +// Account +$app->map("/account(/:req)(/:reqid)/", function($req = NULL, $reqid = NULL) use ($app) { + global $cookie_name, $cookie_time; + include( "view/account.php" ); +})->via("GET", "POST"); + +// Moderator +$app->map("/moderator(/:req)(/:id)(/page/:page)/", function ($req = NULL, $id = NULL, $page = 1) use ($app) { + global $cookie_name, $cookie_time; + include( "view/moderator.php" ); +})->via("GET", "POST"); + +// EveInfo +$app->get("/item/:id/", function($id) use ($app) { + global $oracleURL; + include ("view/item.php" ); +}); + +// StackTrace +$app->get("/stacktrace/:hash/", function($hash) use ($app) { + $q = Db::query("SELECT error, url FROM zz_errors WHERE id = :hash", array(":hash" => $hash)); + $trace = $q[0]["error"]; + $url = $q[0]["url"]; + $app->render("/components/stacktrace.html", array("stacktrace" => $trace, "url" => $url)); +}); + +$app->get("/comments/", function() use ($app) { + $app->render("/comments.html"); +}); + +$app->get("/api/dna(/:flags+)/", function($flags = null) use ($app) { + include( "view/apidna.php" ); +}); + +$app->get("/api/stats/:type/:id/", function($type, $id) use ($app) { + include( "view/apistats.php" ); +}); + +$app->get("/api/:input+", function($input) use ($app) { + include( "view/api.php" ); +}); + +// Kills in the last hour +$app->get("/killslasthour/", function() use ($app) { +die(""); + die(number_format(Storage::retrieve("KillsLastHour", null))); +}); + +// Post +$app->get("/post/", function() use ($app) { + include( "view/postmail.php" ); +}); +$app->post("/post/", function() use ($app) { + include( "view/postmail.php" ); +}); + +// Autocomplete +$app->map("/autocomplete/", function() use ($app) { + include( "view/autocomplete.php" ); +})->via("POST"); + +// Intel +$app->get("/intel/supers/", function() use ($app) { + include( "view/intel.php" ); +}); + +// Sharing Crest Mails +$app->get("/crestmail/:killID/:hash/", function($killID, $hash) use ($app) { + include("view/crestmail.php"); +}); + +// War! +$app->get("/war/:warID/", function($warID) use ($app) { + include("view/war.php"); +}); +$app->get("/wars/", function() use ($app) { + include("view/wars.php"); +}); + +// EVE SSO +$app->get("/auth/eve/", function() use ($app){ + global $ssoEnable; + + if($ssoEnable == false) + die("SSO is disabled"); + + $code = isset($_GET["code"]) ? $_GET["code"] : null; + $state = isset($_GET["state"]) ? $_GET["state"] : null; + //header("Content-type: application/json;charset=utf-8"); + + if(!$code) + { + echo json_encode(array("Error")); + die(); + } + OAuth::eveSSOLoginToken($code, $state); +}); + +// Merge accounts +$app->map("/merge/:characterID/", function($characterID) use ($app){ + global $ssoEnable; + + if($ssoEnable == false) + die("SSO is disabled"); + + include("view/merge.php"); +})->via("GET", "POST"); + +// The Overview stuff +$app->get("/:input+/", function($input) use ($app) { + include("view/overview.php"); +}); diff --git a/themes/404.html b/themes/404.html new file mode 100644 index 00000000..1aada5a4 --- /dev/null +++ b/themes/404.html @@ -0,0 +1,17 @@ +{% extends 'base.html' %} + +{% set pageTitle = '404 Not Found' %} +{% block title %}{% include 'components/title.html' %}{% endblock %} + +{% block content %} +

404

+
The content you're after isn't here. Please go back and try again, or use the mighty fine search at the top! ;) +{% if message %} +
{{ message }} +{% endif %} +
+{% endblock %} + +{% block robots %} + +{% endblock %} diff --git a/themes/account.html b/themes/account.html new file mode 100644 index 00000000..a57fdce1 --- /dev/null +++ b/themes/account.html @@ -0,0 +1,64 @@ +{% extends 'base.html' %} + +{% set pageTitle = 'Account' %} +{% block title %}{% include 'components/title.html' %}{% endblock %} + +{% block content %} +

My Account

+ {% if message %} +
{{ message }}
+ {% endif %} + + + + {% if key == 'me' %} + {% include 'account/me.html' %} + {% elseif key == 'changepassword' %} + {% include 'account/changepassword.html' %} + {% elseif key == 'changeemail' %} + {% include 'account/changeemail.html' %} + {% elseif key == 'api' %} + {% include 'account/api.html' %} + {% elseif key == 'sitesettings' %} + {% include 'account/sitesettings.html' %} + {% elseif key == 'tracker' %} + {% include 'account/tracker.html' %} + {% elseif key == 'subdomains' and reqid %} + {% include 'account/subdomain_management.html' %} + {% elseif key == 'subdomains' %} + {% include 'account/subdomains.html' %} + {% elseif key == 'sessions' %} + {% include 'account/sessions.html' %} + {% elseif key == 'payments' %} + {% include 'account/payments.html' %} + {% elseif key == 'campaigns' %} + {% include 'account/campaigns.html' %} + {% elseif key == 'domains' %} + {% include 'account/domains.html' %} + {% endif %} +{% endblock %} +{% block script %} +{% endblock %} diff --git a/themes/account/api.html b/themes/account/api.html new file mode 100644 index 00000000..67d419b8 --- /dev/null +++ b/themes/account/api.html @@ -0,0 +1,87 @@ +

API Keys

+ + + + + + + + + + + {% for data in data.apiKeys %} + + + + + + + + + {% endfor %} + +
LabelkeyIDvCodeLast ValidatedError 
{{ data.label }}{{ data.keyID }}{{ shortString(data.vCode, 10) }}{{ data.lastValidation }}{% if data.errorCode > 0%}{{ data.errorCode }}{% else %}None{% endif %} +
+ + +
+
+ +

Characters

+ + + + + + + + + + + + + + {% for data in data.apiCharKeys %} + {% set field = data %} + + + + + + + + + + {% endfor %} + +
keyIDCharacterCorporationKey TypeLast CheckedCached UntilError
{{ data.keyID }}{% include 'components/text_char.html' %}{% include 'components/text_corp.html' %}{{ data.isDirector == 'T' ? 'Corporation' : 'Character' }}{{ data.lastCheckedTime }}{{ data.cachedUntilTime }}{% if data.errorCode > 0%}{{ data.errorCode }}{% else %}None{% endif %}
+ +

Add API key

+
+
+

To quickly create an API key, go to https://support.eveonline.com/
(We only require KillLog, but feel free to tick off more.)

+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+
+
diff --git a/themes/account/campaigns.html b/themes/account/campaigns.html new file mode 100644 index 00000000..15d8aa36 --- /dev/null +++ b/themes/account/campaigns.html @@ -0,0 +1,37 @@ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ {% set teamName = 'Team A' %} + {% set team = 'A' %} + {% include 'account/components/campaign_team.html' %} + + {% set teamName = 'Team B' %} + {% set team = 'B' %} + {% include 'account/components/campaign_team.html' %} +
diff --git a/themes/account/changeemail.html b/themes/account/changeemail.html new file mode 100644 index 00000000..903d365b --- /dev/null +++ b/themes/account/changeemail.html @@ -0,0 +1,14 @@ +

Change Email

+
+
+ +
+ +
+
+
+
+ +
+
+
diff --git a/themes/account/changepassword.html b/themes/account/changepassword.html new file mode 100644 index 00000000..8be690d4 --- /dev/null +++ b/themes/account/changepassword.html @@ -0,0 +1,26 @@ +

Change Password

+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+
diff --git a/themes/account/components/campaign_team.html b/themes/account/components/campaign_team.html new file mode 100644 index 00000000..60b8e26a --- /dev/null +++ b/themes/account/components/campaign_team.html @@ -0,0 +1,14 @@ +
+
{{ teamName }}
+
+

Select which Character, Corporation, Alliance, Faction, Ship, System, Region you would like to add to {{ teamName }}.

+
+ + + +
+
+ {% set imageSize = 32 %} + {% include 'account/components/entity_list.html' %} +
+
diff --git a/themes/account/components/entity_list.html b/themes/account/components/entity_list.html new file mode 100644 index 00000000..facb5e49 --- /dev/null +++ b/themes/account/components/entity_list.html @@ -0,0 +1,30 @@ +{% if entities %} + +{% for type, entity in entities %} + {% for field in entity %} + + + + {% endfor %} +{% endfor %} +
+ {% if type == "faction" %}{% include 'components/image_faction.html' %}{% include 'components/text_faction.html' %} + {% elseif type == "alliance" %}{% include 'components/image_alli.html' %}{% include 'components/text_alli.html' %} + {% elseif type == "corporation" %}{% include 'components/image_corp.html' %}{% include 'components/text_corp.html' %} + {% elseif type == "character" %}{% include 'components/image_char.html' %}{% include 'components/text_char.html' %} + {% elseif type == "ship" or type == "item"%}{% include 'components/image_ship.html' %}{% include 'components/text_ship.html' %} + {% elseif type == "region" %}{% include 'components/image_region.html' %}{{ field.regionName }} + {% elseif type == "system" %}{% include 'components/image_system.html' %}{{ field.solarSystemName }} + {% endif %} + +
+ + + + +
+
+{% else %} +Nothing to list here yet... +{% endif %} + diff --git a/themes/account/domains.html b/themes/account/domains.html new file mode 100644 index 00000000..8c8aca4c --- /dev/null +++ b/themes/account/domains.html @@ -0,0 +1,99 @@ +{% if data.domainCorps or data.domainAllis %} +

Your Boards

+ + + + + + + + + + + + {% for data in data.domainCorps %} + {% set field = data %} + + + + + + {% if field.adfreeUntil %} + + {% else %} + + {% endif %} + + + + {% endfor %} + {% for data in data.domainAllis %} + {% set field = data %} + + + + + + {% if field.adfreeUntil %} + + {% else %} + + {% endif %} + + + + {% endfor %} + + +
EntityURLURL AliasAdvertisementsBanner
{% include 'components/text_corp.html' %}http://{{ field.corpTicker|lower }}.{{ siteurl }}Adfree until {{ field.adfreeUntil }}Ads are displayed...
{% include 'components/text_alli.html' %}http://{{ field.alliTicker|lower }}.{{ siteurl }}Adfree until {{ field.adfreeUntil }}Ads are displayed...
Banner Example: http://i.imgur.com/qZ4ETsf.png
+
    +
  • URL alias should be of the format alias.zkillboard.com
  • +
  • URL alias must be at least 6 characters and start and end with a letter or number
  • +
  • URL alias can only contain letters, numbers, and -'s
  • +
  • If you don't follow these rules your alias won't work quite right and you are bad. Stop being bad.
  • +
+
+{% endif %} + +

Subdomains

+{% if data.domainChars|length %} + + + + + + + + + + + + {% for data in data.domainChars %} + {% set field = data %} + + + + + {% if field.allianceID != 0 %} + + + {% else %} + + + {% endif %} + + {% endfor %} + +
CharacterCorporationURLAllianceURL
{% include 'components/text_char.html' %}{% include 'components/text_corp.html' %}http://{{ field.corpTicker|lower }}.{{ siteurl }}{% include 'components/text_alli.html' %}http://{{ field.alliTicker|lower }}.{{ siteurl }}  
+{% else %} +

Your account has no API tied to it, therefore we have no idea what to display for you here...

+{% endif %} +
+

How Subdomains work...

+
    +
  • Subdomains are detected based on the ticker of an entity in the following order: faction > alliance > corporation.
  • +
  • Subdomains are only valid if the entity has had a kill in the last 6 months.
  • + {% if adFreeMonthCost %} +
  • To remove ads from subdomains, click here for directions.
  • + {% endif %} +
diff --git a/themes/account/me.html b/themes/account/me.html new file mode 100644 index 00000000..3667334e --- /dev/null +++ b/themes/account/me.html @@ -0,0 +1,23 @@ +
+
+

My information

+ + + + + + +
Username{{ data.userInfo.username }}
eMail{{ data.userInfo.email }}
Date Registered{{ data.userInfo.dateCreated }}
+
+
+

My API characters

+ + + {% for data in data.apiChars %} + + {% endfor %} + +
{{ data.characterName }}
+
+
+ diff --git a/themes/account/payments.html b/themes/account/payments.html new file mode 100644 index 00000000..c5de270d --- /dev/null +++ b/themes/account/payments.html @@ -0,0 +1,35 @@ +
+

Balance: {{ accountBalance|number_format(2) }} ISK

+Each month of ad free time costs {{ adFreeMonthCost|number_format(2) }} ISK. Each 6 months you purchase will give you a bonus month.

+{% if accountBalance == 0 %} + For details on how to make payments click here.
+ Your balance is 0, sorry, but you currently do not have any options... +{% else %} +
+ {% for i in 12..1 %} + {% if accountBalance >= (adFreeMonthCost * i) %} +
+ +
+ {% endif %} + {% endfor %} +
+ +
+{% endif %} +
+

Payment History

+{% if data.history|length %} + + +{% for row in data.history %} + +{% endfor %} +
DateTypeAmount
{{ row.dttm }}{{ row.purchase }}{{ row.amount }}
+{% else %} +No payment history at this time... +{% endif %} + +
diff --git a/themes/account/sessions.html b/themes/account/sessions.html new file mode 100644 index 00000000..03addf92 --- /dev/null +++ b/themes/account/sessions.html @@ -0,0 +1,29 @@ +

Sessions

+

Deleting a session here does not instantly log you out, it however prevents you from automatically logging in from said device, once the browser session times out.

+ + + + + + + + + + + {% for data in data.sessions %} + + + + + + + + + {% endfor %} + +
session Hashdate CreatedValid TilluserAgentIP 
{{ shortString(data.sessionHash, 10) }}{{ data.dateCreated }}{{ data.validTill }}{{ data.userAgent }}{{ data.ip }} +
+ + +
+
\ No newline at end of file diff --git a/themes/account/sitesettings.html b/themes/account/sitesettings.html new file mode 100644 index 00000000..ff5c28c0 --- /dev/null +++ b/themes/account/sitesettings.html @@ -0,0 +1,62 @@ +
+
+

Skin / Theme

+
+

Skin

+
+
+
+ +
+
+ +
+
+
+
+
+ +
+

Show Condensed Timestamps

+
+
+
+ +
+
+ +
+
+

Will replace all killlist timestamps with Facebook style timestamps, instead of saying "2012-11-01 12:00:00" it will say "2 hours ago", "3 months ago" etc.

+
+
+ +
+

Show Facebook Like Button

+
+
+
+ +
+
+ +
+
+

If on, display the Facebook like button. If off, don't display it.

+
+
diff --git a/themes/account/tracker.html b/themes/account/tracker.html new file mode 100644 index 00000000..09ff5de1 --- /dev/null +++ b/themes/account/tracker.html @@ -0,0 +1,42 @@ +
+
+

Add Tracker

+
+

Select which Character, Corporation, Alliance, Faction, Ship, System, Region you would like to follow.

+
+ + +
+
+
+
+

Existing Trackers

+{% set imageSize = 32 %} +{% if data.entities %} + +{% for type, entity in data.entities %} + {% for field in entity %} + + + + {% endfor %} +{% endfor %} +
+ {% if type == "faction" %}{% include 'components/image_faction.html' %}{% include 'components/text_faction.html' %} + {% elseif type == "alliance" %}{% include 'components/image_alli.html' %}{% include 'components/text_alli.html' %} + {% elseif type == "corporation" %}{% include 'components/image_corp.html' %}{% include 'components/text_corp.html' %} + {% elseif type == "character" %}{% include 'components/image_char.html' %}{% include 'components/text_char.html' %} + {% elseif type == "ship" or type == "item"%}{% include 'components/image_ship.html' %}{% include 'components/text_ship.html' %} + {% elseif type == "region" %}{% include 'components/image_region.html' %}{{ field.regionName }} + {% elseif type == "system" %}{% include 'components/image_system.html' %}{{ field.solarSystemName }} + {% endif %} + +
+ + + +
+
+{% endif %} +
+
diff --git a/themes/base.html b/themes/base.html new file mode 100644 index 00000000..c85c6e52 --- /dev/null +++ b/themes/base.html @@ -0,0 +1,195 @@ + + + + + + {% if description is not defined %} + {% set description = siteurl ~ " is a killboard for the Massively Multiplayer Online Role Playing Game (MMORPG) EVE-Online." %} + {% endif %} + + + + + + + + + + + + + + + {% block opengraph %} + + + + + + + + + {% endblock %} + + {% block robots %} + {% endblock %} + + + + + {% block title %} + {{ siteurl }} + {% endblock %} + + + {% if canonical is not defined %} + {% set canonical = fullsiteurl ~ requesturi %} + {% endif %} + + + + + {% if style == "cyborg" %} + {% set version = "3.1.1" %} + {% else %} + {% set version = "latest" %} + {% endif %} + + {% if style == "default" %} + + {% else %} + + {% endif %} + + + + + + + {% block style %} + {% endblock %} + + {% if showAnalytics != false %} + {{ analytics|raw }} + {% endif %} + + + + +
+ + +
+ {% include "navigationbar.html" %} +
+ + + + +
+ + {% if getNotification() %} +
{{ getNotification()|raw }}
+ {% endif %} + + + {% if accountBalance >= adFreeMonthCost and accountBalance > 0 %} + + {% endif %} + + + {% if showAds != false %} +
+ {{ topad|raw }} +
+ {% endif %} + + + {% block header %}{% endblock %} + + {% block content %}Default content{% endblock %} + +
+ + + {% if showAds != false %} +


+
+ {{ bottomad|raw }} +
+ {% endif %} + + + +
+ + +
+ {% block modal %}{% endblock %} +
+
+ + + + + + + + + + {% if disqusLoad %} + + {% endif %} + {% if disqusSSO and disqusLoad %} + + {% endif %} + + + + {% block script %} + {% endblock %} + + + + diff --git a/themes/campaign.html b/themes/campaign.html new file mode 100644 index 00000000..186b4db4 --- /dev/null +++ b/themes/campaign.html @@ -0,0 +1,41 @@ +{% extends 'base.html' %} + +{% set pageTitle = 'Campaign' %} +{% block title %}{% include 'components/title.html' %} +{% endblock %} + +{% block content %} +
+
+

{{ pageTitle }}

+ {{ subTitle }} +
+ +
+ {% include "components/stats_box.html" %} +
+
+
+ +{% set killListTitle = 'Most recent kills' %} +{% set killList = kills %} +
+
+
+ {% set shipNameLength = 11 %} + {% set topTitle = 'Most Valuable Kills - Last 7 Days' %} + {% set topSet = topIsk %} + {% include 'components/big_top_list.html' %} +
+
+{% include 'components/kill_list.html' %} +
+
+ {% set isEmbedded = true %} + {% for topSet in topKillers %} + {% include 'components/top_killer_list.html' %} + {% endfor %} +
+
+ +{% endblock %} diff --git a/themes/changepassword.html b/themes/changepassword.html new file mode 100644 index 00000000..f716c036 --- /dev/null +++ b/themes/changepassword.html @@ -0,0 +1,36 @@ +{% extends 'base.html' %} + +{% set pageTitle = 'Change Password' %} +{% block title %}{% include 'components/title.html' %}{% endblock %} + +{% block content %} +{% if message %} +

Change Password

+
+

{{ message }}

+
+{% else %} +

Change Password

+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+{% endif %} +{% endblock %} diff --git a/themes/comments.html b/themes/comments.html new file mode 100644 index 00000000..2dc1d582 --- /dev/null +++ b/themes/comments.html @@ -0,0 +1,8 @@ +{% extends 'base.html' %} + +{% set pageTitle = 'Comments' %} +{% block title %}{% include 'components/title.html' %}{% endblock %} + +{% block content %} +Powered by Disqus +{% endblock %} diff --git a/themes/components/attackers.html b/themes/components/attackers.html new file mode 100644 index 00000000..bebf416d --- /dev/null +++ b/themes/components/attackers.html @@ -0,0 +1,22 @@ +{% set attackList = extra.involved %} +{% include 'components/attackers_list.html'%} +{% if killdata.info.number_involved > "10" %} +
+
+ +
+
+ {% set attackList = extra.allinvolved %} + {% set isDelayed = true %} + {% set hideTableHeading = true %} + {% include 'components/attackers_list.html'%} + {% set isDelayed = false %} +
+
+
+
+{% endif %} diff --git a/themes/components/attackers_list.html b/themes/components/attackers_list.html new file mode 100644 index 00000000..16513d2e --- /dev/null +++ b/themes/components/attackers_list.html @@ -0,0 +1,66 @@ + + {% if not hideTableHeading %} + + + + + + + + + {% endif %} + + {% for attacker in attackList %} + {% set field = attacker %} + + + + + + + + {% endfor %} + +
+ {% set field = attacker %} + {% set shortLength = 25 %} + + + {% set shortLength = 30 %} + + {{ attacker.damage|number_format(0) }}
+ {% if attacker.damage > 0 and killdata.victim.damage > 0 %} + {{ ((attacker.damage / killdata.victim.damage) * 100)|number_format(1) }}% + {% endif %} +
diff --git a/themes/components/big_top_list.html b/themes/components/big_top_list.html new file mode 100644 index 00000000..4ed1dbf9 --- /dev/null +++ b/themes/components/big_top_list.html @@ -0,0 +1,32 @@ +{% if topSet | length %} +
+{% if topSet.title %} +

{{ topSet.title }}

+{% else %} +

{{ topTitle }}

+{% endif %} +
+
+{% set imageSize = 64 %} +{% set shipNameLength = 32 %} +{% for data in topSet %} +
+ {% set field = data.victim %} + {% set shipImageLinkOverride = data.killID %} + {% set shipNameLength = 20 %} + + {% include 'components/image_ship.html' %}
+ +
{{ formatIsk(data.zkb.totalValue) }} ISK + {% if disqusLoad %} + + {% endif %}
+
+
+{% endfor %} +
+{% endif %} diff --git a/themes/components/corp_list.html b/themes/components/corp_list.html new file mode 100644 index 00000000..767be3bd --- /dev/null +++ b/themes/components/corp_list.html @@ -0,0 +1,23 @@ + + + + + + + +{% for corp in corps %} + {% set field = corp %} + + + + + + + + +{% endfor %} +
Corp. NameTickerMembersAPIAPI Key CountNext Check
{% include 'components/text_corp.html' %}[{{corp.ticker}}]{{ corp.memberCount | number_format(0) }} + {% if corp.apiVerified == 1%}API Verified + {% elseif corp.apiPercentage is defined %}{{ corp.apiPercentage }}% Verified + {% endif %} + {{ corp.keyCount}}{{ corp.cachedUntilTime }}
diff --git a/themes/components/corpstats.html b/themes/components/corpstats.html new file mode 100644 index 00000000..c8b19b12 --- /dev/null +++ b/themes/components/corpstats.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + {% for corp in corpStats %} + {% set field = corp %} + + + + + + + + + + + + + + {% endfor %} + +
CorporationTickerMembersCEOKillsISKPointsLossesISKPointsEffeciency
{% include 'components/text_corp.html' %}[{{corp.ticker}}]{{ corp.members | number_format(0) }}{{ corp.ceoName }}{{ corp.kills | number_format(0)}}{{ corp.killsIsk | number_format(0)}}{{ corp.killPoints | number_format(0) }}{{ corp.losses | number_format(0) }}{{ corp.lossesIsk | number_format(0) }}{{ corp.lossesPoints | number_format(0) }}{{ corp.effeciency | number_format(0) }}%
diff --git a/themes/components/disqus.html b/themes/components/disqus.html new file mode 100644 index 00000000..7f78be19 --- /dev/null +++ b/themes/components/disqus.html @@ -0,0 +1,12 @@ +
+ + +comments powered by Disqus diff --git a/themes/components/fitting_wheel.html b/themes/components/fitting_wheel.html new file mode 100644 index 00000000..590c885b --- /dev/null +++ b/themes/components/fitting_wheel.html @@ -0,0 +1,135 @@ +{% set imageSize = 32 %} +{% set fitting = extra.fittingwheel %} +{% set eveImageClass = false %} +{% set placement = "top" %} +
+
+ {% if killdata.victim.characterID >= 2100000000 and killdata.victim.characterID <= 2999999999 %} + + + {% else %} + + {% endif %} +
+ +{% set slotCount = (fitting.high | length > extra.slotCounts.highSlotCount ) ? fitting.high | length : extra.slotCounts.highSlotCount %} +{% set slotCount = min(8, max(0, slotCount)) %} +{% if killdata.victim.groupID == 29 %}{% set slotCount = 5 %}{% endif %} +
+ +
+
{% set field = fitting.high.27.0.0 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.high.28.0.0 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.high.29.0.0 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.high.30.0.0 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.high.31.0.0 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.high.32.0.0 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.high.33.0.0 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.high.34.0.0 %}{% include 'components/image_item.html' %}
+ +{% set slotCount = (fitting.mid | length > extra.slotCounts.midSlotCount ) ? fitting.mid | length : extra.slotCounts.midSlotCount %} +{% set slotCount = min(8, max(0, slotCount)) %} +
+ +
+
{% set field =fitting.mid.19.0.0 %}{% include 'components/image_item.html' %}
+
{% set field =fitting.mid.20.0.0 %}{% include 'components/image_item.html' %}
+
{% set field =fitting.mid.21.0.0 %}{% include 'components/image_item.html' %}
+
{% set field =fitting.mid.22.0.0 %}{% include 'components/image_item.html' %}
+
{% set field =fitting.mid.23.0.0 %}{% include 'components/image_item.html' %}
+
{% set field =fitting.mid.24.0.0 %}{% include 'components/image_item.html' %}
+
{% set field =fitting.mid.25.0.0 %}{% include 'components/image_item.html' %}
+
{% set field =fitting.mid.26.0.0 %}{% include 'components/image_item.html' %}
+ +{% set slotCount = (fitting.low | length > extra.slotCounts.lowSlotCount ) ? fitting.low | length : extra.slotCounts.lowSlotCount %} +{% set slotCount = min(8, max(0, slotCount)) %} +{% if killdata.victim.groupID == 29 %}{% set slotCount = 5 %}{% endif %} +
+ +
+
{% set field = fitting.low.11.0.0 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.low.12.0.0 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.low.13.0.0 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.low.14.0.0 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.low.15.0.0 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.low.16.0.0 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.low.17.0.0 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.low.18.0.0 %}{% include 'components/image_item.html' %}
+ +{% set slotCount = (fitting.rig | length > extra.slotCounts.rigSlotCount ) ? fitting.rig | length : extra.slotCounts.rigSlotCount %} +
+ +
+
{% set field = fitting.rig.92.0.0 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.rig.93.0.0 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.rig.94.0.0 %}{% include 'components/image_item.html' %}
+ +{% if fitting.sub | length %} +
+ +
+
{% set field = fitting.sub.125.0.0 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.sub.126.0.0 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.sub.127.0.0 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.sub.128.0.0 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.sub.129.0.0 %}{% include 'components/image_item.html' %}
+{% endif %} + +
{% set field = fitting.high.27.0.1 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.high.28.0.1 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.high.29.0.1 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.high.30.0.1 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.high.31.0.1 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.high.32.0.1 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.high.33.0.1 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.high.34.0.1 %}{% include 'components/image_item.html' %}
+ +
{% set field = fitting.mid.19.0.1 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.mid.20.0.1 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.mid.21.0.1 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.mid.22.0.1 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.mid.23.0.1 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.mid.24.0.1 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.mid.25.0.1 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.mid.26.0.1 %}{% include 'components/image_item.html' %}
+ +
{% set field = fitting.low.11.0.1 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.low.12.0.1 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.low.13.0.1 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.low.14.0.1 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.low.15.0.1 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.low.16.0.1 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.low.17.0.1 %}{% include 'components/image_item.html' %}
+
{% set field = fitting.low.18.0.1 %}{% include 'components/image_item.html' %}
+ +{% if killdata.victim.characterID >= 2100000000 and killdata.victim.characterID <= 2999999999 %} +
+
+
+{% else %} +
+ {% set imageSize = 256 %} + {% set field = killdata.victim %} + {% include 'components/image_ship.html' %} +
+{% endif %} +{% if extra.crest %}CREST Verified +{% elseif killdata.victim.killID > 0 %}API Verified{% endif %} +
+ +{% set eveImageClass = true %} + + + diff --git a/themes/components/flag_list.html b/themes/components/flag_list.html new file mode 100644 index 00000000..86c73665 --- /dev/null +++ b/themes/components/flag_list.html @@ -0,0 +1,35 @@ +{% set imageSize = 32 %} +{% set resizeImage = 24 %} +{% set headerDisplayed = false %} +{% for item in items %} + {% if item.flagName == flagName %} + {% if headerDisplayed == false %} + {% if killdata.victim.characterID >= 2100000000 and killdata.victim.characterID <= 2999999999 %} + +
Suit Fittings
+ + +
Suit Fittings
+ + {% else %} + +
{{ flagName }}
+ + +
{{ flagName }}
+ + {% endif %} + {% set headerDisplayed = true %} + {% endif %} + {% set droppedRow = item.quantityDropped > 0 ? 'item_dropped_row' : '' %} + {% set dropped = item.quantityDropped > 0 ? 'item_dropped' : '' %} + {% set destroyed = item.quantityDestroyed > 0 ? 'item_destroyed' : '' %} + + {% set field = item %} +
{% include 'components/image_item.html' %}
+ {% if item.inContainer == 1%}— {% endif %}{{ item.typeName }}{% if item.singleton == 2%} (Copy){% endif %} + {% if item.quantityDropped %}{{ item.quantityDropped|number_format(0) }}{%else%}{{ item.quantityDestroyed|number_format(0) }}{% endif %} + {{ (item.singleton == 2 ? (item.price / 100) : item.price)|number_format(2) }} + + {% endif %} +{% endfor %} diff --git a/themes/components/history.html b/themes/components/history.html new file mode 100644 index 00000000..8e15b6ef --- /dev/null +++ b/themes/components/history.html @@ -0,0 +1,37 @@ +
+

Monthly History

+{% set history = statistics.months %} +{% set lastYear = 0 %} +{% set currentYear = 0 %} + + + + + + + + + + + + + + +{% for month in history %} + {% if currentYear != month.year %} + + {% set currentYear = month.year %} + {% endif %} + + + + + + + + + + + +{% endfor %} +
 KillsPointsISKLossesPointsISKEfficiencyTop 10
{{ month.year }}
{{ getLongMonth(month.month) }}{{ month.shipsDestroyed | number_format(0) }}{{ month.pointsDestroyed | number_format(0) }}{{ formatIsk(month.iskDestroyed) }}{{ month.shipsLost | number_format(0) }}{{ month.pointsLost | number_format(0) }}{{ formatIsk(month.iskLost) }}{{ (month.iskDestroyed == 0 ? 0 : (month.iskDestroyed / (month.iskDestroyed + month.iskLost) * 100)) | round(2) }}%{{ month.month }} / {{ month.year }}
diff --git a/themes/components/image_alli.html b/themes/components/image_alli.html new file mode 100644 index 00000000..cecfca84 --- /dev/null +++ b/themes/components/image_alli.html @@ -0,0 +1,6 @@ +{% if field.allianceID != 0 %} +{% set actualSize = (resizeImage is defined) ? resizeImage : imageSize %} + + {{ field.allianceName }} + +{% endif %} diff --git a/themes/components/image_char.html b/themes/components/image_char.html new file mode 100644 index 00000000..68586b6c --- /dev/null +++ b/themes/components/image_char.html @@ -0,0 +1,12 @@ +{% set actualSize = (resizeImage is defined) ? resizeImage : imageSize %} +{% if field.characterID == 0 %} + +{% else %} + + {% if isDelayed %} + {{ field.characterName }} + {% else %} + {{ field.characterName }} + {% endif %} + +{% endif %} diff --git a/themes/components/image_corp.html b/themes/components/image_corp.html new file mode 100644 index 00000000..1f2093cc --- /dev/null +++ b/themes/components/image_corp.html @@ -0,0 +1,9 @@ +{% set actualSize = (resizeImage is defined) ? resizeImage : imageSize %} +{% if field.corporationID == 0 %} + +{% else %} + + {{ field.corporationName}} + +{% endif %} + diff --git a/themes/components/image_faction.html b/themes/components/image_faction.html new file mode 100644 index 00000000..c778866a --- /dev/null +++ b/themes/components/image_faction.html @@ -0,0 +1,6 @@ +{% if field.factionID != 0 %} +{% set actualSize = (resizeImage is defined) ? resizeImage : imageSize %} + + {{ field.factionName }} + +{% endif %} diff --git a/themes/components/image_item.html b/themes/components/image_item.html new file mode 100644 index 00000000..72aca7b6 --- /dev/null +++ b/themes/components/image_item.html @@ -0,0 +1,24 @@ +{% set actualSize = (resizeImage is defined) ? resizeImage : imageSize %} +{% if field.weaponTypeID != 0 %} + {% set typeID = field.weaponTypeID %} + {% set typeName = field.weaponTypeName %} +{% elseif field.typeID != 0 %} + {% set typeID = field.typeID %} + {% set typeName = field.typeName %} +{% endif %} +{% if typeID %} +{% if eveImageClass is not defined %}{% set eveImageClass = true%}{%endif%} +{% set eveImage = eveImageClass == true ? 'eveimage ' : '' %} + +{% if placement %} + +{% else %} + +{% endif %} + {% if isDelayed %} + {{ typeName }} + {% else %} + {{ typeName }} + {% endif %} + +{% endif %} diff --git a/themes/components/image_region.html b/themes/components/image_region.html new file mode 100644 index 00000000..ca18dedf --- /dev/null +++ b/themes/components/image_region.html @@ -0,0 +1,4 @@ +{% set actualSize = resizeImage is defined ? resizeImage : imageSize %} + + {{ field.regionName }} + diff --git a/themes/components/image_ship.html b/themes/components/image_ship.html new file mode 100644 index 00000000..cfd15a8d --- /dev/null +++ b/themes/components/image_ship.html @@ -0,0 +1,16 @@ +{% set actualSize = (resizeImage is defined) ? resizeImage : imageSize %} +{% if field.shipTypeID == 0 %} + +{% else %} + {% if shipImageLinkOverride != 0 %} + {% set url = "/kill/" ~ shipImageLinkOverride ~ "/" %} + {% set title = "Detail for " ~ shipImageLinkOverride %} + {% else %} + {% set url = "/ship/" ~ field.shipTypeID ~ "/" %} + {% set title = field.shipName %} + {% endif %} + {% set source = ( actualSize >= 64 ? image_ship : image_item ) %} + + {{field.shipName}} + +{% endif %} diff --git a/themes/components/image_system.html b/themes/components/image_system.html new file mode 100644 index 00000000..371ce9ee --- /dev/null +++ b/themes/components/image_system.html @@ -0,0 +1,4 @@ +{% set actualSize = (resizeImage is defined) ? resizeImage : imageSize %} + + {{ field.solarSystemName }} + diff --git a/themes/components/info_top.html b/themes/components/info_top.html new file mode 100644 index 00000000..5bb91af6 --- /dev/null +++ b/themes/components/info_top.html @@ -0,0 +1,120 @@ +{% set shortLength = 100 %} +{% if detail.characterName %}{% set name = detail.characterName %} +{% elseif detail.corporationName %}{% set name = detail.corporationName %} +{% elseif detail.allianceName %}{% set name = detail.allianceName %} +{% elseif detail.factionName %}{% set name = detail.factionName %} +{% elseif pageName %}{% set name = pageName %}{% endif %} + +{% if detail.aticker %}{% set ticker = ' <' ~ detail.aticker ~ '>' %}{% endif %} +{% if detail.cticker %}{% set ticker = ' [' ~ detail.cticker ~ ']' %}{% endif %} + +{% if key != '' %} + {% set field = detail %} +{% else %} +

Overview for {{ name }}

+{% endif %} + +
+
+ +
+ {% include 'components/info_top_image.html' %} + +
+ {% if not detail.groupShips %} + + + {% if detail.characterID %} + + + + + {% endif %} + {% if detail.corporationID %} + + + + + {% endif %} + {% if detail.ceoID and detail.ceoName %} + + + + + {% endif %} + {% if detail.allianceName %} + + + + + {% endif %} + {% if detail.executorCorpID and detail.executorCorpName %} + + + + + {% endif %} + {% if detail.factionName %} + + + + + {% endif %} + {% if detail.shipName %} + + + + + {% endif %} + {% if detail.groupName and detail.groupName != "#System" %} + + + + + {% endif %} + {% if detail.solarSystemName %} + + + + + {% endif %} + {% if detail.solarSystemSecurity %} + + + + + {% endif %} + {% if detail.systemClass %} + + + + + {% endif %} + {% if detail.systemEffect %} + + + + + {% endif %} + {% if detail.regionName %} + + + + + {% endif %} + {% if detail.memberCount is defined and detail.memberCount > 0 %} + + + + + {% endif %} + +
Character:{% include 'components/text_char.html' %} {% if apiVerified is defined and key == "character" and apiVerified == 1 %}{% endif %}
Corporation:{% include 'components/text_corp.html' %} {% if detail.cticker %}[{{ detail.cticker }}]{% endif %} {% if apiVerified is defined and key == "corporation" and apiVerified > 0 %}{% endif %}
CEO:{% include 'components/text_char.html' %}
Alliance:{% include 'components/text_alli.html' %} {% if detail.aticker %}<{{ detail.aticker }}>{% endif %}
Executor:{% include 'components/text_corp.html' %}
Faction:{% include 'components/text_faction.html' %}
Ship:{{ detail.shipName }}
Class:{{ detail.groupName }}
System:{{ detail.solarSystemName }}
Security:{{ detail.solarSystemSecurity|number_format(1) }}
Class:{{ detail.systemClass }}
Effect:{{ detail.systemEffect }}
Region:{{ detail.regionName }}
Members:{% if detail.memberCount == 0 %}(Closed){% else %}{{ detail.memberCount | number_format(0) }}{% endif %}
+ {% endif %} +
+
+
+
+ {% include 'components/stats_box.html' %} +
+
diff --git a/themes/components/info_top_image.html b/themes/components/info_top_image.html new file mode 100644 index 00000000..02abe27e --- /dev/null +++ b/themes/components/info_top_image.html @@ -0,0 +1,37 @@ + +{% if detail.groupShips %} +
+ {% set imageSize = 64 %} + {% set isPullLeft = true %} + {% for field in detail.groupShips %} + {% include 'components/image_ship.html' %} + {% endfor %} + {% set isPullLeft = false %} +
+{% endif %} diff --git a/themes/components/intel_table.html b/themes/components/intel_table.html new file mode 100644 index 00000000..27d1bbe5 --- /dev/null +++ b/themes/components/intel_table.html @@ -0,0 +1,17 @@ +{% set first = true %} +{% set imageSize = 64 %} +{% set resizeImage = 40 %} +
+
{{ fieldset.title }}
+ + + {% for field in fieldset.data %} + + + + + + + {% endfor %} +
 CharacterKills
{% include 'components/image_char.html' %}{% include 'components/text_char.html' %}
{{ field.shipName }}
{{ field.kills|number_format(0) }}{{ field.title }}
+
diff --git a/themes/components/involved_summary.html b/themes/components/involved_summary.html new file mode 100644 index 00000000..638ce6d6 --- /dev/null +++ b/themes/components/involved_summary.html @@ -0,0 +1,26 @@ +
+
+ +
+
+

Involved Alliance(s) / Corp(s)

+ + {% for allianceID, alliance in field %} + + {% for corp in alliance.corporations %} + + + {% endfor %} + {% endfor %} +
+ {% if allianceID == 0 %}None{% else %}{% set field = alliance %}{% include 'components/text_alli.html' %}{% endif %} + {{ alliance.involved | number_format(0) }}
— {% set field = corp %}{% include 'components/text_corp.html' %}{{ corp.involved|number_format(0) }}
+
+
+
+
+ diff --git a/themes/components/item_list.html b/themes/components/item_list.html new file mode 100644 index 00000000..bc4ec33e --- /dev/null +++ b/themes/components/item_list.html @@ -0,0 +1,51 @@ +

Item(s) Dropped / Destroyed

+ + + + + + + + + + + {% set items = extra.items %} + {% for flag, flagName in flags %} + {% include 'components/flag_list.html' %} + {% endfor %} + + {% if killdata.victim.characterID >= 2100000000 and killdata.victim.characterID <= 2999999999 %} + + {% else %} + + {% endif %} + + + {% set imageSize = 32 %} + {% set field = killdata.victim %} + + + + + + + + + + + + + + {% if extra.fittedisk > 0 %} + + + + + {% endif %} + + + + + +
Item Type
Quantity
Price (ISK)
Dropsuit
Ship
{{killdata.victim.shipName}}
1
{{ killdata.victim.shipPrice|number_format(2, '.', ',') }}
+ diff --git a/themes/components/kill_list.html b/themes/components/kill_list.html new file mode 100644 index 00000000..3c82cceb --- /dev/null +++ b/themes/components/kill_list.html @@ -0,0 +1,102 @@ +{% set txtLength = 60 %} +{% include 'components/pager.html' %} +{% if killList|length == 0 %} +

{{ killListTitle }}

+
Nothing to display here...
+{% else %} +

{{ killListTitle }}

+ {% set CurrentYear = '' %} + {% set CurrentMonth = '' %} + {% set CurrentDay = ''%} +
+ + + + + + + + + + + + + + {% for kill in killList if kill.killID > 0 %} + {% set shipImageLinkOverride = kill.killID %} + {% set date = (kill.dttm.sec|date('M d, Y')) %} + {% if currentDate != date %} + {% set currentDate = (kill.dttm.sec|date('M d, Y')) %} + + + + {% endif %} + + {% set imageSize = 64 %} + {% set resizeImage = 40 %} + + {% set field = kill.victim %} + {% set lossDisplay = '' %} + {% if (kill.displayAsLoss == true and key != 'system' and key != 'region') or pageType == 'losses' %}{% set lossDisplay = 'error' %}{% elseif pageType == 'overview' or pageType == 'kills' or pageType == 'solo' or kill.displayAsKill == true %}{% set lossDisplay = 'winwin' %}{% endif %} + + + + + + + {% set field = kill.finalBlow %} + + + + {% endfor %} + +
Time
{{ date }}
+ {% if timeago == "true" %} + {{ kill.ISO8601}} + {% else %} + {{ kill.dttm.sec|date('H:i') }} + {% endif %} + {% if disqusLoad %} + + {% endif %} +
{{ formatIsk(kill.zkb.totalValue) }} +
+ {{ shortString(kill.system.solarSystemName, 13) }} {{ "%1.1f"|format(kill.system.solarSystemSecurity) }}
+ {{ shortString(kill.system.regionName, 17) }} +
+ {{ kill.victim.characterName }} ({{ kill.victim.shipName }})
+ {{ shortString(kill.victim.corporationName, txtLength) }} + {% if kill.victim.allianceID != 0 %} + / {{ shortString(kill.victim.allianceName, txtLength) }} + {% endif %} +
+{% include 'components/pager.html' %} +{% endif %} diff --git a/themes/components/market.html b/themes/components/market.html new file mode 100644 index 00000000..55d45b9a --- /dev/null +++ b/themes/components/market.html @@ -0,0 +1,19 @@ + + + + + + + + + + {% for row in field %} + + + + + + + {% endfor %} + +
DateLow PriceAvg PriceHigh Price
{{ row.priceDate }}{{ row.lowPrice|number_format(2) }}{{ row.avgPrice|number_format(2) }}{{ row.highPrice|number_format(2) }}
diff --git a/themes/components/pager.html b/themes/components/pager.html new file mode 100644 index 00000000..e5ebc7df --- /dev/null +++ b/themes/components/pager.html @@ -0,0 +1,37 @@ +{% if pageType == "kills" or pageType == "overview" or pageType == "solo" or pageType=="losses" or pageType == "subdomain" %} + {% set pageBase = requestUriPager %} +{% elseif pageType == "index" %} + {% set pageBase = "/kills/" %} +{% else %} + {% set pageBase = requesturi %} +{% endif %} +{% set pageBase = (pageBase == '' ? '/' : pageBase) %} + +
+ {% if datepicker == true %} +
    +
  • +
+ {% endif %} +
    + {% if pager == true %} + {% if page == 2 %} +
  • «
  • + {% elseif page > 2 %} +
  • «
  • + {% endif %} + + {% set startIndex = page - 3 %} + {% set endIndex = page + 3 %} + + {% for pageIndex in startIndex..endIndex %} + {% if pageIndex == 1 %} +
  • {{ pageIndex }}
  • + {% elseif pageIndex > 1 %} +
  • {{ pageIndex }}
  • + {% endif %} + {% endfor %} +
  • »
  • + {% endif %} +
+
diff --git a/themes/components/pop_item_list.html b/themes/components/pop_item_list.html new file mode 100644 index 00000000..1c1d3a73 --- /dev/null +++ b/themes/components/pop_item_list.html @@ -0,0 +1,36 @@ + + + + + + + + + + + {% set items = extra.items %} + {% for flag, flagName in flags %} + {% include 'components/flag_list.html' %} + {% endfor %} + + {% if killdata.victim.characterID >= 2100000000 and killdata.victim.characterID <= 2999999999 %} + + {% else %} + + {% endif %} + + + {% set imageSize = 32 %} + {% set field = killdata.victim %} + + + + + + + + + + +
Item Type
Qty
Price (ISK)
Dropsuit
Ship
{{killdata.victim.shipName}}
1
{{ killdata.victim.shipPrice|number_format(2, '.', ',') }}
+ diff --git a/themes/components/rank_table.html b/themes/components/rank_table.html new file mode 100644 index 00000000..887b3b74 --- /dev/null +++ b/themes/components/rank_table.html @@ -0,0 +1,69 @@ +

{{ rankTable.name }}

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% for row in rankTable.data %} + {% set field = row %} + + + + + + + + {% set color = (row.shipEff >= 50 ? 'green' : 'red') %} + + + + + + {% set color = (row.pointsEff >= 50 ? 'green' : 'red') %} + + + + + {% set color = (row.iskEff >= 50 ? 'green' : 'red') %} + + {% endfor %} + +
{{ tableTitle }} ShipsPointsISK
{{ rankTable.type|capitalize }} + DestroyedRankLostRankEff. %DestroyedRankLostRankEff. %DestroyedRankLostRankEff. %
{{ row.overallRank | number_format(0) }} + {% if rankTable.type == "alli" %}{% include 'components/text_alli.html' %} + {% elseif rankTable.type == "corp" %}{% include 'components/text_corp.html' %} + {% elseif rankTable.type == "character" %}{% include 'components/text_char.html' %} + {% elseif rankTable.type == "weapon" %}{% include 'components/text_item.html' %} + {% elseif rankTable.type == "ship" %}{% include 'components/text_ship.html' %} + {% elseif rankTable.type == "group" %}{% include 'components/text_shipclass.html' %} + {% elseif rankTable.type == "faction" %}{% include 'components/text_faction.html' %} + {% elseif rankTable.type == "system" %}{% include 'components/text_system.html' %} + {% elseif rankTable.type == "region" %}{% include 'components/text_region.html' %} + {% else %} {{ rankTable.type }} + {% endif %} + {{ shortNum(row.shipsDestroyed) }}{{ row.sdRank | number_format(0) }}{{ shortNum(row.shipsLost) }}{{ row.slRank | number_format(0) }}{{ row.shipEff | number_format(1) }}{{ shortNum(row.pointsDestroyed) }}{{ row.pdRank | number_format(0) }}{{ shortNum(row.pointsLost) }}{{ row.plRank | number_format(0) }}{{ row.pointsEff | number_format(1) }} + {{ shortNum(row.iskDestroyed) }}{{ row.idRank | number_format(0) }}{{ shortNum(row.iskLost) }}{{ row.ilRank | number_format(0) }}{{ row.iskEff | number_format(1) }} +
diff --git a/themes/components/related_list.html b/themes/components/related_list.html new file mode 100644 index 00000000..1a5356fc --- /dev/null +++ b/themes/components/related_list.html @@ -0,0 +1,29 @@ +{% set imageSize = 64 %} + +{% for related in list %} + {% set class='' %} + {% set onClick = 'return false;' %} + {% set shipImageLinkOverride = 0 %} + {% if related.destroyed > 0 %} + {% set class='error' %} + {% autoescape false %} + {% set onClick = 'if (event.which == 2) return false; window.location="/kill/' ~ related.destroyed ~ '/"' %} + {% set shipImageLinkOverride = related.destroyed %} + {% endautoescape %} + {% endif %} + + +{% endfor %} +
+ {% set field = related %} + {% include 'components/image_ship.html' %} + {% include 'components/image_char.html' %} + {% include 'components/image_corp.html' %} + {% include 'components/image_alli.html' %} + + {{ related.characterName }}{% if related.shipTypeID != 0%} ({{ related.shipName}}{% if related.shipTypeID != 670 and related.podded == 1%} / Capsule{%endif%}){% endif %}
+ {{ related.corporationName }}
+ {% if related.allianceID != 0 %}{{ related.allianceName}}
{% endif %} + {% if related.factionID != 0 %}{{ related.factionName}}
{% endif %} +
+ diff --git a/themes/components/related_summary.html b/themes/components/related_summary.html new file mode 100644 index 00000000..1d1a5366 --- /dev/null +++ b/themes/components/related_summary.html @@ -0,0 +1,20 @@ +{% if groupIDs|length %} + + + + + + + + + {% for stats in groupIDs %} + + + + + + + {% endfor %} + +
Ship ClassLostPointsISK
{{ stats.groupName }}{{ stats.count|number_format(0) }}{{ stats.points|number_format(0) }}{{ stats.isk|number_format(2) }}
+{% endif %} diff --git a/themes/components/stacktrace.html b/themes/components/stacktrace.html new file mode 100644 index 00000000..64af2f1c --- /dev/null +++ b/themes/components/stacktrace.html @@ -0,0 +1,13 @@ +{% extends 'base.html' %} + +{% set pageTitle = 'stackTrace' %} +{% block title %}{% include 'components/title.html' %}{% endblock %} + +{% block content %} +

stackTrace

+Problem page: {{ siteurl }}{{ url }} +
+{{ stacktrace|raw }}
+
+ +{% endblock %} diff --git a/themes/components/stats_box.html b/themes/components/stats_box.html new file mode 100644 index 00000000..19433c4c --- /dev/null +++ b/themes/components/stats_box.html @@ -0,0 +1,72 @@ +{% if statistics.shipsDestroyed or statistics.shipsLost %} +{% set shipEff = (statistics.shipsDestroyed + statistics.shipsLost) == 0 ? 100 : (statistics.shipsDestroyed / (statistics.shipsDestroyed + statistics.shipsLost)) * 100 %} +{% set pointsEff = (statistics.pointsDestroyed + statistics.pointsLost) == 0 ? 100 : (statistics.pointsDestroyed / (statistics.pointsDestroyed + statistics.pointsLost)) * 100 %} +{% set iskEff = (statistics.iskDestroyed + statistics.iskLost) == 0 ? 100 : (statistics.iskDestroyed / (statistics.iskDestroyed + statistics.iskLost)) * 100 %} + + + + + + + + + + + + + + + + + + {% set greenred = shipEff >= 50 ? 'green' : 'red' %} + + + + + + + + + + {% set greenred = pointsEff >= 50 ? 'green' : 'red' %} + + + + + + + + + + {% set greenred = iskEff >= 50 ? 'green' : 'red' %} + + {% set recentOverallRank = ( statistics.recentOverallRank is defined ? statistics.recentOverallRank | number_format(0) : '-') %} + + + +
 DestroyedLost
Alltime
Ships{{ statistics.shipsDestroyed | number_format(0) }}{{ statistics.shipsLost | number_format(0) }} + {{ statistics.overallRank == 0 ? '-' : statistics.overallRank }} + {% if statistics.overallRank < statistics.prevRanks.overallRank and statistics.overallRank != 0 and statistics.prevRanks.overallRank != 0 %} + + {% elseif statistics.overallRank > statistics.prevRanks.overallRank and statistics.overallRank != 0 and statistics.prevRanks.overallRank != 0 %} + + {% elseif statistics.overallRank != 0 %} + + {% else %} + + {% endif %} +
Points{{ statistics.pointsDestroyed | number_format(0) }}{{ statistics.pointsLost | number_format(0) }}
Recent
ISK{{ formatIsk(statistics.iskDestroyed) }}{{ formatIsk(statistics.iskLost) }} + {{ recentOverallRank }} + {% if statistics.recentOverallRank < statistics.prevRanks.recentOverallRank and statistics.recentOverallRank != 0 and statistics.prevRanks.recentOverallRank != 0 %} + + {% elseif statistics.recentOverallRank > statistics.prevRanks.recentOverallRank and statistics.recentOverallRank != 0 and statistics.prevRanks.recentOverallRank != 0 %} + + {% elseif statistics.recentOverallRank != 0 %} + + {% else %} + + {% endif %} +
+{% endif %} + diff --git a/themes/components/summary.html b/themes/components/summary.html new file mode 100644 index 00000000..de15be51 --- /dev/null +++ b/themes/components/summary.html @@ -0,0 +1,33 @@ +{% set loopIndex = 0 %} +{% if summaryTable is empty %} +

Summary

+
No summary data available...
+{% elseif summaryTable | length == 1 %} + +{% else %} +

Summary

+
+ {% for divGroups in statistics.groups %} +
+ + + + + + + + + + {% for group in divGroups %} + + + + + + {% endfor %} + +
Ship ClassKilledLost
{{ shortString(group.groupName, 21) }}{{ group.shipsDestroyed|number_format(0) }}{{ group.shipsLost|number_format(0) }}
+
+ {% endfor %} +
+{% endif %} diff --git a/themes/components/tdfb.html b/themes/components/tdfb.html new file mode 100644 index 00000000..24e30aed --- /dev/null +++ b/themes/components/tdfb.html @@ -0,0 +1,48 @@ +{% if finalBlow or topDamage %} + + {% set imageSize = 64 %} + + + + + + + + + + + + + + + +
Final BlowTop Damage
+ {% set field = finalBlow %} + {% if field.characterID != 0 %} + {% include 'components/image_char.html'%} + {% else %} + {% include 'components/image_corp.html'%} + {%endif%} + + {% set field = topDamage %} + {% if field.characterID != 0 %} + {% include 'components/image_char.html'%} + {% else %} + {% include 'components/image_corp.html'%} + {%endif%} +
+ {% set field = finalBlow %} + {% if field.characterID != 0 %} + {{ field.characterName }} + {% else %} + {{ field.corporationName }} + {% endif %} + + {% set field = topDamage %} + {% if field.characterID != 0 %} + {{ field.characterName }} + {% else %} + {{ field.corporationName }} + {% endif %} +
+{% endif %} diff --git a/themes/components/text_alli.html b/themes/components/text_alli.html new file mode 100644 index 00000000..b019ae33 --- /dev/null +++ b/themes/components/text_alli.html @@ -0,0 +1,7 @@ +{% if showImage %} + {% set imageSize = 32 %} + {% include 'components/image_alli.html' %} +{% endif %} +{% if field.allianceID != 0 %} +{{ shortString(field.allianceName, 30) }} +{% endif %} diff --git a/themes/components/text_char.html b/themes/components/text_char.html new file mode 100644 index 00000000..ec2a29c2 --- /dev/null +++ b/themes/components/text_char.html @@ -0,0 +1,9 @@ +{% if showImage %} + {% set imageSize = 32 %} + {% include 'components/image_char.html' %} +{% endif %} +{% if field.characterID is not defined and field.ceoID is defined and field.ceoName is defined %} + {{ shortString(field.ceoName, 30) }} +{% else %} + {{ shortString(field.characterName, 30) }} +{% endif %} diff --git a/themes/components/text_corp.html b/themes/components/text_corp.html new file mode 100644 index 00000000..4787ab74 --- /dev/null +++ b/themes/components/text_corp.html @@ -0,0 +1,11 @@ +{% if showImage %} + {% set imageSize = 32 %} + {% include 'components/image_corp.html' %} +{% endif %} +{% if shortLength is not defined %}{% set shortLength = 30%}{% endif %} +{% if field.executorCorpID and field.executorCorpName %} + {{ shortString(field.executorCorpName, shortLength) }} +{% else %} + {{ shortString(field.corporationName, shortLength) }} +{% endif %} +{% set shortLength = 30%} diff --git a/themes/components/text_faction.html b/themes/components/text_faction.html new file mode 100644 index 00000000..792dc12b --- /dev/null +++ b/themes/components/text_faction.html @@ -0,0 +1,7 @@ +{% if showImage %} + {% set imageSize = 32 %} + {% include 'components/image_faction.html' %} +{% endif %} +{% if field.factionID != 0 %} +{{ field.factionName }} +{% endif %} diff --git a/themes/components/text_group.html b/themes/components/text_group.html new file mode 100644 index 00000000..f2224ce2 --- /dev/null +++ b/themes/components/text_group.html @@ -0,0 +1,2 @@ +{% if groupNameLength is not defined %}{% set groupNameLength = 30 %}{% endif %} +{{ shortString(field.groupName, groupNameLength) }} diff --git a/themes/components/text_item.html b/themes/components/text_item.html new file mode 100644 index 00000000..eb54f951 --- /dev/null +++ b/themes/components/text_item.html @@ -0,0 +1,12 @@ +{% if field.weaponTypeID != 0 %} + {% set typeID = field.weaponTypeID %} + {% set typeName = field.weaponTypeName %} +{% elseif field.typeID != 0 %} + {% set typeID = field.typeID %} + {% set typeName = field.typeName %} +{% endif %} +{% if showImage %} + {% set imageSize = 32 %} + {% include 'components/image_item.html' %} +{% endif %} +{{ shortString(typeName, 30) }} diff --git a/themes/components/text_region.html b/themes/components/text_region.html new file mode 100644 index 00000000..9aac44e1 --- /dev/null +++ b/themes/components/text_region.html @@ -0,0 +1,5 @@ +{% if showImage %} + {% set imageSize = 32 %} + {% include 'components/image_region.html' %} +{% endif %} +{{ shortString(field.regionName, 30) }} diff --git a/themes/components/text_ship.html b/themes/components/text_ship.html new file mode 100644 index 00000000..d0b53614 --- /dev/null +++ b/themes/components/text_ship.html @@ -0,0 +1,10 @@ +{% if shipNameLength is not defined %}{% set shipNameLength = 30 %}{% endif %} +{% if showImage %} + {% set imageSize = 32 %} + {% include 'components/image_ship.html' %} +{% endif %} +{% if shipImageLinkOverride > 0 %} + {{ shortString(field.shipName, shipNameLength) }} +{% else %} + {{ shortString(field.shipName, shipNameLength) }} +{% endif %} diff --git a/themes/components/text_shipclass.html b/themes/components/text_shipclass.html new file mode 100644 index 00000000..29d13b5b --- /dev/null +++ b/themes/components/text_shipclass.html @@ -0,0 +1,5 @@ +{% if showImage %} + {% set imageSize = 32 %} + {% include 'components/image_ship.html' %} +{% endif %} +{{ shortString(field.groupName, 30) }} diff --git a/themes/components/text_system.html b/themes/components/text_system.html new file mode 100644 index 00000000..49a13148 --- /dev/null +++ b/themes/components/text_system.html @@ -0,0 +1,9 @@ +{% if showImage %} + {% set imageSize = 32 %} + {% include 'components/image_system.html' %} +{% endif %} +{% if extra.wormhole %} + {% set wormholeclass = extra.wormhole.class %} +{% endif %} + +{{ shortString(field.solarSystemName, 30) }} {% if wormholeclass %}(C{{ wormholeclass}}){% endif %} diff --git a/themes/components/title.html b/themes/components/title.html new file mode 100644 index 00000000..cfa005c5 --- /dev/null +++ b/themes/components/title.html @@ -0,0 +1 @@ +{{ pageTitle }} | {{ KillboardName ? KillboardName : 'zKillboard' }} diff --git a/themes/components/top_killer_list.html b/themes/components/top_killer_list.html new file mode 100644 index 00000000..f08aa048 --- /dev/null +++ b/themes/components/top_killer_list.html @@ -0,0 +1,44 @@ +{% set first = true %} +{% if topSet.values | length %} +
+
{{ topSet.title }}
+ + {% for data in topSet.values %} + {% set field = data %} + {% if first %} + + {% set imageSize = 64 %} + {% set field = data %} + {% if topSet.type == 'character' %} + + {% elseif topSet.type == 'corporation' %} + + {% elseif topSet.type == 'alliance' %} + + {% elseif topSet.type == 'solarSystem' %} + + {% elseif topSet.type == 'shipType' %} + + {% endif %} + + {% set first = false %} + {% endif %} + + {% if topSet.type == 'character' %} + + {% elseif topSet.type == 'corporation' %} + + {% elseif topSet.type == 'alliance' %} + + {% elseif topSet.type == 'solarSystem' %} + + {% elseif topSet.type == 'shipType' %} + + {% endif %} + + + {% endfor %} +
{% include 'components/image_char.html' %}{% include 'components/image_corp.html' %}{% include 'components/image_alli.html' %}{% include 'components/image_system.html' %}{% include 'components/image_ship.html' %}
{% include 'components/text_char.html' %}{% include 'components/text_corp.html' %}{% include 'components/text_alli.html' %}{% include 'components/text_system.html' %}{% include 'components/text_ship.html' %}{{ data.kills|number_format(0) }}
+
+
+{% endif %} diff --git a/themes/components/top_list.html b/themes/components/top_list.html new file mode 100644 index 00000000..270fd2f8 --- /dev/null +++ b/themes/components/top_list.html @@ -0,0 +1,57 @@ +
+{% for list in topLists %} + {% set loopIndex = 0 %} + {% if (loop.index -1) is divisibleby(3) %} +
+ {% endif %} +
+ + {% if list.name is defined %} + + {% else %} + + {% endif %} + + + + + + + + + {% for field in list.data %} + {% set loopIndex = loopIndex + 1 %} + + + + + + {% endfor %} + {% for i in 0..10 %} + {% set loopIndex = loopIndex + 1 %} + {% if loopIndex <= 10 %} + + {% endif %} + {% endfor %} + +
{{ list.name }}Top {{ pluralize(list.type|capitalize) }}
Rank{{ list.type|capitalize }}{% if list.ranked is defined %}{{ list.ranked}}{%else%}Kills{% endif %}
{{loopIndex}}. + {% if list.type == "alliance" %}{% include 'components/text_alli.html' %} + {% elseif list.type == "corporation" %}{% include 'components/text_corp.html' %} + {% elseif list.type == "character" %}{% include 'components/text_char.html' %} + {% elseif list.type == "weapon" %}{% include 'components/text_item.html' %} + {% elseif list.type == "ship" %}{% include 'components/text_ship.html' %} + {% elseif list.type == "group" %}{% include 'components/text_shipclass.html' %} + {% elseif list.type == "faction" %}{% include 'components/text_faction.html' %} + {% elseif list.type == "system" %}{% include 'components/text_system.html' %} + {% elseif list.type == "region" %}{% include 'components/text_region.html' %} + {% else %} {{ list.type }} + {% endif %} + {{ formatIsk(field.kills, isInt) }}
  + {% if showImage %}
{% endif %} +  
 
+
+ {% if loop.index is divisibleby(3) %} +
+ {% endif %} +{% endfor %} +
diff --git a/themes/components/top_pilots.html b/themes/components/top_pilots.html new file mode 100644 index 00000000..5ca519b4 --- /dev/null +++ b/themes/components/top_pilots.html @@ -0,0 +1,11 @@ + + + +{% for pilot in topPilots %} + +{% endfor %} +
Top Pilots
PilotKills
+ {{ pilot.characterName }} + + {{ pilot.kills|number_format(0) }} +
diff --git a/themes/components/victim_info.html b/themes/components/victim_info.html new file mode 100644 index 00000000..98b3cfce --- /dev/null +++ b/themes/components/victim_info.html @@ -0,0 +1,87 @@ +{% set showImage = true %} +{% set field = killdata.victim %} +
+ + + + + + +
+ {% set imageSize = 64 %} + {% set imageResize = 64 %} + {% include 'components/image_char.html' %} + + {% set imageSize = 32 %} + {% include 'components/image_corp.html' %}
+ {% if field.allianceID != 0 %} + {% include 'components/image_alli.html' %} + {% elseif field.factionID != 0 %} + {% include 'components/image_faction.html' %} + {% endif %} +
+ {% set showImage = false %} + {% include 'components/text_char.html' %}
+ {% include 'components/text_corp.html' %}
+ {% if field.allianceID != 0 %} + {% include 'components/text_alli.html' %}
+ {% elseif field.factionID != 0 %} + {% include 'components/text_faction.html' %} + {% endif %} +
+ + {% if killdata.victim.factionName %} + + + + + {% endif %} + + + + + {% if killdata.victim.related.killID %} + {% set shipImageLinkOverride = killdata.victim.related.killID %} + {% set field = killdata.victim.related %} + + + + + {% endif %} + {% set field = killdata.info.system %} + + + + + + + + + + + + + + + + + + + + + + + + + {% if extra.fittedisk > 0 %} + + + + + {% endif %} + + + + +
Faction:{% include 'components/text_faction.html' %}
Ship:{% include 'components/text_ship.html' %} ( {% include 'components/text_group.html' %} )
Related:{% include 'components/text_ship.html' %}
System:{% include 'components/text_system.html' %} ({{ "%1.1f"|format(field.solarSystemSecurity) }}) / {% include 'components/text_region.html' %}
Time:{{ killdata.info.dttm }}
Points:{{ killdata.info.zkb.points | number_format(0) }}
Damage:{{ killdata.info.damage|number_format(0) }}
Dropped:{{ extra.droppedisk|number_format(2, '.', ',') }} ISK
Destroyed:{{ extra.lostisk | number_format(2, '.', ',') }} ISK
Fitted:{{ extra.fittedisk | number_format(2, '.', ',') }} ISK
Total:{{ killdata.info.zkb.totalValue|number_format(2, '.', ',') }} ISK
+
diff --git a/themes/components/war.html b/themes/components/war.html new file mode 100644 index 00000000..c127ae86 --- /dev/null +++ b/themes/components/war.html @@ -0,0 +1,4 @@ +
+

War: {{ war.dscr }} Start: {{ war.timeStarted }} End: {{ war.timeFinished }}

+{% include 'components/war_table.html' %} +
diff --git a/themes/components/war_table.html b/themes/components/war_table.html new file mode 100644 index 00000000..7b9f45cd --- /dev/null +++ b/themes/components/war_table.html @@ -0,0 +1,30 @@ +
+ + + + + + + + {% for war in wars %} + + + + {% set color = (war.aggressor.shipsKilled >= war.defender.shipsKilled) ? "green" : "red" %} + + {% set color = (war.aggressor.iskKilled >= war.defender.iskKilled) ? "green" : "red" %} + + + + + + {% set color = (war.aggressor.shipsKilled >= war.defender.shipsKilled) ? "red" : "green" %} + + {% set color = (war.aggressor.iskKilled >= war.defender.iskKilled) ? "red" : "green" %} + + + {% endfor %} +
  KillsISK
Aggressor{{ war.aggressorName }}{{ war.aggressor.shipsKilled|number_format(0) }}{{ war.aggressor.iskKilled|number_format(2) }}
Defender{{ war.defenderName }}{{ war.defender.shipsKilled|number_format(0) }}{{ war.defender.iskKilled|number_format(2) }}
+ +This war is {{ ( war.mutual ? "" : "not") }} mutual and this war is {{ ( war.openForAllies ? "" : "not") }} open for allies. +
diff --git a/themes/components/wars_table.html b/themes/components/wars_table.html new file mode 100644 index 00000000..305d1304 --- /dev/null +++ b/themes/components/wars_table.html @@ -0,0 +1,26 @@ + + + + + + + + + + + {% for war in wars %} + + + {% set color = (war.aggressor.shipsKilled >= war.defender.shipsKilled) ? "green" : "red" %} + + {% set color = (war.aggressor.iskKilled >= war.defender.iskKilled) ? "green" : "red" %} + + + {% set color = (war.aggressor.shipsKilled >= war.defender.shipsKilled) ? "red" : "green" %} + + {% set color = (war.aggressor.iskKilled >= war.defender.iskKilled) ? "red" : "green" %} + + + + {% endfor %} +
AggressorKillsISK KillsISKDefender
{{ shortString(war.aggressor.name, 30) }}{{ shortNum(war.aggressor.shipsKilled) }}{{ shortNum(war.aggressor.iskKilled) }}
{{ shortNum(war.defender.shipsKilled) }}{{ shortNum(war.defender.iskKilled) }}{{ shortString(war.defender.name, 30) }}
diff --git a/themes/css/bootstrap-tagmanager.css b/themes/css/bootstrap-tagmanager.css new file mode 100644 index 00000000..e2a396b3 --- /dev/null +++ b/themes/css/bootstrap-tagmanager.css @@ -0,0 +1,105 @@ + .myTag + { + background: none repeat scroll 0 0 #CDE69C; + border: 1px solid #A5D24A; + border-radius: 3px 3px 3px 3px; + color: #638421; + + display: block; + float: left; + + font-family: helvetica; + font-size: 13px; + margin-bottom: 5px; + margin-right: 5px; + padding-top: 6px; + padding-bottom: 5px; + padding: 6px 5px 5px 5px; + text-decoration: none; + + vertical-align: middle; + line-height: 18px; + height:18px; + -moz-transition: border 0.2s linear 0s, box-shadow 0.2s linear 0s; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset; + } + .myTagError + { + background-color: #F2DEDE; + } + .myTagRemover + { + color:silver; + } + .tagManager + { + border-radius: 3px 3px 3px 3px; + margin-top:0; + } + + .myFramedTag + { + background: none repeat scroll 0 0 #CDE69C; + border: 1px solid #A5D24A; + border-radius: 3px 3px 3px 3px; + color: #638421; + display: block; + float: left; + font-family: helvetica; + font-size: 11px; + margin-bottom: 5px; + margin-right: 5px; + padding-top: 6px; + padding-bottom: 5px; + padding: 5px 4px 4px 4px; + text-decoration: none; + white-space: nowrap; + + vertical-align: middle; + line-height: 18px; + height:18px; + -moz-transition: border 0.2s linear 0s, box-shadow 0.2s linear 0s; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset; + } + + .myMinTag + { + background: none repeat scroll 0 0 #CDE69C; + border: 1px solid #A5D24A; + border-radius: 3px 3px 3px 3px; + color: #638421; + display: block; + float: left; + font-family: helvetica; + font-size: 11px; + margin-bottom: 5px; + margin-right: 5px; + padding-top: 6px; + padding-bottom: 5px; + padding: 2px 4px 2px 4px; + text-decoration: none; + + vertical-align: middle; + line-height: 18px; + height:18px; + -moz-transition: border 0.2s linear 0s, box-shadow 0.2s linear 0s; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset; + } + + .myMinNonTag + { + font-family: helvetica; + font-size: 11px; + margin-bottom: 5px; + margin-right: 5px; + padding-top: 6px; + padding-bottom: 5px; + padding: 2px 4px 2px 4px; + text-decoration: none; + + vertical-align: middle; + line-height: 18px; + height:18px; + -moz-transition: border 0.2s linear 0s, box-shadow 0.2s linear 0s; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset; + } \ No newline at end of file diff --git a/themes/css/bootstrap-wysihtml5.css b/themes/css/bootstrap-wysihtml5.css new file mode 100644 index 00000000..44ed7774 --- /dev/null +++ b/themes/css/bootstrap-wysihtml5.css @@ -0,0 +1,102 @@ +ul.wysihtml5-toolbar { + margin: 0; + padding: 0; + display: block; +} + +ul.wysihtml5-toolbar::after { + clear: both; + display: table; + content: ""; +} + +ul.wysihtml5-toolbar > li { + float: left; + display: list-item; + list-style: none; + margin: 0 5px 10px 0; +} + +ul.wysihtml5-toolbar a[data-wysihtml5-command=bold] { + font-weight: bold; +} + +ul.wysihtml5-toolbar a[data-wysihtml5-command=italic] { + font-style: italic; +} + +ul.wysihtml5-toolbar a[data-wysihtml5-command=underline] { + text-decoration: underline; +} + +ul.wysihtml5-toolbar a.btn.wysihtml5-command-active { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05); + background-color: #E6E6E6; + background-color: #D9D9D9; + outline: 0; +} + +ul.wysihtml5-commands-disabled .dropdown-menu { + display: none !important; +} + +ul.wysihtml5-toolbar div.wysihtml5-colors { + display:block; + width: 50px; + height: 20px; + margin-top: 2px; + margin-left: 5px; + position: absolute; + pointer-events: none; +} + +ul.wysihtml5-toolbar a.wysihtml5-colors-title { + padding-left: 70px; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="black"] { + background: black !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="silver"] { + background: silver !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="gray"] { + background: gray !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="maroon"] { + background: maroon !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="red"] { + background: red !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="purple"] { + background: purple !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="green"] { + background: green !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="olive"] { + background: olive !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="navy"] { + background: navy !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="blue"] { + background: blue !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="orange"] { + background: orange !important; +} diff --git a/themes/css/datepicker.css b/themes/css/datepicker.css new file mode 100644 index 00000000..b7065b7d --- /dev/null +++ b/themes/css/datepicker.css @@ -0,0 +1,182 @@ +/*! + * Datepicker for Bootstrap + * + * Copyright 2012 Stefan Petre + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + */ +.datepicker { + top: 0; + left: 0; + padding: 4px; + margin-top: 1px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + /*.dow { + border-top: 1px solid #ddd !important; + }*/ + +} +.datepicker:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-bottom-color: rgba(0, 0, 0, 0.2); + position: absolute; + top: -7px; + left: 6px; +} +.datepicker:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + position: absolute; + top: -6px; + left: 7px; +} +.datepicker > div { + display: none; +} +.datepicker table { + width: 100%; + margin: 0; +} +.datepicker td, +.datepicker th { + text-align: center; + width: 20px; + height: 20px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.datepicker td.day:hover { + background: #eeeeee; + cursor: pointer; +} +.datepicker td.day.disabled { + color: #eeeeee; +} +.datepicker td.old, +.datepicker td.new { + color: #999999; +} +.datepicker td.active, +.datepicker td.active:hover { + color: #ffffff; + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #0044cc; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker td.active:hover, +.datepicker td.active:hover:hover, +.datepicker td.active:focus, +.datepicker td.active:hover:focus, +.datepicker td.active:active, +.datepicker td.active:hover:active, +.datepicker td.active.active, +.datepicker td.active:hover.active, +.datepicker td.active.disabled, +.datepicker td.active:hover.disabled, +.datepicker td.active[disabled], +.datepicker td.active:hover[disabled] { + color: #ffffff; + background-color: #0044cc; + *background-color: #003bb3; +} +.datepicker td.active:active, +.datepicker td.active:hover:active, +.datepicker td.active.active, +.datepicker td.active:hover.active { + background-color: #003399 \9; +} +.datepicker td span { + display: block; + width: 47px; + height: 54px; + line-height: 54px; + float: left; + margin: 2px; + cursor: pointer; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.datepicker td span:hover { + background: #eeeeee; +} +.datepicker td span.active { + color: #ffffff; + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #0044cc; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker td span.active:hover, +.datepicker td span.active:focus, +.datepicker td span.active:active, +.datepicker td span.active.active, +.datepicker td span.active.disabled, +.datepicker td span.active[disabled] { + color: #ffffff; + background-color: #0044cc; + *background-color: #003bb3; +} +.datepicker td span.active:active, +.datepicker td span.active.active { + background-color: #003399 \9; +} +.datepicker td span.old { + color: #999999; +} +.datepicker th.switch { + width: 145px; +} +.datepicker th.next, +.datepicker th.prev { + font-size: 21px; +} +.datepicker thead tr:first-child th { + cursor: pointer; +} +.datepicker thead tr:first-child th:hover { + background: #eeeeee; +} +.input-append.date .add-on i, +.input-prepend.date .add-on i { + display: block; + cursor: pointer; + width: 16px; + height: 16px; +} \ No newline at end of file diff --git a/themes/css/font-awesome.css b/themes/css/font-awesome.css new file mode 100644 index 00000000..eefbe259 --- /dev/null +++ b/themes/css/font-awesome.css @@ -0,0 +1,1338 @@ +/*! + * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('/themes/css/fontawesome/fontawesome-webfont.eot?v=4.0.3'); + src: url('/themes/css/fontawesome/fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'), url('/themes/css/fontawesome/fontawesome-webfont.woff?v=4.0.3') format('woff'), url('/themes/css/fontawesome/fontawesome-webfont.ttf?v=4.0.3') format('truetype'), url('/themes/css/fontawesome/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font-family: FontAwesome; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.3333333333333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.2857142857142858em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.142857142857143em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.142857142857143em; + width: 2.142857142857143em; + top: 0.14285714285714285em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.8571428571428572em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: spin 2s infinite linear; + -moz-animation: spin 2s infinite linear; + -o-animation: spin 2s infinite linear; + animation: spin 2s infinite linear; +} +@-moz-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(359deg); + } +} +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + } +} +@-o-keyframes spin { + 0% { + -o-transform: rotate(0deg); + } + 100% { + -o-transform: rotate(359deg); + } +} +@-ms-keyframes spin { + 0% { + -ms-transform: rotate(0deg); + } + 100% { + -ms-transform: rotate(359deg); + } +} +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } +} +.fa-rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -o-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -ms-transform: rotate(270deg); + -o-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); + -webkit-transform: scale(-1, 1); + -moz-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + -o-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); + -webkit-transform: scale(1, -1); + -moz-transform: scale(1, -1); + -ms-transform: scale(1, -1); + -o-transform: scale(1, -1); + transform: scale(1, -1); +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-asc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-desc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-reply-all:before { + content: "\f122"; +} +.fa-mail-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} diff --git a/themes/css/main.css b/themes/css/main.css new file mode 100644 index 00000000..15d8399d --- /dev/null +++ b/themes/css/main.css @@ -0,0 +1,180 @@ +body, html { + height: 100%; +} + +.centered { vertical-align:middle; text-align:center; } +.centered img { display:block; margin:0 auto; } + +.eveimage { background-color: #222; max-width:100%; height:auto; overflow: hidden; font-size: 0.1px;} + +#back-top { + position: fixed; + bottom: 50px; + margin-left: -65px; +} + +#back-top a { + width: 55px; + display: block; + text-align: center; + font: 11px/100% Arial, Helvetica, sans-serif; + text-transform: uppercase; + text-decoration: none; + color: #444; + + /* transition */ + -webkit-transition: 1s; + -moz-transition: 1s; + transition: 1s; +} +#back-top a:hover { + color: #999; +} + +/* arrow icon (span tag) */ +#back-top span { + width: 55px; + height: 60px; + display: block; + margin-bottom: 7px; + background: url(/themes/img/up-arrow.png) no-repeat center center; + + /* transition */ + -webkit-transition: 1s; + -moz-transition: 1s; + transition: 1s; +} + +.accordion-group { + margin-bottom: 0px; + border: 0px; + -webkit-border-radius: 0px; + -moz-border-radius: 0px; + border-radius: 0px; +} +.accordion-inner{ + padding:0px 0px; + border-top:0px solid #e5e5e5; +} + +#left-banner { +position: fixed; +top: 70px; +left: 5px; +z-index: 0; +cursor: pointer; +width: 160px; +} + +#right-banner { +position: fixed; +top: 70px; +right: 5px; +z-index: 9500; +cursor: pointer; +width: 160px; +} + +.facebook{ + background: url("/themes/img/social/fb_1.png") no-repeat center center; +} +.twitter { + background: url("/themes/img/social/twitter_1.png") no-repeat center center; +} +.googleplus { + background: url("/themes/img/social/google_plus.png") no-repeat center center; +} +.reddit { + background: url("/themes/img/social/reddit.png") no-repeat center center; +} + +.rank-table tr td, .rank-table tr th { + text-align: right; +} + +.collapse { +overflow: hidden !important; +} + +.footer { + margin-top: 20px; + padding-top: 20px; +} + +/* also hide the stuff from ladscape ipad */ +@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) { + .hidden-tablet { + display: none; + } +} + +ul.autocomplete { width: 375px; } +ul.autocomplete img { position: absolute; top: 4px; left: 4px; } +ul.autocomplete a { position: relative; padding: 10px 2px 0px 40px; height: 40px; } +ul.autocomplete span { position: absolute; top: 10px; right: 5px; } + + +#addentity label { margin-right: 15px; } +#addentity h3 { display: inline-block; } + +[rel=tooltip] + div.tooltip { + /* prevent hover loop when a tooltip is shown above its triggering element */ + pointer-events: none; +} + +/* mobile menu stuff */ +.mobileNav { + position: absolute; + left: -200px; + top: 0px; + width: 200px; + z-index: 99; + height: 100%; +} + +.content { + position: relative; + left: 0; + top: 0; + right: 0px; +} + +.content.opened { + left: 200px; +} + +.mobileNav.opened { + left: 0px; +} + +.content, .mobileNav { + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +.listPilots { + padding: 10px 0px 10px 0px; + margin: 10px 0px 10px 0px; + background: #111; + border: 1px solid #000; +} + +.topimage img { + width: 100%; +} + +@media screen and (min-width: 1024px) { + .topimage { + width: 100%; + } +} + +@media only screen and (min-device-width: 320px) and (max-device-width: 480px) { + .dropdown-menu { + max-height: 200px; + overflow-y: auto; + overflow-x: hidden; + } +} diff --git a/themes/css/style-edits/amelia-main.css b/themes/css/style-edits/amelia-main.css new file mode 100644 index 00000000..74ef8ef4 --- /dev/null +++ b/themes/css/style-edits/amelia-main.css @@ -0,0 +1,12 @@ +.item_dropped_row { + background-color: black; +} +.item_dropped { + color: white; +} +.item_dropped_qty { + color: white; +} +.item_destroyed { + color: red; +} diff --git a/themes/css/style-edits/cerulean-main.css b/themes/css/style-edits/cerulean-main.css new file mode 100644 index 00000000..f2114ea2 --- /dev/null +++ b/themes/css/style-edits/cerulean-main.css @@ -0,0 +1,12 @@ +.item_dropped_row { + background-color: #FBEFEF; +} +.item_dropped { + color: black; +} +.item_dropped_qty { + color: white; +} +.item_destroyed { + color: red; +} \ No newline at end of file diff --git a/themes/css/style-edits/cyborg-main.css b/themes/css/style-edits/cyborg-main.css new file mode 100644 index 00000000..3559ba1a --- /dev/null +++ b/themes/css/style-edits/cyborg-main.css @@ -0,0 +1,98 @@ +@media (min-width: 768px) { + body { + background-color: #060606; + background-image: url("/themes/img/bg_cyborg_blueish.jpg"); + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; + background-attachment: fixed; + } +} + +.nobackground { + background: #060606; + background-color: rgba(6,6,6,0.95); + box-shadow: 0 0 5px 5px rgba(6,6,6,0.95); + opacity: 0.95; +} + +.table tbody tr.error td +{ + background-color: #2F0202; +} + +.table tbody tr.winwin td +{ + background-color: #001600; +} + +select, textarea, input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"], .uneditable-input +{ +color: black; + } + +.item_dropped_row { + background-color: #001600; +} +.item_dropped { + color: white; +} +.item_dropped_qty { + color: white; +} +.item_destroyed, .red { + color: red; +} +.green { + color: green; +} + +.no-stripe { + background-color: black; +} + +.table-no-hover tbody tr:hover td, .table tbody tr:hover th { + background-color: transparent; +} + +.alert-danger { + background-color: #800000; +} + +table, .table { + color: #888; +} + +table a, .table a { + color: #2a9fd6; + text-decoration: none; +} + +tr.heading { + background-color: #000; +} + +.nav .caret, .nav a:hover .caret { + border-top-color: #888; + border-bottom-color: #888; +} + +input.datepicker { + cursor: pointer !important; + outline: none; + color: #FFF; + width: 70px; + background-color: #222; + border: 1px solid #282828; + margin-right: 10px; + margin-top: 0px !important; + text-align: center; +} + +pre { + background-color: #000; + font-weight: bold; + color: #6E6E6E; + border-color: #333; +} diff --git a/themes/css/style-edits/default-main.css b/themes/css/style-edits/default-main.css new file mode 100644 index 00000000..4637e75f --- /dev/null +++ b/themes/css/style-edits/default-main.css @@ -0,0 +1,36 @@ +body { + background-color: #F0FFFF; + background-image: url("/themes/img/bg_white.jpg"); + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; + background-attachment: fixed; + filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='.myBackground.jpg', sizingMethod='scale'); + -ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='myBackground.jpg', sizingMethod='scale')"; +} + +.nobackground { + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + border-radius: 10px; + background: #F8FEFE; + border: #solid 10px #F8FEFE; + background-color: rgba(248,254,254,0.7); + border-color: solid 5px rgba(0,0,0,0.1); + box-shadow: 0 0 15px 15px rgba(248,254,254,0.7); + opacity: 0.95; +} + +.item_dropped_row { + background-color: #FBEFEF; +} +.item_dropped { + color: black; +} +.item_dropped_qty { + color: white; +} +.item_destroyed { + color: red; +} diff --git a/themes/css/style-edits/journal-main.css b/themes/css/style-edits/journal-main.css new file mode 100644 index 00000000..f2114ea2 --- /dev/null +++ b/themes/css/style-edits/journal-main.css @@ -0,0 +1,12 @@ +.item_dropped_row { + background-color: #FBEFEF; +} +.item_dropped { + color: black; +} +.item_dropped_qty { + color: white; +} +.item_destroyed { + color: red; +} \ No newline at end of file diff --git a/themes/css/style-edits/readable-main.css b/themes/css/style-edits/readable-main.css new file mode 100644 index 00000000..f2114ea2 --- /dev/null +++ b/themes/css/style-edits/readable-main.css @@ -0,0 +1,12 @@ +.item_dropped_row { + background-color: #FBEFEF; +} +.item_dropped { + color: black; +} +.item_dropped_qty { + color: white; +} +.item_destroyed { + color: red; +} \ No newline at end of file diff --git a/themes/css/style-edits/simplex-main.css b/themes/css/style-edits/simplex-main.css new file mode 100644 index 00000000..f2114ea2 --- /dev/null +++ b/themes/css/style-edits/simplex-main.css @@ -0,0 +1,12 @@ +.item_dropped_row { + background-color: #FBEFEF; +} +.item_dropped { + color: black; +} +.item_dropped_qty { + color: white; +} +.item_destroyed { + color: red; +} \ No newline at end of file diff --git a/themes/css/style-edits/slate-main.css b/themes/css/style-edits/slate-main.css new file mode 100644 index 00000000..5519adee --- /dev/null +++ b/themes/css/style-edits/slate-main.css @@ -0,0 +1,12 @@ +.item_dropped_row { + background-color: #353A41; +} +.item_dropped { + color: white; +} +.item_dropped_qty { + color: white; +} +.item_destroyed { + color: red; +} diff --git a/themes/css/style-edits/spacelab-main.css b/themes/css/style-edits/spacelab-main.css new file mode 100644 index 00000000..d156538e --- /dev/null +++ b/themes/css/style-edits/spacelab-main.css @@ -0,0 +1,52 @@ +body { + background-color: #F0FFFF; + background-image: url("/themes/img/bg_white.jpg"); + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; + background-attachment: fixed; + filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='.myBackground.jpg', sizingMethod='scale'); + -ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='myBackground.jpg', sizingMethod='scale')"; +} + +.nobackground { + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + border-radius: 10px; + background: #F8FEFE; + border: #solid 10px #F8FEFE; + background-color: rgba(248,254,254,0.7); + border-color: solid 5px rgba(0,0,0,0.1); + box-shadow: 0 0 15px 15px rgba(248,254,254,0.7); + opacity: 0.95; +} + +.table tbody tr.error td +{ + background-color: #CECECE; +} + +.item_dropped_row { + background-color: #FBEFEF; +} +.item_dropped { +color: black; +} +.item_dropped_qty { +color: white; +} +.item_destroyed { +color: red; +} + +.item_destroyed, .red { +color: red; +} +.green { +color: green; +} + +.table-no-hover tbody tr:hover td, .table tbody tr:hover th { + background-color: transparent; +} diff --git a/themes/css/style-edits/united-main.css b/themes/css/style-edits/united-main.css new file mode 100644 index 00000000..f2114ea2 --- /dev/null +++ b/themes/css/style-edits/united-main.css @@ -0,0 +1,12 @@ +.item_dropped_row { + background-color: #FBEFEF; +} +.item_dropped { + color: black; +} +.item_dropped_qty { + color: white; +} +.item_destroyed { + color: red; +} \ No newline at end of file diff --git a/themes/css/wysiwyg-color.css b/themes/css/wysiwyg-color.css new file mode 100644 index 00000000..86e78958 --- /dev/null +++ b/themes/css/wysiwyg-color.css @@ -0,0 +1,67 @@ +.wysiwyg-color-black { + color: black; +} + +.wysiwyg-color-silver { + color: silver; +} + +.wysiwyg-color-gray { + color: gray; +} + +.wysiwyg-color-white { + color: white; +} + +.wysiwyg-color-maroon { + color: maroon; +} + +.wysiwyg-color-red { + color: red; +} + +.wysiwyg-color-purple { + color: purple; +} + +.wysiwyg-color-fuchsia { + color: fuchsia; +} + +.wysiwyg-color-green { + color: green; +} + +.wysiwyg-color-lime { + color: lime; +} + +.wysiwyg-color-olive { + color: olive; +} + +.wysiwyg-color-yellow { + color: yellow; +} + +.wysiwyg-color-navy { + color: navy; +} + +.wysiwyg-color-blue { + color: blue; +} + +.wysiwyg-color-teal { + color: teal; +} + +.wysiwyg-color-aqua { + color: aqua; +} + +.wysiwyg-color-orange { + color: orange; +} \ No newline at end of file diff --git a/themes/detail.html b/themes/detail.html new file mode 100644 index 00000000..0e15489d --- /dev/null +++ b/themes/detail.html @@ -0,0 +1,333 @@ +{% extends 'base.html' %} + +{% if killdata.victim.characterID != 0 %} + {% set victim = killdata.victim.characterName %} +{% else %} + {% set victim = killdata.victim.corporationName %} +{% endif %} +{% set pageTitle = killdata.victim.shipName ~ ' | ' ~ victim ~ ' | Killmail' %} +{% block title %}{% include 'components/title.html' %}{% endblock %} + +{% set description = victim ~ " lost their " ~ killdata.victim.shipName ~ " worth " ~ killdata.info.total_price|number_format(2, '.', ',') ~ " ISK." %} +{% set canonical = fullsiteurl ~ "/kill/" ~ killdata.info.killID ~ "/" %} + +{% block header %} + +{% if message %} +
+ + {{ message }} +
+{% endif %} +{% set showImage = true %} +{% endblock %} + +{% block content %} + + +{% if pageview == "overview" %} +
+ + + + + + +
+
{% include 'components/fitting_wheel.html' %}
+
{% include 'components/victim_info.html' %}
+
+
+
{% include 'components/item_list.html' %}
+
+
+ +
+
+ {% if extra.warInfo.dscr %} + + {% endif %} +
{% include 'components/tdfb.html' %}
+
+
{% include 'components/attackers.html' %}
+
+ {% if extra.invAll | length %} +
{% set field = extra.invAll %}{% include 'components/involved_summary.html' %}
+ {% endif %} + +
+{% if disqusLoad %} + {% set disqusID = extra.commentID %} + + {% include 'components/disqus.html' %} +{% endif %} +
+ + +{% elseif pageview == "involved" %} + + + + + + + + + + {% set imageSize = 32 %} + {% set resizeImage = 40 %} + {% for attacker in killdata.involved %} + + + + + + + + {% endfor %} + +
AttackerEquipmentDamage
+ {% set field = attacker %} + {% include 'components/image_char.html' %} + {% include 'components/image_corp.html' %} + {% include 'components/image_alli.html' %} + {% include 'components/image_faction.html' %} + + {{ attacker.characterName }}
+ {{ attacker.corporationName }} + {% if attacker.allianceID != 0 %} / {{ attacker.allianceName }}{% endif %} + {% if attacker.factionID != 0 %} / {{ attacker.factionName }}{% endif %} +
+ {% include 'components/image_ship.html' %} + {% include 'components/image_item.html' %} + + {{ attacker.shipName }}
+ {{ attacker.weaponTypeName }} +
{{ attacker.damage }}
+{% endif %} +{% endblock %} + +{% block modal %} + + + +{% if eveigb != true %} + +{% endif %} + + + + + +{% endblock %} + +{% block style %} + +{% endblock %} +{% block script %} + + + + +{% endblock %} +{% block opengraph %} + + + + + +{% if finalBlow.characterName == NULL %} + + +{% else %} + + +{% endif %} + +{% endblock %} diff --git a/themes/dlogin.html b/themes/dlogin.html new file mode 100644 index 00000000..a7c4caa0 --- /dev/null +++ b/themes/dlogin.html @@ -0,0 +1,60 @@ + + + + + + + + + + + + + {{ siteurl }} / Disqus Login + {% if sessiontheme is not defined %}{% set sessiontheme = 'cyborg' %}{% endif %} + {% if sessiontheme == "default" %} + + {% else %} + + {% endif %} + + +
+ + {% if close %} + + {% endif %} + {% if error %} +
+ Error... + {{ error }} +
+ + Can't login? Passwords were reset, click the Forget Password button!
+ Forgot password + {% else %} +
+
+
+ +
+
+ +
+
+ + +
+
+ +
+
+
+ {% endif %} +
+ + diff --git a/themes/error.html b/themes/error.html new file mode 100644 index 00000000..02468a62 --- /dev/null +++ b/themes/error.html @@ -0,0 +1,8 @@ +{% extends 'base.html' %} + +{% set pageTitle = "Error" %} +{% block title %}{% include 'components/title.html' %}{% endblock %} + +{% block content %} +
{{ message }}
{{ codeHash }}
{{ html }}
+{% endblock %} diff --git a/themes/favicon.ico b/themes/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..14956a8b5f41f04ff0f0cc78157cc0e481d3110d GIT binary patch literal 1150 zcmdr~y9$Fq5L{m%C}@?|bmlt*f5SSR-=Y6ut6-yro!|pS{G-X9Apt{>prmn+-GjNE z*&R3{iH~g)*DKvsq6-n-I2mH(iStFoZ(jn8oicS@hhZ4Iym_97s;W?yC4Aq9EXzOX zD2jq02v8IS#&N_v&&aY2VHiTwv`r1uG!e%!(lkZWG;jViO-PaiQ53mc%z|HAV;hwHj44OLZ9*ENP=Sh!n!(Ia{#Nm^+f`9q)c`@Topwk!Vv6MOw*{*m2J Jz-0^j;{irgbE^OV literal 0 HcmV?d00001 diff --git a/themes/footer.html b/themes/footer.html new file mode 100644 index 00000000..84c4275c --- /dev/null +++ b/themes/footer.html @@ -0,0 +1,13 @@ + diff --git a/themes/forgotpassword.html b/themes/forgotpassword.html new file mode 100644 index 00000000..b927bcf1 --- /dev/null +++ b/themes/forgotpassword.html @@ -0,0 +1,24 @@ +{% extends 'base.html' %} + +{% set pageTitle = "Forgot Password" %} +{% block title %}{% include 'components/title.html' %}{% endblock %} + +{% block content %} +{% if message %} +
+

{{ message }}

+
+{% endif %} +

Forgot Password

+
+

Enter your email address, to reset your password.

+
+
+ +
+
+ +
+
+
+{% endblock %} diff --git a/themes/img/3D.png b/themes/img/3D.png new file mode 100644 index 0000000000000000000000000000000000000000..27cdd523f463eb03b27b8d67b7af747e9a17eaf4 GIT binary patch literal 47742 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

sh4D;-k5!oB4 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 zΠ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%0D>OmB)2LQ6T)K*qv>0X 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%0Dsn{$9hzNc^_Vt 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

i2L(=AbC=fdvoZdTZ8d)J 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 ScXxA4F7N9KSGoWD`TqfGo*Z)k literal 0 HcmV?d00001 diff --git a/themes/img/bg_cyborg_blueish.png b/themes/img/bg_cyborg_blueish.png new file mode 100644 index 0000000000000000000000000000000000000000..440b3a959ac84f8585e4fcfbec0ac0de7d5a2535 GIT binary patch literal 2148145 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 z�gyp�L=V_SZp6soOmueQH0j!7S4su#zuQx4Q;^)sr>g5^&0VVMM=Tx9wPVi? zHJ-qly@>h#-COTdMZS?i(t5wXFkcuUlVOP*9u-P$$S6pz+H~Xq_jBWjX%jP-b^G$N zZ|k}i{LePjKdm>D@VrR5^{{Tid{(|Z(pzj{xXVrpF{F4?X$0)NzsNd|%(%e!Qi+l3uznFTb*O7rOs2 zoRa8h0Bb=y5KJV?>9!GUVz(tEyNeXunRH0LcuMw|^p5>9CQcMN+tJgo_|~Kq$V#K1 zk;eao1AX#!BI+n#dzR3KIS-mIWilJt_Etq4$f(nQf>S!LwQTPyh%H`hCr#i^-HR%1 z2j?vbS7mUVWf%LrQuGke@=A!ts#w_%ULF9ZK0Q|M&kL9ws{i5tyPULGs2~`|D|bsD z0dvnK7>O|;x1;>gmjNTr?>#Q^wQrYy-4&a7`m}5I@WM29z6?bh$kfx5OnCJ`{m(qI?lWi-0XUqZC4aq=qhl(m9nA_>upN- zL7=|ea6MlabEg243%xbZeepZ25mk$kml6i-=3hwz2PzfZ*M!1sXoiTl zati0UDcN%TkOlDbI^oXBz95rQh-uGJP6^IJ#+dK|+|`CYIg*;MioyaBki35O%MfZ1 z^<+eel?-8nzL<*h8@>gGLv?s#OMmMG)1G=WFCYm%pyP3O!|n96tmy#0qYJLWm(VI; zA7#=aqy*U)V`?|to-r@C$1l`QjzzoQnO`R9H0CTckkY=p=}zDXNKMm}w(|Gy+7-l$ zQwQqpZ#p!u*=%P2x?1+v+PI5~=EWt7O)rdAEdx;3HLh=1hdM1ioNC{eoc3A@W~n-V#b_T}osyzPcTiV*A1 zgiK*w=X*6Q9uxceGsjGCGTdhxeR-ISeltH&oYH?+UHhC6&N^}qM!J9Vy|b$Wud{n? zFrEHEk4*Xc8W-J$Hjho=CgyuSOI}yZXcp~<&QF4;%$-T&7yBu5;Ya&g4PPwlocp{( zw~e*mkPuYbshZ4htZZPWus1(2^$T%*wKp4v?(caVUp027L_&6+wInWLTgqPR`w?D8=<7u?!Yt96-Cd_ z6NWdqZnj`M;U8~{W2fTMBT0Do`?AJDeurR}I@X)XPf7%wk~(F|^Xoq;#e)y_8!O#@ zbsSxWK8#IYpH(*(YP}y2KRViQxhdjxc>~hg=TDXPM#c6{XmHwZkXg6nSYUG8XZL45 za620FEr7a>zDLo!*Lp@!+&@aQH#Ek0!m4#9@G#qawV&S%wZd3}!k7n9do=nhT!b5eOIea7)81S)ygrhwJP*+_F564YMyef_yBPF*D5R<(um~B ztXp&@$*zdf6bZrnrSN!s&Y(Rg0iha7r%C3v5+e%}?j-JP?v=zxKsS6q?47>tMY&N=l26dvRCGpIK9NZC1UTOyI!g0=^d!gdT*B;4 z23UR81&>JT*j~_Hz@(8}!&nVm&Sd2KGr*b6N{mWEi!kyQ@KK; zOCnK`J6WH1E6>W#hAD=!$;|HUEtK0^j9v=l55g*=@V)_g@)E z52@u<{rx>$ZYQ*>9z6ix^>L{7{ds=ofzZvm$=aaRq0SSy7V(rQ{c5}SE?S)jj=7Sw zoJY-WW(<*DYz#rfp}tB6LhHa4+lKLW8cb8{vNBj3l>-8(*?ZTo%7gX!!uaTOf=sCs z2TR*9;vs<7G}owr98gSfuo}WgI`e(jvC{NqqJ`^aj<3SaR+MS_>=H|oDtQLFg0$&) z)60kmK1nhzg!=50icpI@2fpd-mI96kTWzqDfpcQN0FY|eqepw4qga=yl z>T(GKjrD8y)KC(-IVyCi*xEXUtuaM@SJG3S){f7iJ2$D&i_r^RX^RE-OL`CatXNWy zqf_~Zn@>c>uR27l={k9#^mHyzL9>sFqt!*5{kx+Dy{e2R^t9K!JdlX}VD5~b2W*mk+g zDP6$A#!5-W0Fl-tj}4xlbO$oJdKQg@Y8QCccJ>QG`<_rd0*!AUbMnS6$;+mVh0jIq zy~g>fhJf*6t~t>$;7$^IP@B{cvEUo(gIw*m+9xVUq1~b{c|DLGOXNlHke(#El+cdZ z^4MbQ`$h!oCzuqdJ+_9;KXwBrY-dh~l(GxPDvLWh69zl2C2J59dU-B6oK*=4+c@msm8} zX)55QN4P&6*17W^?1vPA>iA})BDdVXMmvX&-Ke$nY->~x7m@D z6`kzKW4TnR60Iz5Lae9kp>(v*OkhGTLO{S*=To z|KQ2`=Ch~P+rK!*HcqsR4wCs)U{*oqrD91(r{MMUMB|0M zs8d*O4oY+L#dL}n>tRJruy!GtX_BV+g0O_b&REz#CCw=t=Mw93H%>V&44+S?+2!{% zhA#6kh20aAkwAJr9tmaIYsF-}dJgCko{LWfgj11OT`2{>O@5H9s&aS#vF|BqD-NY( zl@Q#a7R|0ftCE|PVwB@Rn`Jc01dH3H@1ANrI5}ST=U_? z$|rngo0i?>2O~vvobl$G1FWv4d&{0!x8Vn`%ro5iG@l*Vmk-t7*ps;Ig9AG|C9IO& zPeLD-9&)^EE)I{5%8Ma+=w35g`C;<;VbUv-NmC0~g%R#{&%W^uOI_gwB{41m}9?*2t|XsArT|I+H2pNbzlh!v&( zi7UGHeEj`2?rP#T8;4x4ZSYQ=_?Oo;{Zl1p-5dQ0T(M5mtV$yF=vtCln!Jw!!YRF0R94sV}T>fES z{^5m3lO*i4WpbWuhO4e@Ic(Wo101Bmbx*k;ZkNqI46_baeWCEDs?0>TFO+4?X(z5z z!A`ZG)ua*2Se5IzpH;syoCII}PzPm?G2EiFV#*g&5t%O>JpEuxtQgnY{%qrPFG|p@ zubZeyF$KTqB{ccAb)qfQm|3d|dS|3}duY@3HPTALyg82eO`)DH(eaD84y;UAqMpcA zyeS9Kee@}NrlKLmbYe6Z9Dv1|n<06I2%z^dSkAHp7bg+_+>OP975L<1lFPZlPlO!# zp@xX~2Aii*YwK6FG5V=Ibm}ODGv`RoH~^G%GD&Gppo}m_^()a=t*w!It5##&F*n#mY2d=RC0P(mTHPe?o~}Y_Yp|kWMB2>Qf>|g#F_`g9JE!rnz=hGqxsTMsO2$>y8RE3f9Fh&A zRJUyf?(%E(kH0R|2xPcq@{Ty?g{K{Y^r&$5!@Da?kF^!met6;8bH-Ic=zOWkPCc0< zsnLFsMxi{0^lZ=>t(B{gU0gWr_r>_IyG)Z9p zL~)_0BKwpD-RJaYF1G)8A#l^WdNF7@nyK>8KQ!-AT4HvPCvcG`e0F^`qVBixGc@^r z^$7D}>-;WM>$YEen2^Yo)QSVvbLyav$NPE_Z)HY-Hk{cFF++AuUcEi~Yt$*qS%01R z_=LBF2uj{C{{Lg?ssiHZnkB)VKyZiP5Zr^iyE}p4?(PJ4cXt+d4esvl?hcFH&G+Aj zeV^?!r@OkUx~DGjH4}f@DNvO%p#-%IBW%*%Gzc-v@3Qk-0O?Qs_l7e~tjE66C^c8T zTft^$>^>b_xrpnSzKtEcaa+$HsibdhUMQW3y@Go#gjq8%t_`Y4t-U0_y*Z`XFWN9y zV7vltSaE>K287eD7P?KHH;L} zB*{geLaO$q<#$j=%iZ?gyL>nQPaj7y(RS&)rb$^8yYVT5*AeA9uPnP<6ka9qkZS&q z52Ehp)2o=S*AOe>00=O?1{)bWjQa|dkfOIJ<4$Y&1KA0AS<2?eyRGpd;j}E?I>w(` zohq4^dhd=T@Z}o2OUHg7| zz^?Epd;)?_;97UDDYhTVD+0b|9g)tEv*sth%3j8h;yw6%{<=q2>FrJd9VAe2;V0mv zkA{mWNGOL(G0+r&)TK?9&{VlKuiw-(%NjieQbmh4Nr^LEuQ}_A$1^;o7$H3K&_^cr zJ@FDO__0j?nz?_N8o4sv~04SeH0Z-~lyIXz&(Hm^><>67pHYHBv^%Ks|Z>iBfP zp%3yCnReInJ)`JMz-$K&J&Yi3_wBHL@hBCUf;!Gn<}3>(c4k=4Uayfk|6$pcMn=w^ z&{Qj{IuJJbQ*~dowMf$y(?P+R$)>BI*RO~Eyl-}nm0Y$kv{O(?GV?gYJg3FgLGYG( zXyS)--cJ^;5Nl;!5zsW?F7c3dZ))&Da2t_am$(Bf1tr^o8{(_#Zi6(GS0#uH^&30! zMJG=g(3mK%X9rVXvYe`}&k#R#JfFt(=lP}c|S}+dZ${;A8a?dnwhl%PHtqqhj37{vETI&G39l+JV-PXt6 z{q}=h6O6p?+lu_>*ul3m*Y1oh)qi7xc9c##VIv7vp5HOGe_x&t_%x%(?`7|aNht4+ zVvindQ*%%08g)L|x79}_;!l%^p0_|spA4^>U1b(>XOJLd&;DqeHf?fg4@NYT^VNeN znS>@`qtqW&5`$B>9aocBpr23th~vV`{L$pfVzm25(QmjnDypi2CZUKJ`ButPUhb;J z+Foi7aWk9IEeG<**{$$D8^P5Y1X}BgXDD7!4@@xbRs4-Hs28US?tVF$=NOV;2V0Wo z%{rNRRR4VW6pMc0E^vK1Fk9~yzdUZFas5*=*(sls?0Wg}Vf*QE65w(B)=a6LP~6`P z$^h%9v~+B~_+ob0!i|@20ZYk3@siA){*`t#LfBrph)DEfrnfp$MGZ~P3!eeycRUD* zRHBqMi5)wV1xS;@oJl1^zgvS0q?BCnb1UPIGiCY%*DW~^%_!_!dGP^Yys5JUg$?9< zv8Mgm=mBNanvp`vbIAJzxrI5hZSjAit>?oLFb=KJ8Y&)rC~4N- z!)uk54JT)0LI-Z+GUKO5-|OKrGyd^nZ`RL60-z|bTX@}eKXo5F{=n93xeuUbMfWm+3v6o ziyU@7>%k};#zI{QejVYke?SMUg{&%1egQ~U%C9-$6-;FC7byWAF*|3I-&6CHh2FI5 zss2;T=0XKDfWt2A!aDp$A;b3@i~*R^+t-P64?Qw*0Wsuo~Q^+M{9Yqw}Cg0 zUyOc&8C+X;yX7~tBYVB-j!2@B1b4^Tr>ah)D+}J~RKvABaC&NUAc^wKkpXV&oK!CW z(tTbw(Y>KDt7hDYfvVvVLcl*#~P zS-ZgnlV?nL3_rhpmh%WxTuUbP)w<{P$WdS4$3V`fD6aZm`_0YT=lvCm@B3X*(Y#x8 zP6;2M+@ANqa8@UbP}u%nvUPC$ zSy<4be|-AMeqq!iMYF7~>`6PF@n#(^UP*~mAZxyg9X%gSm4Jjc9W}2A`hl5gv$;h| zV^j3B3N3BLxO`9vmL5-g{0_CL0^03wMPRsyadPh&MiFv5buVIxiqD6#{jto6A%I@j ztop|&$v+qZW+kzd13;nM3_C|(Ge5t10-}O(M2|Gzau{$6zh zRrx`j|9kUm&inS}p8VO${q{<;{pbueh6fD1keQy3qr)FB%L@0EPD=$!+t(19K6wN% zzam>`fZR8&gVOtYbM{X~uEHC#wRrV5x{dwOZY3(nz_;$rl|iX2ye?rzz7Y+NNewd_ zw~YARbAU9i)0T)GQfmn>^?YX_=Y?wbU5e7-Yb5T$Ic=@~_mYu$9xlCSi|DnEmUBrW zr#2ew%%y?R=DT!xn)m2E+kc!Fh8-74zJPi7N2trMQWZ~uTDis)*#sB zdHvRK6~+Iy^x1bmA!r-Xl}I~H0&?*V0S2^N`C`X|_+`NU&YqZ18>{l0&L`i>uLB|NJgs zmM(hb$hmjXahMH1$@DJ*V0iXl7#R(hjft%*;yYq?iS1bMTR?NxfE;gU(I{Kqm%7iB z-`?qMBL%z}Z6iI^pSPcxgajW$pBKI_k5?au&+S_TJfG~k_i67#@0lL1zE3+tC(;I~ zaq(T>b~8syFFIjpt!J+8H}bDG^tl3=Uf$(DbCXbH;Fy5L65YRcbwG6Ru}gL={L#p_ zDz1w&k!UGoCd|OKhkjMt^4YaSmL#qmcZNna3Rh?A3^AJUkmwkdKhyQ3gaM9f)Zg?m z0`y49(?{RkPqo!q@|;Rd9awjj{Idy&NbjnyB2Z8i%4a!K{MO(jHEDz-M{ zVS)+N;db2nu1n(THmq=P`)wK!m6P+iuRq_!S5UJ_ zP4wzs)adl&*ZQ=b!2fpB6JbglL25G%!^z6B*%LBgzrO@%cSZV@6{Kd@YK!; zL3xkp+w&{Ce1>zz=8kXu?rAU9f-Se?UE`a_NaNhCh+uJ&svY^Qcw4-bg#w%>I!=y& z%wEHANQYY`AbfoBuyLp{*0|i5d#89YX-gc7gWe>lLYB;6-D3L>&;2tgd6w&b4E}y3 z3?W!DGGtU|tGNCH! zz1%4ea=?R`YK^#2u3$+dGW^*zcbACf6b}TFqqwVCd%M!W-EnT;kJ)F&uSPq^bdQtj zgF1BL?wQZ4vbi*sDYX4erf-dm+;=PT=b0LYYeH@e|xK5-+#DK z_ic8d=g$fnx1BZwRhZp}htZUOvfDtO74Hj3wW1_%`^=VXyQ|QD|MjAfsTaiP`%D(q zznHA2wAX$Gd`>j8i2T1h*TVjbsBt2o z;F4T)wzVMT{fEcZ(rww(yz)w4ix}RoDR!5VvYc}WXIE5w7@Nemoo|heXO#8Nij^on zTP=24!+k5yBN>6FTXk?x=Tr5T$oe+%#*7sYlU4lL9S>KmA1}UdA)l;Ut6V;h4;&>V#Z^)WSESyLVIKWuD!r9G@b8^=h$g(s>SHjE=UU?Y$?6LOkzc1hhf zl;qfIW+bOQ=my-7muQvUZVHzrxmIE27BQM>jT&x?Sw#xQM->BNh7Ff?V?pZd;4n@41a8r4MIpJb@5Rq8= zI_bKjuaEe!2ZubXdFYujR#Ca2904=jF8;A6%P zE{Fq#HzEdE_x}!N$<7wYynLgxt&^)*#w95$C`H+=cc_dYb1~n&yQ@4S7%0Z=0Z_^1cJ=jA` z?9!`$0M0UxRWs5&^N<9Zov^HPDAhvd; zwQe1$b9TdGLdB|vcfAiS7I2W}L(91C#VlB`^lw}h>^iSr1x_kG9yqZf>(iB{vt|-1 zqa@*UWSjd#@v#5!fKkA&$5c$mnVJQ!@WJKrHe*Mm{^_&+$wW3@M?F3DwX;h^M2tQu zEh$M;6;9=g0ctP+EC6zZ0)}`1rw*%5dyZv}{nTbZH5)i+ z%w7nw`vv-j26H)}Da}8vq91nEO~cUb+73=0IL_no5 zS2zX ze!%bDtg*~nu<+IjtQ6iXj`1sHr~xk|AG5|awXacVNtsto z&;-Zf;E>!W#Xp3j=xM$y39w)zf}Y)gG5U){Gwh`WZvHx*jk0RIcctN0kik@d3V$Z_ zA(sDHf(aguIGwcj?NXqP^+PJp_QE9rT;mB}$o6*VIy13S$Kul@-<=Wbb2>H!6SXCrP0mva}3zS{J9{ z43@|vpr~Q1SZbn0STx#2&|^WISO4X#0e3U?k$*)05UX`DohYupD36d>oNCx5D-LU0 zpc$n+yirED;A~O-#rVIN?H_z7^eu;BugNNqUe)>_Oz`*C`I``x!sDbM7~!|=x3rot zvuS3m+fN$U*nd1!M{cV<>`QMwPg-`rhrqZ*?z{!3VQo>#-;`jD`s%s8k0CI0sJwAC zJ@+2izT0s5UyL}Ov6yP%oxS6&wt2qJT;Rnvxo(|Mn6sHqRl2-CPN4W+^KxGhy}jf# z;A!J6@oTg@W>pJA7j$EpFh);cShu6)8>`N~cG}&!F%|G5xTK&Xst9=Qe|2dNx>vY6 z;}#ONyGrYRXGAw#xU8CF2B3G*FoTdL*+ z^tMMuJ9Css3dq@X3P6QR%h7)0dA}CBLmJ28)sCY4}ef@(5aa39L6Hpq$lK&;=lPVEk1l&E-P%9ONo?EA0vR+~G*e7-%FDTU-V z;)$~DT0D>fT|{ZexzBI_omKqrt|R}uwb+Q^JK~hAn_E)AzP$^GLtUF-cZs z_J<1$NUtutyT9)U88$rZ9#VeigunL~+ikt)d}Is)Dqvh_l6_y6&YEpgQRa@av-o_O zboKSL+rC9dWdX+zTGjbX<>sSu-nM%do+4f{&MIhg^ei{Jg-aAmZl3SgpX;Z(-!Aw; zRQ#v1@8fxm<4-o%rrIvt=F&&=mnP>k7Dq`)z}yK|^?0_Y*doP*J0nh)tN}fW{-iD8aj)jsm36 z;lxo^uu?;^kfJNNDd`^k{t1;XVUsvw$P1_6GAiZ0cOzo`DBu_*4>lF30a*1mjnuHQ zjUMmwGPsnA^?BMz4iS^Hh5OHuUbVD_@-_$-fo%r*C%c^Eg*Cy^%m&oXVTYyQuE}zrfg$fiNmOR{#ZOv@y=dEF&Jl z=XwOkDLyP(%1wp@uLj ziy=i?E$zj!s;SA4M&RM7u;cJyOSo`CqvS=~D%n6BV8TppU`2h4`PKbnfObmfB|cos z{IEfd@ZOeOiQ9%l+tmhDSXbYRZ)LquE8u};YV-a0h+<>Xpwh9%{pgz`Av-&vXa()e zpw=f2V;CcO>p9Yd0p~gV1m~)Hb^oXfpF_5So}pCA-AWvKjQUY0>1c66rbm2$T5_~k-B=W+LuwT`Dv>Uu7` z!Cz0nqoP?6AvNF>qC(uFyFyhHk7G+{KMRf}25f^9M}Ekl$$HW)+-EVnfvgU~ zsR_1%3+X~|WIHziuP9LEk+Ls5w7iv`hALQ&ZN)Gn=|0(gr|D$a)JD}O|F6Nne7z@8 zjDyXC6^Dq7leiXCjNihH4B=GY+1f~`QZchy_fqe3_%^?bpd2v;lQ8Fq#sAayBq`>j zo8Mzyq?vs||6&?2KdW|Uz`1B(!=%|+-TBw~@5YS5-N%L5f!vh!ag;pen5%~iTlm~y z!NKC8*6&K2+q0E{BRSr?w6J3+Nu3*P2U**)GOWpL&dpOZW*2kDRCw!l-Y7oo?}S7ssI^!P%zRvYyjZlIE?1L`#mhN*sjufrfY;`xb~fO$X`r#u!(a5SJBF@J zIkX+9#<1NX3kbUdO&GH= z9l+DivvrTz>MARM0cRdQrAox*k}u5XQdPR z?|4sMhFL)ClnkS&70?mmt)`i1cOc{Y@FdU`wMJ@*T+_z>ilXEwx@+dqlbx%u+7lk}H>?0h zf~#QrI1_{x|0O|1FbMD3?q|jn>q|pTbs*UWapMr`+Xa=hrMscgQxw3MkXx8Dbc3t=ygW6jmg$yX>k#ydq*yidW+S8s2& zZ!1s>%gbk&XAvpGz`gYhTiea{m%>}$ghx3UwvJAPPhZQk!6JIK0mFQqo#koH&`z$QAgF>s^Xobyv=M8wi@6S8 zpuJi3?0RtEM{k=)>i~aZ&lod?cyA!MkCx@G4@m$NyGGt8G<1WRB~N*0JP5dx9oO_Y z_Sv(1v)nZWBq6vcX5aH9Q542Qt8ufu?!{02S%5VaU@DNpWm`1??JJAc(wwJR)<%r( z@zo5%=+^4%5n(oOUOkIB_aD$WMoIg{qx>bTxJ)P)R;b>24A(VUKkg11azZlP29KES z>X|KJUT3>&$KoQ}FO#b=L%0|BTu>+B2bpN6#B*@ypQbaCH8aZ|MP#g&2gCmdrA|gU zJv#y`hwO}kWo)^^X~AJC&0}H)j5!-j%$|*Grf&kzNkTZ`idDZJUygT2w?5^kbYEsW zpFR(#O^5$x=G!dYP?l8tJjER9dw4rsu6ur7bw}gj<-8qq6BVo3u;C@uN?veZ=(V|+ z2Hj!F<#gBh90Bi(Xpi)L98Z8l-&4@ae3+d#OzG|B|XgzSx46C+MpiJ5$s~8 zNy``}sD93I_3Famubrg7e*LZ|Lp4;DAS%_(f-*AN??Y4@xBpogX+BG&4PgfJqwoQ? zKu|%TATIcOY}7<0U2j}AL!OMyahnaUcrxE zUWkK~v}{sP(2FPaBQvaL5obhfZ&lvU>t|MPK?hKBI9Uy1?q4n^76(t|KQFqU??bjW zC}!sr@8(&srgVLb9zK2~%pe)LO+1{-Pd!NZEi7tbs*H8Rs=Y1WlwqE}*#%pw_t8MdnT^!u7%y_a<5(19n*=Fdtzt5pGb4llGO?h=w zUAO3dR|e_=4Iig7xHsxO-^F-YgAX(#_rTc-1B+3-%2<$J7AhR}cB2`f5=n!)C=o38 za-W>1ReS9VuS$-&1RHNE)o>sBdr`ziJBAG$Rx7iNC({;(Ie(^28e<#4i7aCzA%w&Q zijA-+EVz{%K(b;G2Ej@2CcHyk50o;{w-}6xX8_!0QD`)a*8pOeJ@sk^Io>ER&=$9g zUl+EU+tRKl!de_a=P&S)^kGpv1G+Acxj&^@Z;wGy`;VChh+cpKTS=YLW z_|e{MYYdCxeirurLAK1ni7bJ{#zmA9qnrDe{02#SkC(Mo7e$dnx7)i^Jy&Ws(-3Ow z33fujEsFDExcS~+wxAz?eJH;6*WCrJZuC9}S5+IpLen-IRtBFF%ZewPibZZ&xI@e# z)2U4N%c2!5J?^{p2yI$v%Vs_c08h)^9nq!Od}W8hFQCl&dib7(H2^6L8zSNIp}uXO z*Sf~#?9>cJU+q+`92!|<`LLMq=hJ$tLg1g~Jxb0ph5ReNCzRPwUVh#Nog-`7!dm5fC0t&RO`@3zN|EI|&vq%lI) zB$ckdPE(*s$~Ijwos!RAo{ZTwqxw<`IDwkZ`|gqYqiAZGBWCifg}A7VDpvEYfVn2PNz5RM$Nb_V>2hy z&+gj_B6+&Z6u}m!i@tXLm%EKk0=EaT3TXftyXAD$;oF(M1&AF6+ORpmrzS2a>@$wBnq}@aJy>3PrfbRMc~HL`3&BJn0fS3meps4P9GR8(Gao0Z z3p!Q0;CbEj_6n`~1RoMoL7N746nHz{eg`Iiu{Rn0yGEs+$s-@T+rKRi?eh_0D+Jii zPyfcn@b;9P>=^^1)x1+t_nNnnqP|0Ux_mcn+-J0uuHqeb!#7*n(9mPXu}YI}T(YJ{ ztB{#W>#uLT&7Co$f8P!9wphO)ZEH=@$6D}cXu=23?<4|gL99z)JI9k^)O6*=>{7Sm zM_O+U+offE0D`4AcRI@c^#Vhgy>3+J!R;3xQF7ul{7B*`QjJpUn#EOx# zxmJm{W35ok?2?oYL67tOV@HgF1U%GF3s=6eqvM=J2To6nQ)m!i`Ws8CAf~OyA+vjD zMyGG?%d~YN?!DRhlxxl=g#0C34LGzIwui!BXC{O>RI=jhSexQ|()&!R9hpM_6`4z= zJe{u9>bJ$K=0$Y`_=R=44DAg1RawsAqYt3(JO7|$o&C{cntC^5|sBfxh#`kSLp-=hVH zAL-`9sb;VihG|eIdQfEn4}KUo)w?@Q2&N6~d2U5Wn>`zQdRx`#=z>p*bt>-^@Hem= zJGpHlJOG@^Gg#d@qW4iB2TtU*NwYd1ErCwB5P7r#EzlmFepNula(Fs^T@9iy&A&c4 z)(5w_VKM1c1D>wxdyohYYl}|H>|B)WSK<4psx=Pdi+fGtEJO87R>>g9@5rph!+zfM z_yW0`#Mr@qbM`wj^H7*ozl(H2VLKVuq%N3eK-}_{x0#K>72^QH8@8xn6TX1<0>Yl+ zYZV;TmDCF#65^D_zzp8Rg25Vccdti(KT4@BZ8qW+@R%nmU+XF{LPMfu^7q7_%brsP z=aG^9DTbi+iKNBVZijDOYQ1cV`Q?9H-Enlb;4>nI0+5WPj$O}VvsE|%-o0|Qs#H2z z<+=)!%m5V3e zI+xGKcNE{MbQjZcy_Y>@JdUa=o!24<(Y?*6+PR}C{jS^XN2HB)x-sP%I+um@hn=!H zMa%ZS6Cdv1IChFSEKhFuLvu&;iR2@PcDqp+cZ7f+SW$i}PGJP>Bb6Ll&cQ3Rwzu<) z92eP%DsOV5qsf!wg>hLy$(GQEl^eKwhp~MkMbAP;^??bY3 z@*xzKd@J0LqjbaX&@Lg~tu0F*7jruSh~2AM)Y0%>NVq#|oXqUWC|$=W!^ws{Lltu(v4voI=C#X1?e3 zfp6#Rs_>MPdYqrL)oJs$CBC=SHXjE$Vp5b9+u8Ov5uZJ`5Bh+O?#}C#CHBRoVVu@R zFaAvprs`~rCN;uo-rrdq0R|r|4AooRQG~czKbJBx{nwc+#4N|wh@$yDi`nZ9*p2ye zJnt%OiqQDA3P{jjnfu+)j9wE9o*J}NeQs(L2S>snmks~eHz<6aZe4&}rf$!MDXd@A zJS?<7SEm7oZlwD10GB60IGJW}A_Qk_g~t1l?FYVUh4#i*NIYfU9-%bdu4d3Kcxqyt zuey0u)XItt@~LctO~(Zy=86{mLMo`8_JH9;|fVS zyKKY}KI@OTD?L}ogf%ed3--O?p#jo}eE%Yb|8X3d60z*N)G!E6I+6_JsV_=Ppe?kF9U`R4h5~dysJ!*v z^kywGCeBKu7V*&zh6!JE(F;6p7s5VS!{pNz|u%zVW1fc3Sd>xXg)ff zSDZWg=>?iw?h1N!bLllS6jMT%>(til!B0fZ+(2!Wn2>MK1-^q4ekFE}ND@BP5I~ZMu zElLJ{+*6o>P`6BGXUoI(;bMU}1G@!V+-)+z~UlWByyr zeNUlq_5e}qCaRC~3xQzCIK@*^WI;ftpGyP+j@DHv65qGk?*#}{kl23IFdBv}Leykg z{$-1#us!B0L0vHuf)M=D2gs^HxP}VU2vbk9kcb&YN3VvkP%X3z1VELfW#N&mlnHco ziKV;oXf$%9wF(1Xo1IgW?>4L;?ZWe(ui<$X|N_=TD>3kP`6PMs360k3@Vg* zd&-_0Qt~Qg3CR{!X;1znmQ$SF+5ArpittWxVaUU~$-ed>5#SDW#VY^v69kdpyg+Mc+y>l@}esc z)kn{w-(`)Of`d@R916iibk>N{@g1w&BlAQ zzI!a8IceM8EBYtW*~L;2W~4K@2DQ%6d*2ZFdi1PQ) zju^~f?2!$DW$!2a<@^=J{h&ngC+)DCQ1JiCrLS2L7$c7E?8RP*#F|~b9`KzX@)-;Q&3g-9 zLIE#9$>OfJ4$b=!ca4*#v@29_7RAWthhmu@RLIN9G@6!*g~?Hbq6+UGt+@mR8Kv2e zi9P0jBs^0qp^XF%;^5AgXWP^oMp*<)PDXd-xG=;#5t5oIO;mFD=Wp>ZXPVmT+ zv)`*1427>`OUu$d%cr18Y-$zj;lih$X556ZuVA>%!C?TTu)Vw^7|1w7&=pHn>?v1P zjE%4u{sBaZjO?U5pyY(6E$b0 zDvmw_e2n|$W@c=0$TYuFjIk3%MZtTq$7vxPb2CTP_No`9^y=~UqcSqdf@D~M2pw## zzritIcDm*qx%fV1A_FWckF%6o`2k8v6g3V-I>bJ_-CAt6=J;O_BAGZ6iRMQiLj5L> z!3?HyGxJeC@Uk^Y{o4MRkkc!z!DB);n>kJe@HWWfH^lxW`1S>fl6-7faaGdU$0(4X zK5b4ak7=5LsKzq6LZuJH?{2?lvSzIEMX0r2-DS5TYG*10!s4nIkUX( z&;3U4w5V3MuPi^A9Ro_7aw-iRH4i4g(t8YevKR?Fb^Hb8@^~8M(nYl)YxT>ir3wv_ z4*S(b6x($%NobsRLLlHH&a5~xuWC%bs<%v~8#p=TmevHI44kvxJ74SM-JHtw8)_EQRQKyz~DDr6;!22m~OEfWv3L^hOcfL8FoRb(!)|4yyfT*5WD0wgHh$GhNE+yrwJ47x~!oD z&^b;=Xk}!9Nu0d+2c!ojyJ9vnZCLm-;^lyoSRxL<-Ejw{=@Wea!kVb8@--krid;H@ zE}E)WR2ns=94mc+yYMMFei21%$^BRcl66AB`P1Xq@1aaoNA7Vw6&lI-Qb41>AaoSf z`a}$*LyU^yyKu^~%X(Yxmibm2+P_R1NoBr|nF64V_{w|(#yVi^soQbf(C8yfv(uUB&MYBTQ01?($IN6hyH>sP{6l}(#Ps=5hMs=R(`=9kIw)w zLn;5p{(#`VXL5ogmU(>JIUHtGnYO}(obgd$a}>(!28+B90TgG*DwbjTOy_$1@ejF9 zD;5W+p^2KHGE^o;X6J$EUG_RM|L3L+743{|E~Swlck#BB5;+)edxqCFw# zRzNvs_&(0StuB5R)06^CW`P=h0Lw5-XO4;D4vUu8F z{tUfwMnOpTlTHNC^0nWqL3$F;ANlol84Ei+{7(gpMhP_Ujv?`p95ag zKkoG|X+%>U%X`TWYG0zPX?W*=zBlH_F5sl)rm=^B)& z(Gn||Cvf3+;Aqm6$i*$IwB#IwZUA->fDwAnbMl%^l&<-f8(&5qF6t=8 z;-JonskzL2Q)7q=wZ<0)G%U!mT_$hIbGRfv6=K#`IKHK8knlpw_XJUId;Z)9icCm> z@WEng59c9AW2LO%fO#ZD1kh(_+hD?8uy9=UBbsoHb8=+E^4=? z`4%T1=-Z>QpBRJ}qG*kUv5ND^l*PMZ!a=G8jUs^Lgx(hP(?m%afMeG(ek9SK(Wg4H zFTzJ?`j=F%=GV{03X6?UHKdTVOMGjJ-X0-d9=!kWqjV#ggFVx#s zz{Zg4^^$r;kOsa@a6=)92>mqIAfjIz;OuLU@M?gGaO1<&n?EF=Tu8`{Nx5@B_zXA7y0)W&HD0tMlrz{-XveR_vB|uY8&_R8YER@~f0h zCstNDC3dfxr)8;!A65I=wlF<|nL`AlVj)1FhwIMgp&&YVclhf(QWX0u4H`HL2IALk2{JU*NafJ;ND+TIx zHs7=s2g5X>k}*Oxk)qLO#Ys6FnTM*ughAg+fN)ShF13EqhV7rh*8HZ78)~s2S?@5} zRbggmn-mTl&6s)eqars{ys(J8w`x zI|0=3MXjEH{KAD=eO?nGl5q|aP5s@)Z%#W9+Q#EA!o~AaO-zJ5E~Or>Wii?S+sjpg zgASZopg1f1;^a7D+MCo1AL?wfYmG5PrU3oO73J^o;JvX-s{AWe8J3H$Xf31Im&39k z10C1h>%y&1%J)}#Wsd)E7r}W%aHG1QCQsugVn093_(K(%;Gs1wcR^wv>Io+}9}+aa zHi6{8F_u;r34@&4l3L4zrWQ!MQNaN(1U>xO`uTQRnaVG}P7#fljhThUdeC#541Ghh z#k$QkOXHswu{<1Hd%oHc_4EDYBAURW2Spbj+fuoZUKBAMg+S@$RnaQBmDZ5)&n5u{ zU!|;^ry+SbDOGf5YcVJWwlec`ZKm?Xw6cm!$8(0T-;tD@QvLXLHn?TO@?9LQ2aH|H zB){Xyro-?g4pELn-Em?`y017^d-(uYrmU(ejU`|GP&%yR?GmDz{~-5Ly=7U}n-(1n z;nBWrmm84N;pMVO3$wsXfbxnwErcwK)50(kqgV=upN2bXO6j(D-*75RwKvFKJ4_3=YYK z1|^wsW5FTdzswhjEf(@6Y)5u|L)vHS#(V2~_xmf6vsgV2g}xP7ygy5 zD$J5`s~1saeA-Kz==PUi73GuD=@WABa45gE*BXy)jl=qE^`E*LBhdlwMV z%s^j=gEG)WQv{q31<7eq*5i3dQGeT;HU!Ql+5Mu4THVgokc#WAtK&3I z>53K{oziQgH2It0w`Pa-a6)q+L#YT*-^0TS2qTJA*!f>!(09UHU?IjTCovp^TOa{= z+H6KP)>CJRawzyIkW6O5rk)Cq1kDB8ZNj!Ju8+YE>aNo1#RD`$iU2=N2;^{^>sh}D zI>!t3{2u@ZLHNGFOxv%dAjb@cTsX4KuT(tWS2}aUP)Oe#WEQo}SGv_gS8QC6m~JSL zC}_+MR7&*FGaEfRz*m}NaWqd(w?B^E*tWlzIBB&92MSx-E35pxk-=aLOGr#pSsIwK ze~XN=b)bWf0I9S<;k-mOZSvM$6^qDP{qaS4rcX6FGmCT>j0220gpFU#{hOr8)Wd8jv@UrHT=Xnb;T_mH}?z%V|WHWh7TH{xrWXu z-G@a|Z5cTMzW}Eyzd~hs_aFG0L#T}5sGX?D9C|)HsfV2m z#)*$EfFmxwxXj>5Km1H!$??OwckoD~eY~%b@v|4(Yma)myl8#>>??0>Zf*A07c8Iej!yJDyuPyQb`n%&xT(bqL?PB zna#YCB!(G~hZdeRQ_`qiEaG~es8o?eM|%z5%X=wnB0}7;j#^Qx1$7mbl0t^ndNCZ5 zo}gw)uYMa0pv~HZEOg+VC?r(}IS}L68*#|mls7p$(0_x$U@!*8f7FIk(~To^-~*Xv zlt<(26Mmj9;`r34pJKU;uOt(QA+`K0QNz`Gh08T z4wa^uo(QzeX|B5&BtjuYPd;cgKzWWDq|hlu+2t~c+len&n!#W^nf7PI)rYbqlC?Ut zTA4WZYSum|_9WR8=3oDcsMh-}DUM}FAI>k1onB}^yxo;RqUW!sVkcg@1C^FX7$F0QKQ*jSyGKhoqMmbaa8u7%rxj# z3{WO}ja;wV-zMi)Y~6zxPFndm>ldmyv)*l&#HWD4IH1-^`s9;Lxiel^=#~Uc=BV8=)Q>sOJ!vD z7jzhRPr6REb2?zDrl{3)yNSyJn~)_t5f&o~zluUwC+9gEKT%{b7~3_Brilisw^p8J zn@mdqLvKW%sl_%;`u>zJMP-As0NLp-QCNttT|X;T^`#xKPcg9ripw1bP|x}J8&Pa7 zRoiqWJ%Z@%n@V_4oCe&SG8hLCqL|xx`xXX=cDbs#HZamNQMieO6Cri0d35htbBwCF zzSsD6gj+Y+hz3S-?HFHv^Uqx#J2mscp9iZS{p@((Xr}8t^UU+-Ub^x=j+Yglj9RVP zbI(fY-TB4en&fVqi>1jZ9Rky4mc`?i~~Ff%U~+ zS~eL@&O$js=}OOYg~-gRCFbqc=vkOQg%nVeFw0!ivpPsGMCmi8GVUi;vg6?mfcCSN` zwMh)BN2z@_XA)fkkGUuE{SSWp%;&y(=fj^R8>`2#b1w~VGQH&3+`O4Iae7{9fy_O`pE?-e2GP;O9rn`1tVw-i9WbPtv0p z4A3Q!^9w2ujpX(j_g*vf;~X%X6X?lr8dpM6}w_^ev?5LXt-n%?Vvc6q|3; zB=vmHyz&Z!4#}UhBn4(!4b>;RzDNGnPOWAZkHFj$sCV6Ll;v{y%mIeTvGst4Wz!uS z`e8Ku{vJH)q$T}ORBMh?JKnMm27_?|(W5LL*qo9te90Dys9Se14yZKLCYMEb_PM_TL67qKaRe+Zeqk^UBAhl+Xl)Fo zxXrRc(@X?=Hxou~fRqoM;wv=>a=n16o+MGLxwd*#!aPfAB>P;vN4rW+(7RVp4_l{h zwT^u&XS$nr|L6byINw3}FDS>STAS++uKrS1>(TuibnNfn{Djoa{`5l6E!KmJU;Nsm zd!MfS>L=!NP_0!bPJQtGKVG~3(Qd{<1#^q>(ye3EC?%5%iz~}_kM8v_+OfsXNg8Vl zA!}k!Ajg3W2IEk*PA09ULLel3E`MqNQ3)2|3v{ztF2z@{zOpv8`^Xs-(9%QWPC@R^ z!qH&$K_5s24Y@tlBn(4TM8gzeLSCgMdVLZNZLOlSjOrn}sGTPF=PZiM6s$l{io$7 z$aT7ylIfI$VBB#q7(1~N+ub8}INDC4-7IMf6SIy_c(pN|T7zS1#KPLR0!>GZqK^Qz zx(VE&VW`riwZ4|D+}nQThiO2A8sVPE+BgV7qUPi8)v>=&FMRnM6AKsCkE4%-KfNHw zCkkWYtR1&kmvwuy5GNi)H?*HTe;h(?v$N#ctRrSS7U-;dB^5%c| zAAj zd2lerR42^|IzLekhl2Z#0T>L%$Zt9-vjp;Io7DH^^`@yuM%P5qpjwXFE){=5Hw*Z_ z)fiY~X>b$`O<t)((M*aDLIc6Zk~ZTupW*8D-a%N^8`!;692S)essxTFpgSC z2Y$poGU2ky*v^wzIWND1ttWUWVx!WtCi;{peqNS{B#ssEHo9k&&X<~WK zZZ$NReo#H}@>lsvGU{vWGfOH?=!c*a%&W0?i@4owPTOwIDrvFHhi0~-TfOqGezD>9 z_0Z|$4BIG!aV)W$;7U|#{lgsw(LG7rXqdpYGIQFF-pIf&E{%Idfb?h3e$g#VcPfcdXmom95S7 z#@fn@f9IPQ-unDYzxf~ad~0sO%Wwb2h0j0#?5kg>pTE$!b=9PhU;a=2t6*+%H#^f_ zd6+C8heCzk)<$MM%gGBH@8a=fmT`u6vLFdMC&vTd>u_R9gjHaxQTq*S z!tgQLBZmpfO~yi*PyYaI27|#k`j12&Z*>{z3r(qXlJ$-8PG?-@Oj+ZGV_~vB5wZ3)3HTs{hTaD4jOye ztlZHKJZ;;Y%>I0g4z0{e@A!+*c`lYRf5K>+yuwfa8p;)MnTckcKLVU5TP4&;8EZ@EH<99#$ z;rBoM-uKFP-^H(d%bc;WTJ@^#@+TY83toQbHym)`s85}JCci^>xP>3n4d!s3-Xp!k z<(3nk;q6xnMv=@3nhM8X-9c^JVhz>&ia<(5>U3cE3yK@}CNi1=_l¾NoFfbC1$Hx9GAyL@8W=! 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

\ No newline at end of file diff --git a/themes/moderator/reportedkills_view.html b/themes/moderator/reportedkills_view.html new file mode 100644 index 00000000..6b7b33fa --- /dev/null +++ b/themes/moderator/reportedkills_view.html @@ -0,0 +1,58 @@ +KillID: {{ info.ticket.0.killID }} +
+ + + + + +
+
+ {% if info.ticket.0.status != 0 %} + + + {% else %} + + + {% endif %} +
+
+
+ + +
+
+ +

Ticket By: {{ info.ticket.0.name }} Posted The: {{ info.ticket.0.datePosted }}

+
{{ info.ticket.0.ticket|raw }}
+
+ +{% if info.replies is not empty %} +

Replies

+ + + + + + + + + {% for data in info.replies %} + + + + + {% endfor %} + +
{{ data.name }}
{% if data.moderator %}Moderator{% endif %}
{{ data.reply|raw }}
+{% endif %} + +{% if info.ticket.0.status %} +

Reply

+
+
+ + +

+
+
+{% endif %} diff --git a/themes/moderator/ticket_view.html b/themes/moderator/ticket_view.html new file mode 100644 index 00000000..d026e5a3 --- /dev/null +++ b/themes/moderator/ticket_view.html @@ -0,0 +1,49 @@ + + + + +
+
+ {% if info.ticket.0.status != 0 %} + + + {% else %} + + + {% endif %} +
+
+ +

Ticket By: {{ info.ticket.0.name }} Posted at: {{ info.ticket.0.datePosted }}

+
{{ info.ticket.0.ticket|raw }}
+
+ +{% if info.replies is not empty %} +

Replies

+ + + + + + + + + {% for data in info.replies %} + + + + + {% endfor %} + +
{{ data.name|capitalize }}
{% if data.moderator %}Moderator{% endif %}
{{ data.reply|raw }}
+{% endif %} + +{% if info.ticket.0.status %} +

Reply

+
+
+ +

+
+
+{% endif %} diff --git a/themes/moderator/tickets.html b/themes/moderator/tickets.html new file mode 100644 index 00000000..2553cc05 --- /dev/null +++ b/themes/moderator/tickets.html @@ -0,0 +1,54 @@ +{% if actualURI|last == '/' %} + {% set pageBase = actualURI ~ 'page/' %} +{% else %} + {% set pageBase = actualURI ~ '/page/' %} +{% endif %} + +
    + {% if page > 1 %} +
  • «
  • + {% endif %} + + {% set startIndex = page - 3 %} + {% set endIndex = page + 3 %} + + {% for pageIndex in startIndex..endIndex %} + {% if pageIndex > 0 %} +
  • {{ pageIndex }}
  • + {% endif %} + {% endfor %} +
  • »
  • +
+ +
+ +
+ + + + + + + + + + + + + {% for data in info %} + + + + + + + + + {% endfor %} + +
{{ data.name|capitalize }}{{ shortString(data.ticket|striptags, 60)|raw }} + {% for tag in data.tags %} + {{ tag }} + {% endfor %} + {% if data.status %}Open{% else %}Closed{% endif %}{{ data.replyCount}}{{ data.datePosted }}
+
diff --git a/themes/navigationbar.html b/themes/navigationbar.html new file mode 100644 index 00000000..05ade094 --- /dev/null +++ b/themes/navigationbar.html @@ -0,0 +1,169 @@ +{% if headerImage is defined %} +
+ +
+{% endif %} + diff --git a/themes/overview.html b/themes/overview.html new file mode 100644 index 00000000..7393cd97 --- /dev/null +++ b/themes/overview.html @@ -0,0 +1,209 @@ +{% extends 'base.html' %} + +{% if pageType and pageType != 'overview' %} + {% set pageTitle = pageName ~ ' | ' ~ pageType|capitalize ~ ' | ' ~ key|capitalize %} +{% else %} + {% set pageTitle = pageName ~ ' | ' ~ key|capitalize %} +{% endif %} +{% block title %}{% include 'components/title.html' %}{% endblock %} + +{% set description = pageName ~ ( detail.ranks.overallRank ? ": Ranked #" ~ detail.ranks.overallRank|number_format(0) ~ " with " : ": " ) ~ detail.shipsDestroyed|number_format(0) ~ " ships destroyed and " ~ detail.shipsLost|number_format(0) ~ " ships lost." %} +{% set canonical = fullsiteurl ~ "/" ~ key ~ "/" ~ id ~ "/" %} + +{% block content %} +
+{% include 'components/info_top.html' %} + +
+ +
+{% if pageType == 'overview' or pageType == 'kills' or pageType == 'solo' or pageType == 'losses' %} +
+ {% if mixed %} + {% set killListTitle = 'Recent Activity' %} + {% else %} + {% set killListTitle = 'Kills' %} + {% endif %} + {% set killList = kills %} + {% set mixed = 0 %} + {% set numPages = combinedPages %} + {% set isEmbedded = true %} +{% if pageType == 'kills' %} + {% set topTitle = 'Most Valuable Kills - Last 7 Days' %} + {% set killListTitle = 'Kills' %} + {% set numPages = killPages %} + {% set killList = kills %} + {% set isEmbedded = true %} +{% elseif pageType == 'solo' %} + {% set topTitle = 'Most Valuable Solo Kills - Last 7 Days' %} + {% set killListTitle = 'Solo' %} + {% set numPages = soloPages %} + {% set killList = solo %} + {% set isEmbedded = true %} +{% elseif pageType == 'losses' %} + {% set topTitle = 'Most Valuable Losses - Last 7 Days' %} + {% set killListTitle = 'Losses' %} + {% set numPages = lossPages %} + {% set killList = losses %} + {% set isEmbedded = true %} +{% endif %} + {% set topSet = topKills %} + {% include 'components/big_top_list.html' %} + {% include 'components/kill_list.html' %} +
+
+ {% if topSet|length %} + {% for topSet in topLists %} + {% include 'components/top_killer_list.html' %} + {% endfor %} +
Last 7 days...
+ {% endif %} +
+{% elseif pageType == 'api' %} + {% include 'components/corp_list.html' %} +{% elseif pageType == 'stats' %} + {% include 'components/summary.html' %} +
+ {% include 'components/history.html' %} +{% elseif pageType == 'top' %} + {% set showImage = true %} +
 
+ {% include 'components/top_list.html' %} +{% elseif pageType == 'topalltime' %} + {% set showImage = true %} + {% include 'components/top_list.html' %} +{% elseif pageType == 'corpstats' %} + {% include 'components/corpstats.html' %} +{% elseif pageType == 'supers' %} + +

Intel - Supers (Last 3 months)

+{% set fieldset = extra.supers.titans %} +{% include 'components/intel_table.html' %} + +{% set fieldset = extra.supers.moms %} +{% include 'components/intel_table.html' %} +
+ +{% elseif pageType == 'wars' %} +{% for row in extra.wars %} +
+

{{ row.name }}

+ {% set wars = row.wars %} + {% include 'components/wars_table.html' %} +
+ + {% if loop.index0 is odd %} +
+ {% endif %} +{% endfor %} +
+ +{% endif %} +
+ +{% endblock %} + +{% block opengraph %} + + + + + + +{% if key == "character" %} + + +{% elseif key == "system" %} + + +{% elseif key == "region" %} + + +{% else %} + + +{% endif %} +{% endblock %} + +{% block script %} + + +{% endblock %} diff --git a/themes/postmail.html b/themes/postmail.html new file mode 100644 index 00000000..9201bc77 --- /dev/null +++ b/themes/postmail.html @@ -0,0 +1,88 @@ +{% extends 'base.html' %} + +{% set pageTitle = 'Post' %} +{% block title %}{% include 'components/title.html' %}{% endblock %} + +{% block content %} +{% for message in message %} + {% if message != "" %} +
{{ message }}
+ {% endif %} +{% endfor %} +
+
+
+

Post External Killmail Link (CREST)

+
+
+ +
+
+
+ +
+
+
+
+
+

+
+
+
+ +
+

API Key Post

+
+

Post an API Key, to let the API automatically import kills for you!

+

To quickly create an API key, go to https://community.eveonline.com
(We only require KillLog, but feel free to tick off more.) +

+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+

If you're logged in you can view your API keys here.

+
+
+

API polling frequency (New - please read)

+
+
    +
  • Newly entered API keys are polled almost immediately.
  • +
  • API keys with killmails are polled every 3 hours.
  • +
  • API keys without killmails (e.g. alts) are polled once a day.
  • +
  • API keys that become expired are never checked again since they almost never become un-expired.
  • +
+
+

Frequently Asked Questions

+
+
    +
  • +
    I posted my personal API but my kills didn't show up!!! Where are they?!
    +

    API will only post kills in which you are the final blow. If someone else you were flying with got the final blow then they need to post their API. However, the API will always post your losses. Also keep in mind that personal (Character) api's only go back to the last 25 kills/losses. Beyond that CCP doesn't provide any more history.

    +
  • +
  • +
    I posted a corporation API key and yet some kills are still missing. Why?
    +

    If a member of the corporation didn't get the final blow then your corp API won't have a record of the kill. The corp API will return all losses by corp members. Corporation API's only go back to the last 100 kills/losses.

    +
  • +
+
+
+
+ +{% endblock %} + +{% block robots %} + +{% endblock %} diff --git a/themes/ranks.html b/themes/ranks.html new file mode 100644 index 00000000..71e13ee5 --- /dev/null +++ b/themes/ranks.html @@ -0,0 +1,37 @@ +{% extends 'base.html' %} + +{% set pageTitle = pageTitle ~ ' - ' ~ subType|capitalize %} +{% block title %}{% include 'components/title.html' %}{% endblock %} + +{% block content %} + + + +

{{ pageTitle }}

+{% for rankTable in ranks %} + {% include 'components/rank_table.html' %} +{% endfor %} + +
Ranks are updated daily...
+{% endblock %} + +{% block script %} + +{% endblock %} diff --git a/themes/register.html b/themes/register.html new file mode 100644 index 00000000..5fd53ee1 --- /dev/null +++ b/themes/register.html @@ -0,0 +1,48 @@ +{% extends 'base.html' %} + +{% set pageTitle = 'Register' %} +{% block title %}{% include 'components/title.html' %}{% endblock %} + +{% block content %} +{% if type %} +
+

{{ message }}

+
+{% else %} +

Registration

+
Please remember to read our TOS. and FAQ.
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+{% endif %} +{% endblock %} diff --git a/themes/related.html b/themes/related.html new file mode 100644 index 00000000..4ff78d46 --- /dev/null +++ b/themes/related.html @@ -0,0 +1,99 @@ +{% extends 'base.html' %} + +{% set pageTitle = 'Related Kills | ' ~ systemName ~ ' | ' ~ time %} +{% block title %}{% include 'components/title.html' %}{% endblock %} + +{% block content %} + +

Battle Report: {{ systemName }} / {{ time }} +/- {{ exHours }} Hour{% if exHours > 1%}s{% endif %}

+ +{% set teamATotal = summary.teamA.totals.total_price %} +{% set teamBTotal = summary.teamB.totals.total_price %} +{% set total = teamATotal + teamBTotal %} + +{% set teamAPoints = summary.teamA.totals.total_points %} +{% set teamBPoints = summary.teamB.totals.total_points %} + +{% if total == 0 %} +There was no battle in {{ systemName }} at {{ time }}.

+{% else %} +{% set totalSize = summary.teamA.totals.pilotCount + summary.teamB.totals.pilotCount %} + +{% set teamASize = summary.teamA.totals.pilotCount %} +{% set teamBSize = summary.teamB.totals.pilotCount %} +{% set teamAEff = teamBTotal / total * 100 %} +{% set teamBEff = teamATotal / total * 100 %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Team A ({{ teamASize }} involved)
Team B ({{ teamBSize }} involved)
Reset Report Save Battle Report
+ {% for entity, name in summary.teamA.entities %} +
{{ name }}
+ {% endfor %} +
+ {% for entity, name in summary.teamB.entities %} +
{{ name }}
+ {% endfor %} +
{% set groupIDs = summary.teamA.totals.groupIDs %}{% include 'components/related_summary.html' %}{% set groupIDs = summary.teamB.totals.groupIDs %}{% include 'components/related_summary.html' %}
Ships Lost:
{{ summary.teamA.totals.totalShips | number_format(0)}} Ships
Ships Lost:
{{ summary.teamB.totals.totalShips | number_format(0)}} Ships
Points Lost:
{{ teamAPoints | number_format(0)}}
Points Lost:
{{ teamBPoints | number_format(0)}}
ISK Lost:
{{ teamATotal | number_format(2)}}
ISK Lost:
{{ teamBTotal | number_format(2)}}
Efficiency:
{{ teamAEff | number_format(1)}} %
Efficiency:
{{ teamBEff | number_format(1)}} %
{% set list = summary.teamA.list %}{% include 'components/related_list.html' %}{% set list = summary.teamB.list %}{% include 'components/related_list.html' %}
+ +{% set killListTitle = 'Team B Losses' %} +{% set killList = summary.teamB.kills %} +{% set isEmbedded = true %} +{% include 'components/kill_list.html' %} + + +{% set killListTitle = 'Team A Losses' %} +{% set killList = summary.teamA.kills %} +{% set isEmbedded = true %} +{% include 'components/kill_list.html' %} + +{% endif %} + +{% endblock %} + +{% block opengraph %} + {% set totalLostISK = summary.teamA.totals.total_price + summary.teamB.totals.total_price %} + {% set totalSize = summary.teamA.totals.pilotCount + summary.teamB.totals.pilotCount %} + + + + + + + +{% endblock %} diff --git a/themes/search.html b/themes/search.html new file mode 100644 index 00000000..c85db9b7 --- /dev/null +++ b/themes/search.html @@ -0,0 +1,37 @@ +{% extends 'base.html' %} + +{% set pageTitle = 'Search' %} +{% block title %}{% include 'components/title.html' %}{% endblock %} + +{% block content %} + +{% if data is empty %} +
No Character/Corp/Alliance by that name could be found!

Please search again with the search box at the top

+{% endif %} + +{% if data %} +

Results

+{% set lastType = "" %} +{% set imageSize = 64 %} +
+{% for field in data %} + {% if field.type != lastType %} +
+

{{ field.type|capitalize }}s

+ {% set lastType = field.type %} + {% endif %} +
+ {% if field.type == "faction" %}{% include 'components/image_faction.html' %} - {% include 'components/text_faction.html' %} + {% elseif field.type == "alliance" %}{% include 'components/image_alli.html' %} - {% include 'components/text_alli.html' %} + {% elseif field.type == "corporation" %}{% include 'components/image_corp.html' %} - {% include 'components/text_corp.html' %} + {% elseif field.type == "character" %}{% include 'components/image_char.html' %} - {% include 'components/text_char.html' %} + {% elseif field.type == "item" %}{% include 'components/image_item.html' %} - {% include 'components/text_item.html' %} + {% elseif field.type == "region" %}{% include 'components/image_region.html' %} - {{ field.regionName }} + {% elseif field.type == "system" %}{% include 'components/image_system.html' %} - {{ field.solarSystemName }} + {% endif %} +
+{% endfor %} +
+{% endif %} + +{% endblock %} diff --git a/themes/sitemap.html b/themes/sitemap.html new file mode 100644 index 00000000..b1894e9a --- /dev/null +++ b/themes/sitemap.html @@ -0,0 +1,26 @@ +{% extends 'base.html' %} + +{% set pageTitle = 'Sitemap' %} +{% block title %}{% include 'components/title.html' %}{% endblock %} + +{% block content %} +
+

Sitemap

+
    +{% for key, values in data %} +
  • {{ key|upper }}
  • +
      + {% for page, url in values %} + {% if url|slice(0,1) == "/" or url|slice(0,4) == "http" %} +
    • {{ page }}
    • + {% elseif url|length == 0 %} +
    • {{ page }}
    • + {% else %} +
    • {{ page }}
    • + {% endif %} + {% endfor %} +
    +{% endfor %} +
+
+{% endblock %} diff --git a/themes/tickets.html b/themes/tickets.html new file mode 100644 index 00000000..cba437c0 --- /dev/null +++ b/themes/tickets.html @@ -0,0 +1,114 @@ +{% extends 'base.html' %} + +{% set pageTitle = 'Tickets' %} +{% block title %}{% include 'components/title.html' %}{% endblock %} + +{% block content %} + + +{% if sessionusername %} +
+
+ {% if tickets|length == 0 %} + You do not have any tickets... + {% else %} +

Your Tickets

+ + + + + + + + + + + {% for data in tickets %} + + + + + + + {% endfor %} + +
{{ shortString(data.ticket|striptags, 60)|raw }} + {% for tag in data.tags %} + {{ tag }} + {% endfor %} + {% if data.status %}Open{% else %}Closed{% endif %}{{ data.datePosted }}
+ {% endif %} +
+
+{% else %} +
+You are not logged in, and thus cannot see any tickets, or submit any tickets.
+Please register and login to send tickets, or go to the Live Chat
+
+{% endif %} + +{% endblock %} + +{% block modal %} + +{% endblock %} + +{% block robots %} + +{% endblock %} + +{% block style %} + + +{% endblock %} +{% block script %} + + + + +{% endblock %} diff --git a/themes/tickets_view.html b/themes/tickets_view.html new file mode 100644 index 00000000..ea362cd5 --- /dev/null +++ b/themes/tickets_view.html @@ -0,0 +1,69 @@ +{% extends 'base.html' %} + +{% set pageTitle = 'Tickets' %} +{% block title %}{% include 'components/title.html' %}{% endblock %} + +{% block content %} + + +{% if message %}

{{ message.message }}

{% endif %} + +

Ticket By: {{ ticket.name }} Posted The: {{ ticket.datePosted }}

+
{{ ticket.ticket|raw }}
+
+ + +{% if replies is not empty %} +

Replies

+ + + + + + + + + {% for data in replies %} + + + + + {% endfor %} + +
{{ data.name|capitalize }}
{% if data.moderator %}Moderator{% endif %}
{{ data.reply|raw }}
+ +{% endif %} + +{% if ticket.status %} +
+

Reply

+
+
+ +
+
+ +
+
+{% endif %} +{% endblock %} + +{% block robots %} + +{% endblock %} + +{% block style %} + +{% endblock %} +{% block script %} + + + +{% endblock %} diff --git a/themes/tracker.html b/themes/tracker.html new file mode 100644 index 00000000..cd61cb2e --- /dev/null +++ b/themes/tracker.html @@ -0,0 +1,11 @@ +{% extends 'base.html' %} + +{% block title %}{% include 'components/title.html' %}{% endblock %} + +{% block content %} +

{{ pageTitle }}

+{% include 'components/summary.html' %} +{% set killList = kills %} +{% include 'components/kill_list.html' %} + +{% endblock %} diff --git a/themes/wars.html b/themes/wars.html new file mode 100644 index 00000000..cbdcf0c0 --- /dev/null +++ b/themes/wars.html @@ -0,0 +1,18 @@ +{% extends "base.html" %} +{% set pageTitle = 'Wars' %} +{% block title %}{% include 'components/title.html' %}{% endblock %} + +{% block content %} +{% for row in warTables %} +
+

{{ row.name }}

+ {% set wars = row.wars %} + {% include 'components/wars_table.html' %} +
+ + {% if loop.index0 is odd %} +
+ {% endif %} +{% endfor %} +
+{% endblock %} diff --git a/themes/xml/zkbsearch.xml b/themes/xml/zkbsearch.xml new file mode 100644 index 00000000..5b35870e --- /dev/null +++ b/themes/xml/zkbsearch.xml @@ -0,0 +1,8 @@ + +zKillboard + +zKillboard.com - Killboard for EVE-Online + +https://zkillboard.com/favicon.ico + + \ No newline at end of file diff --git a/themes/zkillboard.php b/themes/zkillboard.php new file mode 100644 index 00000000..28ef1231 --- /dev/null +++ b/themes/zkillboard.php @@ -0,0 +1,15 @@ +themes as $theme) + $available[] = strtolower($theme->name); + + $available[] = "default"; + return $available; + } +} \ No newline at end of file diff --git a/twig.php b/twig.php new file mode 100644 index 00000000..c8b92441 --- /dev/null +++ b/twig.php @@ -0,0 +1,161 @@ +view(new \Slim\Views\Twig()); + +// Theme +$viewtheme = null; +$accountBalance = 0; +$userShowAds = true; +if(User::isLoggedIn()) +{ + $accountBalance = User::getBalance(User::getUserID()); + $adFreeUntil = UserConfig::get("adFreeUntil", null); + $userShowAds = $adFreeUntil == null ? true : $adFreeUntil <= date("Y-m-d H:i"); +} + +// Setup Twig +$cachepath = "cache/templates/"; +$view = $app->view(); +$view->parserOptions = array( + "debug" => ($debug ? true : false), + "cache" => $cachepath +); + +// Load Whoops +$app->add(new \Zeuxisoo\Whoops\Provider\Slim\WhoopsMiddleware); + +$twig = $app->view()->getEnvironment(); + +$uri = $_SERVER["REQUEST_URI"]; +$explode = explode("/", $uri); +$expager = explode("/", $uri); + +foreach($expager as $key => $ex) +{ + if(in_array($ex, array("page"))) + { + unset($expager[$key]); + unset($expager[$key+1]); + } +} + +foreach($explode as $key => $ex) +{ + + if(in_array($ex, array("year", "month", "page"))) + { + // find the key for the page array + unset($explode[$key]); + unset($explode[$key+1]); + } + +} + +$twig->addGlobal('requestUriPager', implode("/", $expager)); +$actualURI = implode("/", $explode); +$twig->addGlobal("actualURI", $actualURI); +$uriParams = Util::convertUriToParameters(); +$twig->addGlobal("year", (isset($uriParams["year"]) ? $uriParams["year"] : date("Y"))); +$twig->addGlobal("month", (isset($uriParams["month"]) ? $uriParams["month"] : date("m"))); +// Twig globals +$twig->addGlobal("image_character", $imageServer."Character/"); +$twig->addGlobal("image_corporation", $imageServer."Corporation/"); +$twig->addGlobal("image_alliance", $imageServer."Alliance/"); +$twig->addGlobal("image_item", $imageServer."Type/"); +$twig->addGlobal("image_ship", $imageServer."Render/"); + +$twig->addGlobal("siteurl", $baseAddr); +$twig->addGlobal("fullsiteurl", $fullAddr); +$twig->addGlobal("requesturi", $_SERVER["REQUEST_URI"]); +$twig->addGlobal("topad", Google::ad($topCaPub, $topAdSlot, $adWidth = 728, $adHeight = 90)); +$twig->addGlobal("bottomad", Google::ad($bottomCaPub, $bottomAdSlot, $adWidth = 728, $adHeight = 90)); +$twig->addGlobal("mobiletopad", Google::ad($topCaPub, $topAdSlot, $adWidth = 320, $adHeight = 50)); +$twig->addGlobal("mobilebottomad", Google::ad($bottomCaPub, $bottomAdSlot, $adWidth = 320, $adHeight = 50)); +$twig->addGlobal("igbtopad", Google::ad($topCaPub, $topAdSlot, $adWidth = 728, $adHeight = 90)); +$twig->addGlobal("igbbottomad", Google::ad($bottomCaPub, $bottomAdSlot, $adWidth = 728, $adHeight = 90)); +$twig->addGlobal("analytics", Google::analytics($analyticsID, $analyticsName)); +$twig->addGlobal("disqusLoad", $disqus); +$noAdPages = array("/account/", "/moderator/", "/ticket", "/register/", "/information/", "/login"); +foreach($noAdPages as $noAdPage) { + $showAds &= !Util::startsWith($uri, $noAdPage); + $showAds &= $userShowAds; +} +$twig->addglobal("showAnalytics", $showAnalytics); +if($disqus) + $twig->addGlobal("disqusShortName", $disqusShortName); +if($disqusSSO) + $twig->addglobal("disqusSSO", Disqus::init()); + +// User's account balance +$twig->addGlobal("accountBalance", $accountBalance); +$twig->addGlobal("adFreeMonthCost", $adFreeMonthCost); + +// Display a banner? +$banner = Db::queryField("select banner from zz_subdomains where (subdomain = :server or alias = :server)", "banner", array(":server" => $_SERVER["SERVER_NAME"]), 60); +if ($banner) +{ + $banner = str_replace("http://i.imgur.com/", "https://i.imgur.com/", $banner); + $banner = str_replace("http://imgur.com/", "https://imgur.com/", $banner); + $twig->addGlobal("headerImage", $banner); +} + +$adfree = Db::queryField("select count(*) count from zz_subdomains where adfreeUntil >= now() and subdomain = :server", "count", array(":server" => $_SERVER["SERVER_NAME"]), 60); +$adfree |= Db::queryField("select count(*) count from zz_subdomains where adfreeUntil >= now() and alias = :server", "count", array(":server" => $_SERVER["SERVER_NAME"]), 60); +if ($adfree) $twig->addGlobal("showAds", false); +else $twig->addGlobal("showAds", $showAds); +Subdomains::getSubdomainParameters($_SERVER["SERVER_NAME"]); + +$twig->addGlobal("KillboardName", (isset($killboardName) ? $killboardName : "zKillboard")); + +// Set the style used side wide to the user selected one, or the config default +$twig->addGlobal("style", UserConfig::get("style", $style)); + +// Detect mobile devices +$detect = new Mobile_Detect(); +$twig->addGlobal("isMobile", ($detect->isMobile() ? true : false)); +$twig->addGlobal("isTablet", ($detect->isTablet() ? true : false)); + +$twig->addExtension(new UserGlobals()); + +$twig->addFunction(new Twig_SimpleFunction("pageTimer", "Util::pageTimer")); +$twig->addFunction(new Twig_SimpleFunction("queryCount", "Db::getQueryCount")); +$twig->addFunction(new Twig_SimpleFunction("isActive", "Util::isActive")); +$twig->addFunction(new Twig_SimpleFunction("pluralize", "Util::pluralize")); +$twig->addFunction(new Twig_SimpleFunction("calcX", "Util::calcX")); +$twig->addFunction(new Twig_SimpleFunction("calcY", "Util::calcY")); +$twig->addFunction(new Twig_SimpleFunction("formatIsk", "Util::formatIsk")); +$twig->addFunction(new Twig_SimpleFunction("shortNum", "Util::formatIsk")); +$twig->addFunction(new Twig_SimpleFunction("shortString", "Util::shortString")); +$twig->addFunction(new Twig_SimpleFunction("truncate", "Util::truncate")); +$twig->addFunction(new Twig_SimpleFunction("chart", "Chart::addChart")); +$twig->addFunction(new Twig_SimpleFunction("getMonth", "Util::getMonth")); +$twig->addFunction(new Twig_SimpleFunction("getLongMonth", "Util::getLongMonth")); +$twig->addFunction(new Twig_SimpleFunction("isMaintenance", "Util::isMaintenanceMode")); +$twig->addFunction(new Twig_SimpleFunction("getMaintenanceReason", "Util::getMaintenanceReason")); +$twig->addFunction(new Twig_SimpleFunction("getNotification", "Util::getNotification")); + +// Information dropdown +$links = Util::informationPages(); +$navInfo = array(); +foreach($links as $key => $data) +{ + if(count($data) >= 2) // Multi menu + { + foreach($data as $subData) + { + $navInfo[$key][] = $key."/".$subData["name"]; + } + } + else + { + $navInfo[$key] = $data[0]["name"]; + } +} +$twig->addGlobal("navInfo", $navInfo); + +// IGB +$igb = false; +if(stristr(@$_SERVER["HTTP_USER_AGENT"], "EVE-IGB")) + $igb = true; +$twig->addGlobal("eveigb", $igb); diff --git a/view/account.php b/view/account.php new file mode 100644 index 00000000..58f713ce --- /dev/null +++ b/view/account.php @@ -0,0 +1,284 @@ +render("login.html"); + die(); +} + +$userID = User::getUserID(); +$key = "me"; +$error = ""; + +$bannerUpdates = array(); +$aliasUpdates = array(); + +if(isset($req)) + $key = $req; + +global $twig, $adFreeMonthCost, $baseAddr; +if($_POST) +{ + // Check for adfree purchase + $purchase = Util::getPost("purchase"); + if ($purchase) + { + if ($purchase == "donate") + { + $amount = User::getBalance($userID); + if ($amount > 0) { + Db::execute("insert into zz_account_history (userID, purchase, amount) values (:userID, :purchase, :amount)", + array(":userID" => $userID, ":purchase" => "donation", ":amount" => $amount)); + Db::execute("update zz_account_balance set balance = 0 where userID = :userID", array(":userID" => $userID)); + $twig->addGlobal("accountBalance", User::getBalance($userID)); + $error = "Thank you VERY much for your donation!"; + } else $error = "Gee, thanks for nothing..."; + } + else + { + $months = str_replace("buy", "", $purchase); + if ($months > 12 || $months < 0) $months = 1; + $balance = User::getBalance($userID); + $amount = $adFreeMonthCost * $months; + $bonus = floor($months / 6); + $months += $bonus; + if ($balance >= $amount) + { + $dttm = UserConfig::get("adFreeUntil", null); + $now = $dttm == null ? " now() " : "'$dttm'"; + $newDTTM = Db::queryField("select date_add($now, interval $months month) as dttm", "dttm", array(), 0); + Db::execute("update zz_account_balance set balance = balance - :amount where userID = :userID", + array(":userID" => $userID, ":amount" => $amount)); + Db::execute("insert into zz_account_history (userID, purchase, amount) values (:userID, :purchase, :amount)", + array(":userID" => $userID, ":purchase" => $purchase, ":amount" => $amount)); + UserConfig::set("adFreeUntil", $newDTTM); + + $twig->addGlobal("accountBalance", User::getBalance($userID)); + $error = "Funds have been applied for $months month" . ($months == 1 ? "" : "s") . ", you are now ad free until $newDTTM"; + Log::log("Ad free time purchased by user $userID for $months months with " . number_format($amount) . " ISK"); + } else $error = "Insufficient Funds... Nice try though...."; + } + } + + + $keyid = Util::getPost("keyid"); + $vcode = Util::getPost("vcode"); + $label = Util::getPost("label"); + // Apikey stuff + if(isset($keyid) || isset($vcode)) + { + $error = Api::addKey($keyid, $vcode, $label); + } + + $deletesessionid = Util::getPost("deletesessionid"); + // delete a session + if(isset($deletesessionid)) + User::deleteSession($userID, $deletesessionid); + + $deletekeyid = Util::getPost("deletekeyid"); + $deleteentity = Util::getPost("deleteentity"); + // Delete an apikey + if(isset($deletekeyid) && !isset($deleteentity)) + $error = Api::deleteKey($deletekeyid); + + // Theme + $theme = Util::getPost("theme"); + if(isset($theme)) + { + UserConfig::set("theme", $theme); + $app->redirect($_SERVER["REQUEST_URI"]); + } + + // Style + $style = Util::getPost("style"); + if(isset($style)) + { + UserConfig::set("style", $style); + $app->redirect($_SERVER["REQUEST_URI"]); + } + + // Email + $email = Util::getPost("email"); + + if(isset($email)) + { + Db::execute("UPDATE zz_users SET email = :email WHERE id = :userID", array(":email" => $email, ":userID" => $userID)); + } + + // Password + $orgpw = Util::getPost("orgpw"); + $password = Util::getPost("password"); + $password2 = Util::getPost("password2"); + // Password + if(isset($orgpw) && isset($password) && isset($password2)) + { + if($password != $password2) + $error = "Passwords don't match, try again"; + elseif(Password::checkPassword($orgpw) == true) + { + Password::updatePassword($password); + $error = "Password updated"; + } + else + $error = "Original password is wrong, please try again"; + } + + $timeago = Util::getPost("timeago"); + if(isset($timeago)) + UserConfig::set("timeago", $timeago); + + $deleteentityid = Util::getPost("deleteentityid"); + $deleteentitytype = Util::getPost("deleteentitytype"); + // Tracker + if(isset($deleteentityid) && isset($deleteentitytype)) + { + $q = UserConfig::get("tracker_" . $deleteentitytype); + foreach($q as $k => $ent) + { + if($ent["id"] == $deleteentityid) + { + unset($q[$k]); + $error = $ent["name"]." has been removed"; + } + } + UserConfig::set("tracker_" . $deleteentitytype, $q); + } + + $entity = Util::getPost("entity"); + $entitymetadata = Util::getPost("entitymetadata"); + // Tracker + if((isset($entity) && $entity != null) && (isset($entitymetadata) && $entitymetadata != null)) + { + $entitymetadata = json_decode("$entitymetadata", true); + $entities = UserConfig::get("tracker_" . $entitymetadata['type']); + $entity = array('id' => $entitymetadata['id'], 'name' => $entitymetadata['name']); + + if(empty($entities) || !in_array($entity, $entities)) + { + $entities[] = $entity; + UserConfig::set("tracker_" . $entitymetadata['type'], $entities); + $error = "{$entitymetadata['name']} has been added to your tracking list"; + } + else + $error = "{$entitymetadata['name']} is already being tracked"; + } + + $ddcombine = Util::getPost("ddcombine"); + if(isset($ddcombine)) + UserConfig::set("ddcombine", $ddcombine); + + $ddmonthyear = Util::getPost("ddmonthyear"); + if(isset($ddmonthyear)) + UserConfig::set("ddmonthyear",$ddmonthyear); + + $subdomain = Util::getPost("subdomain"); + if ($subdomain) + { + $banner = Util::getPost("banner"); + $alias = Util::getPost("alias"); + $bannerUpdates = array("$subdomain" => $banner); + if (strlen($alias) == 0 || (strlen($alias) >= 6 && strlen($alias) <= 64)) $aliasUpdates = array("$subdomain" => $alias); + // table is updated if user is ceo/executor in code thta loads this information below + } +} + +$data["entities"] = Account::getUserTrackerData(); + +// Theme +$theme = UserConfig::get("theme", "zkillboard"); +$data["themesAvailable"] = Util::themesAvailable(); +$data["currentTheme"] = $theme; + +// Style +$data["stylesAvailable"] = $theme::availableStyles(); +$data["currentStyle"] = UserConfig::get("style"); + +$data["apiKeys"] = Api::getKeys($userID); +$data["apiChars"] = Api::getCharacters($userID); +$charKeys = Api::getCharacterKeys($userID); +$charKeys = Info::addInfo($charKeys); +$data["apiCharKeys"] = $charKeys; +$data["userInfo"] = User::getUserInfo(); +$data["timeago"] = UserConfig::get("timeago"); +$data["ddcombine"] = UserConfig::get("ddcombine"); +$data["ddmonthyear"] = UserConfig::get("ddmonthyear"); +$data["useSummaryAccordion"] = UserConfig::get("useSummaryAccordion", true); +$data["sessions"] = User::getSessions($userID); +$data["history"] = User::getPaymentHistory($userID); + +$apiChars = Api::getCharacters($userID); +$domainChars = array(); +if ($apiChars != null) foreach($apiChars as $apiChar) { + $char = Info::getPilotDetails($apiChar["characterID"], null); + $char["corpTicker"] = modifyTicker($mdb->findField("information", "ticker", ['type' => 'corporationID', 'id' => (int) @$char["corporationID"]])); + $char["alliTicker"] = modifyTicker($mdb->findField("information", "ticker", ['type' => 'corporationID', 'id' => (int) @$char["allianceID"]])); + + $domainChars[] = $char; +} + +$corps = array(); +$allis = array(); +foreach ($domainChars as $domainChar) { + if (@$domainChar["isCEO"]) { + $subdomain = modifyTicker($domainChar["corpTicker"]) . ".$baseAddr"; + if (isset($bannerUpdates[$subdomain])) { + $banner = $bannerUpdates[$subdomain]; + + Db::execute("insert into zz_subdomains (subdomain, banner) values (:subdomain, :banner) on duplicate key update banner = :banner", array(":subdomain" => $subdomain, ":banner" => $banner)); + $error = "$subdomain has been updated, please wait up to 2 minutes for the changes to take effect."; + } + if (isset($aliasUpdates[$subdomain])) + { + $alias = $aliasUpdates[$subdomain]; + // Make sure no one else has the alias + $count = Db::queryField("select count(*) count from zz_subdomains where alias = :alias and subdomain != :subdomain", "count", array(":subdomain" => $subdomain, ":alias" => $alias)); + if ($count == 0 || strlen($alias) == 0) + { + Db::execute("insert into zz_subdomains (subdomain, alias) values (:subdomain, :alias) on duplicate key update alias = :alias", array(":subdomain" => $subdomain, ":alias" => $alias)); + $error = "$subdomain has been updated, please wait up to 2 minutes for the changes to take effect."; + } else + { + $error = "Sorry, someone has already taken the subdomain $alias"; + } + } + + $corpStatus = Db::queryRow("select adfreeUntil, banner, alias from zz_subdomains where subdomain = :subdomain", array(":subdomain" => $subdomain), 0); + $domainChar["adfreeUntil"] = @$corpStatus["adfreeUntil"]; + $domainChar["banner"] = @$corpStatus["banner"]; + $domainChar["alias"] = @$corpStatus["alias"]; + $corps[] = $domainChar; + } + if (@$domainChar["isExecutorCEO"]) { + $subdomain = modifyTicker($domainChar["alliTicker"]) . ".$baseAddr"; + if (isset($bannerUpdates[$subdomain])) { + $banner = $bannerUpdates[$subdomain]; + Db::execute("insert into zz_subdomains (subdomain, banner) values (:subdomain, :banner) on duplicate key update banner = :banner", array(":subdomain" => $subdomain, ":banner" => $banner)); + $error = "Banner updated for $subdomain, please wait 2 minutes for the change to take effect."; + } + $status = Db::queryRow("select adfreeUntil, banner from zz_subdomains where subdomain = :subdomain", array(":subdomain" => $subdomain), 0); + $domainChar["adfreeUntil"] = @$status["adfreeUntil"]; + $domainChar["banner"] = @$status["banner"]; + $allis[] = $domainChar; + } + + $showFacebook = Util::getPost("showFacebook"); + if ($showFacebook) + { + UserConfig::set("showFacebook", $showFacebook == "true"); + $error = "Facebook setting updated to " . ($showFacebook ? " display." : " not display.") . " The next page load will reflect the change."; + } +} +$data["domainCorps"] = $corps; +$data["domainAllis"] = $allis; +$data["domainChars"] = $domainChars; +$data["showFacebook"] = UserConfig::get("showFacebook", true); + +$app->render("account.html", array("data" => $data, "message" => $error, "key" => $key, "reqid" => $reqid)); + +function modifyTicker($ticker) { + $ticker = str_replace(" ", "_", $ticker); + $ticker = preg_replace('/^\./', "dot.", $ticker); + $ticker = preg_replace('/\.$/', ".dot", $ticker); + return strtolower($ticker); +} diff --git a/view/api.php b/view/api.php new file mode 100644 index 00000000..7cd7e164 --- /dev/null +++ b/view/api.php @@ -0,0 +1,79 @@ +$value) if ($key != "killID" && $key != "zkb") unset($result[$key]); + } + $array[] = $result; + } + $app->etag(md5(serialize($return))); + $app->expires("+1 hour"); + header("Access-Control-Allow-Origin: *"); + header("Access-Control-Allow-Methods: GET"); + + if(isset($parameters["xml"])) + { + $app->contentType("text/xml; charset=utf-8"); + echo XmlWrapper::xmlOut($array, $parameters); + } + elseif(isset($_GET["callback"]) && Util::isValidCallback($_GET["callback"]) ) + { + $app->contentType("application/javascript; charset=utf-8"); + header("X-JSONP: true"); + echo $_GET["callback"] . "(" . json_encode($array) .")"; + } + else + { + $app->contentType("application/json; charset=utf-8"); + if(isset($parameters["pretty"])) + echo json_encode($array, JSON_PRETTY_PRINT); + else + echo json_encode($array); + } +} catch (Exception $ex ) +{ + print_r($ex); + header("HTTP/1.0 503 Server error."); + die(); +} diff --git a/view/apidna.php b/view/apidna.php new file mode 100644 index 00000000..0046511b --- /dev/null +++ b/view/apidna.php @@ -0,0 +1,41 @@ + 200, "cacheTime" => 3600, "page" => $page)); +foreach($kills as $kill) +{ + $kill = json_decode($kill, true); + $killdata = Kills::getKillDetails($kill["killID"]); + $dna[][] = array( + "killtime" => $killdata["info"]["dttm"], + "SolarSystemName" => $killdata["info"]["solarSystemName"], + "solarSystemID" => $killdata["info"]["solarSystemID"], + "regionID" => $killdata["info"]["regionID"], + "regionName" => $killdata["info"]["regionName"], + "victimCharacterID" => (isset($killdata["victim"]["characterID"]) ? isset($killdata["victim"]["characterID"]) : null), + "victimCharacterName" => (isset($killdata["victim"]["characterName"]) ? isset($killdata["victim"]["characterName"]) : null), + "victimCorporationID" => (isset($killdata["victim"]["corporationID"]) ? isset($killdata["victim"]["corporationID"]) : null), + "victimCorporationName" => (isset($killdata["victim"]["corporationName"]) ? isset($killdata["victim"]["corporationName"]) : null), + "victimAllianceID" => (isset($killdata["victim"]["allianceID"]) ? isset($killdata["victim"]["allianceID"]) : null), + "victimAllianceName" => (isset($killdata["victim"]["allianceName"]) ? isset($killdata["victim"]["allianceName"]) : null), + "victimFactionID" => (isset($killdata["victim"]["factionID"]) ? isset($killdata["victim"]["factionID"]) : null), + "victimFactionName" => (isset($killdata["victim"]["factionName"]) ? isset($killdata["victim"]["factionName"]) : null), + "dna" => Fitting::DNA($killdata["items"],$killdata["victim"]["shipTypeID"])); +} +$app->etag(md5(serialize($dna))); +$app->expires("+1 hour"); +header("Access-Control-Allow-Origin: *"); +header("Access-Control-Allow-Methods: GET"); +$app->contentType("application/json; charset=utf-8"); + +echo json_encode($dna, JSON_NUMERIC_CHECK); diff --git a/view/apistats.php b/view/apistats.php new file mode 100644 index 00000000..43495cec --- /dev/null +++ b/view/apistats.php @@ -0,0 +1,52 @@ +findDoc("statistics", ['type' => $type, 'id' => (int) $id]); + unset($array["_id"]); + + header("Access-Control-Allow-Origin: *"); + header("Access-Control-Allow-Methods: GET"); + + if(isset($_GET["callback"]) && Util::isValidCallback($_GET["callback"]) ) + { + $app->contentType("application/javascript; charset=utf-8"); + header("X-JSONP: true"); + echo $_GET["callback"] . "(" . json_encode($array) .")"; + } + else + { + $app->contentType("application/json; charset=utf-8"); + if(isset($parameters["pretty"])) + echo json_encode($array, JSON_PRETTY_PRINT); + else + echo json_encode($array); + } +} catch (Exception $ex ) +{ + header("HTTP/1.0 503 Server error."); + die(); + print_r($ex); +} diff --git a/view/autocomplete.php b/view/autocomplete.php new file mode 100644 index 00000000..38281fa9 --- /dev/null +++ b/view/autocomplete.php @@ -0,0 +1,57 @@ +request()->isPost()) +{ + $query = $app->request()->post('query'); +} + +//declare the base data/sql etc +$entities = array( + array('type' => 'ship', 'query' => 'select id, name from zz_name_search where type = "typeID" and flag = "ship" and name like :query', 'image' => 'Type/%1$d_32.png'), + array('type' => 'region', 'query' => 'select id, name from zz_name_search where type = "regionID" and name like :query LIMIT 9', 'image' => ''), + array('type' => 'system', 'query' => 'select id, name from zz_name_search where type = "solarSystemID" and name like :query', 'image' => ''), + array('type' => 'faction', 'query' => 'select id, name from zz_name_search where type = "factionID" and name like :query', 'image' => 'Alliance/%1$d_32.png'), + array('type' => 'alliance', 'query' => 'select id, name from zz_name_search where type = "allianceID" and (name like :query or flag like :query) limit 9', 'image' => 'Alliance/%1$d_32.png'), + array('type' => 'corporation', 'query' => 'select id, name from zz_name_search where type = "corporationID" and (name like :query or flag like :query) limit 9', 'image' => 'Corporation/%1$d_32.png'), + array('type' => 'character', 'query' => 'select id, name from zz_name_search where type = "characterID" and name like :query limit 9', 'image' => 'Character/%1$d_32.jpg'), + array('type' => 'item', 'query' => 'select id, name from zz_name_search where type = "typeID" and flag != "ship" and name like :query', 'image' => 'Type/%1$d_32.png'), + ); + +//define our array for the results +$search_results = array(); + +$ids = array(); +//for each entity type, get any matches and process them +foreach ($entities as $key => $entity) +{ + $results1 = Db::query($entity['query'], array(":query" => $query), 30); //see if we have any things that exactly matches the thing + $results2 = Db::query($entity['query'], array(":query" => $query . '%'), 30); //see if we have any things that matches the thing + if ($results1 == null) $results1 = []; + if ($results2 == null) $results2 = []; + $results = array_merge($results1, $results2); + if (sizeof($results) > 10) $results = array_slice($results, 0, 10); + + + //merge the reults into an single array to throw back to the browser + foreach ($results as $result) + { + if (!in_array($result['id'], $ids)) + { + $search_results[] = array_merge($result, array('type' => $entity['type'], 'image' => sprintf($entity['image'], $result['id']))); + $ids[] = $result['id']; + } + } +} + +// Declare out json return type +$app->contentType('application/json; charset=utf-8'); + +// CORS headers +header("Access-Control-Allow-Origin: *"); +header("Access-Control-Allow-Methods: POST"); + +//return the top 15 results as a json object +echo json_encode(array_slice($search_results, 0, 15)); diff --git a/view/battle_report.php b/view/battle_report.php new file mode 100644 index 00000000..df2b031d --- /dev/null +++ b/view/battle_report.php @@ -0,0 +1,12 @@ + $battleID)); + +$system = @$battle["solarSystemID"]; +$time = @$battle["dttm"]; +$options = @$battle["options"]; +$showBattleOptions = false; + +global $baseDir; +require_once $baseDir . "/view/related.php"; +die(); diff --git a/view/brsave.php b/view/brsave.php new file mode 100644 index 00000000..9ad61e24 --- /dev/null +++ b/view/brsave.php @@ -0,0 +1,11 @@ + $sID, ":dttm" => $dttm, ":options" => $options), 0); +if ($battleID === null) $battleID = Db::execute("insert into zz_battle_report (solarSystemID, dttm, options) values (:sID, :dttm, :options)", array(":sID" => $sID, ":dttm" => $dttm, ":options" => $options)); +$battleID = Db::queryField("select battleID from zz_battle_report where solarSystemID = :sID and dttm = :dttm and options = :options limit 1", "battleID", array(":sID" => $sID, ":dttm" => $dttm, ":options" => $options), 0); + +$app->redirect("/br/$battleID/", 302); diff --git a/view/campaign.php b/view/campaign.php new file mode 100644 index 00000000..22ebb850 --- /dev/null +++ b/view/campaign.php @@ -0,0 +1,37 @@ + $uri), 1); +if ($campaign == null) $app->redirect("/", 302); + +$title = "Campaign: " . $campaign["title"]; +$subTitle = $campaign["subTitle"]; +$p = json_decode($campaign["definition"], true); + +$summary = Summary::getSummary("system", "solarSystemID", $p, 30000142, $p, true); + +$topPoints = array(); +$topPods = array(); + +$top = array(); +$top[] = Info::doMakeCommon("Top Characters", "characterID", Stats::getTopPilots($p, true)); +$top[] = Info::doMakeCommon("Top Corporations", "corporationID", Stats::getTopCorps($p, true)); +$top[] = Info::doMakeCommon("Top Alliances", "allianceID", Stats::getTopAllis($p, true)); +$top[] = Info::doMakeCommon("Top Ships", "shipTypeID", Stats::getTopShips($p, true)); +$top[] = Info::doMakeCommon("Top Systems", "solarSystemID", Stats::getTopSystems($p, true)); + +$p["pastSeconds"] = ($numDays*86400); +$p["limit"] = 5; +$topIsk = Stats::getTopIsk($p, true); +$topIsk["title"] = "Most Valuable Kills"; +unset($p["pastSeconds"]); + +// get latest kills +$killsLimit = 50; +$p["limit"] = $killsLimit; +if (isset($page) && $page > 0 && $page < 100) $p["page"] = $page; +else $page = 1; +$kills = Kills::getKills($p); + +$app->render("campaign.html", array("topPods" => $topPods, "topIsk" => $topIsk, "topPoints" => $topPoints, "topKillers" => $top, "kills" => $kills, "page" => 1, "pageType" => "kills", "pager" => true, "requesturi" => "/campaign/burnjita3/", "page" => $page, "detail" => $summary, "pageTitle" => $title, "subTitle" => $subTitle)); diff --git a/view/campaigns.php b/view/campaigns.php new file mode 100644 index 00000000..0010daa4 --- /dev/null +++ b/view/campaigns.php @@ -0,0 +1,12 @@ +render("campaigns.html", array("data" => $data)); diff --git a/view/changepassword.php b/view/changepassword.php new file mode 100644 index 00000000..92d98134 --- /dev/null +++ b/view/changepassword.php @@ -0,0 +1,48 @@ + $password, ":hash" => $hash)); + Db::execute("UPDATE zz_users SET change_hash = NULL, change_expiration = NULL WHERE change_hash = :hash", array(":hash" => $hash)); + $message = "Password updated, click login, and login with your new password"; + $messagetype = "success"; + } + $app->render("changepassword.html" , array("message" => $message, "messagetype" => $messagetype)); +} + +else +{ + $date = date("Y-m-d H:i:s"); + $allowed = Db::queryField("SELECT change_expiration FROM zz_users WHERE change_hash = :hash", "change_expiration", array(":hash" => $hash)); + if(isset($allowed) && ($allowed > $date)) + { + $foruser = Db::queryField("SELECT email FROM zz_users WHERE change_hash = :hash", "email", array(":hash" => $hash)); + $app->render("changepassword.html", array("email" => $foruser, "hash" => $hash)); + } + else + { + $message = "Either your password change hash doesn't exist, or it has expired"; + $messagetype = "error"; + $app->render("changepassword.html", array("message" => $message, "messagetype" => $messagetype)); + } +} diff --git a/view/crestmail.php b/view/crestmail.php new file mode 100644 index 00000000..c314a9f5 --- /dev/null +++ b/view/crestmail.php @@ -0,0 +1,9 @@ + 0 && strlen($hash) == 40) +{ + if (!$mdb->exists("crestmails", ['killID' => (int) $killID, 'hash' => $hash])) $mdb->insertUpdate("crestmails", ['killID' => (int) $killID, 'hash' => $hash], ['processed' => false]); + Log::log("New CRESTmail $killID (remote)"); +} diff --git a/view/detail.php b/view/detail.php new file mode 100644 index 00000000..2c21ae6e --- /dev/null +++ b/view/detail.php @@ -0,0 +1,254 @@ +redirect("/detail/$id/#comment", 302); + +$info = User::getUserInfo(); +$name = $info["username"]; +$userID = $info["id"]; +$email = $info["email"]; + +$id = (int) $id; + +while ($mdb->count("queueInfo", ['killID' => $id])) sleep(1); + +$exists = $mdb->exists("killmails", ['killID' => $id]); +if (!$exists) return $app->render("404.html", array("message" => "KillID $id does not exist."), 404); + +$killKey = "CacheKill:$id:$pageview"; +$details = Cache::get($killKey); +if ($details == null) +{ + // Create the details on this kill + $killdata = Kills::getKillDetails($id); + + // create the dropdown involved array + $allinvolved = $killdata["involved"]; + $cnt = 0; + while($cnt < 10) + { + if(isset($allinvolved[$cnt])) + { + $involved[] = $allinvolved[$cnt]; + unset($allinvolved[$cnt]); + } + $cnt++; + continue; + } + $topDamage = $finalBlow = null; + $first = null; + if (sizeof($killdata["involved"]) > 1){ + foreach($killdata["involved"] as $inv) { + if ($first == null) $first = $inv; + if (@$inv["finalBlow"] == 1) $finalBlow = $inv; + if ($topDamage == null && @$inv["characterID"] != 0) $topDamage = $inv; + } + // If only NPC's are on the mail give them credit for top damage... + if ($topDamage == null) $topDamage = $first; + } + + $extra = array(); + // And now give all the arrays and whatnots to twig.. + if($pageview == "overview") + { + $extra["items"] = Detail::combineditems(md5($id), $killdata["items"]); + $extra["invAll"] = involvedCorpsAndAllis(md5($id), $killdata["involved"]); + $extra["involved"] = $involved; + $extra["allinvolved"] = $allinvolved; + } + if($pageview == "comments") + { + $extra["cmtChars"] = Api::getCharacters($userID); + $extra["cmtChars"][] = array("characterID" => 0, "characterName" => "Anonymous"); + } + + + $extra["totalisk"] = $killdata["info"]["zkb"]["totalValue"]; + $extra["droppedisk"] = droppedIsk(md5($id), $killdata["items"]); + $extra["lostisk"] = $killdata["info"]["zkb"]["totalValue"] - $extra["droppedisk"]; + $extra["fittedisk"] = fittedIsk(md5($id), $killdata["items"]); + $extra["relatedtime"] = date("YmdH00", strtotime($killdata["info"]["dttm"])); + $extra["fittingwheel"] = Detail::eftarray(md5($id), $killdata["items"], @$killdata["victim"]["characterID"]); + $extra["involvedships"] = involvedships($killdata["involved"]); + $extra["involvedshipscount"] = count($extra["involvedships"]); + $extra["totalprice"] = usdeurgbp($killdata["info"]["zkb"]["totalValue"]); + $extra["destroyedprice"] = usdeurgbp($extra["lostisk"]); + $extra["droppedprice"] = usdeurgbp($extra["droppedisk"]); + $extra["fittedprice"] = usdeurgbp($extra["fittedisk"]); + $extra["efttext"] = Fitting::EFT($extra["fittingwheel"]); + $extra["dnatext"] = Fitting::DNA($killdata["items"],$killdata["victim"]["shipTypeID"]); + $extra["edkrawmail"] = "deprecated - use CREST"; + $extra["zkbrawmail"] = "deprecated - use CREST"; + $extra["reports"] = Db::queryField("SELECT count(*) as cnt FROM zz_tickets WHERE killID = :killid", "cnt", array(":killid" => $id), 0); + $extra["slotCounts"] = Info::getSlotCounts($killdata["victim"]["shipTypeID"]); + $extra["commentID"] = $id; + $extra["crest"] = $mdb->findDoc("crestmails", ['killID' => $id, 'processed' => true]); + $extra["prevKillID"] = $mdb->findField("killmails", "killID", ['cacheTime' => 300, 'killID' => ['$lt' => $id]], ['killID' => -1]); + $extra["nextKillID"] = $mdb->findField("killmails", "killID", ['cacheTime' => 300, 'killID' => ['$gt' => $id]], ['killID' => 1]); + $extra["warInfo"] = War::getKillIDWarInfo($id); + //$extra["insertTime"] = Db::queryField("select insertTime from zz_killmails where killID = :killID", "insertTime", array(":killID" => $id), 300); + + $systemID = $killdata["info"]["system"]["solarSystemID"]; + $data = Info::getWormholeSystemInfo($systemID); + $extra["wormhole"] = $data; + + $url = "https://". $_SERVER["SERVER_NAME"] ."/detail/$id/"; + + if ($killdata["victim"]["groupID"] == 29) + { + $query = ['$and' => [['involved.characterID' => (int) $killdata["victim"]["characterID"]], ['killID' => ['$gte' => ($id - 200)]], ['killID' => ['$lt' => $id]], ['vGroupID' => ['$ne' => 29]]]]; + $relatedKill = $mdb->findDoc("killmails", $query); + if ($relatedKill) $relatedShip = ['killID' => $relatedKill["killID"], 'shipTypeID' => $relatedKill["involved"][0]["shipTypeID"]]; + } else + { + $query = ['$and' => [['involved.characterID' => (int) @$killdata["victim"]["characterID"]], ['killID' => ['$lte' => ($id + 200)]], ['killID' => ['$gt' => $id]], ['vGroupID' => 29]]]; + $relatedKill = $mdb->findDoc("killmails", $query); + if ($relatedKill) $relatedShip = ['killID' => $relatedKill["killID"], 'shipTypeID' => $relatedKill["involved"][0]["shipTypeID"]]; + } + Info::addInfo($relatedShip); + $killdata["victim"]["related"] = $relatedShip; + + $details = array("pageview" => $pageview, "killdata" => $killdata, "extra" => $extra, "message" => $message, "flags" => Info::$effectToSlot, "topDamage" => $topDamage, "finalBlow" => $finalBlow, "url" => $url); + Cache::set($killKey, $details); +} + +header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + (24 * 3600))); +$app->render("detail.html", $details); + +function involvedships($array) +{ + $involved = array(); + foreach($array as $inv) + { + if(isset($involved[@$inv["shipTypeID"]]) && isset($inv["shipName"])) + $involved[$inv["shipTypeID"]] = array("shipName" => $inv["shipName"], "shipTypeID" => $inv["shipTypeID"], "count" => $involved[$inv["shipTypeID"]]["count"] + 1); + elseif(isset($inv["shipTypeID"]) && isset($inv["shipName"])) + { + $involved[$inv["shipTypeID"]] = array("shipName" => $inv["shipName"], "shipTypeID" => $inv["shipTypeID"], "count" => 1); + } + else + continue; + } + + usort($involved, "sortByOrder"); + return $involved; +} + +function sortByOrder($a, $b) +{ + return $a["count"] < $b["count"]; +} + +function usdeurgbp($totalprice) +{ + $usd = 17; + $eur = 13; + $gbp = 10; + $plex = Price::getItemPrice("29668", date("Ymd")); + $usdval = $plex / $usd; + $eurval = $plex / $eur; + $gbpval = $plex / $gbp; + + return array("usd" => $totalprice / $usdval, "eur" => $totalprice / $eurval, "gbp" => $totalprice / $gbpval); +} + +function buildItemKey($itm) +{ + $key = $itm["typeName"] . ($itm["singleton"] == 2 ? " (Copy)" : ""); + $key .= "|" . ($itm["quantityDropped"] > 0 ? "dropped" : "destroyed"); + if (!isset($itm["flagName"])) $itm["flagName"] = Info::getFlagName($itm["flag"]); + $key .= "|" . $itm["flagName"]; + if ($itm["groupID"] == 649) $key .= microtime() . rand(0, 10000); + return $key; +} + +function involvedCorpsAndAllis($md5, $involved) +{ + $Cache = Cache::get($md5."involvedCorpsAndAllis"); + if($Cache) return $Cache; + + $involvedAlliCount = 0; + $involvedCorpCount = 0; + // Create the involved corps / alliances list + $invAll = array(); + foreach($involved as $inv) { + $allianceID = @$inv["allianceID"]; + $corporationID = @$inv["corporationID"]; + if (!isset($invAll["$allianceID"])) { + $involvedAlliCount++; + $invAll["$allianceID"] = array(); + if ($allianceID != 0) $invAll["$allianceID"]["allianceName"] = $inv["allianceName"]; + if ($allianceID != 0) $invAll["$allianceID"]["name"] = $inv["allianceName"]; + if ($allianceID != 0) $invAll["$allianceID"]["allianceID"] = $allianceID; + $invAll["$allianceID"]["corporations"] = array(); + $invAll["$allianceID"]["involved"] = 0; + } + $involvedCount = $invAll["$allianceID"]["involved"]; + $invAll["$allianceID"]["involved"] = $involvedCount + 1; + + if (!isset($invAll["$allianceID"]["corporations"]["$corporationID"])) { + $involvedCorpCount++; + $invAll["$allianceID"]["corporations"]["$corporationID"] = array(); + $invAll["$allianceID"]["corporations"]["$corporationID"]["corporationName"] = isset($inv["corporationName"]) ? $inv["corporationName"] : ""; + $invAll["$allianceID"]["corporations"]["$corporationID"]["name"] = isset($inv["corporationName"]) ? $inv["corporationName"] : ""; + $invAll["$allianceID"]["corporations"]["$corporationID"]["corporationID"] = $corporationID; + $invAll["$allianceID"]["corporations"]["$corporationID"]["involved"] = 0; + } + $involvedCount = $invAll["$allianceID"]["corporations"]["$corporationID"]["involved"]; + $invAll["$allianceID"]["corporations"]["$corporationID"]["involved"] = $involvedCount + 1; + } + uasort($invAll, "involvedSort"); + foreach($invAll as $id=>$alliance) { + $corps = $alliance["corporations"]; + uasort($corps, "involvedSort"); + $invAll["$id"]["corporations"] = $corps; + } + if ($involvedCorpCount <= 1 && $involvedAlliCount <= 1) $invAll = array(); + Cache::set($md5."involvedCorpsAndAllis", $invAll); + return $invAll; +} + +function involvedSort($field1, $field2) +{ + if ($field1["involved"] == $field2["involved"] && isset($field1["name"]) && isset($field2["name"])) return strcasecmp($field1["name"], $field2["name"]); + return $field2["involved"] - $field1["involved"]; +} + +function droppedIsk($md5, $items) +{ + $Cache = Cache::get($md5."droppedisk"); + if($Cache) return $Cache; + + $droppedisk = 0; + foreach($items as $dropped) { + $droppedisk += $dropped["price"] * (@$dropped["singleton"] ? @$dropped["quantityDropped"] / 100 : @$dropped["quantityDropped"]); + } + + Cache::set($md5."droppedisk", $droppedisk); + return $droppedisk; +} + +function fittedIsk($md5, $items) +{ + $key = $md5 . "fittedIsk"; + $cache = Cache::get($key); + if($cache) + return $cache; + + $fittedIsk = 0; + $flags = array("High Slots", "Mid Slots", "Low Slots", "SubSystems", "Rigs", "Drone Bay", "Fuel Bay"); + foreach($items as $item) + { + if(isset($item["flagName"]) && in_array($item["flagName"], $flags)) { + $qty = isset($item["quantityDropped"]) ? $item["quantityDropped"] : 0; + $qty += isset($item["quantityDestroyed"]) ? $item["quantityDestroyed"] : 0; + $fittedIsk = $fittedIsk + ($item["price"] * $qty); + } + } + Cache::set($key, $fittedIsk); + return $fittedIsk; +} diff --git a/view/dlogin.php b/view/dlogin.php new file mode 100644 index 00000000..80397b25 --- /dev/null +++ b/view/dlogin.php @@ -0,0 +1,41 @@ +render("dlogin.html", array("close" => true)); +} + +if($_POST) +{ + $username = Util::getPost("username"); + $password = Util::getPost("password"); + $autologin = Util::getPost("autologin"); + + if(!$username) + { + $error = "No username given"; + $app->render("dlogin.html", array("error" => $error)); + } + elseif(!$password) + { + $error = "No password given"; + $app->render("dlogin.html", array("error" => $error)); + } + elseif($username && $password) + { + $check = User::checkLogin($username, $password); + if($check) // Success + { + $bool = User::setLogin($username, $password, $autologin); + $app->render("dlogin.html", array("close" => $bool)); + } + else + { + $error = "No such user exists, try again"; + $app->render("dlogin.html", array("error" => $error)); + } + } +} +else $app->render("dlogin.html"); diff --git a/view/error.php b/view/error.php new file mode 100644 index 00000000..bca354c7 --- /dev/null +++ b/view/error.php @@ -0,0 +1,45 @@ +getCode(); +$message = $e->getMessage(); +$file = $e->getFile(); +$line = $e->getLine(); +$trace = $e->getTraceAsString(); +$codeHash = md5($trace); + +$html = ""; +if ($code) { + $html .= sprintf('
Code: %s
', $code); +} +if ($message) { + $html .= sprintf('
Message: %s
', $message); +} +if ($file) { + $html .= sprintf('
File: %s
', $file); +} +if ($line) { + $html .= sprintf('
Line: %s
', $line); +} +if ($trace) { + $html .= '

Trace

'; + $html .= sprintf('
%s
', $trace); +} + +$date = date("Y-m-d H:i:s"); +$url = $_SERVER["REQUEST_URI"]; +$ip = IP::get(); + +try { + Db::execute("INSERT INTO zz_errors (id, error, message, url, ip) VALUES (:id, :error, :message, :url, :ip) ON DUPLICATE KEY UPDATE ip = :ip, date = :date", array(":id" => $codeHash, ":error" => $html, ":message" => $message, ":url" => $url, ":ip" => $ip, ":date" => $date)); + $app->render("error.html", array("code" => $codeHash, "message" => $message, "error" => $html)); +} catch (Exception $ex) { + $html = ""; + $html .= ""; + $html .= "Oh noes an error!"; + $html .= ""; + $html .= ""; + $html .= $e->getMessage(); + $html .= ""; + $html .= ""; + echo $html; +} diff --git a/view/forgotpassword.php b/view/forgotpassword.php new file mode 100644 index 00000000..54a84aa1 --- /dev/null +++ b/view/forgotpassword.php @@ -0,0 +1,50 @@ + $email), 0); + if($exists != NULL) + { + // Generate a random hash to use for the reset token + $random = new RandomGenerator(); + $hash = substr($random->randomToken(), 0, 32); + + $alreadySent = Db::queryField("SELECT change_hash FROM zz_users WHERE email = :email", "change_hash", array(":email" => $email), 0); + if($alreadySent != NULL) + { + $message = "A request to reset the password for this email, has already been sent"; + $messagetype = "error"; + $app->render("forgotpassword.html", array("message" => $message, "messagetype" => $messagetype)); + } + else + { + global $baseAddr; + $username = Db::queryField("SELECT username FROM zz_users WHERE email = :email", "username", array(":email" => $email)); + $subject = "It seems you might have forgotten your password, so here is a link, that'll allow you to reset it: $baseAddr/changepassword/$hash/ ps, your username is: $username"; + $header = "Password change for $email"; + Db::execute("UPDATE zz_users SET change_hash = :hash, change_expiration = date_add(now(), interval 3 day) WHERE email = :email", array(":hash" => $hash, ":email" => $email)); + Email::send($email, $header, $subject); + $message = "Sending password change email to: $email"; + $messagetype = "success"; + $app->render("forgotpassword.html", array("message" => $message, "messagetype" => $messagetype)); + } + } + else + { + $message = "No user with that email exists, try again"; + $messagetype = "error"; + $app->render("forgotpassword.html", array("message" => $message, "messagetype" => $messagetype)); + } + } + else + { + $message = "An error occured.."; + $messagetype = "error"; + $app->render("forgotpassword.html", array("message" => $message, "messagetype" => $messagetype)); + } +} +else + $app->render("forgotpassword.html"); diff --git a/view/index.php b/view/index.php new file mode 100644 index 00000000..a3636b35 --- /dev/null +++ b/view/index.php @@ -0,0 +1,71 @@ +redirect($fullAddr, 302); + + $topPoints = array(); + $topPods = array(); + + $p["kills"] = true; + $p["pastSeconds"] = ($numDays*86400); + + $top = array(); + $top[] = Info::doMakeCommon("Top Characters", "characterID", Stats::getTopPilots($p)); + $top[] = ($columnName != "corporationID" ? Info::doMakeCommon("Top Corporations", "corporationID", Stats::getTopCorps($p)) : array()); + $top[] = ($columnName != "corporationID" && $columnName != "allianceID" ? Info::doMakeCommon("Top Alliances", "allianceID", Stats::getTopAllis($p)) : array()); + $top[] = Info::doMakeCommon("Top Ships", "shipTypeID", Stats::getTopShips($p)); + $top[] = Info::doMakeCommon("Top Systems", "solarSystemID", Stats::getTopSystems($p)); + + $requestUriPager = str_replace("ID", "", $columnName) . "/$id/"; + + $p["limit"] = 5; + $topIsk = Stats::getTopIsk($p); + unset($p["pastSeconds"]); + unset($p["kills"]); + + // get latest kills + $killsLimit = 50; + $p["limit"] = $killsLimit; + $kills = Kills::getKills($p); + + $kills = Kills::mergeKillArrays($kills, array(), $killsLimit, $columnName, $id); + + Info::addInfo($p); + $pageTitle = array(); + foreach($p as $key=>$value) + { + if (strpos($key, "Name") !== false) $pageTitle[] = $value; + } + $pageTitle = implode(",", $pageTitle); + $pageType = "subdomain"; +} else { + $topPoints = array(); + $topIsk = Stats::getTopIsk(array('cacheTime' => (15 * 60), "pastSeconds" => (7*86400), "limit" => 5)); + $topPods = array(); + + $top = array(); + $top[] = json_decode(Storage::retrieve("TopChars", [], 900), true); + $top[] = json_decode(Storage::retrieve("TopCorps", [], 900), true); + $top[] = json_decode(Storage::retrieve("TopAllis", [], 900), true); + $top[] = json_decode(Storage::retrieve("TopShips", [], 900), true); + $top[] = json_decode(Storage::retrieve("TopSystems", [], 900), true); + + // get latest kills + $kills = Kills::getKills(array('cacheTime' => 60, "limit" => 50)); +} + +$app->render("index.html", array("topPods" => $topPods, "topIsk" => $topIsk, "topPoints" => $topPoints, "topKillers" => $top, "kills" => $kills, "page" => $page, "pageType" => $pageType, "pager" => true, "pageTitle" => $pageTitle, "requestUriPager" => $requestUriPager)); diff --git a/view/information.php b/view/information.php new file mode 100644 index 00000000..c212cfce --- /dev/null +++ b/view/information.php @@ -0,0 +1,90 @@ + $val) +{ + if($key == $page) + { + if(count($val) >= 2) // It's a folder + { + foreach($val as $sub) + if($sub["name"] == $subPage) + $path = $sub["path"]; + } + else + { + $path = $val[0]["path"]; + } + } +} + +// If path is null, then none of the above triggered, in which case, the request isn't valid.. REDIRECTION TIME BRO...... Atleast i'm not sending you to goatse or something +if($path == null) + $app->redirect("/"); + +// Load the markdown file +$markdown = file_get_contents($path); + +// Load the markdown parser +$parsedown = new Parsedown(); +$output = $parsedown->text($markdown); + +if($page == "payments") +{ + global $adFreeMonthCost; + $output = str_replace("{cost}", $adFreeMonthCost, $output); +} + +if($page == "statistics") +{ + // Replace certain tags with different data + $info = array(); + $info["kills"] = number_format(Storage::retrieve("totalKills"), 0, ".", ","); + $info["total"] = number_format(Storage::retrieve("actualKills"), 0, ".", ","); + $info["percentage"] = number_format($info["total"] / $info["kills"] * 100, 2, ".", ","); + $info["NextWalletFetch"] = Storage::retrieve("NextWalletFetch"); + + foreach($info as $k => $d) + $output = str_replace("{".$k."}", $d, $output); + + $info["apistats"] = []; //Db::query("select errorCode, count(*) count from zz_api_log where requestTime >= date_sub(now(), interval 1 hour) group by 1"); + + $apitable = ' + + '; + + foreach($info["apistats"] as $data) + { + $apitable .= ''; + $apitable .= ''; + $apitable .= ''; + $apitable .= ''; + } + $apitable .= "
ErrorCount
'; + + if($data["errorCode"] == NULL) + $apitable .= 'No error'; + else + $apitable .= $data["errorCode"]; + + $apitable .= ''; + $apitable .= number_format($data["count"]); + $apitable .= '
"; + + $output = str_replace("{apitable}", $apitable, $output); + + $info["pointValues"] = Points::getPointValues(); + $pointtable = "
    "; + foreach ($info["pointValues"] as $points) + $pointtable .= "
  • " . $points[0] . ": " . $points[1] . "
  • "; + $pointtable .= "
"; + + $output = str_replace("{pointsystem}", $pointtable, $output); +} + +// Load the information page html, which is just the bare minimum to load base.html and whatnot, and then spit out the markdown output! +$app->render("information.html", array("data" => $output)); diff --git a/view/intel.php b/view/intel.php new file mode 100644 index 00000000..43c91949 --- /dev/null +++ b/view/intel.php @@ -0,0 +1,14 @@ + 30, 'isVictim' => false, 'pastSeconds' => (86400 * 90), 'nolimit' => true]; +$data["titans"]["data"] = Stats::getTop("characterID", $parameters); +$data["titans"]["title"] = "Titans"; + +$parameters = ['groupID' => 659, 'isVictim' => false, 'pastSeconds' => (86400 * 90), 'nolimit' => true]; +$data["moms"]["data"] = Stats::getTop("characterID", $parameters); +$data["moms"]["title"] = "Supercarriers"; + +$app->render("intel.html", array("data" => $data)); diff --git a/view/item.php b/view/item.php new file mode 100644 index 00000000..129a5c3d --- /dev/null +++ b/view/item.php @@ -0,0 +1,35 @@ + 0) header("Location: /item/$id/"); + else header("Location: /"); + die(); +} + +$info = Db::queryRow("select typeID, typeName, description from ccp_invTypes where typeID = :id", array(":id" => $id), 3600); +$info["description"] = str_replace("
", "\n", @$info["description"]); +$info["description"] = strip_tags(@$info["description"]); +$info["price"] = Price::getItemPrice($id, date("Ymd")); + +global $mdb; +$cursor = $mdb->getCollection("killmails")->find(['involved.shipTypeID' => (int) $id]); +$hasKills = $cursor->hasNext(); + +$info["attributes"] = array(); + +$info["market"] = Db::query("select * from zz_item_price_lookup where typeID = :typeID order by priceDate desc limit 30", array(":typeID" => $id)); + +$kills = $mdb->find("itemmails", ['typeID' => (int) $id], ['killID' => -1], 50); +$victims = []; +foreach($kills as $row) +{ + $kill = $mdb->findDoc("killmails", ['killID' => $row["killID"]]); + $victim = $kill["involved"][0]; + $victim["destroyed"] = $row["killID"]; + $victims[] = $victim; +} +Info::addInfo($victims); + +$app->render("item.html", array("info" => $info, "hasKills" => $hasKills, 'kills' => $victims)); diff --git a/view/kills.php b/view/kills.php new file mode 100644 index 00000000..c94538e0 --- /dev/null +++ b/view/kills.php @@ -0,0 +1,81 @@ + $maxPage && $type == '') $app->redirect("/kills/page/$maxPage/"); +if ($page > $maxPage && $type != '') $app->redirect("/kills/$type/page/$maxPage/"); + +switch($type) +{ + case "5b": + $kills = Kills::getKills(['iskValue' => 5000000000]); + break; + case "10b": + $kills = Kills::getKills(['iskValue' => 10000000000]); + break; + case "bigkills": + $kills = Kills::getKills(array("groupID" => array(547,485,513,902,941,30, 659), "limit" => $limit, "cacheTime" => 300, "losses" => true, "page" => $page)); + break; + case "awox": + $kills = Kills::getKills(['awox' => true]); + break; + case "t1": + $kills = Kills::getKills(array("groupID" => array(419,27,29,547,26,420,25,28,941,463,237,31), "limit" => $limit, "cacheTime" => 300, "losses" => true, "page" => $page)); + break; + case "t2": + $kills = Kills::getKills(array("groupID" => array(324,898,906,540,830,893,543,541,833,358,894,831,902,832,900,834,380), "limit" => $limit, "cacheTime" => 300, "losses" => true, "page" => $page)); + break; + case "t3": + $kills = Kills::getKills(array("groupID" => array(963), "limit" => $limit, "cacheTime" => 300, "losses" => true, "page" => $page)); + break; + case "frigates": + $kills = Kills::getKills(array("groupID" => array(324,893,25,831,237), "limit" => $limit, "cacheTime" => 300, "losses" => true, "page" => $page)); + break; + case "destroyers": + $kills = Kills::getKills(array("groupID" => array(420,541), "limit" => $limit, "cacheTime" => 300, "losses" => true, "page" => $page)); + break; + case "cruisers": + $kills = Kills::getKills(array("groupID" => array(906,26,833,358,894,832,963), "limit" => $limit, "cacheTime" => 300, "losses" => true, "page" => $page)); + break; + case "battlecruisers": + $kills = Kills::getKills(array("groupID" => array(419,540), "limit" => $limit, "cacheTime" => 300, "losses" => true, "page" => $page)); + break; + case "battleships": + $kills = Kills::getKills(array("groupID" => array(27,898,900), "limit" => $limit, "cacheTime" => 300, "losses" => true, "page" => $page)); + break; + case "solo": + $kills = Kills::getKills(array("losses" => true, "solo" => true, "limit" => $limit, "!shipTypeID" => 670, "!groupID" => array(237, 31), "cacheTime" => 3600, "page" => $page)); + break; + case "capitals": + $kills = Kills::getKills(array("groupID" => array(547,485), "limit" => $limit, "cacheTime" => 300, "losses" => true, "page" => $page)); + break; + case "freighters": + $kills = Kills::getKills(array("groupID" => array(513,902,941), "limit" => $limit, "cacheTime" => 300, "losses" => true, "page" => $page)); + break; + case "supers": + $kills = Kills::getKills(array("groupID" => array(30, 659), "limit" => $limit, "cacheTime" => 300, "losses" => true, "page" => $page)); + break; + case "dust": + $kills = Kills::getKills(array("groupID" => array(351064,351210), "limit" => $limit, "cacheTime" => 300, "losses" => true, "page" => $page)); + break; + case "dust_vehicles": + $kills = Kills::getKills(array("groupID" => "351210", "limit" => $limit, "cacheTime" => 300, "losses" => true, "page" => $page)); + break; + case "lowsec": + $kills = Kills::getKills(array("lowsec" => true, "page" => $page)); + break; + case "highsec": + $kills = Kills::getKills(array("highsec" => true, "page" => $page)); + break; + case "nullsec": + $kills = Kills::getKills(array("nullsec" => true, "page" => $page)); + break; + case "w-space": + $kills = Kills::getKills(array("w-space" => true, "page" => $page)); + break; + default: + $kills = Kills::getKills(array("combined" => true, "page" => $page)); + break; +} + +$app->render("kills.html", array("kills" => $kills, "page" => $page, "killsType" => $type, "pager" => true)); diff --git a/view/lasthour.php b/view/lasthour.php new file mode 100644 index 00000000..2cc3662c --- /dev/null +++ b/view/lasthour.php @@ -0,0 +1,28 @@ + 10, "kills" => true, "pastSeconds" => 3600, "cacheTime" => 30); +$alltime = false; + +$topKillers[] = array("type" => "character", "data" => Stats::getTopPilots($parameters, $alltime)); +$topKillers[] = array("type" => "corporation", "data" => Stats::getTopCorps($parameters, $alltime)); +$topKillers[] = array("type" => "alliance", "data" => Stats::getTopAllis($parameters, $alltime)); + +$topKillers[] = array("type" => "faction", "data" => Stats::getTopFactions($parameters, $alltime)); +$topKillers[] = array("type" => "system", "data" => Stats::getTopSystems($parameters, $alltime)); +$topKillers[] = array("type" => "region", "data" => Stats::getTopRegions($parameters, $alltime)); + +$topKillers[] = array("type" => "ship", "data" => Stats::getTopShips($parameters, $alltime)); +$topKillers[] = array("type" => "group", "data" => Stats::getTopGroups($parameters, $alltime)); +//$topKillers[] = array("type" => "weapon", "data" => Stats::getTopWeapons($parameters, $alltime)); + +unset($parameters["kills"]); +$parameters["losses"] = true; +$topLosers[] = array("type" => "character", "ranked" => "Losses", "data" => Stats::getTopPilots($parameters, $alltime)); +$topLosers[] = array("type" => "corporation", "ranked" => "Losses", "data" => Stats::getTopCorps($parameters, $alltime)); +$topLosers[] = array("type" => "alliance", "ranked" => "Losses", "data" => Stats::getTopAllis($parameters, $alltime)); + +$topLosers[] = array("type" => "faction", "ranked" => "Losses", "data" => Stats::getTopFactions($parameters, $alltime)); +$topLosers[] = array("type" => "ship", "ranked" => "Losses", "data" => Stats::getTopShips($parameters, $alltime)); +$topLosers[] = array("type" => "group", "ranked" => "Losses", "data" => Stats::getTopGroups($parameters, $alltime)); + +$app->render("lasthour.html", array("topKillers" => $topKillers, "topLosers" => $topLosers, "time" => date("H:i"))); diff --git a/view/livechat.php b/view/livechat.php new file mode 100644 index 00000000..dee21fd3 --- /dev/null +++ b/view/livechat.php @@ -0,0 +1,3 @@ +render("livechat.html"); diff --git a/view/login.php b/view/login.php new file mode 100644 index 00000000..ffdb35e3 --- /dev/null +++ b/view/login.php @@ -0,0 +1,48 @@ +redirect("/", 302); + die(); +} + +$referer = @$_SERVER["HTTP_REFERER"]; +if($_POST) +{ + $username = Util::getPost("username"); + $password = Util::getPost("password"); + $autologin = Util::getPost("autologin"); + $requesturi = Util::getPost("requesturi"); + + if(!$username) + { + $error = "No username given"; + $app->render("login.html", array("error" => $error)); + } + elseif(!$password) + { + $error = "No password given"; + $app->render("login.html", array("error" => $error)); + } + elseif($username && $password) + { + $check = User::checkLogin($username, $password); + if($check) // Success + { + User::setLogin($username, $password, $autologin); + $ignoreUris = array("/register/", "/login/", "/logout/"); + if (isset($requesturi) && !in_array($requesturi, $ignoreUris)) { + $app->redirect($requesturi); + } + else + { + $app->redirect("/"); + } + } + else + { + $error = "No such user exists, try again"; + $app->render("login.html", array("error" => $error)); + } + } +} +else $app->render("login.html", array("requesturi" => $referer)); diff --git a/view/logout.php b/view/logout.php new file mode 100644 index 00000000..b1cd075a --- /dev/null +++ b/view/logout.php @@ -0,0 +1,19 @@ +getEncryptedCookie($cookie_name, false); +// remove the entry from the database +Db::execute("DELETE FROM zz_users_sessions WHERE sessionHash = :hash", array(":hash" => $sessionCookie)); +unset($_SESSION["loggedin"]); +$app->view(new \Slim\Views\Twig()); +$twig = $app->view()->getEnvironment(); +$twig->addGlobal("sessionusername", ""); +$twig->addGlobal("sessionuserid", ""); +$twig->addGlobal("sessionadmin", ""); +$twig->addGlobal("sessionmoderator", ""); +setcookie($cookie_name, "", time()-$cookie_time, "/", $baseAddr); +setcookie($cookie_name, "", time()-$cookie_time, "/", ".".$baseAddr); +if (isset($requesturi) && $requesturi != "") $app->redirect($requesturi); +else $app->render("logout.html", array("message" => "You are now logged out")); diff --git a/view/merge.php b/view/merge.php new file mode 100644 index 00000000..c3db98b9 --- /dev/null +++ b/view/merge.php @@ -0,0 +1,80 @@ + $characterID), 0); +if($exists == 1) +{ + $error = "Error: User already merged."; + $app->render("merge.html", array("error" => $error, "characterID" => $characterID, "randomString" => $randomString)); +} + +// Otherwise show the page.. +if($_POST) +{ + $username = Util::getPost("username"); + $password = Util::getPost("password"); + + if(!$username) + { + $error = "No username given"; + $app->render("merge.html", array("error" => $error, "characterID" => $characterID, "randomString" => $randomString)); + } + elseif(!$password) + { + $error = "No password given"; + $app->render("merge.html", array("error" => $error, "characterID" => $characterID, "randomString" => $randomString)); + } + elseif($username && $password) + { + $check = User::checkLogin($username, $password); + if($check) // Success + { + // Get userID for user that passes + $userID = Db::queryField("SELECT id FROM zz_users WHERE username = :username", "id", array(":username" => $username)); + + // Update userID in zz_crest_users + Db::execute("UPDATE zz_users_crest SET userID = :userID WHERE characterID = :characterID", array(":userID" => $userID, ":characterID" => $characterID)); + // Update the characterID on zz_users and set merged to 1 + Db::execute("UPDATE zz_users SET merged = 1 WHERE id = :userID", array(":userID" => $userID)); + Db::execute("UPDATE zz_users SET characterID = :characterID WHERE id = :userID", array(":userID" => $userID, ":characterID" => $characterID)); + + // Set the login session headers and whatnot + $crestData = Db::queryRow("SELECT * FROM zz_users_crest WHERE characterID = :characterID", array(":characterID" => $characterID)); + $_SESSION["loggedin"] = $crestData["characterName"]; + + // Redirect to / + $app->redirect("/"); + } + else + { + // The login failed, or the user didn't exist.. Either way, we don't give a fuck.. + // Randomly generate a password + $password = md5(time() + $cookie_secret); + // Insert no email address, null@null.com + $email = "null@null.com"; + + // Data from zz_user_crest + $crestData = Db::queryRow("SELECT * FROM zz_users_crest WHERE characterID = :characterID", array(":characterID" => $characterID)); + // Insert the new user to zz_users + Db::execute("INSERT INTO zz_users (username, password, email, characterID, merged) VALUES (:username, :password, :email, :characterID, :merged)", array( + ":username" => $crestData["characterName"], + ":password" => $password, + ":email" => $email, + ":characterID" => $crestData["characterID"], + ":merged" => 1) + ); + + // Set the userID in zz_users_crest + $userID = Db::queryField("SELECT id FROM zz_users WHERE username = :username", "id", array(":username" => $crestData["characterName"])); + Db::execute("UPDATE zz_users_crest SET userID = :userID WHERE characterID = :characterID", array(":userID" => $userID, ":characterID" => $characterID)); + // Set the session headers and whatnot + $_SESSION["loggedin"] = $crestData["characterName"]; + + // Redirect to / + $app->redirect("/"); + } + } +} +elseif($exists == 0 || $exists == NULL) + $app->render("merge.html", array("characterID" => $characterID, "randomString" => $randomString)); \ No newline at end of file diff --git a/view/moderator.php b/view/moderator.php new file mode 100644 index 00000000..da7ff099 --- /dev/null +++ b/view/moderator.php @@ -0,0 +1,110 @@ +render("login.html"); + die(); +} +$info = User::getUserInfo(); +if (!User::isModerator()) $app->redirect("/"); + +if($_POST) +{ + $status = Util::getPost("status"); + $reply = Util::getPost("reply"); + $report = Util::getPost("report"); + $delete = Util::getPost("delete"); + $deleteapi = Util::getPost("deleteapi"); + $manualpull = Util::getPost("manualpull"); + + if(isset($status)) + { + Db::execute("UPDATE zz_tickets SET status = :status WHERE id = :id", array(":status" => $status, ":id" => $id)); + if ($status == 0) $app->redirect(".."); + } + if(isset($reply)) + { + $name = $info["username"]; + $moderator = $info["moderator"]; + $check = Db::query("SELECT * FROM zz_tickets_replies WHERE reply = :reply AND userid = :userid", array(":reply" => $reply, ":userid" => $info["id"]), 0); + if(!$check) + { + Db::execute("INSERT INTO zz_tickets_replies (userid, belongsTo, name, reply, moderator) VALUES (:userid, :belongsTo, :name, :reply, :moderator)", array(":userid" => $info["id"], ":belongsTo" => $id, ":name" => $name, ":reply" => $reply, ":moderator" => $moderator)); + $tic = Db::query("SELECT name,email FROM zz_tickets WHERE id = :id", array(":id" => $id)); + $ticname = $tic[0]["name"]; + $ticmail = $tic[0]["email"]; + $subject = "zKillboard Ticket"; + global $baseAddr; + $message = "$ticname, there is a new reply to your ticket from $name - https://$baseAddr/tickets/view/$id/"; + if ($moderator == 0) Log::irc("User replied to ticket: |g|$name|n| https://$baseAddr/moderator/tickets/$id/"); + if ($moderator != 0) Email::send($ticmail, $subject, $message); + if(isset($report)) + $app->redirect("/moderator/reportedkills/$id/"); + $app->redirect("/moderator/tickets/$id/"); + } + } + if(isset($delete)) + { + if($delete < 0) + { + Util::deleteKill($delete); + Db::execute("DELETE FROM zz_tickets WHERE id = :id", array(":id" => $id)); + Db::execute("DELETE FROM zz_tickets_replies WHERE belongsTo = :belongsTo", array(":belongsTo" => $id)); + $app->redirect("/moderator/reportedkills/"); + } + $message = "Error, kill is positive, and thus api verified.. something is wrong!"; + } + + if(isset($manualpull) ) + { + $message = "ah"; + } + + if(isset($deleteapi)){ + Api::deleteKey($deleteapi); + $message = "The Api had been deleted"; + } + +} + +if ($req == "") { + $app->redirect("tickets/"); + die(); +} + +if($req == "tickets" && $id) +{ + $info["ticket"] = Db::query("SELECT * FROM zz_tickets WHERE id = :id", array(":id" => $id), 0); + $info["replies"] = Db::query("SELECT * FROM zz_tickets_replies WHERE belongsTo = :id", array(":id" => $id), 0); +} +elseif($req == "tickets") +{ + $limit = 30; + $offset = ($page - 1) * $limit; + $info = Db::query("SELECT t.*, count(r.belongsTo) replyCount FROM zz_tickets t left join zz_tickets_replies r on (t.id = r.belongsTo) WHERE killID = 0 GROUP BY 1 ORDER BY status DESC, count(r.belongsTo) != 0, datePosted DESC LIMIT $offset, $limit", array(), 0); + foreach($info as $key => $val) + { + //if($val["tags"]) $info[$key]["tags"] = explode(",", $val["tags"]); + } +} +elseif($req == "users") +{ + $info = Moderator::getUsers($page); +} +if($req == "reportedkills" && $id) +{ + $info["ticket"] = Db::query("SELECT * FROM zz_tickets WHERE id = :id", array(":id" => $id), 0); + $info["replies"] = Db::query("SELECT * FROM zz_tickets_replies WHERE belongsTo = :id", array(":id" => $id), 0); +} +elseif($req == "reportedkills") +{ + $limit = 30; + $offset = ($page - 1) * $limit; + $info = Db::query("SELECT * FROM zz_tickets WHERE killID != 0 ORDER BY status DESC LIMIT $offset, $limit", array(), 0); + foreach($info as $key => $val) + { + //if($val["tags"]) $info[$key]["tags"] = explode(",", $val["tags"]); + } +} + +$app->render("moderator/moderator.html", array("id" => $id, "info" => $info, "key" => $req, "url"=>"moderator", "message" => $message, "page" => $page)); diff --git a/view/overview.php b/view/overview.php new file mode 100644 index 00000000..a65d2c54 --- /dev/null +++ b/view/overview.php @@ -0,0 +1,262 @@ +redirect("/"); +$id = $input[1]; +$pageType = @$input[2]; + +if (strlen("$id") > 11) $app->redirect("/"); + +if ($pageType == "history") $app->redirect("../stats/"); + +$validPageTypes = array("overview", "kills", "losses", "solo", "stats", "wars", "supers", "top"); +if ($key == "alliance") +{ + $validPageTypes[] = "api"; + $validPageTypes[] = "corpstats"; +} +if ($key != "faction") +{ + $validPageTypes[] = "top"; + $validPageTypes[] = "topalltime"; +} +if (!in_array($pageType, $validPageTypes)) $pageType = "overview"; + +$map = array( + "corporation" => array("column" => "corporation", "id" => "Info::getCorpId", "details" => "Info::getCorpDetails", "mixed" => true), + "character" => array("column" => "character", "id" => "Info::getCharId", "details" => "Info::getPilotDetails", "mixed" => true), + "alliance" => array("column" => "alliance", "id" => "Info::getAlliId", "details" => "Info::getAlliDetails", "mixed" => true), + "faction" => array("column" => "faction", "id" => "Info::getFactionId", "details" => "Info::getFactionDetails", "mixed" => true), + "system" => array("column" => "solarSystem", "id" => "Info::getSystemId", "details" => "Info::getSystemDetails", "mixed" => true), + "region" => array("column" => "region", "id" => "Info::getRegionId", "details" => "Info::getRegionDetails", "mixed" => true), + "group" => array("column" => "group", "id" => "Info::getGroupIDFromName", "details" => "Info::getGroupDetails", "mixed" => true), + "ship" => array("column" => "shipType", "id" => "Info::getShipId", "details" => "Info::getShipDetails", "mixed" => true), + ); +if (!array_key_exists($key, $map)) $app->notFound(); + +if (!is_numeric($id)) +{ + $app->redirect("./../"); exit(); + $function = $map[$key]["id"]; + $id = call_user_func($function, $id); + if ($id > 0) $app->redirect("/" . $key . "/" . $id . "/", 302); + else $app->notFound(); +} + +if ($id <= 0) $app->notFound(); + +$parameters = Util::convertUriToParameters(); +@$page = max(1, $parameters["page"]); +global $loadGroupShips; // Can't think of another way to do this just yet +$loadGroupShips = $key == "group"; + +$limit = 50; +$parameters["limit"] = $limit; +$parameters["page"] = $page; +try { + $detail = call_user_func($map[$key]["details"], $id, $parameters); + if (isset($detail["valid"]) && $detail["valid"] == false) $app->notFound(); +} catch (Exception $ex) +{ + $app->render("error.html", array("message" => "There was an error fetching information for the $key you specified.")); + return; +} +$pageName = isset($detail[$map[$key]["column"] . "Name"]) ? $detail[$map[$key]["column"] . "Name"] : "???"; +$columnName = $map[$key]["column"] . "ID"; +$mixedKills = $pageType == "overview" && $map[$key]["mixed"] && UserConfig::get("mixKillsWithLosses", true); + +$mixed = $pageType == "overview" ? Kills::getKills($parameters) : array(); +$kills = $pageType == "kills" ? Kills::getKills($parameters) : array(); +$losses = $pageType == "losses" ? Kills::getKills($parameters) : array(); + +if ($pageType != "solo" || $key == "faction") { + $soloKills = array(); + //$soloCount = 0; +} else { + $soloParams = $parameters; + if (!isset($parameters["kills"]) || !isset($parameters["losses"])) $soloParams["mixed"] = true; + $soloKills = Kills::getKills($soloParams); +} +//$soloPages = ceil($soloCount / $limit); +$solo = Kills::mergeKillArrays($soloKills, array(), $limit, $columnName, $id); + +$validAllTimePages = array("character", "corporation", "alliance"); +$topLists = array(); +$topKills = array(); +if ($pageType == "top" || ($pageType == "topalltime" && in_array($key, $validAllTimePages))) { + $topParameters = $parameters; // array("limit" => 10, "kills" => true, "$columnName" => $id); + $topParameters["limit"] = 10; + + if($pageType != "topalltime") + { + if(!isset($topParameters["year"])) + $topParameters["year"] = date("Y"); + if(!isset($topParameters["month"])) + $topParameters["month"] = date("m"); + } + if (!array_key_exists("kills", $topParameters) && !array_key_exists("losses", $topParameters)) $topParameters["kills"] = true; + + $topLists[] = array("type" => "character", "data" => Stats::getTopPilots($topParameters, true)); + $topLists[] = array("type" => "corporation", "data" => Stats::getTopCorps($topParameters, true)); + $topLists[] = array("type" => "alliance", "data" => Stats::getTopAllis($topParameters, true)); + $topLists[] = array("type" => "ship", "data" => Stats::getTopShips($topParameters, true)); + $topLists[] = array("type" => "system", "data" => Stats::getTopSystems($topParameters, true)); + //$topLists[] = array("type" => "weapon", "data" => Stats::getTopWeapons($topParameters, true)); + + if (isset($detail["factionID"]) && $detail["factionID"] != 0 && $key != "faction") { + $topParameters["!factionID"] = 0; + $topLists[] = array("name" => "Top Faction Characters", "type" => "character", "data" => Stats::getTopPilots($topParameters, true)); + $topLists[] = array("name" => "Top Faction Corporations", "type" => "corporation", "data" => Stats::getTopCorps($topParameters, true)); + $topLists[] = array("name" => "Top Faction Alliances", "type" => "alliance", "data" => Stats::getTopAllis($topParameters, true)); + } +} else { + $p = $parameters; + $numDays = 7; + $p["limit"] = 10; + $p["pastSeconds"] = $numDays * 86400; + $p["kills"] = $pageType != "losses"; + + if ($key != "character") { + $topLists[] = Info::doMakeCommon("Top Characters", "characterID", Stats::getTopPilots($p)); + if ($key != "corporation") { + $topLists[] = Info::doMakeCommon("Top Corporations", "corporationID", Stats::getTopCorps($p)); + if ($key != "alliance") { + $topLists[] = Info::doMakeCommon("Top Alliances", "allianceID", Stats::getTopAllis($p)); + } + } + } + if ($key != "ship") $topLists[] = Info::doMakeCommon("Top Ships", "shipTypeID", Stats::getTopShips($p)); + if ($key != "system") $topLists[] = Info::doMakeCommon("Top Systems", "solarSystemID", Stats::getTopSystems($p)); + $p["limit"] = 5; + $topKills = Stats::getTopIsk($p); +} + +$corpList = array(); +if ($pageType == "api") $corpList = Info::getCorps($id); + +$corpStats = array(); +if ($pageType == "corpstats") $corpStats = Info::getCorpStats($id, $parameters); + +$onlyHistory = array("character", "corporation", "alliance"); +if ($pageType == "stats" && in_array($key, $onlyHistory)) { + $detail["history"] = Summary::getMonthlyHistory($columnName, $id); +} else $detail["history"] = array(); + +// Figure out if the character or corporation has any API keys in the database +$apiVerified = false; +if(in_array($key, array("character", "corporation"))) +{ + if($key == "character") + { + $apiVerified = $mdb->exists("apiCharacters", ['type' => 'Account', 'characterID' => (int) $id]); + if ($apiVerified == false) $apiVerified = $mdb->exists("apiCharacters", ['type' => 'Character', 'characterID' => (int) $id]); + } + else + { + $apiVerified = $mdb->exists("apiCharacters", ['type' => 'Corporation', 'corporationID' => (int) $id]); + } +} + +$cnt = 0; +$cnid = 0; +$stats = array(); +$totalcount = ceil(count($detail["stats"]) / 4); +if ($detail["stats"] != null) foreach($detail["stats"] as $q) +{ + if($cnt == $totalcount) + { + $cnid++; + $cnt = 0; + } + $stats[$cnid][] = $q; + $cnt++; +} +if ($mixedKills) $kills = Kills::mergeKillArrays($mixed, array(), $limit, $columnName, $id); + +$prevID = null; +$nextID = null; + +$warID = (int) $id; +$extra = array(); +$extra["hasWars"] = false; //Db::queryField("select count(distinct warID) count from zz_wars where aggressor = $warID or defender = $warID", "count"); +$extra["wars"] = array(); +if (false && $pageType == "wars" && $extra["hasWars"]) +{ + $extra["wars"][] = War::getNamedWars("Active Wars - Aggressor", "select * from zz_wars where aggressor = $warID and timeFinished is null order by timeStarted desc"); + $extra["wars"][] = War::getNamedWars("Active Wars - Defending", "select * from zz_wars where defender = $warID and timeFinished is null order by timeStarted desc"); + $extra["wars"][] = War::getNamedWars("Closed Wars - Aggressor", "select * from zz_wars where aggressor = $warID and timeFinished is not null order by timeFinished desc"); + $extra["wars"][] = War::getNamedWars("Closed Wars - Defending", "select * from zz_wars where defender = $warID and timeFinished is not null order by timeFinished desc"); +} + +$filter = ""; +switch ($key) +{ + case "corporation": + case "alliance": + case "faction": + $filter = "{$key}ID = :id"; +} +if ($filter != "") { + $query = ["{$key}ID" => (int) $id, 'isVictim' => false, 'groupID' => [659, 30], 'pastSeconds' => (90 * 86400)]; + $query = MongoFilter::buildQuery($query); + $hasSupers = $mdb->exists("killmails", $query); + $extra["hasSupers"] = $hasSupers; + + $extra["supers"] = array(); + if ($pageType == "supers" && $hasSupers) + { + $data = array(); + $parameters = ["{$key}ID" => (int) $id, 'groupID' => 30, 'isVictim' => false, 'pastSeconds' => (86400 * 90), 'nolimit' => true]; + $data["titans"]["data"] = Stats::getTop("characterID", $parameters); + $data["titans"]["title"] = "Titans"; + + $parameters = ["{$key}ID" => (int) $id, 'groupID' => 659, 'isVictim' => false, 'pastSeconds' => (86400 * 90), 'nolimit' => true]; + $data["moms"]["data"] = Stats::getTop("characterID", $parameters); + $data["moms"]["title"] = "Supercarriers"; + + Info::addInfo($data); + $extra["supers"] = $data; + $extra["hasSupers"] = sizeof($data["titans"]["data"]) || sizeof($data["moms"]["data"]); + } +} + +if ($key == "system") $statType = "solarSystemID"; +else if ($key == "ship") $statType = "shipTypeID"; +else $statType = "{$key}ID"; +$statistics = $mdb->findDoc("statistics", ['type' => $statType, 'id' => (int) $id]); +$prevRanks = $mdb->findDoc("ranksProgress", ['cacheTime' => 36000, 'type' => $statType, 'id' => (int) $id], ['date' => 1]); +if ($prevRanks != null) +{ + $prevRanks["date"] = date("Y-m-d",$prevRanks["date"]->sec); + $statistics["prevRanks"] = $prevRanks; +} + +$groups = @$statistics["groups"]; +if (is_array($groups) and sizeof($groups) > 0) +{ + Info::addInfo($groups); + $g = []; + foreach ($groups as $group) $g[$group["groupName"]] = $group; + ksort($g); + + // Divide the stats into 4 columns... + $chunkSize = ceil(sizeof($g) / 4); + $statistics["groups"] = array_chunk($g, $chunkSize); +} else $statistics["groups"] = null; + +$months = @$statistics["months"]; +// Ensure the months are sorted in descending order +if (is_array($months) && sizeof($months) > 0) +{ + krsort($months); + $statistics["months"] = array_values($months); + +} else $statistics["months"] = null; + +$renderParams = array("pageName" => $pageName, "kills" => $kills, "losses" => $losses, "detail" => $detail, "page" => $page, "topKills" => $topKills, "mixed" => $mixedKills, "key" => $key, "id" => $id, "pageType" => $pageType, "solo" => $solo, "topLists" => $topLists, "corps" => $corpList, "corpStats" => $corpStats, "summaryTable" => $stats, "pager" => (sizeof($kills) + sizeof($losses) >= $limit), "datepicker" => true, "apiVerified" => $apiVerified, "prevID" => $prevID, "nextID" => $nextID, "extra" => $extra, "statistics" => $statistics); + +$app->render("overview.html", $renderParams); + + diff --git a/view/postmail.php b/view/postmail.php new file mode 100644 index 00000000..dbd199c1 --- /dev/null +++ b/view/postmail.php @@ -0,0 +1,89 @@ +exists("killmails", ['killID' => $killID]); + if ($exists) + { + $app->redirect("/kill/$killID/"); + exit(); + } + $hash = (string) $exploded[5]; + $exists = $mdb->exists("crestmails", ['killID' => $killID, 'hash' => $hash]); + if (!$exists) + { + $mdb->getCollection("crestmails")->save(['killID' => $killID, 'hash' => $hash, 'processed' => false, 'source' => 'user', 'added' => $mdb->now()]); + $newCrest = true; + } + + $timer = new Timer(); + do { + $error = ""; + // Has the kill been processed? + $exists = $mdb->exists("killmails", ['killID' => $killID]); + if ($exists) + { + $ip = IP::get(); + Log::log("New CRESTmail $killID"); + $app->redirect("/kill/$killID/"); + exit(); + } + $crest = $mdb->findDoc("crestmails", ['killID' => $killID, 'hash' => $hash]); + if ($crest["processed"] === null) + { + Log::log("$killID $hash failing, will keep trying"); + $mdb->set("crestmails", ['killID' => $killID, 'hash' => $hash], ['processed' => false]); + $error = ""; + //$error = "There is an error with the killmail at the CREST endpoint (aka it is CCP's fault). We'll let CCP know. Your kill has still been submitted and we'll process it as soon as the error has been fixed. Thank you."; + } + if (@$crest["npcOnly"]) $error = "This is an NPC kill and therefore has not been processed"; + + if ($error == "") sleep(1); + } while ($timer->stop() < 20000 && $error == ""); + if ($error == "") $error = "We waited 20 seconds for the kill to be processed but the server must be busy atm, please wait!"; + } + } + } +} + +if(!is_array($error)) $error = array($error); + +$app->render("postmail.html", array("message" => $error)); diff --git a/view/ranks.php b/view/ranks.php new file mode 100644 index 00000000..5db2f3e3 --- /dev/null +++ b/view/ranks.php @@ -0,0 +1,24 @@ +notFound(); +if (!in_array($subType, array("killers", "losers"))) $app->notFound(); + +$table = $pageType == "recent" ? "zz_ranks_recent" : "zz_ranks"; +$pageTitle = $pageType == "recent" ? "Ranks - Recent (Past 90 Days)" : "Alltime Ranks"; +$tableTitle = $pageType == "recent" ? "Recent Rank" : "Alltime Rank"; + +$rankColumns = $subType == "killers" ? "(sdRank <= 10 or pdRank <= 10 or idRank <= 10 or overallRank <= 10)" : "(slRank <= 10 or plRank <= 10 or ilRank <= 10)"; + +$types = array("pilot" => "characterID", "corp" => "corporationID", "alli" => "allianceID", "faction" => "factionID"); +$names = array("character" => "Characters", "corp" => "Corporations", "alli" => "Alliances", "faction" => "Factions"); +$ranks = array(); +foreach ($types as $type=>$column) { + $result = Db::query("select distinct typeID $column, r.* from $table r where type = '$type' and $rankColumns order by overallRank"); + if ($type == "pilot") $type = "character"; + $ranks[] = array("type" => $type, "data" => $result, "name" => $names[$type]); +} + +Info::addInfo($ranks); + +$app->render("ranks.html", array("ranks" => $ranks, "pageTitle" => $pageTitle, "tableTitle" => $tableTitle, "pageType" => $pageType, "subType" => $subType)); diff --git a/view/raw.php b/view/raw.php new file mode 100644 index 00000000..3b5594fd --- /dev/null +++ b/view/raw.php @@ -0,0 +1,12 @@ +findDoc("killmails", ['killID' => $id]); +unset($killmail["_id"]); +header("Content-Type: application/json"); +print_r($killmail); +die(); diff --git a/view/register.php b/view/register.php new file mode 100644 index 00000000..a8cc1130 --- /dev/null +++ b/view/register.php @@ -0,0 +1,50 @@ +render("register.html", array("error" => $error)); + } + elseif(!$email) + { + $error = "Missing email, please retry"; + $app->render("register.html", array("error" => $error)); + } + elseif($password != $password2) + { + $error = "Passwords don't match, please retry"; + $app->render("register.html", array("error" => $error)); + } + elseif(!$username) + { + $error = "Missing username, please retry"; + $app->render("register.html", array("error" => $error)); + } + elseif($username && $email && ($password == $password2)) // woohoo + { + // Lets check if the user isn't already registered + if(Registration::checkRegistration($username, $email) == NULL) // He hasn't already registered, lets do et! + { + $message = Registration::registerUser($username, $password, $email); + $app->render("register.html", array("type" => $message["type"], "message" => $message["message"])); + } + } +} +else + $app->render("register.html"); diff --git a/view/related.php b/view/related.php new file mode 100644 index 00000000..299f96df --- /dev/null +++ b/view/related.php @@ -0,0 +1,57 @@ +redirect($url, 302); + die(); +} + +$systemName = Info::getSystemName($systemID); +$regionName = Info::getRegionName(Info::getRegionIDFromSystemID($systemID)); +$unixTime = strtotime($relatedTime); +$time = date("Y-m-d H:i", $unixTime); + +$exHours = 1; +if (((int) $exHours) < 1 || ((int) $exHours > 12)) $exHours = 1; + +$key = "$systemID:$relatedTime:$exHours:" . json_encode($json_options); +$cache = new FileCache($baseDir . "/cache/related/"); +$mc = $cache->get($key); +if (!$mc) +{ + $parameters = array("solarSystemID" => $systemID, "relatedTime" => $relatedTime, "exHours" => $exHours); + $kills = Kills::getKills($parameters); + $summary = Related::buildSummary($kills, $parameters, $json_options); + $mc = array("summary" => $summary, "systemName" => $systemName, "regionName" => $regionName, "time" => $time, "exHours" => $exHours, "solarSystemID" => $systemID, "relatedTime" => $relatedTime, "options" => json_encode($json_options)); + $cache->set($key, $mc, 600); +} + +$app->render("related.html", $mc); diff --git a/view/search.php b/view/search.php new file mode 100644 index 00000000..1fc8eedc --- /dev/null +++ b/view/search.php @@ -0,0 +1,35 @@ +redirect("/search/".urlencode($_POST["searchbox"])."/"); + +if($search) +{ + $result = Info::findEntity($search); + + // if there is only one result, we redirect. + if(count($result) == 1) + { + $type = str_replace("ID", "", $result[0]["type"]); + $values = array_values($result[0]); + $id = $result[0]["id"]; + $app->redirect("/$type/$id/"); + die(); + } + + $entities = []; + foreach ($result as $row) + { + $entity = []; + $entity["type"] = str_replace("ID", "", $row["type"]); + $entity[$row["type"]] = $row["id"]; + $entity[$entity["type"] . "Name"] = $row["name"]; + if ($entity["type"] == "type") $entity["type"] = "item"; + if ($entity["type"] == "solarSystem") $entity["type"] = "system"; + $entities[] = $entity; + } + Info::addInfo($entities); +} + +$app->render("search.html", array("data" => $entities)); diff --git a/view/sitemap.php b/view/sitemap.php new file mode 100644 index 00000000..afe94191 --- /dev/null +++ b/view/sitemap.php @@ -0,0 +1,56 @@ + "https://map.zkillboard.com", + ); + +$data["kills"] = array( + "All Kills" => "", + "Big Kills" => "bigkills", + "Awox" => "awox", + "W-space" => "w-space", + "Solo" => "solo", + "5b+" => "5b", + "10b+" => "10b", + "Capitals" => "capitals", + "Freighters" => "freighters", + "Supers" => "supers", + "Dust - All Kills" => "dust", + "Dust - Vehicles" => "dust_vehicles", + ); + +$data["intel"] = array( + "Supers" => "supers", + ); + +$data["top"] = array( + "Last Hour" => "lasthour", + ); + +$data["ranks"] = array( + "Recent Kills" => "recent/killers", + "Recent Losers" => "recent/losers", + "Alltime Killers" => "alltime/killers", + "Alltime Losers" => "alltime/losers", + ); + +$data["post"] = array( + "Post Kills" => "", + ); + +$data["support"] = array( + "Tickets" => "/tickets/", + "Live Chat" => "/livechat", + ); + +$data["information"] = array( + "About" => "about", + "Killmails" => "killmails", + "Legal" => "legal", + "Payments" => "payments", + "API" => "https://neweden-dev.com/ZKillboard_API", + ); + +$app->render("sitemap.html", array("data" => $data)); diff --git a/view/tickets.php b/view/tickets.php new file mode 100644 index 00000000..3d8e3206 --- /dev/null +++ b/view/tickets.php @@ -0,0 +1,45 @@ + $ticket, ":email" => $email), 0); + if(!$check) + { + Db::execute("INSERT INTO zz_tickets (userid, name, email, tags, ticket) VALUES (:userid, :name, :email, :tags, :ticket)", array(":userid" => User::getUserID(), ":name" => $name, ":email" => $email, ":tags" => $tags, ":ticket" => $ticket)); + $id = Db::queryField("SELECT id FROM zz_tickets WHERE userid = :userid AND name = :name AND tags = :tags AND ticket = :ticket", "id", array(":userid" => User::getUserID(), ":name" => $name, ":tags" => $tags, ":ticket" => $ticket)); + global $baseAddr; + Log::irc("|g|New ticket from $name:|n| https://$baseAddr/moderator/tickets/$id/"); + $subject = "zKillboard Ticket"; + $message = "$name, you can find your ticket here, we will reply to your ticket asap. https://$baseAddr/tickets/view/$id/"; + Email::send($email, $subject, $message); + $app->redirect("/tickets/view/$id/"); + } + else + $message = array("type" => "error", "message" => "Ticket already posted"); + } + else + { + $message = array("type" => "error", "message" => "Ticket was not posted, there was an error"); + } +} + +$tickets = Db::query("SELECT * FROM zz_tickets WHERE userid = :userid ORDER BY datePosted DESC", array(":userid" => User::getUserID()), 0); +foreach($tickets as $key => $val) +{ + if($val["tags"]) + $tickets[$key]["tags"] = explode(",", $val["tags"]); +} + +$userInfo = User::getUserInfo(); +$app->render("tickets.html", array("userInfo" => $userInfo, "tickets" => $tickets, "message" => $message)); diff --git a/view/tickets_view.php b/view/tickets_view.php new file mode 100644 index 00000000..1689d32c --- /dev/null +++ b/view/tickets_view.php @@ -0,0 +1,36 @@ + $id), 0); +if($ticket == NULL or sizeof($ticket) == 0) $message = array("status" => "error", "message" => "Ticket does not exist."); +else if($ticket["status"] == 0) $message = array("status" => "error", "message" => "Ticket has been closed, you cannot post, only view it"); +else if($ticket["userid"] != $info["id"] && $info["moderator"] == 0 && $info["admin"] == 0) $app->notFound(); + +if($_POST) +{ + $reply = Util::getPost("reply"); + + if($reply && $ticket["status"] != 0) + { + $name = $info["username"]; + $moderator = $info["moderator"]; + $check = Db::query("SELECT * FROM zz_tickets_replies WHERE reply = :reply AND userid = :userid AND belongsTo = :id", array(":reply" => $reply, ":userid" => $info["id"], ":id" => $id), 0); + if(!$check) + { + Db::execute("INSERT INTO zz_tickets_replies (userid, belongsTo, name, reply, moderator) VALUES (:userid, :belongsTo, :name, :reply, :moderator)", array(":userid" => $info["id"], ":belongsTo" => $id, ":name" => $name, ":reply" => $reply, ":moderator" => $moderator)); + global $baseAddr; + if (!$moderator) Log::irc("|g|Ticket response from $name|n|: https://$baseAddr/moderator/tickets/$id/"); + $app->redirect("/tickets/view/$id/"); + exit(); + } + } + else + { + $message = array("status" => "error", "message" => "No..."); + } +} + +$replies = Db::query("SELECT * FROM zz_tickets_replies WHERE belongsTo = :id", array(":id" => $id), 0); + +$app->render("tickets_view.html", array("page" => $id, "message" => $message, "ticket" => $ticket, "replies" => $replies)); diff --git a/view/top.php b/view/top.php new file mode 100644 index 00000000..8ab6b2d4 --- /dev/null +++ b/view/top.php @@ -0,0 +1,48 @@ + 10, "kills" => true); + switch ($page) { + case "monthly": + $parameters["year"] = date("Y"); + $parameters["month"] = date("n"); + break; + case "weekly": + $parameters["year"] = date("Y"); + $parameters["week"] = date("W"); + break; + default: + die("Not supported yet."); + } + +$topLists = array(); +if($type == "kills") +{ + $topLists[] = array("type" => "character", "data" => Stats::getTopPilots($parameters, $alltime)); + $topLists[] = array("type" => "corporation", "data" => Stats::getTopCorps($parameters, $alltime)); + $topLists[] = array("type" => "alliance", "data" => Stats::getTopAllis($parameters, $alltime)); + $topLists[] = array("type" => "ship", "data" => Stats::getTopShips($parameters, $alltime)); + $topLists[] = array("type" => "system", "data" => Stats::getTopSystems($parameters, $alltime)); + //$topLists[] = array("type" => "weapon", "data" => Stats::getTopWeapons($parameters, $alltime)); + $parameters["!factionID"] = 0; + $topLists[] = array("name" => "Top Faction Characters", "type" => "character", "data" => Stats::getTopPilots($parameters, $alltime)); + $topLists[] = array("name" => "Top Faction Corporations", "type" => "corporation", "data" => Stats::getTopCorps($parameters, $alltime)); + $topLists[] = array("name" => "Top Faction Alliances", "type" => "alliance", "data" => Stats::getTopAllis($parameters, $alltime)); + +} +elseif($type == "points") +{ + $topLists[] = array("name" => "Top Character Points", "ranked" => "Points", "type" => "character", "data" => Stats::getTopPointsPilot($parameters)); + $topLists[] = array("name" => "Top Corporation Points", "ranked" => "Points", "type" => "corporation", "data" => Stats::getTopPointsCorp($parameters)); + $topLists[] = array("name" => "Top Alliance Points", "ranked" => "Points", "type" => "alliance", "data" => Stats::getTopPointsAlli($parameters)); + $parameters["!factionID"] = 0; + $topLists[] = array("name" => "Top Faction Character Points", "ranked" => "Points", "type" => "character", "data" => Stats::getTopPointsPilot($parameters)); + $topLists[] = array("name" => "Top Faction Corporation Points", "ranked" => "Points", "type" => "corporation", "data" => Stats::getTopPointsCorp($parameters)); + $topLists[] = array("name" => "Top Faction Alliance Points", "ranked" => "Points", "type" => "alliance", "data" => Stats::getTopPointsAlli($parameters)); + +} + +$app->render("top.html", array("topLists" => $topLists, "page" => $page, "type" => $type)); diff --git a/view/tracker.php b/view/tracker.php new file mode 100644 index 00000000..7ba6e303 --- /dev/null +++ b/view/tracker.php @@ -0,0 +1,82 @@ +render("error.html", array("message" => "Nothing to track, please add entities to the tracker from your account page.")); + return; +} + +GetNames("character", $names, UserConfig::get("tracker_character")); +GetNames("corporation", $names, UserConfig::get("tracker_corporation")); +GetNames("alliance", $names, UserConfig::get("tracker_alliance")); +GetNames("faction", $names, UserConfig::get("tracker_faction")); +GetNames("ship", $names, UserConfig::get("tracker_item")); +GetNames("systems", $names, UserConfig::get("tracker_system")); +GetNames("regions", $names, UserConfig::get("tracker_region")); + +$parameters["combined"] = true; +$limit = 50; +$parameters["limit"] = $limit; +$parameters["page"] = $page; + +$pageTitle = "Tracking"; + +$kills = Kills::getKills($parameters); + +// Flag losses as red +unset($parameters["limit"]); +unset($parameters["combined"]); +unset($parameters["page"]); +foreach($parameters as $columnName=>$ids) { + foreach($ids as $id) { + $z[] = $id; + $kills = Kills::mergeKillArrays($kills, array(), $limit, $columnName, $id); + } +} +$imp = implode(",", $z); +$st = []; +//Db::query("SELECT s.groupID AS groupID, SUM(s.destroyed) AS destroyed, SUM(s.lost) AS lost, SUM(s.pointsDestroyed) AS pointsDestroyed, SUM(s.pointsLost) AS pointsLost, SUM(s.iskDestroyed) AS iskDestroyed, SUM(s.iskLost) as iskLost, c.groupName AS groupName FROM zz_stats s JOIN ccp_invGroups c ON s.groupID = c.groupID WHERE s.typeID IN ($imp) GROUP BY s.groupID ORDER BY c.groupName"); +$cnt = 0; +$cnid = 0; +$stats = array(); +$totalcount = ceil(count($st) / 4); +foreach($st as $q) +{ + if($cnt == $totalcount) + { + $cnid++; + $cnt = 0; + } + $stats[$cnid][] = $q; + $cnt++; +} +$app->render("tracker.html", array("kills" => $kills, "pageTitle" => $pageTitle, "tracking" => $names, "page" => $page, "summaryTable" => $stats, "pager" => true)); + +function getIDs($filterName, &$ids, $array) { + if (is_null($array) || sizeof($array) == 0) return; + $filter = array(); + foreach ($array as $row) { + $filter[] = $row["id"]; + } + $ids[$filterName] = $filter; +} + +function getNames($filterName, &$names, $array) { + if (is_null($array) || sizeof($array) == 0) return; + $filter = array(); + foreach ($array as $row) { + $filter[] = $row["name"]; + } + $names[$filterName] = $filter; +} diff --git a/view/war.php b/view/war.php new file mode 100644 index 00000000..2f02dec5 --- /dev/null +++ b/view/war.php @@ -0,0 +1,48 @@ + $warID); +$kills = Kills::getKills($p); + +$topPods = array(); +$topIsk = array(); +$topPoints = array(); +$topKillers = array(); +$page = 1; +$pageTitle = "War $warID"; + +$p["kills"] = true; +if (!$warFinished) $p["pastSeconds"] = (7*86400); + +$top = array(); +$top[] = Info::doMakeCommon("Top Characters", "characterID", Stats::getTopPilots($p, $warFinished)); +$top[] = Info::doMakeCommon("Top Corporations", "corporationID", Stats::getTopCorps($p, $warFinished)); +$top[] = Info::doMakeCommon("Top Alliances", "allianceID", Stats::getTopAllis($p, $warFinished)); +$top[] = Info::doMakeCommon("Top Ships", "shipTypeID", Stats::getTopShips($p, $warFinished)); +$top[] = Info::doMakeCommon("Top Systems", "solarSystemID", Stats::getTopSystems($p, $warFinished)); + +$p["limit"] = 5; +$topIsk = array(); //Stats::getTopIsk($p); +unset($p["pastSeconds"]); +unset($p["kills"]); + +// get latest kills +$killsLimit = 50; +$p["limit"] = $killsLimit; +$preKills = Kills::getKills($p); +$kills = array(); +$agrID = $warData["aggressor"]["id"]; +$dfdID = $warData["defender"]["id"]; + +foreach($preKills as $kill) +{ + $victim = $kill["victim"]; + if (@$victim["corporationID"] == $dfdID || @$victim["allianceID"] == $dfdID) $kill["displayAsKill"] = true; + else $kill["displayAsLoss"] = true; + $kills[] = $kill; +} + +$app->render("index.html", array("war" => $warData, "wars" => array($warData), "topPods" => $topPods, "topIsk" => $topIsk, "topPoints" => $topPoints, "topKillers" => $top, "kills" => $kills, "page" => $page, "pageType" => "war", "pager" => false, "pageTitle" => $pageTitle)); diff --git a/view/wars.php b/view/wars.php new file mode 100644 index 00000000..50213ef3 --- /dev/null +++ b/view/wars.php @@ -0,0 +1,21 @@ + "Recent Declared Wars - Open to Allies", "wars" => $mdb->find("information", ['cacheTime' => 1800, 'type' => 'warID', 'openForAll25ies' => true], ['timeStarted' => -1], 50)]; +$wars[] = ["name" => "Recent Declared Wars - Mutual", "wars" => $mdb->find("information", ['cacheTime' => 1800, 'type' => 'warID', 'mutual' => true], ['timeStarted' => -1], 50)]; +$wars[] = ["name" => "Recently Declared Wars", "wars" => $mdb->find("information", ['cacheTime' => 1800, 'type' => 'warID'], ['timeStarted' => -1], 25)]; +$wars[] = ["name" => "Recently Finished Wars", "wars" => $mdb->find("information", ['cacheTime' => 1800, 'type' => 'warID'], ['timeFinished' => -1], 25)]; +//$wars[] = ["name" => "Recent Active Wars by Kills", "wars" => $mdb->find("information", ['type' => 'warID', 'timeStarted' => ['$gte' => $timeStarted]], ["aggressor.shipsKilled" => -1, "defender.shipsKilled" => -1], 10)]; +//$wars[] = ["name" => "Alltime Active Wars by Kills", "wars" => $mdb->find("information", ['type' => 'warID'] ,["aggressor.shipsKilled" => -1, "defender.shipsKilled" => -1], 10)]; +/*$wars[] = War::getNamedWars("Recent Active Wars by ISK", "select warID from zz_wars where timeStarted > date_sub(now(), interval 90 day) and timeFinished is null order by (agrIskKilled + dfdIskKilled) desc limit 10"); +$wars[] = War::getNamedWars("Alltime Active Wars by ISK", "select warID from zz_wars where timeFinished is null order by (agrIskKilled + dfdIskKilled) desc limit 10"); +$wars[] = War::getNamedWars("Recent Closed Wars by Kills", "select warID from zz_wars where timeStarted > date_sub(now(), interval 90 day) and timeFinished is not null order by (agrShipsKilled + dfdShipsKilled) desc limit 10"); +$wars[] = War::getNamedWars("Alltime Closed Wars by Kills", "select warID from zz_wars where timeFinished is not null order by (agrShipsKilled + dfdShipsKilled) desc limit 10"); +$wars[] = War::getNamedWars("Recent Closed Wars by ISK", "select warID from zz_wars where timeStarted > date_sub(now(), interval 90 day) and timeFinished is not null order by (agrIskKilled + dfdIskKilled) desc limit 10"); +$wars[] = War::getNamedWars("Alltime Closed Wars by ISK", "select warID from zz_wars where timeFinished is not null order by (agrIskKilled + dfdIskKilled) desc limit 10");*/ + +$app->render("wars.html", array("warTables" => $wars));