Class: ToiletTracker::Configuration

Inherits:
Object
  • Object
show all
Defined in:
lib/toilet_tracker/configuration.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeConfiguration

Returns a new instance of Configuration.



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/toilet_tracker/configuration.rb', line 9

def initialize
  @default_timezone = "UTC"
  @max_shift_hours = 12
  # Capture group 1 is always metadata emojis, subsequent groups are pattern-specific
  @message_patterns = {
    # 💩 🩸 14:30
    event_at_time_only: /💩\s*([^+\-\dA-Za-z\s]*)\s*(\d{1,2}:\d{2})$/,
    # 💩 🩸 +5 14:30, 💩 🩸 +5:30 14:30
    event_at_time_only_shifted: /💩\s*([^+\-\dA-Za-z\s]*)\s*([+-]?\d+(?::\d{2})?)\s+(\d{1,2}:\d{2})$/,
    # 💩 🩸 Asia/Kolkata 14:30
    event_in_timezone_at_time_only: %r{💩\s*([^+\-\dA-Za-z\s]*)\s*([A-Za-z_/][A-Za-z0-9_/+-]*)\s+(\d{1,2}:\d{2})$},
    # 🚽 📍 +5 14:30, 🚽 📍 +5:30 14:30
    shift_set_at_time_only: /🚽\s*([^+\-\dA-Za-z\s]*)\s*([+-]?\d+(?::\d{2})?)\s+(\d{1,2}:\d{2})$/,
    # 🚽 📍 Asia/Kolkata 14:30
    timezone_set_at_time_only: %r{🚽\s*([^+\-\dA-Za-z\s]*)\s*([A-Za-z_/][A-Za-z0-9_/+-]*)\s+(\d{1,2}:\d{2})$},
    # 🚽 📍 +2, 🚽 📍 -3, 🚽 📍 +5:30
    shift_set: /🚽\s*([^+\-\dA-Za-z\s]*)\s*([+-]?\d+(?::\d{2})?)$/,
    # 🚽 📍 +2 2025-01-15 14:30, 🚽 📍 +5:30 2025-01-15 14:30
    shift_set_at_time: %r{🚽\s*([^+\-\dA-Za-z\s]*)\s*([+-]?\d+(?::\d{2})?)\s+(\d{4}[-/]\d{1,2}[-/]\d{1,2}\s+\d{1,2}:\d{1,2}(?::\d{1,2})?)$},
    # 🚽 📍 Europe/Rome, 🚽 📍 PST
    timezone_set: %r{🚽\s*([^+\-\dA-Za-z\s]*)\s*([A-Za-z_/][A-Za-z0-9_/+-]*)$},
    # 🚽 📍 Asia/Kolkata 2025-01-15 14:30
    timezone_set_at_time: %r{🚽\s*([^+\-\dA-Za-z\s]*)\s*([A-Za-z_/][A-Za-z0-9_/+-]*)\s+(\d{4}[-/]\d{1,2}[-/]\d{1,2}\s+\d{1,2}:\d{1,2}(?::\d{1,2})?)$},
    # 💩, 💩 🩸
    event_now: /💩\s*([^+\-\dA-Za-z\s]*)$/,
    # 💩 🩸 +2, 💩 🩸 -1, 💩 🩸 +5:30
    event_now_shifted: /💩\s*([^+\-\dA-Za-z\s]*)\s*([+-]?\d+(?::\d{2})?)$/,
    # 💩 🩸 2025-01-15 14:30
    event_at_time: %r{💩\s*([^+\-\dA-Za-z\s]*)\s*(\d{4}[-/]\d{1,2}[-/]\d{1,2}\s+\d{1,2}:\d{1,2}(?::\d{1,2})?)$},
    # 💩 🩸 +2 2025-01-15 14:30, 💩 🩸 +5:30 2025-01-15 14:30
    event_at_time_shifted: %r{💩\s*([^+\-\dA-Za-z\s]*)\s*([+-]?\d+(?::\d{2})?)\s+(\d{4}[-/]\d{1,2}[-/]\d{1,2}\s+\d{1,2}:\d{1,2}(?::\d{1,2})?)$},
    # 💩 🩸 Europe/Rome, 💩 🩸 PST
    event_in_timezone: %r{💩\s*([^+\-\dA-Za-z\s]*)\s*([A-Za-z_/][A-Za-z0-9_/+-]*)\s*$},
    # 💩 🩸 Asia/Kolkata 2025-01-15 14:30
    event_in_timezone_at_time: %r{💩\s*([^+\-\dA-Za-z\s]*)\s*([A-Za-z_/][A-Za-z0-9_/+-]*)\s+(\d{4}[-/]\d{1,2}[-/]\d{1,2}\s+\d{1,2}:\d{1,2}(?::\d{1,2})?)$}
  }
  @date_formats = [
    "%Y-%m-%d %H:%M:%S",
    "%Y-%m-%d %H:%M",
    "%Y/%m/%d %H:%M:%S",
    "%Y/%m/%d %H:%M",
    "%H:%M"
  ]
end

Instance Attribute Details

#date_formatsObject

Returns the value of attribute date_formats.



7
8
9
# File 'lib/toilet_tracker/configuration.rb', line 7

def date_formats
  @date_formats
end

#default_timezoneObject

Returns the value of attribute default_timezone.



7
8
9
# File 'lib/toilet_tracker/configuration.rb', line 7

def default_timezone
  @default_timezone
end

#max_shift_hoursObject

Returns the value of attribute max_shift_hours.



7
8
9
# File 'lib/toilet_tracker/configuration.rb', line 7

def max_shift_hours
  @max_shift_hours
end

#message_patternsObject

Returns the value of attribute message_patterns.



7
8
9
# File 'lib/toilet_tracker/configuration.rb', line 7

def message_patterns
  @message_patterns
end

Instance Method Details

#default_timezone_objectObject



54
55
56
57
# File 'lib/toilet_tracker/configuration.rb', line 54

def default_timezone_object
  ActiveSupport::TimeZone[@default_timezone] ||
    (raise Core::InvalidTimezone, @default_timezone)
end

#edited_message_suffixObject



69
70
71
# File 'lib/toilet_tracker/configuration.rb', line 69

def edited_message_suffix
  "‎<This message was edited>"
end

#valid_shift?(shift) ⇒ Boolean

Returns:



59
60
61
# File 'lib/toilet_tracker/configuration.rb', line 59

def valid_shift?(shift)
  (shift.is_a?(Integer) || shift.is_a?(Float)) && shift.abs <= max_shift_hours
end

#whatsapp_message_patternObject



63
64
65
66
67
# File 'lib/toilet_tracker/configuration.rb', line 63

def whatsapp_message_pattern
  # WhatsApp exports vary by platform and locale: years are either 2 or 4
  # digits, day and month may be zero-padded or not, and seconds may be absent.
  @whatsapp_message_pattern ||= %r{\[(?<day>\d{1,2})/(?<month>\d{1,2})/(?<year>\d{4}|\d{2}),\s*(?<time>\d{1,2}:\d{2}(?::\d{2})?)\]\s*(?<sender>[^:]+):\s*(?<content>.+?)(?:\s*‎<This message was edited>)?$}
end