#! ruby -Ks $KCODE = "sjis" $debug = 0; require 'net/http' require 'cgi' require 'fileutils' require 'strscan' require 'jcode' require 'erb' require 'typekey' #require 'time' class Array def randomize sort_by{ rand(100) } end def randomize! replace randomize end end $server_names = [ 'ninjinix.x0.com', 'ninjinel.sakura.ne.jp', 'ninjinel.sakura.ne.jp', 'ninjinel.sakura.ne.jp', 'ninjinel.x0.com', 'ninjin001.x0.com', 'ninjin001.x0.com', 'ninjin002.x0.com', ] $folder_names = [ 'wolf', 'wolf', 'wolfa', 'wolfb', 'wolfc', 'wolfd', 'wolfe', 'wolff', ] $log_places = [ 'log/old/', 'log/home/', 'log/a/', 'log/b/', 'log/c/', 'log/d/', 'log/e/', 'log/f/', ] $name_list = [ '村長 ヴァルター', '老人 モーリッツ', '神父 ジムゾン', '木こり トーマス', '旅人 ニコラス', 'ならず者 ディーター', '少年 ペーター', '少女 リーザ', '行商人 アルビン', '羊飼い カタリナ', 'パン屋 オットー', '青年 ヨアヒム', '村娘 パメラ', '農夫 ヤコブ', '宿屋の女主人 レジーナ', 'シスター フリーデル', '楽天家 ゲルト', ] $nicknames = { '楽天家 ゲルト' => 'ゲ', '村長 ヴァルター' => 'ヴ', '老人 モーリッツ' => 'モ', '神父 ジムゾン' => 'ジ', '木こり トーマス' => 'ト', '旅人 ニコラス' => 'ニ', 'ならず者 ディーター' => 'デ', '少年 ペーター' => 'ペ', '少女 リーザ' => 'リ', '行商人 アルビン' => 'ア', '羊飼い カタリナ' => 'カ', 'パン屋 オットー' => 'オ', '青年 ヨアヒム' => 'ヨ', '村娘 パメラ' => 'パ', '農夫 ヤコブ' => 'ヤ', '宿屋の女主人 レジーナ' => 'レ', 'シスター フリーデル' => 'フ', } $nicknames2 = { '楽天家 ゲルト' => 'ゲルト', '村長 ヴァルター' => 'ヴァルター', '老人 モーリッツ' => 'モーリッツ', '神父 ジムゾン' => 'ジムゾン', '木こり トーマス' => 'トーマス', '旅人 ニコラス' => 'ニコラス', 'ならず者 ディーター' => 'ディーター', '少年 ペーター' => 'ペーター', '少女 リーザ' => 'リーザ', '行商人 アルビン' => 'アルビン', '羊飼い カタリナ' => 'カタリナ', 'パン屋 オットー' => 'オットー', '青年 ヨアヒム' => 'ヨアヒム', '村娘 パメラ' => 'パメラ', '農夫 ヤコブ' => 'ヤコブ', '宿屋の女主人 レジーナ' => 'レジーナ', 'シスター フリーデル' => 'フリーデル', } $inv_nick2 = $nicknames2.invert $nicknames3 = { '楽天家 ゲルト' => '楽', # '村長 ヴァルター' => '村', '村長 ヴァルター' => '長', # '老人 モーリッツ' => '爺', '老人 モーリッツ' => '老', '神父 ジムゾン' => '神', '木こり トーマス' => '木', # '木こり トーマス' => '樵', '旅人 ニコラス' => '旅', 'ならず者 ディーター' => '者', '少年 ペーター' => '年', '少女 リーザ' => '妙', # '少女 リーザ' => '女', '行商人 アルビン' => '商', '羊飼い カタリナ' => '羊', 'パン屋 オットー' => '屋', '青年 ヨアヒム' => '青', '村娘 パメラ' => '娘', '農夫 ヤコブ' => '農', '宿屋の女主人 レジーナ' => '宿', 'シスター フリーデル' => '修', # 'シスター フリーデル' => '尼', } $nicknames4 = { 'ゲルト' => /.*(?:ゲルト|楽|ゲル)/, 'ヴァルター' => /.*(?:ヴァルター|村|長|バル|ヴァル|ヴィ)/, 'モーリッツ' => /.*(?:モーリッツ|爺|老|翁|モリ|じい|じぃ)/, 'ジムゾン' => /.*(?:ジムゾン|神|ジム|ヅム)/, 'トーマス' => /.*(?:トーマス|木|樵|トマ)/, 'ニコラス' => /.*(?:ニコラス|旅|ニコ)/, 'ディーター' => /.*(?:ディーター|者|ディ)/, 'ペーター' => /.*(?:ペーター|年|ペタ|ベタ|ペータ)/, 'リーザ' => /.*(?:リーザ|妙|女|リー|リザ)/, 'アルビン' => /.*(?:アルビン|商|アル)/, 'カタリナ' => /.*(?:カタリナ|羊|リナ|カタ)/, 'オットー' => /.*(?:オットー|屋|オト)/, 'ヨアヒム' => /.*(?:ヨアヒム|青|ヨア)/, 'パメラ' => /.*(?:パメラ|娘|パメ|バメ)/, 'ヤコブ' => /.*(?:ヤコブ|農|ヤコ)/, 'レジーナ' => /.*(?:レジーナ|宿|レジ|女将)/, 'フリーデル' => /.*(?:フリーデル|修|尼|フリ|シス)/, } $images = { '楽天家 ゲルト' => 'body01.jpg', '村長 ヴァルター' => 'body02.jpg', '老人 モーリッツ' => 'body03.jpg', '神父 ジムゾン' => 'body04.jpg', '木こり トーマス' => 'body05.jpg', '旅人 ニコラス' => 'body06.jpg', 'ならず者 ディーター' => 'body07.jpg', '少年 ペーター' => 'body08.jpg', '少女 リーザ' => 'body09.jpg', '行商人 アルビン' => 'body10.jpg', '羊飼い カタリナ' => 'body11.jpg', 'パン屋 オットー' => 'body12.jpg', '青年 ヨアヒム' => 'body13.jpg', '村娘 パメラ' => 'body14.jpg', '農夫 ヤコブ' => 'body15.jpg', '宿屋の女主人 レジーナ' => 'body16.jpg', 'シスター フリーデル' => 'body17.jpg', } $face_images = { '楽天家 ゲルト' => 'face01.jpg', '村長 ヴァルター' => 'face02.jpg', '老人 モーリッツ' => 'face03.jpg', '神父 ジムゾン' => 'face04.jpg', '木こり トーマス' => 'face05.jpg', '旅人 ニコラス' => 'face06.jpg', 'ならず者 ディーター' => 'face07.jpg', '少年 ペーター' => 'face08.jpg', '少女 リーザ' => 'face09.jpg', '行商人 アルビン' => 'face10.jpg', '羊飼い カタリナ' => 'face11.jpg', 'パン屋 オットー' => 'face12.jpg', '青年 ヨアヒム' => 'face13.jpg', '村娘 パメラ' => 'face14.jpg', '農夫 ヤコブ' => 'face15.jpg', '宿屋の女主人 レジーナ' => 'face16.jpg', 'シスター フリーデル' => 'face17.jpg', } $colors = { '楽天家 ゲルト' => 'gerd', '村長 ヴァルター' => 'walter', '老人 モーリッツ' => 'moritz', '神父 ジムゾン' => 'simson', '木こり トーマス' => 'thomas', '旅人 ニコラス' => 'nicolas', 'ならず者 ディーター' => 'dieter', '少年 ペーター' => 'peter', '少女 リーザ' => 'liesa', '行商人 アルビン' => 'albin', '羊飼い カタリナ' => 'katharina', 'パン屋 オットー' => 'otto', '青年 ヨアヒム' => 'joachim', '村娘 パメラ' => 'pamela', '農夫 ヤコブ' => 'jacob', '宿屋の女主人 レジーナ' => 'regina', 'シスター フリーデル' => 'fridel', } $life_and_death_colors = { '生存'=>'', '死亡'=>'BGCOLOR(#aaaaaa):', } $role_colors = [ { #人間側……青、緑系 '占い師' => 'BGCOLOR(#ccffff):', '霊能者' => 'BGCOLOR(#ccccff):', '狩人' => 'BGCOLOR(#ccffcc):', '村人' => '', '共有者' => 'BGCOLOR(#ffffcc):', #中立……灰系 'ハムスター人間' => 'BGCOLOR(#cccccc):', #狼側……赤系 '狂人' => 'BGCOLOR(#ffccff):', '人狼' => 'BGCOLOR(#ffcccc):', }, { #JBオリジナル(風)仕様 '人狼' => 'BGCOLOR(#ffcccc):', '村人' => '', '占い師' => 'BGCOLOR(#ffffcc):', '霊能者' => 'BGCOLOR(#ccccff):', '狂人' => 'BGCOLOR(#cccccc):', '狩人' => 'BGCOLOR(#ffccaa):', '共有者' => 'BGCOLOR(#ccffcc):', 'ハムスター人間' => 'BGCOLOR(#ffccff):', }, { #まとめサイトテンプレート仕様 '人狼' => 'BGCOLOR(#ff9999):', '村人' => '', '占い師' => 'BGCOLOR(#ccccff):', '霊能者' => 'BGCOLOR(#ccffff):', '狂人' => 'BGCOLOR(#ffcc99):', '狩人' => 'BGCOLOR(#ccffcc):', '共有者' => 'BGCOLOR(#ffffcc):', 'ハムスター人間' => 'BGCOLOR(#ffaaff):', }, ] $new_message = '
' $day_delimit = 'd' $role_colors_type = 0 class Jinro def initialize @server_number = 0 @village_number = 0 @char_visible = { '楽天家 ゲルト'=>true, '村長 ヴァルター'=>true, '老人 モーリッツ'=>true, '神父 ジムゾン'=>true, '木こり トーマス'=>true, '旅人 ニコラス'=>true, 'ならず者 ディーター'=>true, '少年 ペーター'=>true, '少女 リーザ'=>true, '行商人 アルビン'=>true, '羊飼い カタリナ'=>true, 'パン屋 オットー'=>true, '青年 ヨアヒム'=>true, '村娘 パメラ'=>true, '農夫 ヤコブ'=>true, '宿屋の女主人 レジーナ'=>true, 'シスター フリーデル'=>true, } @role_visible = {'groan'=>true,'whisper'=>true,'say'=>true,'think'=>true} @impress_visible = {'名言'=>true,'怪しい'=>true,'注意'=>true} @user_id = "" @pass = "" @user_id2 = "" @pass2 = "" @session_id = '' @search_word = "" @search_reg = false @last_modified = "" @exist_days = [] @impresses = {} @proxy_address = "" @proxy_port = 8080 @big_mode = false @simple_mode = false @impress_mode = false @day_number = 0 @login_id = '' end def set_impress_mode(b) @impress_mode = b end def set_big_mode(b) @big_mode = b end def set_simple_mode(b) @simple_mode = b end def set_impress_visible(hash) @impress_visible = hash end def set_char_visible(hash) @char_visible = hash end def set_role_visible(hash) @role_visible = hash end def exist_days return @exist_days.join(' ') end def set_search_word(search_word, search_reg) @search_word = search_word @search_reg = search_reg end def set_user(user_id, pass, user_id2, pass2) # if !(@user_id2 == '' && @pass2 == '' && user_id2 == '' && pass2 == '') && (@user_id2 != user_id2 || @pass2 != pass2) # File::delete(TypeKey::KEY_CACHE_PATH) # end @user_id = user_id @pass = pass @user_id2 = user_id2 @pass2 = pass2 @session_id = get_session_id(@user_id2, @pass2) return @session_id end def set_proxy(proxy_address, proxy_port) @proxy_address = proxy_address @proxy_port = proxy_port end def load_ini() @last_modified = "" @exist_days = [] @impresses = {} @references = {} data = nil if FileTest.exist?("#{saved_folder_name()}/ini") File.open("#{saved_folder_name()}/ini") do |fin| data = Marshal.load(fin) @last_modified = data["last_modified"] || "" @exist_days = data["exist_days"] || [] @impresses = data["impresses"] || {} @references = data["references"] || {} end end @day_number = @exist_days.length - 1 end def save_ini() data = {"last_modified"=>@last_modified,"exist_days"=>@exist_days,"impresses"=>@impresses,"references"=>@references } File.open("#{saved_folder_name()}/ini","w") do |out| begin Marshal.dump(data,out) rescue # out << $! << $@<< "\n" end end end def start_http_raw(serv,port,&block) Net::HTTP.version_1_2 if @proxy_address == "" Net::HTTP.start(serv, port, &block) else Net::HTTP::Proxy(@proxy_address, @proxy_port).start(serv, port, &block) end end def start_http(&block) Net::HTTP.version_1_2 if @proxy_address == "" Net::HTTP.start($server_names[@server_number], 80, &block) else Net::HTTP::Proxy(@proxy_address, @proxy_port).start($server_names[@server_number], 80, &block) end end #rssをチェックする。更新されていればtrue =begin def check_rss(http) if @last_modified == "" return true end res = http.head("/#{$folder_names[@server_number]}/index.rb?vid=#{@village_number}&cmd=rss",{'User-Agent'=>'JB'}) if Time.parse(@last_modified) < Time.parse(res['Last-modified']) @last_modified = res['Last-modified'] return true else return false end end =end def http_get(http,str) res = nil if @user_id == "" res = http.get(str,{'User-Agent'=>'JB'}) else if @server_number == 4 res = http.get(str,{'User-Agent'=>'JB','Cookie'=>'login=' + CGI.escape("L:5%0AS:user_id%0AS:#{@user_id}%0AS:password%0AS:#{@pass}%0AH:L:1%3DL:2%2CL:3%3DL:4%0AEOF")}) elsif @server_number == 6 res = http.get(str,{'User-Agent'=>'JB','Cookie'=>"session_id=#{@session_id}"}) else res = http.get(str,{'User-Agent'=>'JB','Cookie'=>'login=' + CGI.escape("\{\"user_id\"%3D>\"#{@user_id}\"%2C%20\"password\"%3D>\"#{@pass}\"\}")}) end end if res.code == '200' return res end raise res.code end def http_get2(http,str) if @last_modified == "" return true,http_get(http,str) end res = nil if @user_id == "" res = http.get(str,{'User-Agent'=>'JB'})#,'If-Modified-Since'=>@last_modified else if @server_number == 4 res = http.get(str,{'User-Agent'=>'JB','Cookie'=>'login=' + CGI.escape("L:5%0AS:user_id%0AS:#{@user_id}%0AS:password%0AS:#{@pass}%0AH:L:1%3DL:2%2CL:3%3DL:4%0AEOF")}) elsif @server_number == 6 res = http.get(str,{'User-Agent'=>'JB','Cookie'=>"session_id=#{@session_id}"}) else res = http.get(str,{'User-Agent'=>'JB','Cookie'=>'login=' + CGI.escape("\{\"user_id\"%3D>\"#{@user_id}\"%2C%20\"password\"%3D>\"#{@pass}\"\}")}) end end if res.code == '200' return true,res end if res.code == '304' return false,res end raise res.code end def set_number(server_number,village_number) FileUtils.mkdir_p("#{saved_folder_name()}") save_ini() @server_number = server_number @village_number = village_number FileUtils.mkdir_p("#{saved_folder_name()}") load_ini() end #最後の発言取得 def get_last_delivery(ret) last_delivery = "" ret.scan(%r! .*?.*?.*?.*?!im){ |m| last_delivery = m } return last_delivery end #ログ結合 def bind(old,new) nstr = $new_message old.gsub!(%r!(#{nstr})!im,"") last_delivery = get_last_delivery(old) last_de_reg = %r!#{Regexp.quote(last_delivery)}(.*