说的就是我以前做好的贴吧追小说机器人,项目在 github 上 .
我现在想把他在 rails 下重新实现一遍 (其实暂时并没有打算做页面,只是为了借用 rails 完整的工具来部署). 然后我就不知道如何才能让这个机器人一直 run 在线了。
原本的做法是写一个 sidekiq.rb, 然后在这个文件里面 require 需要的库,然后用全局变量 $bot hold 住一个 xmpp 连接。之后的发送消息什么的操作都通过这个全局变量来做。
我现在觉得使用全局变量并不是一个合适的方法,但是除此之外我还真不知道怎么样才能正确的 hold 住这个连接了。请教各位。
PS: 我之前参与开发的一个 Gem https://github.com/yong/purple_ruby,是对 libpurple 的封装,可以用来比较方便的写 Bot
#5 楼 @help5305fff #4 楼 @leekelby #3 楼 @chentianwen
hi, 谢谢你们的回复,看来我没描述清楚我的意思。我写代码的时间不长,却有点代码洁癖。我不希望像以前那样用一个全局变量保存这个 bot 的连接,然后在程序的另外地方需要调用这个 bot 的时候再去操作这个全局变量。我希望能有一种看起来更安全更合理,也更漂亮的方式来实现。
现在有的想法大约是写一个单例类,然后让这个类的类变量 hold 住这个连接,然后每次发信息都操作这个类。但这样似乎也会把这个类搞的很大,并且跟其他的类耦合 (因为其他的类要调用类似 Bot::im_send 的方法). 而且我对 rails 不熟悉。不清楚这样的代码应该放在哪个文件夹下才合适 (这个类似乎跟 mvc 都无关) 是不是应该放在 vender/plugins 下面?
#2 楼 @yedingding 粗略的看了你那个 gem. 赞一个 (没想到你还会 C 啊). 不过这并不能解决我的问题。这只是一个用于连接 IM 服务器的 gem (当然看起来比我现在用的 xmpp4r 要给力一点,反正我也在重构,会试一试这个的)
#12 楼 @ruohanc 我了解的 gem 不多,不好给建议。不过这个接口
是面向对象中的含义,只要一致就行了,其它不重要,你之前的想法(放到 initializers)也不矛盾,关键要实用
举个例子,最简单的场景是你只关心这个机器人会 crash,那只要一个状态查询和重启服务即可,可以把代码包装成一个 Worker 类,内部是独立线程,提供启动/重启/查询状态的方法,这就是你的接口。
class Worker
def start; ... end
def stop; ... end
def status; ... end
end
接下来可能是两种做法
LOGGER = Logger.new 'work.log' begin Worker.new.start rescue LOGGER.error 'fail' end
这种情况下,关键是故障告警,可以让nginx直接输出work.log文件,然后用监控宝监控这个url的内容即可
#19 楼 @ruohanc 那就把你的 robot 包装好接口,然后在 initializer 里面启动
其实直接使用 AR 和环境变量也不复杂
gem 'mysql2'
require 'active_record'
require 'yaml'
MYAPP_ENV=ENV['MYAPP_ENV']
ActiveRecord::Base.establish_connection YAML.load( File.read 'config/config.yml' )[MYAPP_ENV]
$: << './lib/tieba_xiaoshuo_bot/models'
require 'users'
...
至于 db migrate,我估计你也不奢望能回滚吧,那就每次升级写一个数据迁移脚本完事
#2 楼 @yedingding 你这个 gem 真不错!不过好像没文档?我只能看 purple_ruby.c
瞎猜?
#22 楼 @doitian 似乎完全不是一回事。这个 purple_ruby 是 pidgin 的通信库 libpurple 的 ruby 包装。方法定义似乎就是这一段:Github.com
@yedingding 我似乎没有找到获取在线 (或者所有) 用户的方法啊.?