donny-t 0.0.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.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/bin/donny-t +39 -0
  3. data/lib/donny-t/donny.rb +106 -0
  4. metadata +45 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 32758173a807c33194e2eacd8d7dcb596827c1ee5f5e6ce29147ac943837ed0b
4
+ data.tar.gz: 76772ec71572bfaf9069d526977ce6291bd601fde57b54bcf6c0e0c3f1708dc2
5
+ SHA512:
6
+ metadata.gz: 1ad9148f86a532b14f33c02b1af18169703179072c49d7fcfa1e859718dddc01d79e5f85f78a0682a4ceebb976dd45e5773949b3fd51b801c24626a3a27c31e0
7
+ data.tar.gz: f64dd2a5dff5d3454addb48b2f99352b1e8d04e08369b1c352540f60033b9391486f8779883209e15c3c2fb6b0a8223500ae4b72cb24fdf7aa4e849bbb036ef2
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'optparse'
5
+ require 'ostruct'
6
+ require 'donny-t/donny'
7
+
8
+ def validate_command_line_arguments(arguments)
9
+ has_discord_key = arguments.key? :discord_key
10
+ has_twitter_key = arguments.key? :twitter_key
11
+ has_twitter_secret = arguments.key? :twitter_secret
12
+ has_twitter_bearer_token = arguments.key? :twitter_bearer_token
13
+
14
+ has_discord_key && has_twitter_key && has_twitter_secret && has_twitter_bearer_token
15
+ end
16
+
17
+ def extract_command_line_arguments
18
+ options = {}
19
+ parser = OptionParser.new
20
+ parser.banner = 'Usage: donny-t [options]'
21
+ parser.on('-t KEY', '--twitter_key=KEY', 'Twitter API key', String)
22
+ parser.on('-s KEY', '--twitter_secret=KEY', 'Twitter API secret', String)
23
+ parser.on('-b KEY', '--twitter_bearer_token=KEY', 'Twitter API bearer token', String)
24
+ parser.on('-d KEY', '--discord_key=KEY', 'Discord API key', String)
25
+ parser.parse!(into: options)
26
+ options
27
+ end
28
+
29
+ def main
30
+ arguments = extract_command_line_arguments
31
+ puts arguments
32
+ arguments_are_valid = validate_command_line_arguments(arguments)
33
+
34
+ raise 'Invalid arguments' unless arguments_are_valid
35
+
36
+ Donny.new(arguments).start
37
+ end
38
+
39
+ main
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'discordrb'
4
+ require 'twitter'
5
+
6
+ class Donny
7
+ def initialize(options)
8
+ @queue = []
9
+ @last_message_time = 0
10
+ @cooldown = 0.5
11
+ @discord_token = options[:discord_key]
12
+ @twitter_token = options[:twitter_key]
13
+ @twitter_secret = options[:twitter_secret]
14
+ @twitter_bearer_token = options[:twitter_bearer_token]
15
+ @twitter_client = create_twitter_client
16
+ @discord_client = create_discord_client
17
+ @tweet_cache = []
18
+ end
19
+
20
+ def start
21
+ start_queue
22
+ start_cache
23
+ start_discord_bot
24
+ end
25
+
26
+ def create_twitter_client
27
+ Twitter::REST::Client.new do |config|
28
+ config.consumer_key = @twitter_token
29
+ config.consumer_secret = @twitter_secret
30
+ config.bearer_token = @twitter_bearer_token
31
+ end
32
+ end
33
+
34
+ def create_discord_client
35
+ Discordrb::Bot.new token: @discord_token
36
+ end
37
+
38
+ def start_discord_bot
39
+ @discord_client.message do |event|
40
+ @queue.unshift(event) if event.message.to_s.include? @discord_client.bot_user.id.to_s
41
+ end
42
+ @discord_client.run
43
+ end
44
+
45
+ def auto_paginate_tweets(collection=[], max_id=nil, &block)
46
+ begin
47
+ response = yield(max_id)
48
+ raise StandardError.new if response.nil?
49
+ collection += response
50
+ response.empty? ? collection.flatten : auto_paginate_tweets(collection, response.last.id - 1, &block)
51
+ rescue StandardError
52
+ retry
53
+ rescue Twitter::Error::TooManyRequests => error
54
+ puts ("Rate limited by twitter. Sleeping for #{error.rate_limit.reset_in} seconds")
55
+ sleep error.rate_limit.reset_in + 1
56
+ retry
57
+ end
58
+ end
59
+
60
+ def update_tweet_cache
61
+ @tweet_cache = []
62
+ auto_paginate_tweets do |max_id|
63
+ options = {count: 200, include_rts: true}
64
+ options[:max_id] = max_id unless max_id.nil?
65
+ @tweet_cache += @twitter_client.user_timeline("realdonaldtrump", options)
66
+ end
67
+ end
68
+
69
+ def send_newest_message
70
+ event = @queue.pop
71
+
72
+ if @tweet_cache.length == 0
73
+ event.respond("The corrupt dems and sleepy Joe are using shenanigans to stop me from tweeting. Give me a minute.")
74
+ else
75
+ puts("Sending random tweet from a pool of #{@tweet_cache.length}")
76
+ tweet = @tweet_cache.sample
77
+ event.respond(tweet.text)
78
+ end
79
+ end
80
+
81
+ def process_queue_item
82
+ now = Time.now.to_f
83
+ return if @queue.empty? || now - @last_message_time < @cooldown
84
+
85
+ send_newest_message
86
+ @last_message_time = now
87
+ end
88
+
89
+ def start_cache
90
+ Thread.new do
91
+ loop do
92
+ update_tweet_cache
93
+ sleep 15 * 60
94
+ end
95
+ end
96
+ end
97
+
98
+ def start_queue
99
+ Thread.new do
100
+ loop do
101
+ process_queue_item
102
+ sleep 0.1
103
+ end
104
+ end
105
+ end
106
+ end
metadata ADDED
@@ -0,0 +1,45 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: donny-t
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Andreas Kruhlmann
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-11-06 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: ''
14
+ email: andreas@kruhlmann.dev
15
+ executables:
16
+ - donny-t
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - bin/donny-t
21
+ - lib/donny-t/donny.rb
22
+ homepage: https://github.com/Kruhlmann/donny-t
23
+ licenses:
24
+ - GPL-3.0-or-later
25
+ metadata: {}
26
+ post_install_message:
27
+ rdoc_options: []
28
+ require_paths:
29
+ - lib
30
+ required_ruby_version: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - '='
33
+ - !ruby/object:Gem::Version
34
+ version: '2.7'
35
+ required_rubygems_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ requirements: []
41
+ rubygems_version: 3.1.4
42
+ signing_key:
43
+ specification_version: 4
44
+ summary: Donald J. Trump twitter discord bot
45
+ test_files: []