summaryrefslogtreecommitdiff
path: root/script/tfl_monitor
diff options
context:
space:
mode:
Diffstat (limited to 'script/tfl_monitor')
-rw-r--r--script/tfl_monitor75
1 files changed, 75 insertions, 0 deletions
diff --git a/script/tfl_monitor b/script/tfl_monitor
new file mode 100644
index 0000000..704f3fc
--- /dev/null
+++ b/script/tfl_monitor
@@ -0,0 +1,75 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use TFLMonitor::Schema;
+use XML::LibXML;
+use XML::LibXML::XPathContext;
+use Path::Class;
+
+my $libdir=file(__FILE__)->parent;
+my $dbfile=$libdir->parent->file('monitor.db');
+
+my $doc=XML::LibXML->load_xml(location=> 'http://apibeta.london.gov.uk/TrackernetWebServicev3/timetableservice.aspx?Feed=7&linesWithIncidents=false');
+
+die "Couldn't fetch status\n" unless $doc;
+
+my $schema=TFLMonitor::Schema->connect(
+ "dbi:SQLite:dbname=$dbfile",
+ '','',
+ {
+ AutoCommit => 1,
+ });
+
+my $xpath=XML::LibXML::XPathContext->new($doc);
+$xpath->registerNs('ws','http://webservices.lul.co.uk/');
+
+my (%lines,%status,@ls);
+
+for my $ls ($xpath->findnodes(q{/ws:ArrayOfLineStatus/ws:LineStatus},$doc)) {
+ my ($line)=$xpath->findnodes(q{ws:Line},$ls);
+ my $line_id=$line->findvalue(q{@ID});
+ $lines{$line_id} ||= {
+ id => $line_id,
+ name => $line->findvalue(q{@Name}),
+ };
+
+ my ($status)=$xpath->findnodes(q{ws:Status},$ls);
+ my $status_code=$status->findvalue(q{@ID});
+ my $is_active=$status->findvalue(q{@IsActive});
+ $status{$status_code} ||= {
+ code => $status_code,
+ class => $status->findvalue(q{@CssClass}),
+ description => $status->findvalue(q{@Description}),
+ is_active => $is_active,
+ };
+
+ push @ls,{
+ 'time' => time(),
+ line_id => $line_id,
+ status_code => $status_code,
+ is_active => $is_active,
+ details => $ls->findvalue(q{@StatusDetails}),
+ };
+}
+
+$schema->txn_do(
+ sub{
+ for my $l (values %lines) {
+ $schema->resultset('TFLMonitor::Schema::Line')
+ ->find_or_create(
+ $l,
+ { key => 'primary' },
+ );
+ }
+ for my $s (values %status) {
+ $schema->resultset('TFLMonitor::Schema::Status')
+ ->find_or_create(
+ $s,
+ { key => 'primary' },
+ );
+ }
+ for my $ls (@ls) {
+ $schema->resultset('TFLMonitor::Schema::LineStatus')->create($ls);
+ }
+ }
+);