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/XXV/OUTPUT | |
| 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/XXV/OUTPUT')
| -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 |
5 files changed, 265 insertions, 224 deletions
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!"); |
