#!/usr/bin/perl use strict; use URI::Escape; use Date::Calc qw(Add_Delta_Days Today Delta_Days check_date); use Boofy::Main; use Boofy::Login; use Boofy::Member; use Boofy::HTML qw(make_friend_table make_comm_table); use Boofy::Config qw(PIC_DIR DIARY_NEW DIARY_NEW_BYTE DB_DIARY_RSS); use Boofy::String qw(tune_html tune_form short_japanese_date japanese_date fold_line make_clickable make_photo_dir encode_post_key); use Boofy::Cache; use Boofy::Session; #------------------------------------------------------------------------------ # FUNCTIONS #------------------------------------------------------------------------------ sub show_reminder { my ($mn, $tpl, $cache, $member_id, $register_date) = @_; my $sth; my $row; my @loop; my $key; ## entrance help my @today = Today(); if ($register_date) { my @register_date = split("-", $register_date); if (check_date(@register_date) && Delta_Days(@register_date, @today) >= 8) { $tpl->param("week_passed", 1); } else { $tpl->param("entrance", 1); } } else { $tpl->param("entrance", 1); } ## Data for calendar my ($sec,$min,$hour,$mday,$mon,$year,$wday,$dmy) = localtime(time); my @week = ("日", "月", "火", "水", "木", "金", "土"); $tpl->param("month", "$today[1]"); $tpl->param("day", "$today[2]"); $tpl->param("wday", "$week[$wday]"); ## Link request $key = "reminder_link:" .$member_id; if ($cache->{$key}) { my %loop; $loop{link} = "list_request.pl"; $loop{reminder} = "承認待ちの友人が" . $cache->{$key} . "名います!"; $loop{js_button} = "info2"; ## JavaScript: change color $loop{button} = "承認・拒否"; push(@loop, \%loop); } ## New message $key = "reminder_message:" . $member_id; if ($cache->{$key}) { my %loop; $loop{link} = "list_message.pl"; $loop{reminder} = "新着メッセージが" . $cache->{$key} . "件あります!"; $loop{js_button} = "info3"; ## JavaScript: change color $loop{button} = "メッセージを読む"; push(@loop, \%loop); } ## New comment $key = "reminder_comment:" . $member_id; if ($cache->{$key}) { ## 最新コメントがついている日記をとる my $sql = " SELECT diary.id FROM diary FORCE INDEX (idx_3) WHERE diary.member_id=? AND diary.new_comment='y' LIMIT 1 "; my $diary = Boofy::Diary->new($member_id); my $dbd2 = $diary->get_dbh; if (!$diary->is_readonly) { my $sth2 = $dbd2->prepare($sql); $sth2->execute($member_id); my $row2 = $sth2->fetchrow_arrayref(); my %loop; if ($row2->[0]) { $loop{link} = "view_diary.pl?id=" . $row2->[0] . '&owner_id='. $member_id; } else { $loop{link} = "list_diary.pl"; } $loop{reminder} = "" . $cache->{$key} . "件の日記に対して新着コメントがあります!"; $loop{js_button} = "info4"; ## JavaScript: change color $loop{button} = "日記を見る"; push(@loop, \%loop); } else { push @loop, { reminder => '現在、日記の作成・編集機能にエラーが発生しています。', hide_button => 1, }; } } ## New album comment $key = "reminder_album:" . $member_id; if ($cache->{$key}) { my $sql = " SELECT album.id FROM album FORCE INDEX (idx_2) WHERE album.member_id=? AND album.new_comment='y' LIMIT 1 "; my $dbh2 = $mn->load_dbh2(); my $sth2 = $dbh2->prepare($sql); $sth2->execute($member_id); my $row2 = $sth2->fetchrow_arrayref(); my %loop; if ($row2->[0]) { $loop{link} = "view_album.pl?id=" . $row2->[0] . "&mode=comment"; } else { $loop{link} = "list_album.pl"; } $loop{reminder} = "新着アルバムコメントが" . $cache->{$key} . "件あります!"; $loop{js_button} = "info7"; ## JavaScript: change color $loop{button} = "アルバムを見る"; push(@loop, \%loop); } ## New join request $key = "reminder_join:" . $member_id; if ($cache->{$key}) { my %loop; $loop{link} = "list_join_request.pl"; $loop{reminder} = "コミュニティ参加承認待ちの友人が" . $cache->{$key} . "名います!"; $loop{js_button} = "info5"; $loop{button} = "承認・拒否"; push(@loop, \%loop); } ## Transfer Admin request $key = "reminder_admin:" . $member_id; if ($cache->{$key}) { my %loop; $loop{link} = "list_transfer_request.pl"; $loop{reminder} = "コミュニティ管理人交代依頼が" . $cache->{$key} . "件きています。"; $loop{js_button} = "info6"; ## JavaScript: change color $loop{button} = "承認・拒否"; push(@loop, \%loop); } $tpl->param("reminder_loop", \@loop); } sub show_own_info { my ($tpl, $cache, $member_id, $cache_info, $level_2, $mn) = @_; my $sth; my @loop; my $key; ## Own diary my $own_info = undef(); if ($cache_info->{"diary_host_id:$member_id"} == 1) { ## Get from memcached $key = "own_diary:" . $member_id; if (ref($cache->{$key}) && @{ $cache->{$key} }) { $own_info = 1; $tpl->param("diary_new_loop", $cache->{$key}); $tpl->param("list_diary_link", "list_diary.pl"); $tpl->param("add_diary_link", "add_diary.pl"); } } ## RSS else { my $dbh_rss = $mn->load_dbh(db_name => DB_DIARY_RSS); my $dbh2 = $mn->load_dbh2(); if ($dbh_rss && $dbh2) { $sth = $dbh_rss->prepare("SELECT date, title, link FROM rss WHERE member_id=? ORDER BY date DESC, time DESC LIMIT " . DIARY_NEW); $sth->execute($member_id); @loop = (); while (my $row = $sth->fetchrow_hashref()) { if ($row->{link} !~ /^http[s]*\:\/\//) { $row->{link} = "http://" . $row->{link}; } $own_info = 1; my %loop; $loop{date} = short_japanese_date($row->{date}); $loop{title} = tune_html(fold_line($row->{title}, DIARY_NEW_BYTE)); $loop{view_link} = tune_form($row->{link}); push(@loop, \%loop); } $tpl->param("diary_new_loop", \@loop); $sth = $dbh2->prepare("SELECT diary_url FROM member WHERE id=?"); $sth->execute($member_id); my $row = $sth->fetchrow_arrayref(); if ($row->[0] && $row->[0] !~ /^http[s]*\:\/\//) { $row->[0] = "http://" . $row->[0]; } $tpl->param("list_diary_link", tune_form($row->[0])); } } ## Own Album $key = "own_album:" . $member_id; if (ref($cache->{$key}) && @{ $cache->{$key} }) { $own_info = 1; $tpl->param("album_new_loop", $cache->{$key}); } ## Own review $key = "own_review:" . $member_id; if (ref($cache->{$key}) && @{ $cache->{$key} }) { $own_info = 1; $tpl->param("review_new_loop", $cache->{$key}); } $tpl->param("own_info", $own_info); ## If profile is not full, bug user :) if (!$cache_info->{"birthday:$member_id"}) { $tpl->param("notice", 1); } ## Show birthday banner if ($cache_info->{"birthday_level:$member_id"} > 1 && $cache_info->{"birthday:$member_id"}) { my @birthday = split("-", $cache_info->{"birthday:$member_id"}); my @today = Today(); if (int($today[1]) == int($birthday[1]) && int($today[2]) == int($birthday[2])) { $tpl->param("birthday_link", 1); } } ## Show photo my $photo = PIC_DIR; $photo .= $cache_info->{"photo:$member_id"} ? make_photo_dir($member_id) . $member_id . "_" . $cache_info->{"photo:$member_id"} . ".jpg" : "/no_photo.gif"; $tpl->param("photo", $photo); ## Show info $tpl->param("level_2", $level_2 || 0); ## Cacheからのnicknameはtune_html済 $tpl->param("name", $cache_info->{"nickname:$member_id"}); } sub show_update { my ($tpl, $member_id, $cgi, $cc) = @_; my $update; my $key; ## cookie my $cookie = $cgi->cookie('BF_SETTING'); my $cookie_member_id; if ($cookie =~ /^(\d+)/) { $cookie_member_id = $1; } ## cookie member_id ## old cookie ## TODO: Delete this later ## Now we have [1] member_id:name=value:name=value ## and [2] name=value:name=value ## We are changing this to [1] if ($cookie_member_id && $cookie_member_id != $member_id) { my $value; $value = $cc->get_new_diary($member_id); if ($value) { $update = 1; $tpl->param("update_diary_loop", $value); } $value = $cc->get_new_comment($member_id); if ($value) { $update = 1; $tpl->param("update_comment_loop", $value); } $value = $cc->get_new_bbs($member_id); if ($value) { $update = 1; $tpl->param("update_comm_loop", $value); } $value = $cc->get_new_review($member_id); if ($value) { $update = 1; $tpl->param("update_review_loop", $value); } $value = $cc->get_new_album($member_id); if ($value) { $update = 1; $tpl->param("update_album_loop", $value); } } else { ## Diary if ($cookie =~ /dia=1/) { $update = 1; $tpl->param("update_diary_close", 1); } else { my $value = $cc->get_new_diary($member_id); if ($value) { $update = 1; $tpl->param("update_diary_loop", $value); } } ## Comment if ($cookie =~ /com=1/) { $update = 1; $tpl->param("update_comment_close", 1); } else { my $value = $cc->get_new_comment($member_id); if ($value) { $update = 1; $tpl->param("update_comment_loop", $value); } } ## BBS if ($cookie =~ /bbs=1/) { $update = 1; $tpl->param("update_comm_close", 1); } else { my $value = $cc->get_new_bbs($member_id); if ($value) { $update = 1; $tpl->param("update_comm_loop", $value); } } ## Review if ($cookie =~ /rev=1/) { $update = 1; $tpl->param("update_review_close", 1); } else { my $value = $cc->get_new_review($member_id); if ($value) { $update = 1; $tpl->param("update_review_loop", $value); } } ## Album if ($cookie =~ /alb=1/) { $update = 1; $tpl->param("update_album_close", 1); } else { my $value = $cc->get_new_album($member_id); if ($value) { $update = 1; $tpl->param("update_album_loop", $value); } } } ## Others $tpl->param("update", $update); $tpl->param("update_blank", !$update); } sub show_intro { my ($cc, $tpl, $cache, $member_id) = @_; my $key = "intro:" . $member_id; if (!ref($cache->{$key}) || scalar(@{ $cache->{$key} }) < 1) { return undef(); } my @writer_id; foreach (@{ $cache->{$key} }) { ## Skip 'show_friend.pl?id=', and get only id ## this is 18 bytes my $writer_id = unpack("x18 A*", $_->{show_friend_link}); push(@writer_id, $writer_id); } my $value = $cc->get_photo(\@writer_id); ## Unpack photo:$member_id to $member_id my %photo = map { unpack("x6 A*", $_) => $value->{$_} } keys(%{ $value }); foreach (@{ $cache->{$key} }) { my $writer_id = unpack("x18 A*", $_->{show_friend_link}); if ($photo{$writer_id}) { $_->{photo} = PIC_DIR . make_photo_dir($writer_id). $writer_id . "_" . $photo{$writer_id} . "s.jpg"; } else { $_->{photo} = PIC_DIR . "/no_photo_small.gif"; } } $tpl->param("intro_loop", $cache->{$key}); } sub insert_no_link { my ($dbh, $member_id) = @_; my $sth = $dbh->prepare("INSERT IGNORE no_link SET member_id = ?, date = CURRENT_DATE()"); my $rv = $sth->execute($member_id); if ($rv && ($rv !~ /\D/) && ($rv > 0)) { return 1; } else { return undef(); } } sub send_mail_nolink { my ($member_id, $delete_date) = @_; my $mm = Boofy::Member::->new(member_id => $member_id); my $data = $mm->get_mail_data(); my $email = $data->{email}; my @delete_date = Add_Delta_Days(Today(), 3); my $delete_date = sprintf("%04d年%02d月%02d日", @delete_date); my $subject = "[mixi] mixi ご利用に関するお知らせ"; my $body = "mixi運営事務局です。 mixi は、友人・知人同士の交流を目的としたサイトです。 また完全招待制のサイトであることからも、マイミクシィ0のユーザー様に 関しては、大変申し訳ございませんが、利用規約上でもご利用を控えさせて 頂いております。 現在の状態が続く場合、申し訳ございませんが、 $delete_dateにアカウントの 利用停止をおこなわせていただきますので、何卒ご了承ください。 ― mixi ―――――――――――――――――――――― コミュニティ・エンターテイメント [mixi(ミクシィ)] URL : http://mixi.jp/ E-Mail : mixi\@mixi.jp 運営会社: 株式会社ミクシィ ―――――――――――――――――――――――――― "; my $m = Boofy::Mail::->new(); $m->load_data("info\@mixi.jp", "info\@mixi.jp", undef(), $email, $subject, $body); $m->send(); } #------------------------------------------------------------------------------ # MAIN #------------------------------------------------------------------------------ my $mn = Boofy::Main::->new(); my $cgi = $mn->load_cgi(); my $lg = Boofy::Login::->new($cgi); ## Block shit from 2ch my %v = $cgi->Vars(); if (%v) { my $tpl = $mn->load_tpl("header.tmpl"); $mn->show_header(); $mn->show_alert(); print $tpl->output(); exit; } ## 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; } ## キャッシュ更新 my $is_premium = ($member_type == 2) ? 1 : undef(); my $cc = Boofy::Cache::->new(); my $cache_home = $cc->get_home_wrap($member_id, premium => $is_premium); my $cache_reminder = $cc->get_reminder_wrap($member_id, premium => $is_premium); my $cache_info = $cc->get_multi_info($member_id); ## Level 2 my $level_2 = $cache_home->{"link_count:$member_id"}; ## Display my $tpl = $mn->load_tpl("home_main.tmpl"); $mn->show_header(); $mn->show_banner($member_id); $mn->show_premium($member_type); show_own_info($tpl, $cache_home, $member_id, $cache_info, $level_2, $mn); show_intro($cc, $tpl, $cache_home, $member_id); ## TODO: テンプレートを使う。を固定にする。 ## These 2 tables have nested loop, use no template my $key_member_friend = "member_friend:" . $member_id; my $key_member_comm = "member_comm:" . $member_id; my $key_member_comm_count = "member_comm_count:" . $member_id; my $member_friend = $cache_home->{$key_member_friend}; my $member_comm = $cache_home->{$key_member_comm}; my $member_comm_count = $cache_home->{$key_member_comm_count}; $tpl->param("friend_table", make_friend_table($cc, $member_id, $member_friend, $level_2)); $tpl->param("comm_table", make_comm_table($cc, $member_id, $member_comm, $member_comm_count)); $tpl->param("post_key", encode_post_key($member_id)); if ($level_2 == 0) { my $dbh = $mn->load_dbh(); if (insert_no_link($dbh, $member_id)) { send_mail_nolink($member_id); } $tpl->param("no_link", "notice.pl?id=2004100801"); } ## Reminder show_reminder($mn, $tpl, $cache_reminder, $member_id, $cache_info->{"register_date:$member_id"}); ## Updates show_update($tpl, $member_id, $cgi, $cc); print $tpl->output();