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 +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
|