2020-09-30 17:12:29 +00:00
|
|
|
|
% if (my $invalid = stash('invalid')) {
|
|
|
|
|
%= include '_invalid_input', invalid => $invalid
|
|
|
|
|
% }
|
|
|
|
|
|
|
|
|
|
<h1>Träwelling</h1>
|
|
|
|
|
|
|
|
|
|
<div class="row">
|
|
|
|
|
<div class="col s12">
|
|
|
|
|
<div class="card purple">
|
|
|
|
|
<div class="card-content white-text">
|
|
|
|
|
<span class="card-title">Beta-Feature</span>
|
2022-02-16 19:56:28 +00:00
|
|
|
|
<p>
|
2020-10-04 09:51:22 +00:00
|
|
|
|
Bekannte Einschränkung: Hooks werden bei einem Checkin via Träwelling nicht ausgelöst.
|
2022-11-10 16:51:45 +00:00
|
|
|
|
Die Träwelling-API ist noch nicht stabil.
|
2020-09-30 17:12:29 +00:00
|
|
|
|
</p>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="card-action">
|
|
|
|
|
<a href="https://github.com/derf/travelynx/issues" class="waves-effect waves-light btn-flat white-text">
|
2020-10-04 09:51:22 +00:00
|
|
|
|
<i class="material-icons left" aria-hidden="true">bug_report</i>Bug melden
|
2020-09-30 17:12:29 +00:00
|
|
|
|
</a>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
% if (stash('new_traewelling')) {
|
|
|
|
|
<div class="row">
|
|
|
|
|
<div class="col s12">
|
|
|
|
|
% if ($traewelling->{token}) {
|
|
|
|
|
<div class="card success-color">
|
|
|
|
|
<div class="card-content white-text">
|
|
|
|
|
<span class="card-title">Träwelling verknüpft</span>
|
|
|
|
|
% my $user = $traewelling->{data}{user_name} // $traewelling->{email};
|
|
|
|
|
<p>Dein travelynx-Account hat nun ein Jahr lang Zugriff auf
|
|
|
|
|
den Träwelling-Account <b>@<%= $user %></b>.</p>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
% }
|
|
|
|
|
% elsif (my $login_err = stash('login_error')) {
|
|
|
|
|
<div class="card caution-color">
|
|
|
|
|
<div class="card-content white-text">
|
|
|
|
|
<span class="card-title">Login-Fehler</span>
|
|
|
|
|
<p>Der Login bei Träwelling ist fehlgeschlagen: <%= $login_err %></p>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
% }
|
|
|
|
|
% elsif (my $logout_err = stash('logout_error')) {
|
|
|
|
|
<div class="card caution-color">
|
|
|
|
|
<div class="card-content white-text">
|
|
|
|
|
<span class="card-title">Logout-Fehler</span>
|
|
|
|
|
<p>Der Logout bei Träwelling ist fehlgeschlagen: <%= $logout_err %>.
|
|
|
|
|
Dein Login-Token bei travelynx wurde dennoch gelöscht, so
|
|
|
|
|
dass nun kein Zugriff von travelynx auf Träwelling mehr
|
|
|
|
|
möglich ist. In den <a
|
|
|
|
|
href="https://traewelling.de/settings">Träwelling-Einstellungen</a>
|
|
|
|
|
kannst du ihn vollständig löschen.</p>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
% }
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
% }
|
|
|
|
|
|
2020-10-04 09:51:22 +00:00
|
|
|
|
% if ($traewelling->{token} and ($traewelling->{expired} or $traewelling->{expiring})) {
|
|
|
|
|
<div class="row">
|
|
|
|
|
<div class="col s12">
|
|
|
|
|
<div class="card caution-color">
|
|
|
|
|
<div class="card-content white-text">
|
|
|
|
|
% if ($traewelling->{expired}) {
|
|
|
|
|
<span class="card-title">Login-Token abgelaufen</span>
|
|
|
|
|
% }
|
|
|
|
|
% else {
|
|
|
|
|
<span class="card-title">Login-Token läuft bald ab</span>
|
|
|
|
|
% }
|
|
|
|
|
<p>Melde deinen travelynx-Account von Träwelling ab und
|
|
|
|
|
verbinde ihn mit deinem Träwelling-Passwort erneut,
|
|
|
|
|
um einen neuen Token zu erhalten.</p>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="card-action">
|
|
|
|
|
%= form_for '/account/traewelling' => (method => 'POST') => begin
|
|
|
|
|
%= csrf_field
|
|
|
|
|
<button class="btn-flat waves-effect waves-light white-text" type="submit" name="action" value="logout">
|
|
|
|
|
<i class="material-icons left" aria-hidden="true">sync_disabled</i>
|
|
|
|
|
Abmelden
|
|
|
|
|
</button>
|
|
|
|
|
%= end
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
% }
|
|
|
|
|
|
2020-09-30 17:12:29 +00:00
|
|
|
|
% if (not $traewelling->{token}) {
|
|
|
|
|
<div class="row">
|
|
|
|
|
<div class="col s12">
|
|
|
|
|
<p>
|
|
|
|
|
Hier hast du die Möglichkeit, deinen travelynx-Account mit einem
|
|
|
|
|
Account bei <a href="https://traewelling.de">Träwelling</a> zu
|
2021-10-30 08:07:08 +00:00
|
|
|
|
verknüpfen. Dies erlaubt die automatische Übernahme zukünftiger
|
|
|
|
|
Checkins zwischen den beiden Diensten. Träwelling-Checkins in
|
2020-09-30 17:12:29 +00:00
|
|
|
|
Nahverkehrsmittel und Züge außerhalb des deutschen Schienennetzes
|
2021-10-30 08:07:08 +00:00
|
|
|
|
werden nicht unterstützt und ignoriert. Checkins, die vor dem
|
|
|
|
|
Verknüpfen der Accounts stattgefunden haben, werden nicht
|
2022-02-16 19:56:28 +00:00
|
|
|
|
synchronisiert. Bei synchronisierten Checkins wird der zugehörige
|
|
|
|
|
Träwelling-Status von deiner travelynx-Statusseite aus verlinkt.
|
2020-09-30 17:12:29 +00:00
|
|
|
|
</p>
|
|
|
|
|
<p>
|
|
|
|
|
Mit E-Mail und Passwort wird ein Login über die Träwelling-API
|
|
|
|
|
durchgeführt. Die E-Mail und das dabei generierte Token werden
|
|
|
|
|
von travelynx gespeichert. Das Passwort wird ausschließlich für
|
|
|
|
|
den Login verwendet und nicht gespeichert. Der Login kann jederzeit
|
|
|
|
|
sowohl auf dieser Seite als auch über die <a
|
|
|
|
|
href="https://traewelling.de/settings">Träwelling-Einstellungen</a>
|
|
|
|
|
widerrufen werden. Nach einem Jahr läuft er automatisch ab.
|
|
|
|
|
</p>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="row">
|
|
|
|
|
%= form_for '/account/traewelling' => (method => 'POST') => begin
|
|
|
|
|
%= csrf_field
|
|
|
|
|
<div class="input-field col s12">
|
|
|
|
|
<i class="material-icons prefix">account_circle</i>
|
|
|
|
|
%= text_field 'email', id => 'email', class => 'validate', required => undef, maxlength => 250
|
2022-11-07 17:23:05 +00:00
|
|
|
|
<label for="email">Login (Name oder E-Mail)</label>
|
2020-09-30 17:12:29 +00:00
|
|
|
|
</div>
|
|
|
|
|
<div class="input-field col s12">
|
|
|
|
|
<i class="material-icons prefix">lock</i>
|
|
|
|
|
%= password_field 'password', id => 'password', class => 'validate', required => undef
|
|
|
|
|
<label for="password">Passwort</label>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="col s12 center-align">
|
|
|
|
|
<button class="btn waves-effect waves-light" type="submit" name="action" value="login">
|
|
|
|
|
Verknüpfen
|
|
|
|
|
<i class="material-icons right">send</i>
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
%= end
|
|
|
|
|
</div>
|
|
|
|
|
% }
|
|
|
|
|
% else {
|
|
|
|
|
<div class="row">
|
|
|
|
|
<div class="col s12">
|
|
|
|
|
<p>
|
|
|
|
|
Dieser travelynx-Account ist mit dem Träwelling-Account
|
|
|
|
|
% if (my $user = $traewelling->{data}{user_name}) {
|
2021-12-01 16:52:09 +00:00
|
|
|
|
<a href="https://traewelling.de/@<%= $user %>"><%= $user %></a>
|
2020-09-30 17:12:29 +00:00
|
|
|
|
% }
|
|
|
|
|
% else {
|
|
|
|
|
%= $traewelling->{email}
|
|
|
|
|
% }
|
2020-10-04 08:38:09 +00:00
|
|
|
|
verknüpft. Der Login-Token läuft <%= $traewelling->{expires_on}->strftime('am %d.%m.%Y um %H:%M Uhr') %> ab.
|
2020-09-30 17:12:29 +00:00
|
|
|
|
</p>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
%= form_for '/account/traewelling' => (method => 'POST') => begin
|
2020-10-04 10:50:41 +00:00
|
|
|
|
%= csrf_field
|
2020-09-30 17:12:29 +00:00
|
|
|
|
<div class="row">
|
|
|
|
|
<div class="input-field col s12">
|
|
|
|
|
<div>
|
|
|
|
|
<label>
|
|
|
|
|
%= radio_button sync_source => 'none'
|
|
|
|
|
<span>Keine Synchronisierung</span>
|
|
|
|
|
</label>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="input-field col s12">
|
|
|
|
|
<div>
|
|
|
|
|
<label>
|
2020-10-01 17:36:35 +00:00
|
|
|
|
%= radio_button sync_source => 'travelynx'
|
2020-09-30 17:12:29 +00:00
|
|
|
|
<span>Checkin-Synchronisierung travelynx → Träwelling</span>
|
|
|
|
|
</label>
|
|
|
|
|
</div>
|
2020-10-04 10:50:41 +00:00
|
|
|
|
<div>
|
|
|
|
|
<label>
|
|
|
|
|
%= check_box toot => 1
|
|
|
|
|
<span>… Checkin auf Mastodon veröffentlichen</span>
|
|
|
|
|
</label>
|
|
|
|
|
</div>
|
|
|
|
|
<div>
|
|
|
|
|
<label>
|
|
|
|
|
%= check_box tweet => 1
|
|
|
|
|
<span>… Checkin auf Twitter veröffentlichen</span>
|
|
|
|
|
</label>
|
|
|
|
|
</div>
|
2020-09-30 17:12:29 +00:00
|
|
|
|
<p>Die Synchronisierung erfolgt spätestens drei Minuten nach der
|
|
|
|
|
Zielwahl. Träwelling-Checkins können von travelynx noch nicht
|
2020-10-01 17:48:18 +00:00
|
|
|
|
rückgängig gemacht werden. Eine nachträgliche Änderung der
|
2020-10-04 10:50:41 +00:00
|
|
|
|
Zielstation wird nicht übernommen. Mastodon und Twitter beziehen
|
|
|
|
|
sich auf die in den <a
|
|
|
|
|
href="https://traewelling.de/settings">Träwelling-Einstellungen</a>
|
|
|
|
|
verknüpften Accounts.</p>
|
2020-09-30 17:12:29 +00:00
|
|
|
|
</div>
|
|
|
|
|
<div class="input-field col s12">
|
|
|
|
|
<div>
|
|
|
|
|
<label>
|
|
|
|
|
%= radio_button sync_source => 'traewelling'
|
|
|
|
|
<span>Checkin-Synchronisierung Träwelling → travelynx</span>
|
|
|
|
|
</label>
|
|
|
|
|
</div>
|
2023-01-07 12:57:47 +00:00
|
|
|
|
<p>Alle fünf Minuten wird dein Status auf Träwelling abgefragt.
|
2020-09-30 17:12:29 +00:00
|
|
|
|
Falls du gerade in einen Zug eingecheckt bist, wird dieser von
|
|
|
|
|
travelynx übernommen. Träwelling-Checkins in Nahverkehrsmittel
|
|
|
|
|
und Züge außerhalb des deutschen Schienennetzes werden nicht
|
|
|
|
|
unterstützt.</p>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="row hide-on-small-only">
|
|
|
|
|
<div class="col s12 m6 l6 center-align">
|
|
|
|
|
<button class="btn waves-effect waves-light red" type="submit" name="action" value="logout">
|
|
|
|
|
Abmelden
|
|
|
|
|
<i class="material-icons right" aria-hidden="true">sync_disabled</i>
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="col s12 m6 l6 center-align">
|
|
|
|
|
<button class="btn waves-effect waves-light" type="submit" name="action" value="config">
|
|
|
|
|
Speichern
|
|
|
|
|
<i class="material-icons right" aria-hidden="true">send</i>
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="row hide-on-med-and-up">
|
|
|
|
|
<div class="col s12 m6 l6 center-align">
|
|
|
|
|
<button class="btn waves-effect waves-light" type="submit" name="action" value="config">
|
|
|
|
|
Speichern
|
|
|
|
|
<i class="material-icons right" aria-hidden="true">send</i>
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="col s12 m6 l6 center-align" style="margin-top: 1em;">
|
|
|
|
|
<button class="btn waves-effect waves-light red" type="submit" name="action" value="logout">
|
|
|
|
|
Abmelden
|
|
|
|
|
<i class="material-icons right" aria-hidden="true">sync_disabled</i>
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
%= end
|
|
|
|
|
<h2>Status</h2>
|
|
|
|
|
<div class="row">
|
|
|
|
|
<div class="col s12"">
|
|
|
|
|
% if ($traewelling->{latest_run}->epoch) {
|
2020-09-30 17:46:54 +00:00
|
|
|
|
Letzter Checkin <%= $traewelling->{latest_run}->strftime('am %d.%m.%Y um %H:%M:%S') %><br/>
|
2020-09-30 17:12:29 +00:00
|
|
|
|
% if ($traewelling->{errored}) {
|
|
|
|
|
<i class="material-icons left">error</i>
|
|
|
|
|
Fehler: <%= $traewelling->{data}{error} %>
|
|
|
|
|
% }
|
|
|
|
|
% }
|
|
|
|
|
% else {
|
2020-09-30 17:46:54 +00:00
|
|
|
|
Bisher wurde noch kein Checkin übernommen.
|
2020-09-30 17:12:29 +00:00
|
|
|
|
% }
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<h2>Log</h2>
|
|
|
|
|
<div class="row">
|
|
|
|
|
<div class="col s12"">
|
|
|
|
|
<ul>
|
|
|
|
|
% for my $log_entry (@{$traewelling->{data}{log} // []}) {
|
|
|
|
|
<li>
|
|
|
|
|
<%= $log_entry->[0]->strftime('%d.%m.%Y %H:%M:%S') %> –
|
|
|
|
|
% if ($log_entry->[2]) {
|
|
|
|
|
Träwelling <a href="https://traewelling.de/status/<%= $log_entry->[2] %>">#<%= $log_entry->[2] %></a> –
|
|
|
|
|
% }
|
|
|
|
|
%= $log_entry->[1]
|
|
|
|
|
</li>
|
|
|
|
|
% }
|
|
|
|
|
</ul>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
% }
|