mirror of
https://github.com/ENSL/ensl.org.git
synced 2024-11-15 01:11:23 +00:00
Change Gather style to volunteer captains
This will change the gather format to allow for players to volunteer to be captain / commander. The gather will not change from the running state until 2 commanders have volunteered. Once commanders have volunteered the gather will switch to the picking state. The voting state is no longer used. Also, added a new sound alert that will be played when the gather is full but doesn't have 2 captains. This alert will loop every 10 seconds unless you're the commander. And changed the music to play once the gather switches to the picking state and only if the player doesn't have the gather page on focus.
This commit is contained in:
parent
d0029b118f
commit
ebd60d19eb
10 changed files with 103 additions and 19 deletions
|
@ -63,6 +63,22 @@ class GathersController < ApplicationController
|
||||||
redirect_to @gather
|
redirect_to @gather
|
||||||
end
|
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
|
private
|
||||||
|
|
||||||
def get_gather
|
def get_gather
|
||||||
|
|
|
@ -1,8 +1,12 @@
|
||||||
module GathersHelper
|
module GathersHelper
|
||||||
def render_gather
|
def render_gather
|
||||||
if @gather.status == Gather::STATE_RUNNING
|
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
|
render partial: 'running', layout: false
|
||||||
elsif @gather.status == Gather::STATE_VOTING
|
elsif @gather.status == Gather::STATE_VOTING
|
||||||
if @gatherer and @gather.gatherer_votes.first(conditions: { user_id: cuser.id })
|
if @gatherer and @gather.gatherer_votes.first(conditions: { user_id: cuser.id })
|
||||||
|
|
|
@ -89,6 +89,17 @@ class Gather < ActiveRecord::Base
|
||||||
5
|
5
|
||||||
end
|
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
|
def first
|
||||||
Gather.where(:category_id => category_id).order("id ASC").first
|
Gather.where(:category_id => category_id).order("id ASC").first
|
||||||
end
|
end
|
||||||
|
@ -124,8 +135,6 @@ class Gather < ActiveRecord::Base
|
||||||
g = Gather.new
|
g = Gather.new
|
||||||
g.category = self.category
|
g.category = self.category
|
||||||
g.save
|
g.save
|
||||||
self.captain1 = self.gatherers.most_voted[1]
|
|
||||||
self.captain2 = self.gatherers.most_voted[0]
|
|
||||||
if self.gather_maps.count > 1
|
if self.gather_maps.count > 1
|
||||||
self.map1 = self.gather_maps.ordered[0]
|
self.map1 = self.gather_maps.ordered[0]
|
||||||
self.map2 = self.gather_maps.ordered[1]
|
self.map2 = self.gather_maps.ordered[1]
|
||||||
|
@ -139,7 +148,7 @@ class Gather < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_captains
|
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.turn = 1
|
||||||
self.status = STATE_PICKING
|
self.status = STATE_PICKING
|
||||||
gatherers.each do |gatherer|
|
gatherers.each do |gatherer|
|
||||||
|
@ -151,6 +160,13 @@ class Gather < ActiveRecord::Base
|
||||||
gatherer.update_attributes(:team => nil, :skip_callbacks => true)
|
gatherer.update_attributes(:team => nil, :skip_callbacks => true)
|
||||||
end
|
end
|
||||||
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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -70,7 +70,7 @@ class Gatherer < ActiveRecord::Base
|
||||||
validates :confirm, :acceptance => true, :unless => Proc.new {|gatherer| gatherer.user.gatherers.count >= 5}
|
validates :confirm, :acceptance => true, :unless => Proc.new {|gatherer| gatherer.user.gatherers.count >= 5}
|
||||||
validate :validate_username
|
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_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_update :change_turn, :unless => Proc.new {|gatherer| gatherer.skip_callbacks == true}
|
||||||
after_destroy :cleanup_votes
|
after_destroy :cleanup_votes
|
||||||
|
@ -118,6 +118,12 @@ class Gatherer < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def cleanup_votes
|
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.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.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 }
|
gather.gatherer_votes.all(:conditions => {:user_id => user_id}).each { |g| g.destroy }
|
||||||
|
|
|
@ -17,7 +17,6 @@ class Shoutmsg < ActiveRecord::Base
|
||||||
attr_protected :id, :created_at, :updated_at, :user_id
|
attr_protected :id, :created_at, :updated_at, :user_id
|
||||||
|
|
||||||
validates_length_of :text, :in => 1..100
|
validates_length_of :text, :in => 1..100
|
||||||
validates_presence_of :user
|
|
||||||
|
|
||||||
scope :recent,
|
scope :recent,
|
||||||
:include => :user,
|
:include => :user,
|
||||||
|
|
|
@ -9,6 +9,13 @@
|
||||||
<li<% if gatherer.status > 0 %> class="away"<% end %>>
|
<li<% if gatherer.status > 0 %> class="away"<% end %>>
|
||||||
<%= flag gatherer.user.country %>
|
<%= flag gatherer.user.country %>
|
||||||
<%= namelink gatherer.user %>
|
<%= namelink gatherer.user %>
|
||||||
|
|
||||||
|
<% if gatherer == @gather.captain1 or gatherer == @gather.captain2 %>
|
||||||
|
<span class="captain">
|
||||||
|
<%= icon('star') %>
|
||||||
|
</span>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<% if cuser and cuser.admin? %>
|
<% if cuser and cuser.admin? %>
|
||||||
<%= link_to gatherer, method: :delete, class: 'delete' do %>
|
<%= link_to gatherer, method: :delete, class: 'delete' do %>
|
||||||
<%= icon 'times' %>
|
<%= icon 'times' %>
|
||||||
|
|
|
@ -2,15 +2,28 @@
|
||||||
<% if @gather.status == Gather::STATE_RUNNING %>
|
<% if @gather.status == Gather::STATE_RUNNING %>
|
||||||
|
|
||||||
<% if @gatherer and @gatherer.can_destroy? cuser %>
|
<% if @gatherer and @gatherer.can_destroy? cuser %>
|
||||||
<p>Gather running, <%= Gather::FULL - @gather.gatherers.length %> more needed.</p>
|
<% if Gather::FULL == @gather.gatherers.length %>
|
||||||
<%= link_to 'Leave Gather', @gatherer, confirm: 'Are you sure?', method: :delete, class: 'button tiny' %>
|
<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) %>
|
<% elsif (g = Gatherer.new(gather: @gather, user: cuser)).can_create?(cuser) %>
|
||||||
<%= form_for g do |f| %>
|
<%= form_for g do |f| %>
|
||||||
<%= f.hidden_field :gather_id %>
|
<%= f.hidden_field :gather_id %>
|
||||||
<%= f.hidden_field :user_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>
|
<p>
|
||||||
You can download custom maps via the
|
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" %>.
|
<%= link_to "Steam Workshop", "http://steamcommunity.com/workshop/browse?searchtext=&childpublishedfileid=0§ion=items&appid=4920&browsesort=trend&requiredtags%5B%5D=level" %>.
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
<div id="jplayer"></div>
|
<div id="jplayer"></div>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
var gather_focus = true;
|
||||||
var played = false;
|
var played = false;
|
||||||
var leaving = true;
|
var leaving = true;
|
||||||
<% if @gatherer and @gatherer.can_destroy? cuser %>
|
<% if @gatherer and @gatherer.can_destroy? cuser %>
|
||||||
|
@ -21,6 +22,8 @@
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var gatherAlertInterval;
|
||||||
|
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
$.PeriodicalUpdater("/gathers/" + <%= @gather.id %> + ".js", {
|
$.PeriodicalUpdater("/gathers/" + <%= @gather.id %> + ".js", {
|
||||||
method: "GET",
|
method: "GET",
|
||||||
|
@ -28,14 +31,27 @@
|
||||||
minTimeout: 5000,
|
minTimeout: 5000,
|
||||||
maxTimeout: 15000,
|
maxTimeout: 15000,
|
||||||
success: function(response, text, request) {
|
success: function(response, text, request) {
|
||||||
if (request.getResponseHeader('Gather') == 'voting') {
|
if (request.getResponseHeader('Gather') == 'full') {
|
||||||
if (!played) {
|
// 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({
|
$("#jplayer").jPlayer({
|
||||||
ready: function() {
|
ready: function() {
|
||||||
$(this).jPlayer("setMedia", {
|
$(this).jPlayer("setMedia", {
|
||||||
mp3: "http://www.ensl.org/sounds/gather-5.mp3"
|
mp3: "http://www.ensl.org/sounds/gather-5.mp3"
|
||||||
}).jPlayer("play");
|
}).jPlayer("play");
|
||||||
|
|
||||||
var click = document.ontouchstart === undefined ? 'click' : 'touchstart';
|
var click = document.ontouchstart === undefined ? 'click' : 'touchstart';
|
||||||
var kickoff = function () {
|
var kickoff = function () {
|
||||||
$("#jplayer").jPlayer("play");
|
$("#jplayer").jPlayer("play");
|
||||||
|
@ -48,11 +64,10 @@
|
||||||
volume: 0.6,
|
volume: 0.6,
|
||||||
swfPath: "/flash"
|
swfPath: "/flash"
|
||||||
});
|
});
|
||||||
|
|
||||||
played = true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (response.length > 10) {
|
else if (response.length > 10) {
|
||||||
|
clearInterval(gatherAlertInterval);
|
||||||
$("#jplayer").jPlayer("stop");
|
$("#jplayer").jPlayer("stop");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -74,6 +89,7 @@
|
||||||
var afk_timeout;
|
var afk_timeout;
|
||||||
var afk_time = 1000 * 60 * 15; // 15 minutes
|
var afk_time = 1000 * 60 * 15; // 15 minutes
|
||||||
$(window).blur(function() {
|
$(window).blur(function() {
|
||||||
|
gather_focus = false;
|
||||||
afk_timeout = setTimeout(function() {
|
afk_timeout = setTimeout(function() {
|
||||||
if (gatherer_id > 0) {
|
if (gatherer_id > 0) {
|
||||||
afk = true;
|
afk = true;
|
||||||
|
@ -83,6 +99,12 @@
|
||||||
});
|
});
|
||||||
|
|
||||||
$(window).focus(function() {
|
$(window).focus(function() {
|
||||||
|
gather_focus = true;
|
||||||
|
|
||||||
|
if (played) {
|
||||||
|
$("#jplayer").jPlayer("stop");
|
||||||
|
}
|
||||||
|
|
||||||
if (afk) {
|
if (afk) {
|
||||||
updateGathererStatus('active');
|
updateGathererStatus('active');
|
||||||
$.get("/gathers/" + <%= @gather.id %> + ".js");
|
$.get("/gathers/" + <%= @gather.id %> + ".js");
|
||||||
|
@ -128,11 +150,11 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<h6>Captains</h6>
|
<h6>Commanders</h6>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Vote for the <strong>best</strong> players</li>
|
<li>Players choose to become commanders</li>
|
||||||
<li>Captain 1 = 2nd most voted</li>
|
<li>Commanders will pick team players</li>
|
||||||
<li>Captain 2 = 1st most voted</li>
|
<li>Gather will not start without commanders</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ en:
|
||||||
contests_join: "Team successfully joined contest."
|
contests_join: "Team successfully joined contest."
|
||||||
contests_contester_update: "Contester was successfully updated."
|
contests_contester_update: "Contester was successfully updated."
|
||||||
gather_create: "New Gather was started successfully."
|
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_join: "You have joined the Gather."
|
||||||
gathers_user_pick: "You have successfully selected a player for your team."
|
gathers_user_pick: "You have successfully selected a player for your team."
|
||||||
gatherers_update: "Gather player successfully updated."
|
gatherers_update: "Gather player successfully updated."
|
||||||
|
|
BIN
public/sounds/gather-alert.mp3
Normal file
BIN
public/sounds/gather-alert.mp3
Normal file
Binary file not shown.
Loading…
Reference in a new issue