twterm 2.6.0 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/twterm/app.rb +0 -16
- data/lib/twterm/client.rb +1 -4
- data/lib/twterm/rest_client.rb +0 -33
- data/lib/twterm/tab/new/index.rb +0 -10
- data/lib/twterm/tab/user_tab.rb +0 -9
- data/lib/twterm/version.rb +1 -1
- metadata +3 -11
- data/lib/twterm/direct_message.rb +0 -60
- data/lib/twterm/direct_message_composer.rb +0 -80
- data/lib/twterm/direct_message_manager.rb +0 -51
- data/lib/twterm/event/direct_message/fetched.rb +0 -10
- data/lib/twterm/event/notification/direct_message.rb +0 -30
- data/lib/twterm/repository/direct_message_repository.rb +0 -14
- data/lib/twterm/tab/direct_message/conversation.rb +0 -104
- data/lib/twterm/tab/direct_message/conversation_list.rb +0 -100
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0e671a532f1618d8104f52f972a733eacc9b417328475f32efe887d382bc7608
|
4
|
+
data.tar.gz: 7bccdd9bdbb33042b367983c7250f3fb1521c1726a81e9c80b34f90fd1cae071
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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, :
|
33
|
+
attr_reader :friendship_repository, :hashtag_repository, :list_repository, :status_repository, :user_repository
|
37
34
|
end
|
38
35
|
end
|
data/lib/twterm/rest_client.rb
CHANGED
@@ -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
|
data/lib/twterm/tab/new/index.rb
CHANGED
@@ -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
|
data/lib/twterm/tab/user_tab.rb
CHANGED
@@ -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')
|
data/lib/twterm/version.rb
CHANGED
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.
|
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-
|
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.
|
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,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
|