reddit-to-telegram 0.4.0 → 0.5.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/.rubocop.yml +3 -0
- data/Gemfile.lock +1 -1
- data/README.md +7 -11
- data/lib/reddit_to_telegram/errors.rb +1 -0
- data/lib/reddit_to_telegram/post.rb +2 -1
- data/lib/reddit_to_telegram/reddit/output/imgur.rb +59 -0
- data/lib/reddit_to_telegram/reddit/output.rb +4 -0
- data/lib/reddit_to_telegram/store/aws_simple_db.rb +11 -0
- data/lib/reddit_to_telegram/telegram/post.rb +2 -1
- data/lib/reddit_to_telegram/variables.rb +6 -1
- data/lib/reddit_to_telegram/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 81b0c79fce533367384f2a5bce697b0fafa0e914f772ce23e7ac903aeeec1577
|
4
|
+
data.tar.gz: aac0c0448ab4964df36acf62819e2c73e1d7f90d750091fa88b43a1605612580
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1b0f0c32452b4784a50ed4f0557bf1347d84e0fb3f0bc6ba6af1baa0c2426f066283ad9c0a30f22e1232462c2aa2e45f44e637e942208548130152bf5611d081
|
7
|
+
data.tar.gz: 54807fe38f1a4f03e6baff998dc517b1fd3835f435837e75e1ca23809df7b5edef768106a4477f43f9490af63d3df280273e420c153004760e7f19680856aa8b
|
data/.rubocop.yml
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -23,21 +23,21 @@ Or `gem install reddit-to-telegram`. Don't forget to `require` it.
|
|
23
23
|
|
24
24
|
To run it, you'll need some env variables set.
|
25
25
|
```
|
26
|
-
RTT_AWS_ACCESS_KEY_ID= # Your AWS access key ID. Needed for AWS SimpleDB storage.
|
26
|
+
RTT_AWS_ACCESS_KEY_ID= # (Optional) Your AWS access key ID. Needed for AWS SimpleDB storage.
|
27
27
|
RTT_AWS_DOMAIN_NAME= # (Optional) Domain name to use for SimpleDB
|
28
|
-
RTT_AWS_REGION= # AWS region your SimpleDB will be hosted on. Beware, it's not available in all regions.
|
29
|
-
RTT_AWS_SECRET_ACCESS_KEY= # Your AWS access key ID. Needed for AWS SimpleDB storage.
|
28
|
+
RTT_AWS_REGION= # (Optional) AWS region your SimpleDB will be hosted on. Beware, it's not available in all regions.
|
29
|
+
RTT_AWS_SECRET_ACCESS_KEY= # (Optional) Your AWS access key ID. Needed for AWS SimpleDB storage.
|
30
30
|
RTT_MAX_STORED_POSTS= # (Optional) Number of posts to store in the database to avoid duplicates, default is 25.
|
31
31
|
RTT_REDDIT_CLIENT_ID= # Reddit app credentials to access API. Might not be needed depending on setup, reddit allows some requests without authentication.
|
32
32
|
RTT_REDDIT_CLIENT_SECRET= # Reddit app credentials to access API. Might not be needed depending on setup, reddit allows some requests without authentication.
|
33
|
-
RTT_STORE_TYPE= # (Optional) Choose between aws_simple_db, memory or temp_file
|
33
|
+
RTT_STORE_TYPE= # (Optional) Choose between aws_simple_db, memory or temp_file. Default is aws_simple_db, so if you're not specifying your AWS credentials, you have to specify another store type.
|
34
34
|
RTT_TELEGRAM_BOT_TOKEN= # The token you've received when you've created a telegram bot.
|
35
35
|
RTT_TEMP_DIR= (Optional) # Directory to write temp files to without trailing /
|
36
36
|
```
|
37
37
|
|
38
38
|
You can also set them dynamically:
|
39
39
|
```
|
40
|
-
RedditToTelegram::Variables.aws.
|
40
|
+
RedditToTelegram::Variables.aws.access_key_id =
|
41
41
|
RedditToTelegram::Variables.telegram.bot_token =
|
42
42
|
```
|
43
43
|
Check out `lib/variables` for list of all available variables.
|
@@ -45,19 +45,15 @@ Check out `lib/variables` for list of all available variables.
|
|
45
45
|
## Usage
|
46
46
|
|
47
47
|
1. Add the bot as administrator to Telegram channels you'd like to post to.
|
48
|
-
|
48
|
+
2. To fetch latest hot post which hasn't been pushed yet:
|
49
49
|
```
|
50
50
|
RedditToTelegram.hot(
|
51
51
|
subreddit_name_1: :telegram_channel_id_1,
|
52
52
|
subreddit_name_2: :telegram_channel_id_2
|
53
53
|
)
|
54
54
|
```
|
55
|
-
|
55
|
+
Or to push one specific post (the only thing you need to set up for this is your telegram bot token):
|
56
56
|
```
|
57
57
|
RedditToTelegram.single("regular_link_to_post", :telegram_channel_id)
|
58
58
|
```
|
59
59
|
Use `:telegram_channel_id` without the `@`.
|
60
|
-
|
61
|
-
## Planned features
|
62
|
-
- Upload Imgur gifv links as videos/gifs
|
63
|
-
- Error handling
|
@@ -37,8 +37,9 @@ module RedditToTelegram
|
|
37
37
|
post = find_new_post(subreddit, res)
|
38
38
|
return if post.nil?
|
39
39
|
|
40
|
-
Telegram::Post.push(post, telegram_chat_id)
|
40
|
+
res = Telegram::Post.push(post, telegram_chat_id)
|
41
41
|
Store::Posts.add(subreddit, post[:id])
|
42
|
+
res
|
42
43
|
end
|
43
44
|
|
44
45
|
def find_new_post(subreddit, posts)
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cgi"
|
4
|
+
|
5
|
+
module RedditToTelegram
|
6
|
+
module Reddit
|
7
|
+
class Output
|
8
|
+
class Imgur
|
9
|
+
class << self
|
10
|
+
def try_extract(data)
|
11
|
+
full_url = decode_imgur_url(data)
|
12
|
+
video_url = extract_video_url(full_url)
|
13
|
+
width = extract_video_width(full_url)
|
14
|
+
return if video_url.nil? || width.nil?
|
15
|
+
|
16
|
+
format_imgur_post(data, video_url, width)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def decode_imgur_url(data)
|
22
|
+
encoded_url = data
|
23
|
+
.dig("media_embed", "content")
|
24
|
+
&.match(/src=\"\S+schema=imgur\"/)&.to_s
|
25
|
+
&.gsub(/src=\"|\"/, 'src=\"' => "", '\"' => "")
|
26
|
+
CGI.unescape(encoded_url)
|
27
|
+
end
|
28
|
+
|
29
|
+
def extract_video_url(full_url)
|
30
|
+
video_url_arr = full_url&.match(/image=(\S+\?|&)/)&.to_s&.send(:[], 6..-2)&.split(".")
|
31
|
+
return if Array(video_url_arr).empty?
|
32
|
+
|
33
|
+
video_url_arr[video_url_arr.length - 1] = "mp4"
|
34
|
+
video_url_arr.join(".")
|
35
|
+
end
|
36
|
+
|
37
|
+
def extract_video_width(full_url)
|
38
|
+
full_url&.match(/w=(\w+)/)&.to_s&.send(:[], 2..)
|
39
|
+
end
|
40
|
+
|
41
|
+
def format_imgur_post(data, video_url, width)
|
42
|
+
RedditToTelegram::Reddit::Output.send(
|
43
|
+
:base_post_format_attrs, data
|
44
|
+
).merge(
|
45
|
+
{
|
46
|
+
type: :video,
|
47
|
+
media: video_url,
|
48
|
+
misc: {
|
49
|
+
binary: false,
|
50
|
+
video_width: width
|
51
|
+
}
|
52
|
+
}
|
53
|
+
)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "cgi"
|
4
|
+
require_relative "output/imgur"
|
4
5
|
|
5
6
|
module RedditToTelegram
|
6
7
|
module Reddit
|
@@ -41,6 +42,9 @@ module RedditToTelegram
|
|
41
42
|
end
|
42
43
|
|
43
44
|
def format_link_post(data)
|
45
|
+
res = Imgur.try_extract(data) if data["domain"] == "imgur.com"
|
46
|
+
return res unless res.nil?
|
47
|
+
|
44
48
|
base_post_format_attrs(data).merge(
|
45
49
|
{ type: :text,
|
46
50
|
text: "#{data['title']}\n\n#{data['url']}" }
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require "aws-sdk-simpledb"
|
4
4
|
require "json"
|
5
|
+
require_relative "../errors"
|
5
6
|
require_relative "../variables"
|
6
7
|
|
7
8
|
module RedditToTelegram
|
@@ -23,10 +24,20 @@ module RedditToTelegram
|
|
23
24
|
attr_reader :reddit_token
|
24
25
|
|
25
26
|
def setup
|
27
|
+
check_credentials
|
26
28
|
create_domain unless client.list_domains.domain_names.include?(Variables.aws.domain_name)
|
27
29
|
read_db
|
28
30
|
end
|
29
31
|
|
32
|
+
def check_credentials
|
33
|
+
return unless Variables.store.type == :aws_simple_db
|
34
|
+
|
35
|
+
return if Variables.aws.all_present?
|
36
|
+
|
37
|
+
raise(MissingVariables.new("Missing AWS credentials. "\
|
38
|
+
"Set them up or change store type to anything other than aws_simple_db"))
|
39
|
+
end
|
40
|
+
|
30
41
|
def reddit_token=(val)
|
31
42
|
@reddit_token = val
|
32
43
|
write_db
|
@@ -22,13 +22,14 @@ module RedditToTelegram
|
|
22
22
|
|
23
23
|
class << self
|
24
24
|
def push(post, channel)
|
25
|
-
HTTParty.post(
|
25
|
+
res = HTTParty.post(
|
26
26
|
"#{BASE_URI}#{Variables.telegram.bot_token}/send#{METHOD_MAP[post[:type]]}",
|
27
27
|
**params(post, channel)
|
28
28
|
)
|
29
29
|
|
30
30
|
push({ type: :text, id: post[:id], text: post[:text] }, channel) if post[:type] == :gallery
|
31
31
|
Video.delete_file if post[:type] == :video && post.dig(:misc)&.dig(:binary)
|
32
|
+
res
|
32
33
|
end
|
33
34
|
|
34
35
|
private
|
@@ -42,10 +42,11 @@ module RedditToTelegram
|
|
42
42
|
end
|
43
43
|
|
44
44
|
class AWS
|
45
|
+
ATTRS = %i[access_key_id secret_access_key region domain_name].freeze
|
45
46
|
DEFAULT_DOMAIN_NAME = "reddit_to_telegram"
|
46
47
|
|
47
48
|
class << self
|
48
|
-
attr_writer
|
49
|
+
attr_writer(*ATTRS)
|
49
50
|
|
50
51
|
def access_key_id
|
51
52
|
@access_key_id ||= ENV["RTT_AWS_ACCESS_KEY_ID"]
|
@@ -62,6 +63,10 @@ module RedditToTelegram
|
|
62
63
|
def domain_name
|
63
64
|
@domain_name ||= ENV["RTT_AWS_DOMAIN_NAME"] || DEFAULT_DOMAIN_NAME
|
64
65
|
end
|
66
|
+
|
67
|
+
def set_up?
|
68
|
+
ATTRS.all? { |a| !a.empty? }
|
69
|
+
end
|
65
70
|
end
|
66
71
|
end
|
67
72
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reddit-to-telegram
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Tityuk
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-03-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-simpledb
|
@@ -70,6 +70,7 @@ files:
|
|
70
70
|
- lib/reddit_to_telegram/reddit/auth.rb
|
71
71
|
- lib/reddit_to_telegram/reddit/fetch.rb
|
72
72
|
- lib/reddit_to_telegram/reddit/output.rb
|
73
|
+
- lib/reddit_to_telegram/reddit/output/imgur.rb
|
73
74
|
- lib/reddit_to_telegram/store.rb
|
74
75
|
- lib/reddit_to_telegram/store/aws_simple_db.rb
|
75
76
|
- lib/reddit_to_telegram/store/memory.rb
|