#!/usr/local/bin/perl # Perl 5/Curses Init BEGIN { $Curses::OldCurses = 1; } use Curses; use perlmenu; $|=1; $clear = ''; $newsgroups = "/usr/local/news/newsgroups"; $newsrc = "$ENV{'HOME'}/.newsrc"; $newsrcbak = "$newsrc.bak"; $prompt = "Press \"h\" for help, \"u\" to go up a menu, \"q\" to quit"; &read_newsrc; &newsmgr; exit 0; # # ******************** Subroutines Start Here ****************** # sub newsmgr { until ($mainopt =~ /^q/) { &menu_prefs(1,1); &menu_init(1,"News Manager",1); &menu_item("Search For Newsgroups",1); &menu_item("Unsubscribe From Newsgroups",2); &menu_item("Abort -- Loose Changes","q"); &menu_item("Exit -- Save Changes","qw"); &menu_item("Exit -- Sort Newsgroups and Save Changes","qws"); $mainopt = &menu_display('Press "h" for help, "q" to quit.'); if ($mainopt == 1) {&search;} elsif ($mainopt == 2) {&unsubscribe;} elsif ($mainopt =~ /^qw/) {&write_newsrc; } } } sub read_newsrc { open(IN,"$newsrc"); # || die "can't open .newsrc"; $i=0; while () { $i++; chop; ($n,$r) = split(/[:!]/); $newsrcdb{$n}=$i; $newsrc[$i] = $_; } $Nrc = $i; close IN; } sub write_newsrc { rename ($newsrc, $newsrcbak); open (OUT,">$newsrc"); if ($mainopt eq 'qws') { @newsrc = sort @newsrc; } for ($i=1; $i<=$Nrc; $i++) { if ($newsrc[$i] ne '') { print OUT "$newsrc[$i]\n"; } } close OUT; } sub unsubscribe { &cleanup; &menu_prefs(0,1); &menu_init(1,"Remove Groups",0,"-\n-Select groups remove from your subscrbed list."); for ($i=1; $i<=$Nrc; $i++) { if ($newsrc[$i] =~ /:/) { ($n,$r) = split(/[:]/,$newsrc[$i]); &menu_item($n,$n); } } $r = &menu_display_mult($prompt, "Done Removing Groups"); @sel = split(/,/,$r); foreach (@sel) { if (defined $newsrcdb{$_}) { $newsrc[$newsrcdb{$_}] =~ s/:/!/; } } &cleanup; } sub search { &cleanup; print "$clear Suggestion: Make your search specific. That is, if you are interested in dogs, use 'dogs' as the topic. If nothing comes up, then try a more generalized term, such as 'pets', and so on. Please enter a topic (one-word) or 'help': "; $ss = ; chop $ss; if ($ss eq '') {return;} print "Searching for '$ss'\n"; &menu_prefs(0,1); &menu_init(1,"Select Groups",0,"-\n-Select groups to subscribe to. -Groups you are already subscribed to are pre-selected."); open (IN,"grep -i $ss $newsgroups|"); while () { chop; s/\t+/: /; s/\t| / /g; ($n,$r)=split(/:/); if (defined $newsrcdb{$n}) {$j = $newsrcdb{$n}; } else {$j = 0;} if ( ($j > 0) && ($newsrc[$j] =~ /:/) ) { $s=1; @inrc=(@inrc,$n); } else {$s=0;} &menu_item($_,$n,$s); } close IN; $r = &menu_display_mult($prompt, "Done Selecting Groups"); if ($r eq '%DOWN%') {&cleanup; return;} unless ($r eq '%NONE%') { @sel = split(/,/,$r); } foreach (@sel) { $seldb{$_} = 1; if (defined $newsrcdb{$_}) { $newsrc[$newsrcdb{$_}] =~ s/!/:/; } else { $Nrc++; $newsrc[$Nrc] = "$_: "; $newsrcdb{$n} = $Nrc; } } foreach (@inrc) { unless (defined $seldb{$_}) { $newsrc[$newsrcdb{$_}] =~ s/:/!/; } } &cleanup; } sub cleanup { undef %seldb; undef @inrc; undef @seldb; }