Loading lib/Travelynx.pm +22 −6 Original line number Diff line number Diff line Loading @@ -1378,6 +1378,16 @@ sub startup { } ); $self->helper( 'resolve_sb_template' => sub { my ( $self, $template, %opt ) = @_; my $ret = $template; $ret =~ s{[{]eva[}]}{$opt{eva}}g; $ret =~ s{[{]name[}]}{$opt{name}}g; return $ret; } ); $self->helper( 'get_connection_targets' => sub { my ( $self, %opt ) = @_; Loading Loading @@ -1957,16 +1967,20 @@ sub startup { ); if ( $latest_cancellation and $latest_cancellation->{cancelled} ) { if ( my $station = $self->app->station_by_eva ->{ $latest_cancellation->{dep_eva} } ) if ( my $station = $self->app->station_by_eva->{ $latest_cancellation->{dep_eva} } ) { $latest_cancellation->{dep_ds100} = $station->[0]; $latest_cancellation->{dep_name} = $station->[1]; } if ( my $station = $self->app->station_by_eva ->{ $latest_cancellation->{arr_eva} } ) if ( my $station = $self->app->station_by_eva->{ $latest_cancellation->{arr_eva} } ) { $latest_cancellation->{arr_ds100} = $station->[0]; $latest_cancellation->{arr_name} = $station->[1]; Loading Loading @@ -2554,6 +2568,7 @@ sub startup { $authed_r->get('/account/hooks')->to('account#webhook'); $authed_r->get('/account/traewelling')->to('traewelling#settings'); $authed_r->get('/account/insight')->to('account#insight'); $authed_r->get('/account/services')->to('account#services'); $authed_r->get('/ajax/status_card.html')->to('traveling#status_card'); $authed_r->get('/cancelled')->to('traveling#cancelled'); $authed_r->get('/fgr')->to('passengerrights#list_candidates'); Loading @@ -2577,6 +2592,7 @@ sub startup { $authed_r->post('/account/hooks')->to('account#webhook'); $authed_r->post('/account/traewelling')->to('traewelling#settings'); $authed_r->post('/account/insight')->to('account#insight'); $authed_r->post('/account/services')->to('account#services'); $authed_r->post('/journey/add')->to('traveling#add_journey_form'); $authed_r->post('/journey/comment')->to('traveling#comment_form'); $authed_r->post('/journey/edit')->to('traveling#edit_journey'); Loading lib/Travelynx/Command/database.pm +14 −0 Original line number Diff line number Diff line Loading @@ -1069,6 +1069,20 @@ my @migrations = ( } ); }, # v24 -> v25 # travelynx 1.23 adds optional links to external services, e.g. # DBF or marudor.de departure boards sub { my ($db) = @_; $db->query( qq{ alter table users add column external_services smallint; comment on column users.external_services is 'Which external service to use for stationboard or routing links'; update schema_version set version = 25; } ); }, ); sub setup_db { Loading lib/Travelynx/Controller/Account.pm +23 −0 Original line number Diff line number Diff line Loading @@ -375,6 +375,29 @@ sub insight { } sub services { my ($self) = @_; my $user = $self->current_user; if ( $self->param('action') and $self->param('action') eq 'save' ) { my $sb = $self->param('stationboard'); my $value = 0; if ( $sb =~ m{ ^ \d+ $ }x and $sb >= 0 and $sb <= 3 ) { $value = int($sb); } $self->users->use_external_services( uid => $user->{id}, set => $value ); $self->flash( success => 'external' ); $self->redirect_to('account'); } $self->param( stationboard => $self->users->use_external_services( uid => $user->{id} ) ); $self->render('use_external_links'); } sub webhook { my ($self) = @_; Loading lib/Travelynx/Model/Users.pm +37 −6 Original line number Diff line number Diff line Loading @@ -10,6 +10,13 @@ use 5.020; use DateTime; my @sb_templates = ( undef, [ 'DBF', 'https://dbf.finalrewind.org/{name}' ], [ 'marudor.de', 'https://marudor.de/{name}' ], [ 'NVM', 'https://nvm.finalrewind.org/board/{eva}' ], ); sub new { my ( $class, %opt ) = @_; Loading Loading @@ -286,7 +293,7 @@ sub get_data { my $user = $db->select( 'users', 'id, name, status, public_level, email, ' 'id, name, status, public_level, email, external_services, ' . 'extract(epoch from registered_at) as registered_at_ts, ' . 'extract(epoch from last_seen) as last_seen_ts, ' . 'extract(epoch from deletion_requested) as deletion_requested_ts', Loading @@ -299,6 +306,12 @@ sub get_data { status => $user->{status}, is_public => $user->{public_level}, email => $user->{email}, sb_name => $user->{external_services} ? $sb_templates[ $user->{external_services} & 0x07 ][0] : undef, sb_template => $user->{external_services} ? $sb_templates[ $user->{external_services} & 0x07 ][1] : undef, registered_at => DateTime->from_epoch( epoch => $user->{registered_at_ts}, time_zone => 'Europe/Berlin' Loading Loading @@ -478,6 +491,24 @@ sub use_history { } } sub use_external_services { my ( $self, %opt ) = @_; my $db = $opt{db} // $self->{pg}->db; my $uid = $opt{uid}; my $value = $opt{set}; if ($value) { if ( $value < 0 or $value > 3 ) { $value = 0; } $db->update( 'users', { external_services => $value }, { id => $uid } ); } else { return $db->select( 'users', ['external_services'], { id => $uid } ) ->hash->{external_services}; } } sub get_webhook { my ( $self, %opt ) = @_; my $db = $opt{db} // $self->{pg}->db; Loading templates/_checked_in.html.ep +15 −5 Original line number Diff line number Diff line % my $user = current_user(); <div class="autorefresh"> <div class="card"> <div class="card-content"> Loading Loading @@ -102,7 +103,12 @@ % } </div> <div style="float: right; text-align: right;"> % if ($user->{sb_template}) { <b><a href="<%= resolve_sb_template($user->{sb_template}, name => $journey->{arr_name}, eva => $journey->{arr_eva}) %>" class="unmarked"><%= $journey->{arr_name} %></a></b><br/> % } % else { <b><%= $journey->{arr_name} %></b><br/> % } % if ($journey->{real_arrival}->epoch) { <b><%= $journey->{real_arrival}->strftime('%H:%M') %></b> % if ($journey->{real_arrival}->epoch != $journey->{sched_arrival}->epoch) { Loading Loading @@ -250,14 +256,14 @@ % } <a class="action-share blue-text right" style="margin-right: 0;" % if (current_user()->{is_public} & 0x04 and $journey->{comment}) { % if ($user->{is_public} & 0x04 and $journey->{comment}) { data-text="<%= $journey->{comment} %> (@ <%= $journey->{train_type} %> <%= $journey->{train_no} %> → <%= $journey->{arr_name} %>) #travelynx" % } % else { data-text="Ich bin gerade <%= $attrib %> <%= $journey->{train_type} %> <%= $journey->{train_no} %> nach <%= $journey->{arr_name} %> #travelynx" % } % if (current_user()->{is_public} & 0x02) { data-url="<%= url_for('/status')->to_abs->scheme('https') %>/<%= current_user->{name} %>/<%= $journey->{sched_departure}->epoch %>" % if ($user->{is_public} & 0x02) { data-url="<%= url_for('/status')->to_abs->scheme('https') %>/<%= $user->{name} %>/<%= $journey->{sched_departure}->epoch %>" % } > <i class="material-icons left" aria-hidden="true">share</i> Teilen Loading Loading @@ -309,7 +315,11 @@ <tbody> % for my $station (@{$journey->{route_after}}) { % my $is_dest = ($journey->{arr_name} and $station->[0] eq $journey->{arr_name}); <tr><td><a style="<%= $is_dest? 'font-weight: bold;' : '' %>" class="action-checkout" data-station="<%= $station->[0] %>"><%= $station->[0] %> <tr><td> % if ($user->{sb_template}) { <a href="<%= resolve_sb_template($user->{sb_template}, name => $station->[0], eva => $station->[1]{eva}) %>"><i class="material-icons tiny">info</i></a> % } <a style="<%= $is_dest? 'font-weight: bold;' : '' %>" class="action-checkout" data-station="<%= $station->[0] %>"><%= $station->[0] %> % if ($station->[2] and $station->[2] eq 'cancelled') { <span style="float: right;">entfällt</span> % } Loading Loading
lib/Travelynx.pm +22 −6 Original line number Diff line number Diff line Loading @@ -1378,6 +1378,16 @@ sub startup { } ); $self->helper( 'resolve_sb_template' => sub { my ( $self, $template, %opt ) = @_; my $ret = $template; $ret =~ s{[{]eva[}]}{$opt{eva}}g; $ret =~ s{[{]name[}]}{$opt{name}}g; return $ret; } ); $self->helper( 'get_connection_targets' => sub { my ( $self, %opt ) = @_; Loading Loading @@ -1957,16 +1967,20 @@ sub startup { ); if ( $latest_cancellation and $latest_cancellation->{cancelled} ) { if ( my $station = $self->app->station_by_eva ->{ $latest_cancellation->{dep_eva} } ) if ( my $station = $self->app->station_by_eva->{ $latest_cancellation->{dep_eva} } ) { $latest_cancellation->{dep_ds100} = $station->[0]; $latest_cancellation->{dep_name} = $station->[1]; } if ( my $station = $self->app->station_by_eva ->{ $latest_cancellation->{arr_eva} } ) if ( my $station = $self->app->station_by_eva->{ $latest_cancellation->{arr_eva} } ) { $latest_cancellation->{arr_ds100} = $station->[0]; $latest_cancellation->{arr_name} = $station->[1]; Loading Loading @@ -2554,6 +2568,7 @@ sub startup { $authed_r->get('/account/hooks')->to('account#webhook'); $authed_r->get('/account/traewelling')->to('traewelling#settings'); $authed_r->get('/account/insight')->to('account#insight'); $authed_r->get('/account/services')->to('account#services'); $authed_r->get('/ajax/status_card.html')->to('traveling#status_card'); $authed_r->get('/cancelled')->to('traveling#cancelled'); $authed_r->get('/fgr')->to('passengerrights#list_candidates'); Loading @@ -2577,6 +2592,7 @@ sub startup { $authed_r->post('/account/hooks')->to('account#webhook'); $authed_r->post('/account/traewelling')->to('traewelling#settings'); $authed_r->post('/account/insight')->to('account#insight'); $authed_r->post('/account/services')->to('account#services'); $authed_r->post('/journey/add')->to('traveling#add_journey_form'); $authed_r->post('/journey/comment')->to('traveling#comment_form'); $authed_r->post('/journey/edit')->to('traveling#edit_journey'); Loading
lib/Travelynx/Command/database.pm +14 −0 Original line number Diff line number Diff line Loading @@ -1069,6 +1069,20 @@ my @migrations = ( } ); }, # v24 -> v25 # travelynx 1.23 adds optional links to external services, e.g. # DBF or marudor.de departure boards sub { my ($db) = @_; $db->query( qq{ alter table users add column external_services smallint; comment on column users.external_services is 'Which external service to use for stationboard or routing links'; update schema_version set version = 25; } ); }, ); sub setup_db { Loading
lib/Travelynx/Controller/Account.pm +23 −0 Original line number Diff line number Diff line Loading @@ -375,6 +375,29 @@ sub insight { } sub services { my ($self) = @_; my $user = $self->current_user; if ( $self->param('action') and $self->param('action') eq 'save' ) { my $sb = $self->param('stationboard'); my $value = 0; if ( $sb =~ m{ ^ \d+ $ }x and $sb >= 0 and $sb <= 3 ) { $value = int($sb); } $self->users->use_external_services( uid => $user->{id}, set => $value ); $self->flash( success => 'external' ); $self->redirect_to('account'); } $self->param( stationboard => $self->users->use_external_services( uid => $user->{id} ) ); $self->render('use_external_links'); } sub webhook { my ($self) = @_; Loading
lib/Travelynx/Model/Users.pm +37 −6 Original line number Diff line number Diff line Loading @@ -10,6 +10,13 @@ use 5.020; use DateTime; my @sb_templates = ( undef, [ 'DBF', 'https://dbf.finalrewind.org/{name}' ], [ 'marudor.de', 'https://marudor.de/{name}' ], [ 'NVM', 'https://nvm.finalrewind.org/board/{eva}' ], ); sub new { my ( $class, %opt ) = @_; Loading Loading @@ -286,7 +293,7 @@ sub get_data { my $user = $db->select( 'users', 'id, name, status, public_level, email, ' 'id, name, status, public_level, email, external_services, ' . 'extract(epoch from registered_at) as registered_at_ts, ' . 'extract(epoch from last_seen) as last_seen_ts, ' . 'extract(epoch from deletion_requested) as deletion_requested_ts', Loading @@ -299,6 +306,12 @@ sub get_data { status => $user->{status}, is_public => $user->{public_level}, email => $user->{email}, sb_name => $user->{external_services} ? $sb_templates[ $user->{external_services} & 0x07 ][0] : undef, sb_template => $user->{external_services} ? $sb_templates[ $user->{external_services} & 0x07 ][1] : undef, registered_at => DateTime->from_epoch( epoch => $user->{registered_at_ts}, time_zone => 'Europe/Berlin' Loading Loading @@ -478,6 +491,24 @@ sub use_history { } } sub use_external_services { my ( $self, %opt ) = @_; my $db = $opt{db} // $self->{pg}->db; my $uid = $opt{uid}; my $value = $opt{set}; if ($value) { if ( $value < 0 or $value > 3 ) { $value = 0; } $db->update( 'users', { external_services => $value }, { id => $uid } ); } else { return $db->select( 'users', ['external_services'], { id => $uid } ) ->hash->{external_services}; } } sub get_webhook { my ( $self, %opt ) = @_; my $db = $opt{db} // $self->{pg}->db; Loading
templates/_checked_in.html.ep +15 −5 Original line number Diff line number Diff line % my $user = current_user(); <div class="autorefresh"> <div class="card"> <div class="card-content"> Loading Loading @@ -102,7 +103,12 @@ % } </div> <div style="float: right; text-align: right;"> % if ($user->{sb_template}) { <b><a href="<%= resolve_sb_template($user->{sb_template}, name => $journey->{arr_name}, eva => $journey->{arr_eva}) %>" class="unmarked"><%= $journey->{arr_name} %></a></b><br/> % } % else { <b><%= $journey->{arr_name} %></b><br/> % } % if ($journey->{real_arrival}->epoch) { <b><%= $journey->{real_arrival}->strftime('%H:%M') %></b> % if ($journey->{real_arrival}->epoch != $journey->{sched_arrival}->epoch) { Loading Loading @@ -250,14 +256,14 @@ % } <a class="action-share blue-text right" style="margin-right: 0;" % if (current_user()->{is_public} & 0x04 and $journey->{comment}) { % if ($user->{is_public} & 0x04 and $journey->{comment}) { data-text="<%= $journey->{comment} %> (@ <%= $journey->{train_type} %> <%= $journey->{train_no} %> → <%= $journey->{arr_name} %>) #travelynx" % } % else { data-text="Ich bin gerade <%= $attrib %> <%= $journey->{train_type} %> <%= $journey->{train_no} %> nach <%= $journey->{arr_name} %> #travelynx" % } % if (current_user()->{is_public} & 0x02) { data-url="<%= url_for('/status')->to_abs->scheme('https') %>/<%= current_user->{name} %>/<%= $journey->{sched_departure}->epoch %>" % if ($user->{is_public} & 0x02) { data-url="<%= url_for('/status')->to_abs->scheme('https') %>/<%= $user->{name} %>/<%= $journey->{sched_departure}->epoch %>" % } > <i class="material-icons left" aria-hidden="true">share</i> Teilen Loading Loading @@ -309,7 +315,11 @@ <tbody> % for my $station (@{$journey->{route_after}}) { % my $is_dest = ($journey->{arr_name} and $station->[0] eq $journey->{arr_name}); <tr><td><a style="<%= $is_dest? 'font-weight: bold;' : '' %>" class="action-checkout" data-station="<%= $station->[0] %>"><%= $station->[0] %> <tr><td> % if ($user->{sb_template}) { <a href="<%= resolve_sb_template($user->{sb_template}, name => $station->[0], eva => $station->[1]{eva}) %>"><i class="material-icons tiny">info</i></a> % } <a style="<%= $is_dest? 'font-weight: bold;' : '' %>" class="action-checkout" data-station="<%= $station->[0] %>"><%= $station->[0] %> % if ($station->[2] and $station->[2] eq 'cancelled') { <span style="float: right;">entfällt</span> % } Loading