diff --git a/app/controllers/gathers_controller.rb b/app/controllers/gathers_controller.rb index d8f4a87..3f7d949 100644 --- a/app/controllers/gathers_controller.rb +++ b/app/controllers/gathers_controller.rb @@ -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 diff --git a/app/helpers/gathers_helper.rb b/app/helpers/gathers_helper.rb index 90dbaee..44274de 100644 --- a/app/helpers/gathers_helper.rb +++ b/app/helpers/gathers_helper.rb @@ -1,8 +1,12 @@ module GathersHelper def render_gather if @gather.status == Gather::STATE_RUNNING - headers['Gather'] = '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 if @gatherer and @gather.gatherer_votes.first(conditions: { user_id: cuser.id }) diff --git a/app/models/gather.rb b/app/models/gather.rb index 21507a2..ac1e4ae 100644 --- a/app/models/gather.rb +++ b/app/models/gather.rb @@ -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 diff --git a/app/models/gatherer.rb b/app/models/gatherer.rb index 0b49f1b..45133c8 100644 --- a/app/models/gatherer.rb +++ b/app/models/gatherer.rb @@ -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 } diff --git a/app/models/shoutmsg.rb b/app/models/shoutmsg.rb index 60e0d59..45d7a47 100644 --- a/app/models/shoutmsg.rb +++ b/app/models/shoutmsg.rb @@ -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, diff --git a/app/views/gathers/_running.html.erb b/app/views/gathers/_running.html.erb index de2d68f..3971c18 100644 --- a/app/views/gathers/_running.html.erb +++ b/app/views/gathers/_running.html.erb @@ -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' %> diff --git a/app/views/gathers/_status.html.erb b/app/views/gathers/_status.html.erb index 50a508d..12177c0 100644 --- a/app/views/gathers/_status.html.erb +++ b/app/views/gathers/_status.html.erb @@ -2,15 +2,28 @@ <% if @gather.status == Gather::STATE_RUNNING %> <% if @gatherer and @gatherer.can_destroy? cuser %> - <p>Gather running, <%= Gather::FULL - @gather.gatherers.length %> more needed.</p> - <%= link_to 'Leave Gather', @gatherer, confirm: 'Are you sure?', method: :delete, class: 'button tiny' %> + <% 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) %> <%= form_for g do |f| %> <%= f.hidden_field :gather_id %> <%= f.hidden_field :user_id %> - <p>Gather running, <%= Gather::FULL - @gather.gatherers.length %> more needed.</p> + <% 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§ion=items&appid=4920&browsesort=trend&requiredtags%5B%5D=level" %>. diff --git a/app/views/gathers/show.html.erb b/app/views/gathers/show.html.erb index 509c9d1..463415c 100644 --- a/app/views/gathers/show.html.erb +++ b/app/views/gathers/show.html.erb @@ -1,5 +1,6 @@ <div id="jplayer"></div> <script type="text/javascript"> + var gather_focus = true; var played = false; var leaving = 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,14 +31,27 @@ 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", { mp3: "http://www.ensl.org/sounds/gather-5.mp3" }).jPlayer("play"); - + var click = document.ontouchstart === undefined ? 'click' : 'touchstart'; var kickoff = function () { $("#jplayer").jPlayer("play"); @@ -48,11 +64,10 @@ volume: 0.6, swfPath: "/flash" }); - - played = true } } else if (response.length > 10) { + clearInterval(gatherAlertInterval); $("#jplayer").jPlayer("stop"); } } @@ -74,6 +89,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; @@ -83,6 +99,12 @@ }); $(window).focus(function() { + gather_focus = true; + + if (played) { + $("#jplayer").jPlayer("stop"); + } + if (afk) { updateGathererStatus('active'); $.get("/gathers/" + <%= @gather.id %> + ".js"); @@ -128,11 +150,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> diff --git a/config/locales/en.yml b/config/locales/en.yml index 5120c82..c7937c7 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -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."