diff options
| author | Andreas Brachold <vdr07@deltab.de> | 2008-08-10 14:05:26 +0000 |
|---|---|---|
| committer | Andreas Brachold <vdr07@deltab.de> | 2008-08-10 14:05:26 +0000 |
| commit | 2e9c00e1bdd19f3fb61ce0aaede85d5f5400ef81 (patch) | |
| tree | bf3734ba1dbfb0e8c5df072c55b19b62603135b5 /lib | |
| parent | 11ad754da4d127a74e26894e97c232a3a98972b5 (diff) | |
| download | xxv-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.pm | 11 | ||||
| -rw-r--r-- | lib/XXV/MODULES/AUTOTIMER.pm | 56 | ||||
| -rw-r--r-- | lib/XXV/MODULES/CHANNELS.pm | 6 | ||||
| -rw-r--r-- | lib/XXV/MODULES/EVENTS.pm | 339 | ||||
| -rw-r--r-- | lib/XXV/MODULES/HTTPD.pm | 6 | ||||
| -rw-r--r-- | lib/XXV/MODULES/RECORDS.pm | 4 | ||||
| -rw-r--r-- | lib/XXV/MODULES/REPORT.pm | 212 | ||||
| -rw-r--r-- | lib/XXV/MODULES/SHARE.pm | 41 | ||||
| -rw-r--r-- | lib/XXV/MODULES/STATUS.pm | 2 | ||||
| -rw-r--r-- | lib/XXV/MODULES/SVDRP.pm | 23 | ||||
| -rw-r--r-- | lib/XXV/MODULES/TIMERS.pm | 306 | ||||
| -rw-r--r-- | lib/XXV/OUTPUT/Html.pm | 8 | ||||
| -rw-r--r-- | lib/XXV/OUTPUT/NEWS/JABBER.pm | 76 | ||||
| -rw-r--r-- | lib/XXV/OUTPUT/NEWS/MAIL.pm | 207 | ||||
| -rw-r--r-- | lib/XXV/OUTPUT/NEWS/RSS.pm | 137 | ||||
| -rw-r--r-- | lib/XXV/OUTPUT/NEWS/VDR.pm | 61 |
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!"); |
