reddit_bot 1.3.0 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +9 -7
  3. data/examples/boilerplate.rb +2 -2
  4. data/examples/councilofricks/Gemfile +2 -2
  5. data/examples/councilofricks/Gemfile.lock +8 -7
  6. data/examples/councilofricks/main.rb +24 -13
  7. data/examples/cptflairbot3/.bashrc +1 -0
  8. data/examples/cptflairbot3/Code.gs +13 -0
  9. data/examples/cptflairbot3/Gemfile +2 -1
  10. data/examples/cptflairbot3/Gemfile.lock +64 -4
  11. data/examples/cptflairbot3/app.js +40 -0
  12. data/examples/cptflairbot3/casual/casualpokemontrades.htm +910 -0
  13. data/examples/cptflairbot3/casual/script.js +55 -0
  14. data/examples/cptflairbot3/casual/style.css +1099 -0
  15. data/examples/cptflairbot3/log.htm +1 -0
  16. data/examples/cptflairbot3/main.rb +31 -10
  17. data/examples/cptflairbot3/package.json +6 -0
  18. data/examples/cptflairbot3/pubsub.rb +30 -0
  19. data/examples/cptflairbot3/update_gas_hook_secret.rb +4 -0
  20. data/examples/devflairbot/Gemfile +1 -1
  21. data/examples/devflairbot/Gemfile.lock +3 -3
  22. data/examples/devflairbot/main.rb +1 -1
  23. data/examples/largeimages/Gemfile +5 -0
  24. data/examples/largeimages/Gemfile.lock +26 -0
  25. data/examples/largeimages/main.rb +183 -0
  26. data/examples/mlgtv/Gemfile +1 -1
  27. data/examples/mlgtv/Gemfile.lock +3 -3
  28. data/examples/mlgtv/channels.txt +110 -0
  29. data/examples/mlgtv/main.rb +67 -12
  30. data/examples/realtimeww2/Gemfile +4 -0
  31. data/examples/realtimeww2/Gemfile.lock +23 -0
  32. data/examples/realtimeww2/main.rb +82 -0
  33. data/examples/sexypizza/Gemfile +1 -1
  34. data/examples/sexypizza/Gemfile.lock +4 -4
  35. data/examples/wallpaper/Gemfile +1 -1
  36. data/examples/wallpaper/Gemfile.lock +3 -3
  37. data/examples/wallpaper/main.rb +1 -1
  38. data/examples/yayornay/Gemfile +1 -5
  39. data/examples/yayornay/Gemfile.lock +3 -3
  40. data/examples/yayornay/main.rb +1 -1
  41. data/lib/reddit_bot/version.rb +3 -0
  42. data/lib/reddit_bot.rb +3 -7
  43. data/reddit_bot.gemspec +1 -4
  44. metadata +20 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dd7aa171b0722398964a733d385b956e488758fc
4
- data.tar.gz: 94a8959747d7d93c27722be9f4bf279ea69fe75b
3
+ metadata.gz: 0f75fa5e061134a60cae44226a5995d8368e802d
4
+ data.tar.gz: ef7c93b4c345c11d93ab752de2a41ed1d380516b
5
5
  SHA512:
6
- metadata.gz: 1b1f6ecf337874ef91c24f8ab25ec2a6037739c22faecb27ba0b35932e655b5ea13af3ee3f1b94fb29400a51693b20ea2e93e89d46cb2d9787bb49ec23358eb9
7
- data.tar.gz: 68ae0ad1d581fdc6932ec56049f4afe73de1d183dfb807326c0909d2a3e0221f98fd91ef9f5a7ef7b60ed35b42a82b5717a4f7254776f7c45eadc2635472d2aa
6
+ metadata.gz: 1b980165b04f3db528a79a984da5bb21c5d7c4ee9b8e76b15cebb1ce1ef90a81beb68f6af78cb6fb72526686a924078bb4bd95108bfe49906a30158cd836ed82
7
+ data.tar.gz: 222bd7ef333723ed9b3969b5f27086e864f4a7f1cc021dfdd6d4b057030d26f546466915573db7676717dd140035dffcc264c25a6e6731099db186e0fbe2c3fd
data/README.md CHANGED
@@ -5,8 +5,8 @@
5
5
 
6
6
  #### What
7
7
 
8
- This library provides an easy way to run bots and scripts that use Reddit API.
9
- I (@nakilon) currently run near 10 bots with it.
8
+ This library provides an easy way to run bots and scripts that use Reddit API.
9
+ I ([/u/nakilon](https://reddit.com/u/nakilon)) currently run near 10 bots with it.
10
10
 
11
11
  #### Why
12
12
 
@@ -20,10 +20,12 @@ The [examples folder](examples) includes:
20
20
  * devflairbot -- bot that flairs posts when some specifically flaired user comments there
21
21
  * mlgtv -- bot that updates sidebar with currently streaming twitch channels
22
22
  * councilofricks -- bot that flairs users according to Google Spreadsheet
23
- * wallpaper -- bot that reports images with dimensions not the same as in title
24
- * cptflairbot3 -- bot that sets flair to user according to request submitted via PM
23
+ * wallpaper -- bot that reports images with dimensions being not the same as in title
24
+ * cptflairbot3 -- bot that sets user flair according to request submitted via web form
25
+ also publishes its activily log here http://nakilon.pro/log.htm via Google Cloud Platform automations
25
26
  * oneplus -- bot that removes and modmails about links to 1080x1920 images
26
27
  * yayornay -- bot that flairs posts according to voting in top level comments
28
+ * realtimeww2 -- bot that posts tweets to a subreddit from a Twitter user timeline
27
29
  * largeimagesreview -- useful script for [subreddit /r/largeimages](https://reddit.com/r/largeimages/top)
28
30
  It calculates quality of x-posts from different subreddits based on mods activity (remove/approve).
29
31
  For example, this showed that it would be ok to ignore /r/pics from now:
@@ -70,12 +72,12 @@ helloworld.rb:
70
72
 
71
73
  require "reddit_bot"
72
74
 
73
- probably Gemfile:
75
+ or via Gemfile:
74
76
 
75
77
  source "https://rubygems.org"
76
78
  gem "reddit_bot"
77
79
 
78
- TODO: Write usage instructions here
80
+ TODO: write more usage instructions here
79
81
  TODO: manual on how to create bots with Reddit web interface and run via bash console
80
82
 
81
83
  To update the gem version in Gemfile.lock when using Gemfile like this: `gem "reddit_bot", "~>1.1.0"`, do the:
@@ -84,5 +86,5 @@ To update the gem version in Gemfile.lock when using Gemfile like this: `gem "re
84
86
 
85
87
  #### Contributing and License
86
88
 
87
- Bug reports and pull requests are welcome.
89
+ Bug reports and pull requests are welcome.
88
90
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -1,8 +1,8 @@
1
1
  STDOUT.sync = true
2
2
  require "pp"
3
3
 
4
- if Gem.loaded_specs.include? "net_http_utils"
5
- require "net_http_utils"
4
+ if Gem.loaded_specs.include? "nethttputils"
5
+ require "nethttputils"
6
6
  else
7
7
  require_relative "net_http_utils"
8
8
  end
@@ -1,4 +1,4 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- gem "reddit_bot", "~>1.2.0"
4
- gem "net_http_utils", ?0, gist: "97549ceb58d21e1fcbc0e6cdaf92fce8"
3
+ gem "reddit_bot", "~>1.3.0"
4
+ gem "nethttputils", git: "git@github.com:Nakilon/nethttputils.git", tag: "v0.0.1.1"
@@ -1,22 +1,23 @@
1
1
  GIT
2
- remote: https://gist.github.com/97549ceb58d21e1fcbc0e6cdaf92fce8.git
3
- revision: 54c47ab3f9665f3e35a8e94fdd267e3743c736a9
2
+ remote: git@github.com:Nakilon/nethttputils.git
3
+ revision: 5642bf7ecde4b3ecc55423b9ea9957828a9cb2f9
4
+ tag: v0.0.1.1
4
5
  specs:
5
- net_http_utils (0)
6
+ nethttputils (0.0.1.1)
6
7
 
7
8
  GEM
8
9
  remote: https://rubygems.org/
9
10
  specs:
10
- json (2.0.3)
11
- reddit_bot (1.2.2)
11
+ json (2.1.0)
12
+ reddit_bot (1.3.0)
12
13
  json
13
14
 
14
15
  PLATFORMS
15
16
  ruby
16
17
 
17
18
  DEPENDENCIES
18
- net_http_utils (= 0)!
19
- reddit_bot (~> 1.2.0)
19
+ nethttputils!
20
+ reddit_bot (~> 1.3.0)
20
21
 
21
22
  BUNDLED WITH
22
23
  1.13.1
@@ -1,12 +1,13 @@
1
1
  require_relative "../boilerplate"
2
2
 
3
- BOT = RedditBot::Bot.new YAML.load(File.read "secrets.yaml"), ignore_captcha: true
3
+ BOT = RedditBot::Bot.new YAML.load File.read "secrets.yaml"
4
4
  SUBREDDIT = "CouncilOfRicks"
5
5
 
6
6
  CSS_CLASS = "blueflair"
7
7
 
8
8
  require "csv"
9
9
 
10
+ ignored = []
10
11
  loop do
11
12
  Hearthbeat.beat "u_FlairMoTron_r_CouncilOfRicks", 310 unless Gem::Platform.local.os == "darwin"
12
13
 
@@ -21,21 +22,31 @@ loop do
21
22
  existing = BOT.json(:get, "/r/#{SUBREDDIT}/api/flairlist", limit: 1000)["users"]
22
23
  fail if existing.size >= 1000
23
24
 
24
- if names.size == flairs.size
25
- names.zip(flairs).drop(1).map(&:flatten).each_slice(50) do |slice|
26
- CSV(load = "") do |csv|
27
- slice.each do |user, text|
28
- user = user.to_s.strip
29
- text = text.to_s.strip
30
- csv << [user, text, CSS_CLASS] unless existing.include?( {"user"=>user, "flair_text"=>text, "flair_css_class"=>CSS_CLASS} )
31
- end
25
+ if names.size != flairs.size
26
+ puts "columns are different by length -- probably someone is editing the Spreadsheet"
27
+ else
28
+ names.zip(flairs).drop(1).map(&:flatten).map do |user, text|
29
+ user = user.to_s.strip
30
+ next unless user[/\A[a-z-_\d]+\z/i]
31
+ text = text.to_s.strip
32
+ next puts "ignored #{user}" if ignored.include? user
33
+ next if existing.include?( {"user"=>user, "flair_text"=>text, "flair_css_class"=>CSS_CLASS} )
34
+ [user, text, CSS_CLASS]
35
+ end.compact.each_slice(50) do |slice|
36
+ load = CSV.generate do |csv|
37
+ slice.each &csv.method(:<<)
32
38
  end
33
- BOT.json(:post, "/r/#{SUBREDDIT}/api/flaircsv", [["flair_csv", load]]).each do |report|
34
- pp report unless report.values_at("errors", "ok", "warnings") == [{}, true, {}]
39
+ BOT.json(:post, "/r/#{SUBREDDIT}/api/flaircsv", flair_csv: load).each do |report|
40
+ unless report.values_at("errors", "ok", "warnings") == [{}, true, {}]
41
+ pp report
42
+ abort "wrong keys" unless report.keys.sort == %w{ errors ok status warnings }
43
+ abort "wrong values" unless report.values_at(*%w{ ok status warnings }) == [false, "skipped", {}]
44
+ abort "wrong error keys" unless report["errors"].keys == %w{ user }
45
+ abort "wrong error values" unless user = report["errors"]["user"][/\Aunable to resolve user `([A-Za-z-_\d]+)', ignoring\z/, 1]
46
+ ignored |= [user]
47
+ end
35
48
  end
36
49
  end
37
- else
38
- puts "columns are different by length"
39
50
  end
40
51
 
41
52
  sleep 300
@@ -0,0 +1 @@
1
+ export GOOGLE_APPLICATION_CREDENTIALS=$GOOGLE_APPLICATION_CREDENTIALS_NAKILONPRO_LOGGER
@@ -0,0 +1,13 @@
1
+ function doGet(e) {
2
+ const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
3
+ const range = sheet.getRange("A2:D100"); // hardcode
4
+ console.log(e.parameter.payload);
5
+ payload = JSON.parse(Utilities.newBlob(Utilities.base64Decode(e.parameter.payload)).getDataAsString());
6
+ range.moveTo(range.offset(1, 0));
7
+ sheet.getRange("A2:2").setValues( [ [
8
+ payload.messaged_at,
9
+ payload.processed_at,
10
+ payload.name,
11
+ payload.text,
12
+ ] ] ); // hardcoded columns order
13
+ }
@@ -1,3 +1,4 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- gem "reddit_bot", "~>1.1.5"
3
+ gem "reddit_bot", "~>1.3.0"
4
+ gem "gcplogger", git: "git@github.com:Nakilon/gcplogger.git", tag: "v0.0.0.1"
@@ -1,15 +1,75 @@
1
+ GIT
2
+ remote: git@github.com:Nakilon/gcplogger.git
3
+ revision: 7adffeeeb9a209d15fdd76451ad1a68846a908dd
4
+ tag: v0.0.0.1
5
+ specs:
6
+ gcplogger (0.0.0.1)
7
+ google-cloud-logging
8
+
1
9
  GEM
2
10
  remote: https://rubygems.org/
3
11
  specs:
4
- json (2.0.2)
5
- reddit_bot (1.1.8)
12
+ addressable (2.5.1)
13
+ public_suffix (~> 2.0, >= 2.0.2)
14
+ faraday (0.13.1)
15
+ multipart-post (>= 1.2, < 3)
16
+ google-cloud-core (1.0.0)
17
+ google-cloud-env (~> 1.0)
18
+ googleauth (~> 0.5.1)
19
+ google-cloud-env (1.0.1)
20
+ faraday (~> 0.11)
21
+ google-cloud-logging (1.2.1)
22
+ google-cloud-core (~> 1.0)
23
+ google-gax (~> 0.8.0)
24
+ stackdriver-core (~> 1.2)
25
+ google-gax (0.8.6)
26
+ google-protobuf (~> 3.2)
27
+ googleapis-common-protos (~> 1.3.5)
28
+ googleauth (~> 0.5.1)
29
+ grpc (~> 1.0)
30
+ rly (~> 0.2.3)
31
+ google-protobuf (3.4.0.2)
32
+ googleapis-common-protos (1.3.5)
33
+ google-protobuf (~> 3.2)
34
+ grpc (~> 1.0)
35
+ googleauth (0.5.3)
36
+ faraday (~> 0.12)
37
+ jwt (~> 1.4)
38
+ logging (~> 2.0)
39
+ memoist (~> 0.12)
40
+ multi_json (~> 1.11)
41
+ os (~> 0.9)
42
+ signet (~> 0.7)
43
+ grpc (1.4.5)
44
+ google-protobuf (~> 3.1)
45
+ googleauth (~> 0.5.1)
46
+ json (2.1.0)
47
+ jwt (1.5.6)
48
+ little-plugger (1.1.4)
49
+ logging (2.2.2)
50
+ little-plugger (~> 1.1)
51
+ multi_json (~> 1.10)
52
+ memoist (0.16.0)
53
+ multi_json (1.12.1)
54
+ multipart-post (2.0.0)
55
+ os (0.9.6)
56
+ public_suffix (2.0.5)
57
+ reddit_bot (1.3.0)
6
58
  json
59
+ rly (0.2.3)
60
+ signet (0.7.3)
61
+ addressable (~> 2.3)
62
+ faraday (~> 0.9)
63
+ jwt (~> 1.5)
64
+ multi_json (~> 1.10)
65
+ stackdriver-core (1.2.0)
7
66
 
8
67
  PLATFORMS
9
68
  ruby
10
69
 
11
70
  DEPENDENCIES
12
- reddit_bot (~> 1.1.5)
71
+ gcplogger!
72
+ reddit_bot (~> 1.3.0)
13
73
 
14
74
  BUNDLED WITH
15
- 1.12.0
75
+ 1.13.1
@@ -0,0 +1,40 @@
1
+ exports.casualpokemontrades = function(event, callback) {
2
+
3
+ // based on https://www.tomas-dvorak.cz/posts/nodejs-request-without-dependencies/
4
+ const getContent = function(url) {
5
+ return new Promise((resolve, reject) => {
6
+ const lib = url.startsWith("https") ? require("https") : require("http");
7
+ const request = function(url) {
8
+ lib.get(url, (response) => {
9
+ var body = [];
10
+ /*if (response.statusCode == 302) {
11
+ body = [];
12
+ request(response.headers.location);
13
+ } else*/ if (response.statusCode < 200 || response.statusCode > 299) {
14
+ reject(new Error("Failed to load page, status code: " + response.statusCode));
15
+ } else {
16
+ response.on("data", (chunk) => body.push(chunk));
17
+ response.on("end", () => resolve(body.join("")));
18
+ };
19
+ } ).on("error", (err) => reject(err));
20
+ };
21
+ request(url);
22
+ } );
23
+ };
24
+
25
+ const storage = require("@google-cloud/storage")();
26
+ storage.
27
+ bucket("casualpokemontrades.function.nakilon.pro").
28
+ file("gas_hook_id.secret").
29
+ download( function(err, contents) {
30
+ const log_payload = JSON.parse(Buffer.from(event.data.data, "base64").toString()).jsonPayload;
31
+ console.log(log_payload);
32
+ const path = "https://script.google.com/macros/s/" + contents.toString() + "/exec?payload=" + Buffer.from(JSON.stringify(log_payload)).toString("base64");
33
+ console.log(path);
34
+ getContent(path);
35
+ // then((html) => console.log(html)).
36
+ // catch((err) => console.error(err));
37
+ } );
38
+
39
+ callback();
40
+ };