Skip to content
Snippets Groups Projects
Verified Commit f13a4da5 authored by Andrej Ramašeuski's avatar Andrej Ramašeuski
Browse files

Podrobna evidence pritomnosti

parent c642e971
No related branches found
No related tags found
No related merge requests found
Pipeline #7055 passed
...@@ -17,14 +17,18 @@ sub main { ...@@ -17,14 +17,18 @@ sub main {
$c->tx->with_compression; $c->tx->with_compression;
my $key = $c->req->headers->header('Sec-WebSocket-Key'); my $key = $c->req->headers->header('Sec-WebSocket-Key');
my $pubsub = $c->redis->pubsub; my $pubsub = $c->redis->pubsub;
my $user;
my $event_id = 0; #TODO - parametr!
my $listener = $pubsub->listen(notify => sub($pubsub, $payload) { my $listener = $pubsub->listen(
"notify:$event_id" => sub($pubsub, $payload) {
$c->send(decode("UTF-8", $payload)); $c->send(decode("UTF-8", $payload));
}); }
);
my $listener_online = $pubsub->listen('online:0' => sub($pubsub, $payload) { #TODO: event_id my $listener_online = $pubsub->listen(
"online:$event_id" => sub($pubsub, $payload) {
my @counts = split ' ', $payload; my @counts = split ' ', $payload;
$c->send({json => { $c->send({json => {
event => 'online_users_updated', event => 'online_users_updated',
...@@ -35,16 +39,16 @@ sub main { ...@@ -35,16 +39,16 @@ sub main {
group_size_half => $counts[3]+0, group_size_half => $counts[3]+0,
} }
}}); }});
}); }
);
$c->on(json => sub( $c, $message ) { $c->on(json => sub( $c, $message ) {
if ( $message->{event} eq 'KEEPALIVE' ) { if ( $message->{event} eq 'KEEPALIVE' ) {
my $user;
my $is_member = 0; my $is_member = 0;
if ($message->{payload} =~ /^\d+$/) { if ($message->{payload} =~ /^\d+$/) {
$user = $c->schema->resultset('User')->find({ $user ||= $c->schema->resultset('User')->find({
id => $message->{payload}, id => $message->{payload},
}); });
} }
...@@ -57,7 +61,7 @@ sub main { ...@@ -57,7 +61,7 @@ sub main {
); );
} }
else { else {
$user->update({ keepalive => \'now()' }); $user->add_to_alive({ event_id => $event_id });
$is_member = 1 if $user && $user->roles =~ /member/; $is_member = 1 if $user && $user->roles =~ /member/;
my $jitsi = $user->jitsi_allowed || $user->roles =~ /chairman|jitsi/; my $jitsi = $user->jitsi_allowed || $user->roles =~ /chairman|jitsi/;
...@@ -70,7 +74,7 @@ sub main { ...@@ -70,7 +74,7 @@ sub main {
} }
$c->redis->db->set( $c->redis->db->set(
join (':', ('live', 0, $is_member, $is_member ? $user->id : $key)), #TODO: event_id join (':', ('live', $event_id, $is_member, $is_member ? $user->id : $key)),
'live', 'EX', ALIVE_TIME 'live', 'EX', ALIVE_TIME
); );
...@@ -78,8 +82,8 @@ sub main { ...@@ -78,8 +82,8 @@ sub main {
}); });
$c->on(finish => sub ($c, $code, $reason = undef) { $c->on(finish => sub ($c, $code, $reason = undef) {
$pubsub->unlisten('notify', $listener); $pubsub->unlisten("notify:$event_id", $listener);
$pubsub->unlisten('online:0', $listener_online); #TODO: event_id $pubsub->unlisten("online:$event_id", $listener_online);
$c->app->log->debug("WebSocket closed with status $code"); $c->app->log->debug("WebSocket closed with status $code");
}); });
} }
......
...@@ -201,7 +201,7 @@ sub register ($class, $self, $conf) { ...@@ -201,7 +201,7 @@ sub register ($class, $self, $conf) {
}); });
$self->helper( notify => sub ( $c, $event, $payload ) { $self->helper( "notify:0" => sub ( $c, $event, $payload ) { #TODO: event_id
my $content = { my $content = {
event => $event, event => $event,
......
package CF::Schema::Result::Alive;
use strict;
use warnings;
use feature 'signatures';
no warnings qw{ experimental::signatures };
use base 'DBIx::Class::Core';
our $VERSION = 1;
__PACKAGE__->table('alive');
__PACKAGE__->add_columns(
id => {
data_type => 'integer',
is_auto_increment => 1,
is_nullable => 0,
sequence => 'uid_seq'
},
qw(
event_id
user_id
timestamp
),
);
__PACKAGE__->set_primary_key('id');
__PACKAGE__->belongs_to(
event => 'CF::Schema::Result::Event',
{
'foreign.id' => 'self.user_id',
},
);
__PACKAGE__->belongs_to(
user => 'CF::Schema::Result::User',
{
'foreign.id' => 'self.user_id',
},
);
1;
...@@ -28,7 +28,6 @@ __PACKAGE__->add_columns( ...@@ -28,7 +28,6 @@ __PACKAGE__->add_columns(
name name
roles roles
main_group_name main_group_name
keepalive
banned_until banned_until
jitsi_allowed jitsi_allowed
), ),
...@@ -45,6 +44,11 @@ __PACKAGE__->has_many( ...@@ -45,6 +44,11 @@ __PACKAGE__->has_many(
{ 'foreign.user_id' => 'self.id', }, { 'foreign.user_id' => 'self.id', },
); );
__PACKAGE__->has_many(
alive => 'CF::Schema::Result::Alive',
{ 'foreign.user_id' => 'self.id', },
);
sub formatted($self) { sub formatted($self) {
my $user = { my $user = {
......
create table "alive" (
"id" integer not null default nextval('uid_seq'),
"event_id" integer not null,
"user_id" integer not null,
"timestamp" timestamp(0) not null default now(),
foreign key ("event_id") references "events" ("id") on update cascade on delete cascade,
foreign key ("user_id") references "users" ("id") on update cascade on delete cascade
);
create index "alive_timestamp_idx" on "alive" ("timestamp");
alter table "users" drop column "keepalive";
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment