X-Git-Url: http://git.sourceforge.jp/view?p=shogi-server%2Fshogi-server.git;a=blobdiff_plain;f=mk_html;h=956be0a2f33c028d8ced2f6a578ad8d1c9d64d1c;hp=dadcb1d5ebde4d2a601d61fe4d53bd666f2aff78;hb=f9c3575027bb39a0e24add66804e2771a52e71c5;hpb=4e0831a4fb7109df5072eb4e17698cc24cb9bfb7 diff --git a/mk_html b/mk_html index dadcb1d..956be0a 100755 --- a/mk_html +++ b/mk_html @@ -1,55 +1,211 @@ #!/usr/bin/ruby -## $Id$ - -## Copyright (C) 2006 Daigo Moriwaki -## -## This program is free software; you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published by -## the Free Software Foundation; either version 2 of the License, or -## (at your option) any later version. -## -## This program is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with this program; if not, write to the Free Software -## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -# -# This generates html pages from players.yaml. -# -# Sample: -# $ ./mk_html < players.yaml > rating.html -# +# $Id$ +# +# Author:: Daigo Moriwaki +# Homepage:: http://sourceforge.jp/projects/shogi-server/ +# +#-- +# Copyright (C) 2006-2008 Daigo Moriwaki +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +#++ +# +# == Synopsis +# +# mk_html generates an html page from a players.yaml. +# +# == Usage +# +# ./mk_html [OPTION] < players.yaml > rating.html +# +# [-h, --help] +# show help +# +# [-w,--wdoor] +# adpot wdoor style +# +# [--footer filename] +# insert contents in the filename at the bottom of a genrated page. +# +# == Prerequire +# +# * Ruby 1.8.7 +# +# $ sudo aptitude install ruby ruby1.8 +# +# == Example +# +# $ ./mk_html --footer ./wdoor_1000.html < players.yaml > players.html +# +# $ cat ./wdoor-1000.html +#

The average of the rates in a group is always 1000. +#

BACK +# +require 'optparse' require 'yaml' require 'erb' include ERB::Util def show_date(time) - time.strftime("%Y-%m-%d") + if (Time.now - time < 30*60) + return "on line" + elsif (Time.now - time < 24*60*60) + return time.strftime("%Y-%m-%d") + # return "%d hours ago" % [(Time.now - time)/3600] + else + return time.strftime("%Y-%m-%d") + end end -def usage - $stderr.puts <<-EOF -USAGE: #{$0} - EOF - exit 1 +def remove_long_to_see_players(file) + return unless file["players"][999] # only for Not-Yet-Rated players + + file["players"][999].delete_if do |key, value| + value['last_modified'] < Time.now - 24*3600*30 # 30 days + end end def main + $wdoor = false + $footer_content = nil + opts = OptionParser.new + opts.banner = "Usage: mk_html [OPTIONS]" + opts.on("--footer filename", String, "Insert contents of the filename at the bottom of a genrated page") do |filename| + unless File.exist?(filename) + $stderr.puts "File not found: %s" % [filename] + raise + end + $footer_content = File.open(filename).read + end + opts.on("-w","--wdoor", "adopt a wdoor style") { $wdoor=true } + opts.on_tail("-h", "--help", "show this message") do + puts opts + exit + end + begin + opts.parse(ARGV) + rescue + puts opts + exit -1 + end + lines = "" - while l = gets do + while l = $stdin.gets do lines << l end - yaml = YAML::load(lines) + file = YAML::load(lines) + erb = ERB.new( DATA.read, nil, "%>" ) + tables = [] + group_names = [] + file["players"].keys.sort.each do |index| + if index < 999 + group_names << "#{index}" + else + group_names << "Not-Yet-Rated Players" + end + end + remove_long_to_see_players(file) - sorted_keys = yaml.keys.sort {|a,b| yaml[b]['rate'] <=> yaml[a]['rate']} + popup_id = 0 + + if $wdoor + yss_rate = 0 + file["players"].keys.each do |group_index| + file["players"][group_index].each do |player, yaml| + if player == "YSS+707d4f98d9d2620cdaab58f19d02a2e4" + yss_rate = yaml['rate'] + end + end + end + end + + file["players"].sort.each do |key, yaml| # sort groups in the order written in players.yaml + sorted_keys = yaml.keys.sort do |a,b| + # sort players in a group by one's rate + if yaml[b]['rate'] == 0 && yaml[a]['rate'] == 0 + # mainly for not-rated-yet players + yaml[b]['last_modified'] <=> yaml[a]['last_modified'] + else + yaml[b]['rate'] <=> yaml[a]['rate'] + end + end + top_rate = nil + table = ERB.new(<") +% sorted_keys.each do |key| + <% + win = yaml[key]['win'] + loss = yaml[key]['loss'] + win_rate = win.to_f / (win + loss) + last_modified = yaml[key]['last_modified'] + + player_decoration = "default" + + case (Time.now - last_modified)/60 # minutes + when (0..30) then player_decoration = "current" + when (0..(1*60*24)) then player_decoration = "today" + when (0..(7*60*24)) then player_decoration = "this_week" + end + + case key + when "yowai_gps+95908f6c18338f5340371f71523fc5e3" then player_decoration = "yowai_gps" + when "gps+11648e4e66e7ed6a86cb7f1d0cf604fe" then player_decoration = "gps" + end + + rate = yaml[key]['rate'] + top_rate ||= rate + diff_rate = rate - top_rate + diff_possibility = 1.0/(1.0 + 10**(-diff_rate/400.0)) + %> + + + <%= h yaml[key]['name'] %> + + + + <%= rate != 0 ? "%5d" % [ rate ] : "N/A" %> + + + + <%= "%5d" % [ win ] %> + + <%= "%5d" % [ loss ] %> + + <%= "%.3f" % [win_rate] %> + + <%= show_date(last_modified) %> +% if $wdoor + + <%= rate != 0 && yss_rate > 0 ? ("%5d" % [2300 - yss_rate + rate]) : "N/A" %> +% end + +% end +ENDTABLE + + tables << table.result(binding) + end - erb = ERB.new( DATA.read, nil, "%<>" ) body = erb.result(binding) puts body end @@ -64,33 +220,91 @@ __END__ Shogi Server Rating + + + + + + + + + + + + + - +

+ +
+

Shogi Server Rating

+% tables.each_with_index do |t, index| + ++ + + + + + +% if $wdoor + +% end + + - + + + + + + +% if $wdoor + +% end -<% sorted_keys.each do |key| %> - <% - win = yaml[key]['win'] - loss = yaml[key]['loss'] - win_rate = win.to_f / (win + loss) - last_modified = yaml[key]['last_modified'] - %> - - - - - - - - -<% end %> + + + <%= t %> +
Group: <%=group_names[index]%>
name rate win loss win_rate last_modifiednameratewinloss%last_modified(rate24)
<%=h yaml[key]['name']%><%=yaml[key]['rate']%><%=win%><%=loss%><%="%.3f" % [win_rate]%><%=show_date(last_modified)%>
- +
+ +% end + +

Groups are independently rated. You can not compare rates across them. + +<%= $footer_content %> + +


+
+ + +
+

Last modified at <%=Time.now%> +

$Revision$ +

+ +