#!/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
ここをクリックして下さい。
"
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 += "
") print "
#{mTitle} |
ここをクリックして下さい。
"
end
def GetNickList(m1,m2)
#-------- --------- --------- --------- ---------
# ニック機能
# ニック一覧HTML = GetNickList(現在の時刻,脱落までの時間)
#-------- --------- --------- --------- ---------
m_array_NewList = []
mNickList = ""
# ニックのログファイルを読み込む
m_array_Data = LoadFromFile($G_NICK_LOG_FILE)
mErr = m_array_Data.shift
# 読み込み失敗したらエラー表示
if not mErr == "" then
return "[エラー] 参加者ログファイルを読み込めませんでした [^v^]/\n"
end
# 表示用ニックリストの準備
if m1 == "" then
m1 = Time.now.tv_sec
end
mNow = GetTime(m1)
mData = m_array_Data.length
mNickList += "#{mNow} (現地時間) 現在のリアルタイム参加者は #{mData} 人らしい
"
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★#{mNo}\n"
else
# オプションが無かったらリンクしない
mLog += "\n
★#{mNo}\n"
end
# 日付取得
if mTime == "" then
mTime = Time.now.tv_sec
end
mDate = GetTime(mTime)
# ネタの表示部分作成
mLog += "#{mNeta} #{mDate} \n"
# このネタにレスがあれば
if not m_array_Res == "" then
# レス数の表示部分作成
mLog += " . . *#{m_array_Res.length}\n
\n"
end
# 新着表示部分の作成
for k in m_array_WhatsNewList.keys.sort.reverse
mWhatsNew += m_array_WhatsNewList[k]
end
mWhatsNew += "\n"
m_array_ResHTML = []
mCounter = 1
# レスの処理
for current in m_array_Res
current = current.to_s
# m_DIVIDE_POINTで指定された数置きに★の色を変える
if (mCounter % m_DIVIDE_POINT) == 0 then
m_array_ResHTML.push("
\n"
else
# レスが無かった場合の処理
mLog += " . . *無\n"
end
mLog += "
\n"
return mLog,mWhatsNew
end
def LoadLog()
#-------- --------- --------- --------- ---------
# メイン画面に表示するログファイル読み込み
# HTMLデータ = LoadLog
#-------- --------- --------- --------- ---------
m_array_Data = LoadFromFile($G_LOG_FILE)
mErr = m_array_Data.shift
if not mErr == "" then
return "\n
[エラー] メインログファイルを読み込めませんでした [^v^]/\n"
end
(mLog,mWhatsNew) = FormLog("link",m_array_Data)
return mLog,mWhatsNew
end
def PrintTail()
print "
"
end
def PrintNetaForm(mWhatsNew)
#-------- --------- --------- --------- ---------
# ネタフリ用FORM表示
# PrintNetaForm(新着データ)
#-------- --------- --------- --------- ---------
print "
最大ネタ数#{$G_MAX_NUM_OF_NETA}, 最大レス数#{$G_MAX_NUM_OF_RES}, 脱落まで#{$G_NICK_TIME_OUT}秒
リロード|
ログ閲覧|
readme 1st|
翻訳|
注:ここでの書き込みで生じる著作権は全てフリー(自分で責任とれる範囲で自由に使ってださい)
#{mWhatsNew}
"
end
def PrintHeader()
#-------- --------- --------- --------- ---------
# ヘッダー表示
#-------- --------- --------- --------- ---------
print "
irc.friend.td.nu #nyahapyon / irc.3web.ne.jp #にゃはぴょん
\n"
# ニックのリストを作成
for current in m_array_Data
current = current.to_s
current.chomp!
# 一人分のデータを読み込み各変数にいれる
(mNick, mHost, mTime) = current.split(/<>/)
# 脱落時間になってたら脱落表示してデータから削除
if (m1.to_i - mTime.to_i) > m2.to_i then
mLine = "★脱落?"
else
# 制限時間内ならニックの表示と各種処理
# ニックのIPと一致したら
mHostTemp = ENV["REMOTE_HOST"]
mHostTemp2 = ENV["REMOTE_ADDR"]
if (mHost == mHostTemp) || (mHost == mHostTemp2) then
# 最終アクセス時刻を現在のものに
mTime = m1.to_i
# ニック欄に何か入力されていたらニック更新
if not $gForm["nick"] == [] then
mNick = $gForm["nick"]
end
# フラグセット
mRefreshFlag = 1
end
# ファイル保存用データに格納
m_array_NewList.push("#{mNick}<>#{mHost}<>#{mTime}\n")
# 色ニックの処理
mIndex = m_array_NewList.length
if mIndex == 1 then
mStarColor = '#FFFF66'
mNickColor = '#FFFF99'
elsif mIndex == 2 then
mStarColor = '#999999'
mNickColor = '#EEEEEE'
elsif mIndex == 3 then
mStarColor = '#FF9966'
mNickColor = '#FFCC66'
end
# ニックのオマケ特殊処理
m_array_Array = []
if mNick =~ /|/ then
# "|"でニックと自己紹介部分に分ける
m_array_Array = mNick.split(/|/)
mNick = m_array_Array.shift
mIntroduce = m_array_Array.join("|")
# URLエンコード
mIntroduce = CGI.escape(mIntroduce)
# 自己紹介リンク
mStar = "★"
else
mStar = "★"
end
# 上位三名の処理
if mIndex < 4 then
mLine = "#{mStar}#{mNick}さんは #{m1.to_i - mTime.to_i}秒前\n"
else
# それ以外の参加者の処理
mLine = "#{mStar}#{mNick}さんは #{m1.to_i - mTime.to_i}秒前\n"
end
end
# 一人分のデータを表示用変数に格納
mNickList += mLine
end # ニックのリストを作成 # ここまで
# ニックデータにIPが無かった場合、参加の処理
if not mRefreshFlag == 1 then
mNickList += "★(参加)"
if ENV.has_key?("REMOTE_HOST") then
mNewHost = ENV["REMOTE_HOST"]
else
mNewHost = ENV["REMOTE_ADDR"]
end
m_array_NewList.push("見学<>#{mNewHost}<>#{m1}\n")
end
# ニックデータをファイルに書き込み
mErr = WriteToFile($G_NICK_LOG_FILE, "w", m_array_NewList)
# エラー表示
if not mErr == "" then
return "[エラー] 参加者ログファイルに書き込めませんでした[^v^]/\n"
end
return mNickList
end
######### ######### ######### ######### #########
# メインルーチン
# main routine
######### ######### ######### ######### #########
# ヘッダー表示
PrintHeader()
# フォームからデータ取得
Form = CGI.new
$gForm = Form.params
for k in $gForm.keys
$gForm[k] = CGI.escapeHTML($gForm[k].to_s)
$gForm[k].gsub!(/,/,",")
end
if $gForm["mode"].to_s == 'intro' then
# 自己紹介の表示
DispIntroduce()
elsif $gForm["mode"].to_s == 'res' then
# レス入力画面の表示
DispResForm()
elsif $gForm["mode"].to_s == 'view' then
# レス入力画面の表示
ViewLogs()
elsif not $gForm["neta"] == [] then
# ネタをファイルに書き込み
WriteNeta()
elsif not $gForm["res"] == [] then
# レスをファイルに書き込み
WriteRes()
else
# デフォルト処理
# ログと新着ファイル読み込み
(mLog,mWhatsNew) = LoadLog()
# 参加者リスト読み込み
mNickList = GetNickList($G_TIME_NOW,$G_NICK_TIME_OUT)
# 画面表示
PrintNetaForm(mWhatsNew)
print mNickList
print mLog
end
# フッター表示
PrintTail()