reddit-to-telegram 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: def346e1939d931f21e0f24d1630cb4bd9a6d08d0ef7ebd5abbe825c1550a938
4
+ data.tar.gz: 2f82277c614573fe1fd857a6fb6ea61f9c9e05c0f988469ad058dc2e69b1c98d
5
+ SHA512:
6
+ metadata.gz: f11773282239a115f8e1609f7cd96af138057b8ca14aaaad938da783888efa50c25ead86cbc7a04af2095b642c481f297d07b2ae972e34dc6f2c4f2a80cb1dce
7
+ data.tar.gz: 107f58634675023a1c0ac98a6be862dd5101169f76296bedc09c280bd21e8cb737ef6610557d5932f3034dc25f1aa4e66ef43af6b1d115a614405b1fdf6512f3
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ tmp/*
2
+ !tmp/.keep
data/.rubocop.yml ADDED
@@ -0,0 +1,14 @@
1
+ Metrics/MethodLength:
2
+ Max: 20
3
+
4
+ Style/Documentation:
5
+ Enabled: false
6
+
7
+ Style/NumericPredicate:
8
+ Enabled: false
9
+
10
+ Style/SingleArgumentDig:
11
+ Enabled: false
12
+
13
+ Style/StringLiterals:
14
+ EnforcedStyle: double_quotes
data/.tool-versions ADDED
@@ -0,0 +1 @@
1
+ ruby 3.2.2
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,65 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ reddit-to-telegram (0.0.0)
5
+ aws-sdk-simpledb
6
+ httparty
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ ast (2.4.2)
12
+ aws-eventstream (1.3.0)
13
+ aws-partitions (1.883.0)
14
+ aws-sdk-core (3.190.3)
15
+ aws-eventstream (~> 1, >= 1.3.0)
16
+ aws-partitions (~> 1, >= 1.651.0)
17
+ aws-sigv4 (~> 1.8)
18
+ jmespath (~> 1, >= 1.6.1)
19
+ aws-sdk-simpledb (1.42.0)
20
+ aws-sdk-core (~> 3, >= 3.188.0)
21
+ aws-sigv2 (~> 1.0)
22
+ aws-sigv2 (1.2.0)
23
+ aws-sigv4 (1.8.0)
24
+ aws-eventstream (~> 1, >= 1.0.2)
25
+ httparty (0.21.0)
26
+ mini_mime (>= 1.0.0)
27
+ multi_xml (>= 0.5.2)
28
+ jmespath (1.6.2)
29
+ json (2.7.1)
30
+ language_server-protocol (3.17.0.3)
31
+ mini_mime (1.1.5)
32
+ multi_xml (0.6.0)
33
+ parallel (1.24.0)
34
+ parser (3.3.0.5)
35
+ ast (~> 2.4.1)
36
+ racc
37
+ racc (1.7.3)
38
+ rainbow (3.1.1)
39
+ regexp_parser (2.9.0)
40
+ rexml (3.2.6)
41
+ rubocop (1.60.2)
42
+ json (~> 2.3)
43
+ language_server-protocol (>= 3.17.0)
44
+ parallel (~> 1.10)
45
+ parser (>= 3.3.0.2)
46
+ rainbow (>= 2.2.2, < 4.0)
47
+ regexp_parser (>= 1.8, < 3.0)
48
+ rexml (>= 3.2.5, < 4.0)
49
+ rubocop-ast (>= 1.30.0, < 2.0)
50
+ ruby-progressbar (~> 1.7)
51
+ unicode-display_width (>= 2.4.0, < 3.0)
52
+ rubocop-ast (1.30.0)
53
+ parser (>= 3.2.1.0)
54
+ ruby-progressbar (1.13.0)
55
+ unicode-display_width (2.5.0)
56
+
57
+ PLATFORMS
58
+ x86_64-linux
59
+
60
+ DEPENDENCIES
61
+ reddit-to-telegram!
62
+ rubocop
63
+
64
+ BUNDLED WITH
65
+ 2.4.10
data/README.md ADDED
@@ -0,0 +1,9 @@
1
+ reddit-to-telegram
2
+ =======================
3
+
4
+ #### Fetches hot posts from chosen subreddits and pushes them to Telegram channels.
5
+
6
+ I'll update readme with instructions soon.
7
+
8
+ ### TODO:
9
+ - Error handling (maybe send them to another channel in Telegram)
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "reddit_to_telegram/reddit/fetch"
4
+ require_relative "reddit_to_telegram/store"
5
+ require_relative "reddit_to_telegram/telegram/post"
6
+
7
+ module RedditToTelegram
8
+ class << self
9
+ def post(sources)
10
+ return if sources.empty?
11
+
12
+ Store.setup
13
+
14
+ sources.each do |subreddit, telegram_chat_id|
15
+ res = Reddit::Fetch.hot(subreddit)
16
+ handle_res(res, subreddit, telegram_chat_id)
17
+ end
18
+ end
19
+
20
+ def handle_res(res, subreddit, telegram_chat_id)
21
+ return if res.nil?
22
+
23
+ post = find_new_post(subreddit, res)
24
+ return if post.nil?
25
+
26
+ Telegram::Post.push(post, telegram_chat_id)
27
+ Store::Posts.add(subreddit, post[:id])
28
+ end
29
+
30
+ def find_new_post(subreddit, posts)
31
+ posts.find { |post| !Store::Posts.dup?(subreddit, post[:id]) }
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "httparty"
4
+ require_relative "../vars"
5
+
6
+ module RedditToTelegram
7
+ module Reddit
8
+ class Auth
9
+ include HTTParty
10
+
11
+ URI = "https://www.reddit.com/api/v1/access_token"
12
+ PARAMS = { grant_type: "client_credentials" }.freeze
13
+ HEADERS = { "Content-Type" => "application/x-www-form-urlencoded" }.freeze
14
+
15
+ class << self
16
+ def token
17
+ HTTParty.post(
18
+ URI,
19
+ body: PARAMS,
20
+ headers: HEADERS,
21
+ basic_auth: { username: Vars::Reddit.client_id, password: Vars::Reddit.client_secret }
22
+ )["access_token"]
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "httparty"
4
+ require_relative "auth"
5
+ require_relative "output"
6
+ require_relative "../store"
7
+ require_relative "../vars"
8
+
9
+ module RedditToTelegram
10
+ module Reddit
11
+ class Fetch
12
+ include HTTParty
13
+
14
+ BASE_URI = "https://oauth.reddit.com/r"
15
+ QUERY = { g: "GLOBAL", limit: Vars.max_stored_posts }.freeze
16
+ BASE_HEADERS = {
17
+ "Content-Type" => "application/json",
18
+ "Accept" => "application/json"
19
+ }.freeze
20
+
21
+ class << self
22
+ def hot(subreddit, retries_left = 5)
23
+ headers = BASE_HEADERS.merge("Authorization" => "Bearer #{Store::Reddit.token}")
24
+ res = HTTParty.get(
25
+ "#{BASE_URI}/#{subreddit}/hot.json",
26
+ query: QUERY,
27
+ headers:
28
+ )
29
+ handle_response(res, subreddit, retries_left)
30
+ end
31
+
32
+ def handle_response(res, subreddit, retries_left)
33
+ case res.code
34
+ when 401
35
+ Store::Reddit.token = Auth.token
36
+ hot(subreddit, retries_left) if retries_left > 0
37
+ when 429
38
+ sleep(10 / retries_left) if retries_left > 0
39
+ hot(subreddit, retries_left - 1) if retries_left > 0
40
+ when 200
41
+ Output.format_response(res)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RedditToTelegram
4
+ module Reddit
5
+ class Output
6
+ class << self
7
+ def format_response(res)
8
+ posts = res["data"]["children"]
9
+ posts.reject! { |post| post["data"]["stickied"] == true }
10
+ posts.map { |post| format_post(post) }.compact
11
+ end
12
+
13
+ def format_post(post)
14
+ data = post["data"]
15
+ if data["post_hint"] == "image"
16
+ format_image_post(data)
17
+ elsif data["post_hint"] == "link"
18
+ format_link_post(data)
19
+ elsif data["is_gallery"]
20
+ format_gallery_post(data)
21
+ elsif data["is_video"]
22
+ format_video_post(data)
23
+ end
24
+ end
25
+
26
+ def format_image_post(data)
27
+ base_post_format_attrs(data).merge(
28
+ { type: :image,
29
+ media: data["url"] }
30
+ )
31
+ end
32
+
33
+ def format_link_post(data)
34
+ base_post_format_attrs(data).merge(
35
+ { type: :text,
36
+ text: "#{data['title']}\n\n#{data['url']}" }
37
+ )
38
+ end
39
+
40
+ def format_gallery_post(data)
41
+ base_post_format_attrs(data).merge(
42
+ { type: :gallery,
43
+ media: prepare_gallery_links(data) }
44
+ )
45
+ end
46
+
47
+ def format_video_post(data)
48
+ video_data = data["secure_media"]["reddit_video"]
49
+ video_url = video_data["fallback_url"]
50
+ if video_data["has_audio"]
51
+ audio_url = "#{video_url.split('_')[0]}_AUDIO_128.mp4"
52
+ video_url = "https://sd.rapidsave.com/download.php"\
53
+ "?permalink=https://reddit.com#{data['permalink']}"\
54
+ "&video_url=#{video_url}&audio_url=#{audio_url}"
55
+ end
56
+
57
+ base_post_format_attrs(data).merge(
58
+ {
59
+ type: :video,
60
+ media: video_url,
61
+ misc: {
62
+ binary: video_data["has_audio"] || false
63
+ }
64
+ }
65
+ )
66
+ end
67
+
68
+ def base_post_format_attrs(data)
69
+ { id: data["name"],
70
+ text: data["title"] }
71
+ end
72
+
73
+ def prepare_gallery_links(data)
74
+ data["media_metadata"].map do |image|
75
+ image[1]["p"][0]["u"].split("?").first.gsub("preview", "i")
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "aws-sdk-simpledb"
4
+ require "json"
5
+ require_relative "../vars"
6
+
7
+ module RedditToTelegram
8
+ module Store
9
+ class AWSSimpleDB
10
+ DOMAIN_NAME = "reddit_to_telegram"
11
+ ITEM_NAME = "cached_data"
12
+
13
+ class << self
14
+ attr_reader :reddit_token
15
+
16
+ def setup
17
+ create_domain unless client.list_domains.domain_names.include?(DOMAIN_NAME)
18
+ read_db
19
+ end
20
+
21
+ def reddit_token=(val)
22
+ @reddit_token = val
23
+ write_db
24
+ end
25
+
26
+ def add_post(subreddit, id)
27
+ @posts[subreddit] = [] if @posts[subreddit].nil?
28
+ @posts[subreddit] << id
29
+ @posts[subreddit].shift if @posts[subreddit].count > Store::MAX_STORED_POSTS
30
+ write_db
31
+ end
32
+
33
+ def dup_post?(subreddit, id)
34
+ return false if @posts[subreddit].nil?
35
+
36
+ @posts[subreddit].include?(id)
37
+ end
38
+
39
+ def client
40
+ @client ||= Aws::SimpleDB::Client.new(
41
+ access_key_id: Vars::AWS.access_key_id,
42
+ secret_access_key: Vars::AWS.secret_access_key,
43
+ region: Vars::AWS.region
44
+ )
45
+ end
46
+
47
+ def read_db
48
+ res = client.get_attributes(
49
+ {
50
+ domain_name: "reddit_to_telegram",
51
+ item_name: "cached_data",
52
+ consistent_read: true
53
+ }
54
+ )
55
+
56
+ return assign_default_values if res.attributes.empty?
57
+
58
+ assign_values_from_db(res)
59
+ end
60
+
61
+ def assign_values_from_db(data)
62
+ @reddit_token = data.attributes.find { |a| a.name == "reddit_token" }.value || ""
63
+ @posts = {}
64
+ data.attributes.each do |attr|
65
+ @posts[attr.name.split("_").last.to_sym] = JSON.parse(attr.value) if attr.name.match?(/posts_.+/)
66
+ end
67
+ end
68
+
69
+ def write_db
70
+ client.put_attributes(
71
+ {
72
+ domain_name: DOMAIN_NAME,
73
+ item_name: ITEM_NAME,
74
+ attributes: prepare_db_attrs
75
+ }
76
+ )
77
+ end
78
+
79
+ def prepare_db_attrs
80
+ attrs = [
81
+ {
82
+ name: "reddit_token",
83
+ value: @reddit_token,
84
+ replace: true
85
+ }
86
+ ]
87
+
88
+ @posts.each do |subreddit, values|
89
+ attrs << { name: "posts_#{subreddit}", value: values.to_json, replace: true }
90
+ end
91
+
92
+ attrs
93
+ end
94
+
95
+ def assign_default_values
96
+ @reddit_token = ""
97
+ @posts = {}
98
+ end
99
+
100
+ def create_domain
101
+ res = client.list_domains
102
+ return unless res.successful?
103
+
104
+ return if res.domain_names.include?(DOMAIN_NAME)
105
+
106
+ client.create_domain({ domain_name: DOMAIN_NAME })
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RedditToTelegram
4
+ module Store
5
+ class Memory
6
+ class << self
7
+ attr_accessor :reddit_token
8
+
9
+ @posts = {}
10
+
11
+ def setup; end
12
+
13
+ def add_post(subreddit, id)
14
+ @posts[subreddit] = [] if @posts[subreddit].nil?
15
+ @posts[subreddit] << id
16
+ @posts[subreddit].shift if @posts[subreddit].count > Store::MAX_STORED_POSTS
17
+ end
18
+
19
+ def dup_post?(subreddit, id)
20
+ return false if posts[subreddit].nil?
21
+
22
+ posts[subreddit].include?(id)
23
+ end
24
+
25
+ def posts
26
+ @posts ||= {}
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+
5
+ module RedditToTelegram
6
+ module Store
7
+ class TempFile
8
+ STORE_FILE_DIR = "#{Dir.pwd}/tmp/store.json".freeze
9
+
10
+ class << self
11
+ attr_reader :reddit_token, :posts
12
+
13
+ @reddit_token = nil
14
+ @posts = {}
15
+
16
+ def setup
17
+ read_file
18
+ end
19
+
20
+ def reddit_token=(val)
21
+ @reddit_token = val
22
+ write_file
23
+ end
24
+
25
+ def add_post(subreddit, id)
26
+ @posts[subreddit] = [] if @posts[subreddit].nil?
27
+ @posts[subreddit] << id
28
+ @posts[subreddit].shift if @posts[subreddit].count > Store::MAX_STORED_POSTS
29
+ write_file
30
+ end
31
+
32
+ def dup_post?(subreddit, id)
33
+ return false if posts[subreddit].nil?
34
+
35
+ posts[subreddit].include?(id)
36
+ end
37
+
38
+ def read_file
39
+ return assign_default_values unless File.exist?(STORE_FILE_DIR)
40
+
41
+ file = File.read(STORE_FILE_DIR)
42
+ data = JSON.parse(file)
43
+ @reddit_token = data["reddit_token"]
44
+ @posts = {}
45
+ data.each do |key, value|
46
+ @posts[key.split("_").last.to_sym] = value if key.match?(/posts_.+/)
47
+ end
48
+ end
49
+
50
+ def write_file
51
+ data = { reddit_token: @reddit_token }
52
+ @posts.each do |subreddit, values|
53
+ data["posts_#{subreddit}".to_sym] = values
54
+ end
55
+ File.open(STORE_FILE_DIR, "w") { |f| f.write(data.to_json) }
56
+ end
57
+
58
+ def assign_default_values
59
+ @reddit_token = nil
60
+ @posts = {}
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "store/aws_simple_db"
4
+ require_relative "store/memory"
5
+ require_relative "store/temp_file"
6
+
7
+ module RedditToTelegram
8
+ module Store
9
+ MAX_STORED_POSTS = Vars.max_stored_posts ? Vars.max_stored_posts - 1 : 24
10
+ STORE_MAP = {
11
+ aws_simple_db: "RedditToTelegram::Store::AWSSimpleDB",
12
+ memory: "RedditToTelegram::Store::Memory",
13
+ temp_file: "RedditToTelegram::Store::TempFile"
14
+ }.freeze
15
+ DEFAULT_STORE = :aws_simple_db
16
+
17
+ STORE = Object.const_get("RedditToTelegram::Store::AWSSimpleDB")
18
+
19
+ class << self
20
+ attr_accessor :active
21
+
22
+ def setup(selected_store = DEFAULT_STORE)
23
+ self.active = Object.const_get(STORE_MAP[selected_store.to_sym])
24
+ active.send(:setup)
25
+ end
26
+ end
27
+
28
+ class Reddit
29
+ class << self
30
+ def token
31
+ Store.active.send(:reddit_token)
32
+ end
33
+
34
+ def token=(val)
35
+ Store.active.send(:reddit_token=, val)
36
+ end
37
+ end
38
+ end
39
+
40
+ class Posts
41
+ class << self
42
+ def add(subreddit, id)
43
+ Store.active.send(:add_post, subreddit, id)
44
+ end
45
+
46
+ def dup?(subreddit, id)
47
+ Store.active.send(:dup_post?, subreddit, id)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "httparty"
4
+ require_relative "prepare_request"
5
+ require_relative "video"
6
+
7
+ module RedditToTelegram
8
+ module Telegram
9
+ class Post
10
+ include HTTParty
11
+
12
+ BASE_URI = "https://api.telegram.org/bot"
13
+ JSON_HEADERS = { "Content-Type" => "application/json", "Accept" => "application/json" }.freeze
14
+ FORM_HEADERS = { "Content-Type" => "multipart/form-data", "Accept" => "application/json" }.freeze
15
+ METHOD_MAP = {
16
+ image: :photo,
17
+ gallery: :mediagroup,
18
+ text: :message,
19
+ video: :video
20
+ }.freeze
21
+
22
+ class << self
23
+ def push(post, channel)
24
+ HTTParty.post(
25
+ "#{BASE_URI}#{Vars::Telegram.bot_token}/send#{METHOD_MAP[post[:type]]}",
26
+ **params(post, channel)
27
+ )
28
+
29
+ push({ type: :text, text: body[:caption] }, channel) if post[:type] == :gallery
30
+ Video.delete_file if post[:type] == :video
31
+ end
32
+
33
+ def params(post, channel)
34
+ binary = post.dig(:misc)&.dig(:binary)
35
+ body = PrepareRequest.body(post, channel)
36
+
37
+ pars = {
38
+ body: binary ? body : body.to_json,
39
+ headers: binary ? FORM_HEADERS : JSON_HEADERS
40
+ }
41
+ pars[:multipart] = true if binary
42
+ pars
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "video"
4
+
5
+ module RedditToTelegram
6
+ module Telegram
7
+ class PrepareRequest
8
+ class << self
9
+ def body(post, chat_id)
10
+ case post[:type]
11
+ when :image
12
+ { chat_id: "@#{chat_id}", photo: post[:media], caption: prepare_text(post, chat_id) }
13
+ when :gallery
14
+ { chat_id: "@#{chat_id}", media: prepare_gallery_media(post), caption: prepare_text(post, chat_id) }
15
+ when :text
16
+ { chat_id: "@#{chat_id}", text: prepare_text(post, chat_id) }
17
+ when :video
18
+ { chat_id: "@#{chat_id}", video: prepare_video(post), caption: prepare_text(post, chat_id) }
19
+ end
20
+ end
21
+
22
+ def prepare_text(post, chat_id)
23
+ id = post[:id].split("_")[1]
24
+ "#{post[:text]}\n\nhttps://redd.it/#{id}\n@#{chat_id}"
25
+ end
26
+
27
+ def prepare_gallery_media(post)
28
+ Array(post[:media]).map { |link| { type: "photo", media: link } }
29
+ end
30
+
31
+ def prepare_video(post)
32
+ return post[:media] unless post[:misc][:binary]
33
+
34
+ Video.from_link(post[:media])
35
+ File.open(Video::TEMP_VIDEO_PATH)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "open-uri"
4
+
5
+ module RedditToTelegram
6
+ module Telegram
7
+ class Video
8
+ TEMP_VIDEO_PATH = "#{Dir.pwd}/tmp/video.mp4".freeze
9
+
10
+ class << self
11
+ def from_link(link)
12
+ download = URI.parse(link).open
13
+ IO.copy_stream(download, TEMP_VIDEO_PATH)
14
+ end
15
+
16
+ def delete_file
17
+ f = File.open(TEMP_VIDEO_PATH, "r")
18
+ ensure
19
+ f.close unless f.nil? || f.closed?
20
+ File.delete(TEMP_VIDEO_PATH) if File.exist?(TEMP_VIDEO_PATH)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RedditToTelegram
4
+ module Vars
5
+ class << self
6
+ # rubocop:disable Metrics/ParameterLists
7
+ def assign_values(
8
+ max_stored_posts:,
9
+ aws_access_key_id:,
10
+ aws_secret_access_key:,
11
+ aws_region:,
12
+ reddit_client_id:,
13
+ reddit_client_secret:,
14
+ telegram_bot_token:
15
+ )
16
+
17
+ @max_stored_posts = max_stored_posts
18
+ AWS.instance_variable_set(:@access_key_id, aws_access_key_id)
19
+ AWS.instance_variable_set(:@secret_access_key, aws_secret_access_key)
20
+ AWS.instance_variable_set(:@region, aws_region)
21
+ Reddit.instance_variable_set(:@client_id, reddit_client_id)
22
+ Reddit.instance_variable_set(:@client_secret, reddit_client_secret)
23
+ Telegram.instance_variable_set(:@bot_token, telegram_bot_token)
24
+ end
25
+ # rubocop:enable Metrics/ParameterLists
26
+
27
+ def max_stored_posts
28
+ @max_stored_posts ||= ENV["RTT_MAX_STORED_POSTS"].to_i || 25
29
+ end
30
+ end
31
+
32
+ class AWS
33
+ class << self
34
+ def access_key_id
35
+ @access_key_id ||= ENV["RTT_AWS_ACCESS_KEY_ID"]
36
+ end
37
+
38
+ def secret_access_key
39
+ @secret_access_key ||= ENV["RTT_AWS_SECRET_ACCESS_KEY"]
40
+ end
41
+
42
+ def region
43
+ @region ||= ENV["RTT_AWS_REGION"]
44
+ end
45
+ end
46
+ end
47
+
48
+ class Reddit
49
+ class << self
50
+ def client_id
51
+ @client_id ||= ENV["RTT_REDDIT_CLIENT_ID"]
52
+ end
53
+
54
+ def client_secret
55
+ @client_secret ||= ENV["RTT_REDDIT_CLIENT_SECRET"]
56
+ end
57
+ end
58
+ end
59
+
60
+ class Telegram
61
+ class << self
62
+ def bot_token
63
+ @bot_token ||= ENV["RTT_TELEGRAM_BOT_TOKEN"]
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RedditToTelegram
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ $:.push File.expand_path("../lib", __FILE__)
4
+ require "reddit_to_telegram/version"
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "reddit-to-telegram"
8
+ s.version = RedditToTelegram::VERSION
9
+ s.summary = "Fetches hot posts from reddit and pushes them to telegram"
10
+ s.description = "This gem makes simple reddit-to-telegram ruby bots easy to create"
11
+ s.authors = ["Mark Tityuk"]
12
+ s.email = "mark.tityuk@gmail.com"
13
+ s.files = `git ls-files`.split("\n")
14
+ s.homepage = "https://github.com/dersnek/reddit-to-telegram"
15
+ s.license = "MIT"
16
+
17
+ s.add_dependency "aws-sdk-simpledb"
18
+ s.add_dependency "httparty"
19
+
20
+ s.add_development_dependency "rubocop"
21
+ end
data/tmp/.keep ADDED
File without changes
metadata ADDED
@@ -0,0 +1,105 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: reddit-to-telegram
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Mark Tityuk
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-01-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aws-sdk-simpledb
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: httparty
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: This gem makes simple reddit-to-telegram ruby bots easy to create
56
+ email: mark.tityuk@gmail.com
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - ".gitignore"
62
+ - ".rubocop.yml"
63
+ - ".tool-versions"
64
+ - Gemfile
65
+ - Gemfile.lock
66
+ - README.md
67
+ - lib/reddit-to-telegram.rb
68
+ - lib/reddit_to_telegram/reddit/auth.rb
69
+ - lib/reddit_to_telegram/reddit/fetch.rb
70
+ - lib/reddit_to_telegram/reddit/output.rb
71
+ - lib/reddit_to_telegram/store.rb
72
+ - lib/reddit_to_telegram/store/aws_simple_db.rb
73
+ - lib/reddit_to_telegram/store/memory.rb
74
+ - lib/reddit_to_telegram/store/temp_file.rb
75
+ - lib/reddit_to_telegram/telegram/post.rb
76
+ - lib/reddit_to_telegram/telegram/prepare_request.rb
77
+ - lib/reddit_to_telegram/telegram/video.rb
78
+ - lib/reddit_to_telegram/vars.rb
79
+ - lib/reddit_to_telegram/version.rb
80
+ - reddit-to-telegram.gemspec
81
+ - tmp/.keep
82
+ homepage: https://github.com/dersnek/reddit-to-telegram
83
+ licenses:
84
+ - MIT
85
+ metadata: {}
86
+ post_install_message:
87
+ rdoc_options: []
88
+ require_paths:
89
+ - lib
90
+ required_ruby_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ required_rubygems_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ requirements: []
101
+ rubygems_version: 3.4.10
102
+ signing_key:
103
+ specification_version: 4
104
+ summary: Fetches hot posts from reddit and pushes them to telegram
105
+ test_files: []