Revision 45333094
Added by Marc Dequènes over 13 years ago
- ID 4533309490bb30fb5b2827d0f1140afa339799bf
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
[fix/evol] conversation/bot protocol rework §8 (refs #30)