#!/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();