Merge remote-tracking branch 'jamal/self-captains' into develop

Conflicts:
	app/views/gathers/_status.html.erb
This commit is contained in:
Luke Barratt 2014-10-11 23:13:57 +01:00
commit 0895072845
10 changed files with 102 additions and 18 deletions

View file

@ -63,6 +63,22 @@ class GathersController < ApplicationController
redirect_to @gather
end
def captain
raise AccessError unless @gatherer
if @gather.captain1.nil? and @gather.captain2 != @gatherer
@gather.update_attribute :captain1, @gatherer
elsif @gather.captain2.nil? and @gather.captain1 != @gatherer
@gather.update_attribute :captain2, @gatherer
elsif @gatherer == @gather.captain1
@gather.update_attribute :captain1, nil
elsif @gatherer == @gather.captain2
@gather.update_attribute :captain2, nil
end
redirect_to @gather
end
private
def get_gather

View file

@ -1,7 +1,11 @@
module GathersHelper
def render_gather
if @gather.status == Gather::STATE_RUNNING
if @gather.is_full? and !@gather.is_ready? and @gather.captain1 != @gatherer and @gather.captain2 != @gatherer
headers['Gather'] = 'full'
else
headers['Gather'] = 'running'
end
render partial: 'running', layout: false
elsif @gather.status == Gather::STATE_VOTING

View file

@ -89,6 +89,17 @@ class Gather < ActiveRecord::Base
5
end
def is_full?
return gatherers.count == Gather::FULL
end
def is_ready?
if is_full? and !captain1.nil? and !captain2.nil?
return true
end
false
end
def first
Gather.where(:category_id => category_id).order("id ASC").first
end
@ -124,8 +135,6 @@ class Gather < ActiveRecord::Base
g = Gather.new
g.category = self.category
g.save
self.captain1 = self.gatherers.most_voted[1]
self.captain2 = self.gatherers.most_voted[0]
if self.gather_maps.count > 1
self.map1 = self.gather_maps.ordered[0]
self.map2 = self.gather_maps.ordered[1]
@ -139,7 +148,7 @@ class Gather < ActiveRecord::Base
end
def check_captains
if captain1_id_changed? or captain2_id_changed? or admin
if status == STATE_RUNNING and is_ready? or admin
self.turn = 1
self.status = STATE_PICKING
gatherers.each do |gatherer|
@ -151,6 +160,13 @@ class Gather < ActiveRecord::Base
gatherer.update_attributes(:team => nil, :skip_callbacks => true)
end
end
# Create a new shout msgs when the gather is full
Shoutmsg.new({
:shoutable_type => self.class.to_s,
:shoutable_id => self.id,
:text => I18n.t(:gather_start_shout)
}).save
end
end

View file

@ -70,7 +70,7 @@ class Gatherer < ActiveRecord::Base
validates :confirm, :acceptance => true, :unless => Proc.new {|gatherer| gatherer.user.gatherers.count >= 5}
validate :validate_username
after_create :start_gather, :if => Proc.new {|gatherer| gatherer.gather.gatherers.count == Gather::FULL}
after_create :start_gather, :if => Proc.new {|gatherer| gatherer.gather.is_ready?}
after_create :notify_gatherers, :if => Proc.new {|gatherer| gatherer.gather.gatherers.count == Gather::NOTIFY}
after_update :change_turn, :unless => Proc.new {|gatherer| gatherer.skip_callbacks == true}
after_destroy :cleanup_votes
@ -118,6 +118,12 @@ class Gatherer < ActiveRecord::Base
end
def cleanup_votes
if gather.captain1_id == id
gather.update_attribute :captain1, nil
elsif gather.captain2_id == id
gather.update_attribute :captain2, nil
end
gather.map_votes.all(:conditions => {:user_id => user_id}).each { |g| g.destroy }
gather.server_votes.all(:conditions => {:user_id => user_id}).each { |g| g.destroy }
gather.gatherer_votes.all(:conditions => {:user_id => user_id}).each { |g| g.destroy }

View file

@ -17,7 +17,6 @@ class Shoutmsg < ActiveRecord::Base
attr_protected :id, :created_at, :updated_at, :user_id
validates_length_of :text, :in => 1..100
validates_presence_of :user
scope :recent,
:include => :user,

View file

@ -9,6 +9,13 @@
<li<% if gatherer.status > 0 %> class="away"<% end %>>
<%= flag gatherer.user.country %>
<%= namelink gatherer.user %>
<% if gatherer == @gather.captain1 or gatherer == @gather.captain2 %>
<span class="captain">
<%= icon('star') %>
</span>
<% end %>
<% if cuser and cuser.admin? %>
<%= link_to gatherer, method: :delete, class: 'delete' do %>
<%= icon 'times' %>

View file

@ -2,7 +2,16 @@
<% if @gather.status == Gather::STATE_RUNNING %>
<% if @gatherer and @gatherer.can_destroy? cuser %>
<% if Gather::FULL == @gather.gatherers.length %>
<p>Gather is full but we are waiting on commanders. If you would like to command, please use the button below.</p>
<% else %>
<p>Gather running, <%= Gather::FULL - @gather.gatherers.length %> more needed.</p>
<% end %>
<%= form_tag "/gathers/captain/#{@gather.id}" do %>
<%= submit_tag (@gather.captain1 == @gatherer or @gather.captain2 == @gatherer) ? 'Stop Commanding' : 'Command a Team', class: 'button tiny' %>
<% end %>
<%= link_to 'Leave Gather', @gatherer, confirm: 'Are you sure?', method: :delete, class: 'button tiny leave-gather' %>
<% elsif (g = Gatherer.new(gather: @gather, user: cuser)).can_create?(cuser) %>
@ -10,7 +19,11 @@
<%= f.hidden_field :gather_id %>
<%= f.hidden_field :user_id %>
<% if Gather::FULL == @gather.gatherers.length %>
<p>Gather is full but we are waiting on commanders. If you would like to command, please use the button below.</p>
<% else %>
<p>Gather running, <%= Gather::FULL - @gather.gatherers.length %> more needed.</p>
<% end %>
<p>
You can download custom maps via the
<%= link_to "Steam Workshop", "http://steamcommunity.com/workshop/browse?searchtext=&childpublishedfileid=0&section=items&appid=4920&browsesort=trend&requiredtags%5B%5D=level" %>.

View file

@ -1,5 +1,6 @@
<div id="jplayer"></div>
<script type="text/javascript">
var gather_focus = true;
var played = false;
var leave_confirm = true;
<% if @gatherer and @gatherer.can_destroy? cuser %>
@ -21,6 +22,8 @@
});
}
var gatherAlertInterval;
$(document).ready(function() {
$.PeriodicalUpdater("/gathers/" + <%= @gather.id %> + ".js", {
method: "GET",
@ -28,8 +31,21 @@
minTimeout: 5000,
maxTimeout: 15000,
success: function(response, text, request) {
if (request.getResponseHeader('Gather') == 'voting') {
if (!played) {
if (request.getResponseHeader('Gather') == 'full') {
// Play notification while we wait on captains
if (!gatherAlertInterval) {
$('#jplayer').jPlayer({
ready: function() {
$(this).jPlayer('setMedia', {mp3: '/sounds/gather-alert.mp3'}).jPlayer("play");
},
loop: false
});
gatherAlertInterval = setInterval(function() { $("#jplayer").jPlayer("play"); }, 10000);
}
} else if (request.getResponseHeader('Gather') == 'picking' && !played) {
played = true
if (!gather_focus) {
$("#jplayer").jPlayer({
ready: function() {
$(this).jPlayer("setMedia", {
@ -48,11 +64,10 @@
volume: 0.6,
swfPath: "/flash"
});
played = true
}
}
else if (response.length > 10) {
clearInterval(gatherAlertInterval);
$("#jplayer").jPlayer("stop");
}
}
@ -81,6 +96,7 @@
var afk_timeout;
var afk_time = 1000 * 60 * 15; // 15 minutes
$(window).blur(function() {
gather_focus = false;
afk_timeout = setTimeout(function() {
if (gatherer_id > 0) {
afk = true;
@ -90,6 +106,12 @@
});
$(window).focus(function() {
gather_focus = true;
if (played) {
$("#jplayer").jPlayer("stop");
}
if (afk) {
updateGathererStatus('active');
$.get("/gathers/" + <%= @gather.id %> + ".js");
@ -135,11 +157,11 @@
</div>
<div class="info">
<h6>Captains</h6>
<h6>Commanders</h6>
<ul>
<li>Vote for the <strong>best</strong> players</li>
<li>Captain 1 = 2nd most voted</li>
<li>Captain 2 = 1st most voted</li>
<li>Players choose to become commanders</li>
<li>Commanders will pick team players</li>
<li>Gather will not start without commanders</li>
</ul>
</div>

View file

@ -21,6 +21,7 @@ en:
contests_join: "Team successfully joined contest."
contests_contester_update: "Contester was successfully updated."
gather_create: "New Gather was started successfully."
gather_start_shout: "The gather is full and commanders are picking teams."
gathers_join: "You have joined the Gather."
gathers_user_pick: "You have successfully selected a player for your team."
gatherers_update: "Gather player successfully updated."

Binary file not shown.