#!/usr/bin/perl #┌───────────────────────────────── #│ [ YY-BOARD ] #│ yybbs.cgi - 2007/09/17 #│ Copyright (c) KentWeb #│ webmaster@kent-web.com #│ http://www.kent-web.com/ #└───────────────────────────────── # 外部ファイル取込 require './init.cgi'; require $jcode; # メイン処理 &decode; &axsCheck; if ($mode eq "find") { &find; } elsif ($mode eq "image") { ℑ } elsif ($mode eq "form") { &form_disp; } elsif ($mode eq "past") { &past_log; } elsif ($mode eq "howto") { require $howtopl; &howto; } elsif ($mode eq "check") { require $checkpl; ✓ } &log_view; #------------------------------------------------- # 記事表示部 #------------------------------------------------- sub log_view { # ページ繰越 local($resfm); foreach ( keys(%in) ) { if (/^page:(\d+)$/) { $page = $1; } if (/^res:(\d+)$/) { $resfm = $1; last; } } # 返信フォーム押下 if ($resfm) { &res_form; } # クッキー取得 local($cnam,$ceml,$curl,$cpwd,$cico,$ccol) = &get_cookie; if (!$curl) { $curl = 'http://'; } # ヘッダを出力 if ($ImageView == 1) { &header('ImageUp'); } else { &header; } # カウンタ処理 if ($counter) { &counter; } # 投稿キー local($str_plain,$str_crypt); if ($regist_key) { require $regkeypl; ($str_plain,$str_crypt) = &pcp_makekey; } # タイトル部 print qq|
\n|; if ($banner1 ne "") { print "$banner1

\n"; } if ($t_img eq '') { print qq|$title\n|; } else { print qq|$title\n|; } print qq|


\n|; print qq|[ホームに戻る]\n|; if (!defined($list_type{$in{'list'}})) { if (defined($list_type{$view_type})) { $in{'list'} = $view_type; } else { $in{'list'} = 'thread'; } } if ($in{'list'} ne "thread") { print qq|[新規投稿]\n|; } foreach ( 'thread', 'tree', 'topic' ) { next if ($in{'list'} eq $_); print qq|[$list_type{$_}]\n|; } print <留意事項] [ワード検索] EOM # 過去ログのリンク部を表示 if ($pastkey) { print qq|[過去ログ]\n|; } print <管理用]
EOM # 投稿フォーム if ($in{'list'} eq 'thread') { print qq|
\n|; print qq|
\n|; print qq|\n|; print qq|\n|; require $formpl; &form($cnam,$ceml,$curl,$cpwd,$cico,$ccol,'',''); print qq|

\n|; } # 件数チェック if ($pglog{$in{'list'}} <= 0) { $pglog{$in{'list'}} = 10; } # 記事を展開 my $i = 0; open(IN,"$logfile") || &error("Open Error: $logfile"); my $top = ; while () { my ($no,$reno,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$col,$ico) = split(/<>/); if ($reno eq "") { $i++; } if ($i < $page + 1) { next; } if ($i > $page + $pglog{$in{'list'}}) { next; } # 親記事 if (!$reno) { push(@view,$no); # レス記事 } else { $res{$reno} .= "$no,"; } # 題名の長さ if (length($sub) > $sub_len*2) { $sub = substr($sub, 0, $sub_len*2) . "..."; } # URLリンク # if ($autolink) { &auto_link($com); } $nam{$no} = $nam; $eml{$no} = $eml; $sub{$no} = $sub; $dat{$no} = $dat; $com{$no} = $com; $col{$no} = $col; $url{$no} = $url; $ico{$no} = $ico; } close(IN); # 記事表示 if ($in{'list'} eq "tree") { require $list_log_tree; &list_log_tree; } elsif ($in{'list'} eq "topic") { require $list_log_topic; &list_log_topic; } else { require $list_log_thread; &list_log_thread; } # ページ移動ボタン表示 if ($page - $pglog{$in{'list'}} >= 0 || $page + $pglog{$in{'list'}} < $i) { print qq|

\n|; print qq|
Page:\n|; &mvbtn("$bbscgi?page=", $i, $pglog{$in{'list'}}); print qq|
\n|; } print qq|

\n|; # ユーザメンテフォーム(トピック表示以外) if ($in{'list'} ne "topic") { print qq|
\n|; print qq|\n|; print qq|\n|; print qq|No.\n|; print qq|暗証キー\n|; print qq|
\n|; } # 著作権表示(削除不可): 但し、MakiMakiさんの画像を使用しない場合に限り、 # MakiMakiさんのリンクを外すことは可能です。 print < - YY-BOARD -
EOM exit; } #------------------------------------------------- # 返信フォーム #------------------------------------------------- sub res_form { # 投稿キー local($str_plain,$str_crypt); if ($regist_key) { require $regkeypl; ($str_plain,$str_crypt) = &pcp_makekey; } $in{'no'} = $resfm; # クッキーを取得 local($cnam,$ceml,$curl,$cpwd,$cico,$ccol) = &get_cookie; if (!$curl) { $curl = 'http://'; } # ログを読み込み my $flg; open(IN,"$logfile") || &error("Open Error: $logfile"); my $top = ; # ヘッダを出力 if ($ImageView == 1) { &header('ImageUp'); } else { &header; } # 関連記事出力 print < ▽以下は記事No.$in{'no'} に関する返信フォームです。
EOM while () { my ($no,$reno,$dat,$nam,$eml,$sub,$com,$url) = split(/<>/); if ($in{'no'} == $no && $reno) { $flg++; } if ($in{'no'} == $no || $in{'no'} == $reno) { if ($in{'no'} == $no) { $resub = $sub; } if ($url) { $url = "<Home>"; } if ($reno) { print '  '; } print "

$sub\n"; print "投稿者:$nam 投稿日:$dat $url "; print "No.$no

\n"; print "
$com\n"; } } close(IN); if ($flg) { &error("不正な返信要求です"); } # タイトル名 if ($resub !~ /^Re\:/) { $resub = "Re: $resub"; } print <<"EOM";

EOM require $formpl; &form($cnam,$ceml,$curl,$cpwd,$cico,$ccol,$resub,''); print <
EOM exit; } #------------------------------------------------- # ワード検索 #------------------------------------------------- sub find { &header; print <
  • キーワードを入力し、「条件」「表\示」を選択して検索ボタンを押して下さい。
  • キーワードはスペースで区切って複数指定することができます。

    キーワード 条件 表\示
EOM # 検索実行 if ($in{'word'} ne "") { ($i,$next,$back) = &search($logfile,$in{'word'},$in{'view'},$in{'cond'}); $enwd = &url_enc($in{'word'}); if ($back >= 0) { print "[前の$in{'view'}件]\n"; } if ($next < $i) { print "[次の$in{'view'}件]\n"; } } print "\n"; exit; } #------------------------------------------------- # 投稿画面 #------------------------------------------------- sub form_disp { # 投稿キー local($str_plain,$str_crypt); if ($regist_key) { require $regkeypl; ($str_plain,$str_crypt) = &pcp_makekey; } # クッキーを取得 local($cnam,$ceml,$curl,$cpwd,$cico,$ccol) = &get_cookie; if (!$curl) { $curl = 'http://'; } # ヘッダを出力 if ($ImageView == 1) { &header('ImageUp'); } else { &header; } # 関連記事出力 print < ▼新規投稿フォーム
EOM print <<"EOM";
EOM require $formpl; &form($cnam,$ceml,$curl,$cpwd,$cico,$ccol,'',''); print <
EOM exit; } #------------------------------------------------- # 過去ログ #------------------------------------------------- sub past_log { open(IN,"$nofile") || &error("Open Error: $nofile"); my $num = ; close(IN); $in{'log'} =~ s/\D//g; if (!$in{'log'}) { $in{'log'} = $num; } &header; print <<"EOM";
過去ログ
キーワード 条件 表\示
EOM my $file = sprintf("%s/%04d.cgi", $pastdir,$in{'log'}); # 検索処理 if ($in{'word'} ne "") { # 検索 my ($i, $next, $back) = &search($file, $in{'word'}, $in{'view'}, $in{'cond'}, 'past'); # ページ繰り越し my $enwd = &url_enc($in{'word'}); if ($back >= 0) { print "[前の$in{'view'}件]\n"; } if ($next < $i) { print "[次の$in{'view'}件]\n"; } print "\n"; exit; } print "
\n"; my $i = 0; open(IN,"$file") || &error("Open Error: $file"); while () { my ($no,$re,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$col,$ico) = split(/<>/); if ($re eq "") { $i++; } if ($i < $page + 1) { next; } if ($i > $page + $pastView) { next; } if ($eml) { $nam = "$nam"; } if ($url) { $url = "<URL>"; } if ($re eq "") { print "

"; } else { print "
"; } print qq|$sub |; print qq|$nam - $dat $url No.$no

\n|; if ($ico) { print qq||; print qq||; print qq|
$com
\n|; } else { print qq|
$com
\n|; } } close(IN); print <
EOM # ページ移動ボタン表示 if ($page - $pastView >= 0 || $page + $pastView < $i) { &mvbtn("$bbscgi?mode=$mode&log=$in{'log'}&page=", $i, $pastView); } print < EOM exit; } #------------------------------------------------- # カウンタ処理 #------------------------------------------------- sub counter { local($count, $cntup, @count); # 閲覧時のみカウントアップ if ($mode eq '') { $cntup = 1; } else { $cntup = 0; } # カウントファイルを読みこみ open(LOG,"+< $cntfile") || &error("Open Error: $cntfile"); eval "flock(LOG, 2);"; $count = ; # IPチェックとログ破損チェック local($cnt, $ip) = split(/:/, $count); if ($addr eq $ip || $cnt eq "") { $cntup = 0; } # カウントアップ if ($cntup) { $cnt++; truncate(LOG, 0); seek(LOG, 0, 0); print LOG "$cnt:$addr"; } close(LOG); # 桁数調整 while(length($cnt) < $mini_fig) { $cnt = '0' . $cnt; } @count = split(//, $cnt); # GIFカウンタ表示 if ($counter == 2) { foreach (0 .. $#count) { print "\"$count[$_]\""; } # テキストカウンタ表示 } else { print "$cnt
\n"; } } #------------------------------------------------- # 画像イメージ表示 #------------------------------------------------- sub image { my @ico1 = split(/\s+/, $ico1); my @ico2 = split(/\s+/, $ico2); &header; print <

画像イメージ

EOM my $i = 0; foreach (0 .. $#ico1) { $i++; if ($i % 5 == 1) { print "\n"; } print qq|\n|; if ($i % 5 == 0) { print "\n"; } } while ( $i % 5 != 0 ) { print qq||; $i++; } print <
EOM exit; } #------------------------------------------------- # 移動ボタン #------------------------------------------------- sub mvbtn { local($link,$i,$view) = @_; local($start,$end,$x,$y,$bk_bl,$fw_bl); if ($in{'bl'}) { $start = $in{'bl'}*10 + 1; $end = $start + 9; } else { $in{'bl'} = 0; $start = 1; $end = 10; } $x = 1; $y = 0; while ($i > 0) { # 当ページ if ($page == $y) { print qq {| $x\n}; # 切替ページ } elsif ($x >= $start && $x <= $end) { print "| $x\n"; # 前ブロック } elsif ($x == $start-1) { $bk_bl = $in{'bl'}-1; print "| \n"; # 次ブロック } elsif ($x == $end+1) { $fw_bl = $in{'bl'}+1; print "| \n"; } $x++; $y += $view; $i -= $view; } print "|\n"; } #------------------------------------------------- # 検索処理 #------------------------------------------------- sub search { local($file, $word, $view, $cond, $job) = @_; # キーワードを配列化 $word =~ s/\x81\x40/ /g; my @wd = split(/\s+/, $word); # ファイル展開 print "
\n"; my $i = 0; open(IN,"$file") || &error("Open Error: $file"); my $top = if ($job ne "past"); while () { my $flg; foreach my $wd (@wd) { if (index($_,$wd) >= 0) { $flg++; if ($cond eq 'OR') { last; } } else { if ($cond eq 'AND') { $flg = 0; last; } } } # ヒットした場合 if ($flg) { $i++; next if ($i < $page + 1); next if ($i > $page + $view); my ($no,$reno,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$col,$ico) = split(/<>/); if ($eml) { $nam = "$nam"; } if ($url) { $url = "<Home>"; } # 結果を表示 print "

[$no] $sub "; print "投稿者:$nam 投稿日:$dat $url

\n"; print "
$com\n"; } } close(IN); print <
検索結果:$i
EOM my $next = $page + $view; my $back = $page - $view; return ($i, $next, $back); } #------------------------------------------------- # URLエンコード #------------------------------------------------- sub url_enc { local($_) = @_; s/(\W)/'%' . unpack('H2', $1)/eg; s/\s/+/g; $_; }
$ico1[$_]$ico2[$_]