#!/usr/bin/perl use strict; use Boofy::Main; use Boofy::Login; use Boofy::String qw(japanese_date tune_html tune_textarea make_clickable); use Boofy::Config qw(MAX_BBS_COMMENT_COUNT); use Boofy::HTML qw(make_page_number make_page make_bbs_photo make_bbscomm_photo); use Boofy::Image; use Boofy::BBS; use Boofy::Banner; use Boofy::Community; use Boofy::Member; #--------------------------------------------------------------------- # FUNCTIONS #--------------------------------------------------------------------- sub show_main { my ($row, $tpl, $bbs_id, $photo_aref) = @_; $tpl->param("date", japanese_date($row->{date})); $tpl->param("time", substr($row->{time}, 0, 5)); $tpl->param("name", tune_html($row->{nickname})); $tpl->param("show_friend_link", "show_friend.pl?id=$row->{owner_id}"); $tpl->param("bbs_title", tune_html($row->{title})); $tpl->param("bbs_body", make_clickable(tune_html($row->{body}))); $tpl->param("photo_table", make_bbs_photo($bbs_id, "small", $photo_aref)); } sub show_comment { my ($bbs, $tpl, $member_id, $bbs_id, $status, $page_now) = @_; my $comm_id = $bbs->get_comm_id; my $comment_count = $bbs->get_comment_count(); my $per_page = 20; my $total_page = int($comment_count / $per_page); $total_page += ($comment_count % $per_page) ? 1 : 0; my $page_new; if (!$page_now) { $page_now = $total_page; $page_new = 1; } my $limit_start; my $limit_count; my $number; if ($page_new) { $limit_start = 0; $limit_count = 10; $number = $comment_count; } elsif ($page_now ne "all") { if ($total_page == $page_now) { $limit_start = 0; $limit_count = $comment_count - (($page_now-1) * $per_page); $number = $comment_count; } else { $limit_start = $comment_count - ($page_now * $per_page); $limit_count = $per_page; $number = $comment_count - $limit_start; } } else { $number = $comment_count; } my $sth = $bbs->get_comment_rev_sth($limit_start, $limit_count); my $is_admin = undef(); if ($status eq "admin") { $is_admin = 1; $tpl->param("delete_link", "delete_bbs_comment.pl?id=$bbs_id&comm_id=$comm_id"); } my $mm = Boofy::Member::->new(); my @loop; while (my $row = $sth->fetchrow_hashref()) { my %loop; my $number_str; my @photo = $bbs->get_comment_photo($bbs_id, $row->{comment_id}); if ($number < 10) { $number_str = '  ' . $number; } elsif ($number < 100) { $number_str = ' ' . $number; } else { $number_str = $number; } if ($is_admin) { $loop{comment_id} = $row->{comment_id}; } elsif ($member_id == $row->{sender_id}) { $loop{delete_link} = "delete_bbs_comment.pl?id=$bbs_id&comm_id=$comm_id&comment_id=$row->{comment_id}"; } $loop{comm_num} = $number_str; $loop{date} = japanese_date($row->{date}); $loop{'time'} = substr($row->{'time'}, 0, 5); $loop{show_friend_link} = "show_friend.pl?id=$row->{sender_id}"; $loop{name} = tune_html($mm->multi_get_nickname($row->{sender_id})); $loop{body} = make_clickable(tune_html($row->{body})); if (@photo) { $loop{comment_photo_table} = make_bbscomm_photo($row->{comment_id}, "small", \@photo); } push(@loop, \%loop); $number--; } @loop = reverse(@loop); $tpl->param("comment_loop", \@loop); if ($comment_count > 1) { if ($page_now ne "all") { $tpl->param("page_link_all", "全てを表示"); } else { $tpl->param("page_link_all", "全てを表示"); } if (!$page_new) { $tpl->param("page_link_new", "最新の10件を表示"); } else { $tpl->param("page_link_new", "最新の10件を表示"); } ## Page Number $page_new && ($page_now = undef()); my $page_number = make_page_number( count => $comment_count, link => "view_bbs.pl", page_now => $page_now, per_page => $per_page, param => { id => $bbs_id, comm_id => $comm_id } ); $tpl->param("page_number", $page_number); } if ($comment_count >= MAX_BBS_COMMENT_COUNT) { $tpl->param("over_limit", 1); $tpl->param("max_bbs_comment_count", MAX_BBS_COMMENT_COUNT); } else { $tpl->param("under_limit", 1); } } sub show_box { my ($tpl, $bbs_id, $comm_id, $href) = @_; my %v = $href ? %{ $href } : (); $tpl->param("comment", tune_textarea($v{comment})); $tpl->param("add_link", "add_bbs_comment.pl?id=$bbs_id&comm_id=$comm_id"); } sub show_comm_banner { my ($tpl, $comm_id, $category_id) = @_; my $bn = Boofy::Banner::->new(category => "community"); my $result = $bn->set_random_id($comm_id, $category_id); if ($result) { my $text = $bn->get_text(); my $logo = $bn->get_logo(); my $banner_id = $bn->get_id(); my $link = "community_banner.pl?id=$banner_id"; if ($text || $banner_id) { $tpl->param("banner_logo", $logo); $tpl->param("banner_text", $text); $tpl->param("banner_link", $link); $tpl->param("comm_banner_link", 1); } } } #------------------------------------------------------------------------------ # MAIN #------------------------------------------------------------------------------ my $mn = Boofy::Main::->new(); my $cgi = $mn->load_cgi(); my $lg = Boofy::Login::->new($cgi); ## Login my $member_id = $lg->get_member_id(); if (!$member_id) { $lg->show_login($mn); exit; } my %v = $cgi->Vars(); $v{id} ||= $cgi->url_param("id"); $v{comm_id} ||= $cgi->url_param("comm_id"); ## Block if (!$v{id} || $v{id} =~ /\D/) { my $tpl = $mn->load_tpl("header.tmpl"); $mn->show_header(); $mn->show_alert(); print $tpl->output(); exit; } if ($v{comm_id} && $v{comm_id} =~ /\D/) { my $tpl = $mn->load_tpl("header.tmpl"); $mn->show_header(); $mn->show_alert(); print $tpl->output(); exit; } if ($v{page} && $v{page} =~ /\W/) { my $tpl = $mn->load_tpl("header.tmpl"); $mn->show_header(); $mn->show_alert(); print $tpl->output(); exit; } ## BBS data my $bbs = Boofy::BBS::->new(bbs_id => $v{id}, comm_id => $v{comm_id}); if ($bbs->is_event()) { print $cgi->redirect("view_event.pl?id=$v{id}"); exit; } ## Community data my $bbs_row = $bbs->get_all(); if (!$bbs_row) { my $tpl = $mn->load_tpl("header.tmpl"); $mn->show_header(); $mn->show_alert(); print $tpl->output(); exit; } my $comm_id = $bbs->get_comm_id(); my $cm = Boofy::Community::->new(comm_id => $comm_id); my $status = $cm->get_member_status($member_id); my $level = $cm->get_comm_level(); my $admin_id = $cm->get_admin_id(); my $category_id = $cm->get_category_id(); ## Block if closed community if (($level > 2) && ($status eq "other")) { my $tpl = $mn->load_tpl("header.tmpl"); $mn->show_header(); $mn->show_alert("アクセスできません。"); print $tpl->output(); exit; } my $template = ($status eq "admin") ? "view_bbs_admin.tmpl" : "view_bbs_member.tmpl"; my $tpl = $mn->load_tpl($template); $mn->show_header(); $mn->show_banner($member_id); my %photo = $bbs->multi_get_photo([ $v{id} ]); my @photo = %photo ? @{ $photo{$v{id}} } : (); show_main($bbs_row, $tpl, $v{id}, \@photo); show_comment($bbs, $tpl, $member_id, $v{id}, $status, $v{page}); if ($status ne "other" && $admin_id != 0) { show_box($tpl, $v{id}, $comm_id, \%v); if ($v{packed}) { my $im = Boofy::Image::->new(type => "bbs_comm", member_id => $member_id); my @tmp_ftp = split(":", $v{packed}); if (scalar(@tmp_ftp) > (4 * $im->get_max_img_count())) { die "view_bbs.pl: POST value has been tampered by $member_id.\n"; } $im->delete_tmp_file(@tmp_ftp); } } show_comm_banner($tpl, $comm_id, $category_id); $tpl->param("comm_id", $comm_id); $tpl->param("comm_name", tune_html($cm->get_comm_name())); print $tpl->output();