#!/usr/local/bin/ruby # _/_/_/_/_/_/_/_/_/_/ にゃはぴょんCGI工房提供 _/_/_/_/_/_/_/_/_/_/ # _/ このスクリプトの改造・再配布は自由です。 _/ # _/ _/ # _/_/_/_/_/_/_/_/_/_/ http://www.tky.3web.ne.jp/~t0kagaya/lib/ _/ ######### ######### ######### ######### ######### # 涙枯れるまで泣く方がいい?? # 愛のにゃはぴょん暇潰しシステム # # CGI本体 # nami.cgi ######### ######### ######### ######### ######### require "cgi" ######### ######### ######### ######### ######### # 初期設定 $G_TIME_NOW = Time.now.tv_sec # 今の時間 $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} Ruby版" # タイトル $G_SAVE_OLD_LOGS = 1 # 過去ログを保存するかどうか(しないならコメントアウト) $G_MAX_NUM_OF_OLD_NETA_PER_FILE = 50 # 一つの過去ログファイルに保存されるネタ数 ######### ######### ######### ######### ######### # メソッド定義 # def ######### ######### ######### ######### ######### def LoadFromFile(file) array_data = [] msg = "" if not FileTest.readable?(file) then msg = " ファイル入力エラー [ ファイル名:#{file} ] " else f = open(file,"r") array_data = f.readlines end array_data.unshift(msg) return array_data end def WriteToFile(file,option,array_data) msg = "" #配列じゃないのがきたら配列にする if not array_data.class == "Array" then array_data = array_data.to_a end f = open(file,option) if not f == "" then for current in array_data current = current.to_s f.write(current) end f.close else msg = " ファイル出力エラー [ ファイル名:#{file} ] " end return msg end def GetTime(times) #文字列できたらIntegerに if times.class == String then times = times.to_i end if times == "" then times = Time.now.tv_sec end ##グリニッジ標準時間で obj_times = Time.at(times).gmtime obj_times = obj_times + 32400 date = obj_times.strftime("%Y/%m/%d %a %H:%M") return date end def ViewLogs() #-------- --------- --------- --------- --------- # ログ閲覧モードのHTML作成表示 #-------- --------- --------- --------- --------- # my ($mCntErr,@mData,$mLog,$mWhatsNew,$mNext,$mBefore,$mErr2,$mErr,$mCnt) # ネタ番号カウンタ読み込み (mCntErr,mCnt) = LoadFromFile($G_NETA_COUNT_FILE) # ネタ番号が指定されている場合 if not $gForm["no"] == [] then # 過去ログファイル番号を計算 # Rubyでは整数部分のみが返ってくる mFileName = $gForm["no"].to_s.to_i / $G_MAX_NUM_OF_OLD_NETA_PER_FILE # ファイル読み込み m_array_Data = LoadFromFile("#{$G_OLD_LOGS_DIR}/#{mFileName}.txt") mErr = m_array_Data.shift # ネタが新しい順に並べ替え m_array_Data.reverse! # ページリンクのネタ番号設定 mNext = $gForm["no"].to_s.to_i - $G_MAX_NUM_OF_OLD_NETA_PER_FILE mBefore = $gForm["no"].to_s.to_i + $G_MAX_NUM_OF_OLD_NETA_PER_FILE mNext = 0 if mNext < 1 end # ネタ番号が指定されていないもしくはネタ番号指定でのログ読み込みが失敗した場合 if ($gForm["no"] == []) || (not mErr == "") then # ログファイル読み込み m_array_Data = LoadFromFile($G_LOG_FILE) mErr2 = m_array_Data.shift # ページリンクのネタ番号設定 mNext = mCnt.to_i - m_array_Data.length mBefore = 1 end # ログが読めなかった場合のエラー表示 if m_array_Data == [] then print "\n

[エラー] ログファイルを読み込めませんでしたよ! [^v^]/

\n" print "戻る\n" return end # リンクしないモードでログをHTMLに (mLog,mWhatsNew) = FormLog('nolink',m_array_Data) # 閲覧室のHTML表示 mLog = "

過去ログ閲覧君

最高#{$G_MAX_NUM_OF_OLD_NETA_PER_FILE}件毎表\示 戻る
前のページ次のページ
#{mLog}
前のページ次のページ
" print mLog end def WriteRes() #-------- --------- --------- --------- --------- # レスをファイルに記録 #-------- --------- --------- --------- --------- m_array_NewLog = [] mErrMessage = "" m_array_Log = LoadFromFile($G_LOG_FILE) mErr = m_array_Log.shift # ファイルを読み込めなかった場合のメッセージ処理 if not mErr == "" then mErrMessage += "

[エラー] メインログファイルを読み込めませんでしたよ! [^v^]/

\n" end # ファイル書き込み用のログデータ作成ルーチン for current in m_array_Log current = current.to_s current.chomp! # ひとつのスレッドを読み込み m_array_Res = current.split(/,/) mNo = m_array_Res.shift mNeta = m_array_Res.shift mTime = m_array_Res.shift # ネタ番号が見つかったら if mNo == $gForm["no"] then # 最大レス数になってたら書き込めないように if m_array_Res.length + 1 > $G_MAX_NUM_OF_RES then mErrMessage += "

[エラー] これ以上レスはつけられませんよ! [^v^]/

\n" mWriteFlag = 0 break end # レスの追加とフラグ処理 m_array_Res.push($gForm["res"]) mBuf = m_array_Res.join(",") m_array_NewLog.push("#{mNo},#{mNeta},#{$G_TIME_NOW},#{mBuf}\n") mWriteFlag = 1 else m_array_NewLog.push("#{current}\n") end end # レス先のネタ番号が存在してレス追加してたらファイルに書き込み if not mWriteFlag == "" then (mErr,) = WriteToFile($G_LOG_FILE,"w",m_array_NewLog) else # ネタ番号が存在しなかった場合のエラーメッセージ mErrMessage += "

[エラー] 指定されたネタ番号には書き込めませんでしたよ! [^v^]/

\n" end # ファイルを書き込めなかった場合のメッセージ処理 if not mErr == "" then mErrMessage += "

[エラー] メインログファイルに書き込めませんでしたよ! [^v^]/

\n" end # エラーがあったら"0% 無事、登録されました。"に if not mErrMessage == "" then mMessage = "0% 無事、登録されました。" else mMessage = "99.9% 無事、登録されました。" end print " #{mErrMessage} たぶん2秒後に自動的に戻ります

#{mMessage}

ここをクリックして下さい。


" end def DispResForm() #-------- --------- --------- --------- --------- # レス用のフォーム表示 #-------- --------- --------- --------- --------- # my ($mErr,@mLog,$mFindFlag,$mErrMessage) m_array_Log = LoadFromFile($G_LOG_FILE) mErr = m_array_Log.shift # ファイルを読み込めなかった場合のメッセージ処理 if not mErr == "" then mErrMessage += "

[エラー] メインログファイルを読み込めませんでしたよ! [^v^]/

\n" end # 指定された番号のネタを探す for current in m_array_Log current = current.to_s current.chomp! # ひとつのスレッドを読み込み m_array_Res = current.split(/,/) (mNo,mNeta,mTime) = m_array_Res[0..2] m_array_Res[0..2] = nil # ネタ番号が見つかったらおしまい if mNo == $gForm["no"] then mFindFlag = 1 break end end # ネタ番号が見つかったらレス画面表示 if not mFindFlag == "" then print "

ネタフリは #{mNeta} だったようです。

ゲンキダセヨ [^v^]/

レス

戻る " else # レスするネタ番号が見つからなかった場合の表示 print " #{mErrMessage}

[エラー] ネタ番号が見つかりませんでしたよ! [^v^]/

戻る " end end def DispIntroduce() #-------- --------- --------- --------- --------- # 自己紹介表示 #-------- --------- --------- --------- --------- # フォームからコメント取得 mIntroduce = $gForm["comment"] # タイトル設定 mTitle = "自己紹介" # 改行コマンドの処理 mIntroduce.gsub!(/(?i)%%BR/,"
") mIntroduce.gsub!(/(?i)%%P/,"

") print "

#{mTitle}

#{mIntroduce}
戻る
" end def WriteNeta() #-------- --------- --------- --------- --------- # ネタフリをファイルに記録 #-------- --------- --------- --------- --------- m_array_Tail = [] mErr = "" mErr2 = "" mErr3 = "" # ログファイル読み込み m_array_Data = LoadFromFile($G_LOG_FILE) mErr = m_array_Data.shift # ネタ番号カウンタ読み込み (mErr2,mCnt) = LoadFromFile($G_NETA_COUNT_FILE) if (not mErr == "") || (not mErr2 == "") then # 読み込みエラー処理 print "

[ エラー ] ログファイルを読み込めませんでしたよ! [^v^]/

\n" mMmessage = "0% 無事、登録されました。" else # ネタカウンタをひとつ増やしカウントファイルに書き込み mCnt = mCnt.to_i mCnt += 1 mErr = WriteToFile($G_NETA_COUNT_FILE,"w",mCnt) if not mErr == "" then # ネタカウンタ書き込みエラー処理 print "

[ エラー ] ネタカウントファイルに書き込めませんでしたよ! [^v^]/

\n" mMmessage = "0% 無事、登録されました。" else # ログデータの先頭に新規ネタフリ追加 mBuf = mCnt.to_s mBuf += ",#{$gForm["neta"]},#{$G_TIME_NOW}\n" m_array_Data.unshift(mBuf) # 最大数を超えたネタを m_array_Tail に格納 m_array_NewData = m_array_Data[0..$G_MAX_NUM_OF_NETA] m_array_Tail = m_array_Data[$G_MAX_NUM_OF_NETA + 1..-1] # m_array_Tail にネタが入っていて過去ログ保存機能が有効になっていたら if $G_SAVE_OLD_LOGS && (not m_array_Tail == nil) then mLogIndex = m_array_Tail.length - 1 m_array_Tail.reverse! for current in m_array_Tail # ネタカウントを元に保存するファイル番号を計算 mFileName = (mCnt.to_i - $G_MAX_NUM_OF_NETA - mLogIndex.to_i) / $G_MAX_NUM_OF_OLD_NETA_PER_FILE # 過去ログファイルに追可保存 m_array_Buf = current.to_a mErr3 = WriteToFile("#{$G_OLD_LOGS_DIR}/#{mFileName}.txt", "a", m_array_Buf) mLogIndex -= 1 end end # ログ書き込み mErr = WriteToFile($G_LOG_FILE,"w",m_array_NewData) if (not mErr == "") || (not mErr3 == "") then # 書き込みエラー処理 print "

[ エラー ] ログファイルに書き込めませんでしたよ! [^v^]/

\n" mMmessage = "0% 無事、登録されました。" else mMmessage = "99.9% 無事、登録されました。" end end end print " たぶん2秒後に自動的に戻ります

#{mMmessage}

ここをクリックして下さい。


" end def FormLog(mOption,m_array_Data) #-------- --------- --------- --------- --------- # ログ整形 # HTMLデータ = FormLog(オプション,ログデータ) # #-------- --------- --------- --------- --------- m_array_WhatsNewList = {} #連想配列は別物的 mLog = "" # ★の色変え位置 m_DIVIDE_POINT = 5 mWhatsNew = "新着|" # ログデータをHTMLに整形してmLogに格納 for mLine in m_array_Data mLine = mLine.to_s mLine.chomp! # ひとつのスレッド読み込み m_array_Res = mLine.split(/,/) (mNo,mNeta,mTime) = m_array_Res[0..2] m_array_Res[0..2] = nil # 新着の作成 if mTime == "" then mTime = Time.now.tv_sec end mTime2 = GetTime(mTime) m_array_WhatsNewList["#{mTime}"] = "#{mNo} ( #{mTime2} ) " # オプションが'link'ならネタ番号にレス画面へのリンクを if mOption == 'link' then mLog += "\n\n