mirror of
https://github.com/ENSL/ensl.org.git
synced 2024-12-25 20:11:34 +00:00
Add state to gatherers and track when a gatherer has left or is away
This commit is contained in:
parent
73ac7d589b
commit
d6b501ac46
9 changed files with 111 additions and 16 deletions
|
@ -202,3 +202,11 @@ table.gathers {
|
|||
ul.gatherers {
|
||||
@include span-columns(12);
|
||||
}
|
||||
|
||||
ul#gatherers {
|
||||
li.away a {
|
||||
font-style: italic;
|
||||
font-weight: normal;
|
||||
color: #5b5b5b;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,6 +32,22 @@ class GatherersController < ApplicationController
|
|||
redirect_to_back
|
||||
end
|
||||
|
||||
def status
|
||||
raise AccessError unless @gatherer.can_destroy? cuser
|
||||
|
||||
states = {
|
||||
"leaving" => Gatherer::STATE_LEAVING,
|
||||
"away" => Gatherer::STATE_AWAY,
|
||||
"active" => Gatherer::STATE_ACTIVE,
|
||||
}
|
||||
|
||||
if states.has_key?(params[:status])
|
||||
@gatherer.update_attribute(:status, states[params[:status]])
|
||||
end
|
||||
|
||||
render :nothing => true, :status => 200
|
||||
end
|
||||
|
||||
def destroy
|
||||
raise AccessError unless @gatherer.can_destroy? cuser
|
||||
|
||||
|
|
|
@ -72,5 +72,24 @@ class GathersController < ApplicationController
|
|||
end
|
||||
|
||||
@gatherer = @gather.gatherers.of_user(cuser).first if cuser
|
||||
update_gatherers
|
||||
end
|
||||
|
||||
def update_gatherers
|
||||
# Update user that has left and came back
|
||||
if @gatherer and @gatherer.status == Gatherer::STATE_LEAVING
|
||||
@gatherer.update_attribute(:status, Gatherer::STATE_ACTIVE)
|
||||
end
|
||||
|
||||
# Remove any users that left over 30 seconds ago
|
||||
removed_users = false
|
||||
@gather.gatherers.each do |gatherer|
|
||||
if gatherer.status == Gatherer::STATE_LEAVING and gatherer.updated_at < Time.now - 30
|
||||
removed_users = true
|
||||
gatherer.destroy
|
||||
end
|
||||
end
|
||||
|
||||
@gather.reload if removed_users
|
||||
end
|
||||
end
|
||||
|
|
|
@ -15,6 +15,10 @@ class Gatherer < ActiveRecord::Base
|
|||
IDLE_TIME = 600
|
||||
EJECT_VOTES = 4
|
||||
|
||||
STATE_ACTIVE = 0
|
||||
STATE_AWAY = 1
|
||||
STATE_LEAVING = 2
|
||||
|
||||
include Extra
|
||||
|
||||
attr_protected :id
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
<ul id="gatherers">
|
||||
<% @gather.gatherers.each do |gatherer| %>
|
||||
<li>
|
||||
<li<% if gatherer.status > 0 %> class="away"<% end %>>
|
||||
<%= flag gatherer.user.country %>
|
||||
<%= namelink gatherer.user %>
|
||||
<% if cuser and cuser.admin? %>
|
||||
|
|
|
@ -1,6 +1,25 @@
|
|||
<div id="jplayer"></div>
|
||||
<script type="text/javascript">
|
||||
var played = false;
|
||||
var leaving = true;
|
||||
<% if @gatherer and @gatherer.can_destroy? cuser %>
|
||||
var gatherer_id = <%= @gatherer.id %>;
|
||||
<% else %>
|
||||
var gatherer_id = 0;
|
||||
<% end %>
|
||||
|
||||
function updateGathererStatus(status) {
|
||||
$.ajax({
|
||||
url: '/gatherers/' + gatherer_id + '/status',
|
||||
type: 'POST',
|
||||
data: {'status': status},
|
||||
async: false,
|
||||
cache: false,
|
||||
success: function() {},
|
||||
complete: function() {},
|
||||
error: function() {}
|
||||
});
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
$.PeriodicalUpdater("/gathers/" + <%= @gather.id %> + ".js", {
|
||||
|
@ -38,6 +57,39 @@
|
|||
}
|
||||
}
|
||||
});
|
||||
|
||||
$(window).bind('beforeunload', function(e) {
|
||||
if (gatherer_id > 0) {
|
||||
return "You will be removed from the Gather if you leave this page.";
|
||||
}
|
||||
});
|
||||
|
||||
$(window).bind('unload', function() {
|
||||
if (gatherer_id > 0) {
|
||||
updateGathererStatus('leaving');
|
||||
}
|
||||
});
|
||||
|
||||
var afk = false;
|
||||
var afk_timeout;
|
||||
var afk_time = 1000 * 60 * 15; // 15 minutes
|
||||
$(window).blur(function() {
|
||||
afk_timeout = setTimeout(function() {
|
||||
if (gatherer_id > 0) {
|
||||
afk = true;
|
||||
updateGathererStatus('away');
|
||||
}
|
||||
}, afk_time);
|
||||
});
|
||||
|
||||
$(window).focus(function() {
|
||||
if (afk) {
|
||||
updateGathererStatus('active');
|
||||
$.get("/gathers/" + <%= @gather.id %> + ".js");
|
||||
}
|
||||
|
||||
clearTimeout(afk_timeout);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
|
@ -46,7 +98,7 @@
|
|||
<span>
|
||||
<%= link_to @gather do %>
|
||||
<%= @gather.category.to_s %> Gather
|
||||
<% end %>
|
||||
<% end %>
|
||||
</span>
|
||||
</h1>
|
||||
|
||||
|
|
|
@ -100,7 +100,9 @@ Ensl::Application.routes.draw do
|
|||
|
||||
match 'gathers/refresh'
|
||||
match 'gathers/latest/:game', to: "gathers#latest", via: :get
|
||||
match 'gather', to: "gathers#latest", game: "ns2", via: :get
|
||||
match 'gather', to: "gathers#latest", game: "ns2", via: :get
|
||||
|
||||
match 'gatherers/:id/status', to: "gatherers#status", via: :post
|
||||
|
||||
match 'groups/addUser'
|
||||
match 'groups/delUser'
|
||||
|
|
5
db/migrate/20141010193221_add_status_to_gatherer.rb
Normal file
5
db/migrate/20141010193221_add_status_to_gatherer.rb
Normal file
|
@ -0,0 +1,5 @@
|
|||
class AddStatusToGatherer < ActiveRecord::Migration
|
||||
def change
|
||||
add_column :gatherers, :status, :int, null: false, default: 0
|
||||
end
|
||||
end
|
15
db/schema.rb
15
db/schema.rb
|
@ -11,7 +11,7 @@
|
|||
#
|
||||
# It's strongly recommended to check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(:version => 20140810224606) do
|
||||
ActiveRecord::Schema.define(:version => 20141010193221) do
|
||||
|
||||
create_table "admin_requests", :force => true do |t|
|
||||
t.string "addr"
|
||||
|
@ -294,6 +294,7 @@ ActiveRecord::Schema.define(:version => 20140810224606) do
|
|||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
t.integer "votes", :default => 0, :null => false
|
||||
t.integer "status", :default => 0, :null => false
|
||||
end
|
||||
|
||||
add_index "gatherers", ["gather_id"], :name => "index_gatherers_on_gather_id"
|
||||
|
@ -758,18 +759,6 @@ ActiveRecord::Schema.define(:version => 20140810224606) do
|
|||
add_index "sessions", ["session_id"], :name => "index_sessions_on_session_id"
|
||||
add_index "sessions", ["updated_at"], :name => "index_sessions_on_updated_at"
|
||||
|
||||
create_table "shoutmsg_archive", :force => true do |t|
|
||||
t.integer "user_id"
|
||||
t.string "text"
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
t.string "shoutable_type"
|
||||
t.integer "shoutable_id"
|
||||
end
|
||||
|
||||
add_index "shoutmsg_archive", ["shoutable_type", "shoutable_id"], :name => "index_shoutmsgs_on_shoutable_type_and_shoutable_id"
|
||||
add_index "shoutmsg_archive", ["user_id"], :name => "index_shoutmsgs_on_user_id"
|
||||
|
||||
create_table "shoutmsgs", :force => true do |t|
|
||||
t.integer "user_id"
|
||||
t.string "text"
|
||||
|
|
Loading…
Reference in a new issue