123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- # Copyright (C) 2012-2015 Zammad Foundation, http://zammad-foundation.org/
- require 'twitter'
- class Tweet
- attr_accessor :client
- def initialize(auth)
- @client = Twitter::REST::Client.new do |config|
- config.consumer_key = auth[:consumer_key]
- config.consumer_secret = auth[:consumer_secret]
- config.access_token = auth[:oauth_token]
- config.access_token_secret = auth[:oauth_token_secret]
- end
- end
- def disconnect
- return if !@client
- @client = nil
- end
- def user(tweet)
- # status (full user data is included)
- return tweet.user if tweet.respond_to?('user')
- # direct message (full user data is included)
- return tweet.sender if tweet.respond_to?('sender')
- # search (no user data is included, do extra lookup)
- begin
- return @client.user(tweet.from_user_id) if tweet.respond_to?('from_user_id')
- rescue => e
- Rails.logger.error "Twitter (#{tweet.id}): 'from_user_id' lookup error '#{e.inspect}'"
- end
- Rails.logger.error "Twitter (#{tweet.id}): unknown user source"
- end
- def to_user(tweet)
- Rails.logger.debug 'Create user from tweet...'
- Rails.logger.debug tweet.inspect
- # do tweet_user lookup
- tweet_user = user(tweet)
- return if !tweet_user
- auth = Authorization.find_by( uid: tweet_user.id, provider: 'twitter' )
- # create or update user
- user_data = {
- login: tweet_user.screen_name,
- firstname: tweet_user.name,
- lastname: '',
- email: '',
- password: '',
- image_source: tweet_user.profile_image_url.to_s,
- note: tweet_user.description,
- active: true,
- roles: Role.where( name: 'Customer' ),
- }
- if auth
- user_data[:id] = auth.user_id
- end
- user = User.create_or_update( user_data )
- # create or update authorization
- auth_data = {
- uid: tweet_user.id,
- username: tweet_user.screen_name,
- user_id: user.id,
- provider: 'twitter'
- }
- if auth
- auth.update_attributes( auth_data )
- else
- Authorization.new( auth_data )
- end
- UserInfo.current_user_id = user.id
- user
- end
- def to_ticket(tweet, user, group_id)
- Rails.logger.debug 'Create ticket from tweet...'
- Rails.logger.debug tweet.inspect
- Rails.logger.debug user.inspect
- Rails.logger.debug group_id.inspect
- if tweet.class.to_s == 'Twitter::DirectMessage'
- article = Ticket::Article.find_by(
- from: 'me_bauer',
- type_id: Ticket::Article::Type.find_by( name: 'twitter direct-message' ).id,
- )
- if article
- ticket = Ticket.find_by(
- id: article.ticket_id,
- customer_id: user.id,
- state: Ticket::State.where.not(
- state_type_id: Ticket::StateType.where(
- name: 'closed',
- )
- )
- )
- return ticket if ticket
- end
- end
- Ticket.create(
- customer_id: user.id,
- title: "#{tweet.text[0, 37]}...",
- group_id: group_id,
- state_id: Ticket::State.find_by( name: 'new' ).id,
- priority_id: Ticket::Priority.find_by( name: '2 normal' ).id,
- )
- end
- def to_article(tweet, user, ticket)
- Rails.logger.debug 'Create article from tweet...'
- Rails.logger.debug tweet.inspect
- Rails.logger.debug user.inspect
- Rails.logger.debug ticket.inspect
- # set ticket state to open if not new
- if ticket.state.name != 'new'
- ticket.state = Ticket::State.find_by( name: 'open' )
- ticket.save
- end
- # import tweet
- to = nil
- if tweet.respond_to?('recipient')
- to = tweet.recipient.name
- end
- article_type = 'twitter status'
- if tweet.class.to_s == 'Twitter::DirectMessage'
- article_type = 'twitter direct-message'
- end
- in_reply_to = nil
- if tweet.respond_to?('in_reply_to_status_id') && tweet.in_reply_to_status_id && tweet.in_reply_to_status_id.to_s != ''
- in_reply_to = tweet.in_reply_to_status_id
- end
- Ticket::Article.create(
- from: user.login,
- to: to,
- body: tweet.text,
- message_id: tweet.id,
- ticket_id: ticket.id,
- in_reply_to: in_reply_to,
- type_id: Ticket::Article::Type.find_by( name: article_type ).id,
- sender_id: Ticket::Article::Sender.find_by( name: 'Customer' ).id,
- internal: false,
- )
- end
- def to_group(tweet, group_id)
- Rails.logger.debug 'import tweet'
- ticket = nil
- # use transaction
- ActiveRecord::Base.transaction do
- UserInfo.current_user_id = 1
- # check if parent exists
- user = to_user(tweet)
- return if !user
- if tweet.respond_to?('in_reply_to_status_id') && tweet.in_reply_to_status_id && tweet.in_reply_to_status_id.to_s != ''
- existing_article = Ticket::Article.find_by( message_id: tweet.in_reply_to_status_id.to_s )
- if existing_article
- ticket = existing_article.ticket
- else
- Rails.logger.debug 'import in_reply_tweet ' + tweet.in_reply_to_status_id.to_s
- parent_tweet = @client.status( tweet.in_reply_to_status_id )
- ticket = to_group( parent_tweet, group_id )
- end
- else
- ticket = to_ticket(tweet, user, group_id)
- end
- to_article(tweet, user, ticket)
- # execute ticket events
- Observer::Ticket::Notification.transaction
- end
- ticket
- end
- def from_article(article)
- tweet = nil
- if article[:type] == 'twitter direct-message'
- Rails.logger.debug "Create twitter direct message from article to '#{article[:to]}'..."
- tweet = @client.create_direct_message(
- article[:to],
- article[:body],
- {}
- )
- elsif article[:type] == 'twitter status'
- Rails.logger.debug 'Create tweet from article...'
- tweet = @client.update(
- article[:body],
- {
- in_reply_to_status_id: article[:in_reply_to]
- }
- )
- else
- fail "Can't handle unknown twitter article type '#{article[:type]}'."
- end
- Rails.logger.debug tweet.inspect
- tweet
- end
- end
|