cosgrove 0.0.4.0pre2 → 0.0.4.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/Gemfile +3 -0
- data/README.md +57 -7
- data/cosgrove.gemspec +9 -10
- data/example-authorize-hive-sql.sh +5 -0
- data/lib/cosgrove.rb +3 -3
- data/lib/cosgrove/account.rb +27 -14
- data/lib/cosgrove/bot.rb +9 -16
- data/lib/cosgrove/comment_job.rb +4 -4
- data/lib/cosgrove/config.rb +20 -8
- data/lib/cosgrove/find_communities_job.rb +47 -0
- data/lib/cosgrove/market.rb +637 -90
- data/lib/cosgrove/support.rb +126 -41
- data/lib/cosgrove/upvote_job.rb +12 -8
- data/lib/cosgrove/utils.rb +181 -41
- data/lib/cosgrove/version.rb +1 -1
- metadata +40 -60
- data/Gemfile.lock +0 -220
data/lib/cosgrove/support.rb
CHANGED
@@ -4,9 +4,32 @@ module Cosgrove
|
|
4
4
|
include ActionView::Helpers::TextHelper
|
5
5
|
include ActionView::Helpers::DateHelper
|
6
6
|
|
7
|
-
|
7
|
+
# Reduce RL bucket depletion
|
8
|
+
def start_typing(event)
|
9
|
+
return if event.nil?
|
10
|
+
return unless event.respond_to? :channel
|
11
|
+
return unless event.channel.respond_to? :start_typing
|
12
|
+
|
13
|
+
@channels_typing ||= {}
|
14
|
+
|
15
|
+
if !!@channels_typing[event.channel.id] && (Time.now - @channels_typing[event.channel.id]) < 15
|
16
|
+
return
|
17
|
+
end
|
18
|
+
|
19
|
+
@channels_typing[event.channel.id] = Time.now
|
20
|
+
|
21
|
+
event.channel.start_typing
|
22
|
+
end
|
23
|
+
|
24
|
+
def suggest_account_name(account_name, chain = :hive)
|
25
|
+
chain = chain.to_s.downcase.to_sym
|
8
26
|
pattern = account_name.chars.each.map{ |c| c }.join('%')
|
9
|
-
guesses =
|
27
|
+
guesses = case chain
|
28
|
+
# when :steem then SteemApi::Account.where("name LIKE '%#{pattern}%'").pluck(:name)
|
29
|
+
when :hive then HiveSQL::Account.where("name LIKE '%#{pattern}%'").pluck(:name)
|
30
|
+
else
|
31
|
+
[]
|
32
|
+
end
|
10
33
|
|
11
34
|
if guesses.any?
|
12
35
|
guesses.sample
|
@@ -15,7 +38,7 @@ module Cosgrove
|
|
15
38
|
|
16
39
|
def unknown_account(account_name, event = nil)
|
17
40
|
help = ["Unknown account: *#{account_name}*"]
|
18
|
-
|
41
|
+
start_typing event
|
19
42
|
guess = suggest_account_name(account_name)
|
20
43
|
|
21
44
|
help << ", did you mean: #{guess}?" if !!guess
|
@@ -35,36 +58,70 @@ module Cosgrove
|
|
35
58
|
end
|
36
59
|
|
37
60
|
def append_link_details(event, slug)
|
61
|
+
return if skipped_channel? event.channel.id
|
62
|
+
|
63
|
+
chain = :hive
|
38
64
|
author_name, permlink = parse_slug slug
|
39
65
|
created = nil
|
40
66
|
cashout_time = nil
|
67
|
+
message = nil
|
41
68
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
69
|
+
return unless !!author_name && !!permlink
|
70
|
+
|
71
|
+
if !!event
|
72
|
+
begin
|
73
|
+
message = event.respond "Looking up `#{author_name}/#{permlink}` ..."
|
74
|
+
rescue Discordrb::Errors::NoPermission => _
|
75
|
+
puts "Unable to append link details on #{event.channel.server.name} in #{event.channel.name}"
|
76
|
+
skip_channel event.channel.id
|
77
|
+
return nil
|
78
|
+
end
|
50
79
|
end
|
51
80
|
|
52
|
-
|
53
|
-
when :steem then SteemApi::Comment.where(author: author_name, permlink: permlink)
|
54
|
-
when :
|
81
|
+
posts = case chain
|
82
|
+
# when :steem then SteemApi::Comment.where(author: author_name, permlink: permlink)
|
83
|
+
when :hive then HiveSQL::Comment.where(author: author_name, permlink: permlink)
|
55
84
|
end
|
56
85
|
|
86
|
+
posts.select(:ID, :created, :cashout_time, :author, :permlink, :active_votes, :children, :category)
|
87
|
+
|
88
|
+
post = posts.last
|
89
|
+
|
57
90
|
if post.nil?
|
58
91
|
# Fall back to RPC
|
59
92
|
api(chain).get_content(author_name, permlink) do |content, errors|
|
60
93
|
unless content.author.empty?
|
94
|
+
post = content
|
61
95
|
created = Time.parse(content.created + 'Z')
|
62
96
|
cashout_time = Time.parse(content.cashout_time + 'Z')
|
63
97
|
end
|
64
98
|
end
|
65
99
|
end
|
66
100
|
|
67
|
-
|
101
|
+
if post.nil?
|
102
|
+
if !!message
|
103
|
+
message = message.edit 'Looking for content on Hive ...'
|
104
|
+
end
|
105
|
+
|
106
|
+
# Fall back to Hive RPC
|
107
|
+
api(:hive).get_content(author_name, permlink) do |content, errors|
|
108
|
+
unless content.author.empty?
|
109
|
+
post = content
|
110
|
+
created = Time.parse(content.created + 'Z')
|
111
|
+
cashout_time = Time.parse(content.cashout_time + 'Z')
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
if post.nil?
|
117
|
+
if !!message
|
118
|
+
message = message.edit 'Unable to locate.'
|
119
|
+
sleep 5
|
120
|
+
message.delete
|
121
|
+
end
|
122
|
+
|
123
|
+
return
|
124
|
+
end
|
68
125
|
|
69
126
|
created ||= post.created
|
70
127
|
cashout_time ||= post.cashout_time
|
@@ -73,57 +130,70 @@ module Cosgrove
|
|
73
130
|
age = time_ago_in_words(created)
|
74
131
|
age = age.slice(0, 1).capitalize + age.slice(1..-1)
|
75
132
|
|
76
|
-
details << if created <
|
133
|
+
details << if created < 15.minutes.ago
|
77
134
|
"#{age} old"
|
78
135
|
else
|
79
136
|
"**#{age}** old"
|
80
137
|
end
|
138
|
+
message = message.edit details.join('; ') if !!message
|
139
|
+
|
140
|
+
if !!post.category && !!post.category.starts_with?('hive-') && (communities = Cosgrove::FindCommunitiesJob.new.perform(nil, [post.category]), 1).any?
|
141
|
+
details << "in #{communities.first.payload['props']['title']}" rescue nil
|
142
|
+
message = message.edit details.join('; ') if !!message
|
143
|
+
end
|
81
144
|
|
82
|
-
active_votes =
|
145
|
+
active_votes = case post.active_votes
|
146
|
+
when String then JSON[post.active_votes] rescue []
|
147
|
+
else; active_votes
|
148
|
+
end
|
83
149
|
|
84
|
-
if active_votes.any?
|
85
|
-
upvotes = active_votes.map{ |v| v if v.
|
86
|
-
downvotes = active_votes.map{ |v| v if v.
|
150
|
+
if active_votes.respond_to?(:any?) && active_votes.any?
|
151
|
+
upvotes = active_votes.map{ |v| v if v['weight'].to_i > 0 }.compact.count
|
152
|
+
downvotes = active_votes.map{ |v| v if v['weight'].to_i < 0 }.compact.count
|
87
153
|
netvotes = upvotes - downvotes
|
88
154
|
details << "Net votes: #{netvotes}"
|
155
|
+
message = message.edit details.join('; ') if !!message
|
89
156
|
|
90
157
|
# Only append this detail of the post less than an hour old.
|
91
158
|
if created > 1.hour.ago
|
92
159
|
votes = case chain
|
93
|
-
when :steem then SteemApi::Tx::Vote.where('timestamp > ?', post.created)
|
94
|
-
when :
|
160
|
+
# when :steem then SteemApi::Tx::Vote.where('timestamp > ?', post.created)
|
161
|
+
when :hive then HiveSQL::Tx::Vote.where('timestamp > ?', post.created)
|
95
162
|
end
|
96
|
-
total_votes = votes.count
|
97
|
-
total_voters = votes.distinct(:voter).
|
163
|
+
total_votes = votes.distinct("concat(author, permlink)").count
|
164
|
+
total_voters = votes.distinct(:voter).count
|
98
165
|
|
99
166
|
if total_votes > 0 && total_voters > 0
|
100
167
|
details << "Out of #{pluralize(total_votes - netvotes, 'vote')} cast by #{pluralize(total_voters, 'voter')}"
|
168
|
+
message = message.edit details.join('; ') if !!message
|
101
169
|
end
|
102
170
|
end
|
103
171
|
end
|
104
172
|
|
105
173
|
details << "Comments: #{post.children.to_i}"
|
174
|
+
message = message.edit details.join('; ') if !!message
|
106
175
|
|
176
|
+
# Page View counter is no longer supported by steemit.com.
|
107
177
|
# page_views = page_views("/#{post.parent_permlink}/@#{post.author}/#{post.permlink}")
|
108
178
|
# details << "Views: #{page_views}" if !!page_views
|
179
|
+
# message = message.edit details.join('; ') if !!message
|
109
180
|
|
110
|
-
|
111
|
-
event.respond details.join('; ')
|
112
|
-
rescue Discordrb::Errors::NoPermission => _
|
113
|
-
puts "Unable to append link details on #{event.channel.server.name} in #{event.channel.name}"
|
114
|
-
end
|
115
|
-
|
116
|
-
return nil
|
181
|
+
details.join('; ') if event.nil?
|
117
182
|
end
|
118
183
|
|
119
|
-
def find_account(key, event = nil, chain = :
|
184
|
+
def find_account(key, event = nil, chain = :hive)
|
120
185
|
key = key.to_s.downcase
|
121
|
-
chain
|
186
|
+
chain ||= :hive
|
187
|
+
chain = chain.to_s.downcase.to_sym
|
122
188
|
|
123
|
-
raise "Required argument: chain" if chain.nil?
|
124
189
|
|
125
|
-
|
126
|
-
|
190
|
+
case chain
|
191
|
+
# when :steem
|
192
|
+
# account = if (accounts = SteemApi::Account.where(name: key)).any?
|
193
|
+
# accounts.first
|
194
|
+
# end
|
195
|
+
when :hive
|
196
|
+
account = if (accounts = HiveSQL::Account.where(name: key)).any?
|
127
197
|
accounts.first
|
128
198
|
end
|
129
199
|
end
|
@@ -136,9 +206,9 @@ module Cosgrove
|
|
136
206
|
|
137
207
|
if account.nil?
|
138
208
|
account = if !!key
|
139
|
-
if chain == :steem && (accounts = SteemApi::Account.where(name: key)).any?
|
140
|
-
|
141
|
-
|
209
|
+
# if chain == :steem && (accounts = SteemApi::Account.where(name: key)).any?
|
210
|
+
# accounts.first
|
211
|
+
if chain == :hive && (accounts = HiveSQL::Account.where(name: key)).any?
|
142
212
|
accounts.first
|
143
213
|
else
|
144
214
|
# Fall back to RPC
|
@@ -193,7 +263,9 @@ module Cosgrove
|
|
193
263
|
end
|
194
264
|
end
|
195
265
|
|
196
|
-
def last_irreversible_block(chain = :
|
266
|
+
def last_irreversible_block(chain = :hive)
|
267
|
+
chain ||= :hive
|
268
|
+
chain = chain.to_s.downcase.to_sym
|
197
269
|
seconds_ago = (head_block_number(chain) - last_irreversible_block_num(chain)) * 3
|
198
270
|
|
199
271
|
"Last Irreversible Block was #{time_ago_in_words(seconds_ago.seconds.ago)} ago."
|
@@ -212,7 +284,8 @@ module Cosgrove
|
|
212
284
|
def muted(options = {})
|
213
285
|
[] if options.empty?
|
214
286
|
by = [options[:by]].flatten
|
215
|
-
chain = options[:chain]
|
287
|
+
chain = options[:chain] || :hive
|
288
|
+
chain = chain.to_s.downcase.to_sym
|
216
289
|
muted = []
|
217
290
|
|
218
291
|
by.each do |a|
|
@@ -232,5 +305,17 @@ module Cosgrove
|
|
232
305
|
|
233
306
|
muted.uniq
|
234
307
|
end
|
308
|
+
|
309
|
+
def skipped_channels
|
310
|
+
@@skipped_channels ||= []
|
311
|
+
end
|
312
|
+
|
313
|
+
def skipped_channel?(id)
|
314
|
+
skipped_channels.include? id
|
315
|
+
end
|
316
|
+
|
317
|
+
def skip_channel(id)
|
318
|
+
skipped_channels << id
|
319
|
+
end
|
235
320
|
end
|
236
321
|
end
|
data/lib/cosgrove/upvote_job.rb
CHANGED
@@ -8,28 +8,32 @@ module Cosgrove
|
|
8
8
|
@on_success = options[:on_success]
|
9
9
|
end
|
10
10
|
|
11
|
-
def perform(event, slug)
|
11
|
+
def perform(event, slug, chain = :hive)
|
12
12
|
if slug.nil? || slug.empty?
|
13
13
|
event.respond 'Sorry, I wasn\'t paying attention.'
|
14
14
|
return
|
15
15
|
end
|
16
16
|
|
17
|
+
chain = chain.to_s.downcase.to_sym
|
17
18
|
author_name, permlink = parse_slug slug
|
18
19
|
discord_id = event.author.id
|
19
20
|
cb_account = Cosgrove::Account.find_by_discord_id(discord_id)
|
20
21
|
registered = !!cb_account
|
21
22
|
muters = cosgrove_operators
|
22
|
-
muters <<
|
23
|
+
muters << hive_account
|
23
24
|
muted = muted by: muters, chain: :steem
|
24
25
|
|
25
|
-
post = find_comment(chain:
|
26
|
+
post = find_comment(chain: chain, author_name: author_name, permlink: permlink)
|
26
27
|
|
27
28
|
if post.nil?
|
28
29
|
cannot_find_input(event)
|
29
30
|
return
|
30
31
|
end
|
31
32
|
|
32
|
-
votes_today =
|
33
|
+
votes_today = case chain
|
34
|
+
# when :steem then SteemApi::Tx::Vote.where(voter: steem_account).today
|
35
|
+
when :hive then HiveSQL::Tx::Vote.where(voter: hive_account).today
|
36
|
+
end
|
33
37
|
today_count = votes_today.count
|
34
38
|
author_count = votes_today.where(author: author_name).count
|
35
39
|
vote_ratio = if today_count == 0
|
@@ -83,7 +87,7 @@ module Cosgrove
|
|
83
87
|
'Unable to vote. Your account has been resticted.'
|
84
88
|
elsif today_count > 10 && vote_ratio > 0.1
|
85
89
|
"Maybe later. It seems like I've been voting for #{author_name} quite a bit lately."
|
86
|
-
elsif active_votes.map{ |v| v['voter'] }.include?(
|
90
|
+
elsif active_votes.map{ |v| v['voter'] }.include?(hive_account)
|
87
91
|
title = post.title
|
88
92
|
title = post.permlink if title.empty?
|
89
93
|
"I already voted on #{title} by #{post.author}."
|
@@ -96,7 +100,7 @@ module Cosgrove
|
|
96
100
|
|
97
101
|
vote = {
|
98
102
|
type: :vote,
|
99
|
-
voter:
|
103
|
+
voter: hive_account,
|
100
104
|
author: post.author,
|
101
105
|
permlink: post.permlink,
|
102
106
|
weight: upvote_weight(event.channel.id)
|
@@ -180,13 +184,13 @@ module Cosgrove
|
|
180
184
|
|
181
185
|
case upvote_weight
|
182
186
|
when 'dynamic'
|
183
|
-
bot_account = find_account(
|
187
|
+
bot_account = find_account(hive_account)
|
184
188
|
upvote_weight = bot_account.voting_power.to_i
|
185
189
|
when 'upvote_rules'
|
186
190
|
upvote_weight = channel_upvote_weight(channel_id)
|
187
191
|
|
188
192
|
if upvote_weight == 'dynamic'
|
189
|
-
bot_account = find_account(
|
193
|
+
bot_account = find_account(hive_account)
|
190
194
|
upvote_weight = bot_account.voting_power.to_i
|
191
195
|
else
|
192
196
|
upvote_weight = (((upvote_weight || '0.00 %').to_f) * 100).to_i
|
data/lib/cosgrove/utils.rb
CHANGED
@@ -7,8 +7,8 @@ module Cosgrove
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def reset_api
|
10
|
-
@steem_api = @
|
11
|
-
@
|
10
|
+
@steem_api = @hive_api = @test_api = nil
|
11
|
+
@steem_follow_api = @hive_follow_api = @test_follow_api = nil
|
12
12
|
@cycle_api_at = nil
|
13
13
|
end
|
14
14
|
|
@@ -28,11 +28,11 @@ module Cosgrove
|
|
28
28
|
url: steem_api_url,
|
29
29
|
failover_urls: steem_api_failover_urls.any? ? steem_api_failover_urls : nil
|
30
30
|
}
|
31
|
-
when :
|
31
|
+
when :hive
|
32
32
|
{
|
33
|
-
chain: :
|
34
|
-
url:
|
35
|
-
failover_urls:
|
33
|
+
chain: :steem, # TODO switch to :hive when supported by radiator
|
34
|
+
url: hive_api_url,
|
35
|
+
failover_urls: hive_api_failover_urls.any? ? hive_api_failover_urls : nil
|
36
36
|
}
|
37
37
|
when :test
|
38
38
|
{
|
@@ -50,7 +50,7 @@ module Cosgrove
|
|
50
50
|
|
51
51
|
case chain
|
52
52
|
when :steem then @steem_api ||= Radiator::Api.new(chain_options(chain))
|
53
|
-
when :
|
53
|
+
when :hive then @hive_api ||= Radiator::Api.new(chain_options(chain))
|
54
54
|
when :test then @test_api ||= Radiator::Api.new(chain_options(chain))
|
55
55
|
end
|
56
56
|
end
|
@@ -62,18 +62,118 @@ module Cosgrove
|
|
62
62
|
|
63
63
|
case chain
|
64
64
|
when :steem then @steem_follow_api ||= Radiator::FollowApi.new(chain_options(chain))
|
65
|
-
when :
|
65
|
+
when :hive then @hive_follow_api ||= Radiator::FollowApi.new(chain_options(chain))
|
66
66
|
when :test then @test_follow_api ||= Radiator::FollowApi.new(chain_options(chain))
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
|
+
def steem_engine_shutdown
|
71
|
+
problem = false
|
72
|
+
|
73
|
+
begin
|
74
|
+
@steem_engine_blockchain.shutdown if !!@steem_engine_blockchain
|
75
|
+
rescue => e
|
76
|
+
puts "Unable to shut down steem engine blockchain rpc: #{e}"
|
77
|
+
problem = true
|
78
|
+
end
|
79
|
+
|
80
|
+
begin
|
81
|
+
@steem_engine_contracts.shutdown if !!@steem_engine_contracts
|
82
|
+
rescue => e
|
83
|
+
puts "Unable to shut down steem engine contracts rpc: #{e}"
|
84
|
+
problem = true
|
85
|
+
end
|
86
|
+
|
87
|
+
!problem
|
88
|
+
end
|
89
|
+
|
90
|
+
def steem_engine(method, params = {}, rpc)
|
91
|
+
begin
|
92
|
+
if params.respond_to?(:empty?) && params.empty?
|
93
|
+
rpc.send(method)
|
94
|
+
else
|
95
|
+
rpc.send(method, params)
|
96
|
+
end
|
97
|
+
rescue => e
|
98
|
+
steem_engine_shutdown
|
99
|
+
|
100
|
+
raise e
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def steem_engine_blockchain(method, params = {}, &block)
|
105
|
+
@steem_engine_blockchain ||= Radiator::SSC::Blockchain.new(root_url: steem_engine_api_url)
|
106
|
+
result = steem_engine(method, params, @steem_engine_blockchain)
|
107
|
+
|
108
|
+
yield result if !!block
|
109
|
+
return result
|
110
|
+
end
|
111
|
+
|
112
|
+
def steem_engine_contracts(method, params = {}, &block)
|
113
|
+
@steem_engine_contracts ||= Radiator::SSC::Contracts.new(root_url: steem_engine_api_url)
|
114
|
+
result = steem_engine(method, params, @steem_engine_contracts)
|
115
|
+
|
116
|
+
yield result if !!block
|
117
|
+
return result
|
118
|
+
end
|
119
|
+
|
120
|
+
def hive_engine_shutdown
|
121
|
+
problem = false
|
122
|
+
|
123
|
+
begin
|
124
|
+
@hive_engine_blockchain.shutdown if !!@hive_engine_blockchain
|
125
|
+
rescue => e
|
126
|
+
puts "Unable to shut down hive engine blockchain rpc: #{e}"
|
127
|
+
problem = true
|
128
|
+
end
|
129
|
+
|
130
|
+
begin
|
131
|
+
@hive_engine_contracts.shutdown if !!@hive_engine_contracts
|
132
|
+
rescue => e
|
133
|
+
puts "Unable to shut down hive engine contracts rpc: #{e}"
|
134
|
+
problem = true
|
135
|
+
end
|
136
|
+
|
137
|
+
!problem
|
138
|
+
end
|
139
|
+
|
140
|
+
def hive_engine(method, params = {}, rpc)
|
141
|
+
begin
|
142
|
+
if params.respond_to?(:empty?) && params.empty?
|
143
|
+
rpc.send(method)
|
144
|
+
else
|
145
|
+
rpc.send(method, params)
|
146
|
+
end
|
147
|
+
rescue => e
|
148
|
+
hive_engine_shutdown
|
149
|
+
|
150
|
+
raise e
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def hive_engine_blockchain(method, params = {}, &block)
|
155
|
+
@hive_engine_blockchain ||= Radiator::SSC::Blockchain.new(root_url: hive_engine_api_url)
|
156
|
+
result = hive_engine(method, params, @hive_engine_blockchain)
|
157
|
+
|
158
|
+
yield result if !!block
|
159
|
+
return result
|
160
|
+
end
|
161
|
+
|
162
|
+
def hive_engine_contracts(method, params = {}, &block)
|
163
|
+
@hive_engine_contracts ||= Radiator::SSC::Contracts.new(root_url: hive_engine_api_url)
|
164
|
+
result = hive_engine(method, params, @hive_engine_contracts)
|
165
|
+
|
166
|
+
yield result if !!block
|
167
|
+
return result
|
168
|
+
end
|
169
|
+
|
70
170
|
def cycle_stream_at
|
71
171
|
@cycle_stream_at if defined? @cycle_stream_at
|
72
172
|
end
|
73
173
|
|
74
174
|
def reset_stream
|
75
|
-
@steem_stream = @
|
76
|
-
@
|
175
|
+
@steem_stream = @hive_stream = @test_stream = nil
|
176
|
+
@steem_follow_stream = @hive_follow_stream = @test_follow_stream = nil
|
77
177
|
@cycle_stream_at = nil
|
78
178
|
end
|
79
179
|
|
@@ -84,7 +184,7 @@ module Cosgrove
|
|
84
184
|
|
85
185
|
case chain
|
86
186
|
when :steem then @steem_stream ||= Radiator::Stream.new(chain_options(chain))
|
87
|
-
when :
|
187
|
+
when :hive then @hive_stream ||= Radiator::Stream.new(chain_options(chain))
|
88
188
|
when :test then @test_stream ||= Radiator::Stream.new(chain_options(chain))
|
89
189
|
end
|
90
190
|
end
|
@@ -97,14 +197,14 @@ module Cosgrove
|
|
97
197
|
properties(chain)['head_block_number']
|
98
198
|
end
|
99
199
|
|
100
|
-
def last_irreversible_block_num(chain = :
|
200
|
+
def last_irreversible_block_num(chain = :hive)
|
101
201
|
properties(chain)['last_irreversible_block_num']
|
102
202
|
end
|
103
203
|
|
104
204
|
def new_tx(chain)
|
105
205
|
case chain
|
106
206
|
when :steem then Radiator::Transaction.new(chain_options(chain).merge(wif: steem_posting_wif))
|
107
|
-
when :
|
207
|
+
when :hive then Radiator::Transaction.new(chain_options(chain).merge(wif: hive_posting_wif))
|
108
208
|
when :test then Radiator::Transaction.new(chain_options(chain).merge(wif: test_posting_wif))
|
109
209
|
end
|
110
210
|
end
|
@@ -128,22 +228,30 @@ module Cosgrove
|
|
128
228
|
slug = slug.split('@').last
|
129
229
|
author_name = slug.split('/')[0]
|
130
230
|
permlink = slug.split('/')[1..-1].join('/')
|
231
|
+
permlink = permlink.split('#')[0]
|
131
232
|
|
132
233
|
[author_name, permlink]
|
133
234
|
end
|
134
235
|
end
|
135
236
|
|
136
|
-
def find_author_name_permlink(slug)
|
237
|
+
def find_author_name_permlink(slug, chain = :hive)
|
238
|
+
chain = chain.to_s.downcase.to_sym
|
137
239
|
op, author_name = slug.split(':')
|
138
240
|
author_name, offset = author_name.split(/[\+-]/)
|
139
|
-
author = find_account(author_name)
|
241
|
+
author = find_account(author_name, nil, chain)
|
140
242
|
|
141
243
|
offset = offset.to_i
|
142
244
|
|
143
245
|
posts = if op == 'latest'
|
144
|
-
|
246
|
+
case chain
|
247
|
+
# when :steem then SteemApi::Comment.where(depth: 0, author: author.name).order(created: :desc)
|
248
|
+
when :hive then HiveSQL::Comment.where(depth: 0, author: author.name).order(created: :desc)
|
249
|
+
end
|
145
250
|
elsif op == 'first'
|
146
|
-
|
251
|
+
case chain
|
252
|
+
# when :steem then SteemApi::Comment.where(depth: 0, author: author.name).order(created: :asc)
|
253
|
+
when :hive then HiveSQL::Comment.where(depth: 0, author: author.name).order(created: :asc)
|
254
|
+
end
|
147
255
|
else
|
148
256
|
[]
|
149
257
|
end
|
@@ -155,19 +263,28 @@ module Cosgrove
|
|
155
263
|
[]
|
156
264
|
end
|
157
265
|
|
158
|
-
def find_comment_by_slug(slug)
|
266
|
+
def find_comment_by_slug(slug, chain = :hive)
|
267
|
+
chain ||= :hive
|
268
|
+
chain = chain.to_s.downcase.to_sym
|
159
269
|
author_name, permlink = parse_slug slug
|
160
|
-
find_comment(chain:
|
270
|
+
find_comment(chain: chain, author_name: author_name, permlink: permlink)
|
161
271
|
end
|
162
272
|
|
163
273
|
def find_comment(options)
|
164
274
|
chain = options[:chain] || :steem
|
275
|
+
chain = chain.to_s.downcase.to_sym
|
165
276
|
author_name = options[:author_name]
|
166
277
|
permlink = options[:permlink]
|
167
278
|
parent_permlink = options[:parent_permlink]
|
168
279
|
|
169
|
-
post = if chain == :
|
170
|
-
posts = SteemApi::Comment.where(depth: 0, author: author_name)
|
280
|
+
post = if chain == :hive
|
281
|
+
# posts = SteemApi::Comment.where(depth: 0, author: author_name)
|
282
|
+
posts = posts.where(permlink: permlink) if !!permlink
|
283
|
+
posts = posts.where(parent_permlink: parent_permlink) if !!parent_permlink
|
284
|
+
|
285
|
+
posts.first
|
286
|
+
elsif chain == :hive
|
287
|
+
posts = HiveSQL::Comment.where(depth: 0, author: author_name)
|
171
288
|
posts = posts.where(permlink: permlink) if !!permlink
|
172
289
|
posts = posts.where(parent_permlink: parent_permlink) if !!parent_permlink
|
173
290
|
|
@@ -177,13 +294,13 @@ module Cosgrove
|
|
177
294
|
if post.nil?
|
178
295
|
post = case chain
|
179
296
|
when :steem
|
180
|
-
posts = SteemApi::Comment.where(author: author_name)
|
297
|
+
# posts = SteemApi::Comment.where(author: author_name)
|
181
298
|
posts = posts.where(permlink: permlink) if !!permlink
|
182
299
|
posts = posts.where(parent_permlink: parent_permlink) if !!parent_permlink
|
183
300
|
|
184
301
|
posts.first
|
185
|
-
when :
|
186
|
-
posts =
|
302
|
+
when :hive
|
303
|
+
posts = HiveSQL::Comment.where(author: author_name)
|
187
304
|
posts = posts.where(permlink: permlink) if !!permlink
|
188
305
|
posts = posts.where(parent_permlink: parent_permlink) if !!parent_permlink
|
189
306
|
|
@@ -204,10 +321,14 @@ module Cosgrove
|
|
204
321
|
end
|
205
322
|
|
206
323
|
def find_author(options)
|
207
|
-
chain = options[:chain]
|
324
|
+
chain = options[:chain] || :steem
|
325
|
+
chain = chain.to_s.downcase.to_sym
|
208
326
|
author_name = options[:author_name]
|
209
327
|
|
210
|
-
author =
|
328
|
+
author = case chain
|
329
|
+
# when :steem then SteemApi::Account.where(name: author_name).first
|
330
|
+
when :hive then HiveSQL::Account.where(name: author_name).first
|
331
|
+
end
|
211
332
|
|
212
333
|
if author.nil?
|
213
334
|
author = api(chain).get_accounts([author_name]) do |accounts, errors|
|
@@ -225,31 +346,39 @@ module Cosgrove
|
|
225
346
|
memo_key = options[:memo].to_s.strip
|
226
347
|
|
227
348
|
op = case chain
|
228
|
-
when :steem
|
229
|
-
|
230
|
-
|
349
|
+
# when :steem
|
350
|
+
# transfers = SteemApi::Tx::Transfer.
|
351
|
+
# where(from: from, to: steem_account).
|
352
|
+
# where("memo LIKE ?", "%#{memo_key}%")
|
353
|
+
#
|
354
|
+
# if transfers.any?
|
355
|
+
# transfers.last
|
356
|
+
# else
|
357
|
+
# SteemApi::Tx::Transfer.
|
358
|
+
# where(from: from).
|
359
|
+
# where(to: to).
|
360
|
+
# where("memo LIKE ?", "%#{memo_key}%").last
|
361
|
+
# end
|
362
|
+
when :hive
|
363
|
+
transfers = HiveSQL::Tx::Transfer.
|
364
|
+
where(from: from, to: hive_account).
|
231
365
|
where("memo LIKE ?", "%#{memo_key}%")
|
232
366
|
|
233
367
|
if transfers.any?
|
234
368
|
transfers.last
|
235
369
|
else
|
236
|
-
|
370
|
+
HiveSQL::Tx::Transfer.
|
237
371
|
where(from: from).
|
238
372
|
where(to: to).
|
239
373
|
where("memo LIKE ?", "%#{memo_key}%").last
|
240
374
|
end
|
241
|
-
when :golos
|
242
|
-
GolosCloud::Tx::Transfer.
|
243
|
-
where(from: from).
|
244
|
-
where(to: to).
|
245
|
-
where("memo LIKE ?", "%#{memo_key}%").last
|
246
375
|
end
|
247
376
|
|
248
377
|
if op.nil?
|
249
378
|
# Fall back to RPC. The transaction is so new, SteemApi hasn't seen it
|
250
379
|
# yet, SteemApi is behind, or there is no such transfer.
|
251
380
|
|
252
|
-
api(chain).get_account_history(
|
381
|
+
api(chain).get_account_history(hive_account, -1, 10000) do |history, error|
|
253
382
|
if !!error
|
254
383
|
ap error
|
255
384
|
return "Try again later."
|
@@ -261,7 +390,7 @@ module Cosgrove
|
|
261
390
|
next unless type == 'transfer'
|
262
391
|
o = e.last
|
263
392
|
next unless o.from == from
|
264
|
-
next unless o.to ==
|
393
|
+
next unless o.to == hive_account
|
265
394
|
next unless o.memo =~ /.*#{memo_key}.*/
|
266
395
|
|
267
396
|
o
|
@@ -272,20 +401,31 @@ module Cosgrove
|
|
272
401
|
op
|
273
402
|
end
|
274
403
|
|
275
|
-
def core_asset(chain = :
|
404
|
+
def core_asset(chain = :hive)
|
405
|
+
chain ||= :hive
|
406
|
+
chain = chain.to_s.downcase.to_sym
|
407
|
+
|
276
408
|
case chain
|
277
409
|
when :steem then 'STEEM'
|
278
|
-
when :
|
410
|
+
when :hive then 'HIVE'
|
279
411
|
else; 'TESTS'
|
280
412
|
end
|
281
413
|
end
|
282
414
|
|
283
|
-
def debt_asset(chain = :
|
415
|
+
def debt_asset(chain = :hive)
|
416
|
+
chain ||= :hive
|
417
|
+
chain = chain.to_s.downcase.to_sym
|
418
|
+
|
284
419
|
case chain
|
285
420
|
when :steem then 'SBD'
|
286
|
-
when :
|
421
|
+
when :hive then 'HBD'
|
287
422
|
else; 'TBD'
|
288
423
|
end
|
289
424
|
end
|
425
|
+
private
|
426
|
+
def rpc_id
|
427
|
+
@rpc_id ||= 0
|
428
|
+
@rpc_id += 1
|
429
|
+
end
|
290
430
|
end
|
291
431
|
end
|