twitter2.rb 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. require 'twitter'
  2. class Channel::Twitter2
  3. include UserInfo
  4. def connect(channel)
  5. @client = Twitter::Client.new(
  6. :consumer_key => channel[:options][:consumer_key],
  7. :consumer_secret => channel[:options][:consumer_secret],
  8. :oauth_token => channel[:options][:oauth_token],
  9. :oauth_token_secret => channel[:options][:oauth_token_secret]
  10. )
  11. end
  12. def fetch (channel)
  13. puts "fetching tweets (oauth_token#{channel[:options][:oauth_token]})"
  14. @client = connect(channel)
  15. # search results
  16. if channel[:options][:search]
  17. channel[:options][:search].each { |search|
  18. puts " - searching for #{search[:item]}"
  19. tweets = @client.search( search[:item] )
  20. @article_type = 'twitter status'
  21. fetch_loop(tweets, channel, search[:group])
  22. }
  23. end
  24. # mentions
  25. if channel[:options][:mentions]
  26. puts " - searching for mentions"
  27. tweets = @client.mentions
  28. @article_type = 'twitter status'
  29. fetch_loop(tweets, channel, channel[:options][:mentions][:group])
  30. end
  31. # direct messages
  32. if channel[:options][:direct_messages]
  33. puts " - searching for direct_messages"
  34. tweets = @client.direct_messages
  35. @article_type = 'twitter direct-message'
  36. fetch_loop(tweets, channel, channel[:options][:direct_messages][:group])
  37. end
  38. puts 'done'
  39. end
  40. def fetch_loop(tweets, channel, group)
  41. # get all tweets
  42. all_tweets = []
  43. result_class = tweets.class
  44. if result_class.to_s == 'Array'
  45. all_tweets = tweets
  46. elsif result_class.to_s == 'Twitter::SearchResults'
  47. tweets.results.map do |tweet|
  48. all_tweets.push tweet
  49. end
  50. else
  51. puts 'UNKNOWN: ' + result_class.to_s
  52. end
  53. # find tweets
  54. all_tweets.each do |tweet|
  55. # check if tweet is already imported
  56. article = Ticket::Article.where( :message_id => tweet.id.to_s ).first
  57. # check if sender already exists
  58. next if article
  59. # use transaction
  60. ActiveRecord::Base.transaction do
  61. puts 'import tweet'
  62. fetch_import( tweet, channel, group )
  63. end
  64. # execute ticket events
  65. Ticket::Observer::Notification.transaction
  66. end
  67. end
  68. def fetch_import(tweet, channel, group)
  69. # do sender lockup if needed
  70. sender = nil
  71. # status (full user data is included)
  72. if tweet['user']
  73. sender = tweet['user']
  74. # direct message (full user data is included)
  75. elsif tweet['sender']
  76. sender = tweet['sender']
  77. # search (no user data is included, do extra lookup)
  78. elsif tweet['from_user_id']
  79. begin
  80. # reconnect for #<Twitter::Error::NotFound: Sorry, that page does not exist> workaround
  81. # @client = connect(channel)
  82. sender = @client.user(tweet.from_user_id)
  83. rescue Exception => e
  84. puts "Exception: twitter: " + e.inspect
  85. return
  86. end
  87. end
  88. # check if parent exists
  89. user = nil, ticket = nil, article = nil
  90. if tweet['in_reply_to_status_id']
  91. puts 'import in_reply_tweet ' + tweet.in_reply_to_status_id.to_s
  92. tweet_sub = @client.status(tweet.in_reply_to_status_id)
  93. # puts tweet_sub.inspect
  94. (user, ticket, article) = fetch_import(tweet_sub, channel, group)
  95. end
  96. # create stuff
  97. user = fetch_user_create(tweet, sender)
  98. if !ticket
  99. puts 'create new ticket...'
  100. ticket = fetch_ticket_create(user, tweet, sender, channel, group)
  101. end
  102. article = fetch_article_create(user, ticket, tweet, sender)
  103. return user, ticket, article
  104. end
  105. def fetch_user_create(tweet, sender)
  106. # create sender in db
  107. # puts tweet.inspect
  108. # user = User.where( :login => tweet.sender.screen_name ).first
  109. auth = Authorization.where( :uid => sender.id, :provider => 'twitter' ).first
  110. user = nil
  111. if auth
  112. puts 'user_id', auth.user_id
  113. user = User.where( :id => auth.user_id ).first
  114. end
  115. if !user
  116. puts 'create user...'
  117. roles = Role.where( :name => 'Customer' )
  118. user = User.create(
  119. :login => sender.screen_name,
  120. :firstname => sender.name,
  121. :lastname => '',
  122. :email => '',
  123. :password => '',
  124. :image => sender.profile_image_url,
  125. :note => sender.description,
  126. :active => true,
  127. :roles => roles,
  128. :created_by_id => 1
  129. )
  130. puts 'autentication create...'
  131. authentication = Authorization.create(
  132. :uid => sender.id,
  133. :username => sender.screen_name,
  134. :user_id => user.id,
  135. :provider => 'twitter'
  136. )
  137. else
  138. puts 'user exists'#, user.inspect
  139. end
  140. # set current user
  141. UserInfo.current_user_id = user.id
  142. return user
  143. end
  144. def fetch_ticket_create(user, tweet, sender, channel, group)
  145. # puts '+++++++++++++++++++++++++++' + tweet.inspect
  146. # check if ticket exists
  147. if tweet['in_reply_to_status_id']
  148. puts 'tweet.in_reply_to_status_id found: ' + tweet.in_reply_to_status_id
  149. article = Ticket::Article.where( :message_id => tweet.in_reply_to_status_id.to_s ).first
  150. if article
  151. puts 'article with id found tweet.in_reply_to_status_id found: ' + tweet.in_reply_to_status_id
  152. return article.ticket
  153. end
  154. end
  155. # find if record already exists
  156. article = Ticket::Article.where( :message_id => tweet.id.to_s ).first
  157. if article
  158. return article.ticket
  159. end
  160. ticket = nil
  161. if @article_type == 'twitter direct-message'
  162. ticket = Ticket.where( :customer_id => user.id ).first
  163. end
  164. if !ticket
  165. group = Group.where( :name => group ).first
  166. group_id = 1
  167. if group
  168. group_id = group.id
  169. end
  170. state = Ticket::State.where( :name => 'new' ).first
  171. state_id = 1
  172. if state
  173. state_id = state.id
  174. end
  175. priority = Ticket::Priority.where( :name => '2 normal' ).first
  176. priority_id = 1
  177. if priority
  178. priority_id = priority.id
  179. end
  180. ticket = Ticket.create(
  181. :group_id => group_id,
  182. :customer_id => user.id,
  183. :title => tweet.text[0,40],
  184. :ticket_state_id => state_id,
  185. :ticket_priority_id => priority_id,
  186. :created_by_id => user.id
  187. )
  188. end
  189. return ticket
  190. end
  191. def fetch_article_create(user,ticket,tweet, sender)
  192. # find if record already exists
  193. article = Ticket::Article.where( :message_id => tweet.id.to_s ).first
  194. if article
  195. return article
  196. end
  197. # set ticket state to open if not new
  198. if ticket.ticket_state.name != 'new'
  199. ticket.ticket_state = Ticket::State.where( :name => 'open' ).first
  200. ticket.save
  201. end
  202. # import tweet
  203. to = nil
  204. if tweet['recipient']
  205. to = tweet.recipient.name
  206. end
  207. article = Ticket::Article.create(
  208. :created_by_id => user.id,
  209. :ticket_id => ticket.id,
  210. :ticket_article_type_id => Ticket::Article::Type.where( :name => @article_type ).first.id,
  211. :ticket_article_sender_id => Ticket::Article::Sender.where( :name => 'Customer' ).first.id,
  212. :body => tweet.text,
  213. :from => sender.name,
  214. :to => to,
  215. :message_id => tweet.id,
  216. :internal => false
  217. )
  218. end
  219. def send(attr, notification = false)
  220. # logger.debug('tweeeeettttt!!!!!!')
  221. channel = Channel.where( :area => 'Twitter::Inbound', :active => true ).first
  222. client = Twitter::Client.new(
  223. :consumer_key => channel[:options][:consumer_key],
  224. :consumer_secret => channel[:options][:consumer_secret],
  225. :oauth_token => channel[:options][:oauth_token],
  226. :oauth_token_secret => channel[:options][:oauth_token_secret]
  227. )
  228. puts 'to:' + atts[:to].to_s
  229. if atts[:type] == 'twitter direct-message'
  230. dm = client.direct_message_create(
  231. atts[:to].to_s,
  232. atts[:body].to_s,
  233. options = {}
  234. )
  235. # puts dm.inspect
  236. return dm
  237. end
  238. if atts[:type] == 'twitter status'
  239. message = client.update(
  240. atts[:body].to_s,
  241. options = {
  242. :in_reply_to_status_id => atts[:in_reply_to]
  243. }
  244. )
  245. # puts message.inspect
  246. return message
  247. end
  248. end
  249. end