class Auth::TwitterAuthenticator < Auth::Authenticator def name "twitter" end def after_authenticate(auth_token) result = Auth::Result.new data = auth_token[:info] result.email = data["email"] result.email_valid = result.email.present? result.username = data["nickname"] result.name = data["name"] twitter_user_id = auth_token["uid"] result.extra_data = { twitter_user_id: twitter_user_id, twitter_screen_name: result.username, twitter_image: data["image"], twitter_description: data["description"], twitter_location: data["location"] } user_info = TwitterUserInfo.find_by(twitter_user_id: twitter_user_id) result.user = user_info.try(:user) if !result.user && result.email_valid && result.user = User.find_by_email(result.email) TwitterUserInfo.create( user_id: result.user.id, screen_name: result.username, twitter_user_id: twitter_user_id ) end retrieve_avatar(result.user, result.extra_data) retrieve_profile(result.user, result.extra_data) result end def after_create_account(user, auth) extra_data = auth[:extra_data] TwitterUserInfo.create( user_id: user.id, screen_name: extra_data[:twitter_screen_name], twitter_user_id: extra_data[:twitter_user_id] ) retrieve_avatar(user, extra_data) retrieve_profile(user, extra_data) true end def register_middleware(omniauth) omniauth.provider :twitter, setup: lambda { |env| strategy = env["omniauth.strategy"] strategy.options[:consumer_key] = SiteSetting.twitter_consumer_key strategy.options[:consumer_secret] = SiteSetting.twitter_consumer_secret } end protected def retrieve_avatar(user, data) return unless user return if user.user_avatar.try(:custom_upload_id).present? if (avatar_url = data[:twitter_image]).present? url = avatar_url.sub("_normal", "") Jobs.enqueue(:download_avatar_from_url, url: url, user_id: user.id, override_gravatar: false) end end def retrieve_profile(user, data) return unless user bio = data[:twitter_description] location = data[:twitter_location] if bio || location profile = user.user_profile profile.bio_raw = bio unless profile.bio_raw.present? profile.location = location unless profile.location.present? profile.save end end end