#!/usr/bin/env ruby # -*- coding: euc-jp -*- $KCODE = "EUC" require 'config' require 'user_record' require 'catalog' require 'login' require 'tss' require 'tsslock' require 'cgi' cgi = CGI.new() @login = Login.new(cgi) def cgi_select(name, values, labels, selected) r = %Q(\n) end def update_all urdb = Store.new('db/ur.db') urdb.transaction() do urdb.roots.each do |i| u = urdb[i] u.update urdb[i] = u end end end def rank_table(ta, r) print "" print "" print "" ta.each do |t| print "" end print "" r.each_index do |i| print "" print "" r[i].each do |d| print "" end print "" end print "
順位ID#{t}
#{i+1}#{d}
" end def rank_tables(us, prefix = '') print "

#{prefix}勝率ランキング

\n" rank_table(['勝率', '勝敗'], us.sort do |a, b| [b[1].win_rate, b[1].wins] <=> [a[1].win_rate, a[1].wins] end.collect do |u| s = u[1] [u[0], "#{s.win_rate}%", "#{s.wins}勝 #{s.loses}敗"] end) print "

#{prefix}生存率ランキング

\n" rank_table(['生存率', '平均寿命', '参加数'], us.sort do |a, b| [b[1].live_rate, b[1].avg_dates, b[1].num ] <=> [a[1].live_rate, a[1].avg_dates, a[1].num ] end.collect do |u| s = u[1] [u[0], "#{s.live_rate}%", "#{s.avg_dates}日", "#{s.num}回"] end) print "

#{prefix}MVP得票ランキング

\n" rank_table(['MVP得票', 'MVP回数', '参加数'], us.sort do |a, b| [b[1].mvpcs, b[1].mvps, a[1].num] <=> [a[1].mvpcs, a[1].mvps, b[1].num] end.collect do |u| s = u[1] [u[0], "#{s.mvpcs}票", "#{s.mvps}回", "#{s.num}回"] end) end def idl(id, nick) "#{nick}" end def idl_db(userdb, id) if (userdb[id]) idl(id, userdb[id]['nick']) else udb = Store.new("db/ur/#{CGI.escape(id)}.db") udb.transaction(true) do if (udb['root']) idl(id, udb['root'].nick) else idl(id, '???') end end end end def senseki_table(cls_th, a, cls_proc) print "" print "" print "" print "" print "" print "" a.each do |s| next if (s.num == 0) print "" print "" print "" print "" print "" print "" end print "
#{cls_th}勝敗勝率生存率寿命MVP票MVP数
#{cls_proc.call(s.cls)}#{s.wins}勝#{s.loses}敗#{s.win_rate}%#{s.live_rate}%#{s.avg_dates}日#{s.mvpcs}票#{s.mvps}回
" end def matome(id) if (id != '') userdb = Store.new('db/user.db') userdb.transaction(true) do urdb_file = "db/ur/#{CGI.escape(id)}.db" if (!FileTest.exist?(urdb_file)) print "

まだ戦績がありません。

" else urdb = Store.new(urdb_file) u = urdb.transaction(true) do urdb['root'] end print "

#{u.nick}

" s = u.senseki if (s) print "#{s.wins}勝 #{s.loses}敗 (勝率 #{s.win_rate}%)
" print "生存率 #{s.live_rate}%, 平均寿命 #{s.avg_dates}日
" print "MVP#{s.mvps}回, MVP得票#{s.mvpcs}票
" print "
" else print "まだ戦績がありません" end print "

自己紹介

" print "
" if (u.intro) print u.intro.gsub(/\n/, '
') else print '自己紹介がありません。早めに下の自己紹介編集で自己紹介を作って下さい。よくわからんIDは削除する可能性があります。' end print "
" print "
" if (s) print "

村の記録



\n" print "

立場別戦績

" senseki_table('立場', u.senseki_ps, Proc.new {|c| "#{c}側"}) print "

役職別戦績

" senseki_table('役職', u.senseki_sk, Proc.new {|c| c}) # print "

キャラ別戦績

" # senseki_table('キャラ', u.senseki_pl, Proc.new {|c| c.sub(/^[^\s]+\s+/, '')}) winstr = [ '×', '△', '○' ] print "

対戦相手

" print "

\n" print "
\n" end if (@login.login && @login.userid == id) print "

自己紹介編集

" print "
" print "
" print "
" print "" print "" print "
" print "
" print %Q(

設定

発言フィルタ: #{cgi_select('filter', ['1','0'], ['表示', '非表示'], u.filter)}
プレビュー: #{cgi_select('preview', ['2','1','0'], ['村の設定にあわせる','常にオン','常にオフ'], u.preview)}
) end end end else raise ErrorMsg.new('未実装なのだよ、実装するかもわからん') end end print "Content-Type: text/html; charset=EUC-JP\n\n" begin print(HEAD1) print "四国" print(HEAD2) @login.form cmd = cgi['cmd'] u = (cmd == nil) ? '' : CGI::unescape(ENV['QUERY_STRING']) if (cmd == 'update') update_all print "OK" exit(0) elsif (cmd == 'intro' && @login.login) u = CGI.escape(@login.userid) urdb = Store.new("db/ur/#{u}.db") urdb.transaction() do urdb['root'].intro = cgi['intro'] end lock = TSSLock.new(COUNTRY_NAME) raise ErrorMsg.new('なんかロックできてません') if (!lock.lock('vil')) begin http_broadcast("db/ur/#{u}.db") lock.unlock('vil') ensure lock.unlock('vil') end elsif (cmd == 'config' && @login.login) u = CGI.escape(@login.userid) urdb = Store.new("db/ur/#{u}.db") urdb.transaction() do urdb['root'].filter = cgi['filter'] urdb['root'].preview = cgi['preview'] end http_broadcast('db/user.db') lock = TSSLock.new(COUNTRY_NAME) raise ErrorMsg.new('なんかロックできてません') if (!lock.lock('vil')) begin http_broadcast("db/ur/#{u}.db") lock.unlock('vil') ensure lock.unlock('vil') end end matome(u) print(FOOT) rescue print "
\n"
  print CGI.escapeHTML("#{$!.to_s}\n")
  print CGI.escapeHTML("#{$!.backtrace.join("\n")}\n")
  print "
\n" end