Class: Twterm::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/twterm/client.rb

Constant Summary collapse

CREATE_STATUS_PROC =
-> (s) { Status.new(s) }
@@instances =
[]

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(user_id, screen_name, token, secret) ⇒ Client

Returns a new instance of Client.



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/twterm/client.rb', line 9

def initialize(user_id, screen_name, token, secret)
  @user_id = user_id
  @screen_name = screen_name

  @rest_client = Twitter::REST::Client.new do |config|
    config.consumer_key        = 'vLNSVFgXclBJQJRZ7VLMxL9lA'
    config.consumer_secret     = 'OFLKzrepRG2p1hq0nUB9j2S9ndFQoNTPheTpmOY0GYw55jGgS5'
    config.access_token        = token
    config.access_token_secret = secret
  end

  TweetStream.configure do |config|
    config.consumer_key       = 'vLNSVFgXclBJQJRZ7VLMxL9lA'
    config.consumer_secret    = 'OFLKzrepRG2p1hq0nUB9j2S9ndFQoNTPheTpmOY0GYw55jGgS5'
    config.oauth_token        = token
    config.oauth_token_secret = secret
    config.auth_method        = :oauth
  end

  @stream_client = TweetStream::Client.new

  @callbacks = {}

  @mute_filter = -> _ { true }
  fetch_muted_users do |muted_user_ids|
    @mute_filter = lambda do |status|
      !muted_user_ids.include?(status.user.id) &&
        !(status.retweeted_status.is_a?(Twitter::NullObject) &&
        muted_user_ids.include?(status.retweeted_status.user.id))
    end
  end

  @@instances << self
end

Instance Attribute Details

#screen_nameObject (readonly)

Returns the value of attribute screen_name.



3
4
5
# File 'lib/twterm/client.rb', line 3

def screen_name
  @screen_name
end

#user_idObject (readonly)

Returns the value of attribute user_id.



3
4
5
# File 'lib/twterm/client.rb', line 3

def user_id
  @user_id
end

Class Method Details

.currentObject



232
233
234
# File 'lib/twterm/client.rb', line 232

def current
  @@instances[0]
end

.new(user_id, screen_name, token, secret) ⇒ Object



226
227
228
229
230
# File 'lib/twterm/client.rb', line 226

def new(user_id, screen_name, token, secret)
  detector = -> (instance) { instance.user_id == user_id }
  instance = @@instances.find(&detector)
  instance.nil? ? super : instance
end

Instance Method Details

#connect_streamObject



74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/twterm/client.rb', line 74

def connect_stream
  @stream_client.stop_stream

  @streaming_thread = Thread.new do
    begin
      Notifier.instance.show_message 'Trying to connect to Twitter...'
      @stream_client.userstream
    rescue EventMachine::ConnectionError
      Notifier.instance.show_error 'Connection failed'
      sleep 30
      retry
    end
  end
end

#destroy_status(status) ⇒ Object



197
198
199
200
201
202
203
204
205
206
# File 'lib/twterm/client.rb', line 197

def destroy_status(status)
  send_request do
    begin
      @rest_client.destroy_status(status.id)
      yield if block_given?
    rescue Twitter::Error::NotFound, Twitter::Error::Forbidden
      Notifier.instance.show_error 'You cannot destroy that status'
    end
  end
end

#favorite(status) ⇒ Object



161
162
163
164
165
166
167
168
169
170
171
# File 'lib/twterm/client.rb', line 161

def favorite(status)
  return false unless status.is_a? Status

  send_request do
    @rest_client.favorite(status.id)
    status.favorite!
    yield status if block_given?
  end

  self
end

#fetch_muted_usersObject



208
209
210
211
212
213
# File 'lib/twterm/client.rb', line 208

def fetch_muted_users
  send_request do
    @muted_user_ids = @rest_client.muted_ids.to_a
    yield @muted_user_ids if block_given?
  end
end

#home_timelineObject



100
101
102
103
104
# File 'lib/twterm/client.rb', line 100

def home_timeline
  send_request do
    yield @rest_client.home_timeline(count: 100).select(&@mute_filter).map(&CREATE_STATUS_PROC)
  end
end

#list(list_id) ⇒ Object



118
119
120
121
122
# File 'lib/twterm/client.rb', line 118

def list(list_id)
  send_request do
    yield List.new(@rest_client.list(list_id))
  end
end

#list_timeline(list) ⇒ Object



130
131
132
133
134
135
# File 'lib/twterm/client.rb', line 130

def list_timeline(list)
  fail ArgumentError, 'argument must be an instance of List class' unless list.is_a? List
  send_request do
    yield @rest_client.list_timeline(list.id, count: 100).select(&@mute_filter).map(&CREATE_STATUS_PROC)
  end
end

#listsObject



124
125
126
127
128
# File 'lib/twterm/client.rb', line 124

def lists
  send_request do
    yield @rest_client.lists.map { |list| List.new(list) }
  end
end

#mentionsObject



106
107
108
109
110
# File 'lib/twterm/client.rb', line 106

def mentions
  send_request do
    yield @rest_client.mentions(count: 100).select(&@mute_filter).map(&CREATE_STATUS_PROC)
  end
end

#on_mention(&block) ⇒ Object



220
221
222
223
# File 'lib/twterm/client.rb', line 220

def on_mention(&block)
  fail ArgumentError, 'no block given' unless block_given?
  on(:mention, &block)
end

#on_timeline_status(&block) ⇒ Object



215
216
217
218
# File 'lib/twterm/client.rb', line 215

def on_timeline_status(&block)
  fail ArgumentError, 'no block given' unless block_given?
  on(:timeline_status, &block)
end

#post(text, in_reply_to = nil) ⇒ Object



89
90
91
92
93
94
95
96
97
98
# File 'lib/twterm/client.rb', line 89

def post(text, in_reply_to = nil)
  send_request do
    if in_reply_to.is_a? Status
      text = "@#{in_reply_to.user.screen_name} #{text}"
      @rest_client.update(text, in_reply_to_status_id: in_reply_to.id)
    else
      @rest_client.update(text)
    end
  end
end

#retweet(status) ⇒ Object



183
184
185
186
187
188
189
190
191
192
193
194
195
# File 'lib/twterm/client.rb', line 183

def retweet(status)
  return false unless status.is_a? Status

  send_request do
    begin
      @rest_client.retweet!(status.id)
      status.retweet!
      yield status if block_given?
    rescue Twitter::Error::AlreadyRetweeted, Twitter::Error::NotFound, Twitter::Error::Forbidden
      Notifier.instance.show_error 'Retweet attempt failed'
    end
  end
end

#search(query) ⇒ Object



137
138
139
140
141
# File 'lib/twterm/client.rb', line 137

def search(query)
  send_request do
    yield @rest_client.search(query, count: 100).select(&@mute_filter).map(&CREATE_STATUS_PROC)
  end
end

#show_status(status_id) ⇒ Object



143
144
145
146
147
# File 'lib/twterm/client.rb', line 143

def show_status(status_id)
  send_request do
    yield Status.new(@rest_client.status(status_id))
  end
end

#show_user(query) ⇒ Object



149
150
151
152
153
154
155
156
157
158
159
# File 'lib/twterm/client.rb', line 149

def show_user(query)
  send_request do
    user =
      begin
        User.new(@rest_client.user(query))
      rescue Twitter::Error::NotFound
        nil
      end
    yield user
  end
end

#streamObject



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/twterm/client.rb', line 44

def stream
  @stream_client.on_friends do
    Notifier.instance.show_message 'Connection established' unless @stream_connected
    @stream_connected = true
  end

  @stream_client.on_timeline_status do |tweet|
    status = Status.new(tweet)
    invoke_callbacks(:timeline_status, status)
    invoke_callbacks(:mention, status) if status.text.include? "@#{@screen_name}"
  end

  @stream_client.on_delete do |status_id|
    timeline.delete_status(status_id)
  end

  @stream_client.on_event(:favorite) do |event|
    break if event[:source][:screen_name] == @screen_name
    message = "@#{event[:source][:screen_name]} has favorited your tweet: #{event[:target_object][:text]}"
    Notifier.instance.show_message(message)
  end

  @stream_client.on_no_data_received do
    @stream_connected = false
    connect_stream
  end

  connect_stream
end

#unfavorite(status) ⇒ Object



173
174
175
176
177
178
179
180
181
# File 'lib/twterm/client.rb', line 173

def unfavorite(status)
  fail ArgumentError, 'argument must be an instance of Status class' unless status.is_a? Status

  send_request do
    @rest_client.unfavorite(status.id)
    status.unfavorite!
    yield status if block_given?
  end
end

#user_timeline(user_id) ⇒ Object



112
113
114
115
116
# File 'lib/twterm/client.rb', line 112

def user_timeline(user_id)
  send_request do
    yield @rest_client.user_timeline(user_id, count: 100).select(&@mute_filter).map(&CREATE_STATUS_PROC)
  end
end