#!/usr/bin/perl
use strict;
use Boofy::Main;
use Boofy::Login;
use Boofy::Config qw(COMM_PIC_DIR DIARY_NEW_BYTE TMPL_DIR);
use Boofy::String qw(tune_html tune_textarea make_clickable japanese_date %cf_comm_level make_photo_dir fold_line);
use Boofy::HTML qw(make_member_table make_error);
use Boofy::Cache;
use Boofy::Community;
use Boofy::Banner;
use Boofy::Member;
use Date::Calc qw(Today_and_Now);
#------------------------------------------------------------------------------
# FUNCTIONS
#------------------------------------------------------------------------------
sub show_other {
my ($tpl, $member_id, $comm_id, $status, $row) = @_;
our %cf_comm_level;
## Public information
$tpl->param("name", tune_html($row->{name}));
$tpl->param("create_date", japanese_date($row->{create_date}));
$tpl->param("category_name", $row->{category_name});
$tpl->param("total_member", $row->{member_count});
my $logo = COMM_PIC_DIR;
if ($row->{logo} && $row->{logo_ext}) {
$logo .= make_photo_dir($comm_id) . $comm_id . "_" . $row->{logo} . "." . $row->{logo_ext};
}
else {
$logo .= "/no_logo.gif";
}
$tpl->param("logo", $logo);
$tpl->param("level", $cf_comm_level{$row->{level}});
$tpl->param("details", make_clickable(tune_html($row->{details})));
if ($status eq "member" || ($row->{level} < 4)) {
## Admin information
my $mm = Boofy::Member::->new(member_id => $row->{admin_id});
my $nickname = $mm->get_nickname();
my $nickname_copy = $nickname;
$nickname_copy =~ s/[?s ]//g;
if (!$nickname_copy) {
$nickname = "_";
}
$tpl->param("admin_name", tune_html($nickname));
$tpl->param("admin_link", "show_friend.pl?id=$row->{admin_id}");
}
else {
$tpl->param("comm_level","yes" );
}
}
sub show_admin {
my ($tpl, $member_id, $comm_id, $row) = @_;
our %cf_comm_level;
my $logo = COMM_PIC_DIR;
if ($row->{logo} && $row->{logo_ext}) {
$logo .= make_photo_dir($comm_id) . $comm_id . "_" . $row->{logo} . "." . $row->{logo_ext};
}
else {
$logo .= "/no_logo.gif";
}
$tpl->param("logo", $logo);
my $mm = Boofy::Member::->new(member_id => $member_id);
my $nickname = $mm->get_nickname();
my $nickname_copy = $nickname;
$nickname_copy =~ s/[?s ]//g;
if (!$nickname_copy) {
$nickname = "_";
}
$tpl->param("admin_name", tune_html($nickname));
$tpl->param("admin_link", "home.pl");
$tpl->param("name", tune_html($row->{name}));
$tpl->param("create_date", japanese_date($row->{create_date}));
$tpl->param("category_name", $row->{category_name});
$tpl->param("details", make_clickable(tune_html($row->{details})));
$tpl->param("total_member", $row->{member_count});
$tpl->param("level", $cf_comm_level{$row->{level}});
$tpl->param("edit_link", "edit_community.pl?id=$comm_id");
}
sub show_bbs {
my ($cache, $tpl, $comm_id, $member_type) = @_;
my $key;
## BBS
$key = "comm_bbs:" . $comm_id;
if (ref($cache->{$key}) && @{ $cache->{$key} }) {
$tpl->param("bbs_loop", $cache->{$key});
$tpl->param("add_bbs_link", "add_bbs.pl?id=$comm_id");
$tpl->param("list_link", "list_bbs.pl?id=$comm_id");
}
else {
$tpl->param("add_bbs_link_2", "add_bbs.pl?id=$comm_id");
}
## Event
$key = "comm_event:" . $comm_id;
if (ref($cache->{$key}) && @{ $cache->{$key} }) {
$tpl->param("event_loop", $cache->{$key});
$tpl->param("add_event_link", "add_event.pl?id=$comm_id");
$tpl->param("list_link", "list_bbs.pl?id=$comm_id");
}
else {
$tpl->param("add_event_link_2", "add_event.pl?id=$comm_id");
}
## Enquete
$key = "comm_enquete:" . $comm_id;
if (ref($cache->{$key}) && @{ $cache->{$key} }) {
$tpl->param("enquete_loop", $cache->{$key});
if ($member_type == 2) {
$tpl->param("add_enquete_link_1", "add_enquete.pl?id=$comm_id");
}
$tpl->param("list_link", "list_bbs.pl?id=$comm_id");
}
elsif ($member_type == 2) {
$tpl->param("add_enquete_link_2", "add_enquete.pl?id=$comm_id");
}
}
sub show_community_review {
my ($cache, $tpl, $comm_id) = @_;
my $key = "comm_review:" . $comm_id;
if (ref($cache->{$key}) && @{ $cache->{$key} }) {
$tpl->param("community_review_loop", $cache->{$key});
$tpl->param("list_community_review_link", "list_community_review.pl?id=$comm_id");
$tpl->param("list_member_item_link_1", "add_community_review.pl?id=$comm_id");
}
else {
$tpl->param("list_member_item_link_2", "add_community_review.pl?id=$comm_id");
}
}
sub is_safe_referer {
my ($comm_id, $referer) = @_;
if ($referer =~ /(view_community|list_bbs|list_community_review|join_community|invite_community|leave_community|add_community)?.pl??id=([0-9]+)/) {
if ($comm_id == $2) {
return 1;
}
}
elsif ($referer =~ /(view_bbs|view_event|add_bbs_comment|delete_bbs_comment)?.pl??id=([0-9]+)/) {
return 1;
}
return undef();
}
sub set_param {
my ($tpl, $ref) = @_;
$ref =~ s/[^??]+??//g;
my @param = split(/?&/, $ref);
my ($key, $val);
my @loop;
foreach (@param) {
my %loop;
($key, $val) = split(/?=/, $_);
$loop{key} = $key;
$loop{val} = $val;
push(@loop, ?%loop);
}
$tpl->param("param_loop", ?@loop);
}
# Limit Day, Time ex.
# my @TaN = Today_and_Now();
# if *1 {
# if *2 {
# $cb_msg = "NECからシンプルなPC「ValueOne」登場!その拡張性と安心のサポート体制!";
# }
# }
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);
}
$bn->add_count();
}
}
#------------------------------------------------------------------------------
# Main
#------------------------------------------------------------------------------
my $mn = Boofy::Main::->new();
my $cgi = $mn->load_cgi();
my $lg = Boofy::Login::->new($cgi);
## Login
my $member_status = $lg->get_member_status();
my $member_id = $member_status->{id};
my $member_type = $member_status->{type};
if (!$member_id) {
$lg->show_login($mn);
exit;
}
## Vars 2
my %v = $cgi->Vars();
$v{id} ||= $cgi->url_param("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;
}
## Community data
my $cm = Boofy::Community::->new(comm_id => $v{id});
my $data = $cm->get_all();
my $status = $cm->get_member_status($member_id);
my $admin_id = $cm->get_admin_id();
my $level = $cm->get_comm_level();
if (!$data) {
my $tpl = $mn->load_tpl("header.tmpl");
$mn->show_header();
$mn->show_alert();
print $tpl->output();
exit;
}
my $cc = Boofy::Cache::->new();
my $cache = $cc->get_multi_view_community($v{id});
## Display
if ( ($data->{category_id} == 27) &&
(!$v{submit} || $cgi->url_param("submit")) &&
!is_safe_referer($v{id}, $ENV{"HTTP_REFERER"}) ) {
my $tpl = $mn->load_tpl("view_community_adult.tmpl");
$mn->show_header();
$mn->show_banner();
$tpl->param("comm_id", $v{id});
$tpl->param("agree_link", "view_community.pl?id=$v{id}");
$tpl->param("disagree_link", $ENV{"HTTP_REFERER"});
set_param($tpl, $ENV{"HTTP_REFERER"});
print $tpl->output();
exit;
}
my $tpl;
my %special_community = (
57207 => "view_community_main_57207.tmpl",
206562 => "view_community_main_206562.tmpl",
343070 => "view_community_main_343070.tmpl",
345484 => "view_community_main_345484.tmpl",
425293 => "view_community_main_425293.tmpl",
441971 => "view_community_main_441971.tmpl",
425341 => "view_community_main_425341.tmpl",
463727 => "view_community_main_463727.tmpl",
509428 => "view_community_main_509428.tmpl",
527031 => "view_community_main_527031.tmpl",
562649 => "view_community_main_562649.tmpl"
);
if ($special_community{$v{id}}) {
$tpl = $mn->load_tpl($special_community{$v{id}});
}
else {
$tpl = $mn->load_tpl("view_community_main.tmpl");
}
$mn->show_header();
$mn->show_banner($member_id);
## 管理人の場合
if ($status eq "admin") {
show_admin($tpl, $member_id, $v{id}, $data);
show_bbs($cache, $tpl, $v{id}, $member_type);
show_community_review($cache, $tpl, $v{id});
my $count = $data->{member_count};
my $table = $cache->{"comm_member:" . $v{id}};
$tpl->param("member_table", make_member_table($cc, $v{id}, $status, $table, $count));
}
## メンバーの場合
elsif ($status eq "member") {
show_other($tpl, $member_id, $v{id}, $status, $data);
show_bbs($cache, $tpl, $v{id}, $member_type);
show_community_review($cache, $tpl, $v{id});
## 管理人不在の場合
!$admin_id && $tpl->param("noadmin_member", 1);
my $count = $data->{member_count};
my $table = $cache->{"comm_member:" . $v{id}};
$tpl->param("member_table", make_member_table($cc, $v{id}, $status, $table, $count));
if ($v{error} eq "no_admin"){
my @sort = "no_admin";
my %error;
$error{no_admin} = "現在、このコミュニティは管理人が不在のため掲示板に書き込みができません。";
$tpl->param("error", make_error(?@sort ,?%error));
}
}
## その他の場合
else {
show_other($tpl, $member_id, $v{id}, $status, $data);
## 管理人いる?
if ($admin_id) {
$tpl->param("join_link", "join_community.pl?id=$v{id}");
}
elsif ($level > 1) { ## 承認制のみに表示
$tpl->param("noadmin_other",1);
}
if ($level < 3) { ## 3 is closed community
show_bbs($cache, $tpl, $v{id}, $member_type);
show_community_review($cache, $tpl, $v{id});
}
if ($level < 4) {
my $count = $data->{member_count};
my $table = $cache->{"comm_member:" . $v{id}};
$tpl->param("member_table", make_member_table($cc, $v{id}, $status, $table, $count));
}
if ($v{error}) {
my @sort = ("add_bbs", "add_event", "list_member_item");
my %error;
if ($v{error} eq "add_bbs") { $error{add_bbs} = "トピック作成をおこなうにはコミュニティに参加する必要があります"; }
if ($v{error} eq "add_event") { $error{add_bbs} = "イベント作成をおこなうにはコミュニティに参加する必要があります"; }
if ($v{error} eq "list_member_item") { $error{add_bbs} = "レビューを掲載するにはコミュニティに参加する必要があります"; }
$tpl->param("error", make_error(?@sort, ?%error));
}
}
## Banner
if ($v{id} != 57207) {
show_comm_banner($tpl, $v{id}, $data->{category_id});
}
$tpl->param("comm_id", $v{id});
print $tpl->output();