Project

General

Profile

« Previous | Next » 

Revision 45333094

Added by Marc Dequènes over 13 years ago

  • ID 4533309490bb30fb5b2827d0f1140afa339799bf

[fix/evol] conversation/bot protocol rework §8 (refs #30)

View differences:

lib/cyborghood/cyborg/protocol.rb
module CyborgHood
module BotProtocol
class BotProtocol
VERSION = "0.1"
CAPABILITIES = []
......
unless message.conv_thread.id == 0
return send_quit_decline "bad negociation"
end
unless message.parameters[:bot_name] =~ Conversation::BOT_ID_PATTERN
if message.action_parameters.nil?
return send_quit_decline "missing parameters"
end
unless message.action_parameters[:bot_name] =~ Regexp.new(Conversation::BOT_NAME_PATTERN)
return send_quit_decline "bad bot name"
end
unless message.parameters[:protocol_version] == VERSION
unless message.action_parameters[:protocol_version] == VERSION
return send_quit_decline "protocol version does not match"
end
@negociation_received = true
@conversation.set_peer_info(message.parameters[:bot_name], message.parameters[:capabilities])
@conversation.set_peer_info(message.action_parameters[:bot_name], message.action_parameters[:capabilities])
if @negociation_sent
send_announce_ok(message)
......
@conversation.set_comm_ready
else
send_announce_helo(message)
@negociation_sent = true
end
end
......
end
def receive_request_call(message)
unless @conversation.bot.interface.is_node? message.parameters[:node]
if message.action_parameters.nil?
return send_error_action(message, "missing parameters")
end
unless @conversation.bot.interface.is_node? message.action_parameters[:node]
return send_error_action(message, "bad node")
end
send_reply_ack(message)
......
}
begin
result[:action_result] = @conversation.bot.interface.call(message.conv_thread.session,
message.parameters[:node],
message.parameters[:data])
message.action_parameters[:node],
message.action_parameters[:data])
rescue
result[:error] = $!
end
......
end
def receive_request_exists(message)
unless @conversation.bot.interface.is_node? message.parameters[:node]
if message.action_parameters.nil?
return send_error_action(message, "missing parameters")
end
unless @conversation.bot.interface.is_node? message.action_parameters[:node]
return send_error_action(message, "bad node")
end
send_reply_ack(message)
@conversation.bot.schedule_task(@@request_callback) do
{
:reply_message => message,
:action_result => @conversation.bot.interface.has_node?(message.parameters[:node])
:action_result => @conversation.bot.interface.has_node?(message.action_parameters[:node])
}
end
end
......
def send_announce_helo(recv_message = nil)
action_code = "ANNOUNCE HELO"
message = (recv_message.nil? ? @conversation.thread('system').new_message(action_code) :
recv_message.create_reply(action_code))
action_parameters = {
:bot_name => @conversation.bot.name,
:protocol_version => VERSION
}
message = (recv_message.nil? ? @conversation.thread('system').new_message(action_code, action_parameters) :
recv_message.create_reply(action_code, action_parameters))
message.send
@negociation_sent = true
end
def send_announce_ok(recv_message)
......
end
def send_quit_decline(reason)
@conversation.thread('system').new_message("QUIT LEAVING", { :reason => reason }).send
@conversation.set_comm_stop do
@conversation.thread('system').new_message("QUIT DECLINE", { :reason => reason }).send
end
end
def send_quit_leaving
@conversation.thread('system').new_message("QUIT LEAVING").send
@conversation.set_comm_stop do
@conversation.thread('system').new_message("QUIT LEAVING").send
end
end
end
end

Also available in: Unified diff