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.
- checksums.yaml +7 -0
- data/bin/donny-t +39 -0
- data/lib/donny-t/donny.rb +106 -0
- metadata +45 -0
checksums.yaml
ADDED
|
@@ -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
|
data/bin/donny-t
ADDED
|
@@ -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: []
|