aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Gemfile1
-rw-r--r--Gemfile.lock5
-rw-r--r--app/controllers/sessions_controller.rb10
-rw-r--r--app/models/favorite.rb31
-rw-r--r--app/models/retweet.rb28
-rw-r--r--app/models/tweet.rb42
-rw-r--r--app/models/user.rb56
-rw-r--r--app/views/about/index.html.haml2
-rw-r--r--collector/stream.rb76
-rw-r--r--lib/aclog/receiver/collector_connection.rb58
10 files changed, 134 insertions, 175 deletions
diff --git a/Gemfile b/Gemfile
index cac4b25..50665ba 100644
--- a/Gemfile
+++ b/Gemfile
@@ -5,7 +5,6 @@ source "https://rubygems.org"
gem "rails", "~> 4.0.0"
gem "mysql2"
gem "pry-rails"
-gem "counter_culture"
gem "settingslogic"
gem "yajl-ruby", require: "yajl"
gem "twitter"
diff --git a/Gemfile.lock b/Gemfile.lock
index 9222d17..eae794a 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -26,8 +26,6 @@ GEM
thread_safe (~> 0.1)
tzinfo (~> 0.3.37)
addressable (2.3.5)
- after_commit_action (0.1.3)
- activerecord (>= 3.0.0)
arel (4.0.0)
atomic (1.1.10)
bootstrap-sass-rails (2.3.2.1)
@@ -45,8 +43,6 @@ GEM
colorize (0.5.8)
cool.io (1.1.0)
iobuffer (>= 1.0.0)
- counter_culture (0.1.13)
- after_commit_action (~> 0.1.3)
coveralls (0.6.7)
colorize
multi_json (~> 1.3)
@@ -213,7 +209,6 @@ PLATFORMS
DEPENDENCIES
bootstrap-sass-rails
coffee-rails (~> 4.0.0)
- counter_culture
coveralls
daemon-spawn
dalli
diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb
index 03ab2b4..24349cb 100644
--- a/app/controllers/sessions_controller.rb
+++ b/app/controllers/sessions_controller.rb
@@ -8,11 +8,11 @@ class SessionsController < ApplicationController
consumer_version: Settings.collector.consumer_version)
account.update_connection
- User.from_hash(id: account.user_id,
- screen_name: auth["extra"]["raw_info"]["screen_name"],
- name: auth["extra"]["raw_info"]["name"],
- profile_image_url: auth["extra"]["raw_info"]["profile_image_url_https"],
- protected: auth["extra"]["raw_info"]["protected"])
+ User.from_receiver("id" => account.user_id,
+ "screen_name" => auth["extra"]["raw_info"]["screen_name"],
+ "name" => auth["extra"]["raw_info"]["name"],
+ "profile_image_url" => auth["extra"]["raw_info"]["profile_image_url_https"],
+ "protected" => auth["extra"]["raw_info"]["protected"])
session[:account] = account
session[:user_id] = account.user_id
diff --git a/app/models/favorite.rb b/app/models/favorite.rb
index e0b8eb7..82f7312 100644
--- a/app/models/favorite.rb
+++ b/app/models/favorite.rb
@@ -1,21 +1,22 @@
class Favorite < ActiveRecord::Base
- belongs_to :tweet, :counter_cache => true
-# counter_culture :tweet
+ belongs_to :tweet, counter_cache: true
belongs_to :user
- def self.from_hash(hash)
- begin
- f = logger.quietly do
- create!(tweet_id: hash[:tweet_id], user_id: hash[:user_id])
- end
- logger.debug("Created Favorite: #{hash[:user_id]} => #{hash[:tweet_id]}")
-
+ def self.from_receiver(msg)
+ transaction do
+ t = Tweet.from_receiver(msg["tweet"])
+ u = User.from_receiver(msg["user"])
+ f = self.create!(tweet: t,
+ user: u)
+ logger.debug("Created Favorite: #{msg["user"]["id"]} => #{msg["tweet"]["id"]}")
return f
- rescue ActiveRecord::RecordNotUnique
- logger.debug("Duplicate Favorite: #{hash[:user_id]} => #{hash[:tweet_id]}")
- rescue => e
- logger.error("Unknown error while inserting favorite: #{e.class}: #{e.message}/#{e.backtrace.join("\n")}")
end
+ rescue ActiveRecord::RecordNotUnique
+ logger.debug("Duplicate Favorite: #{msg["user"]["id"]} => #{msg["tweet"]["id"]}")
+ return nil
+ rescue => e
+ logger.error("Unknown error while inserting favorite: #{e.class}: #{e.message}/#{e.backtrace.join("\n")}")
+ return nil
end
def self.from_tweet_object(tweet_object)
@@ -26,7 +27,7 @@ class Favorite < ActiveRecord::Base
end
end
- def self.delete_from_hash(hash)
- where(tweet_id: hash[:tweet_id], user_id: hash[:user_id]).destroy_all
+ def self.delete_from_receiver(msg)
+ where(tweet_id: msg["tweet"]["id"], user_id: msg["user"]["id"]).destroy_all
end
end
diff --git a/app/models/retweet.rb b/app/models/retweet.rb
index 05bfd65..48ca515 100644
--- a/app/models/retweet.rb
+++ b/app/models/retweet.rb
@@ -1,23 +1,23 @@
class Retweet < ActiveRecord::Base
belongs_to :tweet, :counter_cache => true
-# counter_culture :tweet
belongs_to :user
- def self.from_hash(hash)
- begin
- r = logger.quietly do
- create!(id: hash[:id],
- tweet_id: hash[:tweet_id],
- user_id: hash[:user_id])
- end
- logger.debug("Created Retweet: #{hash[:id]}: #{hash[:user_id]} => #{hash[:tweet_id]}")
-
+ def self.from_receiver(msg)
+ transaction do
+ t = Tweet.from_receiver(msg["tweet"])
+ u = User.from_receiver(msg["user"])
+ r = self.create!(id: msg["id"],
+ tweet: t,
+ user: u)
+ logger.debug("Created Retweet: #{msg["id"]}: #{msg["user"]["id"]} => #{msg["tweet"]["id"]}")
return r
- rescue ActiveRecord::RecordNotUnique
- logger.debug("Duplicate Retweet: #{hash[:id]}: #{hash[:user_id]} => #{hash[:tweet_id]}")
- rescue => e
- logger.error("Unknown error while inserting retweet: #{e.class}: #{e.message}/#{e.backtrace.join("\n")}")
end
+ rescue ActiveRecord::RecordNotUnique
+ logger.debug("Duplicate Retweet: #{msg["id"]}: #{msg["user"]["id"]} => #{msg["tweet"]["id"]}")
+ return nil
+ rescue => e
+ logger.error("Unknown error while inserting retweet: #{e.class}: #{e.message}/#{e.backtrace.join("\n")}")
+ return nil
end
def self.from_tweet_object(status)
diff --git a/app/models/tweet.rb b/app/models/tweet.rb
index 37e81d9..8d10f96 100644
--- a/app/models/tweet.rb
+++ b/app/models/tweet.rb
@@ -33,6 +33,12 @@ class Tweet < ActiveRecord::Base
joins("INNER JOIN (#{un}) m ON m.tweet_id = tweets.id")
}
+ def notify_favorite
+ if Settings.notification.enabled
+ Notification.notify_favorite(self)
+ end
+ end
+
def self.list(params, options = {})
params[:page] ||= "1" if options[:force_page]
@@ -74,23 +80,31 @@ class Tweet < ActiveRecord::Base
end
end
- def self.from_hash(hash)
- begin
- t = logger.quietly do
- create!(id: hash[:id],
- text: hash[:text],
- source: hash[:source],
- tweeted_at: hash[:tweeted_at],
- user_id: hash[:user_id])
- end
- logger.debug("Created Tweet: #{hash[:id]}")
+ def self.delete_from_receiver(msg)
+ delete_from_id(msg["id"])
+ end
+ def self.from_receiver(msg)
+ transaction do
+ t = self.find_by(id: msg["id"])
+ unless t
+ begin
+ u = User.from_receiver(msg["user"])
+ t = self.create!(id: msg["id"],
+ text: msg["text"],
+ source: msg["source"],
+ tweeted_at: Time.parse(msg["tweeted_at"]),
+ user: u)
+ logger.debug("Created Tweet: #{msg["id"]}")
+ rescue ActiveRecord::RecordNotUnique
+ logger.debug("Duplicate Tweet: #{msg["id"]}")
+ end
+ end
return t
- rescue ActiveRecord::RecordNotUnique
- logger.debug("Duplicate Tweet: #{hash[:id]}")
- rescue => e
- logger.error("Unknown error while inserting tweet: #{e.class}: #{e.message}/#{e.backtrace.join("\n")}")
end
+ rescue => e
+ logger.error("Unknown error while inserting tweet: #{e.class}: #{e.message}/#{e.backtrace.join("\n")}")
+ return nil
end
def self.parse_query(query)
diff --git a/app/models/user.rb b/app/models/user.rb
index 6db2c75..1c4cfb4 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -5,38 +5,36 @@ class User < ActiveRecord::Base
has_many :favorites, dependent: :delete_all
has_many :retweets, dependent: :delete_all
- def self.from_hash(hash)
- begin
- user = where(id: hash[:id]).first_or_initialize
- orig = user.attributes.dup
-
- user.screen_name = hash[:screen_name]
- user.name = hash[:name]
- user.profile_image_url = hash[:profile_image_url]
- user.protected = hash[:protected]
-
- if orig["screen_name"] == user.screen_name &&
- orig["name"] == user.name &&
- orig["profile_image_url"][-44..-1] == user.profile_image_url[-44..-1] &&
- orig["protected"] == user.protected?
- logger.debug("User not changed: #{user.id}")
- else
- user.save!
- logger.debug("User saved: #{user.id}")
- end
-
- return user
- rescue
- logger.error("Unknown error while inserting user: #{$!}/#{$@}")
+ def self.from_receiver(msg)
+ user = where(id: msg["id"]).first_or_initialize
+ att = user.attributes.dup
+
+ user.screen_name = msg["screen_name"]
+ user.name = msg["name"]
+ user.profile_image_url = msg["profile_image_url"]
+ user.protected = msg["protected"]
+
+ if att["screen_name"] == user.screen_name &&
+ att["name"] == user.name &&
+ att["profile_image_url"][-44..-1] == user.profile_image_url[-44..-1] &&
+ att["protected"] == user.protected?
+ logger.debug("User not changed: #{user.id}")
+ else
+ user.save!
+ logger.debug("User saved: #{user.id}")
end
+
+ return user
+ rescue
+ logger.error("Unknown error while inserting user: #{$!}/#{$@}")
end
def self.from_user_object(user_object)
- from_hash(id: user_object.id,
- screen_name: user_object.screen_name,
- name: user_object.name,
- profile_image_url: user_object.profile_image_url_https,
- protected: user_object.protected)
+ from_receiver("id" => user_object.id,
+ "screen_name" => user_object.screen_name,
+ "name" => user_object.name,
+ "profile_image_url" => user_object.profile_image_url_https,
+ "protected" => user_object.protected)
end
def protected?
@@ -44,7 +42,7 @@ class User < ActiveRecord::Base
end
def registered?
- account
+ !!account
end
def account
diff --git a/app/views/about/index.html.haml b/app/views/about/index.html.haml
index a604ca4..5b33ee1 100644
--- a/app/views/about/index.html.haml
+++ b/app/views/about/index.html.haml
@@ -1,4 +1,6 @@
%h1 aclog
+- if Rails.env.development?
+ %h1.text-error !!!DEVELOPMENT!!!
%p
aclog は Twitter でのふぁぼ・RTを集めて表示するサービスです
%p
diff --git a/collector/stream.rb b/collector/stream.rb
index 874cdad..0fda622 100644
--- a/collector/stream.rb
+++ b/collector/stream.rb
@@ -125,72 +125,54 @@ module Aclog
}
end
- def send_user(user)
- @callback.call(
- type: "user",
- id: user[:id],
- screen_name: user[:screen_name],
- name: user[:name],
- profile_image_url: user[:profile_image_url_https],
- protected: user[:protected]
- )
- log(:debug, "Sent user", user[:id])
+ def conv_user(user)
+ {id: user[:id],
+ screen_name: user[:screen_name],
+ name: user[:name],
+ profile_image_url: user[:profile_image_url_https],
+ protected: user[:protected]}
+ end
+
+ def conv_tweet(status)
+ {type: "tweet",
+ id: status[:id],
+ text: format_text(status),
+ source: format_source(status),
+ tweeted_at: status[:created_at],
+ user: conv_user(status[:user])}
end
def send_tweet(status)
- send_user(status[:user])
- @callback.call(
- type: "tweet",
- id: status[:id],
- text: format_text(status),
- source: format_source(status),
- tweeted_at: status[:created_at],
- user_id: status[:user][:id]
- )
+ @callback.call(conv_tweet(status))
log(:debug, "Sent tweet", status[:id])
end
def send_favorite(source, target, target_object)
- send_tweet(target_object)
- send_user(source)
- @callback.call(
- type: "favorite",
- tweet_id: target_object[:id],
- target_user_id: target[:id],
- user_id: source[:id]
- )
+ @callback.call(type: "favorite",
+ tweet: conv_tweet(target_object),
+ user: conv_user(source))
log(:debug, "Sent favorite", source[:id] => target_object[:id])
end
def send_unfavorite(source, target, target_object)
- @callback.call(
- type: "unfavorite",
- tweet_id: target_object[:id],
- target_user_id: target[:id],
- user_id: source[:id]
- )
+ @callback.call(type: "unfavorite",
+ tweet: conv_tweet(target_object),
+ user: conv_user(source))
log(:debug, "Sent unfavorite", source[:id] => target_object[:id])
end
def send_retweet(status)
- send_tweet(status[:retweeted_status])
- send_user(status[:user])
- @callback.call(
- type: "retweet",
- id: status[:id],
- tweet_id: status[:retweeted_status][:id],
- target_user_id: status[:retweeted_status][:user][:id],
- user_id: status[:user][:id]
- )
+ @callback.call(type: "retweet",
+ id: status[:id],
+ tweet: conv_tweet(status[:retweeted_status]),
+ user: conv_user(status[:user]))
log(:debug, "Sent retweet", status[:user][:id] => status[:retweeted_status][:id])
end
def send_delete(deleted_status_id, deleted_user_id)
- @callback.call(
- :type => "delete",
- :id => deleted_status_id,
- :user_id => deleted_user_id
- )
+ @callback.call(type: "delete",
+ id: deleted_status_id,
+ user_id: deleted_user_id)
log(:debug, "Sent delete", deleted_user_id => deleted_status_id)
end
end
diff --git a/lib/aclog/receiver/collector_connection.rb b/lib/aclog/receiver/collector_connection.rb
index 8e80b1b..0ee8e6c 100644
--- a/lib/aclog/receiver/collector_connection.rb
+++ b/lib/aclog/receiver/collector_connection.rb
@@ -16,18 +16,15 @@ module Aclog
_cr = -> bl { bl.call; @@queue.pop &_cr }
EM.defer { @@queue.pop &_cr }
end
-
- @@saved_tweets ||= []
end
def send_account(account)
- send_object(
- type: "account",
- id: account.id,
- oauth_token: account.oauth_token,
- oauth_token_secret: account.oauth_token_secret,
- user_id: account.user_id,
- consumer_version: account.consumer_version)
+ send_object(type: "account",
+ id: account.id,
+ oauth_token: account.oauth_token,
+ oauth_token_secret: account.oauth_token_secret,
+ user_id: account.user_id,
+ consumer_version: account.consumer_version)
Rails.logger.debug("Sent #{account.id}/#{account.user_id}")
end
@@ -36,8 +33,8 @@ module Aclog
end
def unbind
+ @connections.reject! {|k, v| v == self }
Rails.logger.info("Connection closed(#{@worker_number})")
- @connections.delete_if {|k, v| v == self }
end
def receive_data(data)
@@ -126,44 +123,18 @@ module Aclog
# unregister
end
- def receive_user(msg)
- @@queue.push -> do
- Rails.logger.debug("Received User(#{@worker_number}): #{msg["id"]}")
- User.from_hash(:id => msg["id"],
- :screen_name => msg["screen_name"],
- :name => msg["name"],
- :profile_image_url => msg["profile_image_url"],
- :protected => msg["protected"])
- end
- end
-
def receive_tweet(msg)
@@queue.push -> do
Rails.logger.debug("Received Tweet(#{@worker_number}): #{msg["id"]}")
- unless @@saved_tweets.include?(msg["id"])
- @@saved_tweets << msg["id"]
- if @@saved_tweets.size > 100000
- Rails.logger.debug("Tweet id dropped from cache: #{@@saved_tweets.shift}")
- end
-
- Tweet.from_hash(:id => msg["id"],
- :text => msg["text"],
- :source => msg["source"],
- :tweeted_at => Time.parse(msg["tweeted_at"]),
- :user_id => msg["user_id"])
- else
- Rails.logger.debug("Tweet already exists(#{@worker_number}): #{msg["id"]}")
- end
+ Tweet.from_receiver(msg)
end
end
def receive_favorite(msg)
@@queue.push -> do
Rails.logger.debug("Receive Favorite(#{@worker_number}): #{msg["user_id"]} => #{msg["tweet_id"]}")
- f = Favorite.from_hash(:tweet_id => msg["tweet_id"],
- :user_id => msg["user_id"])
- if Settings.notification.enabled && t = Tweet.find_by(id: msg["tweet_id"])
- Notification.notify_favorite(t)
+ if f = Favorite.from_receiver(msg)
+ f.tweet.notify_favorite
end
end
end
@@ -171,24 +142,21 @@ module Aclog
def receive_unfavorite(msg)
@@queue.push -> do
Rails.logger.debug("Receive Unfavorite(#{@worker_number}): #{msg["user_id"]} => #{msg["tweet_id"]}")
- Favorite.delete_from_hash(:tweet_id => msg["tweet_id"],
- :user_id => msg["user_id"])
+ Favorite.delete_from_receiver(msg)
end
end
def receive_retweet(msg)
@@queue.push -> do
Rails.logger.debug("Receive Retweet(#{@worker_number}): #{msg["user_id"]} => #{msg["tweet_id"]}")
- Retweet.from_hash(:id => msg["id"],
- :tweet_id => msg["tweet_id"],
- :user_id => msg["user_id"])
+ Retweet.from_receiver(msg)
end
end
def receive_delete(msg)
@@queue.push -> do
Rails.logger.debug("Receive Delete(#{@worker_number}): #{msg["id"]}")
- Tweet.delete_from_id(msg["id"])
+ Tweet.delete_from_receiver(msg)
end
end
end