annotate app/models/tweet.rb @ 144:1925b08153dc

Record 404s
author nanaya <me@nanaya.pro>
date Wed, 13 Dec 2017 06:10:13 +0900
parents 8a858aec1905
children c791b6bfeeda
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15
207917e41964 Add tweets~
edogawaconan <me@myconan.net>
parents:
diff changeset
1 class Tweet
137
00dc9346dfaa Skip self retweets
nanaya <me@nanaya.pro>
parents: 136
diff changeset
2 TIMELINE_OPTIONS = {
00dc9346dfaa Skip self retweets
nanaya <me@nanaya.pro>
parents: 136
diff changeset
3 :count => 100,
00dc9346dfaa Skip self retweets
nanaya <me@nanaya.pro>
parents: 136
diff changeset
4 :exclude_replies => false,
00dc9346dfaa Skip self retweets
nanaya <me@nanaya.pro>
parents: 136
diff changeset
5 :include_rts => true,
00dc9346dfaa Skip self retweets
nanaya <me@nanaya.pro>
parents: 136
diff changeset
6 :tweet_mode => :extended,
00dc9346dfaa Skip self retweets
nanaya <me@nanaya.pro>
parents: 136
diff changeset
7 }
00dc9346dfaa Skip self retweets
nanaya <me@nanaya.pro>
parents: 136
diff changeset
8
135
3fc882b0884d Refactored client initialization
nanaya <me@nanaya.pro>
parents: 134
diff changeset
9 def initialize(twitter_id)
3fc882b0884d Refactored client initialization
nanaya <me@nanaya.pro>
parents: 134
diff changeset
10 @clients = {}
3fc882b0884d Refactored client initialization
nanaya <me@nanaya.pro>
parents: 134
diff changeset
11 @twitter_id = twitter_id
3fc882b0884d Refactored client initialization
nanaya <me@nanaya.pro>
parents: 134
diff changeset
12 end
3fc882b0884d Refactored client initialization
nanaya <me@nanaya.pro>
parents: 134
diff changeset
13
97
ff5557f9902c Avoid uniformly expiring cache
nanaya <me@myconan.net>
parents: 88
diff changeset
14 def cache_expires_time
107
de342c5df747 Extend cache time to up to 30 minutes
nanaya <me@myconan.net>
parents: 100
diff changeset
15 (15 + rand(15)).minutes
97
ff5557f9902c Avoid uniformly expiring cache
nanaya <me@myconan.net>
parents: 88
diff changeset
16 end
ff5557f9902c Avoid uniformly expiring cache
nanaya <me@myconan.net>
parents: 88
diff changeset
17
86
5bfc986200db The caching becomes a bit confusing because of parameters
nanaya <me@myconan.net>
parents: 78
diff changeset
18 def timeline
135
3fc882b0884d Refactored client initialization
nanaya <me@nanaya.pro>
parents: 134
diff changeset
19 initial_config_id = client_config_id
76
0c023d35cd80 Allows usage of multiple twitter keys
nanaya <me@myconan.net>
parents: 73
diff changeset
20
134
3646b3e319c7 Only try/catch the tweet downloading part
nanaya <me@nanaya.pro>
parents: 108
diff changeset
21 @timeline ||=
143
8a858aec1905 Stringify the cache key
nanaya <me@nanaya.pro>
parents: 142
diff changeset
22 Rails.cache.fetch("timeline:v1:#{@twitter_id}", :expires_in => cache_expires_time) do
134
3646b3e319c7 Only try/catch the tweet downloading part
nanaya <me@nanaya.pro>
parents: 108
diff changeset
23 begin
141
88d7a7714d4e Restrict to just the fetch process
nanaya <me@nanaya.pro>
parents: 138
diff changeset
24 timeline = client.user_timeline(@twitter_id, TIMELINE_OPTIONS)
134
3646b3e319c7 Only try/catch the tweet downloading part
nanaya <me@nanaya.pro>
parents: 108
diff changeset
25 rescue Twitter::Error::TooManyRequests
135
3fc882b0884d Refactored client initialization
nanaya <me@nanaya.pro>
parents: 134
diff changeset
26 @client_config_id += 1
134
3646b3e319c7 Only try/catch the tweet downloading part
nanaya <me@nanaya.pro>
parents: 108
diff changeset
27
135
3fc882b0884d Refactored client initialization
nanaya <me@nanaya.pro>
parents: 134
diff changeset
28 if initial_config_id == client_config_id
134
3646b3e319c7 Only try/catch the tweet downloading part
nanaya <me@nanaya.pro>
parents: 108
diff changeset
29 raise
3646b3e319c7 Only try/catch the tweet downloading part
nanaya <me@nanaya.pro>
parents: 108
diff changeset
30 else
3646b3e319c7 Only try/catch the tweet downloading part
nanaya <me@nanaya.pro>
parents: 108
diff changeset
31 retry
3646b3e319c7 Only try/catch the tweet downloading part
nanaya <me@nanaya.pro>
parents: 108
diff changeset
32 end
144
1925b08153dc Record 404s
nanaya <me@nanaya.pro>
parents: 143
diff changeset
33 rescue Twitter::Error::NotFound
1925b08153dc Record 404s
nanaya <me@nanaya.pro>
parents: 143
diff changeset
34 data = { :result => :not_found }
76
0c023d35cd80 Allows usage of multiple twitter keys
nanaya <me@myconan.net>
parents: 73
diff changeset
35 end
141
88d7a7714d4e Restrict to just the fetch process
nanaya <me@nanaya.pro>
parents: 138
diff changeset
36
144
1925b08153dc Record 404s
nanaya <me@nanaya.pro>
parents: 143
diff changeset
37 data || {
1925b08153dc Record 404s
nanaya <me@nanaya.pro>
parents: 143
diff changeset
38 :result => :ok,
1925b08153dc Record 404s
nanaya <me@nanaya.pro>
parents: 143
diff changeset
39 :timeline => timeline.select do |tweet|
1925b08153dc Record 404s
nanaya <me@nanaya.pro>
parents: 143
diff changeset
40 tweet.retweeted_status.nil? || tweet.user.id != tweet.retweeted_status.user.id
1925b08153dc Record 404s
nanaya <me@nanaya.pro>
parents: 143
diff changeset
41 end.map do |tweet|
1925b08153dc Record 404s
nanaya <me@nanaya.pro>
parents: 143
diff changeset
42 # Fails when there's Twitter::NullObject initiated somewhere in previous select
1925b08153dc Record 404s
nanaya <me@nanaya.pro>
parents: 143
diff changeset
43 # Reference: https://github.com/sferik/twitter/issues/892
1925b08153dc Record 404s
nanaya <me@nanaya.pro>
parents: 143
diff changeset
44 tweet.to_h
1925b08153dc Record 404s
nanaya <me@nanaya.pro>
parents: 143
diff changeset
45 end,
1925b08153dc Record 404s
nanaya <me@nanaya.pro>
parents: 143
diff changeset
46 }
1925b08153dc Record 404s
nanaya <me@nanaya.pro>
parents: 143
diff changeset
47 end.tap do |data|
1925b08153dc Record 404s
nanaya <me@nanaya.pro>
parents: 143
diff changeset
48 raise Twitter::Error::NotFound if data[:result] == :not_found
1925b08153dc Record 404s
nanaya <me@nanaya.pro>
parents: 143
diff changeset
49
1925b08153dc Record 404s
nanaya <me@nanaya.pro>
parents: 143
diff changeset
50 data[:timeline_parsed] = data[:timeline].map do |tweet_hash|
1925b08153dc Record 404s
nanaya <me@nanaya.pro>
parents: 143
diff changeset
51 Twitter::Tweet.new(tweet_hash)
141
88d7a7714d4e Restrict to just the fetch process
nanaya <me@nanaya.pro>
parents: 138
diff changeset
52 end
144
1925b08153dc Record 404s
nanaya <me@nanaya.pro>
parents: 143
diff changeset
53 end[:timeline_parsed]
15
207917e41964 Add tweets~
edogawaconan <me@myconan.net>
parents:
diff changeset
54 end
207917e41964 Add tweets~
edogawaconan <me@myconan.net>
parents:
diff changeset
55
48
8983c426e256 Prevent exploding on empty timeline.
nanaya <me@myconan.net>
parents: 47
diff changeset
56 def user
8983c426e256 Prevent exploding on empty timeline.
nanaya <me@myconan.net>
parents: 47
diff changeset
57 @user ||=
8983c426e256 Prevent exploding on empty timeline.
nanaya <me@myconan.net>
parents: 47
diff changeset
58 if timeline.any?
8983c426e256 Prevent exploding on empty timeline.
nanaya <me@myconan.net>
parents: 47
diff changeset
59 timeline.first.user
8983c426e256 Prevent exploding on empty timeline.
nanaya <me@myconan.net>
parents: 47
diff changeset
60 else
143
8a858aec1905 Stringify the cache key
nanaya <me@nanaya.pro>
parents: 142
diff changeset
61 Rails.cache.fetch("user:v1:#{@twitter_id}", :expires_in => cache_expires_time) do
142
2d873f57f424 Forgot about this one
nanaya <me@nanaya.pro>
parents: 141
diff changeset
62 client.user(@twitter_id)
48
8983c426e256 Prevent exploding on empty timeline.
nanaya <me@myconan.net>
parents: 47
diff changeset
63 end
8983c426e256 Prevent exploding on empty timeline.
nanaya <me@myconan.net>
parents: 47
diff changeset
64 end
8983c426e256 Prevent exploding on empty timeline.
nanaya <me@myconan.net>
parents: 47
diff changeset
65 end
8983c426e256 Prevent exploding on empty timeline.
nanaya <me@myconan.net>
parents: 47
diff changeset
66
135
3fc882b0884d Refactored client initialization
nanaya <me@nanaya.pro>
parents: 134
diff changeset
67 def client
3fc882b0884d Refactored client initialization
nanaya <me@nanaya.pro>
parents: 134
diff changeset
68 @clients[client_config_id] ||=
3fc882b0884d Refactored client initialization
nanaya <me@nanaya.pro>
parents: 134
diff changeset
69 Twitter::REST::Client.new do |config|
3fc882b0884d Refactored client initialization
nanaya <me@nanaya.pro>
parents: 134
diff changeset
70 $cfg[:twitter][client_config_id].each do |cfg_key, cfg_value|
138
7907fe886675 Better use symbol?
nanaya <me@nanaya.pro>
parents: 137
diff changeset
71 config.public_send(:"#{cfg_key}=", cfg_value)
135
3fc882b0884d Refactored client initialization
nanaya <me@nanaya.pro>
parents: 134
diff changeset
72 end
3fc882b0884d Refactored client initialization
nanaya <me@nanaya.pro>
parents: 134
diff changeset
73 end
76
0c023d35cd80 Allows usage of multiple twitter keys
nanaya <me@myconan.net>
parents: 73
diff changeset
74 end
0c023d35cd80 Allows usage of multiple twitter keys
nanaya <me@myconan.net>
parents: 73
diff changeset
75
135
3fc882b0884d Refactored client initialization
nanaya <me@nanaya.pro>
parents: 134
diff changeset
76 def client_config_id
3fc882b0884d Refactored client initialization
nanaya <me@nanaya.pro>
parents: 134
diff changeset
77 @client_config_id ||= 0
76
0c023d35cd80 Allows usage of multiple twitter keys
nanaya <me@myconan.net>
parents: 73
diff changeset
78
136
59991d10f8a3 Fix the variable as well while at it
nanaya <me@nanaya.pro>
parents: 135
diff changeset
79 @client_config_id %= $cfg[:twitter].size
15
207917e41964 Add tweets~
edogawaconan <me@myconan.net>
parents:
diff changeset
80 end
207917e41964 Add tweets~
edogawaconan <me@myconan.net>
parents:
diff changeset
81 end