summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/models/match.rb72
-rw-r--r--app/views/common/_show_tournament.html.erb6
-rw-r--r--app/views/pms/index.html.erb69
-rw-r--r--app/views/pms/show.html.erb1
-rw-r--r--app/views/tournaments/_form.html.erb1
-rw-r--r--db/seeds.rb11
-rwxr-xr-xgenerate.sh4
-rw-r--r--lib/sampling/README.md30
-rw-r--r--lib/sampling/manual.html.erb1
-rw-r--r--lib/sampling/manual.rb21
-rw-r--r--lib/sampling/peer_review.rb20
-rw-r--r--lib/sampling/riot_api.rb35
-rw-r--r--lib/scheduling/README.md4
-rw-r--r--lib/scoring/README.md4
14 files changed, 214 insertions, 65 deletions
diff --git a/app/models/match.rb b/app/models/match.rb
index d4c0ce5..3cbe0da 100644
--- a/app/models/match.rb
+++ b/app/models/match.rb
@@ -12,6 +12,7 @@ class Match < ActiveRecord::Base
ok = true
tournament_stage.scoring_method.stats_needed.each do |stat|
ok &= statistics.where(match: self, name: stat).nil?
+ end
ok
end
@@ -19,15 +20,76 @@ class Match < ActiveRecord::Base
winner.players.include? player
end
- def handle_sampling(params)
- # TODO
+ def users
+ ret = []
+ self.teams.each{|t| ret.concat(t.users)}
+ return ret
+ end
+
+ def stats_from(sampling_class)
+ figure_sampling_methods.map{|stat,klass| (sampling_class==klass) ? stat : nil}.select{|s| not s.nil?}
+ end
+
+ def handle_sampling(user, params)
+ method_classes.each do |klass|
+ klass.new(self).handle_user_interaction(user, params)
+ end
end
def render_sampling(user)
- # TODO
+ require 'set'
+ html = ''
+
+ method_classes.each do |klass|
+ html += '<div>'
+ html += klass.new(self).render_user_interaction(user)
+ html += '</div>'
+ end
+
+ return html.html_safe
end
- def finished?
- # TODO
+ private
+ def figure_sampling_methods
+ if @sampling_methods.nil?
+ data = {}
+ needed = self.tournament_stage.scoring.stats_needed
+ methods_names = self.tournament_stage.tournament.sampling_methods
+ methods_names.each do |method_name|
+ method_class = "Sampling::#{sampling_name.camelcase}".constantize
+ if method_class.works_with(self.tournament_stage.tournament.game)
+ needed.each do |stat|
+ data[stat] ||= {}
+ data[stat][method] = method.can_get?(user, stat)
+ end
+ end
+ end
+
+ needed.each do |stat|
+ max_val = nil
+ max_pri = 0
+ data[stat].each do |method,priority|
+ if priority > max_pri
+ max_val = method
+ max_pri = priority
+ end
+ end
+ data[stat] = max_val
+ end
+ @sampling_methods = data
+ end
+ return @sampling_methods
end
+
+ def method_classes
+ if @method_classes.nil?
+ data = Set.new
+ figure_sampling_methods.each do |stat,method|
+ data.push(method)
+ end
+ @method_classes = data
+ end
+ return @method_classes
+ end
+
end
diff --git a/app/views/common/_show_tournament.html.erb b/app/views/common/_show_tournament.html.erb
index 151e5d2..12a7fea 100644
--- a/app/views/common/_show_tournament.html.erb
+++ b/app/views/common/_show_tournament.html.erb
@@ -33,8 +33,10 @@
<% else %>
<p style="margin-top:10px;"> You've signed up for this tournament! </p>
<% end %>
- <%= form_tag(tournament_brackets_path(target), method: "post") do %>
- <%= submit_tag("Make Bracket") %>
+ <% if target.status == 1 %>
+ <%= form_tag(tournament_brackets_path(target), method: "post") do %>
+ <%= submit_tag("Make Bracket") %>
+ <% end %>
<% end %>
<% end %>
</div>
diff --git a/app/views/pms/index.html.erb b/app/views/pms/index.html.erb
index 056b371..fec6db2 100644
--- a/app/views/pms/index.html.erb
+++ b/app/views/pms/index.html.erb
@@ -23,6 +23,9 @@
<% if conversation.is_unread?(current_user) && receipts.last.message.sender != current_user %>
<% message = receipts.last.message %>
<tr>
+ <% if conversation.subject == "Pay Attention!" %>
+ <% conversation.mark_as_read(current_user) %>
+ <% end %>
<td>
<% people = conversation.participants %>
<% people.each do |person| %>
@@ -65,17 +68,63 @@
<% if conversation.is_read?(current_user) || receipts.last.message.sender == current_user %>
<% message = receipts.last.message %>
<tr>
- <td>
- <% people = conversation.participants %>
- <% people.each do |person| %>
- <% unless person == current_user %>
- <%= truncate(person.user_name, length: 20) %>
+ <% if conversation.subject != "Pay Attention!" %>
+ <td>
+ <% people = conversation.participants %>
+ <% people.each do |person| %>
+ <% unless person == current_user %>
+ <%= truncate(person.user_name, length: 20) %>
+ <% end %>
<% end %>
- <% end %>
- </td>
- <td><%= truncate(conversation.subject, length: 30) %></td>
- <td><%= truncate(message.body, length: 42) %></td>
- <td><%= link_to 'View', @pms.find_by(conversation: conversation) %></td>
+ </td>
+ <td><%= truncate(conversation.subject, length: 30) %></td>
+ <td><%= truncate(message.body, length: 42) %></td>
+ <td><%= link_to 'View', @pms.find_by(conversation: conversation) %></td>
+ <% end %>
+ </tr>
+ <% end %>
+ <% end %>
+ </tr>
+ <% #else %>
+
+ <% #end %>
+ </tbody>
+</table>
+
+<br>
+<h3>Alerts</h3>
+<% conversations = current_user.mailbox.conversations %>
+
+<table>
+ <col width="150">
+ <col width="250">
+ <col width="300">
+ <tbody>
+ <%# if conversations.reject { |c| c.is_read?(current_user) || (c.receipts_for current_user).last.message.sender == current_user }.empty? %>
+ <tr>
+ <tr>
+ <td><b>With</b></td>
+ <td><b>Subject</b></td>
+ <td><b>Body</b></td>
+ </tr>
+ <% conversations.each do |conversation| %>
+ <% receipts = conversation.receipts_for current_user %>
+ <% if conversation.is_read?(current_user) || receipts.last.message.sender == current_user %>
+ <% message = receipts.last.message %>
+ <tr>
+ <% if conversation.subject == "Pay Attention!" %>
+ <td>
+ <% people = conversation.participants %>
+ <% people.each do |person| %>
+ <% unless person == current_user %>
+ <%= truncate(person.user_name, length: 20) %>
+ <% end %>
+ <% end %>
+ </td>
+ <td><%= truncate(conversation.subject, length: 30) %></td>
+ <td><%= truncate(message.body, length: 42) %></td>
+ <td><%= link_to 'View', @pms.find_by(conversation: conversation) %></td>
+ <% end %>
</tr>
<% end %>
<% end %>
diff --git a/app/views/pms/show.html.erb b/app/views/pms/show.html.erb
index ca8d9bf..2c93102 100644
--- a/app/views/pms/show.html.erb
+++ b/app/views/pms/show.html.erb
@@ -31,6 +31,7 @@
<p> ________________________________________________ </p>
<p>
+ <% @pm.message = "" %>
<%= form_for(@pm) do |f| %>
<div class="field">
<%= f.text_area :message %>
diff --git a/app/views/tournaments/_form.html.erb b/app/views/tournaments/_form.html.erb
index 2a871ea..a5eba7a 100644
--- a/app/views/tournaments/_form.html.erb
+++ b/app/views/tournaments/_form.html.erb
@@ -17,6 +17,7 @@
</fieldset>
<% else %>
<%= form_for(@tournament, url: tournaments_path, method: "post") do |f| %>
+ <%= f.hidden_field(:game_id) %>
<p>
<%= f.label :name %>
<%= f.text_field :name %>
diff --git a/db/seeds.rb b/db/seeds.rb
index a66cc4b..ea0338d 100644
--- a/db/seeds.rb
+++ b/db/seeds.rb
@@ -95,6 +95,7 @@ if Rails.env.development?
rps = Tournament.create(game_id: 4, status: 0, name: "Rock, Paper, Scissors Seed", min_players_per_team: 1, max_players_per_team: 3, min_teams_per_match: 2,
max_teams_per_match: 2, sampling_method: "manual")
+ rps.stages.create(scheduling_method: "elimination" , seeding_method: "random_seeding")
rps.hosts.push(davis)
rps.join(davis)
rps.join(foy)
@@ -109,6 +110,7 @@ if Rails.env.development?
end
tourn5.join(players_for_league[i])
end
+ tourn5.stages.create(scheduling_method: "elimination" , seeding_method: "random_seeding")
tourn5.join(players_for_league[9])
tourn6 = Tournament.create(game_id: 1, status: 0, name: "3 teams per match", min_players_per_team: 1, max_players_per_team: 1, min_teams_per_match: 3,
@@ -120,6 +122,7 @@ if Rails.env.development?
end
tourn6.join(players_for_league[i])
end
+ tourn6.stages.create(scheduling_method: "elimination" , seeding_method: "random_seeding")
tourn6.join(players_for_league[9])
tourn6.join(davis)
tourn6.join(foy)
@@ -138,7 +141,13 @@ if Rails.env.development?
hash4 = {:username => "NalfeinX", :id => id}
hash5 = {:username => "GTBPhoenix", :id => id}
hash6 = {:username => , :id => id}
- hash7 = {:username => username, :id => id}
+ hash7 = {:username => username, :id => id}ages.first.create_matchesages.first.create_matches
+end
+if success
+format.html { redirect_to @tournament,
+end
+if success
+format.html { redirect_to @tournament,
hash8 = {:username => username, :id => id}
hash9 = {:username => username, :id => id}
hash10 = {:username => username, :id => id}
diff --git a/generate.sh b/generate.sh
index 3837ddb..6a6c502 100755
--- a/generate.sh
+++ b/generate.sh
@@ -44,8 +44,8 @@ bundle exec rails generate scaffold match status:integer tournament_stage:refere
bundle exec rails generate scaffold team
bundle exec rails generate scaffold alert author:references message:text
bundle exec rails generate scaffold pm author:references recipient:references message:text subject:text conversation:references
-bundle exec rails generate scaffold tournament game:references status:integer name:string:uniq min_players_per_team:integer max_players_per_team:integer min_teams_per_match:integer max_teams_per_match:integer sampling_method:string scoring_method:string
-bundle exec rails generate scaffold game parent:references name:string:uniq min_players_per_team:integer max_players_per_team:integer min_teams_per_match:integer max_teams_per_match:integer sampling_method:string scoring_method:string
+bundle exec rails generate scaffold tournament game:references status:integer name:string:uniq min_players_per_team:integer max_players_per_team:integer min_teams_per_match:integer max_teams_per_match:integer scoring_method:string
+bundle exec rails generate scaffold game parent:references name:string:uniq min_players_per_team:integer max_players_per_team:integer min_teams_per_match:integer max_teams_per_match:integer scoring_method:string
bundle exec rails generate scaffold user name:string email:string:uniq user_name:string:uniq
bundle exec rails generate scaffold session user:references token:string:uniq
bundle exec rails generate scaffold bracket user:references tournament:references name:string
diff --git a/lib/sampling/README.md b/lib/sampling/README.md
index 3d564da..e4b3fbf 100644
--- a/lib/sampling/README.md
+++ b/lib/sampling/README.md
@@ -1,42 +1,50 @@
Sampling interface
==================
-Files in this directory should be _modules_ implementing the following
+Files in this directory should be _classes_ implementing the following
interface:
- - `works_with?(Game) => Boolean`
+ - `self.works_with?(Game) => Boolean`
Returns whether or not this sampling method works with the
specified game.
- - `can_get?(User, String setting_name) => Fixnum`
+ - `self.can_get?(String setting_name) => Fixnum`
Returns whether or not this sampling method can get a specifed
statistic; 0 means 'false', positive integers mean 'true', where
higher numbers are higher priority.
- - `uses_remote?() => Boolean`
+ - `self.uses_remote?() => Boolean`
Return whether or not this sampling method requires remote IDs for
users.
- - `set_remote_name(User, Game, String)`
+
+ - `self.set_remote_name(User, Game, String)`
Set the remote ID for a user for the specified game. It is safe to
assume that this sampling method `works_with?` that game.
- - `get_remote_name(Object)`
+
+ - `self.get_remote_name(Object)`
When given an object from `RemoteUsername#value`, give back a
- human-readable/editable name to display.
+ human-readable/editable name to display
+
+----
+
+ - `initialize(Match)`
+
+ Construct new Sampling object for the specified match.
- - `sampling_start(Match, Array[]={:user=>User,:stat=>String})`
+ - `start()`
- Fetch the statistics for a match.
+ Begin fetching the statistics.
- - `render_user_interaction(Match, User) => String`
+ - `render_user_interaction(User) => String`
Returns HTML to render on a page.
- - `handle_user_interaction(Match, User, Hash params)`
+ - `handle_user_interaction(User, Hash params)`
Handles params from the form generated by
`#user_interaction_render`.
diff --git a/lib/sampling/manual.html.erb b/lib/sampling/manual.html.erb
new file mode 100644
index 0000000..cf873b4
--- /dev/null
+++ b/lib/sampling/manual.html.erb
@@ -0,0 +1 @@
+<!-- TODO -->
diff --git a/lib/sampling/manual.rb b/lib/sampling/manual.rb
index b5c97c4..a190bd2 100644
--- a/lib/sampling/manual.rb
+++ b/lib/sampling/manual.rb
@@ -1,10 +1,10 @@
module Sampling
- module Manual
+ class Manual
def self.works_with?(game)
return true
end
- def can_get?(user, setting_name)
+ def can_get?(setting_name)
return 1
end
@@ -20,12 +20,20 @@ module Sampling
raise "This sampling method doesn't use remote usernames."
end
- def self.sampling_start(match, statistics)
+ ####
+
+ def initialize(match)
+ @match = match
+ end
+
+ def start
# do nothing
end
- def self.render_user_interaction(match, user)
- # TODO
+ def render_user_interaction(user)
+ @current_user = user
+ @users = @match.users
+ @stats = @match.stats_from(self.class)
require 'erb'
erb_filename = File.join(__FILE__.sub(/\.rb$/, '.svg.erb'))
@@ -34,9 +42,8 @@ module Sampling
return erb.result.html_safe
end
- def self.handle_user_interaction(match, user, sampling_params)
+ def handle_user_interaction(user, sampling_params)
# TODO
- #match.statistics.create(user: nil, name: "blowout",
end
end
end
diff --git a/lib/sampling/peer_review.rb b/lib/sampling/peer_review.rb
index 5ae4e81..4577542 100644
--- a/lib/sampling/peer_review.rb
+++ b/lib/sampling/peer_review.rb
@@ -1,9 +1,13 @@
module Sampling
- module PeerReview
+ class PeerReview
def self.works_with?(game)
return true
end
+ def self.can_get?(setting_name)
+ return setting_name.start_with?("feedback_from_")
+ end
+
def self.uses_remote?
return false
end
@@ -16,11 +20,17 @@ module Sampling
raise "This sampling method doesn't use remote usernames."
end
- def self.sampling_start(match)
+ ####
+
+ def initialize(match)
+ @match = match
+ end
+
+ def start
# do nothing
end
- def self.render_user_interaction(match, user)
+ def render_user_interaction(user)
@user = user
@team = get_team(match)
@feedbacks_missing = get_feedbacks_missing(match)
@@ -32,11 +42,11 @@ module Sampling
return erb.result.html_safe
end
- def self.handle_user_interaction(match, reviewing_user, params)
+ def handle_user_interaction(reviewing_user, params)
i = 0
params[:peer_review].to_s.split(',').each do |user_name|
reviewed_user = User.find_by_user_name(user_name)
- user.statistics.create(match: match, value: i)
+ user.statistics.create(match: @match, value: i)
i += 1
end
end
diff --git a/lib/sampling/riot_api.rb b/lib/sampling/riot_api.rb
index 8c34fc4..7e14551 100644
--- a/lib/sampling/riot_api.rb
+++ b/lib/sampling/riot_api.rb
@@ -1,5 +1,5 @@
module Sampling
- module RiotApi
+ class RiotApi
protected
def self.api_name
"prod.api.pvp.net/api/lol"
@@ -87,21 +87,12 @@ module Sampling
# Return whether or not the API can get a given statistic for
# a given user.
public
- def self.can_get?(user, stat)
- if user.nil?
+ def self.can_get?(stat)
+ if stats_available.include?(stat)
+ return 2
+ else
return 0
end
- summoner = user.get_remote_username(match.tournament_stage.tournament.game)
- if summoner.nil?
- return 0
- end
- if summoner["id"].nil?
- return 0
- end
- unless stats_available.include?(stat)
- return 0
- end
- return 2
end
##
@@ -149,13 +140,20 @@ module Sampling
data["name"]
end
+ ####
+
+ public
+ def initialize(match)
+ @match = match
+ end
+
##
# Fetch all the statistics for a match.
public
- def self.sampling_start(match, stats)
+ def start
@match.teams.each do |team|
team.users.each do |user|
- Delayed::Job.enqueue(MatchJob.new(user, match, stats.map{|stat|stat[:name]}, nil), :queue => api_name)
+ Delayed::Job.enqueue(MatchJob.new(user, @match, @match.stats_from(self.class), nil), :queue => api_name)
end
end
end
@@ -191,12 +189,13 @@ module Sampling
end
public
- def self.render_user_interaction(match, user)
+ def render_user_interaction(user)
return ""
end
public
- def self.handle_user_interaction(match, user)
+ def handle_user_interaction(user)
+ # do nothing
end
end
end
diff --git a/lib/scheduling/README.md b/lib/scheduling/README.md
index 8b21164..fe6aba1 100644
--- a/lib/scheduling/README.md
+++ b/lib/scheduling/README.md
@@ -4,7 +4,7 @@ Scheduling interface
Files in this directory should be _classes_ implementing the following
interface:
- - `initialize(tournament_stage)`
+ - `initialize(TournamentStage)`
Construct new Scheduling object from tournament_stage.
@@ -12,7 +12,7 @@ interface:
Creates all the matches of the current round.
- - `finish_match(match)`
+ - `finish_match(Match)`
Progresses the match through the schedule.
diff --git a/lib/scoring/README.md b/lib/scoring/README.md
index 5beb0a2..dce71d0 100644
--- a/lib/scoring/README.md
+++ b/lib/scoring/README.md
@@ -4,12 +4,12 @@ Scoring interface
Files in this directory should be _modules_ implementing the following
interface:
- - `stats_needed() => Array[i]=Symbol`
+ - `stats_needed(Match) => Array[]=Symbol`
Returns which statistics need to be collected for this scoring
algorithm.
- - `score(match) => Hash[User]=Integer`
+ - `score(Match) => Hash[User]=Integer`
User scores for this match, assuming statistics have been
collected.