######################################### # THREADS.PM my $r = 0; my $firstbox = 1; my %tk; our $our_keywords = {}; sub alpha_index { my ($keywords, $limit, $date) = @_; $our_keywords = $keywords; my %organized; my $oldest = $date eq "now" ? time : $date; my $recently = time - 86400 * $BUCKY_INDEX_LATEST; # two days ago my $i = 0; while ($limit > $i) { my $threads = throttle_threads({ keyword => $keyword, limit => ($limit-$i), newest => $oldest, oldest => 0 }); last if ($threads == -1); foreach my $t (@$threads) { if ( check_privacy ( $t, $keywords->{ $t->{keyword} } ) ) { # If keyword is undefined, file it under "unsorted" my $this_kw = $t->{keyword} ? $t->{keyword} : "unsorted"; # put newest (last 2 days) or unsorted posts in one place if ( $t->{date} > $recently || ! length($t->{keyword}) ) { push @{ $organized{'latest'} }, $t; } push @{$organized{$this_kw}}, $t; $i++; } $oldest = $t->{date} if ($t->{date} < $oldest); last if ($limit == $i); } print "Oldest: $oldest, i: $i\n" if ($DEBUG); } if ($date eq "now") { foreach my $k (sort { lc($a) cmp lc($b) } keys %$keywords) { next unless (check_key($USER->{stickies}, $k)); next if (check_key($USER->{sink}, $k)); next unless (exists($organized{$k})); thread_box({ threads => $organized{$k}, kw => $keywords->{$k}, dosum => 0, dohead => 1 }); # print qq(); } # print qq(); } print qq(); index_photostream(); print qq(); thread_box({ threads => $organized{"latest"}, kw => "LATEST", dosum => 0, dohead => 1 }); foreach my $k (sort { lc($a) cmp lc($b) } (keys(%organized))) { next if (check_key($USER->{stickies}, $k)); next if (check_key($USER->{sink}, $k)); next if ($k =~ /^(unsorted|latest)$/i); thread_box({ threads => $organized{$k}, kw => $keywords->{$k}, dosum => 0, dohead => 1 }); print qq(); } thread_box({ threads => $organized{"unsorted"}, dosum => 0, dohead => 1 }) if ($BUCKY_CONFIG->{UNSORTED_POSITION} eq "bottom"); if ($i >= $limit) { print qq(); print qq(show all >>); } } sub thread_box { my ($args) = @_; my $threads = $args->{threads} || undef; my $kw = $args->{kw} || undef; my $tag = $args->{tag} || undef; my $dosum = exists($args->{dosum}) ? $args->{dosum} : undef; my $dohead = exists($args->{dohead}) ? $args->{dohead} : undef; my $line = 0; my $user = 0; my $latest = 0; $dosum = 1 unless (defined($dosum)); $dohead = 1 unless (defined($dohead)); my $sum = 0; my $isop; $firstbox = 1; my $method = \&rsort_by_date; if (exists($args->{sort_by}) && $arts->{sort_by} eq "name") { $method = \&sort_by_name; } if ($kw eq "USER") { $user = 1; $isop = 1; $kw = -1; } elsif ($kw eq "LATEST") { $latest = 1; $isop = 1; $kw = -1; } elsif ($kw != -1) { $isop = check_op($kw); } else { $isop = 1; } foreach my $th (&{$method}(@$threads)) { my $printed = 0; # next if ($kw == -1 && defined($th->{keyword})); if ($line == 0) { if ($dohead && $tag) { print qq(); print qq[]; print qq[tag: ]; print qq(); print qq(); print qq(); print qq(); print qq[]; print qq($tag->{tag}); print qq(); print qq(); print qq(); } if ($dohead && $latest) { print qq(); print qq[]; print qq(the latest ); print qq(); print qq(·); print qq(); print qq(welcome back to $BUCKY_NAME!! Start a new thread...); print_boxtop(1); } elsif ($dohead && (!defined($kw) || $kw == -1)) { my $unsorted_keyword = get_random_line("keywords"); print qq(); print qq[]; print qq[]; print $unsorted_keyword; print qq(); print qq( · ); print qq(); print qq(); print qq(show all); print qq( · post); print qq( · ftp); print qq(); print qq(); } elsif ($user) { # this is all broken for some reason, is rewritten somewhere...! print_boxtop(1); } elsif ($dohead) { $polite_keyword = $th->{keyword}; $polite_keyword =~ s/ / /g; print qq(); print qq[]; print qq[]; print $polite_keyword; print qq(); print qq( · ); print qq(); print qq(); if ($kw->{public} == 1 || $isop) { # print qq(show all); # print qq( · ); print qq(post) if ($USER != -1); # 20070903 - marc - no more ftp print qq( · ftp); } if ($isop || $USER->{ulevel} == 3) { print qq( · ); print qq(settings); } print qq(); print qq(); } $line++; } if ($dosum == -1) { $printed = check_thread_row($th, $kw, 4, $line); } else { $printed = check_thread_row($th, $kw, 3, $line); } $sum += $th->{size}; $line++ if ($printed); last if ($dosum == -1 && $line == 6); } if ($line != 0) { print_boxbottom(1); if ($dosum > 0) { $line -= 1; my $s = $line != 1 ? 's' : ''; print qq($line thread$s); print qq(, ).hushsize($sum,1.7).qq(); } } } sub print_boxtop { print qq!!; } sub print_boxbottom { print qq!!; } sub check_thread_row { my ($thread, $keyword, $brief, $box) = @_; my $priv = 0; # uncomment to skip threads already printed # return 1 if ($tk{$thread->{id}} == 1); $tk{$thread->{id}} = 1; return 1 if ($brief eq "NOPRINT"); if ($thread->{private} != 0) { $priv = check_privacy($thread, $keyword); if ($priv == 0) { return 0; } } if ($box == 1 && $keyword != -1) { print_boxtop($firstbox); } if ($thread->{'keyword'} && $keyword == -1) { $keyword = $our_keywords->{$thread->{'keyword'}} } display_thread($thread, $keyword, $r, $priv, $brief, $box); $r = $r ? 0 : 1; return 1; } sub display_thread { my ($t, $k, $r, $priv, $brief, $box) = @_; my $color = carbondate($t->{date}); my $rcolor = get_color($t, $k, $box); my $old = ((time - $t->{date}) > 2419200) ? 1 : 0; my $box = (defined($box)) ? $box : 0; if ($DEBUG) { print qq!
Displaying post $t->{id} -- $t->{title}
\n!; } print qq[]; print qq[]; print ""; print qq[$t->{username} ]; if ($t->{private} == 2) { print qq[.:]; } elsif ($t->{private} == 1) { print qq[:]; } else { print qq[·]; } print " "; print ""; if ($box > 0) { $rcolor = "tan" if ($rcolor eq "plain"); print qq(); } else { print qq[]; } my $thread_link_class; if ($t->{date} > (time - 209828) && $t->{date} > 1168910000) { $thread_link_class = "threadname newthread"; } else { $thread_link_class = "threadname"; } print qq(); print qq($t->{title}); print qq(); print ""; my ($age) = get_age($t->{date}); print qq(); print ""; print qq(  $age ); print ""; print ""; # my ($tddate, $tdtime) = verbosedatetime($t->{date}); # print qq[]; # print qq[ $tddate ]; # print ""; # if ($0 !~ /(details|profile)/) # { # print qq[]; # print qq[$tdtime]; # print ""; # } print qq[]; print " "; if ($t->{viewed} > 0) { print hushview($t->{viewed}, "v") . ""; } else { print ""; } # decrement comments count here so we treat the first comment" as the body of the post if (($t->{comments} - 1) > 0) { print " ".hushnull($t->{comments} - 1, "c") . ""; } else { print " "; } # print qq[]; # if (!ref($t->{tags})) # { print " "; } # else # { print "  ". tags_stringify_links ( $t, 3 ). ""; } # if ($t->{files} > 0) # { print "" .hushnull($t->{files}, "f") . ""; } # else # { print " "; } # print ""; print qq[]; if ($t->{files} > 0) { print " ".hushsize($t->{size},1.2,$old),qq[]; if ($0 !~ /(details|profile)/) { print qq[in ]; print hushnull($t->{files}, "f"); print ""; } } print ""; print qq[\n]; } # sort methods # title, date, size, files, username sub get_sort_method { my ($s, $o) = @_; if ($o eq "a") { if ($s eq "t") { return \&sort_by_title; } elsif ($s eq "s") { return \&sort_by_size; } elsif ($s eq "d") { return \&sort_by_date; } elsif ($s eq "c") { return \&sort_by_comments; } elsif ($s eq "f") { return \&sort_by_files; } elsif ($s eq "a") { return \&sort_by_author; } } elsif ($o eq "d") { if ($s eq "t") { return \&rsort_by_title; } elsif ($s eq "s") { return \&rsort_by_size; } elsif ($s eq "d") { return \&rsort_by_date; } elsif ($s eq "c") { return \&rsort_by_comments; } elsif ($s eq "f") { return \&rsort_by_files; } elsif ($s eq "a") { return \&rsort_by_author; } } else { return \&rsort_by_date; } } sub sort_by_name { sort { uc($$a{title}) cmp uc($$b{title}) } @_; } sub sort_by_title { sort { uc($$a{title}) cmp uc($$b{title}) } @_; } sub rsort_by_title { sort { uc($$b{title}) cmp uc($$a{title}) } @_; } sub sort_by_date { sort { $$a{date} <=> $$b{date} } @_; } sub rsort_by_date { sort { $$b{date} <=> $$a{date} } @_; } sub sort_by_size { sort { $$a{size} <=> $$b{size} } @_; } sub rsort_by_size { sort { $$b{size} <=> $$a{size} } @_; } sub sort_by_files { sort { $$a{files} <=> $$b{files} } @_; } sub rsort_by_files { sort { $$b{files} <=> $$a{files} } @_; } sub sort_by_comments { sort { $$a{comments} <=> $$b{comments} } @_; } sub rsort_by_comments { sort { $$b{comments} <=> $$a{comments} } @_; } sub sort_by_author { sort { uc($$a{username}) cmp uc($$b{username}) } @_; } sub rsort_by_author { sort { uc($$b{username}) cmp uc($$a{username}) } @_; } 1;