PageRenderTime 54ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/plugins/mongo.rb

https://github.com/Epictetus/termtter
Ruby | 112 lines | 94 code | 17 blank | 1 comment | 1 complexity | 14b9e4cc76bd856d48b56f1037be39eb MD5 | raw file
  1. require 'mongo'
  2. config.plugins.mongo.set_default(:db_name, 'twitter')
  3. module Termtter::Client
  4. class << self
  5. def mongo_db
  6. @mongo_db ||= Mongo::Connection.new('localhost', 27017, :pool_size => 5, :timeout => 5).db(config.plugins.mongo.db_name)
  7. end
  8. end
  9. end
  10. module Termtter::Client
  11. register_hook(
  12. :name => :user_stream_insert_mongo,
  13. :point => :user_stream_receive,
  14. :exec => lambda {|chunk|
  15. data = JSON.parse(chunk) rescue return
  16. coll_key = data['friends'] ? 'friends'
  17. : data['event'] ? 'event'
  18. : data['delete'] ? 'delete'
  19. : 'status'
  20. mongo_db.collection(coll_key).insert(data)
  21. })
  22. register_command(
  23. :name => :mongo_favs,
  24. :alias => :mf,
  25. :exec_proc => lambda {|arg|
  26. table = {}
  27. mongo_db.collection('event').find({"event" => "favorite", "source.screen_name" => { "$ne" => config.user_name}}).sort(:_id, -1).limit(100).to_a.reverse.each{|event|
  28. table[event['target_object']['id']] ||= {
  29. 'status' => event['target_object'],
  30. 'fav_by' => [],
  31. 'rt_by' => [],
  32. }
  33. table[event['target_object']['id']]['fav_by'] << event['source']['screen_name']
  34. }
  35. mongo_db.collection('status').find({"retweeted_status.user.screen_name" => config.user_name}).sort(:_id, -1).limit(100).to_a.reverse.each{|status|
  36. table[status['retweeted_status']['id']] ||= {
  37. 'status' => status['retweeted_status'],
  38. 'fav_by' => [],
  39. 'rt_by' => [],
  40. }
  41. table[status['retweeted_status']['id']]['rt_by'] << status['user']['screen_name']
  42. }
  43. table.to_a.sort_by{|pair| pair[0]}[-40..-1].each{|pair|
  44. status = pair[1]['status']
  45. fav_by = pair[1]['fav_by']
  46. rt_by = pair[1]['rt_by']
  47. puts [
  48. fav_by.empty? ? nil : "fav(#{fav_by.length}) #{fav_by.join(', ')}",
  49. rt_by.empty? ? nil : "RT(#{rt_by.length}) #{rt_by.join(', ')}",
  50. status['text'].gsub(/\n/, ' ')
  51. ].compact.join(' ')
  52. }
  53. },
  54. :help => ["mongo_favs", "Print favorites from MongoDB"]
  55. )
  56. register_command(
  57. :name => :mongo_search,
  58. :alias => :ms,
  59. :exec_proc => lambda {|arg|
  60. limit = 20
  61. arg.gsub!(/-(\d+) /){|n| limit = $1.to_i; ''}
  62. arg.strip!
  63. statuses = mongo_db.collection('status').find({
  64. 'text' => Regexp.new(Regexp.quote(arg))
  65. }).sort(:$natural, -1).limit(limit).to_a.reverse.map{|s|
  66. Termtter::ActiveRubytter.new(s)
  67. }
  68. output(statuses, Termtter::Client::SearchEvent.new(arg))
  69. },
  70. :help => ["mongo_search", "Search from MongoDB"]
  71. )
  72. register_command(
  73. :name => :mongo_list,
  74. :alias => :ml,
  75. :exec_proc => lambda {|arg|
  76. limit = 20
  77. arg.gsub!(/-(\d+) /){|n| limit = $1.to_i; ''}
  78. users = arg.strip.split(/\s+/).map{|name| Termtter::Client.normalize_as_user_name(name) }
  79. query = users.empty? ? {} : {'user.screen_name' => {'$in' => users}}
  80. statuses = mongo_db.collection('status').find(query).sort(:$natural, -1).limit(limit).to_a.reverse.map{|s|
  81. Termtter::ActiveRubytter.new(s)
  82. }
  83. output(statuses)
  84. },
  85. :help => ["mongo_list", "List the posts from MongoDB"]
  86. )
  87. end
  88. class Termtter::RubytterProxy
  89. def cached_status(status_id)
  90. status = Termtter::Client.memory_cache.get(['status', status_id].join('-'))
  91. status ||= Termtter::Client.mongo_db.collection('status').find_one({'id' => status_id.to_i})
  92. Termtter::ActiveRubytter.new(status) if status
  93. end
  94. end
  95. # mongo.rb