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 {
$c->tx->with_compression;
my $key = $c->req->headers->header('Sec-WebSocket-Key');
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));
});
}
);
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;
$c->send({json => {
event => 'online_users_updated',
......@@ -35,16 +39,16 @@ sub main {
group_size_half => $counts[3]+0,
}
}});
});
}
);
$c->on(json => sub( $c, $message ) {
if ( $message->{event} eq 'KEEPALIVE' ) {
my $user;
my $is_member = 0;
if ($message->{payload} =~ /^\d+$/) {
$user = $c->schema->resultset('User')->find({
$user ||= $c->schema->resultset('User')->find({
id => $message->{payload},
});
}
......@@ -57,7 +61,7 @@ sub main {
);
}
else {
$user->update({ keepalive => \'now()' });
$user->add_to_alive({ event_id => $event_id });
$is_member = 1 if $user && $user->roles =~ /member/;
my $jitsi = $user->jitsi_allowed || $user->roles =~ /chairman|jitsi/;
......@@ -70,7 +74,7 @@ sub main {
}
$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
);
......@@ -78,8 +82,8 @@ sub main {
});
$c->on(finish => sub ($c, $code, $reason = undef) {
$pubsub->unlisten('notify', $listener);
$pubsub->unlisten('online:0', $listener_online); #TODO: event_id
$pubsub->unlisten("notify:$event_id", $listener);
$pubsub->unlisten("online:$event_id", $listener_online);
$c->app->log->debug("WebSocket closed with status $code");
});
}
......
......@@ -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 = {
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(
name
roles
main_group_name
keepalive
banned_until
jitsi_allowed
),
......@@ -45,6 +44,11 @@ __PACKAGE__->has_many(
{ 'foreign.user_id' => 'self.id', },
);
__PACKAGE__->has_many(
alive => 'CF::Schema::Result::Alive',
{ 'foreign.user_id' => 'self.id', },
);
sub formatted($self) {
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