Commit c4f8ee6d authored by 神楽坂玲奈's avatar 神楽坂玲奈

版本0.5.3 大厅实时刷新

parents e075ad12 e284688b
...@@ -65,4 +65,4 @@ Rake::RDocTask.new do |rdoc| ...@@ -65,4 +65,4 @@ Rake::RDocTask.new do |rdoc|
rdoc.options << '--line-numbers' rdoc.options << '--line-numbers'
end end
CLOBBER.include %w(error-程序出错请到论坛反馈.txt log.log profile.log config.yml doc ygocore/pics) + list('replay') + list('ygocore/replay') + list('.').keep_if{|file|File.basename(file) == "Thumbs.db"} + list("graphics/avatars").keep_if{|file|File.basename(file) =~ /.*_(?:small|middle|large)\.png/} + list("ygocore/deck").keep_if{|file|File.basename(file) != 'sample.ydk'} CLOBBER.include %w(error-程序出错请到论坛反馈.txt log.log profile.log config.yml doc ygocore/pics) + list('replay') + list('ygocore/replay') + list('.').keep_if{|file|File.basename(file) == "Thumbs.db"} + list("graphics/avatars").keep_if{|file|File.basename(file) =~ /.*_(?:small|middle|large)\.png/} + list("ygocore/deck").keep_if{|file|File.basename(file) != 'sample.ydk'}
\ No newline at end of file
require 'open-uri' require 'open-uri'
require "fileutils" require "fileutils"
require_relative 'card' require_relative 'card'
module Update module Update
Version = '0.5.3' Version = '0.5.3'
URL = "http://card.touhou.cc/mycard/update.json?version=#{Version}" URL = "http://card.touhou.cc/mycard/update.json?version=#{Version}"
class <<self class <<self
attr_reader :thumbnails, :images, :status attr_reader :thumbnails, :images, :status
def start def start
Dir.glob("mycard-update-*-*.zip") do |file| Dir.glob("mycard-update-*-*.zip") do |file|
file =~ /mycard-update-(.+?)-(.+?)\.zip/ file =~ /mycard-update-(.+?)-(.+?)\.zip/
if $1 <= Version and $2 > Version if $1 <= Version and $2 > Version
$log.info('安装更新'){file} $log.info('安装更新'){file}
WM::set_caption("MyCard - 正在更新 #{Version} -> #{$2}", "MyCard") WM::set_caption("MyCard - 正在更新 #{Version} -> #{$2}", "MyCard")
require 'zip/zip' require 'zip/zip'
Zip::ZipFile::open(file) do |zip| Zip::ZipFile::open(file) do |zip|
zip.each do |f| zip.each do |f|
if !File.directory?(f.name) if !File.directory?(f.name)
FileUtils.mkdir_p(File.dirname(f.name)) FileUtils.mkdir_p(File.dirname(f.name))
end end
f.extract{true} f.extract{true}
end end
end rescue $log.error('安装更新出错'){file+$!.inspect+$!.backtrace.inspect} end rescue $log.error('安装更新出错'){file+$!.inspect+$!.backtrace.inspect}
Version.replace $2 Version.replace $2
File.delete file File.delete file
@updated = true @updated = true
end end
end end
if @updated if @updated
IO.popen('./mycard') IO.popen('./mycard')
$scene = nil $scene = nil
end end
@images = [] @images = []
@thumbnails = [] @thumbnails = []
@status = '正在检查更新' @status = '正在检查更新'
Thread.new do Thread.new do
open(URL) do |file| open(URL) do |file|
require 'json' require 'json'
reply = file.read reply = file.read
$log.info('下载更新-服务器回传'){reply} $log.info('下载更新-服务器回传'){reply}
reply = JSON.parse(reply) reply = JSON.parse(reply)
$log.info('下载更新-解析后'){reply.inspect} $log.info('下载更新-解析后'){reply.inspect}
reply.each do |fil| reply.each do |fil|
name = File.basename fil name = File.basename fil
@status.replace "正在下载更新#{name}" @status.replace "正在下载更新#{name}"
open(fil, 'rb') do |fi| open(fil, 'rb') do |fi|
$log.info('下载完毕'){name} $log.info('下载完毕'){name}
open(name, 'wb') do |f| open(name, 'wb') do |f|
f.write fi.read f.write fi.read
end end
end rescue $log.error('下载更新'){'下载更新失败'} end rescue $log.error('下载更新'){'下载更新失败'}
end end
end rescue $log.error('检查更新'){'检查更新失败'} end rescue $log.error('检查更新'){'检查更新失败'}
if File.file? "ygocore/cards.cdb" if File.file? "ygocore/cards.cdb"
require 'sqlite3' require 'sqlite3'
db = SQLite3::Database.new( "ygocore/cards.cdb" ) db = SQLite3::Database.new( "ygocore/cards.cdb" )
db.execute( "select id from datas" ) do |row| db.execute( "select id from datas" ) do |row|
@thumbnails << row[0] @thumbnails << row[0]
end end
@images.replace @thumbnails @images.replace @thumbnails
if !File.directory?('ygocore/pics/thumbnail') if !File.directory?('ygocore/pics/thumbnail')
FileUtils.mkdir_p('ygocore/pics/thumbnail') FileUtils.mkdir_p('ygocore/pics/thumbnail')
end end
existed_thumbnails = [] existed_thumbnails = []
Dir.foreach("ygocore/pics/thumbnail") do |file| Dir.foreach("ygocore/pics/thumbnail") do |file|
if file =~ /(\d+)\.jpg/ if file =~ /(\d+)\.jpg/
existed_thumbnails << $1.to_i existed_thumbnails << $1.to_i
end end
end end
@thumbnails -= existed_thumbnails @thumbnails -= existed_thumbnails
existed_images = [] existed_images = []
Dir.foreach("ygocore/pics") do |file| Dir.foreach("ygocore/pics") do |file|
if file =~ /(\d+)\.jpg/ if file =~ /(\d+)\.jpg/
existed_images << $1.to_i existed_images << $1.to_i
end end
end end
@images -= existed_images @images -= existed_images
existed_images = [] existed_images = []
if (!@images.empty? or !@thumbnails.empty?) and File.file?("#{Card::PicPath}/1.jpg") if (!@images.empty? or !@thumbnails.empty?) and File.file?("#{Card::PicPath}/1.jpg")
db_mycard = SQLite3::Database.new( "data/data.sqlite" ) db_mycard = SQLite3::Database.new( "data/data.sqlite" )
db_mycard.execute( "select id, number from `yu-gi-oh` where number in (#{(@images+@thumbnails).uniq.collect{|number|"'%08d'" % number}.join(',')})" ) do |row| db_mycard.execute( "select id, number from `yu-gi-oh` where number in (#{(@images+@thumbnails).uniq.collect{|number|"'%08d'" % number}.join(',')})" ) do |row|
id = row[0] id = row[0]
number = row[1].to_i number = row[1].to_i
src = "#{Card::PicPath}/#{id}.jpg" src = "#{Card::PicPath}/#{id}.jpg"
dest = "ygocore/pics/#{number}.jpg" dest = "ygocore/pics/#{number}.jpg"
dest_thumb = "ygocore/pics/thumbnail/#{number}.jpg" dest_thumb = "ygocore/pics/thumbnail/#{number}.jpg"
if File.file?(src) if File.file?(src)
@status.replace "检测到存在iDuel卡图 正在导入 #{id}.jpg" @status.replace "检测到存在iDuel卡图 正在导入 #{id}.jpg"
existed_images << number existed_images << number
if !File.exist?(dest) if !File.exist?(dest)
FileUtils.copy_file(src, dest) FileUtils.copy_file(src, dest)
FileUtils.copy_file(src, dest_thumb) FileUtils.copy_file(src, dest_thumb)
end end
end end
end end
end end
@images -= existed_images @images -= existed_images
@thumbnails -= existed_images @thumbnails -= existed_images
@thumbnails = (@thumbnails & @images) + (@thumbnails - @images) @thumbnails = (@thumbnails & @images) + (@thumbnails - @images)
unless @thumbnails.empty? and @images.empty? unless @thumbnails.empty? and @images.empty?
$log.info('待下载的完整卡图'){@images.inspect} $log.info('待下载的完整卡图'){@images.inspect}
$log.info('待下载的缩略卡图'){@thumbnails.inspect} $log.info('待下载的缩略卡图'){@thumbnails.inspect}
threads = 5.times.collect do threads = 5.times.collect do
thread = Thread.new do thread = Thread.new do
while number = @thumbnails.pop while number = @thumbnails.pop
@status.replace "正在下载缩略卡图 (剩余#{@thumbnails.size}张)" @status.replace "正在下载缩略卡图 (剩余#{@thumbnails.size}张)"
open("http://card.touhou.cc/images/cards/ygocore/thumbnail/#{number}.jpg", 'rb') do |remote| open("http://card.touhou.cc/images/cards/ygocore/thumbnail/#{number}.jpg", 'rb') do |remote|
next if File.file? "ygocore/pics/thumbnail/#{number}.jpg" next if File.file? "ygocore/pics/thumbnail/#{number}.jpg"
#$log.debug('下载缩略卡图'){"http://card.touhou.cc/images/cards/ygocore/thumbnail/#{number}.jpg 到 ygocore/pics/thumbnail/#{number}.jpg" } #$log.debug('下载缩略卡图'){"http://card.touhou.cc/images/cards/ygocore/thumbnail/#{number}.jpg 到 ygocore/pics/thumbnail/#{number}.jpg" }
open("ygocore/pics/thumbnail/#{number}.jpg", 'wb') do |local| open("ygocore/pics/thumbnail/#{number}.jpg", 'wb') do |local|
local.write remote.read local.write remote.read
end end
end rescue $log.error('下载缩略出错'){"http://card.touhou.cc/images/cards/ygocore/thumbnail/#{number}.jpg 到 ygocore/pics/thumbnail/#{number}.jpg" } end rescue $log.error('下载缩略出错'){"http://card.touhou.cc/images/cards/ygocore/thumbnail/#{number}.jpg 到 ygocore/pics/thumbnail/#{number}.jpg" }
end end
while number = @images.pop while number = @images.pop
@status.replace "正在下载完整卡图 (剩余#{@images.size}张)" @status.replace "正在下载完整卡图 (剩余#{@images.size}张)"
#$log.debug('下载完整卡图'){"http://card.touhou.cc/images/cards/ygocore/#{number}.jpg 到 ygocore/pics/#{number}.jpg" } #$log.debug('下载完整卡图'){"http://card.touhou.cc/images/cards/ygocore/#{number}.jpg 到 ygocore/pics/#{number}.jpg" }
open("http://card.touhou.cc/images/cards/ygocore/#{number}.jpg", 'rb') do |remote| open("http://card.touhou.cc/images/cards/ygocore/#{number}.jpg", 'rb') do |remote|
next if File.file? "ygocore/pics/#{number}.jpg" next if File.file? "ygocore/pics/#{number}.jpg"
open("ygocore/pics/#{number}.jpg", 'wb') do |local| open("ygocore/pics/#{number}.jpg", 'wb') do |local|
local.write remote.read local.write remote.read
end end
end rescue $log.error('下载完整卡图出错'){"http://card.touhou.cc/images/cards/ygocore/#{number}.jpg 到 ygocore/pics/#{number}.jpg" } end rescue $log.error('下载完整卡图出错'){"http://card.touhou.cc/images/cards/ygocore/#{number}.jpg 到 ygocore/pics/#{number}.jpg" }
end end
end end
thread.priority = -1 thread.priority = -1
thread thread
end end
threads.each{|thread|thread.join} threads.each{|thread|thread.join}
end end
end rescue $log.error('卡图更新'){'找不到ygocore卡片数据库'} end rescue $log.error('卡图更新'){'找不到ygocore卡片数据库'}
@status = nil @status = nil
end.priority = -1 end.priority = -1
end end
end end
end end
\ No newline at end of file
class Game_Event class Game_Event
def self.parse(header, data) def self.parse(header, data)
case header case header
when :login when :login
if data if data
Login.new parse_user data Login.new parse_user data
else else
Error.new('登录', '用户名或密码错误') Error.new('登录', '用户名或密码错误')
end end
when :users when :users
AllUsers.new data.collect{|user|parse_user(user)} AllUsers.new data.collect{|user|parse_user(user)}
when :rooms when :rooms
rooms_wait = [] rooms_wait = []
rooms_start = [] rooms_start = []
data.each do |room| data.each do |room|
room = parse_room(room) room = parse_room(room)
if room.full? if room.full?
rooms_start << room rooms_start << room
else else
rooms_wait << room rooms_wait << room
end end
end end
AllRooms.new rooms_wait + rooms_start AllRooms.new rooms_wait + rooms_start
when :newuser when :newuser
NewUser.new parse_user data NewUser.new parse_user data
when :missinguser when :missinguser
MissingUser.new parse_user data MissingUser.new parse_user data
when :newroom when :newroom
NewRoom.new parse_room data NewRoom.new parse_room data
when :missingroom when :missingroom
MissingRoom.new parse_room data MissingRoom.new parse_room data
when :chat when :chat
case data[:channel] case data[:channel]
when :lobby when :lobby
Chat.new ChatMessage.new User.new(data[:from][:id],data[:from][:name]), data[:message], :lobby Chat.new ChatMessage.new User.new(data[:from][:id],data[:from][:name]), data[:message], :lobby
else else
Chat.new ChatMessage.new User.new(data[:from][:id],data[:from][:name]), data[:message], User.new(data[:channel]) Chat.new ChatMessage.new User.new(data[:from][:id],data[:from][:name]), data[:message], User.new(data[:channel])
end end
end end
end end
def self.parse_room(room) def self.parse_room(room)
result = Room.new(room[:id], room[:name]) result = Room.new(room[:id], room[:name])
result.player1 = room[:player1] && parse_user(room[:player1]) result.player1 = room[:player1] && parse_user(room[:player1])
result.player2 = room[:player2] && parse_user(room[:player2]) result.player2 = room[:player2] && parse_user(room[:player2])
result.pvp = room[:pvp] result.pvp = room[:pvp]
result.match = room[:match] result.match = room[:match]
result.status = room[:status] result.status = room[:status]
result result
end end
def self.parse_user(user) def self.parse_user(user)
User.new(user[:id], user[:name], user[:certified]) User.new(user[:id], user[:name], user[:certified])
end end
end end
\ No newline at end of file
...@@ -5,6 +5,7 @@ require 'open-uri' ...@@ -5,6 +5,7 @@ require 'open-uri'
class Ygocore < Game class Ygocore < Game
attr_reader :username attr_reader :username
attr_reader :password attr_reader :password
attr_reader :irc_users
@@config = YAML.load_file("lib/ygocore/server.yml") @@config = YAML.load_file("lib/ygocore/server.yml")
def initialize def initialize
super super
...@@ -13,6 +14,7 @@ class Ygocore < Game ...@@ -13,6 +14,7 @@ class Ygocore < Game
load 'lib/ygocore/room.rb' load 'lib/ygocore/room.rb'
load 'lib/ygocore/scene_lobby.rb' load 'lib/ygocore/scene_lobby.rb'
require 'json' require 'json'
@irc_users = []
end end
def refresh_interval def refresh_interval
60 60
...@@ -38,6 +40,58 @@ class Ygocore < Game ...@@ -38,6 +40,58 @@ class Ygocore < Game
end end
end end
def user=(user)
super
begin
require 'net/yail'
$log.info('聊天'){user.inspect}
@irc = Net::YAIL.new(
address: 'card.touhou.cc',
username: hexencode(user.id),
nicknames: [hexencode(user.name), hexencode("#{user.name}_#{rand(10000)}"), hexencode("#{user.name}_#{rand(10000)}")])
$log.info('聊天连接')
@irc.on_welcome proc { |event| $log.info('连接聊天服务器成功'); Game_Event.push(Game_Event::Chat.new(ChatMessage.new(User.new(:system, 'system'), '聊天服务器连接成功,聊天功能测试中,可能引发程序崩溃,如果崩得过于频繁请暂时不要使用.', :lobby))); @irc.join('#lobby') }
@irc.hearing_msg {|event|
user = User.new(hexdecode(event.msg.user).to_sym, hexdecode(event.nick))
Game_Event.push Game_Event::Chat.new(ChatMessage.new(user, event.message, event.channel ? event.channel[1,event.channel.size-1].to_sym : user))
}
@irc.heard_namreply{|event|
@irc_users.concat @irc.instance_variable_get(:@nicklist).collect {|user|
User.new(hexdecode(user).to_sym, hexdecode(user))
}
Game_Event.push Game_Event::AllUsers.new(@users|@irc_users)
$log.info('irc用户列表'){user}
}
@irc.heard_join{|event|
user = User.new(hexdecode(event.msg.user).to_sym, hexdecode(event.nick))
Game_Event.push Game_Event::NewUser.new(user)
$log.info('irc用户上线'){user}
}
@irc.heard_quit{|event|
user = User.new(hexdecode(event.msg.user).to_sym, hexdecode(event.nick))
Game_Event.push Game_Event::MissingUser.new(user)
$log.info('irc用户下线'){user}
}
#@irc.hearing_join {}
$log.info('聊天开始监听')
@irc.start_listening
$log.info('聊天加载完毕')
rescue Exception => exception
$log.error('聊天出错'){[exception.inspect, *exception.backtrace].collect{|str|str.encode("UTF-8")}.join("\n")}
Game_Event.push(Game_Event::Chat.new(ChatMessage.new(User.new(:system, 'system'), '连接聊天服务器失败', :lobby)))
end
end
def chat(chatmessage)
$log.info('发送聊天消息'){chatmessage.inspect}
return unless @irc
case chatmessage.channel
when Symbol
@irc.msg "##{chatmessage.channel}", chatmessage.message
when User
@irc.msg hexencode(chatmessage.channel.id), chatmessage.message
end
$log.info('发送聊天消息完毕')
end
def host(room_name, room_config) def host(room_name, room_config)
room = Room.new(0, room_name) room = Room.new(0, room_name)
room.pvp = room_config[:pvp] room.pvp = room_config[:pvp]
...@@ -65,6 +119,11 @@ class Ygocore < Game ...@@ -65,6 +119,11 @@ class Ygocore < Game
@recv.exit if @recv @recv.exit if @recv
@recv = nil @recv = nil
end end
def exit
(@irc.quit if @irc) rescue nil
@irc = nil
@chat_thread = nil
end
def ygocore_path def ygocore_path
"ygocore/gframe.exe" "ygocore/gframe.exe"
end end
...@@ -193,4 +252,4 @@ class Ygocore < Game ...@@ -193,4 +252,4 @@ class Ygocore < Game
end end
end end
get_announcements get_announcements
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