cosgrove 0.0.3.5 → 0.0.4.1
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 +5 -5
- data/.gitignore +1 -1
- data/Gemfile +5 -1
- data/README.md +57 -7
- data/cosgrove.gemspec +11 -15
- data/example-authorize-hive-sql.sh +5 -0
- data/lib/cosgrove.rb +2 -11
- data/lib/cosgrove/account.rb +27 -14
- data/lib/cosgrove/bot.rb +9 -18
- 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 +653 -108
- data/lib/cosgrove/support.rb +131 -76
- data/lib/cosgrove/upvote_job.rb +12 -8
- data/lib/cosgrove/utils.rb +184 -59
- data/lib/cosgrove/version.rb +1 -1
- metadata +67 -134
- data/Gemfile.lock +0 -228
- data/mongoid.yml +0 -9
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
|
-
|
8
|
-
|
9
|
-
|
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
|
26
|
+
pattern = account_name.chars.each.map{ |c| c }.join('%')
|
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
|
@@ -28,75 +51,77 @@ module Cosgrove
|
|
28
51
|
help.join
|
29
52
|
end
|
30
53
|
|
31
|
-
def mongo_behind_warning(event)
|
32
|
-
elapse = -1
|
33
|
-
|
34
|
-
begin
|
35
|
-
message = []
|
36
|
-
|
37
|
-
if (blocks = head_block_number(:steem) - steem_data_head_block_number) > 1200
|
38
|
-
elapse = blocks * 3
|
39
|
-
message << "Mongo is behind by #{time_ago_in_words(elapse.seconds.ago)}."
|
40
|
-
else
|
41
|
-
0
|
42
|
-
end
|
43
|
-
|
44
|
-
if message.size > 0
|
45
|
-
event.respond message.join(' ')
|
46
|
-
end
|
47
|
-
rescue => e
|
48
|
-
event.respond "Mongo might be behind, but the API is also acting up. Please try again later.\n\n```#{e.inspect}\n```"
|
49
|
-
sleep 15
|
50
|
-
event.respond Cosgrove::SnarkCommands::WITTY.sample
|
51
|
-
end
|
52
|
-
|
53
|
-
elapse
|
54
|
-
end
|
55
|
-
|
56
54
|
def cannot_find_input(event, message_prefix = "Unable to find that.")
|
57
55
|
message = [message_prefix]
|
58
56
|
|
59
|
-
message << if (blocks = head_block_number(:steem) - steem_data_head_block_number) > 86400
|
60
|
-
elapse = blocks * 3
|
61
|
-
" Mongo is behind by #{time_ago_in_words(elapse.seconds.ago)}. Try again later."
|
62
|
-
else
|
63
|
-
" Mongo might be behind or this is not a valid input."
|
64
|
-
end
|
65
|
-
|
66
57
|
event.respond message.join(' ')
|
67
58
|
end
|
68
59
|
|
69
60
|
def append_link_details(event, slug)
|
61
|
+
return if skipped_channel? event.channel.id
|
62
|
+
|
63
|
+
chain = :hive
|
70
64
|
author_name, permlink = parse_slug slug
|
71
65
|
created = nil
|
72
66
|
cashout_time = nil
|
67
|
+
message = nil
|
73
68
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
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
|
82
79
|
end
|
83
80
|
|
84
|
-
|
85
|
-
when :steem then
|
86
|
-
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)
|
87
84
|
end
|
88
85
|
|
86
|
+
posts.select(:ID, :created, :cashout_time, :author, :permlink, :active_votes, :children, :category)
|
87
|
+
|
88
|
+
post = posts.last
|
89
|
+
|
89
90
|
if post.nil?
|
90
91
|
# Fall back to RPC
|
91
92
|
api(chain).get_content(author_name, permlink) do |content, errors|
|
92
93
|
unless content.author.empty?
|
94
|
+
post = content
|
93
95
|
created = Time.parse(content.created + 'Z')
|
94
96
|
cashout_time = Time.parse(content.cashout_time + 'Z')
|
95
97
|
end
|
96
98
|
end
|
97
99
|
end
|
98
100
|
|
99
|
-
|
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
|
100
125
|
|
101
126
|
created ||= post.created
|
102
127
|
cashout_time ||= post.cashout_time
|
@@ -105,55 +130,70 @@ module Cosgrove
|
|
105
130
|
age = time_ago_in_words(created)
|
106
131
|
age = age.slice(0, 1).capitalize + age.slice(1..-1)
|
107
132
|
|
108
|
-
details << if created <
|
133
|
+
details << if created < 15.minutes.ago
|
109
134
|
"#{age} old"
|
110
135
|
else
|
111
136
|
"**#{age}** old"
|
112
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
|
144
|
+
|
145
|
+
active_votes = case post.active_votes
|
146
|
+
when String then JSON[post.active_votes] rescue []
|
147
|
+
else; active_votes
|
148
|
+
end
|
113
149
|
|
114
|
-
if
|
115
|
-
upvotes =
|
116
|
-
downvotes =
|
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
|
117
153
|
netvotes = upvotes - downvotes
|
118
154
|
details << "Net votes: #{netvotes}"
|
155
|
+
message = message.edit details.join('; ') if !!message
|
119
156
|
|
120
157
|
# Only append this detail of the post less than an hour old.
|
121
158
|
if created > 1.hour.ago
|
122
159
|
votes = case chain
|
123
|
-
when :steem then
|
124
|
-
when :
|
160
|
+
# when :steem then SteemApi::Tx::Vote.where('timestamp > ?', post.created)
|
161
|
+
when :hive then HiveSQL::Tx::Vote.where('timestamp > ?', post.created)
|
125
162
|
end
|
126
|
-
total_votes = votes.count
|
127
|
-
total_voters = votes.distinct(:voter).
|
163
|
+
total_votes = votes.distinct("concat(author, permlink)").count
|
164
|
+
total_voters = votes.distinct(:voter).count
|
128
165
|
|
129
166
|
if total_votes > 0 && total_voters > 0
|
130
167
|
details << "Out of #{pluralize(total_votes - netvotes, 'vote')} cast by #{pluralize(total_voters, 'voter')}"
|
168
|
+
message = message.edit details.join('; ') if !!message
|
131
169
|
end
|
132
170
|
end
|
133
171
|
end
|
134
172
|
|
135
173
|
details << "Comments: #{post.children.to_i}"
|
174
|
+
message = message.edit details.join('; ') if !!message
|
136
175
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
event.respond details.join('; ')
|
142
|
-
rescue Discordrb::Errors::NoPermission => _
|
143
|
-
puts "Unable to append link details on #{event.channel.server.name} in #{event.channel.name}"
|
144
|
-
end
|
176
|
+
# Page View counter is no longer supported by steemit.com.
|
177
|
+
# page_views = page_views("/#{post.parent_permlink}/@#{post.author}/#{post.permlink}")
|
178
|
+
# details << "Views: #{page_views}" if !!page_views
|
179
|
+
# message = message.edit details.join('; ') if !!message
|
145
180
|
|
146
|
-
|
181
|
+
details.join('; ') if event.nil?
|
147
182
|
end
|
148
183
|
|
149
|
-
def find_account(key, event = nil, chain = :
|
184
|
+
def find_account(key, event = nil, chain = :hive)
|
150
185
|
key = key.to_s.downcase
|
151
|
-
chain
|
186
|
+
chain ||= :hive
|
187
|
+
chain = chain.to_s.downcase.to_sym
|
152
188
|
|
153
|
-
raise "Required argument: chain" if chain.nil?
|
154
189
|
|
155
|
-
|
156
|
-
|
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?
|
157
197
|
accounts.first
|
158
198
|
end
|
159
199
|
end
|
@@ -166,9 +206,9 @@ module Cosgrove
|
|
166
206
|
|
167
207
|
if account.nil?
|
168
208
|
account = if !!key
|
169
|
-
if chain == :steem && (accounts = SteemApi::Account.where(name: key)).any?
|
170
|
-
|
171
|
-
|
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?
|
172
212
|
accounts.first
|
173
213
|
else
|
174
214
|
# Fall back to RPC
|
@@ -206,7 +246,7 @@ module Cosgrove
|
|
206
246
|
'Origin' => 'https://steemit.com'
|
207
247
|
})
|
208
248
|
|
209
|
-
csrf = page.parser.to_html.split('
|
249
|
+
csrf = page.parser.to_html.split(':{"csrf":"').last.split('","new_visit":').first
|
210
250
|
# Uncomment in case views stop showing.
|
211
251
|
# puts "DEBUG: #{csrf}"
|
212
252
|
return unless csrf.size == 36
|
@@ -223,7 +263,9 @@ module Cosgrove
|
|
223
263
|
end
|
224
264
|
end
|
225
265
|
|
226
|
-
def last_irreversible_block(chain = :
|
266
|
+
def last_irreversible_block(chain = :hive)
|
267
|
+
chain ||= :hive
|
268
|
+
chain = chain.to_s.downcase.to_sym
|
227
269
|
seconds_ago = (head_block_number(chain) - last_irreversible_block_num(chain)) * 3
|
228
270
|
|
229
271
|
"Last Irreversible Block was #{time_ago_in_words(seconds_ago.seconds.ago)} ago."
|
@@ -242,7 +284,8 @@ module Cosgrove
|
|
242
284
|
def muted(options = {})
|
243
285
|
[] if options.empty?
|
244
286
|
by = [options[:by]].flatten
|
245
|
-
chain = options[:chain]
|
287
|
+
chain = options[:chain] || :hive
|
288
|
+
chain = chain.to_s.downcase.to_sym
|
246
289
|
muted = []
|
247
290
|
|
248
291
|
by.each do |a|
|
@@ -262,5 +305,17 @@ module Cosgrove
|
|
262
305
|
|
263
306
|
muted.uniq
|
264
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
|
265
320
|
end
|
266
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,19 +184,11 @@ 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
|
91
191
|
|
92
|
-
def steem_data_head_block_number
|
93
|
-
begin
|
94
|
-
SteemData::AccountOperation.order(timestamp: -1).limit(1).first.block
|
95
|
-
rescue
|
96
|
-
-1
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
192
|
def properties(chain)
|
101
193
|
api(chain).get_dynamic_global_properties.result
|
102
194
|
end
|
@@ -105,14 +197,14 @@ module Cosgrove
|
|
105
197
|
properties(chain)['head_block_number']
|
106
198
|
end
|
107
199
|
|
108
|
-
def last_irreversible_block_num(chain = :
|
200
|
+
def last_irreversible_block_num(chain = :hive)
|
109
201
|
properties(chain)['last_irreversible_block_num']
|
110
202
|
end
|
111
203
|
|
112
204
|
def new_tx(chain)
|
113
205
|
case chain
|
114
206
|
when :steem then Radiator::Transaction.new(chain_options(chain).merge(wif: steem_posting_wif))
|
115
|
-
when :
|
207
|
+
when :hive then Radiator::Transaction.new(chain_options(chain).merge(wif: hive_posting_wif))
|
116
208
|
when :test then Radiator::Transaction.new(chain_options(chain).merge(wif: test_posting_wif))
|
117
209
|
end
|
118
210
|
end
|
@@ -136,22 +228,30 @@ module Cosgrove
|
|
136
228
|
slug = slug.split('@').last
|
137
229
|
author_name = slug.split('/')[0]
|
138
230
|
permlink = slug.split('/')[1..-1].join('/')
|
231
|
+
permlink = permlink.split('#')[0]
|
139
232
|
|
140
233
|
[author_name, permlink]
|
141
234
|
end
|
142
235
|
end
|
143
236
|
|
144
|
-
def find_author_name_permlink(slug)
|
237
|
+
def find_author_name_permlink(slug, chain = :hive)
|
238
|
+
chain = chain.to_s.downcase.to_sym
|
145
239
|
op, author_name = slug.split(':')
|
146
240
|
author_name, offset = author_name.split(/[\+-]/)
|
147
|
-
author = find_account(author_name)
|
241
|
+
author = find_account(author_name, nil, chain)
|
148
242
|
|
149
243
|
offset = offset.to_i
|
150
244
|
|
151
245
|
posts = if op == 'latest'
|
152
|
-
|
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
|
153
250
|
elsif op == 'first'
|
154
|
-
|
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
|
155
255
|
else
|
156
256
|
[]
|
157
257
|
end
|
@@ -163,19 +263,28 @@ module Cosgrove
|
|
163
263
|
[]
|
164
264
|
end
|
165
265
|
|
166
|
-
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
|
167
269
|
author_name, permlink = parse_slug slug
|
168
|
-
find_comment(chain:
|
270
|
+
find_comment(chain: chain, author_name: author_name, permlink: permlink)
|
169
271
|
end
|
170
272
|
|
171
273
|
def find_comment(options)
|
172
274
|
chain = options[:chain] || :steem
|
275
|
+
chain = chain.to_s.downcase.to_sym
|
173
276
|
author_name = options[:author_name]
|
174
277
|
permlink = options[:permlink]
|
175
278
|
parent_permlink = options[:parent_permlink]
|
176
279
|
|
177
|
-
post = if chain == :
|
178
|
-
posts =
|
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)
|
179
288
|
posts = posts.where(permlink: permlink) if !!permlink
|
180
289
|
posts = posts.where(parent_permlink: parent_permlink) if !!parent_permlink
|
181
290
|
|
@@ -185,13 +294,13 @@ module Cosgrove
|
|
185
294
|
if post.nil?
|
186
295
|
post = case chain
|
187
296
|
when :steem
|
188
|
-
posts = SteemApi::Comment.where(author: author_name)
|
297
|
+
# posts = SteemApi::Comment.where(author: author_name)
|
189
298
|
posts = posts.where(permlink: permlink) if !!permlink
|
190
299
|
posts = posts.where(parent_permlink: parent_permlink) if !!parent_permlink
|
191
300
|
|
192
301
|
posts.first
|
193
|
-
when :
|
194
|
-
posts =
|
302
|
+
when :hive
|
303
|
+
posts = HiveSQL::Comment.where(author: author_name)
|
195
304
|
posts = posts.where(permlink: permlink) if !!permlink
|
196
305
|
posts = posts.where(parent_permlink: parent_permlink) if !!parent_permlink
|
197
306
|
|
@@ -212,22 +321,18 @@ module Cosgrove
|
|
212
321
|
end
|
213
322
|
|
214
323
|
def find_author(options)
|
215
|
-
chain = options[:chain]
|
324
|
+
chain = options[:chain] || :steem
|
325
|
+
chain = chain.to_s.downcase.to_sym
|
216
326
|
author_name = options[:author_name]
|
217
327
|
|
218
|
-
author =
|
219
|
-
|
220
|
-
|
221
|
-
author = begin
|
222
|
-
SteemApi::Account.where(name: author_name).last
|
223
|
-
rescue => e
|
224
|
-
puts e
|
225
|
-
end
|
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
|
226
331
|
end
|
227
332
|
|
228
333
|
if author.nil?
|
229
334
|
author = api(chain).get_accounts([author_name]) do |accounts, errors|
|
230
|
-
accounts.
|
335
|
+
accounts.first
|
231
336
|
end
|
232
337
|
end
|
233
338
|
|
@@ -241,30 +346,39 @@ module Cosgrove
|
|
241
346
|
memo_key = options[:memo].to_s.strip
|
242
347
|
|
243
348
|
op = case chain
|
244
|
-
when :steem
|
245
|
-
|
246
|
-
|
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).
|
365
|
+
where("memo LIKE ?", "%#{memo_key}%")
|
247
366
|
|
248
367
|
if transfers.any?
|
249
368
|
transfers.last
|
250
369
|
else
|
251
|
-
|
370
|
+
HiveSQL::Tx::Transfer.
|
252
371
|
where(from: from).
|
253
372
|
where(to: to).
|
254
373
|
where("memo LIKE ?", "%#{memo_key}%").last
|
255
374
|
end
|
256
|
-
when :golos
|
257
|
-
GolosCloud::Tx::Transfer.
|
258
|
-
where(from: from).
|
259
|
-
where(to: to).
|
260
|
-
where("memo LIKE ?", "%#{memo_key}%").last
|
261
375
|
end
|
262
376
|
|
263
377
|
if op.nil?
|
264
|
-
# Fall back to RPC. The transaction is so new,
|
265
|
-
# yet,
|
378
|
+
# Fall back to RPC. The transaction is so new, SteemApi hasn't seen it
|
379
|
+
# yet, SteemApi is behind, or there is no such transfer.
|
266
380
|
|
267
|
-
api(chain).get_account_history(
|
381
|
+
api(chain).get_account_history(hive_account, -1, 10000) do |history, error|
|
268
382
|
if !!error
|
269
383
|
ap error
|
270
384
|
return "Try again later."
|
@@ -276,7 +390,7 @@ module Cosgrove
|
|
276
390
|
next unless type == 'transfer'
|
277
391
|
o = e.last
|
278
392
|
next unless o.from == from
|
279
|
-
next unless o.to ==
|
393
|
+
next unless o.to == hive_account
|
280
394
|
next unless o.memo =~ /.*#{memo_key}.*/
|
281
395
|
|
282
396
|
o
|
@@ -287,20 +401,31 @@ module Cosgrove
|
|
287
401
|
op
|
288
402
|
end
|
289
403
|
|
290
|
-
def core_asset(chain = :
|
404
|
+
def core_asset(chain = :hive)
|
405
|
+
chain ||= :hive
|
406
|
+
chain = chain.to_s.downcase.to_sym
|
407
|
+
|
291
408
|
case chain
|
292
409
|
when :steem then 'STEEM'
|
293
|
-
when :
|
410
|
+
when :hive then 'HIVE'
|
294
411
|
else; 'TESTS'
|
295
412
|
end
|
296
413
|
end
|
297
414
|
|
298
|
-
def debt_asset(chain = :
|
415
|
+
def debt_asset(chain = :hive)
|
416
|
+
chain ||= :hive
|
417
|
+
chain = chain.to_s.downcase.to_sym
|
418
|
+
|
299
419
|
case chain
|
300
420
|
when :steem then 'SBD'
|
301
|
-
when :
|
421
|
+
when :hive then 'HBD'
|
302
422
|
else; 'TBD'
|
303
423
|
end
|
304
424
|
end
|
425
|
+
private
|
426
|
+
def rpc_id
|
427
|
+
@rpc_id ||= 0
|
428
|
+
@rpc_id += 1
|
429
|
+
end
|
305
430
|
end
|
306
431
|
end
|