#!/usr/local/bin/php # _/_/_/_/_/_/_/_/_/_/ にゃはぴょんCGI工房提供 _/_/_/_/_/_/_/_/_/_/ # _/ このスクリプトの改造・再配布は自由です。 _/ # _/ _/ # _/_/_/_/_/_/_/_/_/_/ http://www.tky.3web.ne.jp/~t0kagaya/lib/ _/ ######### ######### ######### ######### ######### # 涙枯れるまで泣く方がいい?? # 愛のにゃはぴょん暇潰しシステム # # CGI本体 # nami_php.cgi ######### ######### ######### ######### ######### ######### ######### ######### ######### ######### # 初期設定 $G_TIME_NOW = time(); # 今の時間 $G_VER = '0.90.0'; # このスクリプトのバージョン $G_LOG_FILE = 'log.dat'; # ネタレス保存用ログファイル $G_OLD_LOGS_DIR = 'data'; # 過去ログ保存用ディレクトリ $G_NICK_LOG_FILE = 'nick.dat'; # リアルタイム参加者ログファイル $G_NETA_COUNT_FILE = 'cnt.dat'; # ネタ数カウンタファイル $G_MAX_NUM_OF_NETA = 20; # 画面に表示する(書き込み可能な)ネタの最大数 $G_MAX_NUM_OF_RES = 20; # 一つのネタにつけられるレスの最大数 $G_KANJI_CODE = 'sjis'; # 使われる漢字コード $G_NICK_TIME_OUT = '1000'; # ニックの脱落時間 $G_THIS_NAME = "nami.cgi"; # このCGIの名前 $G_TITLE = "涙枯れるまで泣く方がいい?? Ver $G_VER PHP版"; # タイトル $G_SAVE_OLD_LOGS = 1; # 過去ログを保存するかどうか(しないならコメントアウト) $G_MAX_NUM_OF_OLD_NETA_PER_FILE = 50; # 一つの過去ログファイルに保存されるネタ数 ######### ######### ######### ######### ######### # メインルーチン # main routine ######### ######### ######### ######### ######### # ヘッダー表示 PrintHeader(); # フォームからデータ取得 $gForm = array(); $gForm = GetForm($HTTP_POST_VARS,$HTTP_GET_VARS); if ($gForm{"mode"} == 'intro'){ # 自己紹介の表示 DispIntroduce(); } elseif ($gForm{"mode"} == 'res'){ # レス入力画面の表示 DispResForm(); } elseif ($gForm{"mode"} == 'view'){ # レス入力画面の表示 ViewLogs(); } elseif ($gForm{"neta"}){ # ネタをファイルに書き込み WriteNeta(); } elseif ($gForm{"res"}){ # レスをファイルに書き込み WriteRes(); } else { # デフォルト処理 # ログと新着ファイル読み込み list($mLog,$mWhatsNew) = LoadLog(); # 参加者リスト読み込み $mNickList = GetNickList($G_TIME_NOW,$G_NICK_TIME_OUT); # 画面表示 PrintNetaForm($mWhatsNew); echo $mNickList; echo $mLog; } # フッター表示 PrintTail(); ######### ######### ######### ######### ######### # ユーザー定義関数 # function ######### ######### ######### ######### ######### function LoadFromFile($file){ $array_data = @file($file); if(!$array_data){ $msg = " ファイル入力エラー [ ファイル名:$file ] "; } return array ($msg, $array_data); } function WriteToFile($file,$option,$array_data){ if ($fp = @fopen($file,$option)){ foreach($array_data as $current){ fwrite($fp,$current); } fclose($fp); }else{ $msg = " ファイル出力エラー [ ファイル名:$file ] "; } return $msg; } function GetForm($POST,$GET){ if ($POST){ foreach($POST as $key => $value){ $value = stripslashes($value); $value = htmlspecialchars($value); $value = ereg_replace(",", ",", $value); $value = ereg_replace("\r", "", $value); $value = ereg_replace("\n", "", $value); $FORM{$key} = $value; } } if ($GET){ foreach($GET as $key => $value){ $value = stripslashes($value); $value = htmlspecialchars($value); $value = ereg_replace(",", ",", $value); $value = ereg_replace("\r", "", $value); $value = ereg_replace("\n", "", $value); $FORM{$key} = $value; } } return $FORM; } function GetTime($time){ if(!$time){ $time = time(); } //グリニッジ標準時間で $times = $time + 32400; $date = gmdate("Y/m/d D G:i",$times); # $timep = gmdate("G:i",$times); return $date; } function ViewLogs(){ #-------- --------- --------- --------- --------- # ログ閲覧モードのHTML作成表示 #-------- --------- --------- --------- --------- # my ($mCntErr,@mData,$mLog,$mWhatsNew,$mNext,$mBefore,$mErr2,$mErr,$mCnt); global $G_TIME_NOW,$G_VER,$G_LOG_FILE,$G_OLD_LOGS_DIR,$G_NICK_LOG_FILE; global $G_NETA_COUNT_FILE,$G_MAX_NUM_OF_NETA,$G_MAX_NUM_OF_RES; global $G_KANJI_CODE,$G_NICK_TIME_OUT,$G_THIS_NAME,$G_TITLE,$G_SAVE_OLD_LOGS; global $G_MAX_NUM_OF_OLD_NETA_PER_FILE; global $gForm; $m_array_Data = array(); # ネタ番号カウンタ読み込み list($mCntErr,$mCnt) = LoadFromFile($G_NETA_COUNT_FILE); # ネタ番号が指定されている場合 if ($gForm{"no"}){ # 過去ログファイル番号を計算 $mFileName = intval ($gForm{"no"} / $G_MAX_NUM_OF_OLD_NETA_PER_FILE); # ファイル読み込み list($mErr,$m_array_Data) = LoadFromFile("$G_OLD_LOGS_DIR/$mFileName.txt"); # ネタが新しい順に並べ替え $m_array_Data = @array_reverse ($m_array_Data); # ページリンクのネタ番号設定 $mNext = $gForm{"no"} - $G_MAX_NUM_OF_OLD_NETA_PER_FILE; $mBefore = $gForm{"no"} + $G_MAX_NUM_OF_OLD_NETA_PER_FILE; if ($mNext < 1){ $mNext = 0; } } # ネタ番号が指定されていないもしくはネタ番号指定でのログ読み込みが失敗した場合 if (($gForm{"no"} == "") || (!$mErr == "")){ # ログファイル読み込み list($mErr2,$m_array_Data) = LoadFromFile($G_LOG_FILE); # ページリンクのネタ番号設定 $mNext = $mCnt[0] - count($m_array_Data); $mBefore = 1; } # ログが読めなかった場合のエラー表示 if(!$m_array_Data){ echo "\n
ここをクリックして下さい。
";
}
function DispResForm(){
#-------- --------- --------- --------- ---------
# レス用のフォーム表示
#-------- --------- --------- --------- ---------
# my ($mErr,@mLog,$mFindFlag,$mErrMessage);
global $G_TIME_NOW,$G_VER,$G_LOG_FILE,$G_OLD_LOGS_DIR,$G_NICK_LOG_FILE;
global $G_NETA_COUNT_FILE,$G_MAX_NUM_OF_NETA,$G_MAX_NUM_OF_RES;
global $G_KANJI_CODE,$G_NICK_TIME_OUT,$G_THIS_NAME,$G_TITLE,$G_SAVE_OLD_LOGS;
global $G_MAX_NUM_OF_OLD_NETA_PER_FILE;
global $gForm;
$m_array_Log = array();
$m_array_Res = array();
list($mErr,$m_array_Log) = LoadFromFile ($G_LOG_FILE);
# ファイルを読み込めなかった場合のメッセージ処理
if ($mErr){
$mErrMessage .= "
",$mIntroduce); echo "
$mTitle |
ここをクリックして下さい。
";
}
function GetNickList($m1,$m2){
#-------- --------- --------- --------- ---------
# ニック機能
# ニック一覧HTML = GetNickList(現在の時刻,脱落までの時間)
#-------- --------- --------- --------- ---------
global $G_TIME_NOW,$G_VER,$G_LOG_FILE,$G_OLD_LOGS_DIR,$G_NICK_LOG_FILE;
global $G_NETA_COUNT_FILE,$G_MAX_NUM_OF_NETA,$G_MAX_NUM_OF_RES;
global $G_KANJI_CODE,$G_NICK_TIME_OUT,$G_THIS_NAME,$G_TITLE,$G_SAVE_OLD_LOGS;
global $G_MAX_NUM_OF_OLD_NETA_PER_FILE;
global $gForm;
$m_array_Data = array();
$m_array_NewList = array();
# ニックのログファイルを読み込む
list($mErr,$m_array_Data) = LoadFromFile($G_NICK_LOG_FILE);
# 読み込み失敗したらエラー表示
if ($mErr){
return ("[エラー] 参加者ログファイルを読み込めませんでした [^v^]/\n");
}
# 表示用ニックリストの準備
if(!$m1){ $m1 = time(); }
$mNow = GetTime($m1);
$mData = count($m_array_Data);
$mNickList .= "$mNow (現地時間) 現在のリアルタイム参加者は $mData 人らしい
";
}
function FormLog($mOption,$m_array_Data){
#-------- --------- --------- --------- ---------
# ログ整形
# HTMLデータ = FormLog(オプション,ログデータ);
#
#-------- --------- --------- --------- ---------
global $G_TIME_NOW,$G_VER,$G_LOG_FILE,$G_OLD_LOGS_DIR,$G_NICK_LOG_FILE;
global $G_NETA_COUNT_FILE,$G_MAX_NUM_OF_NETA,$G_MAX_NUM_OF_RES;
global $G_KANJI_CODE,$G_NICK_TIME_OUT,$G_THIS_NAME,$G_TITLE,$G_SAVE_OLD_LOGS;
global $G_MAX_NUM_OF_OLD_NETA_PER_FILE;
global $gForm;
$m_array_Res = array();
$m_array_WhatsNewList = array();
# ★の色変え位置
$M_DIVIDE_POINT = 5;
$mWhatsNew = "新着|";
# ログデータをHTMLに整形して$mLogに格納
foreach ($m_array_Data as $mLine){
$mLine = Chop ($mLine);
# ひとつのスレッド読み込み
$m_array_Res = explode(",", $mLine);
$mNo = array_shift($m_array_Res);
$mNeta = array_shift($m_array_Res);
$mTime = array_shift($m_array_Res);
# 新着の作成
if(!$mTime){ $mTime = time(); }
$mTime2 = GetTime($mTime);
$m_array_WhatsNewList{"$mTime"} = "★$mNo ( $mTime2 ) ";
# オプションが'link'ならネタ番号にレス画面へのリンクを
if ($mOption == 'link'){
$mLog .= "\n\n★$mNo\n";
}else{
# オプションが無かったらリンクしない
$mLog .= "\n
★$mNo\n";
}
# 日付取得
if(!$mTime){ $mTime = time(); }
$mDate = GetTime($mTime);
# ネタの表示部分作成
$mLog .= "$mNeta $mDate \n";
# このネタにレスがあれば
if (count($m_array_Res)){
# レス数の表示部分作成
$mLog .= " . . *";
$mLog .= count($m_array_Res);
$mLog .= "\n
\n";
}
# 新着表示部分の作成
krsort($m_array_WhatsNewList);
$mWhatsNew .= implode("",$m_array_WhatsNewList);
$mWhatsNew .= "\n";
$m_array_ResHTML = array();
$mCounter = 1;
# レスの処理
foreach ($m_array_Res as $current){
# $M_DIVIDE_POINTで指定された数置きに★の色を変える
if (($mCounter % $M_DIVIDE_POINT) == 0){
array_push ($m_array_ResHTML,"
\n";
}else{
# レスが無かった場合の処理
$mLog .= " . . *無\n";
}
$mLog .= "
\n";
return array ($mLog,$mWhatsNew);
}
function LoadLog(){
#-------- --------- --------- --------- ---------
# メイン画面に表示するログファイル読み込み
# HTMLデータ = LoadLog;
#-------- --------- --------- --------- ---------
global $G_TIME_NOW,$G_VER,$G_LOG_FILE,$G_OLD_LOGS_DIR,$G_NICK_LOG_FILE;
global $G_NETA_COUNT_FILE,$G_MAX_NUM_OF_NETA,$G_MAX_NUM_OF_RES;
global $G_KANJI_CODE,$G_NICK_TIME_OUT,$G_THIS_NAME,$G_TITLE,$G_SAVE_OLD_LOGS;
global $G_MAX_NUM_OF_OLD_NETA_PER_FILE;
global $gForm;
list($mErr,$m_array_Data) = LoadFromFile($G_LOG_FILE);
if ($mErr){
return ("\n
[エラー] メインログファイルを読み込めませんでした [^v^]/\n");
}
list($mLog,$mWhatsNew) = FormLog("link",$m_array_Data);
return array ($mLog,$mWhatsNew);
}
function PrintTail(){
global $G_TIME_NOW,$G_VER,$G_LOG_FILE,$G_OLD_LOGS_DIR,$G_NICK_LOG_FILE;
global $G_NETA_COUNT_FILE,$G_MAX_NUM_OF_NETA,$G_MAX_NUM_OF_RES;
global $G_KANJI_CODE,$G_NICK_TIME_OUT,$G_THIS_NAME,$G_TITLE,$G_SAVE_OLD_LOGS;
global $G_MAX_NUM_OF_OLD_NETA_PER_FILE;
global $gForm;
echo "
";
}
function PrintNetaForm($mWhatsNew){
#-------- --------- --------- --------- ---------
# ネタフリ用FORM表示
# PrintNetaForm(新着データ);
#-------- --------- --------- --------- ---------
global $G_TIME_NOW,$G_VER,$G_LOG_FILE,$G_OLD_LOGS_DIR,$G_NICK_LOG_FILE;
global $G_NETA_COUNT_FILE,$G_MAX_NUM_OF_NETA,$G_MAX_NUM_OF_RES;
global $G_KANJI_CODE,$G_NICK_TIME_OUT,$G_THIS_NAME,$G_TITLE,$G_SAVE_OLD_LOGS;
global $G_MAX_NUM_OF_OLD_NETA_PER_FILE;
global $gForm;
echo "
最大ネタ数$G_MAX_NUM_OF_NETA, 最大レス数$G_MAX_NUM_OF_RES, 脱落まで${G_NICK_TIME_OUT}秒
リロード|
ログ閲覧|
readme 1st|
翻訳|
注:ここでの書き込みで生じる著作権は全てフリー(自分で責任とれる範囲で自由に使ってださい)
$mWhatsNew
";
}
function PrintHeader(){
#-------- --------- --------- --------- ---------
# ヘッダー表示
#-------- --------- --------- --------- ---------
global $G_TIME_NOW,$G_VER,$G_LOG_FILE,$G_OLD_LOGS_DIR,$G_NICK_LOG_FILE;
global $G_NETA_COUNT_FILE,$G_MAX_NUM_OF_NETA,$G_MAX_NUM_OF_RES;
global $G_KANJI_CODE,$G_NICK_TIME_OUT,$G_THIS_NAME,$G_TITLE,$G_SAVE_OLD_LOGS;
global $G_MAX_NUM_OF_OLD_NETA_PER_FILE;
global $gForm;
echo "
irc.friend.td.nu #nyahapyon / irc.3web.ne.jp #にゃはぴょん
\n";
# ニックのリストを作成
foreach ($m_array_Data as $current){
$current = Chop ($current);
# 一人分のデータを読み込み各変数にいれる
list($mNick, $mHost, $mTime) = explode("<>", $current);
# 脱落時間になってたら脱落表示してデータから削除
if (($m1 - $mTime) > $m2){
$mLine = "★脱落?";
}else{
# 制限時間内ならニックの表示と各種処理
# ニックのIPと一致したら
$mHostTemp = getenv("REMOTE_HOST");
$mHostTemp2 = getenv("REMOTE_ADDR");
if (($mHost == $mHostTemp) || ($mHost == $mHostTemp2)){
# 最終アクセス時刻を現在のものに
$mTime = $m1;
# ニック欄に何か入力されていたらニック更新
if ($gForm{"nick"}){$mNick = $gForm{"nick"};}
# フラグセット
$mRefreshFlag = 1;
}
# ファイル保存用データに格納
array_push ($m_array_NewList, "$mNick<>$mHost<>$mTime\n");
# 色ニックの処理
$mIndex = count($m_array_NewList);
if($mIndex == 1){
$mStarColor = '#FFFF66'; $mNickColor = '#FFFF99';
}elseif($mIndex == 2){
$mStarColor = '#999999'; $mNickColor = '#EEEEEE';
}elseif($mIndex == 3){
$mStarColor = '#FF9966'; $mNickColor = '#FFCC66';
}
# ニックのオマケ特殊処理
$m_array_Array = array();
if (ereg("|",$mNick)){
# "|"でニックと自己紹介部分に分ける
$m_array_Array = explode("|",$mNick);
$mNick = array_shift($m_array_Array);
$mIntroduce = implode("|",$m_array_Array);
# URLエンコード
$mIntroduce = htmlentities(urlencode($mIntroduce));
# 自己紹介リンク
$mStar = "★";
}else{
$mStar = "★";
}
# 上位三名の処理
if ($mIndex < 4){
$mLine = "$mStar$mNickさんは " . ($m1 - $mTime) . "秒前\n";
}else{
# それ以外の参加者の処理
$mLine = "$mStar${mNick}さんは " . ($m1 - $mTime) . "秒前\n";
}
}
# 一人分のデータを表示用変数に格納
$mNickList .= $mLine;
} # ニックのリストを作成 # ここまで
# ニックデータにIPが無かった場合、参加の処理
if (!$mRefreshFlag){
$mNickList .= "★(参加)";
if (getenv("REMOTE_HOST")){
$mNewHost = getenv("REMOTE_HOST");
}else{
$mNewHost = getenv("REMOTE_ADDR");
}
array_push ($m_array_NewList, "見学<>$mNewHost<>$m1\n");
}
# ニックデータをファイルに書き込み
$mErr = WriteToFile($G_NICK_LOG_FILE, "w", $m_array_NewList);
# エラー表示
if ($mErr){
return ("[エラー] 参加者ログファイルに書き込めませんでした[^v^]/\n");
}
return $mNickList;
}
?>