twterm 2.6.0 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5edeb8383924ffcd0cd837dad84d60637bfdae3de7a4edf00a0a9bb9aeaf6a7e
4
- data.tar.gz: f707dc76ada2cdf2082e6d7aeec9d8a890056fdde114fa90b3b69aaa28ea257f
3
+ metadata.gz: 0e671a532f1618d8104f52f972a733eacc9b417328475f32efe887d382bc7608
4
+ data.tar.gz: 7bccdd9bdbb33042b367983c7250f3fb1521c1726a81e9c80b34f90fd1cae071
5
5
  SHA512:
6
- metadata.gz: d92d30135cd6793a117ecb2b1f4a8648ade22e5759c2dadf7c7b39afea0ac72e3622da83d0577a3acb2f96b63d1976928a228e756544a9c694e7eddfd2eb79a2
7
- data.tar.gz: f488de8b0fed4655ed95ff767910b136bcd7deeded6258fbffa561f9699b55a3404315ecaf19144a1eed096348559753f1ef78d176976a77109cf946c2590527
6
+ metadata.gz: 49e31ffb5cdcab3e2a59e62c59f4f25ee495fd7209f4fc6df876dadd7f9dfd38b7760a6e8686518e2f886c5a4e353aad0b2c9d22436205a244e47a45264c0eba
7
+ data.tar.gz: 1ee336d6a643c75b6958a559397828914f6d83afa0069881708860bdea8ea28bc622dc92d3dd94f51ca0b2931ce3bed2d40d2b0d28da5e73f3fbd0d377c8eaa2
data/lib/twterm/app.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  require 'curses'
2
2
 
3
3
  require 'twterm/completion_manager'
4
- require 'twterm/direct_message_composer'
5
4
  require 'twterm/environment'
6
5
  require 'twterm/event/screen/refresh'
7
6
  require 'twterm/event/screen/resize'
@@ -10,7 +9,6 @@ require 'twterm/notification_dispatcher'
10
9
  require 'twterm/persistable_configuration_proxy'
11
10
  require 'twterm/preferences'
12
11
  require 'twterm/photo_viewer'
13
- require 'twterm/repository/direct_message_repository'
14
12
  require 'twterm/repository/friendship_repository'
15
13
  require 'twterm/repository/hashtag_repository'
16
14
  require 'twterm/repository/list_repository'
@@ -42,14 +40,6 @@ module Twterm
42
40
  @completion_manager ||= CompletionManager.new(self)
43
41
  end
44
42
 
45
- def direct_message_composer
46
- @direct_message_composer ||= DirectMessageComposer.new(self, client)
47
- end
48
-
49
- def direct_message_repository
50
- @direct_messages_repository ||= Repository::DirectMessageRepository.new
51
- end
52
-
53
43
  def friendship_repository
54
44
  @friendship_repository ||= Repository::FriendshipRepository.new
55
45
  end
@@ -103,11 +93,6 @@ module Twterm
103
93
  user_repository.expire(3600)
104
94
  end
105
95
 
106
- direct_message_repository.before_create do |dm|
107
- user_repository.create(dm.recipient)
108
- user_repository.create(dm.sender)
109
- end
110
-
111
96
  user_repository.before_create do |user|
112
97
  client_id = client.user_id
113
98
 
@@ -179,7 +164,6 @@ module Twterm
179
164
  config[:access_token_secret],
180
165
  {
181
166
  friendship: friendship_repository,
182
- direct_message: direct_message_repository,
183
167
  hashtag: hashtag_repository,
184
168
  list: list_repository,
185
169
  status: status_repository,
data/lib/twterm/client.rb CHANGED
@@ -11,7 +11,6 @@ module Twterm
11
11
  @access_token, @access_token_secret = access_token, access_token_secret
12
12
 
13
13
  @friendship_repository = repositories[:friendship]
14
- @direct_message_repository = repositories[:direct_message]
15
14
  @hashtag_repository = repositories[:hashtag]
16
15
  @list_repository = repositories[:list]
17
16
  @status_repository = repositories[:status]
@@ -27,12 +26,10 @@ module Twterm
27
26
  muted_user_ids.include?(status.retweeted_status.user.id))
28
27
  end
29
28
  end
30
-
31
- direct_message_manager
32
29
  end
33
30
 
34
31
  private
35
32
 
36
- attr_reader :friendship_repository, :direct_message_repository, :hashtag_repository, :list_repository, :status_repository, :user_repository
33
+ attr_reader :friendship_repository, :hashtag_repository, :list_repository, :status_repository, :user_repository
37
34
  end
38
35
  end
@@ -1,6 +1,4 @@
1
1
  require 'concurrent'
2
- require 'twterm/direct_message'
3
- require 'twterm/direct_message_manager'
4
2
  require 'twterm/publisher'
5
3
  require 'twterm/event/message/success'
6
4
 
@@ -25,33 +23,6 @@ module Twterm
25
23
  end
26
24
  end
27
25
 
28
- def create_direct_message(recipient, text)
29
- send_request do
30
- rest_client.create_direct_message(recipient.id, text)
31
- end.then do |message|
32
- msg = direct_message_repository.create(message)
33
- direct_message_manager.add(recipient.id, msg)
34
- publish(Event::DirectMessage::Fetched.new)
35
- publish(Event::Message::Success.new('Your message to @%s has been sent' % recipient.screen_name))
36
- end
37
- end
38
-
39
- def direct_message_conversations
40
- direct_message_manager.conversations
41
- end
42
-
43
- def direct_messages_received
44
- send_request do
45
- rest_client.direct_messages(count: 200).map { |dm| direct_message_repository.create(dm) }
46
- end
47
- end
48
-
49
- def direct_messages_sent
50
- send_request do
51
- rest_client.direct_messages_sent(count: 200).map { |dm| direct_message_repository.create(dm) }
52
- end
53
- end
54
-
55
26
  def destroy_status(status)
56
27
  send_request_without_catch do
57
28
  rest_client.destroy_status(status.id)
@@ -424,10 +395,6 @@ module Twterm
424
395
 
425
396
  private
426
397
 
427
- def direct_message_manager
428
- @direct_message_manager ||= DirectMessageManager.new(self)
429
- end
430
-
431
398
  def show_error
432
399
  proc do |e|
433
400
  case e
@@ -1,5 +1,4 @@
1
1
  require 'twterm/tab/abstract_tab'
2
- require 'twterm/tab/direct_message/conversation_list'
3
2
  require 'twterm/tab/rate_limit_status'
4
3
  require 'twterm/tab/preferences/index'
5
4
 
@@ -19,7 +18,6 @@ module Twterm
19
18
 
20
19
  def items
21
20
  %i(
22
- direct_messages
23
21
  list_tab
24
22
  search_tab
25
23
  user_tab
@@ -60,8 +58,6 @@ module Twterm
60
58
 
61
59
  desc =
62
60
  case item
63
- when :direct_messages
64
- 'Direct messages'
65
61
  when :list_tab
66
62
  'List tab'
67
63
  when :search_tab
@@ -82,10 +78,6 @@ module Twterm
82
78
  .reduce(Image.empty, :|)
83
79
  end
84
80
 
85
- def open_direct_messages
86
- switch(Tab::DirectMessage::ConversationList.new(app, client))
87
- end
88
-
89
81
  def open_list_tab
90
82
  switch(Tab::New::List.new(app, client))
91
83
  end
@@ -114,8 +106,6 @@ module Twterm
114
106
 
115
107
  def perform_selected_action
116
108
  case current_item
117
- when :direct_messages
118
- open_direct_messages
119
109
  when :list_tab
120
110
  open_list_tab
121
111
  when :search_tab
@@ -53,7 +53,6 @@ module Twterm
53
53
  :profile_image,
54
54
  (:profile_background_image unless user.profile_background_image.nil?),
55
55
  :manage_lists,
56
- (:compose_direct_message unless myself?),
57
56
  (:open_website unless user.website.nil?),
58
57
  (:toggle_follow unless myself?),
59
58
  (:toggle_mute unless myself?),
@@ -96,10 +95,6 @@ module Twterm
96
95
  app.friendship_repository.blocking?(client.user_id, user_id)
97
96
  end
98
97
 
99
- def compose_direct_message
100
- app.direct_message_composer.compose(user)
101
- end
102
-
103
98
  def follow
104
99
  client.follow(user_id).then do |users|
105
100
  render
@@ -176,8 +171,6 @@ module Twterm
176
171
 
177
172
  def perform_selected_action
178
173
  case scroller.current_item
179
- when :compose_direct_message
180
- compose_direct_message
181
174
  when :manage_lists
182
175
  open_list_management_tab
183
176
  when :open_in_browser
@@ -294,8 +287,6 @@ module Twterm
294
287
  curr = scroller.current_index?(i)
295
288
  Image.cursor(1, curr) - Image.whitespace -
296
289
  case item
297
- when :compose_direct_message
298
- Image.string('Compose direct message')
299
290
  when :toggle_block
300
291
  if blocking?
301
292
  Image.string('Unblock this user')
@@ -1,3 +1,3 @@
1
1
  module Twterm
2
- VERSION = '2.6.0'
2
+ VERSION = '2.7.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twterm
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.0
4
+ version: 2.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryota Kameoka
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-15 00:00:00.000000000 Z
11
+ date: 2018-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: curses
@@ -234,19 +234,14 @@ files:
234
234
  - lib/twterm/completer/search_query_completer.rb
235
235
  - lib/twterm/completion_manager.rb
236
236
  - lib/twterm/config.rb
237
- - lib/twterm/direct_message.rb
238
- - lib/twterm/direct_message_composer.rb
239
- - lib/twterm/direct_message_manager.rb
240
237
  - lib/twterm/environment.rb
241
238
  - lib/twterm/event/abstract_event.rb
242
- - lib/twterm/event/direct_message/fetched.rb
243
239
  - lib/twterm/event/message/abstract_message.rb
244
240
  - lib/twterm/event/message/error.rb
245
241
  - lib/twterm/event/message/info.rb
246
242
  - lib/twterm/event/message/success.rb
247
243
  - lib/twterm/event/message/warning.rb
248
244
  - lib/twterm/event/notification/abstract_notification.rb
249
- - lib/twterm/event/notification/direct_message.rb
250
245
  - lib/twterm/event/notification/favorite.rb
251
246
  - lib/twterm/event/notification/follow.rb
252
247
  - lib/twterm/event/notification/list_member_added.rb
@@ -308,7 +303,6 @@ files:
308
303
  - lib/twterm/repository/abstract_entity_repository.rb
309
304
  - lib/twterm/repository/abstract_expirable_entity_repository.rb
310
305
  - lib/twterm/repository/abstract_repository.rb
311
- - lib/twterm/repository/direct_message_repository.rb
312
306
  - lib/twterm/repository/friendship_repository.rb
313
307
  - lib/twterm/repository/hashtag_repository.rb
314
308
  - lib/twterm/repository/list_repository.rb
@@ -321,8 +315,6 @@ files:
321
315
  - lib/twterm/status.rb
322
316
  - lib/twterm/subscriber.rb
323
317
  - lib/twterm/tab/abstract_tab.rb
324
- - lib/twterm/tab/direct_message/conversation.rb
325
- - lib/twterm/tab/direct_message/conversation_list.rb
326
318
  - lib/twterm/tab/dumpable.rb
327
319
  - lib/twterm/tab/exceptions.rb
328
320
  - lib/twterm/tab/key_assignments_cheatsheet.rb
@@ -409,7 +401,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
409
401
  version: '0'
410
402
  requirements: []
411
403
  rubyforge_project:
412
- rubygems_version: 2.7.6
404
+ rubygems_version: 2.7.7
413
405
  signing_key:
414
406
  specification_version: 4
415
407
  summary: A full-featured TUI Twitter client
@@ -1,60 +0,0 @@
1
- require 'twterm/user'
2
- require 'twterm/utils'
3
-
4
- module Twterm
5
- class DirectMessage
6
- attr_reader :id, :created_at, :recipient_id, :sender_id, :text
7
-
8
- def initialize(message)
9
- @id = message.id
10
- update!(message)
11
- end
12
-
13
- def ==(other)
14
- other.is_a?(self.class) && id == other.id
15
- end
16
-
17
- def date
18
- format = Time.now - @created_at < 86_400 ? '%H:%M:%S' : '%Y-%m-%d %H:%M:%S'
19
- @created_at.strftime(format)
20
- end
21
-
22
- def update!(message)
23
- @created_at = message.created_at.dup.localtime
24
- @recipient_id = message.recipient.id
25
- @sender_id = message.sender.id
26
- @text = message.text
27
-
28
- self
29
- end
30
-
31
- class Conversation
32
- include Utils
33
-
34
- attr_reader :collocutor_id, :messages
35
-
36
- def initialize(collocutor_id)
37
- @collocutor_id = collocutor_id
38
- @messages = []
39
- end
40
-
41
- def <<(message)
42
- @messages << message if messages.find { |m| m == message }.nil?
43
- @messages.sort_by!(&:created_at).reverse!
44
-
45
- self
46
- end
47
-
48
- def preview
49
- messages.sort_by(&:created_at).last.text.gsub("\n", ' ')
50
- end
51
-
52
- def updated_at
53
- updated_at = @messages.map(&:created_at).max
54
-
55
- format = Time.now - updated_at < 86_400 ? '%H:%M:%S' : '%Y-%m-%d %H:%M:%S'
56
- updated_at.strftime(format)
57
- end
58
- end
59
- end
60
- end
@@ -1,80 +0,0 @@
1
- require 'twterm/event/screen/refresh'
2
- require 'twterm/publisher'
3
- require 'twterm/user'
4
- require 'twterm/utils'
5
-
6
- module Twterm
7
- class DirectMessageComposer
8
- include Readline
9
- include Curses
10
- include Publisher
11
- include Utils
12
-
13
- def initialize(app, client)
14
- @app, @client = app, client
15
- end
16
-
17
- def compose(recipient)
18
- check_type User, recipient
19
-
20
- clear
21
-
22
- resetter = proc do
23
- reset_prog_mode
24
- sleep 0.1
25
- publish(Event::Screen::Refresh.new)
26
- end
27
-
28
- thread = Thread.new do
29
- close_screen
30
-
31
- puts "\nCompose new message to @%s:" % recipient.screen_name
32
-
33
- app.completion_manager.set_default_mode!
34
-
35
- loop do
36
- line = (readline('> ', true) || '').strip
37
- break if line.empty?
38
-
39
- if line.end_with?('\\')
40
- @text << line.chop.rstrip + "\n"
41
- else
42
- @text << line
43
- break
44
- end
45
- end
46
-
47
- puts "\n"
48
-
49
- resetter.call
50
- send(recipient) unless text.empty?
51
- end
52
-
53
- app.register_interruption_handler do
54
- thread.kill
55
- clear
56
- puts "\nCanceled"
57
- resetter.call
58
- end
59
-
60
- thread.join
61
- end
62
-
63
- private
64
-
65
- attr_reader :app, :client
66
-
67
- def clear
68
- @text = ''
69
- end
70
-
71
- def send(recipient)
72
- client.create_direct_message(recipient, text)
73
- clear
74
- end
75
-
76
- def text
77
- @text || ''
78
- end
79
- end
80
- end
@@ -1,51 +0,0 @@
1
- require 'twterm/client'
2
- require 'twterm/direct_message'
3
- require 'twterm/event/direct_message/fetched'
4
- require 'twterm/publisher'
5
- require 'twterm/scheduler'
6
- require 'twterm/user'
7
- require 'twterm/utils'
8
-
9
- module Twterm
10
- class DirectMessageManager
11
- include Publisher, Utils
12
-
13
- def initialize(client)
14
- check_type Client, client
15
-
16
- @client = client
17
- @conversations = {}
18
-
19
- fetch
20
-
21
- Scheduler.new(300) { fetch }
22
- end
23
-
24
- def add(collocutor_id, message)
25
- check_type DirectMessage, message
26
-
27
- @conversations[collocutor_id] ||= DirectMessage::Conversation.new(collocutor_id)
28
- @conversations[collocutor_id] << message
29
- end
30
-
31
- def fetch
32
- client.direct_messages_received.then do |messages|
33
- messages.each { |m| add(m.sender_id, m) }
34
- publish(Event::DirectMessage::Fetched.new)
35
- end
36
-
37
- client.direct_messages_sent.then do |messages|
38
- messages.each { |m| add(m.recipient_id, m) }
39
- publish(Event::DirectMessage::Fetched.new)
40
- end
41
- end
42
-
43
- def conversations
44
- @conversations.values
45
- end
46
-
47
- private
48
-
49
- attr_reader :client
50
- end
51
- end
@@ -1,10 +0,0 @@
1
- require 'twterm/event/abstract_event'
2
-
3
- module Twterm
4
- module Event
5
- module DirectMessage
6
- class Fetched < AbstractEvent
7
- end
8
- end
9
- end
10
- end
@@ -1,30 +0,0 @@
1
- require 'twterm/event/notification/abstract_notification'
2
-
3
- module Twterm
4
- module Event
5
- module Notification
6
- class DirectMessage < AbstractNotification
7
- # @param [Twterm::DirectMessage] message
8
- # @param [Twterm::User] user
9
- def initialize(message, user)
10
- @message = message
11
- @user = user
12
- end
13
-
14
- # @return [String] notification body
15
- def body
16
- message.text
17
- end
18
-
19
- # @return [String] notification title
20
- def title
21
- "@#{user.screen_name} has sent you a message"
22
- end
23
-
24
- private
25
-
26
- attr_reader :message, :user
27
- end
28
- end
29
- end
30
- end
@@ -1,14 +0,0 @@
1
- require 'twterm/direct_message'
2
- require 'twterm/repository/abstract_entity_repository'
3
-
4
- module Twterm
5
- module Repository
6
- class DirectMessageRepository < AbstractEntityRepository
7
- private
8
-
9
- def type
10
- DirectMessage
11
- end
12
- end
13
- end
14
- end
@@ -1,104 +0,0 @@
1
- require 'twterm/direct_message_composer'
2
- require 'twterm/event/direct_message/fetched'
3
- require 'twterm/image_builder/user_name_image_builder'
4
- require 'twterm/subscriber'
5
- require 'twterm/tab/abstract_tab'
6
- require 'twterm/tab/loadable'
7
- require 'twterm/tab/searchable'
8
-
9
- module Twterm
10
- module Tab
11
- module DirectMessage
12
- class Conversation < AbstractTab
13
- include Searchable
14
- include Subscriber
15
- include Loadable
16
-
17
- def drawable_item_count
18
- messages.drop(scroller.offset).lazy
19
- .map { |m| m.text.split_by_width(window.maxx - 4).count + 2 }
20
- .scan(0, :+)
21
- .each_cons(2)
22
- .select { |_, l| l < window.maxy }
23
- .count
24
- end
25
-
26
- def image
27
- return Image.string(initially_loaded? ? 'No results found' : 'Loading...') if items.empty?
28
-
29
- scroller.drawable_items.map.with_index(0) do |message, i|
30
- sender = app.user_repository.find(message.sender_id)
31
-
32
- header = [
33
- ImageBuilder::UserNameImageBuilder.new(sender).build,
34
- Image.string(message.date.to_s).brackets,
35
- ].intersperse(Image.whitespace).reduce(Image.empty, :-)
36
-
37
- body = message.text.split_by_width(window.maxx - 4)
38
- .map { |x| Image.string(x) }
39
- .reduce(Image.empty, :|)
40
-
41
- m = header | body
42
-
43
- cursor = Image.cursor(m.height, scroller.current_index?(i))
44
-
45
- cursor - Image.whitespace - m
46
- end
47
- .intersperse(Image.blank_line)
48
- .reduce(Image.empty, :|)
49
- end
50
-
51
- def initialize(app, client, conversation)
52
- super(app, client)
53
-
54
- @conversation = conversation
55
-
56
- subscribe(Event::DirectMessage::Fetched) { initially_loaded! }
57
- end
58
-
59
- def items
60
- messages
61
- end
62
-
63
- def matches?(message, query)
64
- sender = app.user_repository.find(message.sender_id)
65
-
66
- [
67
- message.text,
68
- sender.screen_name,
69
- sender.name
70
- ].any? { |x| x.downcase.include?(query.downcase) }
71
- end
72
-
73
- def respond_to_key(key)
74
- return true if scroller.respond_to_key(key)
75
-
76
- k = KeyMapper.instance
77
-
78
- case key
79
- when k[:status, :compose], k[:status, :reply]
80
- collocutor = app.user_repository.find(conversation.collocutor_id)
81
- app.direct_message_composer.compose(collocutor)
82
- else
83
- return false
84
- end
85
-
86
- true
87
- end
88
-
89
- def title
90
- collocutor = app.user_repository.find(conversation.collocutor_id)
91
- '@%s messages' % collocutor.screen_name
92
- end
93
-
94
- private
95
-
96
- attr_reader :conversation
97
-
98
- def messages
99
- @conversation.messages
100
- end
101
- end
102
- end
103
- end
104
- end
@@ -1,100 +0,0 @@
1
- require 'twterm/direct_message_composer'
2
- require 'twterm/event/direct_message/fetched'
3
- require 'twterm/image_builder/user_name_image_builder'
4
- require 'twterm/subscriber'
5
- require 'twterm/tab/abstract_tab'
6
- require 'twterm/tab/loadable'
7
- require 'twterm/tab/direct_message/conversation'
8
-
9
- module Twterm
10
- module Tab
11
- module DirectMessage
12
- class ConversationList < AbstractTab
13
- include Loadable
14
- include Searchable
15
- include Subscriber
16
-
17
- def drawable_item_count
18
- window.maxy.-(2).div(3)
19
- end
20
-
21
- def image
22
- return Image.string(initially_loaded? ? 'No results found' : 'Loading...') if items.empty?
23
-
24
- scroller.drawable_items.map.with_index(0) do |conversation, i|
25
- cursor = Image.cursor(2, scroller.current_index?(i))
26
-
27
- collocutor = app.user_repository.find(conversation.collocutor_id)
28
-
29
- header = [
30
- ImageBuilder::UserNameImageBuilder.new(collocutor).build,
31
- Image.string(conversation.updated_at.to_s).brackets,
32
- ].intersperse(Image.whitespace).reduce(Image.empty, :-)
33
-
34
- body = Image.string(conversation.preview.split_by_width(window.maxx - 4).first)
35
-
36
- cursor - Image.whitespace - (header | body)
37
- end
38
- .intersperse(Image.blank_line)
39
- .reduce(Image.empty, :|)
40
- end
41
-
42
- def initialize(app, client)
43
- super(app, client)
44
-
45
- subscribe(Event::DirectMessage::Fetched) { initially_loaded! }
46
- end
47
-
48
- def ==(other)
49
- other.is_a?(self.class)
50
- end
51
-
52
- def items
53
- client.direct_message_conversations
54
- end
55
-
56
- def matches?(conversation, query)
57
- collocutor = app.user_repository.find(conversation.collocutor_id)
58
-
59
- [
60
- collocutor.name,
61
- collocutor.screen_name,
62
- conversation.preview
63
- ].any? { |x| x.downcase.include?(query.downcase) }
64
- end
65
-
66
- def respond_to_key(key)
67
- return true if scroller.respond_to_key(key)
68
-
69
- k = KeyMapper.instance
70
-
71
- case key
72
- when 10
73
- open_conversation
74
- when k[:status, :compose], k[:status, :reply]
75
- conversation = current_item
76
- collocutor = app.user_repository.find(conversation.collocutor_id)
77
- app.direct_message_composer.compose(collocutor)
78
- else
79
- return false
80
- end
81
-
82
- true
83
- end
84
-
85
- def title
86
- 'Direct Messages'
87
- end
88
-
89
- private
90
-
91
- def open_conversation
92
- conversation = scroller.current_item
93
-
94
- tab = Tab::DirectMessage::Conversation.new(app, client, conversation)
95
- app.tab_manager.add_and_show(tab)
96
- end
97
- end
98
- end
99
- end
100
- end