+sub newsFlush {
+ if (@_) {
+ &ScheduleThis(60, "newsFlush");
+ return if ($_[0] eq "2"); # defer.
+ }
+
+ if (&ChanConfList("news")) {
+ } else {
+ &DEBUG("newsFlush: news disabled? (chan => $chan)");
+ return;
+ }
+
+ my $delete = 0;
+ my $oldest = time();
+ my %none;
+ foreach $chan (keys %::news) {
+ my $i = 0;
+ my $total = scalar(keys %{ $::news{$chan} });
+
+ &DEBUG("newsFlush: chan => $chan (total => $total)");
+
+ foreach $item (keys %{ $::news{$chan} }) {
+ my $t = $::news{$chan}{$item}{Expire};
+
+ my $tadd = $::news{$chan}{$item}{Time};
+ $oldest = $tadd if ($oldest > $tadd);
+
+ next if ($t == 0 or $t == -1);
+ if ($t < 1000) {
+ &status("newsFlush: Fixed Expire time for $chan/$item, should not happen anyway.");
+ $::news{$chan}{$item}{Expire} = time() + $t*60*60*24;
+ next;
+ }
+
+ my $delta = $t - time();
+
+ next unless (time() > $t);
+
+ # todo: show how old it was.
+ delete $::news{$chan}{$item};
+ &status("NEWS: (newsflush) deleted '$item'");
+ $delete++;
+ $i++;
+ }
+
+ &status("NEWS (newsflush) {$chan}: deleted [$i/$total] news entries.");
+ $none{$chan} = 1 if ($total == $i);
+ }
+
+ # todo: flush users aswell.
+ my $duser = 0;
+ foreach $chan (keys %::newsuser) {
+ next if (exists $none{$chan});
+
+ foreach (keys %{ $::newsuser{$chan} }) {
+ my $t = $::newsuser{$chan}{$_};
+ if (!defined $t or ($t > 2 and $t < 1000)) {
+ &DEBUG("something wrong with newsuser{$chan}{$_} => $t");
+ next;
+ }
+
+ next unless ($oldest > $t);
+
+ delete $::newsuser{$chan}{$_};
+ $duser++;
+ }
+
+ my $i = scalar(keys %{ $::newsuser{$chan} });
+ delete $::newsuser{$chan} unless ($i);
+ }
+
+ if ($delete or $duser) {
+ &News::writeNews();
+ &status("NewsFlush: deleted: $delete news entries; $duser user cache.");
+ }
+}
+