elephrame 0.3.4 → 0.3.6
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/Gemfile.lock +1 -1
- data/README.md +3 -1
- data/lib/elephrame/bot.rb +41 -9
- data/lib/elephrame/streaming/streaming.rb +23 -19
- data/lib/elephrame/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b5debc85f1a59e0bbb4d562dd2685cbe15bd086c005e16cc0f56054109d62c2b
|
4
|
+
data.tar.gz: 3d090af83e6d1200b936aeedc86003fa80fbb63edb2b46aec19f5fee4855b111
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aec1f7cc1644c9ee00dc6ef77ef3db692f72c46ffa378be2314caae97a7e93e06e285e62681dd3d9ccbe0020ed6e9b4de17f953d3e2b917c931e07f19d98b5e0
|
7
|
+
data.tar.gz: b0c09dd1c87aad6261d59c04aa77b75430a5b0c0ceb29b29840c02827e83bf5dd245c87dcb4c5ca4de2c819d404fc49e058e7d93709a9ac0c4a4c4e024587db9
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -65,8 +65,10 @@ Exposed methods from bot object:
|
|
65
65
|
- `client` this is the underlying mastodon rest client we use in the backend. use this to make custom calls to the api for which we don't provide a helper
|
66
66
|
- `username` the name of the bot as fetched by verify_credentials
|
67
67
|
- `strip_html` (defaults to true) if set, the framework will automatically strip all html symbols from the post content
|
68
|
+
- `max_retries` (defaults to 5) the maximum amount of times the framework will retry a mastodon request
|
69
|
+
- `failed` a hash that represents the status of the last post or media upload. `failed[:post]` and `failed[:media]`; returns true if it failed, false if it succeeded
|
68
70
|
- `post(content, visibility: 'unlisted', spoiler: '', reply_id: '', hide_media: false, media: [])` this provides an easy way to post statuses from inside code blocks
|
69
|
-
- `reply(content)` a shorthand method to reply to the last mention (Note: doesn't automatically @ the other user/s)
|
71
|
+
- `reply(content, *options)` a shorthand method to reply to the last mention (Note: doesn't automatically @ the other user/s)
|
70
72
|
- `find_ancestor(id, depth = 10, stop_at = 1)` looks backwards through reply chains for the most recent post the bot made starting at post `id` until it hits `depth` number of posts, or finds `stop_at` number of it's own posts
|
71
73
|
- `no_bot?(account_id)` returns true if user with `account_id` has some form of "#NoBot" in their bio
|
72
74
|
|
data/lib/elephrame/bot.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'time'
|
2
|
+
require 'net/http'
|
3
|
+
|
1
4
|
module Elephrame
|
2
5
|
module Bots
|
3
6
|
|
@@ -6,12 +9,12 @@ module Elephrame
|
|
6
9
|
# holds common functions and variables
|
7
10
|
|
8
11
|
class BaseBot
|
9
|
-
attr_reader :client, :username
|
10
|
-
attr_accessor :strip_html
|
12
|
+
attr_reader :client, :username, :failed
|
13
|
+
attr_accessor :strip_html, :max_retries
|
11
14
|
|
12
15
|
##
|
13
|
-
# Sets up our REST client
|
14
|
-
# value for strip_html (true)
|
16
|
+
# Sets up our REST +client+, gets and saves our +username+, sets default
|
17
|
+
# value for +strip_html+ (true), and +max_retries+ (5), +failed+
|
15
18
|
#
|
16
19
|
# @return [Elephrame::Bots::BaseBot]
|
17
20
|
|
@@ -20,6 +23,8 @@ module Elephrame
|
|
20
23
|
bearer_token: ENV['TOKEN'])
|
21
24
|
@username = @client.verify_credentials().acct
|
22
25
|
@strip_html = true
|
26
|
+
@max_retries = 5
|
27
|
+
@failed = { media: false, post: false }
|
23
28
|
end
|
24
29
|
|
25
30
|
##
|
@@ -35,9 +40,12 @@ module Elephrame
|
|
35
40
|
def post(text, visibility: 'unlisted', spoiler: '',
|
36
41
|
reply_id: '', hide_media: false, media: [])
|
37
42
|
|
43
|
+
uploaded_ids = []
|
38
44
|
unless media.size.zero?
|
39
|
-
media
|
40
|
-
|
45
|
+
@failed[:media] = retry_if_needed {
|
46
|
+
uploaded_ids = media.collect {|m|
|
47
|
+
@client.upload_media(m).id
|
48
|
+
}
|
41
49
|
}
|
42
50
|
end
|
43
51
|
|
@@ -45,11 +53,13 @@ module Elephrame
|
|
45
53
|
visibility: visibility,
|
46
54
|
spoiler_text: spoiler,
|
47
55
|
in_reply_to_id: reply_id,
|
48
|
-
media_ids: media,
|
56
|
+
media_ids: @failed[:media] ? [] : uploaded_ids,
|
49
57
|
sensitive: hide_media,
|
50
58
|
}
|
51
|
-
|
52
|
-
@
|
59
|
+
|
60
|
+
@failed[:post] = retry_if_needed {
|
61
|
+
@client.create_status text, options
|
62
|
+
}
|
53
63
|
end
|
54
64
|
|
55
65
|
|
@@ -86,6 +96,28 @@ module Elephrame
|
|
86
96
|
def no_bot? account_id
|
87
97
|
@client.account(account_id).note =~ /#?NoBot/i
|
88
98
|
end
|
99
|
+
|
100
|
+
private
|
101
|
+
|
102
|
+
##
|
103
|
+
# An internal function that ensures our HTTP requests go through
|
104
|
+
#
|
105
|
+
# @param block [Proc] accepts a block, ensures all code inside
|
106
|
+
# that block gets executed even if there was an HTTP error.
|
107
|
+
#
|
108
|
+
# @return [Bool] true on hitting the retry limit, false on success
|
109
|
+
|
110
|
+
def retry_if_needed &block
|
111
|
+
@max_retries.times do |i|
|
112
|
+
begin
|
113
|
+
block.call
|
114
|
+
return false
|
115
|
+
rescue HTTP::TimeoutError
|
116
|
+
puts "caught HTTP Timeout error at #{Time.now} retrying #{@max_retries-i} more times"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
return true
|
120
|
+
end
|
89
121
|
|
90
122
|
end
|
91
123
|
end
|
@@ -30,27 +30,14 @@ module Elephrame
|
|
30
30
|
# *DOES NOT AUTOMATICALLY INCLUDE @'S*
|
31
31
|
#
|
32
32
|
# @param text [String] text to post as a reply
|
33
|
+
# @param options [Hash] a hash of arguments to pass to post, overrides
|
34
|
+
# duplicating settings from last mention
|
33
35
|
|
34
|
-
def reply(text)
|
35
|
-
|
36
|
+
def reply(text, *options)
|
37
|
+
options = Hash[*options]
|
38
|
+
|
36
39
|
# maybe also @ everyone from the mention? idk that seems like a bad idea tbh
|
37
|
-
post(text,
|
38
|
-
@mention_data[:id], @mention_data[:sensitive])
|
39
|
-
end
|
40
|
-
|
41
|
-
##
|
42
|
-
# Stores select data about a post into a hash for later use
|
43
|
-
#
|
44
|
-
# @param mention [Mastodon::Status] the most recent mention the bot received
|
45
|
-
|
46
|
-
def store_mention_data(mention)
|
47
|
-
@mention_data = {
|
48
|
-
id: mention.id,
|
49
|
-
vis: mention.visibility,
|
50
|
-
spoiler: mention.spoiler_text,
|
51
|
-
mentions: mention.mentions,
|
52
|
-
sensitive: mention.sensitive?
|
53
|
-
}
|
40
|
+
post(text, **@mention_data.merge(options).reject { |k| k == :mentions })
|
54
41
|
end
|
55
42
|
|
56
43
|
##
|
@@ -75,6 +62,23 @@ module Elephrame
|
|
75
62
|
end
|
76
63
|
|
77
64
|
alias_method :run, :run_reply
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
##
|
69
|
+
# Stores select data about a post into a hash for later use
|
70
|
+
#
|
71
|
+
# @param mention [Mastodon::Status] the most recent mention the bot received
|
72
|
+
|
73
|
+
def store_mention_data(mention)
|
74
|
+
@mention_data = {
|
75
|
+
reply_id: mention.id,
|
76
|
+
visibility: mention.visibility,
|
77
|
+
spoiler: mention.spoiler_text,
|
78
|
+
mentions: mention.mentions,
|
79
|
+
hide_media: mention.sensitive?
|
80
|
+
}
|
81
|
+
end
|
78
82
|
end
|
79
83
|
|
80
84
|
|
data/lib/elephrame/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elephrame
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zac
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-12-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|