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

xmpp

parent 7be8d5bf
...@@ -39,6 +39,9 @@ class Game ...@@ -39,6 +39,9 @@ class Game
def refresh_interval def refresh_interval
5 5
end end
def show_chat_self
false
end
end end
...@@ -124,6 +124,9 @@ class Iduel < Game ...@@ -124,6 +124,9 @@ class Iduel < Game
end end
end end
end end
def show_chat_self
true
end
private private
def connect def connect
require 'socket' require 'socket'
......
...@@ -27,11 +27,9 @@ class Window_Chat < Window_Scrollable ...@@ -27,11 +27,9 @@ class Window_Chat < Window_Scrollable
if !@chat_input.value.empty? if !@chat_input.value.empty?
chatmessage = ChatMessage.new($game.user, @chat_input.value, @channel) chatmessage = ChatMessage.new($game.user, @chat_input.value, @channel)
$game.chat chatmessage $game.chat chatmessage
Game_Event.push Game_Event::Chat.new(chatmessage) Game_Event.push Game_Event::Chat.new(chatmessage) if $game.show_chat_self
true true
end end
when :ESC
true
end end
end end
@chat_input.refresh @chat_input.refresh
......
...@@ -7,8 +7,8 @@ class Game_Event ...@@ -7,8 +7,8 @@ class Game_Event
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 = []
...@@ -21,21 +21,21 @@ class Game_Event ...@@ -21,21 +21,21 @@ class Game_Event
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)
......
...@@ -15,6 +15,8 @@ class Ygocore < Game ...@@ -15,6 +15,8 @@ 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'
require 'xmpp4r/client'
require 'xmpp4r/muc'
end end
def refresh_interval def refresh_interval
...@@ -24,7 +26,52 @@ class Ygocore < Game ...@@ -24,7 +26,52 @@ class Ygocore < Game
def login(username, password) def login(username, password)
@username = username @username = username
@password = password @password = password
@nickname_conflict = []
@@im = Jabber::Client.new(Jabber::JID::new(@username, 'my-card.in', 'mycard'))
@@im_room = Jabber::MUC::MUCClient.new(@@im)
#Jabber.debug = true
@@im.on_exception do |exception, c, where|
$log.error('聊天出错') { [exception, c, where] }
if where == :close
Game_Event.push(Game_Event::Chat.new(ChatMessage.new(User.new(:system, 'System'), '聊天连接断开, 可能是网络问题或帐号从其他地点登录')))
else
Game_Event.push(Game_Event::Chat.new(ChatMessage.new(User.new(:system, 'System'), '聊天连接断开, 5秒后重新连接')))
sleep 5
im_connect
end
end
@@im_room.add_message_callback do |m|
user = m.from.resource == nickname ? @user : User.new(m.from.resource.to_sym, m.from.resource)
Game_Event.push Game_Event::Chat.new ChatMessage.new(user, m.body, :lobby) rescue $log.error('收到聊天消息') { $! }
end
@@im_room.add_private_message_callback do |m|
if m.body #忽略无消息的正在输入等内容
user = m.from.resource == nickname ? @user : User.new(m.from.resource.to_sym, m.from.resource)
Game_Event.push Game_Event::Chat.new ChatMessage.new(user, m.body, user) rescue $log.error('收到私聊消息') { $! }
end
end
@@im_room.add_join_callback do |m|
Game_Event.push Game_Event::NewUser.new User.new m.from.resource.to_sym, m.from.resource
end
@@im_room.add_leave_callback do |m|
Game_Event.push Game_Event::MissingUser.new User.new m.from.resource.to_sym, m.from.resource
end
connect connect
im_connect
end
def nickname
return @nickname if @nickname
if @nickname_conflict.include? @username
1.upto(9) do |i|
result = "#{@username}-#{i}"
return result unless @nickname_conflict.include? result
end
raise 'can`t get available nickname'
else
@username
end
end end
def connect def connect
...@@ -35,12 +82,42 @@ class Ygocore < Game ...@@ -35,12 +82,42 @@ class Ygocore < Game
end end
end end
def im_connect
Thread.new {
begin
@@im.allow_tls = false
@@im.use_ssl = true
@@im.connect('my-card.in', 5223)
#ruby19/windows下 使用tls连接时会卡住
@@im.auth(@password)
@@im.send(Jabber::Presence.new.set_type(:available))
begin
nickname = nickname()
@@im_room.join(Jabber::JID.new('lobby@conference.my-card.in/' + nickname))
rescue Jabber::ServerError => exception
if exception.error.error == 'conflict'
@nickname_conflict << nickname
retry
end
end
Game_Event.push Game_Event::AllUsers.new @@im_room.roster.keys.collect { |nick| User.new(nick.to_sym, nick) } rescue p $!
rescue StandardError => exception
$log.error('聊天连接出错') { exception }
Game_Event.push(Game_Event::Chat.new(ChatMessage.new(User.new(:system, 'System'), '聊天服务器连接失败')))
end
}
end
def chat(chatmessage) def chat(chatmessage)
case chatmessage.channel case chatmessage.channel
when :lobby when :lobby
send(:chat, channel: :lobby, message: chatmessage.message, time: chatmessage.time) msg = Jabber::Message::new(nil, chatmessage.message)
@@im_room.send msg
when User when User
send(:chat, channel: chatmessage.channel.id, message: chatmessage.message, time: chatmessage.time) msg = Jabber::Message::new(nil, chatmessage.message)
@@im_room.send msg, chatmessage.channel.id
#send(:chat, channel: chatmessage.channel.id, message: chatmessage.message, time: chatmessage.time)
end end
end end
......
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