summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAndreas Brachold <vdr07@deltab.de>2008-08-10 14:05:26 +0000
committerAndreas Brachold <vdr07@deltab.de>2008-08-10 14:05:26 +0000
commit2e9c00e1bdd19f3fb61ce0aaede85d5f5400ef81 (patch)
treebf3734ba1dbfb0e8c5df072c55b19b62603135b5 /lib
parent11ad754da4d127a74e26894e97c232a3a98972b5 (diff)
downloadxxv-2e9c00e1bdd19f3fb61ce0aaede85d5f5400ef81.tar.gz
xxv-2e9c00e1bdd19f3fb61ce0aaede85d5f5400ef81.tar.bz2
* AUTOTIMER: fix some orthography
* EVENTS: store news from last month into database * RSS: dump news from database * TIMERS: event if timer adjusted * TIMERS/AUTOTIMER: rewrite event/news handling * xxvd: show pid at startup * xxvd: show base revision at startup * CHANNELS: fix detect radio channels * REPORT: Refactoring event handling, move any function to modul EVENTS. * EVENTS: elist function to list news as table * EVENTS: respect minimum level to exclude unwanted harmless news * RSS/MAIL... : remove dependency to modul REPORT
Diffstat (limited to 'lib')
-rw-r--r--lib/Tools.pm11
-rw-r--r--lib/XXV/MODULES/AUTOTIMER.pm56
-rw-r--r--lib/XXV/MODULES/CHANNELS.pm6
-rw-r--r--lib/XXV/MODULES/EVENTS.pm339
-rw-r--r--lib/XXV/MODULES/HTTPD.pm6
-rw-r--r--lib/XXV/MODULES/RECORDS.pm4
-rw-r--r--lib/XXV/MODULES/REPORT.pm212
-rw-r--r--lib/XXV/MODULES/SHARE.pm41
-rw-r--r--lib/XXV/MODULES/STATUS.pm2
-rw-r--r--lib/XXV/MODULES/SVDRP.pm23
-rw-r--r--lib/XXV/MODULES/TIMERS.pm306
-rw-r--r--lib/XXV/OUTPUT/Html.pm8
-rw-r--r--lib/XXV/OUTPUT/NEWS/JABBER.pm76
-rw-r--r--lib/XXV/OUTPUT/NEWS/MAIL.pm207
-rw-r--r--lib/XXV/OUTPUT/NEWS/RSS.pm137
-rw-r--r--lib/XXV/OUTPUT/NEWS/VDR.pm61
16 files changed, 812 insertions, 683 deletions
diff --git a/lib/Tools.pm b/lib/Tools.pm
index 682fdde..984314d 100644
--- a/lib/Tools.pm
+++ b/lib/Tools.pm
@@ -356,9 +356,9 @@ sub load_file {
lg sprintf('Load file "%s" (%s)',$file, $binmode);
my $mode = '<';
-# if($binmode ne 'binary') {
-# $mode .= ':utf8' if($CHARSET && $CHARSET eq 'UTF-8');
-# }
+ #if($binmode ne 'binary') {
+ # $mode .= ':encoding(utf8)' if($CHARSET && $CHARSET eq 'UTF-8');
+ #}
my $fh = IO::File->new($file,$mode)
or return error(sprintf("Couldn't open %s : %s!",$file,$!));
@@ -384,11 +384,12 @@ sub save_file {
if($binmode ne 'binary') {
$data =~ s/\r\n/\n/sig;
-# $mode .= ':utf8' if($CHARSET && $CHARSET eq 'UTF-8');
+ # $mode .= ':encoding(utf8)' if($CHARSET && $CHARSET eq 'UTF-8');
}
my $fh = IO::File->new($file,$mode)
- or return error(sprintf("Couldn't write %s : %s!",$file,$!));
+ or return error(sprintf("Couldn't write %s : %s!",$file,$!));
+
print $fh $data;
$fh->close;
diff --git a/lib/XXV/MODULES/AUTOTIMER.pm b/lib/XXV/MODULES/AUTOTIMER.pm
index 26bab5e..30df67a 100644
--- a/lib/XXV/MODULES/AUTOTIMER.pm
+++ b/lib/XXV/MODULES/AUTOTIMER.pm
@@ -104,8 +104,8 @@ sub module {
},
},
RegEvent => {
+ # Create event entries if an autotimer has created a new timer
'newTimerfromAutotimer' => {
- Descr => gettext('Create event entries if an autotimer has created a new timer.'),
# You have this choices (harmless is default):
# 'harmless', 'interesting', 'veryinteresting', 'important', 'veryimportant'
@@ -124,34 +124,20 @@ sub module {
# of the TimerId
# ...
Match => {
- TimerId => qr/id\:\s+\"(\d+)\"/s,
+ pos => qr/Save timer\s+(\d+)/s,
+ host => qr/Save timer\s+\d+\s+on\s+(\S+)/s,
},
Actions => [
q|sub{ my $args = shift;
my $event = shift;
- my $timer = getDataById($args->{TimerId}, 'TIMERS', 'pos');
- my $desc = getDataById($timer->{eventid}, 'EPG', 'eventid') if($timer->{eventid});
- my $autotimer = getDataById($timer->{autotimerid}, 'AUTOTIMER', 'Id');
- my $title = sprintf(gettext("Autotimer('%s') found: %s"),
- $autotimer->{Search}, $timer->{file});
-
- my $description = '';
-
- my $channel = main::getModule('CHANNELS')->ChannelToName($timer->{channel});
- $description .= sprintf(gettext("Channel: %s"), $channel);
- $description .= "\r\n";
- Date_Init("Language=English");
- my $d = ParseDate($timer->{starttime});
- $timer->{starttime} = datum(UnixDate($d,"%s")) if($d);
- $description .= sprintf(gettext("On: %s to %s"),
- $timer->{starttime},
- fmttime($timer->{stop}));
- $description .= "\r\n";
- $description .= sprintf(gettext("Description: %s"), $desc->{description} )
- if($desc && $desc->{description});
+ my $modT = main::getModule('TIMERS') or return;
+ my $timer = $modT->getTimerByPos($modT->{svdrp}->IDfromHostname($args->{host}), $args->{pos}) or return;
- main::getModule('REPORT')->news($title, $description, "display", $timer->{eventid}, $event->{Level});
+ my $autotimer = getDataById($timer->{autotimerid}, 'AUTOTIMER', 'Id');
+ my $title = sprintf(gettext("Autotimer '%s' found: %s"),
+ $autotimer->{Search}, $timer->{file});
+ $modT->_news($title, $timer, $event->{Level});
}
|,
],
@@ -517,7 +503,7 @@ sub _autotimerLookup {
# Wished timer already exist with same data from autotimer ?
next if($obj->_timerexists($event));
- # Adjust timers set by the autotimer
+ # Adjust timers set by Autotimer
my $timerID = $obj->_timerexistsfuzzy($event,$a,$modT);
if(scalar @done) {
@@ -638,7 +624,7 @@ sub autotimerEdit {
if($timerid and not ref $data) {
my $sth = $obj->{dbh}->prepare("SELECT SQL_CACHE * from AUTOTIMER where Id = ?");
$sth->execute($timerid)
- or return $console->err(sprintf(gettext("The autotimer '%s' does not exist in the database."),$timerid));
+ or return $console->err(sprintf(gettext("Autotimer '%s' does not exist in the database!"),$timerid));
$epg = $sth->fetchrow_hashref();
# Channels Ids in Namen umwandeln
@@ -1061,7 +1047,7 @@ sub autotimerDelete {
my $rows = $sth->execute(@timers);
if(!$rows || $rows eq "0E0") {
error sprintf("Couldn't execute query: %s.",$sth->errstr) unless($rows);
- $console->err(sprintf gettext("The autotimer '%s' does not exist in the database."), join(',', @timers));
+ $console->err(sprintf gettext("Autotimer '%s' does not exist in the database!"), join(',', @timers));
return 0;
}
@@ -1076,7 +1062,7 @@ sub autotimerDelete {
# ------------------
# Name: autotimerToogle
-# Descr: Switch the Autotimer on or off.
+# Descr: Switch Autotimer on or off.
# Usage: $obj->autotimerToogle($watcher, $console, $atid);
# ------------------
sub autotimerToggle {
@@ -1091,7 +1077,7 @@ sub autotimerToggle {
my $sth = $obj->{dbh}->prepare($sql);
if(!$sth->execute(@timers)) {
error sprintf("Couldn't execute query: %s.",$sth->errstr);
- $console->err(sprintf(gettext("The autotimer '%s' does not exist in the database."),$timerid));
+ $console->err(sprintf(gettext("Autotimer '%s' does not exist in the database!"),$timerid));
return 0;
}
my $data = $sth->fetchall_hashref('Id');
@@ -1100,7 +1086,7 @@ sub autotimerToggle {
for my $timer (@timers) {
unless(exists $data->{$timer}) {
- $console->err(sprintf(gettext("The autotimer '%s' does not exist in the database."), $timer));
+ $console->err(sprintf(gettext("Autotimer '%s' does not exist in the database!"), $timer));
next;
}
@@ -1110,7 +1096,7 @@ sub autotimerToggle {
my $sth = $obj->{dbh}->prepare($sql);
if(!$sth->execute($status,$timer)) {
error sprintf("Couldn't execute query: %s.",$sth->errstr);
- $console->err(sprintf(gettext("Couldn't toggle autotimer with ID '%s'!"),$timer));
+ $console->err(sprintf(gettext("Couldn't update database to toggle autotimer(%d) !"),$timer));
next;
}
@@ -1121,9 +1107,11 @@ sub autotimerToggle {
);
if($console->typ ne 'AJAX') {
- my $text = ($status eq 'n') ? gettext('disabled')
- : gettext('activated');
- $console->message(sprintf gettext("Autotimer %s is %s."), $timer, $text);
+ if($status eq 'n') {
+ $console->message(sprintf gettext("Autotimer %s is disabled."), $timer);
+ } else {
+ $console->message(sprintf gettext("Autotimer %s is activated."), $timer);
+ }
}
# AJAX
@@ -1454,7 +1442,7 @@ sub _timerexistsfuzzy {
$after = $modT->{afterminutes} * 60;
}
- # Adjust timers set by the autotimer, if event changed +/- five minutes.
+ # Adjust timers set by Autotimer, if event changed +/- five minutes.
my $sql = "SELECT SQL_CACHE id from TIMERS where
channel = ?
and ? between (UNIX_TIMESTAMP(starttime) - ?) AND (UNIX_TIMESTAMP(starttime) + ?)
diff --git a/lib/XXV/MODULES/CHANNELS.pm b/lib/XXV/MODULES/CHANNELS.pm
index 64b2965..f55660b 100644
--- a/lib/XXV/MODULES/CHANNELS.pm
+++ b/lib/XXV/MODULES/CHANNELS.pm
@@ -1011,9 +1011,9 @@ sub getChannelType {
or return error sprintf("Couldn't execute query: %s.",$sth->errstr);
my $erg = $sth->fetchrow_hashref();
if($erg) {
- if(exists $erg->{VPID}) {
+ if(exists $erg->{VPID} && $erg->{VPID}) {
return 'TV';
- } elsif(exists $erg->{APID}) {
+ } elsif(exists $erg->{APID} && $erg->{APID}) {
return 'RADIO';
}
}
@@ -1447,7 +1447,7 @@ sub _brandNewChannels {
last if(25 < scalar @lines );
}
- my $rm = main::getModule('REPORT');
+ my $rm = main::getModule('EVENTS');
$rm->news(
sprintf(gettext('Found %d new channels!'), scalar keys %$attr),
join("\r\n",@lines),
diff --git a/lib/XXV/MODULES/EVENTS.pm b/lib/XXV/MODULES/EVENTS.pm
index fb458ee..b848d5b 100644
--- a/lib/XXV/MODULES/EVENTS.pm
+++ b/lib/XXV/MODULES/EVENTS.pm
@@ -8,11 +8,11 @@ use Tools;
# ------------------
sub module {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
my $args = {
Name => 'EVENTS',
Prereq => {
- 'Date::Manip' => 'date manipulation routines',
+ 'Date::Manip' => 'date manipulation routines',
},
Description => gettext(
"This module manage the events for control and watch the xxv system.
@@ -32,26 +32,25 @@ This sub look in Module->RegEvent->Actions, and call this Routines.
type => 'confirm',
required => gettext('This is required!'),
},
+ host => {
+ description => gettext('Used host of referred link inside reports.'),
+ default => main::getModule('STATUS')->name,
+ type => 'host',
+ },
},
Commands => {
-# list => {
-# description => gettext('Display the event list'),
-# short => 'el',
-# callback => sub{ $obj->list(@_) },
-# Level => 'user',
-# },
-# eedit => {
-# description => gettext('Edit a event'),
-# short => 'ee',
-# callback => sub{ $obj->edit(@_) },
-# Level => 'user',
-# },
-# etoogle => {
-# description => gettext('Change a event on or off'),
-# short => 'eto',
-# callback => sub{ $obj->toogle(@_) },
-# Level => 'user',
-# },
+ request => {
+ description => gettext("Display the actual news site 'typ'"),
+ short => 'req',
+ callback => sub{ $self->request(@_) },
+ binary => 'nocache'
+ },
+ elist => {
+ description => gettext('Display the event list'),
+ short => 'el',
+ callback => sub{ $self->list(@_) },
+ Level => 'user',
+ },
},
};
return $args;
@@ -72,7 +71,10 @@ sub new {
# paths
$self->{paths} = delete $attr{'-paths'};
- # who am I
+ # the big Config
+ $self->{CONFIG} = $attr{'-config'};
+
+ # who am I
$self->{MOD} = $self->module;
# all configvalues to $self without parents (important for ConfigModule)
@@ -102,14 +104,83 @@ sub new {
# ------------------
sub _init {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
+
+
+ my $version = 30; # Must be increment if rows of table changed
+ # this tables hasen't handmade user data,
+ # therefore old table could dropped if updated rows
+ if(!tableUpdated($self->{dbh},'EVENTS',$version,1)) {
+ return 0;
+ }
+
+ # Look for table or create this table
+ $self->{dbh}->do(qq|
+ CREATE TABLE IF NOT EXISTS EVENTS (
+ id int unsigned auto_increment NOT NULL,
+ title text default '',
+ message text default '',
+ cmd text default '',
+ data text default '',
+ level int unsigned,
+ addtime timestamp,
+ PRIMARY KEY(id)
+ ) COMMENT = '$version'
+ |);
+
+ # Load the NEWS Plugins ...
+ my @mods = glob($self->{paths}->{NEWSMODS}.'/*.pm');
+
+ # Try to use the news plugins
+ foreach my $module (reverse @mods) {
+ my $moduleName = 'XXV::OUTPUT::NEWS::'.(split('\.',(split('/', $module))[-1]))[0];
+ # make an object for the module
+ eval "use $moduleName";
+ if($@) {
+ panic("Couldn't load news module: $moduleName");
+ next;
+ }
+
+ my $mod = $moduleName->new(
+ -config => $self->{CONFIG},
+ -dbh => $self->{dbh},
+ -paths => $self->{paths},
+ -host => $self->{host},
+ -charset => $self->{charset}
+ );
+
+ unless($mod) {
+ error sprintf('Load news module %s failed!',$moduleName);
+ next;
+ }
+
+ $self->{NEWSMODS}->{$moduleName} = $mod;
+
+ main::addModule($moduleName, $self->{NEWSMODS}->{$moduleName});
+
+ debug sprintf("Load news module %s(%s)\n",
+ $moduleName,
+ (ref $self->{NEWSMODS}->{$moduleName})
+ ? $self->{NEWSMODS}->{$moduleName}->{MOD}->{Version}
+ : 'failed!');
+ }
main::after(sub{
- $obj->{EVENTS} = $obj->searchForEvents();
+ $self->{EVENTS} = $self->searchForEvents();
# This will add a callback for log events (ignore verbose)
$Tools::LOGCALLB = sub{
- $obj->callEvent(@_);
+ $self->callEvent(@_);
};
+
+ my $start = main::getStartTime;
+ $self->news(
+ sprintf(gettext('XXVD System %s started'), main::getVersion),
+ sprintf(gettext('Start time: %s'), datum($start)),
+ undef,
+ undef,
+ 'harmless'
+ );
+
return 1;
}, "EVENTS: Look for event entrys in modules ...", 3);
@@ -119,7 +190,7 @@ sub _init {
# ------------------
sub searchForEvents {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
my $mods = main::getModules();
my $events = {};
@@ -140,17 +211,17 @@ sub searchForEvents {
# ------------------
sub callEvent {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
my $args = {
'Mod' => shift,
'Sub' => shift,
'Msg' => shift,
};
- return unless(exists $obj->{EVENTS});
- return if($obj->{active} ne 'y');
+ return unless(exists $self->{EVENTS});
+ return if($self->{active} ne 'y');
- foreach my $id (keys %{$obj->{EVENTS}}) {
- my $entry = $obj->{EVENTS}->{$id};
+ foreach my $id (keys %{$self->{EVENTS}}) {
+ my $entry = $self->{EVENTS}->{$id};
my $bool = 0;
# Search for right fields
@@ -192,4 +263,212 @@ sub callEvent {
return 1;
}
+
+# ------------------
+sub news {
+# ------------------
+ my $self = shift || return error('No object defined!');
+ my $title = shift || return error('No title defined!');
+ my $text = shift || '';
+ my $cmd = shift || '';
+ my $id = shift || '';
+ my $levname = shift || 'harmless'; # Level for how important is this news?
+
+ # convert Levelname to integer
+ my $lev = $self->scala($levname)
+ || return error('Problem to analyze level!');
+
+ my $hmod = main::getModule('HTTPD') or return;
+
+ my $url = sprintf("http://%s:%s/", $self->{host}, $hmod->{Port});
+ $url = sprintf("%s?cmd=%s&data=%s", $url, $cmd, $id)
+ if($cmd && $id);
+
+ my $news = {
+ AddDate => time,
+ Title => $title,
+ Text => $text,
+ Cmd => $cmd,
+ Id => $id,
+ Url => $url,
+ Level => $lev,
+ LevelName => $levname,
+ category => $self->translate_scala($lev)
+ };
+
+ #my $days = 7 * 24 * 60 * 60;
+ $self->{dbh}->do("DELETE FROM EVENTS WHERE (addtime + INTERVAL 31 DAY) < NOW()");
+ $self->_insert($news);
+
+ # Send to all activated News modules
+ foreach my $modName (sort keys %{$self->{NEWSMODS}}) {
+
+ # Active?
+ next if($self->{NEWSMODS}->{$modName}->{active} ne 'y');
+
+ # Level correct?
+ next if(exists $self->{NEWSMODS}->{$modName}->{level}
+ and $self->{NEWSMODS}->{$modName}->{level} >= $lev);
+
+ # Do to send (first push and maybe send)
+ $self->{NEWSMODS}->{$modName}->push($news);
+ }
+
+}
+
+sub _insert {
+ my $self = shift || return error('No object defined!');
+ my $news = shift || return error('No object defined!');
+
+ my $sth = $self->{dbh}->prepare(
+q|
+ REPLACE INTO EVENTS
+ (title, message, cmd, data, level, addtime )
+ VALUES (?, ?, ?, ?, ?, NOW())
+|
+);
+ $sth->execute(
+ $news->{Title},
+ $news->{Text},
+ $news->{Cmd},
+ $news->{Id},
+ $news->{Level}
+ ) or return error sprintf("Couldn't execute query: %s.",$sth->errstr);
+ return 1;
+}
+
+# ------------------
+sub list {
+# ------------------
+ my $self = shift || return error('No object defined!');
+ my $watcher = shift || return error('No watcher defined!');
+ my $console = shift || return error('No console defined!');
+ my $data = shift || 1;
+
+ my %f = (
+ 'addtime' => gettext('Time'),
+ 'title' => gettext('Title'),
+ 'message' => gettext('Message')
+ );
+
+ my $sql = qq|
+SELECT SQL_CACHE
+ addtime as \'$f{addtime}\',
+ title as \'$f{title}\',
+ message as \'$f{message}\',
+ '' as __url,
+ level as __level,
+ '' as __levelName,
+ cmd as __cmd,
+ data as __data
+from
+ EVENTS
+where level >= ?
+order by
+ addtime desc
+LIMIT 0,50
+ |;
+
+ my $sth = $self->{dbh}->prepare($sql);
+ $sth->execute($data)
+ or return error sprintf("Couldn't execute query: %s.",$sth->errstr);
+ my $fields = $sth->{'NAME'};
+ my $erg = $sth->fetchall_arrayref();
+ map {
+ $_->[3] = sprintf("?cmd=%s&data=%s", $_->[6], $_->[7])
+ if($_->[6] && $_->[7]);
+
+ $_->[5] = $self->translate_scala($_->[4]);
+ } @$erg;
+ unshift(@$erg, $fields);
+
+ $console->table($erg);
+}
+
+# ------------------
+sub request {
+# ------------------
+ my $self = shift || return error('No object defined!');
+ my $watcher = shift || return error('No watcher defined!');
+ my $console = shift || return error('No console defined!');
+ # To this time you can set on
+ # cmd=request&data=rss&ver=2 or
+ # cmd=request&data=mail&__test=1
+ # ...
+ my $typ = shift || return $console->err(gettext("Sorry, but none type requested!"));
+ my $params = shift || {};
+
+ my ($mod) = grep(/${typ}$/i, keys %{$self->{NEWSMODS}});
+
+ return $console->err(sprintf(gettext("Sorry, but this type '%s' does not exist on this system!"), $typ))
+ unless($mod);
+ my $module = $self->{NEWSMODS}->{$mod};
+
+ return $console->err(gettext("Sorry, but this module is not active!"))
+ if($module->{active} ne 'y');
+
+ return $console->out(
+ $module->req($params),
+ $module->{TYP}
+ );
+}
+
+
+# ------------------
+sub scala {
+# ------------------
+ my $self = shift || return error('No object defined!');
+ my $typ = shift || return 10;
+
+ $self->{SCALA} = {
+ 'all' => 1,
+ 'harmless' => 10,
+ 'interesting' => 30,
+ 'veryinteresting' => 50,
+ 'important' => 70,
+ 'veryimportant' => 100,
+ 'none' => 200,
+ } unless(exists $self->{SCALA});
+
+ if($typ and exists $self->{SCALA}->{$typ}) {
+ return $self->{SCALA}->{$typ};
+ } else {
+ return error sprintf("Level %s does not exist! Please use %s", $typ, join(',', keys %{$self->{SCALA}}));
+ }
+}
+
+# ------------------
+sub get_level_as_array {
+# ------------------
+ my $self = shift || return error('No object defined!');
+
+ return [
+ [ 1, gettext('All messages') ], # Include all messages, dont use as category
+ [ 10, gettext('Harmless') ],
+ [ 30, gettext('Interesting') ],
+ [ 50, gettext('Very interesting') ],
+ [ 70, gettext('Important') ],
+ [ 100, gettext('Very important') ],
+ [ 200, gettext('None messages') ] # Exclude all messages, dont use as category
+ ];
+}
+
+sub translate_level {
+ my $self = shift || return error('No object defined!');
+ my $level = shift || 'harmless';
+
+ my $s = $self->scala($level);
+ return $self->translate_scala($s);
+}
+
+sub translate_scala {
+ my $self = shift || return error('No object defined!');
+ my $scala = shift || 10;
+
+ my $erg = $self->get_level_as_array();
+ foreach my $w ( @$erg ) {
+ return $w->[1] if($scala <= $w->[0]);
+ }
+ return gettext('Harmless');
+}
1;
diff --git a/lib/XXV/MODULES/HTTPD.pm b/lib/XXV/MODULES/HTTPD.pm
index f9d6bb0..947eefa 100644
--- a/lib/XXV/MODULES/HTTPD.pm
+++ b/lib/XXV/MODULES/HTTPD.pm
@@ -230,7 +230,11 @@ sub communicator {
if($data->{Method} eq 'POST' && $data->{Post}) {
$query .= '&' if($query);
$query .= $data->{Post};
- }
+ }
+ #if($self->{charset} eq 'UTF-8'
+ # && $query && !utf8::is_utf8($query)) {
+ # utf8::upgrade($query);
+ #}
my $cgi = CGI->new( $query );
my $console;
diff --git a/lib/XXV/MODULES/RECORDS.pm b/lib/XXV/MODULES/RECORDS.pm
index 2fee3ad..04e4a10 100644
--- a/lib/XXV/MODULES/RECORDS.pm
+++ b/lib/XXV/MODULES/RECORDS.pm
@@ -212,11 +212,11 @@ sub module {
$description .= "\r\n";
}
if($epg->{description}) {
- $description .= sprintf(gettext("Description: %s"), $epg->{description});
+ $description .= $epg->{description};
# $description .= "\r\n";
}
- main::getModule('REPORT')->news($title, $description, "display", $record->{eventid}, $event->{Level});
+ main::getModule('EVENTS')->news($title, $description, "display", $record->{eventid}, $event->{Level});
}
|,
],
diff --git a/lib/XXV/MODULES/REPORT.pm b/lib/XXV/MODULES/REPORT.pm
index dfcdc72..8652425 100644
--- a/lib/XXV/MODULES/REPORT.pm
+++ b/lib/XXV/MODULES/REPORT.pm
@@ -9,13 +9,13 @@ use Tools;
# ------------------
sub module {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
my $args = {
Name => 'REPORT',
Prereq => {
# 'Perl::Module' => 'Description',
},
- Description => gettext('This module read in every module the status information and display this. Also this module send this informations e.g. as mail report.'),
+ Description => gettext('This module read and show status information from every module.'),
Version => (split(/ /, '$Revision$'))[1],
Date => (split(/ /, '$Date$'))[1],
Author => 'xpix',
@@ -27,16 +27,6 @@ sub module {
default => 'y',
type => 'confirm',
required => gettext('This is required!'),
- check => sub {
- my $value = shift;
- if($value eq 'y') {
- my $module = main::getModule('EVENTS');
- if(!$module or $module->{active} ne 'y') {
- return undef, sprintf(gettext("Module can't activated! This module depends module %s."),'EVENTS');
- }
- }
- return $value;
- },
},
interval => {
description => gettext('Time in hours to send the report.'),
@@ -44,23 +34,12 @@ sub module {
type => 'integer',
required => gettext('This is required!'),
},
- host => {
- description => gettext('Used host of referred link inside reports.'),
- default => main::getModule('STATUS')->name,
- type => 'host',
- },
},
Commands => {
report => {
description => gettext("Display the report screen 'modname'"),
short => 'rp',
- callback => sub{ $obj->report(@_) },
- },
- request => {
- description => gettext("Display the actual news site 'typ'"),
- short => 'req',
- callback => sub{ $obj->request(@_) },
- binary => 'nocache'
+ callback => sub{ $self->report(@_) },
},
},
};
@@ -82,12 +61,9 @@ sub new {
# paths
$self->{paths} = delete $attr{'-paths'};
- # who am I
+ # who am I
$self->{MOD} = $self->module;
- # the big Config
- $self->{CONFIG} = $attr{'-config'};
-
# the dbh handle
$self->{dbh} = delete $attr{'-dbh'};
@@ -121,59 +97,13 @@ sub new {
# The Initprocess
my $erg = $self->init or return error('Problem to initialize module!');
- # Initiat after load modules ...
- main::after( sub{
- my $start = main::getStartTime;
- $self->news(
- sprintf(gettext('XXVD System %s started'), main::getVersion),
- sprintf(gettext('Start time: %s'), datum($start)),
- undef,
- undef,
- 'important'
- );
- return 1;
- }, "Send start message to news modules ...");
-
return $self;
}
# ------------------
sub init {
# ------------------
- my $obj = shift || return error('No object defined!');
-
- # Load the NEWS Plugins ...
- my @mods = glob($obj->{paths}->{NEWSMODS}.'/*.pm');
-
- # Try to use the news plugins
- foreach my $module (reverse @mods) {
- my $moduleName = 'XXV::OUTPUT::NEWS::'.(split('\.',(split('/', $module))[-1]))[0];
-
- # make an object for the module
- eval "use $moduleName";
- error $@ if $@;
- my $mod = $moduleName->new(
- -config => $obj->{CONFIG},
- -dbh => $obj->{dbh},
- -paths => $obj->{paths},
- -host => $obj->{host},
- );
-
- unless($mod) {
- error sprintf('Load news module %s failed!',$moduleName);
- next;
- }
-
- $obj->{NEWSMODS}->{$moduleName} = $mod;
-
- main::addModule($moduleName, $obj->{NEWSMODS}->{$moduleName});
-
- debug sprintf("Load news module %s(%s)\n",
- $moduleName,
- (ref $obj->{NEWSMODS}->{$moduleName})
- ? $obj->{NEWSMODS}->{$moduleName}->{MOD}->{Version}
- : 'failed!');
- }
+ my $self = shift || return error('No object defined!');
return 1;
}
@@ -182,7 +112,7 @@ sub init {
# ------------------
sub report {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
my $watcher = shift;
my $console = shift;
my $modulename = shift || '';
@@ -197,7 +127,7 @@ sub report {
next if($modulename and uc($modulename) ne $modCfg->{Name});
next if(exists $mods->{$modName}->{active} and $cfg->{$modCfg->{Name}}->{active} eq 'n');
if(exists $modCfg->{Status} and ref $modCfg->{Status} eq 'CODE') {
- $result->{$modCfg->{Name}} = $modCfg->{Status}($watcher, $console, $obj->{LastReportTime});
+ $result->{$modCfg->{Name}} = $modCfg->{Status}($watcher, $console, $self->{LastReportTime});
}
}
@@ -207,132 +137,4 @@ sub report {
return 1;
}
-# ------------------
-sub news {
-# ------------------
- my $obj = shift || return error('No object defined!');
- my $title = shift || return error('No title defined!');
- my $text = shift || '';
- my $cmd = shift || '';
- my $id = shift || '';
- my $levname = shift || 'harmless'; # Level for how important is this news?
-
- # convert Levelname to integer
- my $lev = $obj->scala($levname)
- || return error('Problem to analyze level!');
-
- my $hmod = main::getModule('HTTPD') or return;
-
- my $url = sprintf("http://%s:%s/", $obj->{host}, $hmod->{Port});
- $url = sprintf("%s?cmd=%s&data=%s", $url, $cmd, $id)
- if($cmd && $id);
-
- my $news = {
- AddDate => time,
- Title => $title,
- Text => $text,
- Cmd => $cmd,
- Id => $id,
- Url => $url,
- Level => $lev,
- LevelName => $levname,
- category => $obj->translate_level($levname)
- };
-
- # Send to all activated News modules
- foreach my $modName (sort keys %{$obj->{NEWSMODS}}) {
-
- # Active?
- next if($obj->{NEWSMODS}->{$modName}->{active} ne 'y');
-
- # Level correct?
- next if(exists $obj->{NEWSMODS}->{$modName}->{level}
- and $obj->{NEWSMODS}->{$modName}->{level} >= $lev);
-
- # Do to send (first read and then send)
- $obj->{NEWSMODS}->{$modName}->read($news);
- }
-
-}
-
-# ------------------
-sub request {
-# ------------------
- my $obj = shift || return error('No object defined!');
- my $watcher = shift || return error('No watcher defined!');
- my $console = shift || return error('No console defined!');
- # To this time you can set on
- # cmd=request&data=rss&ver=2 or
- # cmd=request&data=mail
- # ...
- my $typ = shift || return $console->err(gettext("Sorry, but none type requested!"));
- my $params = shift || {};
-
- my ($mod) = grep(/${typ}$/i, keys %{$obj->{NEWSMODS}});
-
- return $console->err(sprintf(gettext("Sorry, but this type '%s' does not exist on this system!"), $typ))
- unless($mod);
-
- return $console->err(gettext("Sorry, but this module is not active!"))
- unless($obj->{NEWSMODS}->{$mod}->{active} eq 'y');
-
- return $console->out(
- $obj->{NEWSMODS}->{$mod}->req($params),
- $obj->{NEWSMODS}->{$mod}->{TYP}
- );
-}
-
-
-# ------------------
-sub scala {
-# ------------------
- my $obj = shift || return error('No object defined!');
- my $typ = shift || return 10;
-
- $obj->{SCALA} = {
- 'all' => 1,
- 'harmless' => 10,
- 'interesting' => 30,
- 'veryinteresting'=> 50,
- 'important' => 70,
- 'veryimportant' => 100,
- 'none' => 200,
- } unless(exists $obj->{SCALA});
-
- if($typ and exists $obj->{SCALA}->{$typ}) {
- return $obj->{SCALA}->{$typ};
- } else {
- return error sprintf("Level %s does not exist! Please use %s", $typ, join(',', keys %{$obj->{SCALA}}));
- }
-}
-
-# ------------------
-sub get_level_as_array {
-# ------------------
- my $obj = shift || return error('No object defined!');
-
- return [
- [ 1, gettext('All messages') ], # Include all messages, dont use as category
- [ 10, gettext('Harmless') ],
- [ 30, gettext('Interesting') ],
- [ 50, gettext('Very interesting') ],
- [ 70, gettext('Important') ],
- [ 100, gettext('Very important') ],
- [ 200, gettext('None messages') ] # Exclude all messages, dont use as category
- ];
-}
-
-sub translate_level {
- my $obj = shift || return error('No object defined!');
- my $level = shift || 'harmless';
-
- my $s = $obj->scala($level);
-
- my $erg = $obj->get_level_as_array();
- foreach my $w ( @$erg ) {
- return $w->[1] if($s <= $w->[0]);
- }
- return gettext('Harmless');
-}
-
1;
diff --git a/lib/XXV/MODULES/SHARE.pm b/lib/XXV/MODULES/SHARE.pm
index 6188298..e6cd93c 100644
--- a/lib/XXV/MODULES/SHARE.pm
+++ b/lib/XXV/MODULES/SHARE.pm
@@ -191,6 +191,7 @@ sub _init {
}
}
}
+
return 1;
}, "SHARE: Connect to popularity web service ...",4) if($self->{active} eq 'y');
@@ -212,6 +213,14 @@ sub _init {
},
);
}
+
+ my $m = main::getModule('TIMERS');
+ $m->updated(sub{
+ return 0 if($self->{active} ne 'y');
+
+ lg 'Start timer callback to share timer!';
+ return $self->_sharetimer();
+ });
return 1;
}, "SHARE: Update data with popularity web service ...",48) if($self->{active} eq 'y');
@@ -440,4 +449,36 @@ sub CmdToService {
: return $res;
}
+# ------------------
+sub _sharetimer {
+# ------------------
+ my $self = shift || return error('No object defined!');
+
+ my $sql = 'SELECT id,flags,priority,lifetime,autotimerid,eventid,UNIX_TIMESTAMP(eventstarttime) + eventduration as eventstoptime FROM TIMERS';
+ my $erg = $self->{dbh}->selectall_hashref($sql, 'id') or return;
+
+ foreach my $t (keys %$erg) {
+ my $timer = $erg->{$t};
+ $self->sharetimer($timer);
+ }
+}
+# ------------------
+sub sharetimer {
+# ------------------
+ my $self = shift || return error('No object defined!');
+ my $timer = shift || return error('No timer defined!');
+
+ my $level = 1;
+ if($timer->{autotimerid} and ($timer->{flags} && $timer->{flags} & 1)) {
+ $level = (($timer->{priority} <= 50 or $timer->{lifetime} < 33) ? 2 : 3);
+ } elsif($timer->{flags} && $timer->{flags} & 1) {
+ $level = (($timer->{priority} <= 50 or $timer->{lifetime} < 33) ? 4 : 5);
+ }
+
+ if($timer->{eventid}) {
+ $self->setEventLevel($timer->{eventid}, $level, $timer->{eventstoptime});
+ }
+}
+
+
1;
diff --git a/lib/XXV/MODULES/STATUS.pm b/lib/XXV/MODULES/STATUS.pm
index 75eb80e..c5bf172 100644
--- a/lib/XXV/MODULES/STATUS.pm
+++ b/lib/XXV/MODULES/STATUS.pm
@@ -793,7 +793,7 @@ sub watchDog {
foreach my $m (@$mou) {
next unless($m->[0] =~ /^\//);
if($m->[5] >= 90 ) {
- my $rm = main::getModule('REPORT');
+ my $rm = main::getModule('EVENTS');
$rm->news(
sprintf(gettext("PANIC! Only %s%% space left on device %s"),(100 - $m->[5]),$m->[0]),
sprintf(gettext("Device has space %s from %s used!"), $m->[3], $m->[2]),
diff --git a/lib/XXV/MODULES/SVDRP.pm b/lib/XXV/MODULES/SVDRP.pm
index a3ba7b7..5507f61 100644
--- a/lib/XXV/MODULES/SVDRP.pm
+++ b/lib/XXV/MODULES/SVDRP.pm
@@ -450,6 +450,23 @@ sub enum_onlinehosts {
}
# ------------------
+sub IDfromHostname {
+# ------------------
+ my $self = shift || return error('No object defined!');
+ my $host = shift || return error('No host defined!');
+
+ my $sql = qq|
+SELECT SQL_CACHE id FROM RECORDER WHERE host = ?
+|;
+
+ my $sth = $self->{dbh}->prepare($sql);
+ $sth->execute($host)
+ or return error(sprintf("Video disk recorder '%s' does not exist in the database!",$host));
+ my $erg = $sth->fetchrow_hashref();
+ return $erg ? $erg->{id} : undef;
+}
+
+# ------------------
sub queue_cmds {
# ------------------
my $self = shift || return error('No object defined!');
@@ -527,6 +544,8 @@ sub command {
return undef;
}
+ #binmode $telnet, ":encoding(utf8)" if($self->{charset} eq 'UTF-8');
+
# read first line
do {
$line = $telnet->getline;
@@ -565,7 +584,9 @@ sub command {
error($msg);
$self->{ERROR} .= $msg . "\n";
}
-
+ #if( $self->{charset} eq 'UTF-8') {
+ # utf8::upgrade($line) if(!utf8::is_utf8($line));
+ #}
push(@$data, $line);
}
} while($line && $line =~ /^\d\d\d\-/);
diff --git a/lib/XXV/MODULES/TIMERS.pm b/lib/XXV/MODULES/TIMERS.pm
index a0d16a7..bda2be1 100644
--- a/lib/XXV/MODULES/TIMERS.pm
+++ b/lib/XXV/MODULES/TIMERS.pm
@@ -114,12 +114,11 @@ sub module {
},
},
RegEvent => {
- 'newTimerfromUser' => {
- Descr => gettext('Create event entries if the user has created a new timer.'),
-
+ # Create event entries if the user has created a new timer
+ 'newTimerfromUser' => {
# You have this choices (harmless is default):
# 'harmless', 'interesting', 'veryinteresting', 'important', 'veryimportant'
- Level => 'interesting',
+ Level => 'veryinteresting',
# Search for a spezial Event.
# I.e.: Search for an LogEvent with match
@@ -133,194 +132,82 @@ sub module {
# of the id
# ...
Match => {
- TimerId => qr/id\:\s+\"(\d+)\"/s,
+ pos => qr/New timer\s+(\d+)/s,
+ host => qr/New timer\s+\d+\s+on\s+(\S+)/s,
},
Actions => [
q|sub{ my $args = shift;
my $event = shift;
- my $timer = getDataById($args->{TimerId}, 'TIMERS', 'pos');
+ my $modT = main::getModule('TIMERS') or return;
+ my $timer = $modT->getTimerByPos($modT->{svdrp}->IDfromHostname($args->{host}), $args->{pos}) or return;
return if($timer->{autotimerid});
- my $desc = getDataById($timer->{eventid}, 'EPG', 'eventid') if($timer->{eventid});
- my $title = sprintf(gettext("New timer found: %s"),$timer->{file});
-
- my $description = '';
-
- my $channel = main::getModule('CHANNELS')->ChannelToName($timer->{channel});
- $description .= sprintf(gettext("Channel: %s"), $channel);
- $description .= "\r\n";
-
- Date_Init("Language=English");
- my $d = ParseDate($timer->{starttime});
- $timer->{starttime} = datum(UnixDate($d,"%s")) if($d);
-
- $description .= sprintf(gettext("On: %s to %s"),
- $timer->{starttime},
- fmttime($timer->{stop}));
- $description .= "\r\n";
- $description .= sprintf(gettext("Description: %s"), $desc->{description} )
- if($desc && $desc->{description});
-
- main::getModule('REPORT')->news($title, $description, "display", $timer->{eventid}, $event->{Level});
+ my $title = sprintf(gettext("New timer: %s"),$timer->{file});
+ $modT->_news($title, $timer, $event->{Level});
}
|,
- q|sub{ my $args = shift;
- my $event = shift;
- my $timer = getDataById($args->{TimerId}, 'TIMERS', 'pos');
- my $soap = main::getModule('SHARE');
- my $level = 1;
- if($timer->{autotimerid}) {
- $level = (($timer->{priority} <= 50 or $timer->{lifetime} < 33) ? 2 : 3);
- } else {
- $level = (($timer->{priority} <= 50 or $timer->{lifetime} < 33) ? 4 : 5);
- }
-
- if($timer->{eventid}) {
- my $event = main::getModule('EPG')->getId($timer->{eventid}, 'UNIX_TIMESTAMP(starttime) + duration as STOPTIME');
- $soap->setEventLevel($timer->{eventid}, $level, $event->{STOPTIME});
- }
- }|,
],
},
+ # Create event entries if the user has deleted a timer
'deleteTimer' => {
- Descr => gettext('Create event entries if the user has deleted a timer.'),
Level => 'interesting',
SearchForEvent => {
Msg => 'delt',
},
Match => {
- TimerId => qr/delt\s+(\d+)/s,
+ pos => qr/delt\s+(\d+)\"\s+on\s+\S+/s,
+ host => qr/delt\s+\d+\"\s+on\s+(\S+)/s,
},
Actions => [
q|sub{ my $args = shift;
my $event = shift;
- my $timer = getDataById($args->{TimerId}, 'TIMERS', 'pos');
+ my $modT = main::getModule('TIMERS') or return;
+ my $timer = $modT->getTimerByPos($modT->{svdrp}->IDfromHostname($args->{host}), $args->{pos}) or return;
my $title = sprintf(gettext("Timer deleted: %s"),$timer->{file});
- my $desc = getDataById($timer->{eventid}, 'EPG', 'eventid') if($timer->{eventid});
-
- my $description = '';
-
- my $channel = main::getModule('CHANNELS')->ChannelToName($timer->{channel});
- $description .= sprintf(gettext("Channel: %s"), $channel);
- $description .= "\r\n";
-
- Date_Init("Language=English");
- my $d = ParseDate($timer->{starttime});
- $timer->{starttime} = datum(UnixDate($d,"%s")) if($d);
-
- $description .= sprintf(gettext("On: %s to %s"),
- $timer->{starttime},
- fmttime($timer->{stop}));
- $description .= "\r\n";
- $description .= sprintf(gettext("Description: %s"), $desc->{description} )
- if($desc && $desc->{description});
-
- main::getModule('REPORT')->news($title, $description, "display", $timer->{eventid}, $event->{Level});
+ $modT->_news($title, $timer, $event->{Level});
}
|,
q|sub{ my $args = shift;
my $event = shift;
- my $timer = getDataById($args->{TimerId}, 'TIMERS', 'pos');
- my $soap = main::getModule('SHARE');
- my $level = 1;
-
- if($timer->{eventid}) {
- my $event = main::getModule('EPG')->getId($timer->{eventid}, 'UNIX_TIMESTAMP(starttime) + duration as STOPTIME');
- $soap->setEventLevel($timer->{eventid}, $level, $event->{STOPTIME});
- }
+ my $modT = main::getModule('TIMERS') or return;
+ my $timer = $modT->getTimerByPos($modT->{svdrp}->IDfromHostname($args->{host}), $args->{pos}) or return;
+ my $modS = main::getModule('SHARE') or return;
+ $modS->sharetimer($timer);
}|,
],
},
+ # Create event entries if the user has toggled a timer.
'toggleTimer' => {
- Descr => gettext('Create event entries if the user has toggled a timer.'),
Level => 'interesting',
SearchForEvent => {
Msg => 'modt',
},
Match => {
- TimerId => qr/modt\s+(\d+)\s(on|off)/s,
- Type => qr/modt\s+\d+\s+(on|off)/s
+ pos => qr/modt\s+(\d+)\s(on|off)/s,
+ enabled => qr/modt\s+\d+\s+(on|off)/s,
+ host => qr/modt\s+\d+\s+\S+\s+on\s+(\S+)/s,
},
Actions => [
q|sub{ my $args = shift;
my $event = shift;
- my $timer = getDataById($args->{TimerId}, 'TIMERS', 'pos');
+ my $modT = main::getModule('TIMERS') or return;
+ my $timer = $modT->getTimerByPos($modT->{svdrp}->IDfromHostname($args->{host}), $args->{pos}) or return;
my $title;
- if($args->{Type} eq 'on') {
+ if($args->{enabled} eq 'on') {
$title = sprintf(gettext("Timer activated: %s"),$timer->{file});
} else {
$title = sprintf(gettext("Timer deactivated: %s"),$timer->{file});
}
-
- my $description = '';
-
- my $channel = main::getModule('CHANNELS')->ChannelToName($timer->{channel});
- $description .= sprintf(gettext("Channel: %s"), $channel);
- $description .= "\r\n";
-
- Date_Init("Language=English");
- my $d = ParseDate($timer->{starttime});
- $timer->{starttime} = datum(UnixDate($d,"%s")) if($d);
-
- my $desc = getDataById($timer->{eventid}, 'EPG', 'eventid') if($timer->{eventid});
- $description .= sprintf(gettext("On: %s to %s"),
- $timer->{starttime},
- fmttime($timer->{stop}));
- $description .= "\r\n";
- $description .= sprintf(gettext("Description: %s"), $desc->{description} )
- if($desc && $desc->{description});
-
- main::getModule('REPORT')->news($title, $description, "display", $timer->{eventid}, $event->{Level});
+ $modT->_news($title, $timer, $event->{Level});
}
|,
q|sub{ my $args = shift;
my $event = shift;
- my $timer = getDataById($args->{TimerId}, 'TIMERS', 'pos');
- my $soap = main::getModule('SHARE');
- my $level = ($args->{Type} eq 'off' ? 1 : 2);
- if($timer->{autotimerid} and $args->{Type} eq 'on') {
- $level = (($timer->{priority} <= 50 or $timer->{lifetime} < 33) ? 2 : 3);
- } elsif($args->{Type} eq 'on') {
- $level = (($timer->{priority} <= 50 or $timer->{lifetime} < 33) ? 4 : 5);
- }
-
- if($timer->{eventid}) {
- my $event = main::getModule('EPG')->getId($timer->{eventid}, 'UNIX_TIMESTAMP(starttime) + duration as STOPTIME');
- $soap->setEventLevel($timer->{eventid}, $level, $event->{STOPTIME});
- }
- }|,
- ],
- },
- 'updateTimer' => {
- Descr => gettext('Create event entries if a timer has been updated.'),
- Level => 'harmless',
- SearchForEvent => {
- Msg => 'Reread',
- },
- Match => {
- HighId => qr/Reread\s+(\d+)\s+timers/s,
- },
- Actions => [
- q|sub{ my $args = shift;
- my $event = shift;
+ my $modT = main::getModule('TIMERS') or return;
+ my $timer = $modT->getTimerByPos($modT->{svdrp}->IDfromHostname($args->{host}), $args->{pos}) or return;
my $modS = main::getModule('SHARE') or return;
- my $modE = main::getModule('EPG') or return;
- for (my $i = 1; $i<=$args->{HighId}; $i++) {
- my $timer = getDataById($i, 'TIMERS', 'pos');
-
- my $level = 1;
- if($timer->{autotimerid} and ($timer->{flags} && $timer->{flags} & 1)) {
- $level = (($timer->{priority} <= 50 or $timer->{lifetime} < 33) ? 2 : 3);
- } elsif($timer->{flags} && $timer->{flags} & 1) {
- $level = (($timer->{priority} <= 50 or $timer->{lifetime} < 33) ? 4 : 5);
- }
-
- if($timer->{eventid}) {
- my $event = $modE->getId($timer->{eventid}, 'UNIX_TIMESTAMP(starttime) + duration as STOPTIME');
- $modS->setEventLevel($timer->{eventid}, $level, $event->{STOPTIME});
- }
- }
- }|,
+ $modS->sharetimer($timer);
+ }|,
],
},
},
@@ -338,7 +225,7 @@ sub status {
my $total = 0;
{
- my $sth = $self->{dbh}->prepare("SELECT SQL_CACHE count(*) as count from TIMERS");
+ my $sth = $self->{dbh}->prepare("SELECT SQL_CACHE count(*) as count from TIMERS");
if(!$sth->execute())
{
error sprintf("Couldn't execute query: %s.",$sth->errstr);
@@ -492,7 +379,10 @@ sub saveTimer {
$self->_insert($data);
}
- event sprintf('Save timer "%s" with id: "%d"', $data->{file}, $pos || 0);
+ event sprintf('Save timer %d on %s - %s',
+ $pos || 0,
+ $self->{svdrp}->hostname($data->{vid}),
+ $data->{file});
$self->{changedTimer} = 1;
@@ -1096,7 +986,6 @@ sub _insert {
# ------------------
my $self = shift || return error('No object defined!');
my $timer = shift || return;
- my $checked = shift || 0;
# import only status which used from vdr and thereby exclude eventid from vdradmin
$timer->{flags} &= 15;
@@ -1134,7 +1023,7 @@ sub _insert {
my $sth = $self->{dbh}->prepare(
q|REPLACE INTO TIMERS VALUES
- (?,?,?,?,?,?,?,?,?,?,?,?,FROM_UNIXTIME(?), FROM_UNIXTIME(?),0,?,?,?,?,?,NOW())
+ (?,?,?,?,?,?,?,?,?,?,?,?,FROM_UNIXTIME(?), FROM_UNIXTIME(?),0,?,?,?,?,0,NOW())
|);
my $id = md5_hex($timer->{vid} . $timer->{channel} . $nexttime->{start} . $nexttime->{stop} );
$sth->execute(
@@ -1155,8 +1044,7 @@ q|REPLACE INTO TIMERS VALUES
$e ? $e->{eventid} : 0,
$e ? $e->{starttime} : 0,
$e ? $e->{duration} : 0,
- $aid,
- $checked
+ $aid
) or return error sprintf("Couldn't execute query: %s.",$sth->errstr);
$self->{keywords}->insert('timer',$id,$keywords);
@@ -1207,7 +1095,7 @@ sub _readData {
file => $data[7],
aux => $data[8]
};
- if($self->_insert($timer, 1)) {
+ if($self->_insert($timer)) {
$c++;
}
}
@@ -1221,21 +1109,20 @@ sub _readData {
$self->getTimersByAutotimer($aids);
# Get new timers by User
- if($oldTimers or exists $self->{changedTimer}) {
+ if(($oldTimers && scalar keys %$oldTimers != $c)
+ or (!$oldTimers && $c)
+ or exists $self->{changedTimer}) {
my $timers = $self->getNewTimers($oldTimers);
- foreach my $t (@$timers) {
- event sprintf('New timer "%s" with id: "%d"', $t->{file}, $t->{pos});
+ foreach my $t (keys %$timers) {
+ event sprintf('New timer %d on %s - "%s"', $timers->{$t}->{pos}, $self->{svdrp}->hostname($timers->{$t}->{vid}), $timers->{$t}->{file});
}
- $self->updated() if(scalar @$timers or exists $self->{changedTimer});
+ $self->updated() if(($timers && scalar keys %$timers) or exists $self->{changedTimer});
delete $self->{changedTimer} if(exists $self->{changedTimer});
}
- $self->{REGISTER}++;
- if(scalar keys %$oldTimers != $c or $self->{REGISTER} == 2) {
- # Event to signal we are finish to read
- event(sprintf('Reread %d timers and written into database!', $c));
- }
+ # Event to signal we are finish to read
+ lg(sprintf('Reread %d timers and written into database!', $c));
$console->message(sprintf(gettext("%d timer written to database."), $c))
if(ref $console and $console->typ ne 'AJAX');
@@ -1433,7 +1320,7 @@ ORDER BY
sub getTimerById {
# ------------------
my $self = shift || return error('No object defined!');
- my $tid = shift || return error('No id defined!');
+ my $tid = shift || return error('No tid defined!');
my $sql = qq|
SELECT SQL_CACHE
@@ -1469,7 +1356,8 @@ WHERE
sub getTimerByPos {
# ------------------
my $self = shift || return error('No object defined!');
- my $tid = shift || return error('No id defined!');
+ my $vid = shift || return error('No vid defined!');
+ my $pos = shift || return error('No pos defined!');
my $sql = qq|
SELECT SQL_CACHE
@@ -1485,19 +1373,21 @@ SELECT SQL_CACHE
UNIX_TIMESTAMP(t.starttime) as Day,
t.collision,
t.eventid,
- t.autotimerid
+ t.autotimerid,
+ UNIX_TIMESTAMP(t.eventstarttime) + t.eventduration as eventstoptime
FROM
TIMERS as t,
CHANNELS as c
WHERE
t.channel = c.id
AND t.vid = c.vid
+ and t.vid = ?
and t.pos = ?
|;
my $sth = $self->{dbh}->prepare($sql);
- $sth->execute($tid)
- or return error(sprintf("Timer '%s' does not exist in the database!",$tid));
+ $sth->execute($vid, $pos)
+ or return error(sprintf("Timer '%s' does not exist in the database!",sprintf("%d/%d",$vid,$pos)));
return $sth->fetchrow_hashref();
}
# ------------------
@@ -1514,15 +1404,23 @@ sub getRunningTimer {
sub getNewTimers {
# ------------------
my $self = shift || return error('No object defined!');
- my $oldTimers = shift || return;
+ my $oldTimers = shift;
- my $ret = [];
- foreach my $timerid (keys %$oldTimers) {
- if(! $oldTimers->{$timerid}->{checked}) {
- push(@$ret, $oldTimers->{$timerid});
- }
+ if($oldTimers) {
+ my @old = keys %$oldTimers;
+ return undef unless(scalar @old);
+
+ my $sql = sprintf('SELECT SQL_CACHE * FROM TIMERS where id not in (%s)', join(',' => ('?') x @old));
+ my $sth = $self->{dbh}->prepare($sql);
+ $sth->execute(@old)
+ or return error sprintf("Couldn't execute query: %s.",$sth->errstr);
+ return $sth->fetchall_hashref('id');
+ } else {
+ my $sth = $self->{dbh}->prepare('SELECT SQL_CACHE * FROM TIMERS');
+ $sth->execute()
+ or return error sprintf("Couldn't execute query: %s.",$sth->errstr);
+ return $sth->fetchall_hashref('id');
}
- return $ret;
}
# ------------------
@@ -1530,7 +1428,7 @@ sub getCheckTimer {
# ------------------
my $self = shift || return error('No object defined!');
my $sql = qq|
-SELECT SQL_CACHE t.id, t.vid, t.pos, t.flags, t.channel, t.priority, t.lifetime,
+SELECT SQL_CACHE t.id, t.vid, t.pos, t.flags, t.channel, t.priority, t.lifetime,
t.file, t.aux, t.start as timerstart,t.stop as timerstop,
UNIX_TIMESTAMP(e.starttime) as starttime,
@@ -1587,14 +1485,27 @@ SELECT SQL_CACHE t.id, t.vid, t.pos, t.flags, t.channel, t.priority, t.lifetime
lifetime => $erg->{$t}->{lifetime}
};
- debug sprintf("Adjust timer %d (%s) at %s : from %s - %s to %s - %s",
+ # next if adjust change notthing ... (e.g. time changed only around few seconds)
+ next if($erg->{$t}->{timerstart} == $tt->{start}
+ && $erg->{$t}->{timerstop} == $tt->{stop});
+
+ # save timer
+ my $from = sprintf('%s - %s',fmttime($erg->{$t}->{timerstart}), fmttime($erg->{$t}->{timerstop}));
+ my $to = sprintf('%s - %s',fmttime($tt->{start}),fmttime($tt->{stop}));
+ debug sprintf("Adjust timer %d on %s at %s : from %s to %s - %s",
$tt->{pos},
- $tt->{file},
+ $self->{svdrp}->hostname($tt->{vid}),
$tt->{day},
- fmttime($erg->{$t}->{timerstart}), fmttime($erg->{$t}->{timerstop}),
- fmttime($tt->{start}),fmttime($tt->{stop}));
+ $from, $to,
+ $tt->{file});
$self->saveTimer($tt);
+
+ $self->news($tt->{vid},$tt->{pos}
+ ,sprintf(gettext("Adjust timer : %s"),$tt->{file})
+ ,'interesting'
+ ,sprintf(gettext("Adjust times from %s to %s"),$from, $to) . "\r\n"
+ );
}
return $erg;
}
@@ -2093,4 +2004,45 @@ sub suggest {
}
}
+# ------------------
+sub news {
+# ------------------
+ my $self = shift || return error('No object defined!');
+ my $vid = shift || return error('No vid defined!');
+ my $pos = shift || return error('No pos defined!');
+ my $title = shift || return error('No title defined!');
+ my $eventlevel = shift || return error('No eventlevel defined!');
+ my $description = shift || '';
+
+ my $timer = $self->getTimerByPos($vid,$pos) || return undef;
+ return $self->_news($title, $timer, $eventlevel, $description);
+}
+
+# ------------------
+sub _news {
+# ------------------
+ my $self = shift || return error('No object defined!');
+ my $title = shift || return error('No title defined!');
+ my $timer = shift || return error('No timer defined!');
+ my $eventlevel = shift || return error('No eventlevel defined!');
+ my $description = shift || '';
+
+ $description .= sprintf(gettext("Channel: %s"), $timer->{Channel});
+ $description .= "\r\n";
+
+ $timer->{starttime} = datum($timer->{Day});
+
+ $description .= sprintf(gettext("On: %s to %s"),
+ $timer->{starttime},
+ fmttime($timer->{stop}));
+ $description .= "\r\n";
+
+ my $epgdesc = $self->getEpgDesc($timer->{id});
+ $description .= $epgdesc
+ if($epgdesc);
+
+ main::getModule('EVENTS')->news($title, $description, "display", $timer->{eventid}, $eventlevel);
+
+}
+
1;
diff --git a/lib/XXV/OUTPUT/Html.pm b/lib/XXV/OUTPUT/Html.pm
index 0bd2473..9b2ba5d 100644
--- a/lib/XXV/OUTPUT/Html.pm
+++ b/lib/XXV/OUTPUT/Html.pm
@@ -1058,6 +1058,10 @@ sub parseData {
$self->parseData($dta->{$name});
} else {
$dta->{$name} = reentities($dta->{$name}) if($self->{hasentities});
+ #if($self->{charset} eq 'UTF-8'
+ # && $dta->{$name} && !utf8::is_utf8($dta->{$name})) {
+ # utf8::upgrade($dta->{$name});
+ #}
$dta->{$name} = entities($dta->{$name});
}
}
@@ -1067,6 +1071,10 @@ sub parseData {
$self->parseData($_);
} else {
$_ = reentities($_) if($self->{hasentities});
+ #if($self->{charset} eq 'UTF-8'
+ # && $_ && !utf8::is_utf8($_)) {
+ # utf8::upgrade($_);
+ #}
$_ = entities($_);
}
}
diff --git a/lib/XXV/OUTPUT/NEWS/JABBER.pm b/lib/XXV/OUTPUT/NEWS/JABBER.pm
index 481dd8d..273775a 100644
--- a/lib/XXV/OUTPUT/NEWS/JABBER.pm
+++ b/lib/XXV/OUTPUT/NEWS/JABBER.pm
@@ -3,16 +3,17 @@ use strict;
use Tools;
-# News Modules have only three methods
+# News Modules have only this methods
# init - for intervall or others
# send - send the informations
-# read - read the news and parse it
+# push - push the news and parse it
+# req - read the actual news print this out
# This module method must exist for XXV
# ------------------
sub module {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
my $args = {
Name => 'NEWS::JABBER',
Prereq => {
@@ -68,18 +69,14 @@ Then you must receive a message in your running jabber client.
required => gettext('This is required!'),
check => sub {
my $value = shift;
- my $erg = $obj->init
+ my $erg = $self->init
or return undef, gettext("Can't initialize news module!")
- if($value eq 'y' and not exists $obj->{JCON});
+ if($value eq 'y' and not exists $self->{JCON});
if($value eq 'y') {
- my $emodule = main::getModule('EVENTS');
- if(!$emodule or $emodule->{active} ne 'y') {
+ my $emod = main::getModule('EVENTS');
+ if(!$emod or $emod->{active} ne 'y') {
return undef, sprintf(gettext("Module can't activated! This module depends module %s."),'EVENTS');
}
- my $rmodule = main::getModule('REPORT');
- if(!$rmodule or $rmodule->{active} ne 'y') {
- return undef, sprintf(gettext("Module can't activated! This module depends module %s."),'REPORT');
- }
}
return $value;
},
@@ -89,18 +86,18 @@ Then you must receive a message in your running jabber client.
default => 1,
type => 'list',
choices => sub {
- my $rmodule = main::getModule('REPORT');
- return undef unless($rmodule);
- my $erg = $rmodule->get_level_as_array();
+ my $emod = main::getModule('EVENTS');
+ return undef unless($emod);
+ my $erg = $emod->get_level_as_array();
map { my $x = $_->[1]; $_->[1] = $_->[0]; $_->[0] = $x; } @$erg;
return @$erg;
},
required => gettext('This is required!'),
check => sub {
my $value = int(shift) || 0;
- my $rmodule = main::getModule('REPORT');
- return undef unless($rmodule);
- my $erg = $rmodule->get_level_as_array();
+ my $emod = main::getModule('EVENTS');
+ return undef unless($emod);
+ my $erg = $emod->get_level_as_array();
unless($value >= $erg->[0]->[0] and $value <= $erg->[-1]->[0]) {
return undef,
sprintf(gettext('Sorry, but value must be between %d and %d'),
@@ -162,7 +159,8 @@ sub new {
# all configvalues to $self without parents (important for ConfigModule)
map {
- $self->{$_} = $attr{'-config'}->{$self->{MOD}->{Name}}->{$_} || $self->{MOD}->{Preferences}->{$_}->{default}
+ $self->{$_} = $attr{'-config'}->{$self->{MOD}->{Name}}->{$_};
+ $self->{$_} = $self->{MOD}->{Preferences}->{$_}->{default} unless($self->{$_});
} keys %{$self->{MOD}->{Preferences}};
# Try to use the Requirments
@@ -190,7 +188,7 @@ sub new {
# ------------------
sub init {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
1;
}
@@ -198,13 +196,13 @@ sub init {
# ------------------
sub jconnect {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
my $jcon = Net::XMPP::Client->new(
debuglevel => 0,
) || return error("Can't create jabber client");
- my ($user, $server) = split('\@', $obj->{user});
+ my ($user, $server) = split('\@', $self->{user});
debug sprintf("Connecting to jabber server: %s ...", $server);
@@ -212,25 +210,25 @@ sub jconnect {
hostname => $server,
);
return
- unless($obj->xmpp_check_result("Connect",\@res,$jcon));
+ unless($self->xmpp_check_result("Connect",\@res,$jcon));
debug sprintf("Authentificat with User:%s ...", $user);
@res = $jcon->AuthSend(
'hostname'=>$server,
'username'=>$user,
- 'password'=>$obj->{passwd},
+ 'password'=>$self->{passwd},
'resource'=>'xxv'
);
return $jcon
- if($obj->xmpp_check_result("Login",\@res,$jcon));
+ if($self->xmpp_check_result("Login",\@res,$jcon));
}
# ------------------
sub jdisconnect {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
my $cnx = shift || 0;
$cnx->Disconnect()
@@ -243,33 +241,33 @@ sub jdisconnect {
# ------------------
sub send {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
my $vars = shift || return error('No data defined!');
return undef, lg('This function is deactivated!')
- if($obj->{active} ne 'y');
+ if($self->{active} ne 'y');
- my $cnx = $obj->jconnect()
+ my $cnx = $self->jconnect()
|| return error ('No connected JabberClient!' );
$cnx->MessageSend(
- 'to' => $obj->{receiveUser},
+ 'to' => $self->{receiveUser},
'subject'=> $vars->{Title},
'body' => ($vars->{Text} || $vars->{Url}),
);
- $cnx = $obj->jdisconnect($cnx);
+ $cnx = $self->jdisconnect($cnx);
1;
}
# ------------------
-sub read {
+sub push {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
my $vars = shift || return error('No data defined!');
- return $obj->send($vars);
+ return $self->send($vars);
1;
}
@@ -277,10 +275,10 @@ sub read {
# ------------------
sub req {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
return gettext('The module NEWS::JABBER is not active!')
- if($obj->{active} ne 'y');
+ if($self->{active} ne 'y');
my $vars = {
AddDate => time,
@@ -289,17 +287,17 @@ sub req {
Level => 100,
};
- if($obj->send($vars)) {
- return sprintf('Message is send to %s at %s', $obj->{receiveUser}, datum($vars->{AddDate}));
+ if($self->send($vars)) {
+ return sprintf('Message is send to %s at %s', $self->{receiveUser}, datum($vars->{AddDate}));
} else {
- return sprintf("Sorry, couldn't send message to %s at %s", $obj->{receiveUser}, datum($vars->{AddDate}));
+ return sprintf("Sorry, couldn't send message to %s at %s", $self->{receiveUser}, datum($vars->{AddDate}));
}
}
# ------------------
sub xmpp_check_result {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
my ($txt,$res,$cnx)=@_;
return error("Error '$txt': result undefined")
diff --git a/lib/XXV/OUTPUT/NEWS/MAIL.pm b/lib/XXV/OUTPUT/NEWS/MAIL.pm
index 66d9a5c..60ae109 100644
--- a/lib/XXV/OUTPUT/NEWS/MAIL.pm
+++ b/lib/XXV/OUTPUT/NEWS/MAIL.pm
@@ -7,14 +7,14 @@ use POSIX qw(locale_h);
# News Modules have only this methods
# init - for intervall or others
# send - send the informations
-# read - read the news and parse it
+# push - push the news and parse it
# req - read the actual news print this out
# This module method must exist for XXV
# ------------------
sub module {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
my $args = {
Name => 'NEWS::MAIL',
Prereq => {
@@ -33,19 +33,15 @@ sub module {
required => gettext('This is required!'),
check => sub {
my $value = shift;
- my $erg = $obj->init
+ my $erg = $self->init
or return undef, gettext("Can't initialize news module!")
- if($value eq 'y' and not exists $obj->{INITE});
+ if($value eq 'y' and not exists $self->{INITE});
return $value;
if($value eq 'y') {
- my $emodule = main::getModule('EVENTS');
- if(!$emodule or $emodule->{active} ne 'y') {
+ my $emod = main::getModule('EVENTS');
+ if(!$emod or $emod->{active} ne 'y') {
return undef, sprintf(gettext("Module can't activated! This module depends module %s."),'EVENTS');
}
- my $rmodule = main::getModule('REPORT');
- if(!$rmodule or $rmodule->{active} ne 'y') {
- return undef, sprintf(gettext("Module can't activated! This module depends module %s."),'REPORT');
- }
}
},
},
@@ -54,18 +50,18 @@ sub module {
default => 1,
type => 'list',
choices => sub {
- my $rmodule = main::getModule('REPORT');
- return undef unless($rmodule);
- my $erg = $rmodule->get_level_as_array();
+ my $emod = main::getModule('EVENTS');
+ return undef unless($emod);
+ my $erg = $emod->get_level_as_array();
map { my $x = $_->[1]; $_->[1] = $_->[0]; $_->[0] = $x; } @$erg;
return @$erg;
},
required => gettext('This is required!'),
check => sub {
my $value = int(shift) || 0;
- my $rmodule = main::getModule('REPORT');
- return undef unless($rmodule);
- my $erg = $rmodule->get_level_as_array();
+ my $emod = main::getModule('EVENTS');
+ return undef unless($emod);
+ my $erg = $emod->get_level_as_array();
unless($value >= $erg->[0]->[0] and $value <= $erg->[-1]->[0]) {
return undef,
sprintf(gettext('Sorry, but value must be between %d and %d'),
@@ -81,9 +77,9 @@ sub module {
required => gettext('This is required!'),
check => sub {
my $value = int(shift) || 0;
- if($value and ref $obj->{INTERVAL}) {
+ if($value and ref $self->{TIMER}) {
my $newinterval = $value*3600;
- $obj->{INTERVAL}->interval($newinterval);
+ $self->{TIMER}->interval($newinterval);
}
return $value;
},
@@ -139,18 +135,22 @@ sub new {
my $self = {};
bless($self, $class);
+ # read the DB Handle
+ $self->{dbh} = delete $attr{'-dbh'};
+
# paths
$self->{paths} = delete $attr{'-paths'};
# host
$self->{host} = delete $attr{'-host'};
- # who am I
+ # who am I
$self->{MOD} = $self->module;
# all configvalues to $self without parents (important for ConfigModule)
map {
- $self->{$_} = $attr{'-config'}->{$self->{MOD}->{Name}}->{$_} || $self->{MOD}->{Preferences}->{$_}->{default}
+ $self->{$_} = $attr{'-config'}->{$self->{MOD}->{Name}}->{$_};
+ $self->{$_} = $self->{MOD}->{Preferences}->{$_}->{default} unless($self->{$_});
} keys %{$self->{MOD}->{Preferences}};
# Try to use the Requirments
@@ -185,8 +185,7 @@ sub new {
# The Initprocess
my $erg = $self->init
- or return error("Can't initialize news module!")
- if($self->{active} eq 'y');
+ or return error("Can't initialize news module!");
$self->{TYP} = 'text/plain';
@@ -196,21 +195,24 @@ sub new {
# ------------------
sub init {
# ------------------
- my $obj = shift || return error('No object defined!');
- $obj->{INITE} = 1;
+ my $self = shift || return error('No object defined!');
+ $self->{INITE} = 1;
- $obj->{LastReportTime} = time;
+ $self->{LastReportTime} = main::getStartTime();
# Interval to send the next mail
- $obj->{INTERVAL} = Event->timer(
- interval => $obj->{interval}*3600,
+ $self->{TIMER} = Event->timer(
+ interval => $self->{interval}*3600,
prio => 6, # -1 very hard ... 6 very low
cb => sub{
- $obj->send();
+ if($self->{active} eq 'y') {
+ my $content = $self->_req();
+ $self->send($content);
+ }
},
);
- $obj->{COUNT} = 1;
+ $self->{COUNT} = 1;
1;
}
@@ -218,54 +220,55 @@ sub init {
# ------------------
sub send {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
return error('This function is deactivated!')
- if($obj->{active} ne 'y');
+ if($self->{active} ne 'y');
- ++$obj->{COUNT};
+ my $content = $self->_req();
- my $content = $obj->req();
+ my @addresses = split(/\s*,\s*/, $self->{address});
+
+ my $mail = new Mail::SendEasy(
+ smtp => $self->{smtp},
+ user => $self->{susr},
+ pass => $self->{spwd}
+ );
- my $smod = main::getModule('STATUS');
- my @addresses = split(/\s*,\s*/, $obj->{address});
# Send mail
- my $status = Mail::SendEasy::send(
- smtp => $obj->{smtp},
- user => $obj->{susr},
- pass => $obj->{spwd},
- from => $obj->{from_address},
+ my $status = $mail->send(
+ from => $self->{from_address},
from_title => 'XXV MailNewsAgent',
to => shift @addresses ,
cc => join(',', @addresses),
- subject => "News from your XXV System!" ,
+ subject => gettext("News from your XXV System!"),
msg => $content,
- msgid => $obj->{COUNT},
- ) || return error sprintf("Can't send mail: %s", $Mail::SendEasy::ER);
+ msgid => $self->{COUNT},
+ ) || return error sprintf("Can't send mail: %s", $mail->error);
- $obj->{LastReportTime} = time;
+ lg sprintf('Mail %d. send successfully', $self->{COUNT}++);
- lg sprintf('Mail %d. send successfully', $obj->{COUNT});
- $obj->{NEWSLETTER} = undef;
1;
}
# ------------------
sub parseHeader {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
+ my $newscnt = shift || 0;
+
my $output = '';
my $vars = {
- msgnr => $obj->{COUNT},
+ msgnr => $self->{COUNT},
date => datum(time),
- anzahl=> $obj->{NEWSCOUNT},
+ anzahl=> $newscnt,
};
- my $template = $obj->{TEMPLATES}->{'header'};
- $obj->{tt}->process($template, $vars, \$output)
- or return error($obj->{tt}->error());
+ my $template = $self->{TEMPLATES}->{'header'};
+ $self->{tt}->process($template, $vars, \$output)
+ or return error($self->{tt}->error());
return $output;
}
@@ -273,63 +276,107 @@ sub parseHeader {
# ------------------
sub parseFooter {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
my $output = '';
my $vars = {
usage => main::getModule('RECORDS')->{CapacityMessage},
uptime => main::getModule('STATUS')->uptime,
- lastreport => datum($obj->{LastReportTime}),
+ lastreport => datum($self->{LastReportTime}),
};
- my $template = $obj->{TEMPLATES}->{'footer'};
- $obj->{tt}->process($template, $vars, \$output)
- or return error($obj->{tt}->error());
+ my $template = $self->{TEMPLATES}->{'footer'};
+ $self->{tt}->process($template, $vars, \$output)
+ or return error($self->{tt}->error());
return $output;
}
# ------------------
-sub read {
+sub push {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
my $vars = shift || return error('No data defined!');
- my $output = '';
- $vars->{count} = ++$obj->{NEWSCOUNT};
- $vars->{host} = $obj->{host};
- $vars->{port} = main::getModule('HTTPD')->{Port};
-
- my $template = $obj->{TEMPLATES}->{'content'};
- $obj->{tt}->process($template, $vars, \$output)
- or return error($obj->{tt}->error());
-
- $obj->{NEWSLETTER} .= $output;
-
- return $output;
+ return undef;
}
# ------------------
sub req {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
+ my $params = shift || {};
+
+ if($params->{test}) {
+ my $content = $self->_req(1);
+ if($self->send($content)) {
+ return gettext('A mail with the following content has been sent to your mail account!')
+ . "\n\n"
+ . $content;
+ } else {
+ return gettext("Mail with the following content could'nt sent to your mail account!")
+ . "\n\n"
+ . $content;
+ }
+ }
+ return $self->_req(1);
+}
+# ------------------
+sub _req {
+# ------------------
+ my $self = shift || return error('No object defined!');
my $test = shift || 0;
return gettext('The module NEWS::Mail is not active!')
- if($obj->{active} ne 'y');
+ if($self->{active} ne 'y');
my $content = '';
- if($test) {
- $obj->send;
- $content .= gettext('A mail with the following content has been sent to your mail account!');
- $content .= "\n\n";
+
+ my $sql = "SELECT SQL_CACHE id, title, message, cmd, data, level, UNIX_TIMESTAMP(addtime) from EVENTS where level >= ? AND UNIX_TIMESTAMP(addtime) >= ? order by addtime desc";
+ my $sth = $self->{dbh}->prepare($sql);
+ $sth->execute($self->{level}, $self->{LastReportTime})
+ or return error sprintf("Couldn't execute query: %s.",$sth->errstr);
+ my $data = $sth->fetchall_arrayref();
+
+ $content .= $self->parseHeader($data ? scalar @$data : 0);
+
+ my $emod = main::getModule('EVENTS');
+ my $hmod = main::getModule('HTTPD');
+ my $url = sprintf("http://%s:%s/", $self->{host}, $hmod->{Port});
+
+ foreach my $entry (@{$data}) {
+ my ($id, $title, $message, $cmd, $data, $level, $addtime) = @{$entry};
+
+ my $link = $url;
+ $link .= sprintf("?cmd=%s&data=%s", $cmd, $data)
+ if($cmd && $data);
+
+ my $vars = {
+ AddDate => $addtime,
+ Title => $title,
+ Text => $message,
+ Cmd => $cmd,
+ Id => $data,
+ Url => $link,
+ Level => $level,
+ category => $emod->translate_scala($level),
+ count => $id,
+ host => $self->{host},
+ port => $hmod->{Port},
+ };
+
+ my $output = '';
+ my $template = $self->{TEMPLATES}->{'content'};
+ $self->{tt}->process($template, $vars, \$output)
+ or return error($self->{tt}->error());
+ $content .= $output;
}
- $content .= $obj->parseHeader();
- $content .= $obj->{NEWSLETTER};
- $content .= $obj->parseFooter();
+ $content .= $self->parseFooter();
+
+ $self->{LastReportTime} = time unless($test);
return $content;
}
diff --git a/lib/XXV/OUTPUT/NEWS/RSS.pm b/lib/XXV/OUTPUT/NEWS/RSS.pm
index 376a438..7ede3f3 100644
--- a/lib/XXV/OUTPUT/NEWS/RSS.pm
+++ b/lib/XXV/OUTPUT/NEWS/RSS.pm
@@ -4,16 +4,17 @@ use strict;
use Tools;
use POSIX qw(locale_h);
-# News Modules have only three methods
+# News Modules have only this methods
# init - for intervall or others
# send - send the informations
-# read - read the news and parse it
+# push - push the news and parse it
+# req - read the actual news print this out
# This module method must exist for XXV
# ------------------
sub module {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
my $args = {
Name => 'NEWS::RSS',
Prereq => {
@@ -32,18 +33,14 @@ sub module {
required => gettext('This is required!'),
check => sub {
my $value = shift;
- my $erg = $obj->init
+ my $erg = $self->init
or return undef, gettext("Can't initialize news module!")
- if($value eq 'y' and not exists $obj->{INITE});
+ if($value eq 'y' and not exists $self->{INITE});
if($value eq 'y') {
- my $emodule = main::getModule('EVENTS');
- if(!$emodule or $emodule->{active} ne 'y') {
+ my $emod = main::getModule('EVENTS');
+ if(!$emod or $emod->{active} ne 'y') {
return undef, sprintf(gettext("Module can't activated! This module depends module %s."),'EVENTS');
}
- my $rmodule = main::getModule('REPORT');
- if(!$rmodule or $rmodule->{active} ne 'y') {
- return undef, sprintf(gettext("Module can't activated! This module depends module %s."),'REPORT');
- }
}
return $value;
},
@@ -53,18 +50,18 @@ sub module {
default => 1,
type => 'list',
choices => sub {
- my $rmodule = main::getModule('REPORT');
- return undef unless($rmodule);
- my $erg = $rmodule->get_level_as_array();
+ my $emod = main::getModule('EVENTS');
+ return undef unless($emod);
+ my $erg = $emod->get_level_as_array();
map { my $x = $_->[1]; $_->[1] = $_->[0]; $_->[0] = $x; } @$erg;
return @$erg;
},
required => gettext('This is required!'),
check => sub {
my $value = int(shift) || 0;
- my $rmodule = main::getModule('REPORT');
- return undef unless($rmodule);
- my $erg = $rmodule->get_level_as_array();
+ my $emod = main::getModule('EVENTS');
+ return undef unless($emod);
+ my $erg = $emod->get_level_as_array();
unless($value >= $erg->[0]->[0] and $value <= $erg->[-1]->[0]) {
return undef,
sprintf(gettext('Sorry, but value must be between %d and %d'),
@@ -85,18 +82,22 @@ sub new {
my $self = {};
bless($self, $class);
+ # read the DB Handle
+ $self->{dbh} = delete $attr{'-dbh'};
+
# paths
$self->{paths} = delete $attr{'-paths'};
# host
$self->{host} = delete $attr{'-host'};
- # who am I
+ # who am I
$self->{MOD} = $self->module;
# all configvalues to $self without parents (important for ConfigModule)
map {
- $self->{$_} = $attr{'-config'}->{$self->{MOD}->{Name}}->{$_} || $self->{MOD}->{Preferences}->{$_}->{default}
+ $self->{$_} = $attr{'-config'}->{$self->{MOD}->{Name}}->{$_};
+ $self->{$_} = $self->{MOD}->{Preferences}->{$_}->{default} unless($self->{$_});
} keys %{$self->{MOD}->{Preferences}};
# Try to use the Requirments
@@ -118,16 +119,14 @@ sub new {
}, "NEWS::RSS: Start initiate rss feed ...")
if($self->{active} eq 'y');
-
-
return $self;
}
# ------------------
sub init {
# ------------------
- my $obj = shift || return error('No object defined!');
- $obj->{INITE} = 1;
+ my $self = shift || return error('No object defined!');
+ $self->{INITE} = 1;
1;
}
@@ -135,10 +134,12 @@ sub init {
# ------------------
sub createRSS {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
my $ver = shift || 2;
- my $account = sprintf("%s@%s", $ENV{USER}, main::getModule('STATUS')->name);
- my $url = sprintf("http://%s:%s/", $obj->{host}, main::getModule('HTTPD')->{Port});
+ my $lastaddtime = shift;
+ my $url = shift;
+
+ my $account = sprintf("%s@%s", $ENV{USER}, $self->{host});
my $rss;
if($ver == 1) {
@@ -149,8 +150,8 @@ sub createRSS {
$rss->channel(
title => gettext("XXV RSS 1.0"),
- 'link' => $url,
- description => gettext("Important messages from your VDR/XXV"),
+ 'link' => $url,
+ description => gettext("Messages from your VDR/XXV"),
dc => {
date => datum(time,'int'),
subject => gettext("XXV messages"),
@@ -165,8 +166,6 @@ sub createRSS {
);
} elsif($ver == 2) {
- my $lastbuild = (exists $obj->{lastBuildDate} ? $obj->{lastBuildDate} : time);
- my $lastadd = (exists $obj->{lastAddDate} ? $obj->{lastAddDate} : time);
$rss = XML::RSS->new(
version => '2.0',
@@ -175,76 +174,66 @@ sub createRSS {
$rss->channel(
title => gettext("XXV RSS 2.0"),
'link' => $url,
- description => gettext("Important messages from your VDR/XXV"),
+ description => gettext("Messages from your VDR/XXV"),
language => setlocale(POSIX::LC_MESSAGES),
- pubDate => datum($lastadd, 'rss'),
- lastBuildDate => datum($lastbuild, 'rss'),
+ pubDate => datum($lastaddtime, 'rss'),
+ lastBuildDate => datum(time, 'rss'),
managingEditor => $account,
);
}
- $obj->{lastBuildDate} = time;
return ($ver, $rss);
}
# ------------------
-sub send {
+sub push {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
my $vars = shift || return error('No data defined!');
- while($obj->{STACK} && scalar @{$obj->{STACK}} > 100) {
- shift(@{$obj->{STACK}});
- }
-
- push(@{$obj->{STACK}}, [
- ++$obj->{COUNT},
- entities($vars->{Title}),
- entities($vars->{Url}),
- entities($vars->{Text}),
- datum($vars->{AddDate},'int'),
- $vars->{category},
- ]);
- $obj->{lastAddDate} = time;
-
- lg sprintf('Insert rss item (%d)', $obj->{COUNT});
- 1;
-}
-
-# ------------------
-sub read {
-# ------------------
- my $obj = shift || return error('No object defined!');
- my $vars = shift || return error('No data defined!');
-
- return undef, lg('This function is deactivated!')
- if($obj->{active} ne 'y');
-
- return $obj->send($vars);
+ return;
}
# ------------------
sub req {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
my $params = shift || {};
return gettext('The module NEWS::RSS is not active!')
- if($obj->{active} ne 'y');
+ if($self->{active} ne 'y');
- my ($ver, $rss) = $obj->createRSS($params->{version});
+ my $sql = "SELECT SQL_CACHE id, title, message, cmd, data, level, UNIX_TIMESTAMP(addtime) from EVENTS where level >= ? order by addtime desc LIMIT 0,50";
+ my $sth = $self->{dbh}->prepare($sql);
+ $sth->execute($self->{level})
+ or return error sprintf("Couldn't execute query: %s.",$sth->errstr);
+ my $data = $sth->fetchall_arrayref();
+
+ my $lastaddtime = ($data && scalar @$data) ? $data->[0]->[6] : time;
+
+ my $url = sprintf("http://%s:%s", $self->{host}, main::getModule('HTTPD')->{Port});
+ my ($ver, $rss) = $self->createRSS($params->{version}, $lastaddtime, $url);
return 0 unless($rss);
- foreach my $entry (@{$obj->{STACK}}) {
- my ($item, $title, $link, $descr, $adddate, $category) = @{$entry};
+ my $emod = main::getModule('EVENTS');
+ foreach my $entry (@{$data}) {
+ my ($id, $title, $message, $cmd, $data, $level, $addtime) = @{$entry};
+
+ my $link = '';
+ $link = sprintf("%s/?cmd=%s&data=%s", $url, $cmd, $data)
+ if($cmd && $data);
+
+ my $category = $emod->translate_scala($level);
+ $message =~ s/\r\n/<br \/>/g;
+
if($ver == 1) {
$rss->add_item(
title => $title,
link => $link,
- description => $descr,
+ description => entities($message),
dc => {
- date => $adddate,
+ date => datum($addtime, 'rss'),
subject => $category,
},
);
@@ -252,10 +241,10 @@ sub req {
$rss->add_item(
title => $title,
link => $link,
- description => $descr,
- pubDate => $adddate,
+ description => entities($message),
+ pubDate => datum($addtime, 'rss'),
category => $category,
- guid => sprintf(gettext('RSS item %d at %s'), $item, $adddate),
+ guid => $id,
);
}
}
diff --git a/lib/XXV/OUTPUT/NEWS/VDR.pm b/lib/XXV/OUTPUT/NEWS/VDR.pm
index 9f90c01..95beb59 100644
--- a/lib/XXV/OUTPUT/NEWS/VDR.pm
+++ b/lib/XXV/OUTPUT/NEWS/VDR.pm
@@ -4,16 +4,17 @@ use strict;
use Tools;
use POSIX qw(locale_h);
-# News Modules have only three methods
+# News Modules have only this methods
# init - for intervall or others
# send - send the informations
-# read - read the news and parse it
+# push - push the news and parse it
+# req - read the actual news print this out
# This module method must exist for XXV
# ------------------
sub module {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
my $args = {
Name => 'NEWS::VDR',
Description => gettext('This NEWS module generates messages for the VDR interface.'),
@@ -29,18 +30,14 @@ sub module {
required => gettext('This is required!'),
check => sub {
my $value = shift;
- my $erg = $obj->init
+ my $erg = $self->init
or return undef, gettext("Can't initialize news module!")
- if($value eq 'y' and not exists $obj->{INITE});
+ if($value eq 'y' and not exists $self->{INITE});
if($value eq 'y') {
- my $emodule = main::getModule('EVENTS');
- if(!$emodule or $emodule->{active} ne 'y') {
+ my $emod = main::getModule('EVENTS');
+ if(!$emod or $emod->{active} ne 'y') {
return undef, sprintf(gettext("Module can't activated! This module depends module %s."),'EVENTS');
}
- my $rmodule = main::getModule('REPORT');
- if(!$rmodule or $rmodule->{active} ne 'y') {
- return undef, sprintf(gettext("Module can't activated! This module depends module %s."),'REPORT');
- }
}
return $value;
},
@@ -50,18 +47,18 @@ sub module {
default => 1,
type => 'list',
choices => sub {
- my $rmodule = main::getModule('REPORT');
- return undef unless($rmodule);
- my $erg = $rmodule->get_level_as_array();
+ my $emod = main::getModule('EVENTS');
+ return undef unless($emod);
+ my $erg = $emod->get_level_as_array();
map { my $x = $_->[1]; $_->[1] = $_->[0]; $_->[0] = $x; } @$erg;
return @$erg;
},
required => gettext('This is required!'),
check => sub {
my $value = int(shift) || 0;
- my $rmodule = main::getModule('REPORT');
- return undef unless($rmodule);
- my $erg = $rmodule->get_level_as_array();
+ my $emod = main::getModule('EVENTS');
+ return undef unless($emod);
+ my $erg = $emod->get_level_as_array();
unless($value >= $erg->[0]->[0] and $value <= $erg->[-1]->[0]) {
return undef,
sprintf(gettext('Sorry, but value must be between %d and %d'),
@@ -93,7 +90,8 @@ sub new {
# all configvalues to $self without parents (important for ConfigModule)
map {
- $self->{$_} = $attr{'-config'}->{$self->{MOD}->{Name}}->{$_} || $self->{MOD}->{Preferences}->{$_}->{default}
+ $self->{$_} = $attr{'-config'}->{$self->{MOD}->{Name}}->{$_};
+ $self->{$_} = $self->{MOD}->{Preferences}->{$_}->{default} unless($self->{$_});
} keys %{$self->{MOD}->{Preferences}};
# Try to use the Requirments
@@ -121,10 +119,10 @@ sub new {
# ------------------
sub init {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
- $obj->{INITE} = 1;
- $obj->{SVDRP} = main::getModule('SVDRP');
+ $self->{INITE} = 1;
+ $self->{SVDRP} = main::getModule('SVDRP');
1;
}
@@ -132,39 +130,40 @@ sub init {
# ------------------
sub send {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
my $vars = shift || return error('No data defined!');
return lg('This function is deactivated!')
- if($obj->{active} ne 'y');
+ if($self->{active} ne 'y');
return lg('Title is not set!')
unless($vars->{Title});
+ return undef unless($vars->{level} >= $self->{level} );
my $cmd = sprintf('MESG %s', $vars->{Title});
- my $svdrp = $obj->{SVDRP} || return error ('No SVDRP!' );
+ my $svdrp = $self->{SVDRP} || return error ('No SVDRP!' );
return $svdrp->command($cmd);
}
# ------------------
-sub read {
+sub push {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
my $vars = shift || return error('No data defined!');
- return $obj->send($vars);
+ return $self->send($vars);
}
# ------------------
sub req {
# ------------------
- my $obj = shift || return error('No object defined!');
+ my $self = shift || return error('No object defined!');
my $test = shift || 0;
return gettext('The module NEWS::VDR is not active!')
- if($obj->{active} ne 'y');
+ if($self->{active} ne 'y');
my $vars = {
AddDate => time,
@@ -172,10 +171,10 @@ sub req {
Text => 'This is only a test from xxv news vdr modul!',
Cmd => 'request',
Id => 'vdr',
- Level => 'harmless',
+ Level => 100,
};
- if( $obj->read($vars) ) {
+ if( $self->send($vars) ) {
return gettext("Message was been sent to your VDR!");
} else {
return gettext("Message chould'nt been sent to your VDR!");