diff --git a/app/styles/play/ladder/ladder_tab.sass b/app/styles/play/ladder/ladder_tab.sass index d4878511a..6d65cc5a6 100644 --- a/app/styles/play/ladder/ladder_tab.sass +++ b/app/styles/play/ladder/ladder_tab.sass @@ -3,4 +3,40 @@ max-width: 150px white-space: nowrap overflow: hidden - text-overflow: ellipsis \ No newline at end of file + text-overflow: ellipsis + + .bar rect + fill: steelblue + shape-rendering: crispEdges + + .bar text + fill: #fff + + .specialbar rect + fill: #555555 + + + .axis path, .axis line + fill: none + stroke: #555555 + shape-rendering: crispEdges + + .humans-bar + fill: #bf3f3f + shape-rendering: crispEdges + .ogres-bar + fill: #3f44bf + shape-rendering: crispEdges + text + fill: #555555 + + .rank-text + font-size: 15px + fill: #555555 + + .humans-rank-text + fill: #bf3f3f + + .ogres-rank-text + fill: #3f44bf + \ No newline at end of file diff --git a/app/styles/play/ladder/my_matches_tab.sass b/app/styles/play/ladder/my_matches_tab.sass index 3483dcf38..a68f12225 100644 --- a/app/styles/play/ladder/my_matches_tab.sass +++ b/app/styles/play/ladder/my_matches_tab.sass @@ -1,7 +1,7 @@ #my-matches-tab-view .axis path, .axis line fill: none - stroke: #000 + stroke: #555 shape-rendering: crispEdges .x.axis.path display: none @@ -10,4 +10,20 @@ fill: none stroke: steelblue stroke-width: 1.5px + + .humans-line + fill: none + stroke: #bf3f3f + stroke-width: 1.5px + + .ogres-line + fill: none + stroke: #3f44bf + stroke-width: 1.5px + .axis text + stroke: none + fill: #555555 + shape-rendering: crispEdges + + \ No newline at end of file diff --git a/app/templates/account/profile.jade b/app/templates/account/profile.jade index 7cd6d0750..65dc9786b 100644 --- a/app/templates/account/profile.jade +++ b/app/templates/account/profile.jade @@ -16,7 +16,7 @@ block content else span(data-i18n="account_profile.profile") Profile - if loading + if loadingProfile p(data-i18n="common.loading") Loading... else if !user.get('emailHash') diff --git a/app/views/account/profile_view.coffee b/app/views/account/profile_view.coffee index 32faec138..f61f7f1e2 100644 --- a/app/views/account/profile_view.coffee +++ b/app/views/account/profile_view.coffee @@ -5,21 +5,21 @@ User = require 'models/User' module.exports = class ProfileView extends View id: "profile-view" template: template - loading: true + loadingProfile: true constructor: (options, @userID) -> super options @user = User.getByID(@userID) - @loading = false if 'gravatarProfile' of @user + @loadingProfile = false if 'gravatarProfile' of @user @listenTo(@user, 'change', @userChanged) @listenTo(@user, 'error', @userError) userChanged: (user) -> - @loading = false if 'gravatarProfile' of user + @loadingProfile = false if 'gravatarProfile' of user @render() userError: (user) -> - @loading = false + @loadingProfile = false @render() getRenderData: -> @@ -28,7 +28,7 @@ module.exports = class ProfileView extends View grav = grav.entry[0] if grav addedContext = user: @user - loading: @loading + loadingProfile: @loadingProfile myProfile: @user.id is context.me.id grav: grav photoURL: @user.getPhotoURL() diff --git a/app/views/play/ladder/ladder_tab.coffee b/app/views/play/ladder/ladder_tab.coffee index ae8c92259..b9fddcf38 100644 --- a/app/views/play/ladder/ladder_tab.coffee +++ b/app/views/play/ladder/ladder_tab.coffee @@ -40,19 +40,19 @@ module.exports = class LadderTabView extends CocoView checkFriends: -> return if @checked or (not window.FB) or (not window.gapi) - @somethingLoaded("social_network_apis") @checked = true @addSomethingToLoad("facebook_status") FB.getLoginStatus (response) => @facebookStatus = response.status - @somethingLoaded("facebook_status") @loadFacebookFriends() if @facebookStatus is 'connected' + @somethingLoaded("facebook_status") if application.gplusHandler.loggedIn is undefined @listenToOnce(application.gplusHandler, 'checked-state', @gplusSessionStateLoaded) else @gplusSessionStateLoaded() + @somethingLoaded("social_network_apis") # FACEBOOK @@ -67,10 +67,10 @@ module.exports = class LadderTabView extends CocoView FB.api '/me/friends', @onFacebookFriendsLoaded onFacebookFriendsLoaded: (response) => - @somethingLoaded("facebook_friends") @facebookData = response.data @loadFacebookFriendSessions() - + @somethingLoaded("facebook_friends") + loadFacebookFriendSessions: -> levelFrag = "#{@level.get('original')}.#{@level.get('version').major}" url = "/db/level/#{levelFrag}/leaderboard_facebook_friends" @@ -105,10 +105,10 @@ module.exports = class LadderTabView extends CocoView application.gplusHandler.loadFriends @gplusFriendsLoaded gplusFriendsLoaded: (friends) => - @somethingLoaded("gplus_friends") @gplusData = friends.items @loadGPlusFriendSessions() - + @somethingLoaded("gplus_friends") + loadGPlusFriendSessions: -> levelFrag = "#{@level.get('original')}.#{@level.get('version').major}" url = "/db/level/#{levelFrag}/leaderboard_gplus_friends" @@ -135,8 +135,21 @@ module.exports = class LadderTabView extends CocoView @leaderboards[team.id]?.destroy() teamSession = _.find @sessions.models, (session) -> session.get('team') is team.id @leaderboards[team.id] = new LeaderboardData(@level, team.id, teamSession) + @addResourceToLoad @leaderboards[team.id], 'leaderboard', 3 + render: -> + super() + + @$el.find('.histogram-display').each (i, el) => + histogramWrapper = $(el) + team = _.find @teams, name: histogramWrapper.data('team-name') + histogramData = null + $.when( + $.get("/db/level/#{@level.get('slug')}/histogram_data?team=#{team.name.toLowerCase()}", (data) -> histogramData = data) + ).then => + @generateHistogram(histogramWrapper, histogramData, team.name.toLowerCase()) + getRenderData: -> ctx = super() ctx.level = @level @@ -149,6 +162,82 @@ module.exports = class LadderTabView extends CocoView ctx.onGPlus = application.gplusHandler.loggedIn ctx + generateHistogram: (histogramElement, histogramData, teamName) -> + #renders twice, hack fix + if $("#"+histogramElement.attr("id")).has("svg").length then return + histogramData = histogramData.map (d) -> d*100 + + margin = + top: 20 + right: 20 + bottom: 30 + left: 0 + + width = 300 - margin.left - margin.right + height = 125 - margin.top - margin.bottom + + formatCount = d3.format(",.0") + + x = d3.scale.linear().domain([-3000,6000]).range([0,width]) + + data = d3.layout.histogram().bins(x.ticks(20))(histogramData) + y = d3.scale.linear().domain([0,d3.max(data, (d) -> d.y)]).range([height,0]) + + #create the x axis + xAxis = d3.svg.axis().scale(x).orient("bottom").ticks(5).outerTickSize(0) + + svg = d3.select("#"+histogramElement.attr("id")).append("svg") + .attr("width", width + margin.left + margin.right) + .attr("height", height + margin.top + margin.bottom) + .append("g") + .attr("transform","translate(#{margin.left},#{margin.top})") + barClass = "bar" + if teamName.toLowerCase() is "ogres" then barClass = "ogres-bar" + if teamName.toLowerCase() is "humans" then barClass = "humans-bar" + + bar = svg.selectAll(".bar") + .data(data) + .enter().append("g") + .attr("class",barClass) + .attr("transform", (d) -> "translate(#{x(d.x)},#{y(d.y)})") + + bar.append("rect") + .attr("x",1) + .attr("width",width/20) + .attr("height", (d) -> height - y(d.y)) + if @leaderboards[teamName].session? + playerScore = @leaderboards[teamName].session.get('totalScore') * 100 + scorebar = svg.selectAll(".specialbar") + .data([playerScore]) + .enter().append("g") + .attr("class","specialbar") + .attr("transform", "translate(#{x(playerScore)},#{y(9001)})") + + scorebar.append("rect") + .attr("x",1) + .attr("width",3) + .attr("height",height - y(9001)) + rankClass = "rank-text" + if teamName.toLowerCase() is "ogres" then rankClass = "rank-text ogres-rank-text" + if teamName.toLowerCase() is "humans" then rankClass = "rank-text humans-rank-text" + + message = "#{histogramData.length} players" + if @leaderboards[teamName].session? then message="#{@leaderboards[teamName].myRank}/#{histogramData.length}" + svg.append("g") + .append("text") + .attr("class",rankClass) + .attr("y",0) + .attr("text-anchor","end") + .attr("x",width) + .text(message) + + #Translate the x-axis up + svg.append("g") + .attr("class", "x axis") + .attr("transform","translate(0," + height + ")") + .call(xAxis) + + consolidateFriends: -> allFriendSessions = (@facebookFriendSessions or []).concat(@gplusFriendSessions or []) sessions = _.uniq allFriendSessions, false, (session) -> session._id @@ -213,4 +302,4 @@ class LeaderboardData extends CocoClass allResources: -> resources = [@topPlayers, @playersAbove, @playersBelow] - return (r for r in resources when r) \ No newline at end of file + return (r for r in resources when r) diff --git a/app/views/play/ladder/my_matches_tab.coffee b/app/views/play/ladder/my_matches_tab.coffee index 94e4f4731..e3f0fc62a 100644 --- a/app/views/play/ladder/my_matches_tab.coffee +++ b/app/views/play/ladder/my_matches_tab.coffee @@ -117,12 +117,10 @@ module.exports = class MyMatchesTabView extends CocoView @$el.find('.score-chart-wrapper').each (i, el) => scoreWrapper = $(el) team = _.find @teams, name: scoreWrapper.data('team-name') - @generateScoreLineChart(scoreWrapper.attr('id'), team.scoreHistory) + @generateScoreLineChart(scoreWrapper.attr('id'), team.scoreHistory, team.name) - generateScoreLineChart: (wrapperID, scoreHistory) => - - + generateScoreLineChart: (wrapperID, scoreHistory,teamName) => margin = top: 20 right: 20 @@ -167,10 +165,12 @@ module.exports = class MyMatchesTabView extends CocoView .attr("dy", ".75em") .style("text-anchor","end") .text("Score") - + lineClass = "line" + if teamName.toLowerCase() is "ogres" then lineClass = "ogres-line" + if teamName.toLowerCase() is "humans" then lineClass = "humans-line" svg.append("path") .datum(data) - .attr("class","line") + .attr("class",lineClass) .attr("d",line) diff --git a/scripts/windows/coco-dev-setup/batch/scripts/get_category.bat b/scripts/windows/coco-dev-setup/batch/scripts/get_category.bat new file mode 100755 index 000000000..44384806f --- /dev/null +++ b/scripts/windows/coco-dev-setup/batch/scripts/get_category.bat @@ -0,0 +1,3 @@ +for /f "delims=" %%a in ('..\\utilities\\get_category.exe %*') do ( + %%a +) \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/last_step_succesfull/config.coco b/scripts/windows/coco-dev-setup/last_step_succesfull/config.coco new file mode 100755 index 000000000..ae8c66f56 --- /dev/null +++ b/scripts/windows/coco-dev-setup/last_step_succesfull/config.coco @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="ISO-8859-1" ?> +<variables> + <version>1.0</version> + <author>GlenDC</author> + <copyright>CodeCombat.com � 2013-2014</copyright> +</variables> \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/last_step_succesfull/downloads.coco b/scripts/windows/coco-dev-setup/last_step_succesfull/downloads.coco new file mode 100755 index 000000000..2a0472c41 --- /dev/null +++ b/scripts/windows/coco-dev-setup/last_step_succesfull/downloads.coco @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="ISO-8859-1" ?> +<variables> + <general> + <b32> + <nodejs>http://nodejs.org/dist/v0.10.25/node-v0.10.25-x86.msi</nodejs> + <ruby>http://dl.bintray.com/oneclick/rubyinstaller/rubyinstaller-2.0.0-p353.exe?direct</ruby> + <python>http://www.python.org/ftp/python/2.7.6/python-2.7.6.msi</python> + </b32> + <b64> + <nodejs>http://nodejs.org/dist/v0.10.25/x64/node-v0.10.25-x64.msi</nodejs> + <ruby>http://dl.bintray.com/oneclick/rubyinstaller/rubyinstaller-2.0.0-p353-x64.exe?direct</ruby> + <python>http://www.python.org/ftp/python/2.7.6/python-2.7.6.amd64.msi</python> + </b64> + <gitbash>https://msysgit.googlecode.com/files/Git-1.8.5.2-preview20131230.exe</gitbash> + </general> + <win7> + <b32>mongodb=http://fastdl.mongodb.org/win32/mongodb-win32-i386-2.5.4.zip</b32> + <b64>mongodb=http://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-2.5.4.zip</b64> + </win7> + <vista> + <b32>mongodb=http://fastdl.mongodb.org/win32/mongodb-win32-i386-2.5.4.zip</b32> + <b64>mongodb=http://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2.5.4.zip</b64> + </vista> +</variables> \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/last_step_succesfull/en.coco b/scripts/windows/coco-dev-setup/last_step_succesfull/en.coco new file mode 100755 index 000000000..a2e1f9fca --- /dev/null +++ b/scripts/windows/coco-dev-setup/last_step_succesfull/en.coco @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="ISO-8859-1" ?> +<variables> + <global> + <native>English</native> + <bye>Bye Bye!</bye> + </global> + <install> + <begin>Installation has begun, this can take a while... Please stay tuned...</begin> + <close>Don't close any windows please, unless specified explicitly.</close> + </install> + <dai> + <title>[DOWNLOADING AND INSTALLING 3RD PARTY SOFTWARE]</title> + <downloading>downloading:</downloading> + <installing>installing:</installing> + <cancel>Download and Installation cancelled...</cancel> + <software>Software has been installed...</software> + <devenv>Installation of the Developers Environment is complete!</devenv> + <stop>Installation has been stopped...</stop> + <unpacking>unpacking and moving:</unpacking> + <bower>Installing bower, brunch, nodemon and sendwithus...</bower> + </dai> + <git> + <stored>CodeCombat is safely stored on a git repository.</stored> + <clapp>Therefore you need a git command-line application (Git-bash).</clapp> + <examples>Examples: git-bash, CygWin, ...</examples> + <question>Do you already have git-bash?</question> + <path>Enter the path to where you installed Git-bash</path> + <checkout>Checking out the Git Repository...</checkout> + <username>Please enter your github username:</username> + </git> + <nodejs> + <question>Do you already have the latest version of node-js installed?</question> + <path>Please enter the full path of the location you installed nodejs to:</path> + </nodejs> + <ruby> + <question>Do you already have the latest version of ruby installed?</question> + </ruby> + <mongodb> + <question>Do you already have the latest version of mongo-db installed?</question> + <path>Enter the path where you would like to install MongoDB:</path> + </mongodb> + <python> + <question>Do you already have the latest version of python installed?</question> + </python> + <error> + <xp>Sadly we can't support Windows XP... Please upgrade your OS!</xp> + <os>Machine OS cannot be determined...</os> + <osreport>Report your OS to the developers @ CodeCombat.com...</osreport> + <nocleaning>... Cleaning up has been disabled... Terminating Script!</nocleaning> + <git_app_path>The path to your git application is incorrect, please try again...</git_app_path> + <invalid_path>The path you entered is invalid, please try again...</invalid_path> + </error> +</variables> \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/last_step_succesfull/get_config.bat b/scripts/windows/coco-dev-setup/last_step_succesfull/get_config.bat new file mode 100755 index 000000000..3849e22c2 --- /dev/null +++ b/scripts/windows/coco-dev-setup/last_step_succesfull/get_config.bat @@ -0,0 +1,3 @@ +powershell .\get_var.ps1 config.coco %1 > var.tmp +set /p %1= < var.tmp +del /q var.tmp \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/last_step_succesfull/get_download.bat b/scripts/windows/coco-dev-setup/last_step_succesfull/get_download.bat new file mode 100755 index 000000000..fde3799e3 --- /dev/null +++ b/scripts/windows/coco-dev-setup/last_step_succesfull/get_download.bat @@ -0,0 +1,4 @@ +@ECHO off +powershell .\get_var.ps1 downloads.coco %2 %3 %4 %5 %6 > var.tmp +set /p %1= < var.tmp +del /q var.tmp \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/last_step_succesfull/get_text.bat b/scripts/windows/coco-dev-setup/last_step_succesfull/get_text.bat new file mode 100755 index 000000000..5cae1d431 --- /dev/null +++ b/scripts/windows/coco-dev-setup/last_step_succesfull/get_text.bat @@ -0,0 +1,4 @@ +@ECHO off +powershell .\get_var.ps1 %1.coco %3 %4 %5 %6 %7 > var.tmp +set /p %2= < var.tmp +del /q var.tmp \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/last_step_succesfull/get_var.ps1 b/scripts/windows/coco-dev-setup/last_step_succesfull/get_var.ps1 new file mode 100755 index 000000000..77573929f --- /dev/null +++ b/scripts/windows/coco-dev-setup/last_step_succesfull/get_var.ps1 @@ -0,0 +1,17 @@ +$xml_file = [xml](get-content $args[0]) +if($args.count -eq 2) +{ + $xml_file.variables.($args[1]) +} +elseif($args.count -eq 3) +{ + $xml_file.variables.($args[1]).($args[2]) +} +elseif($args.count -eq 4) +{ + $xml_file.variables.($args[1]).($args[2]).($args[3]) +} +elseif($args.count -eq 5) +{ + $xml_file.variables.($args[1]).($args[2]).($args[3]).($args[4]) +} \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/last_step_succesfull/run_script.bat b/scripts/windows/coco-dev-setup/last_step_succesfull/run_script.bat new file mode 100755 index 000000000..dfc6e6cc0 --- /dev/null +++ b/scripts/windows/coco-dev-setup/last_step_succesfull/run_script.bat @@ -0,0 +1,2 @@ +@echo off +powershell "& "%*" \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/src/get_category.cpp b/scripts/windows/coco-dev-setup/src/get_category.cpp new file mode 100755 index 000000000..971c3aefb --- /dev/null +++ b/scripts/windows/coco-dev-setup/src/get_category.cpp @@ -0,0 +1,146 @@ +#include "stdafx.h" +#include <iostream> +#include <fstream> +#include <vector> +#include <sstream> +#include <string> + +#define tstring std::wstring +#define tcout std::wcout + +static const tstring DEF_URL = L"http://www.google.com"; + +int ErrorReport(const tstring & str, int value = 0) +{ + tcout << str.c_str(); + return value; +} + +void GetHashInfo(tstring id, std::vector<std::wstring> & info) { + while(id.size() > 0) + { + size_t pos = id.find(L'-'); + + tstring substr = + id.substr(0, pos == tstring::npos ? id.length() : pos); + info.push_back(substr); + + if(pos == tstring::npos) id = L""; + else + { + ++pos; + id = id.substr(pos, id.length() - pos); + } + } +} + +void SetArrayVariable( + const tstring & name, + int id, + const tstring & line + ) +{ + tcout << L"set \""; + tcout << name; + tcout << L"[" << id << "]"; + tcout << L"=" << line; + tcout << L"\"" << std::endl; +} + +void FillArray( + const std::vector<tstring> & info, + const tstring & name, + const tstring & id_array_name, + const tstring & file, + int & id + ) +{ + if(info.size() == 0) return; + + auto it = info.begin(); + size_t indention = 0; + unsigned int nlc = 0; + + std::wifstream infile(file.c_str(), std::ifstream::in); + + if(!infile) + { + #ifdef _DEBUG + tcout << file.c_str() << std::endl; + tcout << strerror(errno) << std::endl; + #endif + return; + } + + tstring line; + int counter = 1; + while (std::getline(infile, line)) + { + size_t cpos = line.find('['); + if(cpos == tstring::npos) + { + cpos = line.find_first_not_of(L" \t\r\n"); + } + if(nlc++ == 0 || cpos == indention) + { + indention = cpos; + if(it == info.end()) + { + size_t pos = line.find(L'=') + 1; + SetArrayVariable( + name, id, + line.substr(pos, line.size() - pos) + ); + SetArrayVariable( + id_array_name, id++, + line.substr(cpos, pos - 3) + ); + ++counter; + } + else if(line.find(*it) != tstring::npos) + { + ++it; + nlc = 0; + } + } + else if(counter > 1) + { + return; + } + } + + infile.close(); + return; +} + +int _tmain(int argc, _TCHAR* argv[]) +{ + if(argc == 1) + return ErrorReport(L"Please specify a localisation file."); + else if(argc == 2) + return ErrorReport(L"Please specify the name of the array."); + else if(argc == 3) + return ErrorReport(L"Please specify the name of the name-array."); + else if(argc == 4) + return ErrorReport(L"Please specify the counter parameter."); + else if(argc == 5) + return ErrorReport(L"Please specify one or more categories you are looking for."); + + tstring file, name, counter_name, id_array_name; + file = argv[1]; + name = argv[2]; + id_array_name = argv[3]; + counter_name = argv[4]; + int id = 1; + + for(int i = 5 ; i < argc ; ++i) + { + std::vector<tstring> information; + GetHashInfo(argv[i], information); + FillArray(information, name, id_array_name, file, id); + } + + tcout << L"set \"" << counter_name << L"=" << (id - 1) << L"\""; + + return 0; +} diff --git a/scripts/windows/coco-dev-setup/src/get_extension.cpp b/scripts/windows/coco-dev-setup/src/get_extension.cpp new file mode 100755 index 000000000..f311ac93f --- /dev/null +++ b/scripts/windows/coco-dev-setup/src/get_extension.cpp @@ -0,0 +1,36 @@ +#include "stdafx.h" +#include <iostream> +#include <fstream> +#include <vector> +#include <sstream> +#include <string> + +#define tstring std::wstring +#define tcout std::wcout + +int ErrorReport(const tstring & str, int value = 0) +{ + tcout << str.c_str(); + return value; +} + +int _tmain(int argc, _TCHAR* argv[]) +{ + if(argc == 1) + return ErrorReport(L"Please specify a download URL."); + if(argc == 2) + return ErrorReport(L"Please specify a name for your variable."); + + tstring url, name, extension; + url = argv[1]; + name = argv[2]; + + if(url.find(L"exe") != tstring::npos) extension = L"exe"; + else if(url.find(L"msi") != tstring::npos) extension = L"msi"; + else if(url.find(L"zip") != tstring::npos) extension = L"zip"; + + tcout << L"set \"" << name << L"="; + tcout << extension << L"\""; + + return 0; +} \ No newline at end of file diff --git a/scripts/windows/coco-dev-setup/src/get_var.cpp b/scripts/windows/coco-dev-setup/src/get_var.cpp new file mode 100755 index 000000000..e69b0be1c --- /dev/null +++ b/scripts/windows/coco-dev-setup/src/get_var.cpp @@ -0,0 +1,108 @@ +#include "stdafx.h" +#include <iostream> +#include <fstream> +#include <vector> +#include <sstream> +#include <string> + +#define tstring std::wstring +#define tcout std::wcout + +static const tstring DEF_URL = L"http://www.google.com"; + +int ErrorReport(const tstring & str, int value = 0) +{ + tcout << str.c_str(); + return value; +} + +void GetHashInfo(tstring id, std::vector<std::wstring> & info) { + while(id.size() > 0) + { + size_t pos = id.find(L'-'); + + tstring substr = + id.substr(0, pos == tstring::npos ? id.length() : pos); + info.push_back(substr); + + if(pos == tstring::npos) id = L""; + else + { + ++pos; + id = id.substr(pos, id.length() - pos); + } + } +} + +std::wstring GetText(const std::vector<tstring> & info, const tstring & file) +{ + if(info.size() == 0) return L"Info Size is 0."; + + auto it = info.begin(); + auto last = info.end() - 1; + size_t indention = 0; + unsigned int nlc = 0; + + std::wifstream infile(file.c_str(), std::ifstream::in); + + if(!infile) + { + #ifdef _DEBUG + tcout << file.c_str() << std::endl; + tcout << strerror(errno) << std::endl; + #endif + return L"File couldn't be opened."; + } + + tstring line; + while (std::getline(infile, line)) + { + size_t cpos = line.find('['); + if(nlc++ == 0 || cpos == indention) + { + indention = cpos; + if(line.find(*it) != tstring::npos) + { + if(it == last) + { + size_t pos = line.find(L'=') + 1; + infile.close(); + return line.substr(pos, line.size() - pos); + } + else + { + ++it; + nlc = 0; + } + } + } + } + + infile.close(); + return L"Var couldn't be found."; +} + +int _tmain(int argc, _TCHAR* argv[]) +{ + if(argc == 1) + return ErrorReport(L"Please specify a localisation file."); + else if(argc == 2) + return ErrorReport(L"Please specify the ID you are looking for."); + + tstring file, hash; + file = argv[1]; + hash = argv[2]; + + std::vector<tstring> information; + GetHashInfo(hash, information); + + size_t size = information.size(); + for(unsigned int i = 0 ; i < size ; ++i) + { + tcout << information[i]; + if(i != size - 1) tcout << L"_"; + } + tcout << L"=" << GetText(information, file); + + return 0; +} diff --git a/server/levels/level_handler.coffee b/server/levels/level_handler.coffee index c58738d20..ad26fe0e1 100644 --- a/server/levels/level_handler.coffee +++ b/server/levels/level_handler.coffee @@ -36,6 +36,7 @@ LevelHandler = class LevelHandler extends Handler return @getRandomSessionPair(req,res,args[0]) if args[1] is 'random_session_pair' return @getLeaderboardFacebookFriends(req, res, args[0]) if args[1] is 'leaderboard_facebook_friends' return @getLeaderboardGPlusFriends(req, res, args[0]) if args[1] is 'leaderboard_gplus_friends' + return @getHistogramData(req, res, args[0]) if args[1] is 'histogram_data' return @sendNotFoundError(res) @@ -118,6 +119,18 @@ LevelHandler = class LevelHandler extends Handler query = Session.find(sessionQuery).select('-screenshot') query.exec (err, results) => if err then @sendDatabaseError(res, err) else @sendSuccess res, results + + getHistogramData: (req, res,slug) -> + query = Session.aggregate [ + {$match: {"levelID":slug, "submitted": true, "team":req.query.team}} + {$project: {totalScore: 1, _id: 0}} + ] + + query.exec (err, data) => + if err? then return @sendDatabaseError res, err + valueArray = _.pluck data, "totalScore" + @sendSuccess res, valueArray + getLeaderboard: (req, res, id) -> sessionsQueryParameters = @makeLeaderboardQueryParameters(req, id)