Commit 8230ce54 authored by 神楽坂玲奈's avatar 神楽坂玲奈

fix

parent 3a302366
source 'https://rubygems.org' source 'https://rubygems.org'
gem 'websocket-eventmachine-server' gem 'websocket-eventmachine-server'
gem 'em-http-request'
gem 'rb-notifu' gem 'rb-notifu'
gem 'i18n' gem 'i18n'
gem 'locale' gem 'locale'
gem 'mail' gem 'mail'
gem 'sqlite3'
gem 'data-uri'
\ No newline at end of file
...@@ -24,3 +24,18 @@ resource: ...@@ -24,3 +24,18 @@ resource:
height: 16 height: 16
color: 32 color: 32
file : icon.ico file : icon.ico
version:
file_version_number : 2.0.0
product_version_number: 5.6.7.8
comments : コメント
company_name : MyCard
legal_copyright : 著作権情報
legal_trademarks : 商標情報
file_version : 2.0.0
product_version : 製品バージョン(文字列)
product_name : Mycard Lite
file_description : Mycard的核心
internal_name : mycard-lite
original_filename : mycard.exe
private_build : プライベートビルド情報
special_build : スペシャルビルド情報
\ No newline at end of file
#encoding: UTF-8 #encoding: UTF-8
# = Building # = Building
if defined?(Ocra) or defined?(Exerb) if defined?(Ocra) or defined?(Exerb)
#stdlib
require 'json' require 'json'
require 'pathname' require 'pathname'
require 'fileutils' require 'fileutils'
require 'uri' require 'uri'
require 'open-uri' require 'open-uri'
require 'win32api' require 'win32api'
require 'fiddle'
require 'win32ole' require 'win32ole'
require 'win32/registry' require 'win32/registry'
require 'socket'
require 'digest/md5'
#gems
require 'websocket-eventmachine-server' require 'websocket-eventmachine-server'
require 'em-http' require 'em-http'
require 'rb-notifu' require 'rb-notifu'
require 'sqlite3' require 'sqlite3'
require 'socket' require 'data-uri'
require 'digest/md5'
#open-uri protocol #open-uri protocol
require 'net/http' require 'net/http'
#websocket autoload #websocket autoload
WebSocket::Error
WebSocket::ExceptionHandler
WebSocket::Frame::Base WebSocket::Frame::Base
WebSocket::Frame::Data WebSocket::Frame::Data
WebSocket::Frame::Handler::Base WebSocket::Frame::Handler::Base
...@@ -58,8 +61,8 @@ begin ...@@ -58,8 +61,8 @@ begin
Version = "2.0.0" Version = "2.0.0"
Platform = (RUBY_PLATFORM['mswin'] || RUBY_PLATFORM['mingw']) ? :win32 : :linux Platform = (RUBY_PLATFORM['mswin'] || RUBY_PLATFORM['mingw']) ? :win32 : :linux
System_Encoding = Encoding.find("locale") rescue Encoding.find(Encoding.locale_charmap) System_Encoding = Encoding.find("locale") rescue Encoding.find(Encoding.locale_charmap)
Dir.chdir File.dirname(defined?(ExerbRuntime) ? ExerbRuntime.filepath.dup.force_encoding(System_Encoding).encode!(Encoding::UTF_8) : ENV["OCRA_EXECUTABLE"] || __FILE__) pwd = File.dirname(defined?(ExerbRuntime) ? ExerbRuntime.filepath.dup.force_encoding(System_Encoding).encode!(Encoding::UTF_8) : ENV["OCRA_EXECUTABLE"] || __FILE__)
Dir.chdir pwd
# == config # == config
Config = { Config = {
...@@ -125,8 +128,9 @@ begin ...@@ -125,8 +128,9 @@ begin
0, # lpfnHook L 0, # lpfnHook L
0 # lpTemplateName L 0 # lpTemplateName L
].pack("LLLPLLLPLPLPPLS2L4") ].pack("LLLPLLLPLPLPPLS2L4")
Dir.chdir('.') do
GetOpenFileName.call(ofn) GetOpenFileName.call(ofn)
Dir.chdir pwd
result = szFile.delete("\0".encode(Encoding::UTF_16LE)).encode(Encoding::UTF_8) result = szFile.delete("\0".encode(Encoding::UTF_16LE)).encode(Encoding::UTF_8)
if !result.empty? and File.file? result if !result.empty? and File.file? result
...@@ -137,7 +141,6 @@ begin ...@@ -137,7 +141,6 @@ begin
exit exit
end end
end end
end
def save_config(config=Config) def save_config(config=Config)
...@@ -194,11 +197,26 @@ begin ...@@ -194,11 +197,26 @@ begin
def service def service
require 'socket' require 'socket'
TCPServer.new('0.0.0.0', Config['port']).close rescue return #check port in use, seems eventmachine enabled IP_REUSEADDR. begin
TCPServer.new('0.0.0.0', Config['port']).close
rescue Errno::EADDRINUSE
return #check port in use, seems eventmachine enabled IP_REUSEADDR.
end
require 'websocket-eventmachine-server' require 'websocket-eventmachine-server'
EventMachine.run do EventMachine.run do
ygopro_version = nil ygopro_version = nil
connections = [] connections = []
EventMachine.error_handler { |exception|
error = "程序出现了错误,请把你的操作及以下信息发送至zh99998@gmail.com来帮助我们完善程序
an error occurs, please send your operation and message below to zh99998@gmail.com
#{exception.inspect.encode(Encoding::UTF_8)}
#{exception.backtrace.join("\n").encode(Encoding::UTF_8)}"
open('error.txt', 'w:utf-8') { |f| f.write error }
spawn 'notepad', 'error.txt'
}
WebSocket::EventMachine::Server.start(:host => "0.0.0.0", :port => Config['port']) do |ws| WebSocket::EventMachine::Server.start(:host => "0.0.0.0", :port => Config['port']) do |ws|
ws.onopen do ws.onopen do
connections.push ws connections.push ws
...@@ -208,7 +226,7 @@ begin ...@@ -208,7 +226,7 @@ begin
end end
ws.onmessage do |msg, type| ws.onmessage do |msg, type|
ws.send parse(msg).to_json ws.send parse(msg.encode!(Encoding::UTF_8)).to_json
end end
ws.onclose do ws.onclose do
...@@ -378,12 +396,32 @@ begin ...@@ -378,12 +396,32 @@ begin
end end
def elevate(path, args, pwd = Dir.pwd) def elevate(path, args, pwd = Dir.pwd)
web path, args.join(' '), Dir.pwd, 'runas' web path, args.collect { |arg| arg.inspect }.join(' '), Dir.pwd, 'runas'
end end
end end
def run_ygopro(parameter) def run_ygopro(parameter)
spawn File.basename(Config['ygopro']['path']), parameter, chdir: File.dirname(Config['ygopro']['path']) spawn File.basename(Config['ygopro']['path']), *parameter, chdir: File.dirname(Config['ygopro']['path']).encode(System_Encoding)
require 'fiddle'
user32 = Fiddle.dlopen('user32')
findWindow = Fiddle::Function.new(
user32['FindWindow'],
[Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP],
Fiddle::TYPE_INT
)
setForegroundWindow = Fiddle::Function.new(
user32['SetForegroundWindow'],
[Fiddle::TYPE_INT],
Fiddle::TYPE_CHAR
)
100.times do
if (hwnd = findWindow.call('CIrrDeviceWin32', nil)) != 0
setForegroundWindow.call(hwnd)
break
else
sleep 0.1
end
end
end end
def join(room) def join(room)
...@@ -401,6 +439,113 @@ begin ...@@ -401,6 +439,113 @@ begin
run_ygopro('-j') run_ygopro('-j')
end end
def rich_join(room)
if room['players'] && ((room['players']['0'] && room['players']['0']['avatar']) || ((room['players']['1'] && room['players']['1']['avatar'])))
require 'rmagick'
require "base64"
bg_path = File.join(File.dirname(Config['ygopro']['path']), 'textures', 'bg.jpg')
bg = Magick::ImageList.new.from_blob IO.binread bg_path
finished = 0
if room['players']['0'] && room['players']['0']['avatar']
if room['players']['0']['avatar'][0, 5] == 'data:'
require 'data-uri'
avatar_player = Magick::ImageList.new.from_blob DataURI.decode(room['players']['0']['avatar'])
avatar_player.crop_resized!(96, 96, Magick::NorthGravity)
bg.composite!(avatar_player, 330, 60, Magick::CopyCompositeOp)
finished += 1
elsif File.file? avatar_player_path = File.join('avatars', File.basename(room['players']['0']['avatar']))
avatar_player = Magick::ImageList.new.from_blob IO.binread avatar_player_path
avatar_player.crop_resized!(96, 96, Magick::NorthGravity)
bg.composite!(avatar_player, 330, 60, Magick::CopyCompositeOp)
finished += 1
else
http = EventMachine::HttpRequest.new(room['players']['0']['avatar'], connect_timeout: 5, inactivity_timeout: 10).get redirects: 5
http.callback {
if http.response_header.status == 200
avatar_player = Magick::ImageList.new.from_blob http.response
avatar_player.crop_resized!(96, 96, Magick::NorthGravity)
bg.composite!(avatar_player, 330, 60, Magick::CopyCompositeOp)
Dir.mkdir 'avatars' unless File.directory? 'avatars'
IO.binwrite avatar_player_path, http.response
end
finished += 1
if finished == 2
File.rename bg_path, File.join(File.dirname(bg_path), 'bg_origin.jpg')
bg.write File.join(File.dirname(Config['ygopro']['path']), 'textures', 'bg.jpg')
parse_uri(room['url_mycard'])
EventMachine::Timer.new(3) { File.rename File.join(File.dirname(bg_path), 'bg_origin.jpg'), bg_path }
end
}
http.errback { |http|
puts http
finished += 1
if finished == 2
File.rename bg_path, File.join(File.dirname(bg_path), 'bg_origin.jpg')
bg.write File.join(File.dirname(Config['ygopro']['path']), 'textures', 'bg.jpg')
parse_uri(room['url_mycard'])
EventMachine::Timer.new(3) { File.rename File.join(File.dirname(bg_path), 'bg_origin.jpg'), bg_path }
end
}
end
else
finished += 1
end
if room['players']['1'] && room['players']['1']['avatar']
if room['players']['1']['avatar'][0, 5] == 'data:'
require 'data-uri'
avatar_opponent = Magick::ImageList.new.from_blob DataURI.decode(room['players']['1']['avatar'])
avatar_opponent.crop_resized!(96, 96, Magick::NorthGravity)
bg.composite!(avatar_opponent, 989-96, 60, Magick::CopyCompositeOp)
finished += 1
elsif File.file? avatar_opponent_path = File.join('avatars', File.basename(room['players']['1']['avatar']))
avatar_opponent = Magick::ImageList.new.from_blob IO.binread avatar_opponent_path
avatar_opponent.crop_resized!(96, 96, Magick::NorthGravity)
bg.composite!(avatar_opponent, 989-96, 60, Magick::CopyCompositeOp)
finished += 1
else
http = EventMachine::HttpRequest.new(room['players']['1']['avatar'], connect_timeout: 5, inactivity_timeout: 10).get redirects: 5
http.callback {
if http.response_header.status == 200
avatar_opponent = Magick::ImageList.new.from_blob http.response
avatar_opponent.crop_resized!(96, 96, Magick::NorthGravity)
bg.composite!(avatar_opponent, 989-120, 60, Magick::CopyCompositeOp)
Dir.mkdir 'avatars' unless File.directory? 'avatars'
IO.binwrite avatar_opponent_path, http.response
end
finished += 1
if finished == 2
File.rename bg_path, File.join(File.dirname(bg_path), 'bg_origin.jpg')
bg.write File.join(File.dirname(Config['ygopro']['path']), 'textures', 'bg.jpg')
parse_uri(room['url_mycard'])
EventMachine::Timer.new(3) { File.rename File.join(File.dirname(bg_path), 'bg_origin.jpg'), bg_path }
end
}
http.errback { |http|
finished += 1
if finished == 2
File.rename bg_path, File.join(File.dirname(bg_path), 'bg_origin.jpg')
bg.write File.join(File.dirname(Config['ygopro']['path']), 'textures', 'bg.jpg')
parse_uri(room['url_mycard'])
EventMachine::Timer.new(3) { File.rename File.join(File.dirname(bg_path), 'bg_origin.jpg'), bg_path }
end
}
end
else
finished += 1
end
if finished == 2
File.rename bg_path, File.join(File.dirname(bg_path), 'bg_origin.jpg')
bg.write File.join(File.dirname(Config['ygopro']['path']), 'textures', 'bg.jpg')
parse_uri(room['url_mycard'])
EventMachine::Timer.new(3) { File.rename File.join(File.dirname(bg_path), 'bg_origin.jpg'), bg_path }
end
else
parse_uri(room['url_mycard'])
end
end
def deck(deck) def deck(deck)
File.rename(File.join(File.dirname(Config['ygopro']['path']), 'deck', deck + '.ydk'), File.join(File.dirname(Config['ygopro']['path']), 'deck', deck.gsub!(' ', '_') + '.ydk')) if deck[' '] File.rename(File.join(File.dirname(Config['ygopro']['path']), 'deck', deck + '.ydk'), File.join(File.dirname(Config['ygopro']['path']), 'deck', deck.gsub!(' ', '_') + '.ydk')) if deck[' ']
options = load_system_conf options = load_system_conf
...@@ -432,10 +577,13 @@ begin ...@@ -432,10 +577,13 @@ begin
registed? registed?
when 'mycard:///' when 'mycard:///'
service service
when /mycard:\/\/(.*)/ when /^mycard:\/\/(.*)$/
parse_uri(command) parse_uri(command)
when /.*\.(?:ydk|yrp)$/ when /^.*\.(?:ydk|yrp)$/
parse_path(command) #解析函数可以分开 parse_path(command) #解析函数可以分开
when /^join:(.*)$/
room = JSON.parse $1
rich_join(room)
end end
end end
...@@ -542,7 +690,9 @@ begin ...@@ -542,7 +690,9 @@ begin
else else
register if !registed? register if !registed?
if File.file? 'nw.exe' if File.file? 'nw.exe'
spawn 'nw.exe' spawn 'nw.exe', '.'
elsif File.file? 'node-webkit/nw.exe'
spawn 'node-webkit/nw.exe', '.'
elsif File.file? 'ruby\bin\rubyw.exe' elsif File.file? 'ruby\bin\rubyw.exe'
spawn 'ruby\bin\rubyw.exe', '-KU', 'lib/main.rb' spawn 'ruby\bin\rubyw.exe', '-KU', 'lib/main.rb'
else else
...@@ -550,12 +700,13 @@ begin ...@@ -550,12 +700,13 @@ begin
end end
service service
end end
rescue => exception rescue SystemExit
rescue Exception => exception
error = "程序出现了错误,请把你的操作及以下信息发送至zh99998@gmail.com来帮助我们完善程序 error = "程序出现了错误,请把你的操作及以下信息发送至zh99998@gmail.com来帮助我们完善程序
an error occurs, please send your operation and message below to zh99998@gmail.com an error occurs, please send your operation and message below to zh99998@gmail.com
#{exception.inspect} #{exception.inspect.encode(Encoding::UTF_8)}
#{exception.backtrace.join("\n")}" #{exception.backtrace.join("\n").encode(Encoding::UTF_8)}"
open('error.txt', 'w:utf-8') { |f| f.write error } open('error.txt', 'w:utf-8') { |f| f.write error }
spawn 'notepad', 'error.txt' spawn 'notepad', 'error.txt'
end end
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment