我使用EventMachine製作了一個基本的TCP客戶端。代碼:使用EventMachine的Ruby TCP「bot」 - 實現命令調度程序
# run.rb
EventMachine::run do
EventMachine::connect $config_host, $config_port, Bot
end
# bot.rb
module Bot
def post_init
# log us in and do any other spinup.
sleep(1)
send_data $config_login + "\n"
EventMachine.add_periodic_timer($config_keepalive_duration) { send_data $config_keepalive_str + "\n" }
@valid_command = /^<#{$config_passphrase}:([^>:]+):(#\d+)>(.*)$/
end
def receive_data(data)
if(ma = @valid_command.match(data))
command, user, args = ma[1,3]
args.strip!
command.downcase!
p "Received: #{command}, #{user}, #{args}"
# and.. here we handle the command.
end
end
end
這一切都很好。其基本思想是它應該連接,監聽特殊格式的命令,並執行命令;在執行命令時,可能會有任何數量的「行爲」導致客戶端發送各種數據。
但是,對於我的下一個技巧,我需要添加實際處理Bot
接收的命令的功能。
我想用事件監聽器的動態庫或類似的東西來做到這一點;即,我有任意數量的插件可以註冊以偵聽特定命令並從bot.rb
獲得回調。 (最終,我希望能夠重新加載這些插件,而無需重新啓動機器人。)
我已經看過ruby_events
寶石,我認爲這很有道理,但我在加工時遇到了一些麻煩找出構建事物的最佳方式。我的問題包括...
- 我有點疑惑附着到哪裏
ruby_events
聽衆 - 它只是擴展對象,因此不會使它明顯如何實現它。 Bot
是一個模塊,所以我不能只從一個插件中調用Bot.send_data
來發送數據 - 我怎樣才能從一個插件與EM連接進行交互?
我完全開放給任何建築修訂或其他寶石的建議,使我想做的事情也變得更容易。