fuck_facebook 0.4.1 → 0.5.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 58036357e5b5129b1f1d3395335e519c5fe361b888367f39b0aa22868ccafea2
4
- data.tar.gz: 75b470be6a7b43fb1b2f1169c76b94c0f36fa7dd16e7f407fd0c604b74e740ad
3
+ metadata.gz: 328dfd9c415343629b2aeb3f83e6252fa2ee0c882be23f441442e0170781a0e0
4
+ data.tar.gz: 13369d4a2a3bb32d672385cb47776cdfd37ecb8159c2314d78cefb52ae0376fd
5
5
  SHA512:
6
- metadata.gz: 9a0b4111c0c2df0dc5fca7d154152b593e42a7f7bcf98eace36d4a85422a8786168c1b668b910b1e0187e9edbf683ae772f04aa1b471594702a7b6134d975b88
7
- data.tar.gz: 6fb6a161adbfc38a33af6a36f1c56dfa98fc8d0cc5b311b0783ded7cd9b7d9d5eec0badf12076bccec281f03e4e7a474031073cd24d3a6fd89c40596798ca32d
6
+ metadata.gz: 111cd999cfa8dddbfbb72c36ace0dbed922b57a0ed653c3726541bba8f2a17f1bdfc4188e832a07cb6e0cf46938e52218e1973a9ab4b2dce92453d018e2fefee
7
+ data.tar.gz: 44d2fa65bb1b48e4f2294cb314cdd63609135fd4b028e929937f4141064563acba59ec1db3552459d22c92e151d9c42b85941ebd1e423235e67d510880522283
data/.gitignore CHANGED
@@ -11,3 +11,5 @@
11
11
  .rspec_status
12
12
 
13
13
  *.gem
14
+
15
+ fuck_facebook_error*.png
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fuck_facebook (0.4.0)
4
+ fuck_facebook (0.5.2)
5
5
  activesupport (~> 6.1)
6
6
  highline (~> 2.0)
7
7
  mail (~> 2.7)
data/README.md CHANGED
@@ -26,6 +26,9 @@ This way if you have emails going out for new messages, you won't get notified f
26
26
  Here's a complete config file along with an explanation of each option:
27
27
 
28
28
  ```yaml
29
+ errors:
30
+ min_minutes_between_reports: 0 # Only report error if one has not occured in the past X minutes
31
+ include_screenshot: false # Generates a screenshot with the error report
29
32
  smtp:
30
33
  from_email: sender@example.com
31
34
  to_email: receiver@example.com
data/bin/fuck-facebook CHANGED
@@ -12,11 +12,12 @@ require_relative '../src/message_sender'
12
12
  require_relative '../src/error_reporter'
13
13
 
14
14
  options = ArgsParser.parse_args
15
+ facebook_connection = nil
15
16
 
16
17
  begin
18
+ facebook_connection = FacebookConnection.new(headless: options[:headless])
17
19
  raise 'Error triggered by --simulate-error flag' if options[:simulate_error]
18
20
 
19
- facebook_connection = FacebookConnection.new(headless: options[:headless])
20
21
  facebook_connection.cookie_handler.clear! if options[:clear_cookies]
21
22
  facebook_connection.login if options[:login]
22
23
  message_sender = MessageSender.new(options[:sender], facebook_connection)
@@ -24,5 +25,5 @@ begin
24
25
  message_sender.send_messages if options[:messages]
25
26
  facebook_connection.close
26
27
  rescue StandardError => e
27
- ErrorReporter.report_error(options[:sender], e)
28
+ ErrorReporter.report_error(options[:sender], e, facebook_connection: facebook_connection)
28
29
  end
@@ -1,3 +1,3 @@
1
1
  module FuckFacebook
2
- VERSION = '0.4.1'.freeze
2
+ VERSION = '0.5.3'.freeze
3
3
  end
data/src/config.rb CHANGED
@@ -3,15 +3,16 @@ require 'yaml'
3
3
  class Config
4
4
  CONFIG_FILE_PATH = "#{ENV['HOME']}/.local/share/fuck-facebook/config.yaml".freeze
5
5
 
6
- def self.option(*path)
6
+ def self.option(*path, default: nil, type: nil)
7
7
  env_var = "FF_#{path.join('_').upcase}"
8
- return ENV[env_var] if ENV[env_var]
9
-
10
8
  path_strings = path.map(&:to_s)
11
- config.dig(*path_strings)
12
- end
13
9
 
14
- private
10
+ value = config.dig(*path_strings)
11
+ value = ENV[env_var] if ENV[env_var]
12
+ value = default if value.nil?
13
+
14
+ cast_value_to_type(value, type)
15
+ end
15
16
 
16
17
  def self.config
17
18
  create_config_file_if_not_exists!
@@ -19,9 +20,28 @@ class Config
19
20
  YAML.load_file(CONFIG_FILE_PATH)
20
21
  end
21
22
 
22
- def self.create_config_file_if_not_exists!
23
+ private_class_method def self.create_config_file_if_not_exists!
23
24
  dirname = File.dirname(CONFIG_FILE_PATH)
24
25
  FileUtils.mkdir_p(dirname) unless File.directory?(dirname)
25
26
  File.write(CONFIG_FILE_PATH, '{}') unless File.exist?(CONFIG_FILE_PATH)
26
27
  end
28
+
29
+ private_class_method def self.cast_value_to_type(value, type)
30
+ case type
31
+ when nil
32
+ value
33
+ when :boolean
34
+ cast_value_to_boolean(value)
35
+ when :float
36
+ value.to_f
37
+ end
38
+ end
39
+
40
+ private_class_method def self.cast_value_to_boolean(value)
41
+ if [true, false].include?(value)
42
+ value
43
+ elsif value.is_a?(String)
44
+ value == 'true'
45
+ end
46
+ end
27
47
  end
@@ -1,6 +1,44 @@
1
1
  class ErrorReporter
2
- def self.report_error(sender_name, error)
3
- Senders.by_name(sender_name).send_error(error)
2
+ def self.report_error(sender_name, error, facebook_connection: nil)
3
+ raise error unless report_error?
4
+
5
+ screenshot = include_screenshot?(facebook_connection) ? create_screenshot(facebook_connection) : nil
6
+
7
+ Senders.by_name(sender_name).send_error(error, screenshot: screenshot)
8
+
9
+ Storage.set(:last_error_reported_time, Time.now)
4
10
  raise error
5
11
  end
12
+
13
+ private_class_method def self.include_screenshot?(facebook_connection)
14
+ include_screenshot_config = Config.option(
15
+ :errors,
16
+ :include_screenshot,
17
+ default: false,
18
+ type: :boolean
19
+ )
20
+
21
+ include_screenshot_config && facebook_connection.present?
22
+ end
23
+
24
+ private_class_method def self.create_screenshot(facebook_connection)
25
+ facebook_connection.driver.screenshot_as(:png)
26
+ rescue StandardError
27
+ nil
28
+ end
29
+
30
+ private_class_method def self.report_error?
31
+ min_minutes_between_reports = Config.option(
32
+ :errors,
33
+ :min_minutes_between_reports,
34
+ default: 0,
35
+ type: :float
36
+ )
37
+
38
+ last_error_reported_time = Storage.get(:last_error_reported_time, default: Time.new(2000))
39
+
40
+ next_report_time = last_error_reported_time + min_minutes_between_reports.minutes
41
+
42
+ Time.now > next_report_time
43
+ end
6
44
  end
data/src/fb_duration.rb CHANGED
@@ -3,29 +3,40 @@ require 'active_support/core_ext/numeric/time'
3
3
  class FbDuration
4
4
  DURATION_LETTER_TO_METHOD = {
5
5
  'm' => :minutes,
6
- 'd' => :days,
7
6
  'h' => :hours,
7
+ 'd' => :days,
8
8
  'w' => :weeks,
9
9
  'y' => :years
10
10
  }.freeze
11
11
 
12
12
  DURATION_LETTER_TO_BEGINNING_OF_METHOD = {
13
13
  'm' => :beginning_of_minute,
14
- 'd' => :beginning_of_day,
15
14
  'h' => :beginning_of_hour,
15
+ 'd' => :beginning_of_day,
16
16
  'w' => :beginning_of_week,
17
17
  'y' => :beginning_of_year
18
18
  }.freeze
19
19
 
20
+ # TODO: Fill in d w y extra time to add
21
+ EXTRA_TIME_TO_ADD_TO_FIX_ROUNDING = {
22
+ 'm' => 0,
23
+ 'h' => 5.minutes,
24
+ 'd' => 0,
25
+ 'w' => 0,
26
+ 'y' => 0
27
+ }
28
+
20
29
  def self.parse_to_time(facebook_format_duration)
21
30
  duration = parse(facebook_format_duration)
22
31
  time_to_beginning_of_duration_letter(Time.now - duration, facebook_format_duration)
23
32
  end
24
33
 
25
34
  def self.parse(facebook_format_duration)
26
- segments = facebook_format_duration.split
35
+ number, duration_letter = facebook_format_duration.split
36
+
37
+ extra_rounding_time = EXTRA_TIME_TO_ADD_TO_FIX_ROUNDING[duration_letter]
27
38
 
28
- segments[0].to_i.send(DURATION_LETTER_TO_METHOD[segments[1]])
39
+ number.to_i.send(DURATION_LETTER_TO_METHOD[duration_letter]) + extra_rounding_time
29
40
  end
30
41
 
31
42
  def self.time_to_beginning_of_duration_letter(time, facebook_format_duration)
@@ -53,12 +53,13 @@ class MessageHandler
53
53
  end
54
54
 
55
55
  def messages_after_last_message_time(messages)
56
- last_message_check_time = Storage.get(:last_message_check_time, default: Time.new(2004, 2, 4))
57
- last_check_time_with_buffer = last_message_check_time - 5.minutes
56
+ last_message_time = Storage.get(:last_message_time, default: Time.new(2004, 2, 4))
58
57
 
59
- messages_to_return = messages.select { _1.timestamp > last_check_time_with_buffer }
58
+ messages_to_return = messages.select { _1.timestamp > last_message_time }
60
59
 
61
- Storage.set(:last_message_check_time, Time.now)
60
+ last_message_time = messages.map(&:timestamp).max
61
+
62
+ Storage.set(:last_message_time, last_message_time)
62
63
 
63
64
  messages_to_return
64
65
  end
data/src/senders/email.rb CHANGED
@@ -11,12 +11,13 @@ module Senders
11
11
  end
12
12
  end
13
13
 
14
- def self.send_error(error)
14
+ def self.send_error(error, screenshot: nil)
15
15
  Mail.deliver do
16
16
  from Config.option(:smtp, :from_email)
17
17
  to Config.option(:smtp, :to_email)
18
18
  subject 'Error occurred during Fuck Facebook command'
19
19
  body error.full_message(highlight: false)
20
+ add_file filename: 'error_screenshot.png', content: screenshot if screenshot
20
21
  end
21
22
  end
22
23
  end
@@ -6,8 +6,13 @@ module Senders
6
6
  end
7
7
  end
8
8
 
9
- def self.send_error(error)
9
+ def self.send_error(error, screenshot: nil)
10
10
  puts error
11
+ return if screenshot.nil?
12
+
13
+ filename = "fuck_facebook_error_#{Time.now.iso8601}.png"
14
+ File.write(filename, screenshot)
15
+ puts "Screenshot of error page saved as #{filename}"
11
16
  end
12
17
  end
13
18
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fuck_facebook
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Keeyan Nejad
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-25 00:00:00.000000000 Z
11
+ date: 2021-12-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport