X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2FModules%2FNews.pl;h=caee5f104751e0fab85324b543997dfecb8f4292;hb=f7cae48a17d6decd0a9bd997188271daa0a885b1;hp=7bf24a5439f2d6e997070da6c6a8cda7fdfc94bd;hpb=38fc83f7b5f303cd4ad4348f19522fe523f6f974;p=infobot.git diff --git a/src/Modules/News.pl b/src/Modules/News.pl index 7bf24a5..caee5f1 100644 --- a/src/Modules/News.pl +++ b/src/Modules/News.pl @@ -1,7 +1,7 @@ # # News.pl: Advanced news management # Author: dms -# Version: v0.3 (20014012) +# Version: v0.3 (20010412) # Created: 20010326 # Notes: Testing done by greycat, kudos! # @@ -15,10 +15,12 @@ # Text - Actual text. ### -use vars qw($who); - package News; +use strict; + +use vars qw($who $chan); + sub Parse { my($what) = @_; $chan = undef; @@ -102,11 +104,12 @@ sub Parse { } elsif ($what =~ /^(expire|text|desc)(\s+(.*))?$/i) { # shortcut/link. # nice hack. + my $cmd = $1; my($arg1,$arg2) = split(/\s+/, $3, 2); - &set("$arg1 $1 $arg2"); + &set("$arg1 $cmd $arg2"); } elsif ($what =~ /^help(\s+(.*))?$/i) { - &::help("news$1"); + &::help("news $2"); } elsif ($what =~ /^newsflush$/i) { &::msg($who, "newsflush called... check out the logs!"); @@ -192,11 +195,13 @@ sub readNews { close NEWS; my $cn = scalar(keys %::news); + return unless ($ci or $cn or $cu); + &::status("News: read ". $ci. &::fixPlural(" item", $ci). " for ". $cn. &::fixPlural(" chan", $cn). ", ". $cu. &::fixPlural(" user", $cu), " cache" - ) if ($ci or $cn or $cu); + ); } sub writeNews { @@ -205,10 +210,11 @@ sub writeNews { return; } + # should define this at the top of file. my $file = "$::bot_base_dir/blootbot-news.txt"; if (fileno NEWS) { - &::ERROR("fileno NEWS exists, should never happen."); + &::ERROR("News: write: fileno NEWS exists, should never happen."); return; } @@ -221,6 +227,7 @@ sub writeNews { $c = scalar keys %{ $::news{$chan} }; next unless ($c); $cc++; + my $item; foreach $item (sort keys %{ $::news{$chan} }) { $c = scalar keys %{ $::news{$chan}{$item} }; @@ -228,6 +235,7 @@ sub writeNews { $ci++; print NEWS "$chan $item\n"; + my $what; foreach $what (sort keys %{ $::news{$chan}{$item} }) { print NEWS " $what: $::news{$chan}{$item}{$what}\n"; } @@ -279,11 +287,11 @@ sub add { my $agestr = &::Time2String($::news{$chan}{$str}{Expire} - time() ); my $item = &newsS2N($str); - &::notice($who, "Added '\037$str\037' at [".localtime(time). + &::notice($who, "Added '\037$str\037' at [".gmtime(time). "] by \002$::who\002 for item #\002$item\002."); &::notice($who, "Now do 'news text $item '"); &::notice($who, "This item will expire at \002". - localtime($::news{$chan}{$str}{Expire})."\002 [$agestr from now] " + gmtime($::news{$chan}{$str}{Expire})."\002 [$agestr from now] " ); &writeNews(); @@ -359,7 +367,7 @@ sub del { sub list { if (!scalar keys %{ $::news{$chan} }) { - &::notice($who, "No News for \002$chan\002."); + &::notice($who, "No news for \002$chan\002."); return; } @@ -389,15 +397,17 @@ sub list { $newest = $t if ($t > $newest); if ($e > 1 and $e < $expire) { $expire = $e; - $eno = &newsS2N($item); + &::DEBUG("before newsS2N($_)"); + $eno = &newsS2N($_); + &::DEBUG("after newsS2N($_) == $eno"); } } my $timestr = &::Time2String(time() - $newest); &::msg($who, "|= Last updated $timestr ago."); &::msg($who, " \037Num\037 \037Item ".(" "x40)." \037"); - &DEBUG("list: expire = $expire"); - &::DEBUG("list: eno = $eno"); +# &::DEBUG("news: list: expire = $expire"); +# &::DEBUG("news: list: eno = $eno"); my $i = 1; foreach ( &getNewsAll() ) { @@ -436,12 +446,21 @@ sub read { } if (!scalar keys %{ $::news{$chan} }) { - &::notice($who, "No News for \002$chan\002."); + &::notice($who, "No news for \002$chan\002."); return; } my $item = &getNewsItem($str); if (!defined $item or !scalar keys %{ $::news{$chan}{$item} }) { + # todo: numerical check. + if ($str =~ /^(\d+)[-, ](\d+)$/ or + $str =~ /^-(\d+)$/ or + $str =~ /^(\d+)-$/ or 0 + ) { + &::notice($who, "We don't support multiple requests of news items yet. Sorry."); + return; + } + &::notice($who, "No news item called '$str'"); return; } @@ -451,7 +470,7 @@ sub read { return; } - my $t = localtime( $::news{$chan}{$item}{Time} ); + my $t = gmtime( $::news{$chan}{$item}{Time} ); my $a = $::news{$chan}{$item}{Author}; my $text = $::news{$chan}{$item}{Text}; my $num = &newsS2N($item); @@ -473,7 +492,7 @@ sub read { my $e; if ($_) { $e = sprintf("\037%s\037 [%s from now]", - scalar(localtime($_)), + scalar(gmtime($_)), &::Time2String($_ - time()) ); } @@ -523,7 +542,7 @@ sub mod { if ($flags eq "") { $done++ if (!$done and $mod_news =~ s/\Q$op\E/$np/); $done++ if (!$done and $mod_nnews =~ s/\Q$op\E/$np/); - } elsif ($flags eq "g") { + } elsif ($flags eq "g") { $done++ if ($mod_news =~ s/\Q$op\E/$np/g); $done++ if ($mod_nnews =~ s/\Q$op\E/$np/g); } @@ -570,12 +589,15 @@ sub set { my($args) = @_; my($item, $what, $value); + if (!defined $args) { + &::DEBUG("news: set: args == NULL."); + return; + } + $item = $1 if ($args =~ s/^(\S+)\s*//); $what = $1 if ($args =~ s/^(\S+)\s*//); $value = $args; - &::DEBUG("news: set called."); - if ($item eq "") { &::help("news set"); return; @@ -658,7 +680,7 @@ sub set { return; } else { &::notice($who, "Set expire for \002$item\002, to ". - localtime($time) ." [".&::Time2String($time - time())."]" ); + gmtime($time) ." [".&::Time2String($time - time())."]" ); if (time() > $time) { &::DEBUG("news: hrm... time() > $time, should expire."); @@ -672,7 +694,7 @@ sub set { } my $auth = 0; - &::DEBUG("news: who => '$who'"); +# &::DEBUG("news: who => '$who'"); my $author = $::news{$chan}{$news}{Author}; $auth++ if ($::who eq $author); $auth++ if (&::IsFlag("o")); @@ -699,11 +721,11 @@ sub set { } sub latest { - my($tchan, $flag) = @_; + my ($tchan, $flag) = @_; - # hack hack hack. - $chan ||= $tchan; - $who = $::who; + # hack hack hack. fix later. + $chan = $tchan; + $who = $::who; # todo: if chan = undefined, guess. # if (!exists $::news{$chan}) { @@ -713,15 +735,15 @@ sub latest { } my $t = $::newsuser{$chan}{$who}; - if (defined $t) { - &::DEBUG("newsuser: $chan/$who == $t"); - } else { - &::DEBUG("newsuser: $chan/$who == undefined"); - } +# if (defined $t) { +# &::DEBUG("newsuser: $chan/$who == $t"); +# } else { +# &::DEBUG("newsuser: $chan/$who == undefined"); +# } if (defined $t and ($t == 0 or $t == -1)) { if ($flag) { - &::notice($who, "if you want to read news, try /msg $::ident news or /msg $::ident news notify"); + &::notice($who, "if you want to read news, try \002/msg $::ident news $chan\002 or \002/msg $::ident news $chan notify\002"); } else { &::DEBUG("news: not displaying any new news for $who"); return; @@ -730,14 +752,14 @@ sub latest { $::chan = $chan; my $x = &::IsChanConf("newsNotifyAll"); - if (&::IsChanConf("newsNotifyAll") and !defined $t) { - $t = 1; - } + return if (!$x); + + # I don't understand this code ;) + $t = 1 if (!defined $t); if (!defined $t) { - &::DEBUG("news: something went really wrong."); - &::DEBUG("news: chan => $chan, ::chan => $::chan"); -# &::notice($who, "something went really wrong."); +# &::msg($who, "News is disabled for $chan"); + &::DEBUG("news: $chan: something went really wrong."); return; } @@ -770,9 +792,22 @@ sub latest { # scalar @new, !$flag my $unread = scalar @new; my $total = scalar keys %{ $::news{$chan} }; + if (!$flag && !&::IsChanConf("newsTellUnread")) { + return; + } + if (!$flag) { return unless ($unread); + # just a temporary measure not to flood ourself off the + # network with news until we get global notice() and msg() + # throttling. + if (time() - ($::cache{newsTime} || 0) < 5) { + &::status("news: not displaying latest notice to $who/$chan."); + return; + } + + $::cache{newsTime} = time(); my $reply = "There are unread news in $chan ($unread unread, $total total). /msg $::ident news $::chan latest"; $reply .= " If you don't want further news notification, /msg $::ident news unnotify" if ($unread == $total); &::notice($who, $reply); @@ -790,23 +825,29 @@ sub latest { &::notice($who, "|= Last time read $timestr ago"); } + my $i; my @sorted; foreach (@new) { - my $i = &newsS2N($_); + $i = &newsS2N($_); $sorted[$i] = $_; } - for (my $i=0; $i<=scalar(@sorted); $i++) { + for ($i=0; $i<=scalar(@sorted); $i++) { my $news = $sorted[$i]; next unless (defined $news); - my $age = time() - $::news{$chan}{$news}{Time}; - &::notice($who, sprintf("\002[\002%2d\002]\002 %s", - $i, $news) ); -# $i, $_, &::Time2String($age) ) ); +# my $age = time() - $::news{$chan}{$news}{Time}; + my $msg = sprintf("\002[\002%2d\002]\002 %s", $i, $news); +### $i, $_, &::Time2String($age) + $::conn->schedule(int((2+$i)/2), sub { + &::notice($who, $msg); + } ); } - &::notice($who, "|= to read, do 'news read <#>' or 'news read '"); + # todo: implement throttling via schedule into ¬ice() / &msg(). + $::conn->schedule(int((2+$i)/2), sub { + &::notice($who, "|= to read, do \002news $chan read <#>\002 or \002news $chan read \002"); + } ); # lame hack to prevent dupes if we just ignore it. my $x = $::newsuser{$chan}{$who}; @@ -867,6 +908,8 @@ sub getNewsItem { my($what) = @_; my $item = 0; + $what =~ s/^\#//; # '#1' for example. + my %time; foreach (keys %{ $::news{$chan} }) { my $t = $::news{$chan}{$_}{Time}; @@ -916,7 +959,7 @@ sub getNewsItem { } if (@items) { - &::DEBUG("news: gNI: part_string->full_string: $what->$items[0]"); +# &::DEBUG("news: gNI: part_string->full_string: $what->$items[0]"); return $items[0]; } else { &::DEBUG("news: gNI: No match for '$what'"); @@ -924,7 +967,7 @@ sub getNewsItem { } } - &::ERROR("getNewsItem: Should not happen (what = $what)"); + &::ERROR("news: gNI: should not happen (what = $what)"); return; }