X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2FModules%2FNews.pl;h=07c037ac7a8f2427fac40f506f29062a694bf54b;hb=d337f15b80c305f20994c630ac788b337cf2ab60;hp=6acebdb2759525ac3df9f4b1c8ceb86327a9daf1;hpb=65a936279f6b34da2bae1091908c14e73ecd457d;p=infobot.git diff --git a/src/Modules/News.pl b/src/Modules/News.pl index 6acebdb..07c037a 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; @@ -33,12 +35,12 @@ sub Parse { &readNews(); } - if ($::msgType ne "private") { + if ($::msgType ne 'private') { $chan = $::chan; } if (defined $what and $what =~ s/^($::mask{chan})\s*//) { - # todo: check if the channel exists aswell. + # TODO: check if the channel exists aswell. $chan = lc $1; if (!&::IsNickInChan($who, $chan)) { @@ -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!"); @@ -115,8 +118,8 @@ sub Parse { } elsif ($what =~ /^(un)?notify$/i) { my $state = ($1) ? 0 : 1; - # todo: don't notify even if "news" is called. - if (!&::IsChanConf("newsNotifyAll")) { + # TODO: don't notify even if 'News' is called. + if (&::IsChanConf('newsNotifyAll') <= 0) { &::DEBUG("news: chan => $chan, ::chan => $::chan."); &::notice($who, "not available for this channel or disabled altogether."); return; @@ -134,7 +137,7 @@ sub Parse { } else { # state = 0 my $x = $::newsuser{$chan}{$who}; if (defined $x and ($x == 0 or $x == -1)) { - &::notice($who, "notify already disabled"); + &::notice($who, 'notify already disabled'); return; } $::newsuser{$chan}{$who} = -1; @@ -147,7 +150,7 @@ sub Parse { } sub readNews { - my $file = "$::bot_base_dir/blootbot-news.txt"; + my $file = "$::bot_base_dir/infobot-news.txt"; if (! -f $file or -z $file) { return; } @@ -164,7 +167,7 @@ sub readNews { while () { chop; - # todo: allow commands. + # TODO: allow commands. if (/^[\s\t]+(\S+):[\s\t]+(.*)$/) { if (!defined $item) { @@ -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); + $ci. &::fixPlural(' item', $ci). ' for '. + $cn. &::fixPlural(' chan', $cn). ', '. + $cu. &::fixPlural(' user', $cu), ' cache' + ); } sub writeNews { @@ -205,14 +210,15 @@ sub writeNews { return; } - my $file = "$::bot_base_dir/blootbot-news.txt"; + # should define this at the top of file. + my $file = "$::bot_base_dir/infobot-news.txt"; if (fileno NEWS) { - &::ERROR("fileno NEWS exists, should never happen."); + &::ERROR("News: write: fileno NEWS exists, should never happen."); return; } - # todo: add commands to output file. + # TODO: add commands to output file. my $c = 0; my($cc,$ci,$cu) = (0,0,0); @@ -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"; } @@ -235,8 +243,8 @@ sub writeNews { } } - # todo: show how many users we wrote down. - if (&::getChanConfList("newsKeepRead")) { + # TODO: show how many users we wrote down. + if (&::getChanConfList('newsKeepRead')) { # old users are removed in newsFlush(), perhaps it should be # done here. @@ -258,7 +266,7 @@ sub add { my($str) = @_; if (!defined $chan or !defined $str or $str =~ /^\s*$/) { - &::help("news add"); + &::help('news add'); return; } @@ -273,17 +281,17 @@ sub add { } $::news{$chan}{$str}{Time} = time(); - my $expire = &::getChanConfDefault("newsDefaultExpire",7); + my $expire = &::getChanConfDefault('newsDefaultExpire',7, $chan); $::news{$chan}{$str}{Expire} = time() + $expire*60*60*24; $::news{$chan}{$str}{Author} = $::who; # case! 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(); @@ -294,7 +302,7 @@ sub del { my $item = 0; if (!defined $what) { - &::help("news del"); + &::help('news del'); return; } @@ -342,10 +350,10 @@ sub del { if (exists $::news{$chan}{$what}) { my $auth = 0; $auth++ if ($::who eq $::news{$chan}{$what}{Author}); - $auth++ if (&::IsFlag("o")); + $auth++ if (&::IsFlag('o')); if (!$auth) { - # todo: show when it'll expire. + # TODO: show when it'll expire. &::notice($who, "Sorry, you cannot remove items; just let them expire on their own."); return; } @@ -359,11 +367,11 @@ 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; } - if (&::IsChanConf("newsKeepRead")) { + if (&::IsChanConf('newsKeepRead') > 0) { my $x = $::newsuser{$chan}{$who}; if (defined $x and ($x == 0 or $x == -1)) { @@ -389,12 +397,14 @@ 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"); + &::msg($who, " \037Num\037 \037Item ".(' 'x40)." \037"); # &::DEBUG("news: list: expire = $expire"); # &::DEBUG("news: list: eno = $eno"); @@ -403,14 +413,14 @@ sub list { foreach ( &getNewsAll() ) { my $subtopic = $_; my $setby = $::news{$chan}{$subtopic}{Author}; - my $chr = (exists $::News{$chan}{$subtopic}{Text}) ? "" : "*"; + my $chr = (exists $::News{$chan}{$subtopic}{Text}) ? '' : '*'; if (!defined $subtopic) { &::DEBUG("news: warn: subtopic == undef."); next; } - # todo: show request stats aswell. + # TODO: show request stats aswell. &::msg($who, sprintf("\002[\002%2d\002]\002%s %s", $i, $chr, $subtopic)); $i++; @@ -431,23 +441,23 @@ sub read { my($str) = @_; if (!defined $chan or !defined $str or $str =~ /^\s*$/) { - &::help("news read"); + &::help('news read'); return; } 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+)-(\d+)$/ or - $str =~ /^-(\d+)$/ or $str =~ /^(\d+)-$/ or 0 + # 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, sorry."); + &::notice($who, "We don't support multiple requests of news items yet. Sorry."); return; } @@ -456,11 +466,11 @@ sub read { } if (!exists $::news{$chan}{$item}{Text}) { - &::notice($who, "Someone forgot to add info to this news item"); + &::notice($who, 'Someone forgot to add info to this news item'); 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); @@ -482,7 +492,7 @@ sub read { my $e; if ($_) { $e = sprintf("\037%s\037 [%s from now]", - scalar(localtime($_)), + scalar(gmtime($_)), &::Time2String($_ - time()) ); } @@ -501,8 +511,8 @@ sub read { sub mod { my($item, $str) = split /\s+/, $_[0], 2; - if (!defined $item or $item eq "" or $str =~ /^\s*$/) { - &::help("news mod"); + if (!defined $item or $item eq '' or $str =~ /^\s*$/) { + &::help('news mod'); return; } @@ -526,13 +536,13 @@ sub mod { } ### TODO: use m### to make code safe! - # todo: make code safer. + # TODO: make code safer. my $done = 0; - # todo: use eval to deal with flags easily. - if ($flags eq "") { + # TODO: use eval to deal with flags easily. + 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); } @@ -588,8 +598,8 @@ sub set { $what = $1 if ($args =~ s/^(\S+)\s*//); $value = $args; - if ($item eq "") { - &::help("news set"); + if ($item eq '') { + &::help('news set'); return; } @@ -607,7 +617,7 @@ sub set { } my $ok = 0; - my @elements = ("Expire","Text"); + my @elements = ('Expire','Text'); foreach (@elements) { next unless ($what =~ /^$_$/i); $what = $_; @@ -631,8 +641,8 @@ sub set { return; } - if ($what eq "Expire") { - # todo: use do_set(). + if ($what eq 'Expire') { + # TODO: use do_set(). my $time = 0; my $plus = ($value =~ s/^\+//g); @@ -670,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."); @@ -687,7 +697,7 @@ sub set { # &::DEBUG("news: who => '$who'"); my $author = $::news{$chan}{$news}{Author}; $auth++ if ($::who eq $author); - $auth++ if (&::IsFlag("o")); + $auth++ if (&::IsFlag('o')); if (!defined $author) { &::DEBUG("news: news{$chan}{$news}{Author} is not defined! auth'd anyway"); $::news{$chan}{$news}{Author} = $::who; @@ -696,12 +706,12 @@ sub set { } if (!$auth) { - # todo: show when it'll expire. + # TODO: show when it'll expire. &::notice($who, "Sorry, you cannot set items. (author $author owns it)"); return; } - # todo: clean this up. + # TODO: clean this up. my $old = $::news{$chan}{$news}{$what}; if (defined $old) { &::DEBUG("news: old => $old."); @@ -711,13 +721,13 @@ 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. + # TODO: if chan = undefined, guess. # if (!exists $::news{$chan}) { if (!exists $::channels{$chan}) { &::notice($who, "invalid chan $chan") if ($flag); @@ -733,7 +743,7 @@ sub latest { 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; @@ -741,15 +751,14 @@ sub latest { } $::chan = $chan; - my $x = &::IsChanConf("newsNotifyAll"); - if (&::IsChanConf("newsNotifyAll") and !defined $t) { - $t = 1; - } + return if (&::IsChanConf('newsNotifyAll') <= 0); + + # 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; } @@ -782,9 +791,22 @@ sub latest { # scalar @new, !$flag my $unread = scalar @new; my $total = scalar keys %{ $::news{$chan} }; + if (!$flag && &::IsChanConf('newsTellUnread') <= 0) { + 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); @@ -802,23 +824,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}; @@ -879,6 +907,8 @@ sub getNewsItem { my($what) = @_; my $item = 0; + $what =~ s/^\#//; # '#1' for example. + my %time; foreach (keys %{ $::news{$chan} }) { my $t = $::news{$chan}{$_}{Time}; @@ -958,7 +988,7 @@ sub do_set { return; } - &::DEBUG("news: do_set: TODO..."); + &::TODO("news: do_set:"); } sub stats { @@ -998,3 +1028,5 @@ sub stats { sub AUTOLOAD { &::AUTOLOAD(@_); } 1; + +# vim:ts=4:sw=4:expandtab:tw=80